🏷️ Search for custom tailnet name offers with keywords.
at master 55 lines 1.3 kB view raw
1import { tailscaleWordsUrls } from '$config'; 2 3export const fetchAndCacheWords = (): Promise<{ 4 tails: string[]; 5 scales: string[]; 6}> => { 7 return new Promise((resolve) => { 8 browser.storage.local.get( 9 ['tailnetTails', 'tailnetScales'], 10 async (result) => { 11 if ( 12 Array.isArray(result.tailnetTails) && 13 result.tailnetTails.length > 0 && 14 Array.isArray(result.tailnetScales) && 15 result.tailnetScales.length > 0 16 ) { 17 resolve({ tails: result.tailnetTails, scales: result.tailnetScales }); 18 return; 19 } 20 21 try { 22 const responses = await Promise.all( 23 tailscaleWordsUrls.map((url) => fetch(url)), 24 ); 25 const texts = await Promise.all(responses.map((r) => r.text())); 26 const tails = Array.from( 27 new Set( 28 texts[0] 29 .split(/\r?\n/) 30 .map((w) => w.trim()) 31 .filter((w) => w.length > 0), 32 ), 33 ); 34 const scales = Array.from( 35 new Set( 36 texts[1] 37 .split(/\r?\n/) 38 .map((w) => w.trim()) 39 .filter((w) => w.length > 0), 40 ), 41 ); 42 43 browser.storage.local.set( 44 { tailnetTails: tails, tailnetScales: scales }, 45 () => { 46 resolve({ tails, scales }); 47 }, 48 ); 49 } catch { 50 resolve({ tails: [], scales: [] }); 51 } 52 }, 53 ); 54 }); 55};