🏷️ Search for custom tailnet name offers with keywords.
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};