@fkn/lib 0.4.2 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -1,17 +1,18 @@
1
- import { d as e, f as t, g as n, i as r, l as i, m as a, p as o, r as s, t as c, u as l } from "./locator-DUbu14FW.js";
2
- import { createTypedEventTarget as u, expose as ee, relay as te } from "osra";
1
+ import { d as e, f as t, g as n, i as r, l as i, m as a, p as o, r as s, t as c, u as l } from "./locator-CzKO_aEl.js";
2
+ import { t as u } from "./connect-button-yKMuFxR9.js";
3
+ import { createTypedEventTarget as ee, expose as te, relay as ne } from "osra";
3
4
  import { Stream as d } from "stream";
4
- import { EventEmitter as ne } from "events";
5
+ import { EventEmitter as re } from "events";
5
6
  import { Address4 as f, Address6 as p } from "ip-address";
6
7
  import { Buffer as m } from "buffer";
7
8
  //#region node_modules/@mfkn/web-extension/lib/utils/extension.js
8
- var re = "FKN_WEB_EXTENSION_MAIN_WORLD_CONTENT_SCRIPT_ENABLED_EVENT_KEY", ie = "fknExtension", h = u();
9
- typeof document < "u" && document.addEventListener(re, (e) => {
9
+ var ie = "FKN_WEB_EXTENSION_MAIN_WORLD_CONTENT_SCRIPT_ENABLED_EVENT_KEY", ae = "fknExtension", h = ee();
10
+ typeof document < "u" && document.addEventListener(ie, (e) => {
10
11
  h.dispatchEvent(new CustomEvent("statuschange", { detail: { enabled: e.detail.enabled } }));
11
12
  });
12
- var g = () => typeof document > "u" ? !1 : document.documentElement.dataset[ie] === "true", _ = null, v = (e) => {
13
+ var g = () => typeof document > "u" ? !1 : document.documentElement.dataset[ae] === "true", _ = null, v = (e) => {
13
14
  _ = e;
14
- }, ae = 150, y = (e = 1e3) => new Promise((t, n) => {
15
+ }, oe = 150, y = (e = 1e3) => new Promise((t, n) => {
15
16
  if (g()) return t();
16
17
  let r, i = (e) => {
17
18
  clearTimeout(r), s.disconnect(), document.removeEventListener("readystatechange", c), e();
@@ -19,7 +20,7 @@ var g = () => typeof document > "u" ? !1 : document.documentElement.dataset[ie]
19
20
  if (_ && (await _().catch(() => {}), g())) return t();
20
21
  n(/* @__PURE__ */ Error("The FKN WebExtension is not installed, enabled or not exposed on this page."));
21
22
  }), o = () => {
22
- clearTimeout(r), r = setTimeout(() => g() ? i(t) : a(), ae);
23
+ clearTimeout(r), r = setTimeout(() => g() ? i(t) : a(), oe);
23
24
  }, s = new MutationObserver(() => {
24
25
  g() && i(t);
25
26
  }), c = () => {
@@ -30,27 +31,48 @@ var g = () => typeof document > "u" ? !1 : document.documentElement.dataset[ie]
30
31
  attributeFilter: ["data-fkn-extension"]
31
32
  }), document.addEventListener("readystatechange", c), document.readyState === "complete") return o();
32
33
  g() && i(t);
33
- }), oe, b = new Proxy({}, { get: (e, t) => async (...e) => {
34
- await y(), oe ??= ee({}, {
34
+ }), se, b = new Proxy({}, { get: (e, t) => async (...e) => {
35
+ await y(), se ??= te({}, {
35
36
  transport: window,
36
37
  revivableModules: i
37
38
  });
38
- let n = (await oe)[t];
39
+ let n = (await se)[t];
39
40
  return n(...e);
40
- } }), se = {
41
+ } }), ce = {
41
42
  scope: "network.fetch",
42
43
  category: "network",
43
44
  severity: 0,
44
45
  title: "Fetch data from other sites",
45
46
  description: "Lets the app download public data from other websites directly, past the usual cross-origin limits."
46
- }, ce = {
47
+ }, le = {
47
48
  scope: "network.fetchCredentialed",
48
49
  category: "network",
49
50
  severity: 3,
50
51
  unsafe: !0,
51
52
  title: "Fetch from other sites, signed in as you",
52
53
  description: "Lets the app fetch other sites using your logged-in session cookies, so it can read data only you should see."
53
- }, le = ["fkn.app", "fkn.dev"], x = (e) => {
54
+ }, ue = {
55
+ scope: "network.fetchLocal",
56
+ category: "network",
57
+ severity: 3,
58
+ unsafe: !0,
59
+ title: "Access devices on your local network",
60
+ description: "Lets the app reach devices and services on your home or work network, which websites normally cannot touch."
61
+ }, de = (e) => {
62
+ let t = e.match(/^(\d+)\.(\d+)\.\d+\.\d+$/);
63
+ if (!t) return !1;
64
+ let [n, r] = [Number(t[1]), Number(t[2])];
65
+ return n === 10 || n === 127 || n === 0 || n === 169 && r === 254 || n === 172 && r >= 16 && r <= 31 || n === 192 && r === 168;
66
+ }, fe = (e) => {
67
+ let t;
68
+ try {
69
+ t = new URL(e);
70
+ } catch {
71
+ return !1;
72
+ }
73
+ let n = t.hostname.replace(/^\[|\]$/g, "").toLowerCase().replace(/\.$/, "");
74
+ return n === "localhost" || n.endsWith(".localhost") || n.endsWith(".local") || n.endsWith(".internal") || n.endsWith(".home.arpa") ? !0 : n.includes(":") ? n === "::" || n === "::1" || n.startsWith("fc") || n.startsWith("fd") || /^fe[89ab]/.test(n) || n.startsWith("::ffff:") : de(n);
75
+ }, pe = ["fkn.app", "fkn.dev"], x = (e) => {
54
76
  let t;
55
77
  try {
56
78
  t = new URL(e);
@@ -59,12 +81,12 @@ var g = () => typeof document > "u" ? !1 : document.documentElement.dataset[ie]
59
81
  }
60
82
  if (t.protocol === "chrome-extension:" || t.protocol === "moz-extension:") return !0;
61
83
  let n = t.hostname;
62
- return le.some((e) => n === e || n.endsWith(`.${e}`));
84
+ return pe.some((e) => n === e || n.endsWith(`.${e}`));
63
85
  }, S = (e) => {
64
86
  if (x(e)) throw Error("fetch: refusing to target the extension's own pages or FKN platform domains");
65
- }, ue = ["origin", "referer"], de = (e) => {
87
+ }, me = ["origin", "referer"], he = (e) => {
66
88
  if (!e?.headers) return;
67
- let t = new Headers(e.headers), n = ue.map((e) => {
89
+ let t = new Headers(e.headers), n = me.map((e) => {
68
90
  let n = t.get(e);
69
91
  return n === null ? void 0 : [e, n];
70
92
  }).filter((e) => e !== void 0);
@@ -80,25 +102,25 @@ var g = () => typeof document > "u" ? !1 : document.documentElement.dataset[ie]
80
102
  body: r,
81
103
  credentials: t?.credentials === "include" ? "include" : "omit",
82
104
  redirect: n.redirect,
83
- unsafeHeaders: de(t),
105
+ unsafeHeaders: he(t),
84
106
  reason: t?.reason,
85
107
  signal: t?.signal ?? void 0
86
108
  });
87
- }, fe = {
109
+ }, ge = {
88
110
  scope: "network.readCookie",
89
111
  category: "network",
90
112
  severity: 3,
91
113
  unsafe: !0,
92
114
  title: "Read a site’s cookie",
93
115
  description: "Lets the app read a named cookie from another site, which can include the login token only that site should see."
94
- }, pe = { get: (e) => b.getCookie(e) }, me = {
116
+ }, _e = { get: (e) => b.getCookie(e) }, ve = {
95
117
  scope: "network.modifyRequestHeaders",
96
118
  category: "network",
97
119
  severity: 2,
98
120
  unsafe: !0,
99
121
  title: "Rewrite request headers to other sites",
100
122
  description: "Lets the app set or remove headers (like Origin and Referer) on this page’s own requests to the listed sites."
101
- }, he = (e) => b.setRequestHeaderRule(e), ge = (e) => b.removeRequestHeaderRule({ ruleId: e });
123
+ }, ye = (e) => b.setRequestHeaderRule(e), be = (e) => b.removeRequestHeaderRule({ ruleId: e });
102
124
  (() => {
103
125
  let e = {}, t = [...c.selectorModules, ...r.selectorModules];
104
126
  for (let n of t) n.render && !(n.type in e) && (e[n.type] = n.render);
@@ -120,19 +142,19 @@ var w = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", T = (e) => {
120
142
  return n === "fkn.app" || n.endsWith(".fkn.app");
121
143
  }, E = (e) => {
122
144
  if (T(e)) throw Error("attachFrame: refusing to target the extension's own pages or fkn.app");
123
- }, _e = {
145
+ }, xe = {
124
146
  scope: "embed.iframe",
125
147
  category: "embed",
126
148
  severity: 0,
127
149
  title: "Load another website inside this app",
128
150
  description: "Lets the app embed external pages directly inside its own view."
129
- }, ve = {
151
+ }, Se = {
130
152
  scope: "embed.open",
131
153
  category: "embed",
132
154
  severity: 0,
133
155
  title: "Open a website inside this app",
134
156
  description: "Lets the app navigate to another site without leaving its window."
135
- }, ye = async ({ iframe: e, domains: t = [] }) => {
157
+ }, Ce = async ({ iframe: e, domains: t = [] }) => {
136
158
  let n = crypto.randomUUID();
137
159
  if (E(e.src), await y(), !e.isConnected) throw Error("attachFrame: the iframe must be connected to the document before attaching");
138
160
  e.dispatchEvent(new CustomEvent(w, { detail: n }));
@@ -148,22 +170,22 @@ var w = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", T = (e) => {
148
170
  goto: c,
149
171
  url: l
150
172
  };
151
- }, be = { request: (e) => b.requestPermissions(e.map((e) => ({
173
+ }, we = { request: (e) => b.requestPermissions(e.map((e) => ({
152
174
  key: e.key,
153
175
  scope: e.scope ?? "",
154
176
  reason: e.reason
155
- }))) }, xe = 32, Se = typeof CSS < "u" && CSS.supports("clip-path", "path('M0 0H1V1H0Z')"), Ce = (e) => {
177
+ }))) }, Te = 32, Ee = typeof CSS < "u" && CSS.supports("clip-path", "path('M0 0H1V1H0Z')"), De = (e) => {
156
178
  let t = e.style;
157
179
  t.setProperty("display", "block", "important"), t.setProperty("position", "fixed", "important"), t.setProperty("top", "0", "important"), t.setProperty("left", "0", "important"), t.setProperty("width", "100%", "important"), t.setProperty("height", "100%", "important"), t.setProperty("border", "none", "important"), t.setProperty("clip-path", "inset(100%)", "important"), t.setProperty("background", "transparent"), t.setProperty("color-scheme", "normal"), t.setProperty("z-index", "2147483647"), e.setAttribute("title", "FKN");
158
- }, we = ({ x: e, y: t, width: n, height: r }) => `M${e} ${t}h${n}v${r}h${-n}Z`, Te = (e, { modal: t, rects: n }) => {
159
- if (!Se) {
180
+ }, Oe = ({ x: e, y: t, width: n, height: r }) => `M${e} ${t}h${n}v${r}h${-n}Z`, ke = (e, { modal: t, rects: n }) => {
181
+ if (!Ee) {
160
182
  let r = t || n.length > 0;
161
183
  e.style.setProperty("pointer-events", r ? "auto" : "none", "important"), e.style.setProperty("visibility", r ? "visible" : "hidden", "important");
162
184
  return;
163
185
  }
164
- let r = t ? "none" : n.length === 0 ? "inset(100%)" : `path('${n.map(we).join("")}')`, i = r === "none" || CSS.supports("clip-path", r) ? r : "inset(100%)";
186
+ let r = t ? "none" : n.length === 0 ? "inset(100%)" : `path('${n.map(Oe).join("")}')`, i = r === "none" || CSS.supports("clip-path", r) ? r : "inset(100%)";
165
187
  e.style.setProperty("clip-path", i, "important");
166
- }, Ee = (e) => {
188
+ }, Ae = (e) => {
167
189
  if (typeof e != "object" || !e) return null;
168
190
  let { x: t, y: n, width: r, height: i } = e;
169
191
  if (![
@@ -179,45 +201,45 @@ var w = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", T = (e) => {
179
201
  width: l - s,
180
202
  height: u - c
181
203
  };
182
- }, De = (e) => {
204
+ }, je = (e) => {
183
205
  if (typeof e != "object" || !e) return null;
184
- let t = e, n = (Array.isArray(t.rects) ? t.rects.slice(0, xe) : []).map(Ee).filter((e) => e !== null && e.width > 0 && e.height > 0);
206
+ let t = e, n = (Array.isArray(t.rects) ? t.rects.slice(0, Te) : []).map(Ae).filter((e) => e !== null && e.width > 0 && e.height > 0);
185
207
  return {
186
208
  modal: t.modal === !0,
187
209
  rects: n
188
210
  };
189
- }, D = null, Oe = () => D !== null, ke = (e) => {
190
- Ce(e), Te(e, {
211
+ }, D = null, Me = () => D !== null, Ne = (e) => {
212
+ De(e), ke(e, {
191
213
  modal: !1,
192
214
  rects: []
193
215
  }), D = e;
194
- }, Ae = (e) => {
216
+ }, Pe = (e) => {
195
217
  if (!D) return;
196
- let t = De(e);
197
- t && Te(D, t);
198
- }, je = "https://fkn.app", O = typeof globalThis < "u" && globalThis.document ? globalThis.document : void 0, Me = O?.querySelector(`iframe[src="${je}/api"]`) ?? null, k = O?.createElement("iframe") ?? null;
199
- !Me && k && O && (k.src = `${je}/api`, O.body.appendChild(k));
200
- var A = Me ?? k, Ne = A?.contentWindow ?? null;
201
- A && O && ke(A);
218
+ let t = je(e);
219
+ t && ke(D, t);
220
+ }, Fe = "https://fkn.app", O = typeof globalThis < "u" && globalThis.document ? globalThis.document : void 0, Ie = O?.querySelector(`iframe[src="${Fe}/api"]`) ?? null, k = O?.createElement("iframe") ?? null;
221
+ !Ie && k && O && (k.src = `${Fe}/api`, O.body.appendChild(k));
222
+ var A = Ie ?? k, Le = A?.contentWindow ?? null;
223
+ A && O && Ne(A);
202
224
  var j = (() => {
203
- if (typeof window < "u") return Ne ? {
225
+ if (typeof window < "u") return Le ? {
204
226
  receive: window,
205
- emit: Ne
227
+ emit: Le
206
228
  } : void 0;
207
229
  if (typeof self < "u") return {
208
230
  receive: self,
209
231
  emit: self
210
232
  };
211
- })(), Pe = j !== void 0, M = j ? ee({}, {
233
+ })(), Re = j !== void 0, M = j ? te({}, {
212
234
  key: "fkn-api",
213
235
  transport: j
214
236
  }) : new Promise(() => {});
215
237
  M.then((e) => {
216
- Oe() && e.overlay.setHost(Ae);
238
+ Me() && e.overlay.setHost(Pe);
217
239
  }, () => {});
218
240
  //#endregion
219
241
  //#region src/lib/fkn-target.ts
220
- var Fe = ["fkn.app", "fkn.dev"], Ie = (e) => {
242
+ var ze = ["fkn.app", "fkn.dev"], Be = (e) => {
221
243
  let t = typeof e == "string" ? e : e instanceof URL ? e.href : e.url, n;
222
244
  try {
223
245
  n = new URL(t);
@@ -225,8 +247,8 @@ var Fe = ["fkn.app", "fkn.dev"], Ie = (e) => {
225
247
  return;
226
248
  }
227
249
  let r = n.hostname;
228
- if (Fe.some((e) => r === e || r.endsWith(`.${e}`))) throw Error(`fetch refuses FKN platform domains (${r})`);
229
- }, Le = (e, t) => (Ie(e), M.then((n) => n.cloud.fetch(e, t))), Re = async () => {
250
+ if (ze.some((e) => r === e || r.endsWith(`.${e}`))) throw Error(`fetch refuses FKN platform domains (${r})`);
251
+ }, Ve = (e, t) => (Be(e), M.then((n) => n.cloud.fetch(e, t))), He = async () => {
230
252
  let e = await M.then((e) => e.cloud.quota());
231
253
  return {
232
254
  premium: e.premium,
@@ -238,9 +260,9 @@ var Fe = ["fkn.app", "fkn.dev"], Ie = (e) => {
238
260
  bytesPerSecond: e.bytesPerSecond,
239
261
  bitsPerSecond: e.bytesPerSecond * 8
240
262
  };
241
- }, ze = /* @__PURE__ */ n({ lookup: () => Be }), Be = (e, t) => M.then((n) => n.cloud.dns.lookup(e, t)), Ve = new TextEncoder();
263
+ }, Ue = /* @__PURE__ */ n({ lookup: () => We }), We = (e, t) => M.then((n) => n.cloud.dns.lookup(e, t)), Ge = new TextEncoder();
242
264
  new TextDecoder();
243
- var N = (e) => f.isValid(e), P = (e) => p.isValid(e), He = (e) => N(e) ? 4 : P(e) ? 6 : 0, Ue = (...e) => {
265
+ var N = (e) => f.isValid(e), P = (e) => p.isValid(e), Ke = (e) => N(e) ? 4 : P(e) ? 6 : 0, qe = (...e) => {
244
266
  if (typeof e[0] == "string") throw Error("FKN WebVPN does not support IPC connections");
245
267
  let t = typeof e.at(-1) == "function" ? e.at(-1) : void 0;
246
268
  return e[0] && typeof e[0] == "object" ? {
@@ -251,7 +273,7 @@ var N = (e) => f.isValid(e), P = (e) => p.isValid(e), He = (e) => N(e) ? 4 : P(e
251
273
  host: typeof e[1] == "string" ? e[1] : void 0,
252
274
  callback: t
253
275
  };
254
- }, We = (...e) => {
276
+ }, Je = (...e) => {
255
277
  let t = typeof e.at(-1) == "function" ? e.at(-1) : void 0, n = e[0] ?? 0, r = typeof e[1] == "string" ? e[1] : void 0;
256
278
  return typeof e[0] == "object" ? {
257
279
  ...e[0],
@@ -263,7 +285,7 @@ var N = (e) => f.isValid(e), P = (e) => p.isValid(e), He = (e) => N(e) ? 4 : P(e
263
285
  port: n,
264
286
  callback: t
265
287
  };
266
- }, Ge = (...e) => {
288
+ }, Ye = (...e) => {
267
289
  let t = typeof e.at(-1) == "function" ? e.at(-1) : void 0, n = e[0];
268
290
  if (typeof e[2] == "number") return {
269
291
  message: n,
@@ -288,15 +310,15 @@ var N = (e) => f.isValid(e), P = (e) => p.isValid(e), He = (e) => N(e) ? 4 : P(e
288
310
  new TextEncoder(), new TextDecoder();
289
311
  //#endregion
290
312
  //#region src/lib/webvpn/net.ts
291
- var Ke = /* @__PURE__ */ n({
313
+ var Xe = /* @__PURE__ */ n({
292
314
  Server: () => I,
293
315
  Socket: () => F,
294
- _default: () => Xe,
295
- connect: () => qe,
296
- createConnection: () => Je,
297
- createServer: () => Ye,
298
- default: () => Xe,
299
- isIP: () => He,
316
+ _default: () => et,
317
+ connect: () => Ze,
318
+ createConnection: () => Qe,
319
+ createServer: () => $e,
320
+ default: () => et,
321
+ isIP: () => Ke,
300
322
  isIPv4: () => N,
301
323
  isIPv6: () => P
302
324
  }), F = class extends d.Duplex {
@@ -359,7 +381,7 @@ var Ke = /* @__PURE__ */ n({
359
381
  }).catch(n);
360
382
  }
361
383
  connect(...e) {
362
- let t = Ue(...e), n = this.__webvpn_tcp_socket_init__(M.then((e) => e.cloud.webvpn.tcpSocket({
384
+ let t = qe(...e), n = this.__webvpn_tcp_socket_init__(M.then((e) => e.cloud.webvpn.tcpSocket({
363
385
  remoteAddress: t.host ?? "localhost",
364
386
  remotePort: t.port
365
387
  })));
@@ -486,7 +508,7 @@ var Ke = /* @__PURE__ */ n({
486
508
  return this._remoteAddress.family;
487
509
  }
488
510
  timeout;
489
- }, I = class extends ne {
511
+ }, I = class extends re {
490
512
  _localAddress;
491
513
  _webVPNTcpSocketListenerPromise;
492
514
  constructor(e, t) {
@@ -504,7 +526,7 @@ var Ke = /* @__PURE__ */ n({
504
526
  }), this._webVPNTcpSocketListenerPromise;
505
527
  }
506
528
  listen(...e) {
507
- let t = Ue(...e), n = (e) => {
529
+ let t = qe(...e), n = (e) => {
508
530
  let t = new F({ connection: Promise.resolve(e) });
509
531
  this.emit("connection", t);
510
532
  }, r = (e) => M.then((r) => r.cloud.webvpn.tcpSocketListener({
@@ -541,23 +563,23 @@ var Ke = /* @__PURE__ */ n({
541
563
  connections;
542
564
  listening;
543
565
  async [Symbol.asyncDispose]() {}
544
- }, qe = (e, t) => new F().connect(e, t), Je = (e, t) => new F().connect(e, t), Ye = (e, t) => {
566
+ }, Ze = (e, t) => new F().connect(e, t), Qe = (e, t) => new F().connect(e, t), $e = (e, t) => {
545
567
  typeof e == "function" && (t = e, e = void 0);
546
568
  let n = new I(e);
547
569
  return t && n.on("connection", t), n;
548
- }, Xe = {
570
+ }, et = {
549
571
  Socket: F,
550
572
  Server: I,
551
- connect: qe,
552
- createConnection: Je,
553
- createServer: Ye,
554
- isIP: He,
573
+ connect: Ze,
574
+ createConnection: Qe,
575
+ createServer: $e,
576
+ isIP: Ke,
555
577
  isIPv4: N,
556
578
  isIPv6: P
557
- }, Ze = /* @__PURE__ */ n({
558
- Socket: () => Qe,
559
- createSocket: () => tt
560
- }), Qe = class extends ne {
579
+ }, tt = /* @__PURE__ */ n({
580
+ Socket: () => nt,
581
+ createSocket: () => at
582
+ }), nt = class extends re {
561
583
  _type;
562
584
  _localAddress;
563
585
  _remoteAddress;
@@ -627,7 +649,7 @@ var Ke = /* @__PURE__ */ n({
627
649
  }
628
650
  }
629
651
  _peerTail(e, t) {
630
- if (e === void 0 || t === void 0) return $e;
652
+ if (e === void 0 || t === void 0) return rt;
631
653
  let n = `${e}|${t}`, r = this._peerTailCache.get(n);
632
654
  if (r) return r;
633
655
  let i = f.isValid(e) ? L(e) : R(e), a = new Uint8Array(1 + i.byteLength + 2);
@@ -671,7 +693,7 @@ var Ke = /* @__PURE__ */ n({
671
693
  return this._localAddress;
672
694
  }
673
695
  bind(...e) {
674
- let t = We(...e), n = this._type === "udp6" ? "::" : "0.0.0.0";
696
+ let t = Je(...e), n = this._type === "udp6" ? "::" : "0.0.0.0";
675
697
  return this._webVPNUdpSocketPromise = M.then((e) => e.cloud.webvpn.udpSocket({
676
698
  type: this._type,
677
699
  address: t.address ?? n,
@@ -783,11 +805,11 @@ var Ke = /* @__PURE__ */ n({
783
805
  }
784
806
  send(...e) {
785
807
  this._webVPNUdpSocketPromise || this.bind();
786
- let t = Ge(...e), n = this._type === "udp6" ? "::1" : "127.0.0.1";
808
+ let t = Ye(...e), n = this._type === "udp6" ? "::1" : "127.0.0.1";
787
809
  if (!this._webVPNUdpSocketPromise) throw Error("Socket not bound");
788
810
  this._webVPNUdpSocketPromise.then((e) => {
789
811
  if (!e) throw Error("Socket not bound");
790
- let r = et(t.message), i = t.callback, a = t.address ?? n, o = this._remoteAddress !== void 0 && t.address === void 0;
812
+ let r = it(t.message), i = t.callback, a = t.address ?? n, o = this._remoteAddress !== void 0 && t.address === void 0;
791
813
  if (this._dataPort && (o || f.isValid(a) || p.isValid(a))) {
792
814
  this._portSend(r, o ? void 0 : a, o ? void 0 : t.port), i?.call(this, null, r.byteLength);
793
815
  return;
@@ -849,12 +871,12 @@ var Ke = /* @__PURE__ */ n({
849
871
  this.close(e);
850
872
  });
851
873
  }
852
- }, $e = new Uint8Array([2]), et = (e) => {
853
- if (typeof e == "string") return Ve.encode(e);
874
+ }, rt = new Uint8Array([2]), it = (e) => {
875
+ if (typeof e == "string") return Ge.encode(e);
854
876
  if (e instanceof Uint8Array) return e;
855
877
  if (ArrayBuffer.isView(e)) return new Uint8Array(e.buffer, e.byteOffset, e.byteLength);
856
878
  if (Array.isArray(e)) {
857
- let t = e.map(et), n = new Uint8Array(t.reduce((e, t) => e + t.byteLength, 0)), r = 0;
879
+ let t = e.map(it), n = new Uint8Array(t.reduce((e, t) => e + t.byteLength, 0)), r = 0;
858
880
  for (let e of t) n.set(e, r), r += e.byteLength;
859
881
  return n;
860
882
  }
@@ -867,25 +889,25 @@ var Ke = /* @__PURE__ */ n({
867
889
  let t = new p(e).getBitsBase16(0, 128).match(/.{2}/g);
868
890
  if (!t || t.length !== 16) throw Error(`Invalid IPv6 address: ${e}`);
869
891
  return new Uint8Array(t.map((e) => parseInt(e, 16)));
870
- }, tt = (e, t) => {
871
- let n = new Qe(typeof e == "string" ? { type: e } : e);
892
+ }, at = (e, t) => {
893
+ let n = new nt(typeof e == "string" ? { type: e } : e);
872
894
  return t && n.on("message", t), n;
873
- }, nt = /* @__PURE__ */ n({
895
+ }, ot = /* @__PURE__ */ n({
874
896
  Agent: () => Y,
875
897
  ClientRequest: () => q,
876
898
  HTTPParser: () => U,
877
899
  IncomingMessage: () => W,
878
- METHODS: () => it,
900
+ METHODS: () => ct,
879
901
  STATUS_CODES: () => z,
880
902
  Server: () => J,
881
903
  ServerResponse: () => K,
882
- _default: () => ht,
883
- createServer: () => mt,
884
- default: () => ht,
885
- get: () => pt,
886
- globalAgent: () => ft,
904
+ _default: () => yt,
905
+ createServer: () => vt,
906
+ default: () => yt,
907
+ get: () => _t,
908
+ globalAgent: () => gt,
887
909
  request: () => X
888
- }), rt = new TextDecoder("latin1"), it = /* @__PURE__ */ "ACL.BIND.CHECKOUT.CONNECT.COPY.DELETE.GET.HEAD.LINK.LOCK.M-SEARCH.MERGE.MKACTIVITY.MKCALENDAR.MKCOL.MOVE.NOTIFY.OPTIONS.PATCH.POST.PROPFIND.PROPPATCH.PURGE.PUT.REBIND.REPORT.SEARCH.SOURCE.SUBSCRIBE.TRACE.UNBIND.UNLINK.UNLOCK.UNSUBSCRIBE".split("."), z = {
910
+ }), st = new TextDecoder("latin1"), ct = /* @__PURE__ */ "ACL.BIND.CHECKOUT.CONNECT.COPY.DELETE.GET.HEAD.LINK.LOCK.M-SEARCH.MERGE.MKACTIVITY.MKCALENDAR.MKCOL.MOVE.NOTIFY.OPTIONS.PATCH.POST.PROPFIND.PROPPATCH.PURGE.PUT.REBIND.REPORT.SEARCH.SOURCE.SUBSCRIBE.TRACE.UNBIND.UNLINK.UNLOCK.UNSUBSCRIBE".split("."), z = {
889
911
  100: "Continue",
890
912
  101: "Switching Protocols",
891
913
  102: "Processing",
@@ -949,7 +971,7 @@ var Ke = /* @__PURE__ */ n({
949
971
  509: "Bandwidth Limit Exceeded",
950
972
  510: "Not Extended",
951
973
  511: "Network Authentication Required"
952
- }, at = new Set([
974
+ }, lt = new Set([
953
975
  "content-type",
954
976
  "content-length",
955
977
  "user-agent",
@@ -968,15 +990,15 @@ var Ke = /* @__PURE__ */ n({
968
990
  "server",
969
991
  "age",
970
992
  "expires"
971
- ]), B = 13, V = 10, ot = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/, H = (e, t) => (e.code = t, e), st = (e, t) => {
993
+ ]), B = 13, V = 10, ut = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/, H = (e, t) => (e.code = t, e), dt = (e, t) => {
972
994
  if (e.length === 0) return t;
973
995
  if (t.length === 0) return e;
974
996
  let n = new Uint8Array(e.length + t.length);
975
997
  return n.set(e, 0), n.set(t, e.length), n;
976
- }, ct = (e, t) => {
998
+ }, ft = (e, t) => {
977
999
  for (let n = t; n + 1 < e.length; n++) if (e[n] === B && e[n + 1] === V) return n;
978
1000
  return -1;
979
- }, lt = (e) => {
1001
+ }, pt = (e) => {
980
1002
  for (let t = 0; t + 3 < e.length; t++) if (e[t] === B && e[t + 1] === V && e[t + 2] === B && e[t + 3] === V) return t;
981
1003
  return -1;
982
1004
  }, U = class {
@@ -990,10 +1012,10 @@ var Ke = /* @__PURE__ */ n({
990
1012
  this.mode = e, this.handlers = t;
991
1013
  }
992
1014
  execute(e) {
993
- this.buf = st(this.buf, e);
1015
+ this.buf = dt(this.buf, e);
994
1016
  let t = !0;
995
1017
  for (; t;) if (t = !1, this.state === "HEAD") {
996
- let e = lt(this.buf);
1018
+ let e = pt(this.buf);
997
1019
  if (e === -1) return;
998
1020
  let n = this.buf.subarray(0, e);
999
1021
  this.buf = this.buf.subarray(e + 4);
@@ -1008,7 +1030,7 @@ var Ke = /* @__PURE__ */ n({
1008
1030
  this.state = "HEAD", this.framing = "none", this.bodyRemaining = 0, this.chunkState = "size", this.skipBody = !1;
1009
1031
  }
1010
1032
  parseHead(e) {
1011
- let t = rt.decode(e).split("\r\n"), n = t.shift() ?? "", r = [];
1033
+ let t = st.decode(e).split("\r\n"), n = t.shift() ?? "", r = [];
1012
1034
  for (let e of t) (e.startsWith(" ") || e.startsWith(" ")) && r.length > 0 ? r[r.length - 1] += " " + e.trim() : r.push(e);
1013
1035
  let i = [], a = {};
1014
1036
  for (let e of r) {
@@ -1046,7 +1068,7 @@ var Ke = /* @__PURE__ */ n({
1046
1068
  return;
1047
1069
  }
1048
1070
  let i = e[r];
1049
- i === void 0 ? e[r] = n : at.has(r) || (e[r] = `${i}, ${n}`);
1071
+ i === void 0 ? e[r] = n : lt.has(r) || (e[r] = `${i}, ${n}`);
1050
1072
  }
1051
1073
  setupBody(e) {
1052
1074
  if (this.skipBody) {
@@ -1079,9 +1101,9 @@ var Ke = /* @__PURE__ */ n({
1079
1101
  }
1080
1102
  consumeChunked() {
1081
1103
  for (;;) if (this.chunkState === "size") {
1082
- let e = ct(this.buf, 0);
1104
+ let e = ft(this.buf, 0);
1083
1105
  if (e === -1) return !1;
1084
- let t = rt.decode(this.buf.subarray(0, e)), n = parseInt(t.split(";")[0].trim(), 16);
1106
+ let t = st.decode(this.buf.subarray(0, e)), n = parseInt(t.split(";")[0].trim(), 16);
1085
1107
  if (this.buf = this.buf.subarray(e + 2), Number.isNaN(n)) return !0;
1086
1108
  n === 0 ? this.chunkState = "trailer" : (this.bodyRemaining = n, this.chunkState = "data");
1087
1109
  } else if (this.chunkState === "data") {
@@ -1092,13 +1114,13 @@ var Ke = /* @__PURE__ */ n({
1092
1114
  if (this.buf.length < 2) return !1;
1093
1115
  this.buf = this.buf.subarray(2), this.chunkState = "size";
1094
1116
  } else {
1095
- let e = ct(this.buf, 0);
1117
+ let e = ft(this.buf, 0);
1096
1118
  if (e === -1) return !1;
1097
1119
  let t = e === 0;
1098
1120
  if (this.buf = this.buf.subarray(e + 2), t) return !0;
1099
1121
  }
1100
1122
  }
1101
- }, ut = (e, t) => m.isBuffer(e) ? e : typeof e == "string" ? m.from(e, t ?? "utf8") : e instanceof Uint8Array ? m.from(e) : e instanceof ArrayBuffer ? m.from(new Uint8Array(e)) : m.from(String(e)), W = class extends d.Readable {
1123
+ }, mt = (e, t) => m.isBuffer(e) ? e : typeof e == "string" ? m.from(e, t ?? "utf8") : e instanceof Uint8Array ? m.from(e) : e instanceof ArrayBuffer ? m.from(new Uint8Array(e)) : m.from(String(e)), W = class extends d.Readable {
1102
1124
  httpVersion = "1.1";
1103
1125
  httpVersionMajor = 1;
1104
1126
  httpVersionMinor = 1;
@@ -1133,7 +1155,7 @@ var Ke = /* @__PURE__ */ n({
1133
1155
  _bodyWritten = !1;
1134
1156
  setHeader(e, t) {
1135
1157
  if (this.headersSent) throw H(/* @__PURE__ */ Error("Cannot set headers after they are sent to the client"), "ERR_HTTP_HEADERS_SENT");
1136
- if (typeof e != "string" || !ot.test(e)) throw H(/* @__PURE__ */ TypeError(`Header name must be a valid HTTP token [${JSON.stringify(String(e))}]`), "ERR_INVALID_HTTP_TOKEN");
1158
+ if (typeof e != "string" || !ut.test(e)) throw H(/* @__PURE__ */ TypeError(`Header name must be a valid HTTP token [${JSON.stringify(String(e))}]`), "ERR_INVALID_HTTP_TOKEN");
1137
1159
  if (t === void 0) throw H(/* @__PURE__ */ TypeError(`Invalid value "undefined" for header "${e}"`), "ERR_HTTP_INVALID_HEADER_VALUE");
1138
1160
  return this._headerStore.set(e.toLowerCase(), [e, Array.isArray(t) ? [...t] : t]), this;
1139
1161
  }
@@ -1174,7 +1196,7 @@ var Ke = /* @__PURE__ */ n({
1174
1196
  return this._bodyWritten = !0, super.write(e, t, n);
1175
1197
  }
1176
1198
  _write(e, t, n) {
1177
- let r = ut(e), i = [];
1199
+ let r = mt(e), i = [];
1178
1200
  if (this.headersSent ||= (this._implicitHeader(), i.push(m.from(this._headBlock, "latin1")), !0), this.chunkedEncoding ? r.length > 0 && (i.push(m.from(`${r.length.toString(16)}\r\n`, "latin1")), i.push(r), i.push(m.from("\r\n", "latin1"))) : i.push(r), i.length === 0) {
1179
1201
  n();
1180
1202
  return;
@@ -1192,7 +1214,7 @@ var Ke = /* @__PURE__ */ n({
1192
1214
  end(e, t, n) {
1193
1215
  if (e != null && typeof e != "function" && !this._bodyWritten && !this.headersSent && !this.chunkedEncoding && !this.hasHeader("content-length")) {
1194
1216
  let n = typeof t == "string" ? t : void 0;
1195
- this.setHeader("Content-Length", ut(e, n).length);
1217
+ this.setHeader("Content-Length", mt(e, n).length);
1196
1218
  }
1197
1219
  return super.end(e, t, n);
1198
1220
  }
@@ -1241,7 +1263,7 @@ var Ke = /* @__PURE__ */ n({
1241
1263
  setTimeout(e, t) {
1242
1264
  return this.socket?.setTimeout(e, t), this;
1243
1265
  }
1244
- }, dt = (...e) => {
1266
+ }, ht = (...e) => {
1245
1267
  let t = {}, n = {}, r, i = [...e], a = i.shift();
1246
1268
  if (typeof a == "string" || a instanceof URL) {
1247
1269
  let e = typeof a == "string" ? new URL(a) : a;
@@ -1382,34 +1404,34 @@ var Ke = /* @__PURE__ */ n({
1382
1404
  return `${e.host ?? "localhost"}:${e.port ?? ""}:${e.localAddress ?? ""}`;
1383
1405
  }
1384
1406
  destroy() {}
1385
- }, ft = new Y(), X = (...e) => {
1386
- let { options: t, callback: n } = dt(...e);
1407
+ }, gt = new Y(), X = (...e) => {
1408
+ let { options: t, callback: n } = ht(...e);
1387
1409
  return new q(t, n);
1388
- }, pt = (...e) => {
1410
+ }, _t = (...e) => {
1389
1411
  let t = X(...e);
1390
1412
  return t.end(), t;
1391
- }, mt = (e, t) => new J(e, t), ht = {
1392
- METHODS: it,
1413
+ }, vt = (e, t) => new J(e, t), yt = {
1414
+ METHODS: ct,
1393
1415
  STATUS_CODES: z,
1394
1416
  Agent: Y,
1395
- globalAgent: ft,
1417
+ globalAgent: gt,
1396
1418
  Server: J,
1397
1419
  ServerResponse: K,
1398
1420
  IncomingMessage: W,
1399
1421
  ClientRequest: q,
1400
1422
  OutgoingMessage: G,
1401
- createServer: mt,
1423
+ createServer: vt,
1402
1424
  request: X,
1403
- get: pt
1404
- }, gt = /* @__PURE__ */ n({
1405
- available: () => _t,
1406
- dgram: () => Ze,
1407
- dns: () => ze,
1408
- fetch: () => Le,
1409
- http: () => nt,
1410
- net: () => Ke,
1411
- quota: () => Re
1412
- }), _t = () => Pe, Z = async (e) => {
1425
+ get: _t
1426
+ }, bt = /* @__PURE__ */ n({
1427
+ available: () => xt,
1428
+ dgram: () => tt,
1429
+ dns: () => Ue,
1430
+ fetch: () => Ve,
1431
+ http: () => ot,
1432
+ net: () => Xe,
1433
+ quota: () => He
1434
+ }), xt = () => Re, Z = async (e) => {
1413
1435
  if (typeof window > "u") return !1;
1414
1436
  if (g()) return !0;
1415
1437
  let t = await M, n = null, r = new Promise((e) => {
@@ -1424,71 +1446,73 @@ v(() => (Q ||= Z().then(() => void 0).finally(() => {
1424
1446
  }), Q));
1425
1447
  //#endregion
1426
1448
  //#region src/lib/desktop.ts
1427
- var vt = /* @__PURE__ */ n({
1428
- available: () => yt,
1429
- dgram: () => Ct,
1430
- dns: () => xt,
1431
- fetch: () => bt,
1432
- fs: () => wt,
1433
- net: () => St
1434
- }), yt = () => !1, $ = (e) => (...t) => {
1449
+ var St = /* @__PURE__ */ n({
1450
+ available: () => Ct,
1451
+ dgram: () => Dt,
1452
+ dns: () => Tt,
1453
+ fetch: () => wt,
1454
+ fs: () => Ot,
1455
+ net: () => Et
1456
+ }), Ct = () => !1, $ = (e) => (...t) => {
1435
1457
  throw Error(`The FKN desktop app is not connected, desktop.${e} is unavailable`);
1436
- }, bt = $("fetch"), xt = { lookup: $("dns.lookup") }, St = {
1458
+ }, wt = $("fetch"), Tt = { lookup: $("dns.lookup") }, Et = {
1437
1459
  connect: $("net.connect"),
1438
1460
  createConnection: $("net.createConnection"),
1439
1461
  createServer: $("net.createServer")
1440
- }, Ct = { createSocket: $("dgram.createSocket") }, wt = {
1462
+ }, Dt = { createSocket: $("dgram.createSocket") }, Ot = {
1441
1463
  isLocalDirectorySupported: () => !1,
1442
1464
  pickLocalDirectory: $("fs.pickLocalDirectory"),
1443
1465
  queryDirectoryPermission: $("fs.queryDirectoryPermission"),
1444
1466
  ensureDirectoryPermission: $("fs.ensureDirectoryPermission")
1445
- }, Tt = () => typeof document < "u" && g(), Et = async (e, t) => {
1446
- if (Ie(e), t?.credentials === "include") {
1467
+ }, kt = () => typeof document < "u" && g(), At = async (e, t) => {
1468
+ if (Be(e), t?.credentials === "include") {
1447
1469
  if (typeof document > "u") throw Error("fetch with credentials needs the FKN extension, which only exists in window realms");
1448
1470
  return C(e, t);
1449
1471
  }
1450
- return Tt() ? C(e, {
1472
+ return kt() ? C(e, {
1451
1473
  ...t,
1452
1474
  credentials: "omit"
1453
- }) : yt() ? bt(e, t) : Le(e, t);
1454
- }, Dt = /* @__PURE__ */ n({
1475
+ }) : Ct() ? wt(e, t) : Ve(e, t);
1476
+ }, jt = /* @__PURE__ */ n({
1455
1477
  ATTACH_FRAME_EVENT_KEY: () => w,
1456
1478
  assertAttachableFrameUrl: () => E,
1457
1479
  assertFetchableUrl: () => S,
1458
- attachFrame: () => ye,
1459
- attachFramePermission: () => _e,
1460
- available: () => Tt,
1480
+ attachFrame: () => Ce,
1481
+ attachFramePermission: () => xe,
1482
+ available: () => kt,
1461
1483
  box: () => l,
1462
- cookies: () => pe,
1484
+ cookies: () => _e,
1463
1485
  createVideoElementHandle: () => e,
1464
1486
  events: () => h,
1465
1487
  extension: () => h,
1466
1488
  fetch: () => C,
1467
- fetchCredentialedPermission: () => ce,
1468
- fetchPermission: () => se,
1469
- gotoPermission: () => ve,
1489
+ fetchCredentialedPermission: () => le,
1490
+ fetchLocalPermission: () => ue,
1491
+ fetchPermission: () => ce,
1492
+ gotoPermission: () => Se,
1470
1493
  handleRevivableModules: () => i,
1471
1494
  isBlockedFetchUrl: () => x,
1472
1495
  isBlockedFrameUrl: () => T,
1473
1496
  isExtensionExposed: () => g,
1497
+ isLocalNetworkUrl: () => fe,
1474
1498
  isType: () => t,
1475
- modifyRequestHeadersPermission: () => me,
1476
- permissions: () => be,
1499
+ modifyRequestHeadersPermission: () => ve,
1500
+ permissions: () => we,
1477
1501
  promptInstall: () => Z,
1478
- readCookiePermission: () => fe,
1479
- removeRequestHeaderRule: () => ge,
1502
+ readCookiePermission: () => ge,
1503
+ removeRequestHeaderRule: () => be,
1480
1504
  revive: () => o,
1481
1505
  setMissingExtensionHandler: () => v,
1482
- setRequestHeaderRule: () => he,
1506
+ setRequestHeaderRule: () => ye,
1483
1507
  type: () => a,
1484
1508
  waitForExtensionExposure: () => y
1485
- }), Ot = /* @__PURE__ */ n({
1486
- ensureDirectoryPermission: () => Mt,
1487
- isLocalDirectorySupported: () => kt,
1488
- pickLocalDirectory: () => At,
1489
- queryDirectoryPermission: () => jt
1490
- }), kt = () => typeof window < "u" && "showDirectoryPicker" in window, At = async (e = {}) => {
1491
- if (!kt()) return;
1509
+ }), Mt = /* @__PURE__ */ n({
1510
+ ensureDirectoryPermission: () => It,
1511
+ isLocalDirectorySupported: () => Nt,
1512
+ pickLocalDirectory: () => Pt,
1513
+ queryDirectoryPermission: () => Ft
1514
+ }), Nt = () => typeof window < "u" && "showDirectoryPicker" in window, Pt = async (e = {}) => {
1515
+ if (!Nt()) return;
1492
1516
  let t = window.showDirectoryPicker;
1493
1517
  return t({
1494
1518
  mode: "readwrite",
@@ -1496,25 +1520,47 @@ var vt = /* @__PURE__ */ n({
1496
1520
  }).catch((e) => {
1497
1521
  if (e?.name !== "AbortError") throw e;
1498
1522
  });
1499
- }, jt = async (e, t = "readwrite") => {
1523
+ }, Ft = async (e, t = "readwrite") => {
1500
1524
  let { queryPermission: n } = e;
1501
1525
  return await n?.call(e, { mode: t }) ?? "granted";
1502
- }, Mt = async (e, t = "readwrite") => {
1503
- if (await jt(e, t) === "granted") return !0;
1526
+ }, It = async (e, t = "readwrite") => {
1527
+ if (await Ft(e, t) === "granted") return !0;
1504
1528
  let { requestPermission: n } = e;
1505
1529
  return await n?.call(e, { mode: t }) === "granted";
1506
- }, Nt = "https://fkn.app", Pt = (e, t) => {
1530
+ }, Lt = "https://fkn.app", Rt = (e, t) => {
1507
1531
  if (typeof window > "u") throw Error("FKN @fkn/lib: relayWorker must be called from the main thread");
1508
1532
  if (!A?.contentWindow) throw Error("FKN @fkn/lib: relayWorker called before the FKN iframe was injected");
1509
- te({
1533
+ ne({
1510
1534
  receive: window,
1511
1535
  emit: A.contentWindow
1512
1536
  }, e, {
1513
1537
  key: "fkn-api",
1514
- originA: t?.originA ?? Nt,
1538
+ originA: t?.originA ?? Lt,
1515
1539
  originB: t?.originB ?? "*",
1516
1540
  unregisterSignal: t?.unregisterSignal
1517
1541
  });
1542
+ }, zt = async () => typeof window > "u" ? !1 : (await M).connect.prompt(location.origin).catch(() => !1), Bt = /* @__PURE__ */ n({
1543
+ info: () => Ut,
1544
+ login: () => Vt,
1545
+ logout: () => Ht,
1546
+ onChange: () => Wt
1547
+ }), Vt = async () => typeof window > "u" ? !1 : (await M).account.login(location.origin).catch(() => !1), Ht = async () => {
1548
+ typeof window > "u" || await (await M).account.logout().catch(() => {});
1549
+ }, Ut = async () => {
1550
+ if (typeof window > "u") return null;
1551
+ let e = await M.then((e) => e.account.info()).catch(() => null);
1552
+ return e ? {
1553
+ name: e.name,
1554
+ image: e.image,
1555
+ premium: e.premium,
1556
+ premiumUntil: e.premiumUntil ? Date.parse(e.premiumUntil) : null
1557
+ } : null;
1558
+ }, Wt = async (e) => {
1559
+ if (typeof window > "u") return () => {};
1560
+ let t = await M.catch(() => null);
1561
+ if (!t) return () => {};
1562
+ let n = await t.account.onChange(e).catch(() => null);
1563
+ return typeof n == "function" ? n : () => {};
1518
1564
  };
1519
1565
  //#endregion
1520
- export { w as ATTACH_FRAME_EVENT_KEY, E as assertAttachableFrameUrl, S as assertFetchableUrl, ye as attachFrame, _e as attachFramePermission, l as box, gt as cloud, pe as cookies, e as createVideoElementHandle, vt as desktop, Ze as dgram, ze as dns, Dt as extension, Et as fetch, ce as fetchCredentialedPermission, se as fetchPermission, Ot as fs, ve as gotoPermission, i as handleRevivableModules, nt as http, x as isBlockedFetchUrl, T as isBlockedFrameUrl, g as isExtensionExposed, t as isType, me as modifyRequestHeadersPermission, Ke as net, be as permissions, Z as promptInstall, fe as readCookiePermission, Pt as relayWorker, ge as removeRequestHeaderRule, o as revive, v as setMissingExtensionHandler, he as setRequestHeaderRule, a as type, y as waitForExtensionExposure };
1566
+ export { w as ATTACH_FRAME_EVENT_KEY, Bt as account, E as assertAttachableFrameUrl, S as assertFetchableUrl, Ce as attachFrame, xe as attachFramePermission, l as box, bt as cloud, zt as connect, u as connectButtonUrl, _e as cookies, e as createVideoElementHandle, St as desktop, tt as dgram, Ue as dns, jt as extension, At as fetch, le as fetchCredentialedPermission, ue as fetchLocalPermission, ce as fetchPermission, Mt as fs, Se as gotoPermission, i as handleRevivableModules, ot as http, x as isBlockedFetchUrl, T as isBlockedFrameUrl, g as isExtensionExposed, fe as isLocalNetworkUrl, t as isType, ve as modifyRequestHeadersPermission, Xe as net, we as permissions, Z as promptInstall, ge as readCookiePermission, Rt as relayWorker, be as removeRequestHeaderRule, o as revive, v as setMissingExtensionHandler, ye as setRequestHeaderRule, a as type, y as waitForExtensionExposure };