@fkn/lib 0.4.1 → 0.4.3

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.
Files changed (4) hide show
  1. package/index.cjs +5 -5
  2. package/index.d.ts +47 -7
  3. package/index.js +341 -239
  4. package/package.json +1 -1
package/index.js CHANGED
@@ -1,56 +1,77 @@
1
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 ee, expose as te, relay as ne } from "osra";
3
- import { Stream as u } from "stream";
4
- import { EventEmitter as re } from "events";
5
- import { Address4 as d, Address6 as f } from "ip-address";
6
- import { Buffer as p } from "buffer";
2
+ import { createTypedEventTarget as u, expose as ee, relay as te } from "osra";
3
+ import { Stream as d } from "stream";
4
+ import { EventEmitter as ne } from "events";
5
+ import { Address4 as f, Address6 as p } from "ip-address";
6
+ import { Buffer as m } from "buffer";
7
7
  //#region node_modules/@mfkn/web-extension/lib/utils/extension.js
8
- var ie = "FKN_WEB_EXTENSION_MAIN_WORLD_CONTENT_SCRIPT_ENABLED_EVENT_KEY", ae = "fknExtension", m = ee();
9
- typeof document < "u" && document.addEventListener(ie, (e) => {
10
- m.dispatchEvent(new CustomEvent("statuschange", { detail: { enabled: e.detail.enabled } }));
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) => {
10
+ h.dispatchEvent(new CustomEvent("statuschange", { detail: { enabled: e.detail.enabled } }));
11
11
  });
12
- var h = () => typeof document > "u" ? !1 : document.documentElement.dataset[ae] === "true", g = null, _ = (e) => {
13
- g = e;
14
- }, oe = 150, v = (e = 1e3) => new Promise((t, n) => {
15
- if (h()) return t();
12
+ var g = () => typeof document > "u" ? !1 : document.documentElement.dataset[ie] === "true", _ = null, v = (e) => {
13
+ _ = e;
14
+ }, ae = 150, y = (e = 1e3) => new Promise((t, n) => {
15
+ if (g()) return t();
16
16
  let r, i = (e) => {
17
17
  clearTimeout(r), s.disconnect(), document.removeEventListener("readystatechange", c), e();
18
18
  }, a = () => i(async () => {
19
- if (g && (await g().catch(() => {}), h())) return t();
19
+ if (_ && (await _().catch(() => {}), g())) return t();
20
20
  n(/* @__PURE__ */ Error("The FKN WebExtension is not installed, enabled or not exposed on this page."));
21
21
  }), o = () => {
22
- clearTimeout(r), r = setTimeout(() => h() ? i(t) : a(), oe);
22
+ clearTimeout(r), r = setTimeout(() => g() ? i(t) : a(), ae);
23
23
  }, s = new MutationObserver(() => {
24
- h() && i(t);
24
+ g() && i(t);
25
25
  }), c = () => {
26
- document.readyState === "complete" && !h() && o();
26
+ document.readyState === "complete" && !g() && o();
27
27
  };
28
28
  if (r = setTimeout(a, e), s.observe(document.documentElement, {
29
29
  attributes: !0,
30
30
  attributeFilter: ["data-fkn-extension"]
31
31
  }), document.addEventListener("readystatechange", c), document.readyState === "complete") return o();
32
- h() && i(t);
33
- }), se, y = new Proxy({}, { get: (e, t) => async (...e) => {
34
- await v(), se ??= te({}, {
32
+ g() && i(t);
33
+ }), oe, b = new Proxy({}, { get: (e, t) => async (...e) => {
34
+ await y(), oe ??= ee({}, {
35
35
  transport: window,
36
36
  revivableModules: i
37
37
  });
38
- let n = (await se)[t];
38
+ let n = (await oe)[t];
39
39
  return n(...e);
40
- } }), ce = {
40
+ } }), se = {
41
41
  scope: "network.fetch",
42
42
  category: "network",
43
43
  severity: 0,
44
44
  title: "Fetch data from other sites",
45
45
  description: "Lets the app download public data from other websites directly, past the usual cross-origin limits."
46
- }, le = {
46
+ }, ce = {
47
47
  scope: "network.fetchCredentialed",
48
48
  category: "network",
49
49
  severity: 3,
50
50
  unsafe: !0,
51
51
  title: "Fetch from other sites, signed in as you",
52
52
  description: "Lets the app fetch other sites using your logged-in session cookies, so it can read data only you should see."
53
- }, ue = ["fkn.app", "fkn.dev"], b = (e) => {
53
+ }, le = {
54
+ scope: "network.fetchLocal",
55
+ category: "network",
56
+ severity: 3,
57
+ unsafe: !0,
58
+ title: "Access devices on your local network",
59
+ description: "Lets the app reach devices and services on your home or work network, which websites normally cannot touch."
60
+ }, ue = (e) => {
61
+ let t = e.match(/^(\d+)\.(\d+)\.\d+\.\d+$/);
62
+ if (!t) return !1;
63
+ let [n, r] = [Number(t[1]), Number(t[2])];
64
+ return n === 10 || n === 127 || n === 0 || n === 169 && r === 254 || n === 172 && r >= 16 && r <= 31 || n === 192 && r === 168;
65
+ }, de = (e) => {
66
+ let t;
67
+ try {
68
+ t = new URL(e);
69
+ } catch {
70
+ return !1;
71
+ }
72
+ let n = t.hostname.replace(/^\[|\]$/g, "").toLowerCase().replace(/\.$/, "");
73
+ 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:") : ue(n);
74
+ }, fe = ["fkn.app", "fkn.dev"], x = (e) => {
54
75
  let t;
55
76
  try {
56
77
  t = new URL(e);
@@ -59,46 +80,46 @@ var h = () => typeof document > "u" ? !1 : document.documentElement.dataset[ae]
59
80
  }
60
81
  if (t.protocol === "chrome-extension:" || t.protocol === "moz-extension:") return !0;
61
82
  let n = t.hostname;
62
- return ue.some((e) => n === e || n.endsWith(`.${e}`));
63
- }, x = (e) => {
64
- if (b(e)) throw Error("fetch: refusing to target the extension's own pages or FKN platform domains");
65
- }, de = ["origin", "referer"], fe = (e) => {
83
+ return fe.some((e) => n === e || n.endsWith(`.${e}`));
84
+ }, S = (e) => {
85
+ if (x(e)) throw Error("fetch: refusing to target the extension's own pages or FKN platform domains");
86
+ }, pe = ["origin", "referer"], me = (e) => {
66
87
  if (!e?.headers) return;
67
- let t = new Headers(e.headers), n = de.map((e) => {
88
+ let t = new Headers(e.headers), n = pe.map((e) => {
68
89
  let n = t.get(e);
69
90
  return n === null ? void 0 : [e, n];
70
91
  }).filter((e) => e !== void 0);
71
92
  return n.length ? n : void 0;
72
- }, S = async (e, t) => {
93
+ }, C = async (e, t) => {
73
94
  let n = new Request(e, t);
74
- x(n.url);
95
+ S(n.url);
75
96
  let r = n.body ? await n.arrayBuffer() : null;
76
- return y.proxyFetch({
97
+ return b.proxyFetch({
77
98
  url: n.url,
78
99
  method: n.method,
79
100
  headers: [...n.headers],
80
101
  body: r,
81
102
  credentials: t?.credentials === "include" ? "include" : "omit",
82
103
  redirect: n.redirect,
83
- unsafeHeaders: fe(t),
104
+ unsafeHeaders: me(t),
84
105
  reason: t?.reason,
85
106
  signal: t?.signal ?? void 0
86
107
  });
87
- }, pe = {
108
+ }, he = {
88
109
  scope: "network.readCookie",
89
110
  category: "network",
90
111
  severity: 3,
91
112
  unsafe: !0,
92
113
  title: "Read a site’s cookie",
93
114
  description: "Lets the app read a named cookie from another site, which can include the login token only that site should see."
94
- }, me = { get: (e) => y.getCookie(e) }, he = {
115
+ }, ge = { get: (e) => b.getCookie(e) }, _e = {
95
116
  scope: "network.modifyRequestHeaders",
96
117
  category: "network",
97
118
  severity: 2,
98
119
  unsafe: !0,
99
120
  title: "Rewrite request headers to other sites",
100
121
  description: "Lets the app set or remove headers (like Origin and Referer) on this page’s own requests to the listed sites."
101
- }, ge = (e) => y.setRequestHeaderRule(e), _e = (e) => y.removeRequestHeaderRule({ ruleId: e });
122
+ }, ve = (e) => b.setRequestHeaderRule(e), ye = (e) => b.removeRequestHeaderRule({ ruleId: e });
102
123
  (() => {
103
124
  let e = {}, t = [...c.selectorModules, ...r.selectorModules];
104
125
  for (let n of t) n.render && !(n.type in e) && (e[n.type] = n.render);
@@ -106,7 +127,7 @@ var h = () => typeof document > "u" ? !1 : document.documentElement.dataset[ae]
106
127
  })();
107
128
  //#endregion
108
129
  //#region node_modules/@mfkn/web-extension/lib/lib/frame.js
109
- var C = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", w = (e) => {
130
+ var w = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", T = (e) => {
110
131
  if (!e || e === "about:blank") return !1;
111
132
  let t;
112
133
  try {
@@ -118,28 +139,28 @@ var C = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", w = (e) => {
118
139
  if (t.protocol === "about:") return !1;
119
140
  let n = t.hostname;
120
141
  return n === "fkn.app" || n.endsWith(".fkn.app");
121
- }, T = (e) => {
122
- if (w(e)) throw Error("attachFrame: refusing to target the extension's own pages or fkn.app");
123
- }, ve = {
142
+ }, E = (e) => {
143
+ if (T(e)) throw Error("attachFrame: refusing to target the extension's own pages or fkn.app");
144
+ }, be = {
124
145
  scope: "embed.iframe",
125
146
  category: "embed",
126
147
  severity: 0,
127
148
  title: "Load another website inside this app",
128
149
  description: "Lets the app embed external pages directly inside its own view."
129
- }, ye = {
150
+ }, xe = {
130
151
  scope: "embed.open",
131
152
  category: "embed",
132
153
  severity: 0,
133
154
  title: "Open a website inside this app",
134
155
  description: "Lets the app navigate to another site without leaving its window."
135
- }, be = async ({ iframe: e, domains: t = [] }) => {
156
+ }, Se = async ({ iframe: e, domains: t = [] }) => {
136
157
  let n = crypto.randomUUID();
137
- if (T(e.src), await v(), !e.isConnected) throw Error("attachFrame: the iframe must be connected to the document before attaching");
138
- e.dispatchEvent(new CustomEvent(C, { detail: n }));
139
- let { executeLocator: r, ensureLocatorPermission: i, goto: a } = await y.attachFrame({
158
+ if (E(e.src), await y(), !e.isConnected) throw Error("attachFrame: the iframe must be connected to the document before attaching");
159
+ e.dispatchEvent(new CustomEvent(w, { detail: n }));
160
+ let { executeLocator: r, ensureLocatorPermission: i, goto: a } = await b.attachFrame({
140
161
  marker: n,
141
162
  domains: t
142
- }), o = s(r, i), c = (e, t = {}) => (T(e), a({
163
+ }), o = s(r, i), c = (e, t = {}) => (E(e), a({
143
164
  url: e,
144
165
  ...t
145
166
  })), l = () => e.src;
@@ -148,22 +169,22 @@ var C = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", w = (e) => {
148
169
  goto: c,
149
170
  url: l
150
171
  };
151
- }, xe = { request: (e) => y.requestPermissions(e.map((e) => ({
172
+ }, Ce = { request: (e) => b.requestPermissions(e.map((e) => ({
152
173
  key: e.key,
153
174
  scope: e.scope ?? "",
154
175
  reason: e.reason
155
- }))) }, Se = 32, Ce = typeof CSS < "u" && CSS.supports("clip-path", "path('M0 0H1V1H0Z')"), we = (e) => {
176
+ }))) }, we = 32, Te = typeof CSS < "u" && CSS.supports("clip-path", "path('M0 0H1V1H0Z')"), Ee = (e) => {
156
177
  let t = e.style;
157
178
  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
- }, Te = ({ x: e, y: t, width: n, height: r }) => `M${e} ${t}h${n}v${r}h${-n}Z`, Ee = (e, { modal: t, rects: n }) => {
159
- if (!Ce) {
179
+ }, De = ({ x: e, y: t, width: n, height: r }) => `M${e} ${t}h${n}v${r}h${-n}Z`, Oe = (e, { modal: t, rects: n }) => {
180
+ if (!Te) {
160
181
  let r = t || n.length > 0;
161
182
  e.style.setProperty("pointer-events", r ? "auto" : "none", "important"), e.style.setProperty("visibility", r ? "visible" : "hidden", "important");
162
183
  return;
163
184
  }
164
- let r = t ? "none" : n.length === 0 ? "inset(100%)" : `path('${n.map(Te).join("")}')`, i = r === "none" || CSS.supports("clip-path", r) ? r : "inset(100%)";
185
+ let r = t ? "none" : n.length === 0 ? "inset(100%)" : `path('${n.map(De).join("")}')`, i = r === "none" || CSS.supports("clip-path", r) ? r : "inset(100%)";
165
186
  e.style.setProperty("clip-path", i, "important");
166
- }, De = (e) => {
187
+ }, ke = (e) => {
167
188
  if (typeof e != "object" || !e) return null;
168
189
  let { x: t, y: n, width: r, height: i } = e;
169
190
  if (![
@@ -172,52 +193,52 @@ var C = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", w = (e) => {
172
193
  r,
173
194
  i
174
195
  ].every((e) => typeof e == "number" && Number.isFinite(e))) return null;
175
- let a = window.innerWidth, o = window.innerHeight, s = Math.max(0, Math.min(Math.round(t), a)), c = Math.max(0, Math.min(Math.round(n), o)), l = Math.max(s, Math.min(Math.round(t + r), a)), ee = Math.max(c, Math.min(Math.round(n + i), o));
196
+ let a = window.innerWidth, o = window.innerHeight, s = Math.max(0, Math.min(Math.round(t), a)), c = Math.max(0, Math.min(Math.round(n), o)), l = Math.max(s, Math.min(Math.round(t + r), a)), u = Math.max(c, Math.min(Math.round(n + i), o));
176
197
  return {
177
198
  x: s,
178
199
  y: c,
179
200
  width: l - s,
180
- height: ee - c
201
+ height: u - c
181
202
  };
182
- }, Oe = (e) => {
203
+ }, Ae = (e) => {
183
204
  if (typeof e != "object" || !e) return null;
184
- let t = e, n = (Array.isArray(t.rects) ? t.rects.slice(0, Se) : []).map(De).filter((e) => e !== null && e.width > 0 && e.height > 0);
205
+ let t = e, n = (Array.isArray(t.rects) ? t.rects.slice(0, we) : []).map(ke).filter((e) => e !== null && e.width > 0 && e.height > 0);
185
206
  return {
186
207
  modal: t.modal === !0,
187
208
  rects: n
188
209
  };
189
- }, E = null, ke = () => E !== null, Ae = (e) => {
190
- we(e), Ee(e, {
210
+ }, D = null, je = () => D !== null, Me = (e) => {
211
+ Ee(e), Oe(e, {
191
212
  modal: !1,
192
213
  rects: []
193
- }), E = e;
194
- }, je = (e) => {
195
- if (!E) return;
196
- let t = Oe(e);
197
- t && Ee(E, t);
198
- }, D = "https://fkn.app", O = typeof globalThis < "u" && globalThis.document ? globalThis.document : void 0, Me = O?.querySelector(`iframe[src="${D}/api"]`) ?? null, k = O?.createElement("iframe") ?? null;
199
- !Me && k && O && (k.src = `${D}/api`, O.body.appendChild(k));
200
- var A = Me ?? k, Ne = A?.contentWindow ?? null;
201
- A && O && Ae(A);
214
+ }), D = e;
215
+ }, Ne = (e) => {
216
+ if (!D) return;
217
+ let t = Ae(e);
218
+ t && Oe(D, t);
219
+ }, Pe = "https://fkn.app", O = typeof globalThis < "u" && globalThis.document ? globalThis.document : void 0, Fe = O?.querySelector(`iframe[src="${Pe}/api"]`) ?? null, k = O?.createElement("iframe") ?? null;
220
+ !Fe && k && O && (k.src = `${Pe}/api`, O.body.appendChild(k));
221
+ var A = Fe ?? k, Ie = A?.contentWindow ?? null;
222
+ A && O && Me(A);
202
223
  var j = (() => {
203
- if (typeof window < "u") return Ne ? {
224
+ if (typeof window < "u") return Ie ? {
204
225
  receive: window,
205
- emit: Ne
226
+ emit: Ie
206
227
  } : void 0;
207
228
  if (typeof self < "u") return {
208
229
  receive: self,
209
230
  emit: self
210
231
  };
211
- })(), Pe = j !== void 0, M = j ? te({}, {
232
+ })(), Le = j !== void 0, M = j ? ee({}, {
212
233
  key: "fkn-api",
213
234
  transport: j
214
235
  }) : new Promise(() => {});
215
236
  M.then((e) => {
216
- ke() && e.overlay.setHost(je);
237
+ je() && e.overlay.setHost(Ne);
217
238
  }, () => {});
218
239
  //#endregion
219
240
  //#region src/lib/fkn-target.ts
220
- var Fe = ["fkn.app", "fkn.dev"], Ie = (e) => {
241
+ var Re = ["fkn.app", "fkn.dev"], ze = (e) => {
221
242
  let t = typeof e == "string" ? e : e instanceof URL ? e.href : e.url, n;
222
243
  try {
223
244
  n = new URL(t);
@@ -225,8 +246,8 @@ var Fe = ["fkn.app", "fkn.dev"], Ie = (e) => {
225
246
  return;
226
247
  }
227
248
  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 () => {
249
+ if (Re.some((e) => r === e || r.endsWith(`.${e}`))) throw Error(`fetch refuses FKN platform domains (${r})`);
250
+ }, Be = (e, t) => (ze(e), M.then((n) => n.cloud.fetch(e, t))), Ve = async () => {
230
251
  let e = await M.then((e) => e.cloud.quota());
231
252
  return {
232
253
  premium: e.premium,
@@ -238,9 +259,9 @@ var Fe = ["fkn.app", "fkn.dev"], Ie = (e) => {
238
259
  bytesPerSecond: e.bytesPerSecond,
239
260
  bitsPerSecond: e.bytesPerSecond * 8
240
261
  };
241
- }, ze = /* @__PURE__ */ n({ lookup: () => Be }), Be = (e, t) => M.then((n) => n.cloud.dns.lookup(e, t)), Ve = new TextEncoder();
262
+ }, He = /* @__PURE__ */ n({ lookup: () => Ue }), Ue = (e, t) => M.then((n) => n.cloud.dns.lookup(e, t)), We = new TextEncoder();
242
263
  new TextDecoder();
243
- var N = (e) => d.isValid(e), P = (e) => f.isValid(e), He = (e) => N(e) ? 4 : P(e) ? 6 : 0, Ue = (...e) => {
264
+ var N = (e) => f.isValid(e), P = (e) => p.isValid(e), Ge = (e) => N(e) ? 4 : P(e) ? 6 : 0, Ke = (...e) => {
244
265
  if (typeof e[0] == "string") throw Error("FKN WebVPN does not support IPC connections");
245
266
  let t = typeof e.at(-1) == "function" ? e.at(-1) : void 0;
246
267
  return e[0] && typeof e[0] == "object" ? {
@@ -251,7 +272,7 @@ var N = (e) => d.isValid(e), P = (e) => f.isValid(e), He = (e) => N(e) ? 4 : P(e
251
272
  host: typeof e[1] == "string" ? e[1] : void 0,
252
273
  callback: t
253
274
  };
254
- }, We = (...e) => {
275
+ }, qe = (...e) => {
255
276
  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
277
  return typeof e[0] == "object" ? {
257
278
  ...e[0],
@@ -263,7 +284,7 @@ var N = (e) => d.isValid(e), P = (e) => f.isValid(e), He = (e) => N(e) ? 4 : P(e
263
284
  port: n,
264
285
  callback: t
265
286
  };
266
- }, Ge = (...e) => {
287
+ }, Je = (...e) => {
267
288
  let t = typeof e.at(-1) == "function" ? e.at(-1) : void 0, n = e[0];
268
289
  if (typeof e[2] == "number") return {
269
290
  message: n,
@@ -288,18 +309,18 @@ var N = (e) => d.isValid(e), P = (e) => f.isValid(e), He = (e) => N(e) ? 4 : P(e
288
309
  new TextEncoder(), new TextDecoder();
289
310
  //#endregion
290
311
  //#region src/lib/webvpn/net.ts
291
- var Ke = /* @__PURE__ */ n({
312
+ var Ye = /* @__PURE__ */ n({
292
313
  Server: () => I,
293
314
  Socket: () => F,
294
- _default: () => Ye,
295
- connect: () => qe,
296
- createConnection: () => Je,
297
- createServer: () => L,
298
- default: () => Ye,
299
- isIP: () => He,
315
+ _default: () => $e,
316
+ connect: () => Xe,
317
+ createConnection: () => Ze,
318
+ createServer: () => Qe,
319
+ default: () => $e,
320
+ isIP: () => Ge,
300
321
  isIPv4: () => N,
301
322
  isIPv6: () => P
302
- }), F = class extends u.Duplex {
323
+ }), F = class extends d.Duplex {
303
324
  _localAddress;
304
325
  _remoteAddress;
305
326
  _webVPNTcpSocketPromise;
@@ -359,7 +380,7 @@ var Ke = /* @__PURE__ */ n({
359
380
  }).catch(n);
360
381
  }
361
382
  connect(...e) {
362
- let t = Ue(...e), n = this.__webvpn_tcp_socket_init__(M.then((e) => e.cloud.webvpn.tcpSocket({
383
+ let t = Ke(...e), n = this.__webvpn_tcp_socket_init__(M.then((e) => e.cloud.webvpn.tcpSocket({
363
384
  remoteAddress: t.host ?? "localhost",
364
385
  remotePort: t.port
365
386
  })));
@@ -486,7 +507,7 @@ var Ke = /* @__PURE__ */ n({
486
507
  return this._remoteAddress.family;
487
508
  }
488
509
  timeout;
489
- }, I = class extends re {
510
+ }, I = class extends ne {
490
511
  _localAddress;
491
512
  _webVPNTcpSocketListenerPromise;
492
513
  constructor(e, t) {
@@ -504,7 +525,7 @@ var Ke = /* @__PURE__ */ n({
504
525
  }), this._webVPNTcpSocketListenerPromise;
505
526
  }
506
527
  listen(...e) {
507
- let t = Ue(...e), n = (e) => {
528
+ let t = Ke(...e), n = (e) => {
508
529
  let t = new F({ connection: Promise.resolve(e) });
509
530
  this.emit("connection", t);
510
531
  }, r = (e) => M.then((r) => r.cloud.webvpn.tcpSocketListener({
@@ -541,27 +562,33 @@ var Ke = /* @__PURE__ */ n({
541
562
  connections;
542
563
  listening;
543
564
  async [Symbol.asyncDispose]() {}
544
- }, qe = (e, t) => new F().connect(e, t), Je = (e, t) => new F().connect(e, t), L = (e, t) => {
565
+ }, Xe = (e, t) => new F().connect(e, t), Ze = (e, t) => new F().connect(e, t), Qe = (e, t) => {
545
566
  typeof e == "function" && (t = e, e = void 0);
546
567
  let n = new I(e);
547
568
  return t && n.on("connection", t), n;
548
- }, Ye = {
569
+ }, $e = {
549
570
  Socket: F,
550
571
  Server: I,
551
- connect: qe,
552
- createConnection: Je,
553
- createServer: L,
554
- isIP: He,
572
+ connect: Xe,
573
+ createConnection: Ze,
574
+ createServer: Qe,
575
+ isIP: Ge,
555
576
  isIPv4: N,
556
577
  isIPv6: P
557
- }, Xe = /* @__PURE__ */ n({
558
- Socket: () => Ze,
559
- createSocket: () => $e
560
- }), Ze = class extends re {
578
+ }, et = /* @__PURE__ */ n({
579
+ Socket: () => tt,
580
+ createSocket: () => it
581
+ }), tt = class extends ne {
561
582
  _type;
562
583
  _localAddress;
563
584
  _remoteAddress;
564
585
  _webVPNUdpSocketPromise;
586
+ _dataPort;
587
+ _socketId;
588
+ _sendQueue = [];
589
+ _sendQueueBytes = 0;
590
+ _sendFlushScheduled = !1;
591
+ _peerTailCache = /* @__PURE__ */ new Map();
565
592
  constructor(e) {
566
593
  if (super(e), !e) throw Error("Missing options");
567
594
  this._type = e.type;
@@ -584,9 +611,63 @@ var Ke = /* @__PURE__ */ n({
584
611
  }
585
612
  });
586
613
  }
614
+ _onDataPortBatch(e) {
615
+ let t = new DataView(e), n = 0;
616
+ for (; n + 4 <= e.byteLength;) {
617
+ let r = t.getUint32(n);
618
+ n += 4;
619
+ let i = n + r;
620
+ if (i > e.byteLength) break;
621
+ let a = n + 4, o = t.getUint8(a);
622
+ a += 1;
623
+ let s, c, l;
624
+ if (o === 2) {
625
+ if (!this._remoteAddress) {
626
+ n = i;
627
+ continue;
628
+ }
629
+ s = this._remoteAddress.address, c = this._remoteAddress.family, l = this._remoteAddress.port;
630
+ } else {
631
+ let n = new Uint8Array(e, a, o === 0 ? 4 : 16);
632
+ if (o === 0) c = "IPv4", s = `${n[0]}.${n[1]}.${n[2]}.${n[3]}`;
633
+ else {
634
+ c = "IPv6";
635
+ let e = [];
636
+ for (let t = 0; t < 16; t += 2) e.push(((n[t] << 8 | n[t + 1]) >>> 0).toString(16));
637
+ s = e.join(":");
638
+ }
639
+ a += n.byteLength, l = t.getUint16(a), a += 2;
640
+ }
641
+ let u = t.getUint32(a);
642
+ a += 4, this.emit("message", m.from(e.slice(a, a + u)), {
643
+ address: s,
644
+ family: c,
645
+ port: l,
646
+ size: u
647
+ }), n = i;
648
+ }
649
+ }
650
+ _peerTail(e, t) {
651
+ if (e === void 0 || t === void 0) return nt;
652
+ let n = `${e}|${t}`, r = this._peerTailCache.get(n);
653
+ if (r) return r;
654
+ let i = f.isValid(e) ? L(e) : R(e), a = new Uint8Array(1 + i.byteLength + 2);
655
+ return a[0] = i.byteLength === 4 ? 0 : 1, a.set(i, 1), new DataView(a.buffer).setUint16(1 + i.byteLength, t), this._peerTailCache.set(n, a), a;
656
+ }
657
+ _portSend(e, t, n) {
658
+ let r = this._peerTail(t, n), i = new Uint8Array(8 + r.byteLength + 4 + e.byteLength), a = new DataView(i.buffer);
659
+ a.setUint32(0, i.byteLength - 4), a.setUint32(4, this._socketId), i.set(r, 8), a.setUint32(8 + r.byteLength, e.byteLength), i.set(e, 12 + r.byteLength), this._sendQueue.push(i), this._sendQueueBytes += i.byteLength, !this._sendFlushScheduled && (this._sendFlushScheduled = !0, queueMicrotask(() => {
660
+ this._sendFlushScheduled = !1;
661
+ let e = this._sendQueue, t = this._sendQueueBytes;
662
+ if (this._sendQueue = [], this._sendQueueBytes = 0, !e.length || !this._dataPort) return;
663
+ let n = new Uint8Array(t), r = 0;
664
+ for (let t of e) n.set(t, r), r += t.byteLength;
665
+ this._dataPort.postMessage(n.buffer, [n.buffer]);
666
+ }));
667
+ }
587
668
  addMembership(e, t) {
588
- if (d.isValid(e)) {
589
- let n = R(e), r = t && d.isValid(t) ? R(t) : new Uint8Array([
669
+ if (f.isValid(e)) {
670
+ let n = L(e), r = t && f.isValid(t) ? L(t) : new Uint8Array([
590
671
  0,
591
672
  0,
592
673
  0,
@@ -597,8 +678,8 @@ var Ke = /* @__PURE__ */ n({
597
678
  group: n,
598
679
  interface: r
599
680
  });
600
- } else if (f.isValid(e)) {
601
- let t = Qe(e);
681
+ } else if (p.isValid(e)) {
682
+ let t = R(e);
602
683
  this._setUdpOption({
603
684
  type: 7,
604
685
  group: t,
@@ -611,22 +692,27 @@ var Ke = /* @__PURE__ */ n({
611
692
  return this._localAddress;
612
693
  }
613
694
  bind(...e) {
614
- let t = We(...e), n = this._type === "udp6" ? "::" : "0.0.0.0";
695
+ let t = qe(...e), n = this._type === "udp6" ? "::" : "0.0.0.0";
615
696
  return this._webVPNUdpSocketPromise = M.then((e) => e.cloud.webvpn.udpSocket({
616
697
  type: this._type,
617
698
  address: t.address ?? n,
618
- port: t.port
699
+ port: t.port,
700
+ dataPort: !0
619
701
  })).then((e) => {
620
- let t = e.dataReadableStream.getReader(), n = async () => {
621
- let { value: e, done: r } = await t.read();
622
- r || (this.emit("message", p.from(e.data), {
623
- address: e.address,
624
- family: e.family,
625
- port: e.port,
626
- size: e.size
627
- }), n());
628
- };
629
- return n(), this._localAddress = {
702
+ if (e.dataPort) this._socketId = e.socketId, this._dataPort = e.dataPort, this._dataPort.onmessage = (e) => this._onDataPortBatch(e.data);
703
+ else {
704
+ let t = e.dataReadableStream.getReader(), n = async () => {
705
+ let { value: e, done: r } = await t.read();
706
+ r || (this.emit("message", m.from(e.data), {
707
+ address: e.address,
708
+ family: e.family,
709
+ port: e.port,
710
+ size: e.size
711
+ }), n());
712
+ };
713
+ n();
714
+ }
715
+ return this._localAddress = {
630
716
  address: e.localAddress,
631
717
  family: e.localFamily,
632
718
  port: e.localPort
@@ -636,14 +722,14 @@ var Ke = /* @__PURE__ */ n({
636
722
  }), this._webVPNUdpSocketPromise.then((e) => {
637
723
  e && this.emit("listening");
638
724
  }), t.callback && this._webVPNUdpSocketPromise.then((e) => {
639
- e && t.callback();
725
+ e && t.callback.call(this);
640
726
  }), this;
641
727
  }
642
728
  close(e) {
643
729
  if (!this._webVPNUdpSocketPromise) throw Error("Socket not bound");
644
730
  return this._webVPNUdpSocketPromise.then(async (t) => {
645
731
  if (!t) throw Error("Socket not bound");
646
- await t.close(), e && e(), this.emit("close");
732
+ this._dataPort?.close(), this._dataPort = void 0, await t.close(), e && e(), this.emit("close");
647
733
  }), this;
648
734
  }
649
735
  connect(...e) {
@@ -672,8 +758,8 @@ var Ke = /* @__PURE__ */ n({
672
758
  });
673
759
  }
674
760
  dropMembership(e, t) {
675
- if (d.isValid(e)) {
676
- let n = R(e), r = t && d.isValid(t) ? R(t) : new Uint8Array([
761
+ if (f.isValid(e)) {
762
+ let n = L(e), r = t && f.isValid(t) ? L(t) : new Uint8Array([
677
763
  0,
678
764
  0,
679
765
  0,
@@ -684,8 +770,8 @@ var Ke = /* @__PURE__ */ n({
684
770
  group: n,
685
771
  interface: r
686
772
  });
687
- } else if (f.isValid(e)) {
688
- let t = Qe(e);
773
+ } else if (p.isValid(e)) {
774
+ let t = R(e);
689
775
  this._setUdpOption({
690
776
  type: 8,
691
777
  group: t,
@@ -718,16 +804,20 @@ var Ke = /* @__PURE__ */ n({
718
804
  }
719
805
  send(...e) {
720
806
  this._webVPNUdpSocketPromise || this.bind();
721
- let t = Ge(...e), n = this._type === "udp6" ? "::1" : "127.0.0.1";
807
+ let t = Je(...e), n = this._type === "udp6" ? "::1" : "127.0.0.1";
722
808
  if (!this._webVPNUdpSocketPromise) throw Error("Socket not bound");
723
809
  this._webVPNUdpSocketPromise.then((e) => {
724
810
  if (!e) throw Error("Socket not bound");
725
- let r = typeof t.message == "string" ? Ve.encode(t.message) : t.message;
811
+ let r = rt(t.message), i = t.callback, a = t.address ?? n, o = this._remoteAddress !== void 0 && t.address === void 0;
812
+ if (this._dataPort && (o || f.isValid(a) || p.isValid(a))) {
813
+ this._portSend(r, o ? void 0 : a, o ? void 0 : t.port), i?.call(this, null, r.byteLength);
814
+ return;
815
+ }
726
816
  e.send({
727
817
  ...t,
728
- address: t.address ?? n,
729
- message: r.buffer
730
- });
818
+ address: a,
819
+ message: r.byteOffset === 0 && r.byteLength === r.buffer.byteLength ? r.buffer : r.buffer.slice(r.byteOffset, r.byteOffset + r.byteLength)
820
+ }).then(() => i?.call(this, null, r.byteLength), (e) => i ? i.call(this, e, 0) : this.emit("error", e));
731
821
  });
732
822
  }
733
823
  setBroadcast(e) {
@@ -780,33 +870,43 @@ var Ke = /* @__PURE__ */ n({
780
870
  this.close(e);
781
871
  });
782
872
  }
783
- }, R = (e) => {
873
+ }, nt = new Uint8Array([2]), rt = (e) => {
874
+ if (typeof e == "string") return We.encode(e);
875
+ if (e instanceof Uint8Array) return e;
876
+ if (ArrayBuffer.isView(e)) return new Uint8Array(e.buffer, e.byteOffset, e.byteLength);
877
+ if (Array.isArray(e)) {
878
+ let t = e.map(rt), n = new Uint8Array(t.reduce((e, t) => e + t.byteLength, 0)), r = 0;
879
+ for (let e of t) n.set(e, r), r += e.byteLength;
880
+ return n;
881
+ }
882
+ return new Uint8Array(e);
883
+ }, L = (e) => {
784
884
  let t = e.split(".").map((e) => parseInt(e, 10));
785
885
  if (t.length !== 4 || t.some((e) => Number.isNaN(e) || e < 0 || e > 255)) throw Error(`Invalid IPv4 address: ${e}`);
786
886
  return new Uint8Array(t);
787
- }, Qe = (e) => {
788
- let t = new f(e).getBitsBase16(0, 128).match(/.{2}/g);
887
+ }, R = (e) => {
888
+ let t = new p(e).getBitsBase16(0, 128).match(/.{2}/g);
789
889
  if (!t || t.length !== 16) throw Error(`Invalid IPv6 address: ${e}`);
790
890
  return new Uint8Array(t.map((e) => parseInt(e, 16)));
791
- }, $e = (e, t) => {
792
- let n = new Ze(typeof e == "string" ? { type: e } : e);
891
+ }, it = (e, t) => {
892
+ let n = new tt(typeof e == "string" ? { type: e } : e);
793
893
  return t && n.on("message", t), n;
794
- }, et = /* @__PURE__ */ n({
894
+ }, at = /* @__PURE__ */ n({
795
895
  Agent: () => Y,
796
896
  ClientRequest: () => q,
797
897
  HTTPParser: () => U,
798
898
  IncomingMessage: () => W,
799
- METHODS: () => nt,
899
+ METHODS: () => st,
800
900
  STATUS_CODES: () => z,
801
901
  Server: () => J,
802
902
  ServerResponse: () => K,
803
- _default: () => pt,
804
- createServer: () => ft,
805
- default: () => pt,
806
- get: () => dt,
807
- globalAgent: () => ut,
903
+ _default: () => vt,
904
+ createServer: () => _t,
905
+ default: () => vt,
906
+ get: () => gt,
907
+ globalAgent: () => ht,
808
908
  request: () => X
809
- }), tt = new TextDecoder("latin1"), nt = /* @__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 = {
909
+ }), ot = new TextDecoder("latin1"), st = /* @__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 = {
810
910
  100: "Continue",
811
911
  101: "Switching Protocols",
812
912
  102: "Processing",
@@ -870,7 +970,7 @@ var Ke = /* @__PURE__ */ n({
870
970
  509: "Bandwidth Limit Exceeded",
871
971
  510: "Not Extended",
872
972
  511: "Network Authentication Required"
873
- }, rt = new Set([
973
+ }, ct = new Set([
874
974
  "content-type",
875
975
  "content-length",
876
976
  "user-agent",
@@ -889,15 +989,15 @@ var Ke = /* @__PURE__ */ n({
889
989
  "server",
890
990
  "age",
891
991
  "expires"
892
- ]), B = 13, V = 10, it = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/, H = (e, t) => (e.code = t, e), at = (e, t) => {
992
+ ]), B = 13, V = 10, lt = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/, H = (e, t) => (e.code = t, e), ut = (e, t) => {
893
993
  if (e.length === 0) return t;
894
994
  if (t.length === 0) return e;
895
995
  let n = new Uint8Array(e.length + t.length);
896
996
  return n.set(e, 0), n.set(t, e.length), n;
897
- }, ot = (e, t) => {
997
+ }, dt = (e, t) => {
898
998
  for (let n = t; n + 1 < e.length; n++) if (e[n] === B && e[n + 1] === V) return n;
899
999
  return -1;
900
- }, st = (e) => {
1000
+ }, ft = (e) => {
901
1001
  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;
902
1002
  return -1;
903
1003
  }, U = class {
@@ -911,10 +1011,10 @@ var Ke = /* @__PURE__ */ n({
911
1011
  this.mode = e, this.handlers = t;
912
1012
  }
913
1013
  execute(e) {
914
- this.buf = at(this.buf, e);
1014
+ this.buf = ut(this.buf, e);
915
1015
  let t = !0;
916
1016
  for (; t;) if (t = !1, this.state === "HEAD") {
917
- let e = st(this.buf);
1017
+ let e = ft(this.buf);
918
1018
  if (e === -1) return;
919
1019
  let n = this.buf.subarray(0, e);
920
1020
  this.buf = this.buf.subarray(e + 4);
@@ -929,7 +1029,7 @@ var Ke = /* @__PURE__ */ n({
929
1029
  this.state = "HEAD", this.framing = "none", this.bodyRemaining = 0, this.chunkState = "size", this.skipBody = !1;
930
1030
  }
931
1031
  parseHead(e) {
932
- let t = tt.decode(e).split("\r\n"), n = t.shift() ?? "", r = [];
1032
+ let t = ot.decode(e).split("\r\n"), n = t.shift() ?? "", r = [];
933
1033
  for (let e of t) (e.startsWith(" ") || e.startsWith(" ")) && r.length > 0 ? r[r.length - 1] += " " + e.trim() : r.push(e);
934
1034
  let i = [], a = {};
935
1035
  for (let e of r) {
@@ -967,7 +1067,7 @@ var Ke = /* @__PURE__ */ n({
967
1067
  return;
968
1068
  }
969
1069
  let i = e[r];
970
- i === void 0 ? e[r] = n : rt.has(r) || (e[r] = `${i}, ${n}`);
1070
+ i === void 0 ? e[r] = n : ct.has(r) || (e[r] = `${i}, ${n}`);
971
1071
  }
972
1072
  setupBody(e) {
973
1073
  if (this.skipBody) {
@@ -1000,9 +1100,9 @@ var Ke = /* @__PURE__ */ n({
1000
1100
  }
1001
1101
  consumeChunked() {
1002
1102
  for (;;) if (this.chunkState === "size") {
1003
- let e = ot(this.buf, 0);
1103
+ let e = dt(this.buf, 0);
1004
1104
  if (e === -1) return !1;
1005
- let t = tt.decode(this.buf.subarray(0, e)), n = parseInt(t.split(";")[0].trim(), 16);
1105
+ let t = ot.decode(this.buf.subarray(0, e)), n = parseInt(t.split(";")[0].trim(), 16);
1006
1106
  if (this.buf = this.buf.subarray(e + 2), Number.isNaN(n)) return !0;
1007
1107
  n === 0 ? this.chunkState = "trailer" : (this.bodyRemaining = n, this.chunkState = "data");
1008
1108
  } else if (this.chunkState === "data") {
@@ -1013,13 +1113,13 @@ var Ke = /* @__PURE__ */ n({
1013
1113
  if (this.buf.length < 2) return !1;
1014
1114
  this.buf = this.buf.subarray(2), this.chunkState = "size";
1015
1115
  } else {
1016
- let e = ot(this.buf, 0);
1116
+ let e = dt(this.buf, 0);
1017
1117
  if (e === -1) return !1;
1018
1118
  let t = e === 0;
1019
1119
  if (this.buf = this.buf.subarray(e + 2), t) return !0;
1020
1120
  }
1021
1121
  }
1022
- }, ct = (e, t) => p.isBuffer(e) ? e : typeof e == "string" ? p.from(e, t ?? "utf8") : e instanceof Uint8Array ? p.from(e) : e instanceof ArrayBuffer ? p.from(new Uint8Array(e)) : p.from(String(e)), W = class extends u.Readable {
1122
+ }, pt = (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 {
1023
1123
  httpVersion = "1.1";
1024
1124
  httpVersionMajor = 1;
1025
1125
  httpVersionMinor = 1;
@@ -1046,7 +1146,7 @@ var Ke = /* @__PURE__ */ n({
1046
1146
  setTimeout(e, t) {
1047
1147
  return this.socket.setTimeout(e, t), this;
1048
1148
  }
1049
- }, G = class extends u.Writable {
1149
+ }, G = class extends d.Writable {
1050
1150
  _headerStore = /* @__PURE__ */ new Map();
1051
1151
  headersSent = !1;
1052
1152
  chunkedEncoding = !1;
@@ -1054,7 +1154,7 @@ var Ke = /* @__PURE__ */ n({
1054
1154
  _bodyWritten = !1;
1055
1155
  setHeader(e, t) {
1056
1156
  if (this.headersSent) throw H(/* @__PURE__ */ Error("Cannot set headers after they are sent to the client"), "ERR_HTTP_HEADERS_SENT");
1057
- if (typeof e != "string" || !it.test(e)) throw H(/* @__PURE__ */ TypeError(`Header name must be a valid HTTP token [${JSON.stringify(String(e))}]`), "ERR_INVALID_HTTP_TOKEN");
1157
+ if (typeof e != "string" || !lt.test(e)) throw H(/* @__PURE__ */ TypeError(`Header name must be a valid HTTP token [${JSON.stringify(String(e))}]`), "ERR_INVALID_HTTP_TOKEN");
1058
1158
  if (t === void 0) throw H(/* @__PURE__ */ TypeError(`Invalid value "undefined" for header "${e}"`), "ERR_HTTP_INVALID_HEADER_VALUE");
1059
1159
  return this._headerStore.set(e.toLowerCase(), [e, Array.isArray(t) ? [...t] : t]), this;
1060
1160
  }
@@ -1095,25 +1195,25 @@ var Ke = /* @__PURE__ */ n({
1095
1195
  return this._bodyWritten = !0, super.write(e, t, n);
1096
1196
  }
1097
1197
  _write(e, t, n) {
1098
- let r = ct(e), i = [];
1099
- if (this.headersSent ||= (this._implicitHeader(), i.push(p.from(this._headBlock, "latin1")), !0), this.chunkedEncoding ? r.length > 0 && (i.push(p.from(`${r.length.toString(16)}\r\n`, "latin1")), i.push(r), i.push(p.from("\r\n", "latin1"))) : i.push(r), i.length === 0) {
1198
+ let r = pt(e), i = [];
1199
+ 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) {
1100
1200
  n();
1101
1201
  return;
1102
1202
  }
1103
- this._writeToSocket(p.concat(i), n);
1203
+ this._writeToSocket(m.concat(i), n);
1104
1204
  }
1105
1205
  _final(e) {
1106
1206
  let t = [];
1107
- if (this.headersSent ||= (!this.chunkedEncoding && !this.hasHeader("content-length") && this.setHeader("Content-Length", 0), this._implicitHeader(), t.push(p.from(this._headBlock, "latin1")), !0), this.chunkedEncoding && t.push(p.from("0\r\n\r\n", "latin1")), this.finished = !0, t.length === 0) {
1207
+ if (this.headersSent ||= (!this.chunkedEncoding && !this.hasHeader("content-length") && this.setHeader("Content-Length", 0), this._implicitHeader(), t.push(m.from(this._headBlock, "latin1")), !0), this.chunkedEncoding && t.push(m.from("0\r\n\r\n", "latin1")), this.finished = !0, t.length === 0) {
1108
1208
  e();
1109
1209
  return;
1110
1210
  }
1111
- this._writeToSocket(p.concat(t), e);
1211
+ this._writeToSocket(m.concat(t), e);
1112
1212
  }
1113
1213
  end(e, t, n) {
1114
1214
  if (e != null && typeof e != "function" && !this._bodyWritten && !this.headersSent && !this.chunkedEncoding && !this.hasHeader("content-length")) {
1115
1215
  let n = typeof t == "string" ? t : void 0;
1116
- this.setHeader("Content-Length", ct(e, n).length);
1216
+ this.setHeader("Content-Length", pt(e, n).length);
1117
1217
  }
1118
1218
  return super.end(e, t, n);
1119
1219
  }
@@ -1157,12 +1257,12 @@ var Ke = /* @__PURE__ */ n({
1157
1257
  this.sendDate && !this.hasHeader("date") && this.setHeader("Date", (/* @__PURE__ */ new Date()).toUTCString()), this.hasHeader("connection") || this.setHeader("Connection", this._keepAlive ? "keep-alive" : "close"), this._headBlock = this._storeHeader(`HTTP/1.1 ${this.statusCode} ${e}`);
1158
1258
  }
1159
1259
  writeContinue() {
1160
- this._writeToSocket(p.from("HTTP/1.1 100 Continue\r\n\r\n", "latin1"), () => {});
1260
+ this._writeToSocket(m.from("HTTP/1.1 100 Continue\r\n\r\n", "latin1"), () => {});
1161
1261
  }
1162
1262
  setTimeout(e, t) {
1163
1263
  return this.socket?.setTimeout(e, t), this;
1164
1264
  }
1165
- }, lt = (...e) => {
1265
+ }, mt = (...e) => {
1166
1266
  let t = {}, n = {}, r, i = [...e], a = i.shift();
1167
1267
  if (typeof a == "string" || a instanceof URL) {
1168
1268
  let e = typeof a == "string" ? new URL(a) : a;
@@ -1206,7 +1306,7 @@ var Ke = /* @__PURE__ */ n({
1206
1306
  let e = this.protocol === "https:" && r === 443 || this.protocol !== "https:" && r === 80;
1207
1307
  this.setHeader("Host", e ? n : `${n}:${r}`);
1208
1308
  }
1209
- e.auth && !this.hasHeader("authorization") && this.setHeader("Authorization", `Basic ${p.from(e.auth).toString("base64")}`), this.socket = new F(), this.emit("socket", this.socket), this.socket.on("error", (e) => {
1309
+ e.auth && !this.hasHeader("authorization") && this.setHeader("Authorization", `Basic ${m.from(e.auth).toString("base64")}`), this.socket = new F(), this.emit("socket", this.socket), this.socket.on("error", (e) => {
1210
1310
  this._aborted || this.emit("error", e);
1211
1311
  }), this._attachResponseParser(), this.socket.connect({
1212
1312
  host: n,
@@ -1227,7 +1327,7 @@ var Ke = /* @__PURE__ */ n({
1227
1327
  e._applyHead(n), this.method === "HEAD" && (t.skipBody = !0), this.res = e, this.emit("response", e);
1228
1328
  },
1229
1329
  onBody: (t) => {
1230
- e.push(p.from(t));
1330
+ e.push(m.from(t));
1231
1331
  },
1232
1332
  onComplete: () => {
1233
1333
  e.complete = !0, e.push(null);
@@ -1281,7 +1381,7 @@ var Ke = /* @__PURE__ */ n({
1281
1381
  }), this.emit("request", t, i);
1282
1382
  },
1283
1383
  onBody: (e) => {
1284
- t?.push(p.from(e));
1384
+ t?.push(m.from(e));
1285
1385
  },
1286
1386
  onComplete: () => {
1287
1387
  t && (t.complete = !0, t.push(null)), t = null;
@@ -1303,113 +1403,115 @@ var Ke = /* @__PURE__ */ n({
1303
1403
  return `${e.host ?? "localhost"}:${e.port ?? ""}:${e.localAddress ?? ""}`;
1304
1404
  }
1305
1405
  destroy() {}
1306
- }, ut = new Y(), X = (...e) => {
1307
- let { options: t, callback: n } = lt(...e);
1406
+ }, ht = new Y(), X = (...e) => {
1407
+ let { options: t, callback: n } = mt(...e);
1308
1408
  return new q(t, n);
1309
- }, dt = (...e) => {
1409
+ }, gt = (...e) => {
1310
1410
  let t = X(...e);
1311
1411
  return t.end(), t;
1312
- }, ft = (e, t) => new J(e, t), pt = {
1313
- METHODS: nt,
1412
+ }, _t = (e, t) => new J(e, t), vt = {
1413
+ METHODS: st,
1314
1414
  STATUS_CODES: z,
1315
1415
  Agent: Y,
1316
- globalAgent: ut,
1416
+ globalAgent: ht,
1317
1417
  Server: J,
1318
1418
  ServerResponse: K,
1319
1419
  IncomingMessage: W,
1320
1420
  ClientRequest: q,
1321
1421
  OutgoingMessage: G,
1322
- createServer: ft,
1422
+ createServer: _t,
1323
1423
  request: X,
1324
- get: dt
1325
- }, mt = /* @__PURE__ */ n({
1326
- available: () => ht,
1327
- dgram: () => Xe,
1328
- dns: () => ze,
1329
- fetch: () => Le,
1330
- http: () => et,
1331
- net: () => Ke,
1332
- quota: () => Re
1333
- }), ht = () => Pe, Z = async (e) => {
1424
+ get: gt
1425
+ }, yt = /* @__PURE__ */ n({
1426
+ available: () => bt,
1427
+ dgram: () => et,
1428
+ dns: () => He,
1429
+ fetch: () => Be,
1430
+ http: () => at,
1431
+ net: () => Ye,
1432
+ quota: () => Ve
1433
+ }), bt = () => Le, Z = async (e) => {
1334
1434
  if (typeof window > "u") return !1;
1335
- if (h()) return !0;
1435
+ if (g()) return !0;
1336
1436
  let t = await M, n = null, r = new Promise((e) => {
1337
1437
  n = () => {
1338
- h() && e(!0);
1339
- }, m.addEventListener("statuschange", n);
1438
+ g() && e(!0);
1439
+ }, h.addEventListener("statuschange", n);
1340
1440
  }), i = t.installPrompt.show(e).then(() => !1), a = await Promise.race([r, i]);
1341
- return n && m.removeEventListener("statuschange", n), await t.installPrompt.hide().catch(() => {}), a;
1441
+ return n && h.removeEventListener("statuschange", n), await t.installPrompt.hide().catch(() => {}), a;
1342
1442
  }, Q = null;
1343
- _(() => (Q ||= Z().then(() => void 0).finally(() => {
1443
+ v(() => (Q ||= Z().then(() => void 0).finally(() => {
1344
1444
  Q = null;
1345
1445
  }), Q));
1346
1446
  //#endregion
1347
1447
  //#region src/lib/desktop.ts
1348
- var gt = /* @__PURE__ */ n({
1349
- available: () => _t,
1350
- dgram: () => xt,
1351
- dns: () => yt,
1352
- fetch: () => vt,
1353
- fs: () => St,
1354
- net: () => bt
1355
- }), _t = () => !1, $ = (e) => (...t) => {
1448
+ var xt = /* @__PURE__ */ n({
1449
+ available: () => St,
1450
+ dgram: () => Et,
1451
+ dns: () => wt,
1452
+ fetch: () => Ct,
1453
+ fs: () => Dt,
1454
+ net: () => Tt
1455
+ }), St = () => !1, $ = (e) => (...t) => {
1356
1456
  throw Error(`The FKN desktop app is not connected, desktop.${e} is unavailable`);
1357
- }, vt = $("fetch"), yt = { lookup: $("dns.lookup") }, bt = {
1457
+ }, Ct = $("fetch"), wt = { lookup: $("dns.lookup") }, Tt = {
1358
1458
  connect: $("net.connect"),
1359
1459
  createConnection: $("net.createConnection"),
1360
1460
  createServer: $("net.createServer")
1361
- }, xt = { createSocket: $("dgram.createSocket") }, St = {
1461
+ }, Et = { createSocket: $("dgram.createSocket") }, Dt = {
1362
1462
  isLocalDirectorySupported: () => !1,
1363
1463
  pickLocalDirectory: $("fs.pickLocalDirectory"),
1364
1464
  queryDirectoryPermission: $("fs.queryDirectoryPermission"),
1365
1465
  ensureDirectoryPermission: $("fs.ensureDirectoryPermission")
1366
- }, Ct = () => typeof document < "u" && h(), wt = async (e, t) => {
1367
- if (Ie(e), t?.credentials === "include") {
1466
+ }, Ot = () => typeof document < "u" && g(), kt = async (e, t) => {
1467
+ if (ze(e), t?.credentials === "include") {
1368
1468
  if (typeof document > "u") throw Error("fetch with credentials needs the FKN extension, which only exists in window realms");
1369
- return S(e, t);
1469
+ return C(e, t);
1370
1470
  }
1371
- return Ct() ? S(e, {
1471
+ return Ot() ? C(e, {
1372
1472
  ...t,
1373
1473
  credentials: "omit"
1374
- }) : _t() ? vt(e, t) : Le(e, t);
1375
- }, Tt = /* @__PURE__ */ n({
1376
- ATTACH_FRAME_EVENT_KEY: () => C,
1377
- assertAttachableFrameUrl: () => T,
1378
- assertFetchableUrl: () => x,
1379
- attachFrame: () => be,
1380
- attachFramePermission: () => ve,
1381
- available: () => Ct,
1474
+ }) : St() ? Ct(e, t) : Be(e, t);
1475
+ }, At = /* @__PURE__ */ n({
1476
+ ATTACH_FRAME_EVENT_KEY: () => w,
1477
+ assertAttachableFrameUrl: () => E,
1478
+ assertFetchableUrl: () => S,
1479
+ attachFrame: () => Se,
1480
+ attachFramePermission: () => be,
1481
+ available: () => Ot,
1382
1482
  box: () => l,
1383
- cookies: () => me,
1483
+ cookies: () => ge,
1384
1484
  createVideoElementHandle: () => e,
1385
- events: () => m,
1386
- extension: () => m,
1387
- fetch: () => S,
1388
- fetchCredentialedPermission: () => le,
1389
- fetchPermission: () => ce,
1390
- gotoPermission: () => ye,
1485
+ events: () => h,
1486
+ extension: () => h,
1487
+ fetch: () => C,
1488
+ fetchCredentialedPermission: () => ce,
1489
+ fetchLocalPermission: () => le,
1490
+ fetchPermission: () => se,
1491
+ gotoPermission: () => xe,
1391
1492
  handleRevivableModules: () => i,
1392
- isBlockedFetchUrl: () => b,
1393
- isBlockedFrameUrl: () => w,
1394
- isExtensionExposed: () => h,
1493
+ isBlockedFetchUrl: () => x,
1494
+ isBlockedFrameUrl: () => T,
1495
+ isExtensionExposed: () => g,
1496
+ isLocalNetworkUrl: () => de,
1395
1497
  isType: () => t,
1396
- modifyRequestHeadersPermission: () => he,
1397
- permissions: () => xe,
1498
+ modifyRequestHeadersPermission: () => _e,
1499
+ permissions: () => Ce,
1398
1500
  promptInstall: () => Z,
1399
- readCookiePermission: () => pe,
1400
- removeRequestHeaderRule: () => _e,
1501
+ readCookiePermission: () => he,
1502
+ removeRequestHeaderRule: () => ye,
1401
1503
  revive: () => o,
1402
- setMissingExtensionHandler: () => _,
1403
- setRequestHeaderRule: () => ge,
1504
+ setMissingExtensionHandler: () => v,
1505
+ setRequestHeaderRule: () => ve,
1404
1506
  type: () => a,
1405
- waitForExtensionExposure: () => v
1406
- }), Et = /* @__PURE__ */ n({
1407
- ensureDirectoryPermission: () => At,
1408
- isLocalDirectorySupported: () => Dt,
1409
- pickLocalDirectory: () => Ot,
1410
- queryDirectoryPermission: () => kt
1411
- }), Dt = () => typeof window < "u" && "showDirectoryPicker" in window, Ot = async (e = {}) => {
1412
- if (!Dt()) return;
1507
+ waitForExtensionExposure: () => y
1508
+ }), jt = /* @__PURE__ */ n({
1509
+ ensureDirectoryPermission: () => Ft,
1510
+ isLocalDirectorySupported: () => Mt,
1511
+ pickLocalDirectory: () => Nt,
1512
+ queryDirectoryPermission: () => Pt
1513
+ }), Mt = () => typeof window < "u" && "showDirectoryPicker" in window, Nt = async (e = {}) => {
1514
+ if (!Mt()) return;
1413
1515
  let t = window.showDirectoryPicker;
1414
1516
  return t({
1415
1517
  mode: "readwrite",
@@ -1417,25 +1519,25 @@ var gt = /* @__PURE__ */ n({
1417
1519
  }).catch((e) => {
1418
1520
  if (e?.name !== "AbortError") throw e;
1419
1521
  });
1420
- }, kt = async (e, t = "readwrite") => {
1522
+ }, Pt = async (e, t = "readwrite") => {
1421
1523
  let { queryPermission: n } = e;
1422
1524
  return await n?.call(e, { mode: t }) ?? "granted";
1423
- }, At = async (e, t = "readwrite") => {
1424
- if (await kt(e, t) === "granted") return !0;
1525
+ }, Ft = async (e, t = "readwrite") => {
1526
+ if (await Pt(e, t) === "granted") return !0;
1425
1527
  let { requestPermission: n } = e;
1426
1528
  return await n?.call(e, { mode: t }) === "granted";
1427
- }, jt = "https://fkn.app", Mt = (e, t) => {
1529
+ }, It = "https://fkn.app", Lt = (e, t) => {
1428
1530
  if (typeof window > "u") throw Error("FKN @fkn/lib: relayWorker must be called from the main thread");
1429
1531
  if (!A?.contentWindow) throw Error("FKN @fkn/lib: relayWorker called before the FKN iframe was injected");
1430
- ne({
1532
+ te({
1431
1533
  receive: window,
1432
1534
  emit: A.contentWindow
1433
1535
  }, e, {
1434
1536
  key: "fkn-api",
1435
- originA: t?.originA ?? jt,
1537
+ originA: t?.originA ?? It,
1436
1538
  originB: t?.originB ?? "*",
1437
1539
  unregisterSignal: t?.unregisterSignal
1438
1540
  });
1439
- };
1541
+ }, Rt = async () => typeof window > "u" ? !1 : (await M).connect.prompt(location.origin).catch(() => !1);
1440
1542
  //#endregion
1441
- export { C as ATTACH_FRAME_EVENT_KEY, T as assertAttachableFrameUrl, x as assertFetchableUrl, be as attachFrame, ve as attachFramePermission, l as box, mt as cloud, me as cookies, e as createVideoElementHandle, gt as desktop, Xe as dgram, ze as dns, Tt as extension, wt as fetch, le as fetchCredentialedPermission, ce as fetchPermission, Et as fs, ye as gotoPermission, i as handleRevivableModules, et as http, b as isBlockedFetchUrl, w as isBlockedFrameUrl, h as isExtensionExposed, t as isType, he as modifyRequestHeadersPermission, Ke as net, xe as permissions, Z as promptInstall, pe as readCookiePermission, Mt as relayWorker, _e as removeRequestHeaderRule, o as revive, _ as setMissingExtensionHandler, ge as setRequestHeaderRule, a as type, v as waitForExtensionExposure };
1543
+ export { w as ATTACH_FRAME_EVENT_KEY, E as assertAttachableFrameUrl, S as assertFetchableUrl, Se as attachFrame, be as attachFramePermission, l as box, yt as cloud, Rt as connect, ge as cookies, e as createVideoElementHandle, xt as desktop, et as dgram, He as dns, At as extension, kt as fetch, ce as fetchCredentialedPermission, le as fetchLocalPermission, se as fetchPermission, jt as fs, xe as gotoPermission, i as handleRevivableModules, at as http, x as isBlockedFetchUrl, T as isBlockedFrameUrl, g as isExtensionExposed, de as isLocalNetworkUrl, t as isType, _e as modifyRequestHeadersPermission, Ye as net, Ce as permissions, Z as promptInstall, he as readCookiePermission, Lt as relayWorker, ye as removeRequestHeaderRule, o as revive, v as setMissingExtensionHandler, ve as setRequestHeaderRule, a as type, y as waitForExtensionExposure };