@fkn/lib 0.4.9 → 0.5.0

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 (88) hide show
  1. package/account.cjs +1 -0
  2. package/account.d.ts +17 -0
  3. package/account.js +28 -0
  4. package/api-ByfayMm1.js +67 -0
  5. package/api-CDb2pv7C.cjs +1 -0
  6. package/background-Dk_vaVP1.cjs +1 -0
  7. package/{background-CTsVv_a0.js → background-TtzKw6g0.js} +5 -4
  8. package/chunk-B6C_zzib.cjs +1 -0
  9. package/chunk-CPXzm0be.js +11 -0
  10. package/cloud/dgram.cjs +1 -0
  11. package/cloud/dgram.d.ts +537 -0
  12. package/cloud/dgram.js +4 -0
  13. package/cloud/dns.cjs +1 -0
  14. package/cloud/dns.d.ts +12 -0
  15. package/cloud/dns.js +3 -0
  16. package/cloud/fs/promises.cjs +1 -0
  17. package/cloud/fs/promises.d.ts +45 -0
  18. package/cloud/fs/promises.js +8 -0
  19. package/cloud/fs.cjs +1 -0
  20. package/cloud/fs.d.ts +75 -0
  21. package/cloud/fs.js +20 -0
  22. package/cloud/http.cjs +1 -0
  23. package/cloud/http.d.ts +767 -0
  24. package/cloud/http.js +5 -0
  25. package/cloud/net.cjs +1 -0
  26. package/cloud/net.d.ts +606 -0
  27. package/cloud/net.js +4 -0
  28. package/cloud-BVnscun4.js +33 -0
  29. package/cloud-DTL2B5pW.cjs +1 -0
  30. package/cloud.cjs +1 -0
  31. package/cloud.d.ts +1048 -0
  32. package/cloud.js +12 -0
  33. package/desktop.cjs +1 -0
  34. package/desktop.d.ts +49 -0
  35. package/desktop.js +51 -0
  36. package/dgram-5YUb70O2.js +326 -0
  37. package/dgram-Cdi6Y7zJ.cjs +1 -0
  38. package/dgram.cjs +1 -0
  39. package/dgram.d.ts +537 -0
  40. package/dgram.js +4 -0
  41. package/dns.cjs +1 -0
  42. package/dns.d.ts +12 -0
  43. package/dns.js +6 -0
  44. package/extension-9Uv_0HdS.cjs +1 -0
  45. package/extension-Dgz0UTy0.js +245 -0
  46. package/extension.cjs +1 -0
  47. package/extension.d.ts +853 -0
  48. package/extension.js +5 -0
  49. package/fs/promises.cjs +1 -0
  50. package/fs/promises.d.ts +46 -0
  51. package/fs/promises.js +8 -0
  52. package/fs-B7JumDCn.js +78 -0
  53. package/fs-DrwvwtqC.cjs +1 -0
  54. package/fs.cjs +1 -0
  55. package/fs.d.ts +84 -0
  56. package/fs.js +5 -0
  57. package/http.cjs +9 -0
  58. package/http.d.ts +767 -0
  59. package/http.js +541 -0
  60. package/index.cjs +1 -9
  61. package/index.d.ts +197 -140
  62. package/index.js +27 -1879
  63. package/locator-Cf7M3QKN.cjs +53 -0
  64. package/{locator-Q5m8i40Z.js → locator-DxAsGV_o.js} +331 -337
  65. package/net-Bl6_W3bd.js +275 -0
  66. package/net-C5kWnI4C.cjs +1 -0
  67. package/net.cjs +1 -0
  68. package/net.d.ts +606 -0
  69. package/net.js +4 -0
  70. package/node-fs-Bd_UUx1m.js +361 -0
  71. package/node-fs-lrlD_zqB.cjs +1 -0
  72. package/opfs/promises.cjs +1 -0
  73. package/opfs/promises.d.ts +46 -0
  74. package/opfs/promises.js +6 -0
  75. package/opfs-BfcYLPGb.js +55 -0
  76. package/opfs-Dsi4FkJU.cjs +1 -0
  77. package/opfs.cjs +1 -0
  78. package/opfs.d.ts +83 -0
  79. package/opfs.js +35 -0
  80. package/package.json +91 -1
  81. package/proxy-A9UvWUaF.cjs +1 -0
  82. package/proxy-wiZN4eTR.js +14 -0
  83. package/storage-BadvHtv0.cjs +1 -0
  84. package/storage-z0q3iena.js +13 -0
  85. package/utils-BsNRWMfl.cjs +1 -0
  86. package/utils-CNydj3OT.js +52 -0
  87. package/background-BqRFQggD.cjs +0 -1
  88. package/locator-Cjl21Nkt.cjs +0 -53
package/index.js CHANGED
@@ -1,1888 +1,36 @@
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-Q5m8i40Z.js";
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
- import { createElement as re } from "react";
8
- //#region node_modules/@mfkn/web-extension/lib/utils/extension.js
9
- var ie = "FKN_WEB_EXTENSION_MAIN_WORLD_CONTENT_SCRIPT_ENABLED_EVENT_KEY", ae = "fknExtension", h = u();
10
- typeof document < "u" && document.addEventListener(ie, () => {
11
- h.dispatchEvent(new CustomEvent("statuschange", { detail: { enabled: g() } }));
12
- });
13
- var g = () => typeof document > "u" ? !1 : document.documentElement.dataset[ae] === "true", oe = null, se = (e) => {
14
- oe = e;
15
- }, ce = 150, _ = (e = 1e3) => new Promise((t, n) => {
16
- if (g()) return t();
17
- let r, i = (e) => {
18
- clearTimeout(r), s.disconnect(), document.removeEventListener("readystatechange", c), e();
19
- }, a = () => i(async () => {
20
- if (oe && (await oe().catch(() => {}), g())) return t();
21
- n(/* @__PURE__ */ Error("The FKN WebExtension is not installed, enabled or not exposed on this page."));
22
- }), o = () => {
23
- clearTimeout(r), r = setTimeout(() => g() ? i(t) : a(), ce);
24
- }, s = new MutationObserver(() => {
25
- g() && i(t);
26
- }), c = () => {
27
- document.readyState === "complete" && !g() && o();
28
- };
29
- if (r = setTimeout(a, e), s.observe(document.documentElement, {
30
- attributes: !0,
31
- attributeFilter: ["data-fkn-extension"]
32
- }), document.addEventListener("readystatechange", c), document.readyState === "complete") return o();
33
- g() && i(t);
34
- }), le, v = new Proxy({}, { get: (e, t) => async (...e) => {
35
- await _(), le ??= ee({}, {
36
- transport: window,
37
- revivableModules: i
38
- });
39
- let n = (await le)[t];
40
- return n(...e);
41
- } }), ue = {
42
- scope: "network.fetch",
43
- category: "network",
44
- severity: 0,
45
- title: "Fetch data from other sites",
46
- description: "Lets the app download public data from other websites directly, past the usual cross-origin limits."
47
- }, de = {
48
- scope: "network.fetchCredentialed",
49
- category: "network",
50
- severity: 3,
51
- unsafe: !0,
52
- title: "Fetch from other sites, signed in as you",
53
- description: "Lets the app fetch other sites using your logged-in session cookies, so it can read data only you should see."
54
- }, fe = {
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
- }, pe = (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
- }, me = (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:") : pe(n);
75
- }, he = ["fkn.app", "fkn.dev"], ge = (e) => {
76
- let t;
77
- try {
78
- t = new URL(e);
79
- } catch {
80
- return !1;
81
- }
82
- if (t.protocol === "chrome-extension:" || t.protocol === "moz-extension:") return !0;
83
- let n = t.hostname;
84
- return he.some((e) => n === e || n.endsWith(`.${e}`));
85
- }, _e = (e) => {
86
- if (ge(e)) throw Error("fetch: refusing to target the extension's own pages or FKN platform domains");
87
- }, ve = ["origin", "referer"], ye = (e) => {
88
- if (!e?.headers) return;
89
- let t = new Headers(e.headers), n = ve.map((e) => {
90
- let n = t.get(e);
91
- return n === null ? void 0 : [e, n];
92
- }).filter((e) => e !== void 0);
93
- return n.length ? n : void 0;
94
- }, be = async (e, t) => {
95
- let n = new Request(e, t);
96
- _e(n.url);
97
- let r = n.body ? await n.arrayBuffer() : null;
98
- return v.proxyFetch({
99
- url: n.url,
100
- method: n.method,
101
- headers: [...n.headers],
102
- body: r,
103
- credentials: t?.credentials === "include" ? "include" : "omit",
104
- redirect: n.redirect,
105
- unsafeHeaders: ye(t),
106
- reason: t?.reason,
107
- signal: t?.signal ?? void 0
108
- });
109
- }, xe = {
110
- scope: "network.readCookie",
111
- category: "network",
112
- severity: 3,
113
- unsafe: !0,
114
- title: "Read a site’s cookie",
115
- description: "Lets the app read a named cookie from another site, which can include the login token only that site should see."
116
- }, Se = { get: (e) => v.getCookie(e) }, Ce = {
117
- scope: "network.modifyRequestHeaders",
118
- category: "network",
119
- severity: 2,
120
- unsafe: !0,
121
- title: "Rewrite request headers to other sites",
122
- description: "Lets the app set or remove headers (like Origin and Referer) on this page’s own requests to the listed sites."
123
- }, we = (e) => v.setRequestHeaderRule(e), Te = (e) => v.removeRequestHeaderRule({ ruleId: e });
124
- (() => {
125
- let e = {}, t = [...c.selectorModules, ...r.selectorModules];
126
- for (let n of t) n.render && !(n.type in e) && (e[n.type] = n.render);
127
- return e;
128
- })();
129
- //#endregion
130
- //#region node_modules/@mfkn/web-extension/lib/lib/frame.js
131
- var Ee = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", De = (e) => {
132
- if (!e || e === "about:blank") return !1;
133
- let t;
134
- try {
135
- t = new URL(e, location.href);
136
- } catch {
137
- return !1;
138
- }
139
- if (t.protocol === "chrome-extension:" || t.protocol === "moz-extension:") return !0;
140
- if (t.protocol === "about:") return !1;
141
- let n = t.hostname;
142
- return n === "fkn.app" || n.endsWith(".fkn.app");
143
- }, y = (e) => {
144
- if (De(e)) throw Error("attachFrame: refusing to target the extension's own pages or fkn.app");
145
- }, Oe = {
146
- scope: "embed.iframe",
147
- category: "embed",
148
- severity: 0,
149
- title: "Load another website inside this app",
150
- description: "Lets the app embed external pages directly inside its own view."
151
- }, ke = {
152
- scope: "embed.open",
153
- category: "embed",
154
- severity: 0,
155
- title: "Open a website inside this app",
156
- description: "Lets the app navigate to another site without leaving its window."
157
- }, Ae = {
158
- scope: "embed.evaluate",
159
- category: "embed",
160
- severity: 0,
161
- title: "Run app code inside an embedded frame",
162
- description: "Lets the app execute its own code inside a page it embedded, to read back a computed result."
163
- }, je = async ({ iframe: e, domains: t = [], syncCookies: n = !0, lockdown: r = !1 }) => {
164
- let i = crypto.randomUUID();
165
- if (y(e.src), await _(), !e.isConnected) throw Error("attachFrame: the iframe must be connected to the document before attaching");
166
- e.dispatchEvent(new CustomEvent(Ee, { detail: i }));
167
- let { executeLocator: a, ensureLocatorPermission: o, goto: c, evaluate: l } = await v.attachFrame({
168
- marker: i,
169
- domains: t,
170
- syncCookies: n,
171
- lockdown: r
172
- }), u = s(a, o), ee = (e, t = {}) => (y(e), c({
173
- url: e,
174
- ...t
175
- })), te = ((e, t) => l(e, t)), d = () => e.src;
176
- return {
177
- ...u,
178
- goto: ee,
179
- evaluate: te,
180
- url: d
181
- };
182
- }, Me = { request: (e) => v.requestPermissions(e.map((e) => ({
183
- key: e.key,
184
- scope: e.scope ?? "",
185
- reason: e.reason
186
- }))) }, Ne = 32, Pe = typeof CSS < "u" && CSS.supports("clip-path", "path('M0 0H1V1H0Z')"), Fe = (e) => {
187
- let t = e.style;
188
- 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");
189
- }, Ie = ({ x: e, y: t, width: n, height: r }) => `M${e} ${t}h${n}v${r}h${-n}Z`, Le = (e, { modal: t, rects: n }) => {
190
- if (!Pe) {
191
- let r = t || n.length > 0;
192
- e.style.setProperty("pointer-events", r ? "auto" : "none", "important"), e.style.setProperty("visibility", r ? "visible" : "hidden", "important");
193
- return;
194
- }
195
- let r = t ? "none" : n.length === 0 ? "inset(100%)" : `path('${n.map(Ie).join("")}')`, i = r === "none" || CSS.supports("clip-path", r) ? r : "inset(100%)";
196
- e.style.setProperty("clip-path", i, "important");
197
- }, Re = (e) => {
198
- if (typeof e != "object" || !e) return null;
199
- let { x: t, y: n, width: r, height: i } = e;
200
- if (![
201
- t,
202
- n,
203
- r,
204
- i
205
- ].every((e) => typeof e == "number" && Number.isFinite(e))) return null;
206
- 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));
207
- return {
208
- x: s,
209
- y: c,
210
- width: l - s,
211
- height: u - c
212
- };
213
- }, ze = (e) => {
214
- if (typeof e != "object" || !e) return null;
215
- let t = e, n = (Array.isArray(t.rects) ? t.rects.slice(0, Ne) : []).map(Re).filter((e) => e !== null && e.width > 0 && e.height > 0);
216
- return {
217
- modal: t.modal === !0,
218
- rects: n
219
- };
220
- }, b = null, Be = () => b !== null, Ve = (e) => {
221
- Fe(e), Le(e, {
222
- modal: !1,
223
- rects: []
224
- }), b = e;
225
- }, He = (e) => {
226
- if (!b) return;
227
- let t = ze(e);
228
- t && Le(b, t);
229
- }, Ue = "https://fkn.app", x = typeof globalThis < "u" && globalThis.document ? globalThis.document : void 0, We = x?.querySelector(`iframe[src="${Ue}/api"]`) ?? null, S = x?.createElement("iframe") ?? null;
230
- !We && S && x && (S.src = `${Ue}/api`, x.body.appendChild(S));
231
- var C = We ?? S, Ge = C?.contentWindow ?? null;
232
- C && x && Ve(C);
233
- var Ke = (() => {
234
- if (typeof window < "u") return Ge ? {
235
- receive: window,
236
- emit: Ge
237
- } : void 0;
238
- if (typeof self < "u") return {
239
- receive: self,
240
- emit: self
241
- };
242
- })(), qe = Ke !== void 0, w = Ke ? ee({}, {
243
- key: "fkn-api",
244
- transport: Ke
245
- }) : new Promise(() => {});
246
- w.then((e) => {
247
- Be() && e.overlay.setHost(He);
248
- }, () => {});
249
- //#endregion
250
- //#region src/lib/fkn-target.ts
251
- var Je = ["fkn.app", "fkn.dev"], Ye = (e) => {
252
- let t = typeof e == "string" ? e : e instanceof URL ? e.href : e.url, n;
253
- try {
254
- n = new URL(t);
255
- } catch {
256
- return;
257
- }
258
- let r = n.hostname;
259
- if (Je.some((e) => r === e || r.endsWith(`.${e}`))) throw Error(`fetch refuses FKN platform domains (${r})`);
260
- }, Xe = (e, t) => (Ye(e), w.then((n) => n.cloud.fetch(e, t))), Ze = async () => {
261
- let e = await w.then((e) => e.cloud.quota());
262
- return {
263
- premium: e.premium,
264
- overQuota: e.overQuota,
265
- throttled: e.overQuota && !e.premium,
266
- usedBytes: e.usedBytes,
267
- limitBytes: e.limitBytes,
268
- remainingBytes: e.remaining,
269
- bytesPerSecond: e.bytesPerSecond,
270
- bitsPerSecond: e.bytesPerSecond * 8
271
- };
272
- }, Qe = /* @__PURE__ */ n({ lookup: () => $e }), $e = (e, t) => w.then((n) => n.cloud.dns.lookup(e, t)), et = /* @__PURE__ */ n({
273
- available: () => tt,
274
- list: () => nt,
275
- quota: () => rt,
276
- readFile: () => T,
277
- remove: () => at,
278
- writeFile: () => it
279
- }), tt = () => w.then((e) => e.cloud.fs.available()).catch(() => !1), nt = () => w.then((e) => e.cloud.fs.list()), rt = () => w.then((e) => e.cloud.fs.quota()), T = async (e) => await (await w).cloud.fs.readFile(e), it = (e, t, n) => w.then((r) => r.cloud.fs.writeFile(e, t, n?.contentType ?? null)).then(() => void 0), at = (e) => w.then((t) => t.cloud.fs.remove(e)).then(() => void 0), ot = new TextEncoder();
280
- new TextDecoder();
281
- var st = (e) => f.isValid(e), ct = (e) => p.isValid(e), lt = (e) => st(e) ? 4 : ct(e) ? 6 : 0, ut = (...e) => {
282
- if (typeof e[0] == "string") throw Error("FKN WebVPN does not support IPC connections");
283
- let t = typeof e.at(-1) == "function" ? e.at(-1) : void 0;
284
- return e[0] && typeof e[0] == "object" ? {
285
- ...e[0],
286
- callback: t
287
- } : {
288
- port: e[0] ?? 0,
289
- host: typeof e[1] == "string" ? e[1] : void 0,
290
- callback: t
291
- };
292
- }, dt = (...e) => {
293
- 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;
294
- return typeof e[0] == "object" ? {
295
- ...e[0],
296
- address: e[0].address ?? r,
297
- port: e[0].port ?? n,
298
- callback: t
299
- } : {
300
- address: r,
301
- port: n,
302
- callback: t
303
- };
304
- }, ft = (...e) => {
305
- let t = typeof e.at(-1) == "function" ? e.at(-1) : void 0, n = e[0];
306
- if (typeof e[2] == "number") return {
307
- message: n,
308
- offset: e[1],
309
- length: e[2],
310
- port: typeof e[3] == "number" ? e[3] : 0,
311
- address: typeof e[4] == "string" ? e[4] : void 0,
312
- callback: t
313
- };
314
- {
315
- let r = typeof e[1] == "number" ? e[1] : 0, i = typeof e[2] == "string" ? e[2] : void 0;
316
- return {
317
- message: n,
318
- offset: 0,
319
- length: n.length,
320
- port: r,
321
- address: i,
322
- callback: t
323
- };
324
- }
325
- };
326
- new TextEncoder(), new TextDecoder();
327
- //#endregion
328
- //#region src/lib/webvpn/net.ts
329
- var pt = /* @__PURE__ */ n({
330
- Server: () => D,
331
- Socket: () => E,
332
- _default: () => _t,
333
- connect: () => mt,
334
- createConnection: () => ht,
335
- createServer: () => gt,
336
- default: () => _t,
337
- isIP: () => lt,
338
- isIPv4: () => st,
339
- isIPv6: () => ct
340
- }), E = class extends d.Duplex {
341
- _localAddress;
342
- _remoteAddress;
343
- _webVPNTcpSocketPromise;
344
- constructor(e) {
345
- if (e?.fd !== void 0) throw Error("FKN WebVPN does not support file descriptors");
346
- super(e), e?.connection && this.__webvpn_tcp_socket_init__(e.connection);
347
- }
348
- __webvpn_tcp_socket_init__(e) {
349
- if (this._webVPNTcpSocketPromise = e.then((e) => {
350
- let t = e.dataReadableStream.getReader(), n = e.dataWritableStream.getWriter();
351
- return this._localAddress = {
352
- address: e.localAddress,
353
- family: e.localFamily,
354
- port: e.localPort
355
- }, this._remoteAddress = {
356
- address: e.remoteAddress,
357
- family: e.remoteFamily,
358
- port: e.remotePort
359
- }, {
360
- ...e,
361
- reader: t,
362
- writer: n
363
- };
364
- }).catch((e) => {
365
- this.emit("error", e);
366
- }), !this._webVPNTcpSocketPromise) throw Error("Socket not connected");
367
- return this._webVPNTcpSocketPromise.then((e) => {
368
- e && this.emit("connect");
369
- }), this._webVPNTcpSocketPromise;
370
- }
371
- _read(e) {
372
- if (!this._webVPNTcpSocketPromise) throw Error("Socket not connected");
373
- this._webVPNTcpSocketPromise.then((e) => {
374
- if (!e) {
375
- this.push(null);
376
- return;
377
- }
378
- e.reader.read().then(({ value: e, done: t }) => {
379
- if (t) {
380
- this.push(null);
381
- return;
382
- }
383
- this._restartTimeoutTimer(), this.push(e);
384
- }).catch((e) => {
385
- this.destroy(e);
386
- });
387
- });
388
- }
389
- _write(e, t, n) {
390
- if (!this._webVPNTcpSocketPromise) {
391
- n(/* @__PURE__ */ Error("Socket not connected"));
392
- return;
393
- }
394
- this._webVPNTcpSocketPromise.then(async (t) => {
395
- if (!t) throw Error("Socket not connected");
396
- await t.writer.ready, await t.writer.write(e), this._restartTimeoutTimer(), n();
397
- }).catch(n);
398
- }
399
- connect(...e) {
400
- let t = ut(...e), n = this.__webvpn_tcp_socket_init__(w.then((e) => e.cloud.webvpn.tcpSocket({
401
- remoteAddress: t.host ?? "localhost",
402
- remotePort: t.port
403
- })));
404
- return t.callback && n.then((e) => {
405
- e && t.callback.call(this);
406
- }), this;
407
- }
408
- _end(...e) {
409
- return this._webVPNTcpSocketPromise ? (e.length !== 0 && this.write(e[0], e[1], e[2]), this._webVPNTcpSocketPromise.then(async (e) => {
410
- e && await e.end();
411
- }), this) : this;
412
- }
413
- _destroy(e) {
414
- return this._timeoutTimer && clearTimeout(this._timeoutTimer), this._webVPNTcpSocketPromise && this._webVPNTcpSocketPromise.then(async (e) => {
415
- e && await e.destroy();
416
- }), this;
417
- }
418
- destroySoon() {
419
- this._webVPNTcpSocketPromise && this._webVPNTcpSocketPromise.then(async (e) => {
420
- e && await e.destroySoon();
421
- });
422
- }
423
- resetAndDestroy() {
424
- return this._webVPNTcpSocketPromise && this._webVPNTcpSocketPromise.then(async (e) => {
425
- e && await e.resetAndDestroy();
426
- }), this;
427
- }
428
- _timeoutMs;
429
- _timeoutTimer;
430
- _restartTimeoutTimer() {
431
- this._timeoutTimer && clearTimeout(this._timeoutTimer), this._timeoutMs && (this._timeoutTimer = setTimeout(() => this.emit("timeout"), this._timeoutMs));
432
- }
433
- setTimeout(e, t) {
434
- return t && this.on("timeout", t), this._timeoutMs = e, this._restartTimeoutTimer(), this;
435
- }
436
- setNoDelay(e) {
437
- let t = e ?? !0;
438
- return this._setTcpOption({
439
- type: 0,
440
- value: t
441
- }), this;
442
- }
443
- setKeepAlive(e, t) {
444
- let n = e ?? !1, r = t !== void 0 && t > 0 ? Math.max(1, Math.round(t / 1e3)) : 0;
445
- return this._setTcpOption({
446
- type: 2,
447
- enabled: n,
448
- initialDelaySeconds: r
449
- }), this;
450
- }
451
- setSendBufferSize(e) {
452
- return this._setTcpOption({
453
- type: 3,
454
- value: e
455
- }), this;
456
- }
457
- setRecvBufferSize(e) {
458
- return this._setTcpOption({
459
- type: 4,
460
- value: e
461
- }), this;
462
- }
463
- _typeOfService;
464
- getTypeOfService() {
465
- return this._typeOfService ?? 0;
466
- }
467
- setTypeOfService(e) {
468
- return this._typeOfService = e, this;
469
- }
470
- _setTcpOption(e) {
471
- if (!this._webVPNTcpSocketPromise) {
472
- this.emit("error", /* @__PURE__ */ Error("Cannot set socket option before connect"));
473
- return;
474
- }
475
- this._webVPNTcpSocketPromise.then(async (t) => {
476
- if (t) try {
477
- await t.setOption(e);
478
- } catch (e) {
479
- this.emit("error", e);
480
- }
481
- });
482
- }
483
- write(e, t, ...n) {
484
- return super.write(e, t, ...n);
485
- }
486
- address() {
487
- return this._localAddress ?? {};
488
- }
489
- unref() {
490
- return this;
491
- }
492
- ref() {
493
- return this;
494
- }
495
- autoSelectFamilyAttemptedAddresses;
496
- bufferSize;
497
- bytesRead;
498
- bytesWritten;
499
- connecting;
500
- pending;
501
- get localAddress() {
502
- if (!this._localAddress) throw Error("Socket is not connected");
503
- return this._localAddress.address;
504
- }
505
- get localPort() {
506
- if (!this._localAddress) throw Error("Socket is not connected");
507
- return this._localAddress.port;
508
- }
509
- get localFamily() {
510
- if (!this._localAddress) throw Error("Socket is not connected");
511
- return this._localAddress.family;
512
- }
513
- readyState;
514
- get remoteAddress() {
515
- if (!this._remoteAddress) throw Error("Socket is not connected");
516
- return this._remoteAddress.address;
517
- }
518
- get remotePort() {
519
- if (!this._remoteAddress) throw Error("Socket is not connected");
520
- return this._remoteAddress.port;
521
- }
522
- get remoteFamily() {
523
- if (!this._remoteAddress) throw Error("Socket is not connected");
524
- return this._remoteAddress.family;
525
- }
526
- timeout;
527
- }, D = class extends ne {
528
- _localAddress;
529
- _webVPNTcpSocketListenerPromise;
530
- constructor(e, t) {
531
- super(e), t && this.on("connection", t), e?.connection && this.__webvpn_tcp_socket_listener_init__(e.connection);
532
- }
533
- __webvpn_tcp_socket_listener_init__(e) {
534
- return this._webVPNTcpSocketListenerPromise = e.then((e) => (this._localAddress = {
535
- address: e.localAddress,
536
- family: e.localFamily,
537
- port: e.localPort
538
- }, e)).catch((e) => {
539
- this.emit("error", e);
540
- }), this._webVPNTcpSocketListenerPromise.then((e) => {
541
- e && this.emit("listening");
542
- }), this._webVPNTcpSocketListenerPromise;
543
- }
544
- listen(...e) {
545
- let t = ut(...e), n = (e) => {
546
- let t = new E({ connection: Promise.resolve(e) });
547
- this.emit("connection", t);
548
- }, r = (e) => w.then((r) => r.cloud.webvpn.tcpSocketListener({
549
- localAddress: e,
550
- localPort: t.port,
551
- onConnection: n
552
- })), i = t.host ? r(t.host) : r("::").catch(() => r("0.0.0.0")), a = this.__webvpn_tcp_socket_listener_init__(i);
553
- return t.callback && a.then((e) => {
554
- e && t.callback.call(this);
555
- }), this;
556
- }
557
- close(e) {
558
- return this._webVPNTcpSocketListenerPromise && this._webVPNTcpSocketListenerPromise.then(async (t) => {
559
- if (t) try {
560
- await t.close(), this._localAddress = void 0, this.emit("close"), e && e();
561
- } catch (t) {
562
- this._localAddress = void 0, this.emit("close"), e && e(t);
563
- }
564
- }), this;
565
- }
566
- address() {
567
- return this._localAddress ?? null;
568
- }
569
- getConnections(e) {
570
- throw Error("Method not implemented.");
571
- }
572
- ref() {
573
- return this;
574
- }
575
- unref() {
576
- return this;
577
- }
578
- maxConnections;
579
- connections;
580
- listening;
581
- async [Symbol.asyncDispose]() {}
582
- }, mt = (e, t) => new E().connect(e, t), ht = (e, t) => new E().connect(e, t), gt = (e, t) => {
583
- typeof e == "function" && (t = e, e = void 0);
584
- let n = new D(e);
585
- return t && n.on("connection", t), n;
586
- }, _t = {
587
- Socket: E,
588
- Server: D,
589
- connect: mt,
590
- createConnection: ht,
591
- createServer: gt,
592
- isIP: lt,
593
- isIPv4: st,
594
- isIPv6: ct
595
- }, vt = /* @__PURE__ */ n({
596
- Socket: () => yt,
597
- createSocket: () => Ct
598
- }), yt = class extends ne {
599
- _type;
600
- _localAddress;
601
- _remoteAddress;
602
- _webVPNUdpSocketPromise;
603
- _dataPort;
604
- _socketId;
605
- _sendQueue = [];
606
- _sendQueueBytes = 0;
607
- _sendFlushScheduled = !1;
608
- _peerTailCache = /* @__PURE__ */ new Map();
609
- constructor(e) {
610
- if (super(e), !e) throw Error("Missing options");
611
- this._type = e.type;
612
- }
613
- _lastRecvBufferSize = 0;
614
- _lastSendBufferSize = 0;
615
- _lastTtl = 64;
616
- _lastMulticastTtl = 1;
617
- _lastMulticastLoopback = !0;
618
- _setUdpOption(e) {
619
- if (!this._webVPNUdpSocketPromise) {
620
- this.emit("error", /* @__PURE__ */ Error("Cannot set socket option before bind"));
621
- return;
622
- }
623
- this._webVPNUdpSocketPromise.then(async (t) => {
624
- if (t) try {
625
- await t.setOption(e);
626
- } catch (e) {
627
- this.emit("error", e);
628
- }
629
- });
630
- }
631
- _onDataPortBatch(e) {
632
- let t = new DataView(e), n = 0;
633
- for (; n + 4 <= e.byteLength;) {
634
- let r = t.getUint32(n);
635
- n += 4;
636
- let i = n + r;
637
- if (i > e.byteLength) break;
638
- let a = n + 4, o = t.getUint8(a);
639
- a += 1;
640
- let s, c, l;
641
- if (o === 2) {
642
- if (!this._remoteAddress) {
643
- n = i;
644
- continue;
645
- }
646
- s = this._remoteAddress.address, c = this._remoteAddress.family, l = this._remoteAddress.port;
647
- } else {
648
- let n = new Uint8Array(e, a, o === 0 ? 4 : 16);
649
- if (o === 0) c = "IPv4", s = `${n[0]}.${n[1]}.${n[2]}.${n[3]}`;
650
- else {
651
- c = "IPv6";
652
- let e = [];
653
- for (let t = 0; t < 16; t += 2) e.push(((n[t] << 8 | n[t + 1]) >>> 0).toString(16));
654
- s = e.join(":");
655
- }
656
- a += n.byteLength, l = t.getUint16(a), a += 2;
657
- }
658
- let u = t.getUint32(a);
659
- a += 4, this.emit("message", m.from(e.slice(a, a + u)), {
660
- address: s,
661
- family: c,
662
- port: l,
663
- size: u
664
- }), n = i;
665
- }
666
- }
667
- _peerTail(e, t) {
668
- if (e === void 0 || t === void 0) return bt;
669
- let n = `${e}|${t}`, r = this._peerTailCache.get(n);
670
- if (r) return r;
671
- let i = f.isValid(e) ? O(e) : St(e), a = new Uint8Array(1 + i.byteLength + 2);
672
- 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;
673
- }
674
- _portSend(e, t, n) {
675
- let r = this._peerTail(t, n), i = new Uint8Array(8 + r.byteLength + 4 + e.byteLength), a = new DataView(i.buffer);
676
- 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(() => {
677
- this._sendFlushScheduled = !1;
678
- let e = this._sendQueue, t = this._sendQueueBytes;
679
- if (this._sendQueue = [], this._sendQueueBytes = 0, !e.length || !this._dataPort) return;
680
- let n = new Uint8Array(t), r = 0;
681
- for (let t of e) n.set(t, r), r += t.byteLength;
682
- this._dataPort.postMessage(n.buffer, [n.buffer]);
683
- }));
684
- }
685
- addMembership(e, t) {
686
- if (f.isValid(e)) {
687
- let n = O(e), r = t && f.isValid(t) ? O(t) : new Uint8Array([
688
- 0,
689
- 0,
690
- 0,
691
- 0
692
- ]);
693
- this._setUdpOption({
694
- type: 5,
695
- group: n,
696
- interface: r
697
- });
698
- } else if (p.isValid(e)) {
699
- let t = St(e);
700
- this._setUdpOption({
701
- type: 7,
702
- group: t,
703
- ifIndex: 0
704
- });
705
- } else this.emit("error", /* @__PURE__ */ Error(`Invalid multicast address: ${e}`));
706
- }
707
- address() {
708
- if (!this._localAddress) throw Error("EBADF");
709
- return this._localAddress;
710
- }
711
- bind(...e) {
712
- let t = dt(...e), n = this._type === "udp6" ? "::" : "0.0.0.0";
713
- return this._webVPNUdpSocketPromise = w.then((e) => e.cloud.webvpn.udpSocket({
714
- type: this._type,
715
- address: t.address ?? n,
716
- port: t.port,
717
- dataPort: !0
718
- })).then((e) => {
719
- if (e.dataPort) this._socketId = e.socketId, this._dataPort = e.dataPort, this._dataPort.onmessage = (e) => this._onDataPortBatch(e.data);
720
- else {
721
- let t = e.dataReadableStream.getReader(), n = async () => {
722
- let { value: e, done: r } = await t.read();
723
- r || (this.emit("message", m.from(e.data), {
724
- address: e.address,
725
- family: e.family,
726
- port: e.port,
727
- size: e.size
728
- }), n());
729
- };
730
- n();
731
- }
732
- return this._localAddress = {
733
- address: e.localAddress,
734
- family: e.localFamily,
735
- port: e.localPort
736
- }, e;
737
- }).catch((e) => {
738
- this.emit("error", e);
739
- }), this._webVPNUdpSocketPromise.then((e) => {
740
- e && this.emit("listening");
741
- }), t.callback && this._webVPNUdpSocketPromise.then((e) => {
742
- e && t.callback.call(this);
743
- }), this;
744
- }
745
- close(e) {
746
- if (!this._webVPNUdpSocketPromise) throw Error("Socket not bound");
747
- return this._webVPNUdpSocketPromise.then(async (t) => {
748
- if (!t) throw Error("Socket not bound");
749
- this._dataPort?.close(), this._dataPort = void 0, await t.close(), e && e(), this.emit("close");
750
- }), this;
751
- }
752
- connect(...e) {
753
- if (!this._webVPNUdpSocketPromise) throw Error("Socket not bound");
754
- this._webVPNUdpSocketPromise.then(async (t) => {
755
- if (!t) throw Error("Socket not bound");
756
- let n = e[0], r = this._type === "udp6" ? "::1" : "127.0.0.1", i = typeof e[1] == "string" ? e[1] : r, a = typeof e.at(-1) == "function" ? e.at(-1) : void 0;
757
- await t.connect({
758
- remotePort: n,
759
- remoteAddress: i
760
- }), this._remoteAddress = {
761
- address: i,
762
- family: this._type === "udp6" ? "IPv6" : "IPv4",
763
- port: n
764
- }, a && a();
765
- });
766
- }
767
- disconnect() {
768
- if (!this._webVPNUdpSocketPromise) throw Error("Socket not bound");
769
- this._webVPNUdpSocketPromise.then(async (e) => {
770
- if (!e) throw Error("Socket not bound");
771
- await e.connect({
772
- remotePort: 0,
773
- remoteAddress: this._type === "udp4" ? "0.0.0.0" : "::"
774
- });
775
- });
776
- }
777
- dropMembership(e, t) {
778
- if (f.isValid(e)) {
779
- let n = O(e), r = t && f.isValid(t) ? O(t) : new Uint8Array([
780
- 0,
781
- 0,
782
- 0,
783
- 0
784
- ]);
785
- this._setUdpOption({
786
- type: 6,
787
- group: n,
788
- interface: r
789
- });
790
- } else if (p.isValid(e)) {
791
- let t = St(e);
792
- this._setUdpOption({
793
- type: 8,
794
- group: t,
795
- ifIndex: 0
796
- });
797
- } else this.emit("error", /* @__PURE__ */ Error(`Invalid multicast address: ${e}`));
798
- }
799
- getRecvBufferSize() {
800
- return this._lastRecvBufferSize;
801
- }
802
- getSendBufferSize() {
803
- return this._lastSendBufferSize;
804
- }
805
- getSendQueueSize() {
806
- return 0;
807
- }
808
- getSendQueueCount() {
809
- return 0;
810
- }
811
- ref() {
812
- return this;
813
- }
814
- remoteAddress() {
815
- if (!this._remoteAddress) throw Error("ERR_SOCKET_DGRAM_NOT_CONNECTED");
816
- return {
817
- address: this._remoteAddress.address,
818
- family: this._remoteAddress.family,
819
- port: this._remoteAddress.port
820
- };
821
- }
822
- send(...e) {
823
- this._webVPNUdpSocketPromise || this.bind();
824
- let t = ft(...e), n = this._type === "udp6" ? "::1" : "127.0.0.1";
825
- if (!this._webVPNUdpSocketPromise) throw Error("Socket not bound");
826
- this._webVPNUdpSocketPromise.then((e) => {
827
- if (!e) throw Error("Socket not bound");
828
- let r = xt(t.message), i = t.callback, a = t.address ?? n, o = this._remoteAddress !== void 0 && t.address === void 0;
829
- if (this._dataPort && (o || f.isValid(a) || p.isValid(a))) {
830
- this._portSend(r, o ? void 0 : a, o ? void 0 : t.port), i?.call(this, null, r.byteLength);
831
- return;
832
- }
833
- e.send({
834
- ...t,
835
- address: a,
836
- message: r.byteOffset === 0 && r.byteLength === r.buffer.byteLength ? r.buffer : r.buffer.slice(r.byteOffset, r.byteOffset + r.byteLength)
837
- }).then(() => i?.call(this, null, r.byteLength), (e) => i ? i.call(this, e, 0) : this.emit("error", e));
838
- });
839
- }
840
- setBroadcast(e) {
841
- this._setUdpOption({
842
- type: 0,
843
- value: e
844
- });
845
- }
846
- setMulticastInterface(e) {}
847
- setMulticastLoopback(e) {
848
- return this._setUdpOption({
849
- type: 3,
850
- value: e
851
- }), this._setUdpOption({
852
- type: 4,
853
- value: e
854
- }), this._lastMulticastLoopback = e, e;
855
- }
856
- setMulticastTTL(e) {
857
- return this._setUdpOption({
858
- type: 2,
859
- value: e
860
- }), this._lastMulticastTtl = e, e;
861
- }
862
- setRecvBufferSize(e) {
863
- this._setUdpOption({
864
- type: 10,
865
- value: e
866
- }), this._lastRecvBufferSize = e;
867
- }
868
- setSendBufferSize(e) {
869
- this._setUdpOption({
870
- type: 9,
871
- value: e
872
- }), this._lastSendBufferSize = e;
873
- }
874
- setTTL(e) {
875
- return this._setUdpOption({
876
- type: 1,
877
- value: e
878
- }), this._lastTtl = e, e;
879
- }
880
- unref() {
881
- return this;
882
- }
883
- addSourceSpecificMembership(e, t, n) {}
884
- dropSourceSpecificMembership(e, t, n) {}
885
- async [Symbol.asyncDispose]() {
886
- await new Promise((e) => {
887
- this.close(e);
888
- });
889
- }
890
- }, bt = new Uint8Array([2]), xt = (e) => {
891
- if (typeof e == "string") return ot.encode(e);
892
- if (e instanceof Uint8Array) return e;
893
- if (ArrayBuffer.isView(e)) return new Uint8Array(e.buffer, e.byteOffset, e.byteLength);
894
- if (Array.isArray(e)) {
895
- let t = e.map(xt), n = new Uint8Array(t.reduce((e, t) => e + t.byteLength, 0)), r = 0;
896
- for (let e of t) n.set(e, r), r += e.byteLength;
897
- return n;
898
- }
899
- return new Uint8Array(e);
900
- }, O = (e) => {
901
- let t = e.split(".").map((e) => parseInt(e, 10));
902
- if (t.length !== 4 || t.some((e) => Number.isNaN(e) || e < 0 || e > 255)) throw Error(`Invalid IPv4 address: ${e}`);
903
- return new Uint8Array(t);
904
- }, St = (e) => {
905
- let t = new p(e).getBitsBase16(0, 128).match(/.{2}/g);
906
- if (!t || t.length !== 16) throw Error(`Invalid IPv6 address: ${e}`);
907
- return new Uint8Array(t.map((e) => parseInt(e, 16)));
908
- }, Ct = (e, t) => {
909
- let n = new yt(typeof e == "string" ? { type: e } : e);
910
- return t && n.on("message", t), n;
911
- }, wt = /* @__PURE__ */ n({
912
- Agent: () => Vt,
913
- ClientRequest: () => zt,
914
- HTTPParser: () => A,
915
- IncomingMessage: () => j,
916
- METHODS: () => Et,
917
- STATUS_CODES: () => Dt,
918
- Server: () => Bt,
919
- ServerResponse: () => Lt,
920
- _default: () => Kt,
921
- createServer: () => Gt,
922
- default: () => Kt,
923
- get: () => Wt,
924
- globalAgent: () => Ht,
925
- request: () => Ut
926
- }), Tt = new TextDecoder("latin1"), Et = /* @__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("."), Dt = {
927
- 100: "Continue",
928
- 101: "Switching Protocols",
929
- 102: "Processing",
930
- 103: "Early Hints",
931
- 200: "OK",
932
- 201: "Created",
933
- 202: "Accepted",
934
- 203: "Non-Authoritative Information",
935
- 204: "No Content",
936
- 205: "Reset Content",
937
- 206: "Partial Content",
938
- 207: "Multi-Status",
939
- 208: "Already Reported",
940
- 226: "IM Used",
941
- 300: "Multiple Choices",
942
- 301: "Moved Permanently",
943
- 302: "Found",
944
- 303: "See Other",
945
- 304: "Not Modified",
946
- 305: "Use Proxy",
947
- 307: "Temporary Redirect",
948
- 308: "Permanent Redirect",
949
- 400: "Bad Request",
950
- 401: "Unauthorized",
951
- 402: "Payment Required",
952
- 403: "Forbidden",
953
- 404: "Not Found",
954
- 405: "Method Not Allowed",
955
- 406: "Not Acceptable",
956
- 407: "Proxy Authentication Required",
957
- 408: "Request Timeout",
958
- 409: "Conflict",
959
- 410: "Gone",
960
- 411: "Length Required",
961
- 412: "Precondition Failed",
962
- 413: "Payload Too Large",
963
- 414: "URI Too Long",
964
- 415: "Unsupported Media Type",
965
- 416: "Range Not Satisfiable",
966
- 417: "Expectation Failed",
967
- 418: "I'm a Teapot",
968
- 421: "Misdirected Request",
969
- 422: "Unprocessable Entity",
970
- 423: "Locked",
971
- 424: "Failed Dependency",
972
- 425: "Too Early",
973
- 426: "Upgrade Required",
974
- 428: "Precondition Required",
975
- 429: "Too Many Requests",
976
- 431: "Request Header Fields Too Large",
977
- 451: "Unavailable For Legal Reasons",
978
- 500: "Internal Server Error",
979
- 501: "Not Implemented",
980
- 502: "Bad Gateway",
981
- 503: "Service Unavailable",
982
- 504: "Gateway Timeout",
983
- 505: "HTTP Version Not Supported",
984
- 506: "Variant Also Negotiates",
985
- 507: "Insufficient Storage",
986
- 508: "Loop Detected",
987
- 509: "Bandwidth Limit Exceeded",
988
- 510: "Not Extended",
989
- 511: "Network Authentication Required"
990
- }, Ot = new Set([
991
- "content-type",
992
- "content-length",
993
- "user-agent",
994
- "referer",
995
- "host",
996
- "authorization",
997
- "proxy-authorization",
998
- "if-modified-since",
999
- "if-unmodified-since",
1000
- "from",
1001
- "location",
1002
- "max-forwards",
1003
- "retry-after",
1004
- "etag",
1005
- "last-modified",
1006
- "server",
1007
- "age",
1008
- "expires"
1009
- ]), kt = 13, At = 10, jt = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/, k = (e, t) => (e.code = t, e), Mt = (e, t) => {
1010
- if (e.length === 0) return t;
1011
- if (t.length === 0) return e;
1012
- let n = new Uint8Array(e.length + t.length);
1013
- return n.set(e, 0), n.set(t, e.length), n;
1014
- }, Nt = (e, t) => {
1015
- for (let n = t; n + 1 < e.length; n++) if (e[n] === kt && e[n + 1] === At) return n;
1016
- return -1;
1017
- }, Pt = (e) => {
1018
- for (let t = 0; t + 3 < e.length; t++) if (e[t] === kt && e[t + 1] === At && e[t + 2] === kt && e[t + 3] === At) return t;
1019
- return -1;
1020
- }, A = class {
1021
- buf = new Uint8Array();
1022
- state = "HEAD";
1023
- framing = "none";
1024
- bodyRemaining = 0;
1025
- chunkState = "size";
1026
- skipBody = !1;
1027
- constructor(e, t) {
1028
- this.mode = e, this.handlers = t;
1029
- }
1030
- execute(e) {
1031
- this.buf = Mt(this.buf, e);
1032
- let t = !0;
1033
- for (; t;) if (t = !1, this.state === "HEAD") {
1034
- let e = Pt(this.buf);
1035
- if (e === -1) return;
1036
- let n = this.buf.subarray(0, e);
1037
- this.buf = this.buf.subarray(e + 4);
1038
- let r = this.parseHead(n);
1039
- this.handlers.onHeaders(r), this.setupBody(r), this.framing === "none" ? (this.handlers.onComplete(), this.reset(), t = this.buf.length > 0) : (this.state = "BODY", t = !0);
1040
- } else this.consumeBody() && (this.handlers.onComplete(), this.reset(), t = this.buf.length > 0);
1041
- }
1042
- finish() {
1043
- this.state === "BODY" && this.framing === "eof" && (this.handlers.onComplete(), this.reset());
1044
- }
1045
- reset() {
1046
- this.state = "HEAD", this.framing = "none", this.bodyRemaining = 0, this.chunkState = "size", this.skipBody = !1;
1047
- }
1048
- parseHead(e) {
1049
- let t = Tt.decode(e).split("\r\n"), n = t.shift() ?? "", r = [];
1050
- for (let e of t) (e.startsWith(" ") || e.startsWith(" ")) && r.length > 0 ? r[r.length - 1] += " " + e.trim() : r.push(e);
1051
- let i = [], a = {};
1052
- for (let e of r) {
1053
- if (!e) continue;
1054
- let t = e.indexOf(":");
1055
- if (t === -1) continue;
1056
- let n = e.slice(0, t).trim(), r = e.slice(t + 1).trim();
1057
- i.push(n, r), this.addHeader(a, n, r);
1058
- }
1059
- let o = {
1060
- httpVersionMajor: 1,
1061
- httpVersionMinor: 1,
1062
- httpVersion: "1.1",
1063
- headers: a,
1064
- rawHeaders: i
1065
- };
1066
- if (this.mode === "request") {
1067
- let [e, t, r] = n.split(" ");
1068
- o.method = (e ?? "GET").toUpperCase(), o.url = t ?? "/", this.applyVersion(o, r);
1069
- } else {
1070
- let e = n.indexOf(" "), t = n.slice(0, e), r = n.slice(e + 1), i = r.indexOf(" "), a = i === -1 ? r : r.slice(0, i);
1071
- o.statusCode = parseInt(a, 10) || 0, o.statusMessage = i === -1 ? "" : r.slice(i + 1), this.applyVersion(o, t);
1072
- }
1073
- return o;
1074
- }
1075
- applyVersion(e, t) {
1076
- let n = /HTTP\/(\d)\.(\d)/i.exec(t ?? "");
1077
- n && (e.httpVersionMajor = parseInt(n[1], 10), e.httpVersionMinor = parseInt(n[2], 10), e.httpVersion = `${e.httpVersionMajor}.${e.httpVersionMinor}`);
1078
- }
1079
- addHeader(e, t, n) {
1080
- let r = t.toLowerCase();
1081
- if (r === "set-cookie") {
1082
- let t = e["set-cookie"];
1083
- Array.isArray(t) ? t.push(n) : e["set-cookie"] = [n];
1084
- return;
1085
- }
1086
- let i = e[r];
1087
- i === void 0 ? e[r] = n : Ot.has(r) || (e[r] = `${i}, ${n}`);
1088
- }
1089
- setupBody(e) {
1090
- if (this.skipBody) {
1091
- this.framing = "none";
1092
- return;
1093
- }
1094
- let t = e.headers["transfer-encoding"];
1095
- if (typeof t == "string" && t.toLowerCase().includes("chunked")) {
1096
- this.framing = "chunked", this.chunkState = "size";
1097
- return;
1098
- }
1099
- let n = e.headers["content-length"];
1100
- if (typeof n == "string" && n !== "") {
1101
- let e = parseInt(n, 10);
1102
- e > 0 ? (this.framing = "length", this.bodyRemaining = e) : this.framing = "none";
1103
- return;
1104
- }
1105
- if (this.mode === "response") {
1106
- let t = e.statusCode ?? 0;
1107
- t >= 100 && t < 200 || t === 204 || t === 304 ? this.framing = "none" : this.framing = "eof";
1108
- } else this.framing = "none";
1109
- }
1110
- consumeBody() {
1111
- if (this.framing === "length") {
1112
- if (this.buf.length === 0) return !1;
1113
- let e = Math.min(this.bodyRemaining, this.buf.length);
1114
- return this.handlers.onBody(this.buf.subarray(0, e)), this.buf = this.buf.subarray(e), this.bodyRemaining -= e, this.bodyRemaining === 0;
1115
- }
1116
- return this.framing === "eof" ? (this.buf.length > 0 && (this.handlers.onBody(this.buf), this.buf = new Uint8Array()), !1) : this.framing === "chunked" ? this.consumeChunked() : !0;
1117
- }
1118
- consumeChunked() {
1119
- for (;;) if (this.chunkState === "size") {
1120
- let e = Nt(this.buf, 0);
1121
- if (e === -1) return !1;
1122
- let t = Tt.decode(this.buf.subarray(0, e)), n = parseInt(t.split(";")[0].trim(), 16);
1123
- if (this.buf = this.buf.subarray(e + 2), Number.isNaN(n)) return !0;
1124
- n === 0 ? this.chunkState = "trailer" : (this.bodyRemaining = n, this.chunkState = "data");
1125
- } else if (this.chunkState === "data") {
1126
- if (this.buf.length === 0) return !1;
1127
- let e = Math.min(this.bodyRemaining, this.buf.length);
1128
- this.handlers.onBody(this.buf.subarray(0, e)), this.buf = this.buf.subarray(e), this.bodyRemaining -= e, this.bodyRemaining === 0 && (this.chunkState = "dataCRLF");
1129
- } else if (this.chunkState === "dataCRLF") {
1130
- if (this.buf.length < 2) return !1;
1131
- this.buf = this.buf.subarray(2), this.chunkState = "size";
1132
- } else {
1133
- let e = Nt(this.buf, 0);
1134
- if (e === -1) return !1;
1135
- let t = e === 0;
1136
- if (this.buf = this.buf.subarray(e + 2), t) return !0;
1137
- }
1138
- }
1139
- }, Ft = (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)), j = class extends d.Readable {
1140
- httpVersion = "1.1";
1141
- httpVersionMajor = 1;
1142
- httpVersionMinor = 1;
1143
- headers = {};
1144
- rawHeaders = [];
1145
- trailers = {};
1146
- rawTrailers = [];
1147
- method;
1148
- url;
1149
- statusCode;
1150
- statusMessage;
1151
- complete = !1;
1152
- socket;
1153
- constructor(e) {
1154
- super(), this.socket = e;
1155
- }
1156
- get connection() {
1157
- return this.socket;
1158
- }
1159
- _applyHead(e) {
1160
- this.httpVersion = e.httpVersion, this.httpVersionMajor = e.httpVersionMajor, this.httpVersionMinor = e.httpVersionMinor, this.headers = e.headers, this.rawHeaders = e.rawHeaders, this.method = e.method, this.url = e.url, this.statusCode = e.statusCode, this.statusMessage = e.statusMessage;
1161
- }
1162
- _read() {}
1163
- setTimeout(e, t) {
1164
- return this.socket.setTimeout(e, t), this;
1165
- }
1166
- }, It = class extends d.Writable {
1167
- _headerStore = /* @__PURE__ */ new Map();
1168
- headersSent = !1;
1169
- chunkedEncoding = !1;
1170
- finished = !1;
1171
- _bodyWritten = !1;
1172
- setHeader(e, t) {
1173
- if (this.headersSent) throw k(/* @__PURE__ */ Error("Cannot set headers after they are sent to the client"), "ERR_HTTP_HEADERS_SENT");
1174
- if (typeof e != "string" || !jt.test(e)) throw k(/* @__PURE__ */ TypeError(`Header name must be a valid HTTP token [${JSON.stringify(String(e))}]`), "ERR_INVALID_HTTP_TOKEN");
1175
- if (t === void 0) throw k(/* @__PURE__ */ TypeError(`Invalid value "undefined" for header "${e}"`), "ERR_HTTP_INVALID_HEADER_VALUE");
1176
- return this._headerStore.set(e.toLowerCase(), [e, Array.isArray(t) ? [...t] : t]), this;
1177
- }
1178
- getHeader(e) {
1179
- return this._headerStore.get(e.toLowerCase())?.[1];
1180
- }
1181
- getHeaderNames() {
1182
- return [...this._headerStore.values()].map(([e]) => e);
1183
- }
1184
- getHeaders() {
1185
- let e = {};
1186
- for (let [t, n] of this._headerStore.values()) e[t] = n;
1187
- return e;
1188
- }
1189
- hasHeader(e) {
1190
- return this._headerStore.has(e.toLowerCase());
1191
- }
1192
- removeHeader(e) {
1193
- if (this.headersSent) throw Error("Cannot remove headers after they are sent to the client");
1194
- this._headerStore.delete(e.toLowerCase());
1195
- }
1196
- _storeHeader(e) {
1197
- let t = this.hasHeader("content-length"), n = this.getHeader("transfer-encoding");
1198
- typeof n == "string" && n.toLowerCase().includes("chunked") ? this.chunkedEncoding = !0 : !t && this._shouldSendBody() && (this.chunkedEncoding = !0, this.setHeader("Transfer-Encoding", "chunked"));
1199
- let r = e + "\r\n";
1200
- for (let [e, t] of this._headerStore.values()) if (Array.isArray(t)) for (let n of t) r += `${e}: ${n}\r\n`;
1201
- else r += `${e}: ${t}\r\n`;
1202
- return r += "\r\n", r;
1203
- }
1204
- _writeToSocket(e, t) {
1205
- if (!this.socket) {
1206
- t(/* @__PURE__ */ Error("Socket is not available"));
1207
- return;
1208
- }
1209
- this.socket.write(e, t);
1210
- }
1211
- write(e, t, n) {
1212
- return this._bodyWritten = !0, super.write(e, t, n);
1213
- }
1214
- _write(e, t, n) {
1215
- let r = Ft(e), i = [];
1216
- 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) {
1217
- n();
1218
- return;
1219
- }
1220
- this._writeToSocket(m.concat(i), n);
1221
- }
1222
- _final(e) {
1223
- let t = [];
1224
- 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) {
1225
- e();
1226
- return;
1227
- }
1228
- this._writeToSocket(m.concat(t), e);
1229
- }
1230
- end(e, t, n) {
1231
- if (e != null && typeof e != "function" && !this._bodyWritten && !this.headersSent && !this.chunkedEncoding && !this.hasHeader("content-length")) {
1232
- let n = typeof t == "string" ? t : void 0;
1233
- this.setHeader("Content-Length", Ft(e, n).length);
1234
- }
1235
- return super.end(e, t, n);
1236
- }
1237
- _headBlock;
1238
- }, Lt = class extends It {
1239
- statusCode = 200;
1240
- statusMessage;
1241
- _writeHeadCalled = !1;
1242
- sendDate = !0;
1243
- req;
1244
- socket;
1245
- _keepAlive = !0;
1246
- constructor(e) {
1247
- super(), this.req = e, this.socket = e.socket;
1248
- }
1249
- _shouldSendBody() {
1250
- if (this.req.method === "HEAD") return !1;
1251
- let e = this.statusCode;
1252
- return !(e >= 100 && e < 200 || e === 204 || e === 304);
1253
- }
1254
- writeHead(e, t, n) {
1255
- if (this._writeHeadCalled || this.headersSent) throw k(/* @__PURE__ */ Error("Cannot render headers after they are sent to the client"), "ERR_HTTP_HEADERS_SENT");
1256
- this._writeHeadCalled = !0, this.statusCode = e;
1257
- let r = n;
1258
- if (typeof t == "string" ? this.statusMessage = t : t != null && (r = t), Array.isArray(r)) {
1259
- let e = Array.isArray(r[0]) ? r : Array.from({ length: Math.floor(r.length / 2) }, (e, t) => [r[t * 2], r[t * 2 + 1]]);
1260
- for (let [t, n] of e) n !== void 0 && this._appendHeader(t, n);
1261
- } else if (r) for (let [e, t] of Object.entries(r)) t !== void 0 && this.setHeader(e, t);
1262
- return this;
1263
- }
1264
- _appendHeader(e, t) {
1265
- let n = this.getHeader(e);
1266
- if (n === void 0) this.setHeader(e, t);
1267
- else {
1268
- let r = [...Array.isArray(n) ? n : [n], ...Array.isArray(t) ? t : [t]].map(String);
1269
- this.setHeader(e, r);
1270
- }
1271
- }
1272
- _implicitHeader() {
1273
- let e = this.statusMessage ?? Dt[this.statusCode] ?? "unknown";
1274
- 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}`);
1275
- }
1276
- writeContinue() {
1277
- this._writeToSocket(m.from("HTTP/1.1 100 Continue\r\n\r\n", "latin1"), () => {});
1278
- }
1279
- setTimeout(e, t) {
1280
- return this.socket?.setTimeout(e, t), this;
1281
- }
1282
- }, Rt = (...e) => {
1283
- let t = {}, n = {}, r, i = [...e], a = i.shift();
1284
- if (typeof a == "string" || a instanceof URL) {
1285
- let e = typeof a == "string" ? new URL(a) : a;
1286
- t = {
1287
- protocol: e.protocol,
1288
- hostname: e.hostname,
1289
- host: e.hostname,
1290
- port: e.port,
1291
- path: `${e.pathname}${e.search}`,
1292
- auth: e.username ? `${e.username}:${e.password}` : void 0
1293
- };
1294
- let o = i.shift();
1295
- typeof o == "function" ? r = o : o && typeof o == "object" && (n = o, r = i.shift());
1296
- } else a && typeof a == "object" && (n = a, r = i.shift());
1297
- return {
1298
- options: {
1299
- ...t,
1300
- ...n
1301
- },
1302
- callback: r
1303
- };
1304
- }, zt = class extends It {
1305
- method;
1306
- path;
1307
- host;
1308
- protocol;
1309
- socket;
1310
- get connection() {
1311
- return this.socket;
1312
- }
1313
- res = null;
1314
- aborted = !1;
1315
- _aborted = !1;
1316
- constructor(e, t) {
1317
- super(), this.method = (e.method ?? "GET").toUpperCase(), this.path = e.path ?? "/", this.protocol = e.protocol ?? "http:";
1318
- let n = e.hostname ?? e.host ?? "localhost";
1319
- this.host = n;
1320
- let r = Number(e.port ?? (this.protocol === "https:" ? 443 : 80));
1321
- if (t && this.once("response", t), e.headers) for (let [t, n] of Object.entries(e.headers)) n !== void 0 && this.setHeader(t, n);
1322
- if (!this.hasHeader("host")) {
1323
- let e = this.protocol === "https:" && r === 443 || this.protocol !== "https:" && r === 80;
1324
- this.setHeader("Host", e ? n : `${n}:${r}`);
1325
- }
1326
- e.auth && !this.hasHeader("authorization") && this.setHeader("Authorization", `Basic ${m.from(e.auth).toString("base64")}`), this.socket = new E(), this.emit("socket", this.socket), this.socket.on("error", (e) => {
1327
- this._aborted || this.emit("error", e);
1328
- }), this._attachResponseParser(), this.socket.connect({
1329
- host: n,
1330
- port: r
1331
- }, () => {
1332
- this.emit("connect");
1333
- });
1334
- }
1335
- _shouldSendBody() {
1336
- return this.method !== "GET" && this.method !== "HEAD" && this.method !== "DELETE";
1337
- }
1338
- _implicitHeader() {
1339
- this._headBlock = this._storeHeader(`${this.method} ${this.path} HTTP/1.1`);
1340
- }
1341
- _attachResponseParser() {
1342
- let e = new j(this.socket), t = new A("response", {
1343
- onHeaders: (n) => {
1344
- e._applyHead(n), this.method === "HEAD" && (t.skipBody = !0), this.res = e, this.emit("response", e);
1345
- },
1346
- onBody: (t) => {
1347
- e.push(m.from(t));
1348
- },
1349
- onComplete: () => {
1350
- e.complete = !0, e.push(null);
1351
- }
1352
- });
1353
- this.socket.on("data", (e) => {
1354
- this._aborted || t.execute(e);
1355
- }), this.socket.on("end", () => {
1356
- t.finish();
1357
- }), this.socket.on("close", () => {
1358
- this.emit("close");
1359
- });
1360
- }
1361
- abort() {
1362
- this._aborted || (this._aborted = !0, this.aborted = !0, this.emit("abort"), this.socket.destroy());
1363
- }
1364
- destroy(e) {
1365
- return this._aborted ? this : (this._aborted = !0, this.socket.destroy(e), super.destroy(e), this);
1366
- }
1367
- end(e, t, n) {
1368
- return this._aborted ? this : super.end(e, t, n);
1369
- }
1370
- _writeToSocket(e, t) {
1371
- if (this._aborted) {
1372
- t();
1373
- return;
1374
- }
1375
- super._writeToSocket(e, t);
1376
- }
1377
- setTimeout(e, t) {
1378
- return this.socket.setTimeout(e, t), this;
1379
- }
1380
- setNoDelay(e) {
1381
- this.socket.setNoDelay(e);
1382
- }
1383
- setSocketKeepAlive(e, t) {
1384
- this.socket.setKeepAlive(e, t);
1385
- }
1386
- }, Bt = new Proxy(class extends D {
1387
- constructor(e, t) {
1388
- let n = {}, r = t;
1389
- typeof e == "function" ? r = e : e && (n = e), super(n), r && this.on("request", r), this.on("connection", (e) => this._handleConnection(e));
1390
- }
1391
- _handleConnection(e) {
1392
- let t = null, n = new A("request", {
1393
- onHeaders: (r) => {
1394
- t = new j(e), t._applyHead(r), r.method === "HEAD" && (n.skipBody = !0);
1395
- let i = new Lt(t), a = String(r.headers.connection ?? "").toLowerCase();
1396
- i._keepAlive = r.httpVersionMinor >= 1 ? a !== "close" : a === "keep-alive", i.on("finish", () => {
1397
- i._keepAlive || e.end();
1398
- }), this.emit("request", t, i);
1399
- },
1400
- onBody: (e) => {
1401
- t?.push(m.from(e));
1402
- },
1403
- onComplete: () => {
1404
- t && (t.complete = !0, t.push(null)), t = null;
1405
- }
1406
- });
1407
- e.on("data", (e) => n.execute(e)), e.on("end", () => {
1408
- n.finish(), t && t.push(null);
1409
- }), e.on("error", (t) => this.emit("clientError", t, e));
1410
- }
1411
- }, { apply: (e, t, n) => new e(...n) }), Vt = class {
1412
- maxSockets;
1413
- maxFreeSockets;
1414
- keepAlive;
1415
- options;
1416
- constructor(e = {}) {
1417
- this.options = e, this.keepAlive = !!e.keepAlive, this.maxSockets = e.maxSockets ?? Infinity, this.maxFreeSockets = e.maxFreeSockets ?? 256;
1418
- }
1419
- getName(e = {}) {
1420
- return `${e.host ?? "localhost"}:${e.port ?? ""}:${e.localAddress ?? ""}`;
1421
- }
1422
- destroy() {}
1423
- }, Ht = new Vt(), Ut = (...e) => {
1424
- let { options: t, callback: n } = Rt(...e);
1425
- return new zt(t, n);
1426
- }, Wt = (...e) => {
1427
- let t = Ut(...e);
1428
- return t.end(), t;
1429
- }, Gt = (e, t) => new Bt(e, t), Kt = {
1430
- METHODS: Et,
1431
- STATUS_CODES: Dt,
1432
- Agent: Vt,
1433
- globalAgent: Ht,
1434
- Server: Bt,
1435
- ServerResponse: Lt,
1436
- IncomingMessage: j,
1437
- ClientRequest: zt,
1438
- OutgoingMessage: It,
1439
- createServer: Gt,
1440
- request: Ut,
1441
- get: Wt
1442
- }, qt = /* @__PURE__ */ n({
1443
- available: () => Jt,
1444
- dgram: () => vt,
1445
- dns: () => Qe,
1446
- fetch: () => Xe,
1447
- fs: () => et,
1448
- http: () => wt,
1449
- net: () => pt,
1450
- quota: () => Ze
1451
- }), Jt = () => qe, Yt = async (e) => {
1452
- if (typeof window > "u") return !1;
1453
- if (g()) return !0;
1454
- let t = await w, n = null, r = new Promise((e) => {
1455
- n = () => {
1456
- g() && e(!0);
1457
- }, h.addEventListener("statuschange", n);
1458
- }), i = t.installPrompt.show(e).then(() => !1), a = await Promise.race([r, i]);
1459
- return n && h.removeEventListener("statuschange", n), await t.installPrompt.hide().catch(() => {}), a;
1460
- }, Xt = null;
1461
- se(() => (Xt ||= Yt().then(() => void 0).finally(() => {
1462
- Xt = null;
1463
- }), Xt));
1464
- //#endregion
1465
- //#region src/lib/desktop.ts
1466
- var Zt = /* @__PURE__ */ n({
1467
- available: () => Qt,
1468
- dgram: () => nn,
1469
- dns: () => en,
1470
- fetch: () => $t,
1471
- fs: () => rn,
1472
- net: () => tn
1473
- }), Qt = () => !1, M = (e) => (...t) => {
1474
- throw Error(`The FKN desktop app is not connected, desktop.${e} is unavailable`);
1475
- }, $t = M("fetch"), en = { lookup: M("dns.lookup") }, tn = {
1476
- connect: M("net.connect"),
1477
- createConnection: M("net.createConnection"),
1478
- createServer: M("net.createServer")
1479
- }, nn = { createSocket: M("dgram.createSocket") }, rn = {
1480
- available: async () => !1,
1481
- list: M("fs.list"),
1482
- readFile: M("fs.readFile"),
1483
- writeFile: M("fs.writeFile"),
1484
- remove: M("fs.remove")
1485
- }, an = () => typeof document < "u" && g(), on = async (e, t) => {
1486
- if (Ye(e), t?.credentials === "include") {
1487
- if (typeof document > "u") throw Error("fetch with credentials needs the FKN extension, which only exists in window realms");
1488
- return be(e, t);
1489
- }
1490
- return an() ? be(e, {
1491
- ...t,
1492
- credentials: "omit"
1493
- }) : Qt() ? $t(e, t) : Xe(e, t);
1494
- }, sn = /* @__PURE__ */ n({
1495
- ATTACH_FRAME_EVENT_KEY: () => Ee,
1496
- assertAttachableFrameUrl: () => y,
1497
- assertFetchableUrl: () => _e,
1498
- attachFrame: () => je,
1499
- attachFramePermission: () => Oe,
1500
- available: () => an,
1501
- box: () => l,
1502
- cookies: () => Se,
1503
- createVideoElementHandle: () => e,
1504
- evaluatePermission: () => Ae,
1505
- events: () => h,
1506
- extension: () => h,
1507
- fetch: () => be,
1508
- fetchCredentialedPermission: () => de,
1509
- fetchLocalPermission: () => fe,
1510
- fetchPermission: () => ue,
1511
- gotoPermission: () => ke,
1512
- handleRevivableModules: () => i,
1513
- isBlockedFetchUrl: () => ge,
1514
- isBlockedFrameUrl: () => De,
1515
- isExtensionExposed: () => g,
1516
- isLocalNetworkUrl: () => me,
1517
- isType: () => t,
1518
- modifyRequestHeadersPermission: () => Ce,
1519
- permissions: () => Me,
1520
- promptInstall: () => Yt,
1521
- readCookiePermission: () => xe,
1522
- removeRequestHeaderRule: () => Te,
1523
- revive: () => o,
1524
- setMissingExtensionHandler: () => se,
1525
- setRequestHeaderRule: () => we,
1526
- type: () => a,
1527
- waitForExtensionExposure: () => _
1528
- }), cn = /* @__PURE__ */ n({
1529
- available: () => fn,
1530
- list: () => hn,
1531
- readFile: () => pn,
1532
- remove: () => mn,
1533
- writeFile: () => N
1534
- }), ln = () => navigator.storage.getDirectory(), un = (e) => {
1535
- let t = e.split("/").filter((e) => e && e !== ".");
1536
- if (t.some((e) => e === "..") || !t.length) throw Error("opfs: invalid path");
1537
- return t;
1538
- }, dn = async (e, t) => {
1539
- let n = await ln();
1540
- for (let r of e) n = await n.getDirectoryHandle(r, { create: t });
1541
- return n;
1542
- }, fn = async () => {
1543
- try {
1544
- return typeof navigator < "u" && !!navigator.storage?.getDirectory && !!await ln();
1545
- } catch {
1546
- return !1;
1547
- }
1548
- }, N = async (e, t, n) => {
1549
- let r = un(e), i = r.pop(), a = await (await (await dn(r, !0)).getFileHandle(i, { create: !0 })).createWritable({ keepExistingData: !1 });
1550
- try {
1551
- let e = t instanceof Blob ? t : new Blob([t], n?.contentType ? { type: n.contentType } : void 0);
1552
- await a.write(e);
1553
- } finally {
1554
- await a.close();
1555
- }
1556
- }, pn = async (e) => {
1557
- let t = un(e), n = t.pop();
1558
- return (await (await dn(t, !1)).getFileHandle(n)).getFile();
1559
- }, mn = async (e) => {
1560
- let t = un(e), n = t.pop();
1561
- await (await dn(t, !1)).removeEntry(n, { recursive: !0 });
1562
- }, hn = async () => {
1563
- let e = [], t = async (n, r) => {
1564
- for await (let [i, a] of n.entries()) {
1565
- let n = r ? `${r}/${i}` : i;
1566
- if (a.kind === "file") {
1567
- let t = await a.getFile();
1568
- e.push({
1569
- path: n,
1570
- size: t.size,
1571
- contentType: t.type || null,
1572
- updatedAt: new Date(t.lastModified).toISOString()
1573
- });
1574
- } else await t(a, n);
1575
- }
1576
- };
1577
- return await t(await ln(), ""), e;
1578
- }, gn = /* @__PURE__ */ n({
1579
- available: () => vn,
1580
- list: () => yn,
1581
- pull: () => Cn,
1582
- readFile: () => bn,
1583
- remove: () => Sn,
1584
- writeFile: () => xn
1585
- }), _n, P = async () => await (_n ??= fn().catch(() => !1)) ? !0 : (_n = void 0, !1), F = () => tt().catch(() => !1), vn = async () => await P() || await F(), yn = async () => {
1586
- let [e, t] = await Promise.all([P().then((e) => e ? hn() : []).catch(() => []), F().then((e) => e ? nt() : []).catch(() => [])]), n = /* @__PURE__ */ new Map(), r = (e) => {
1587
- let t = Date.parse(e.updatedAt ?? "");
1588
- return Number.isFinite(t) ? t : 0;
1589
- }, i = (e) => {
1590
- let t = n.get(e.path);
1591
- (!t || r(e) >= r(t)) && n.set(e.path, e);
1592
- };
1593
- for (let t of e) i(t);
1594
- for (let e of t) i(e);
1595
- return [...n.values()];
1596
- }, bn = async (e) => {
1597
- if (await P()) try {
1598
- return await pn(e);
1599
- } catch (e) {
1600
- if (e?.name !== "NotFoundError") throw e;
1601
- }
1602
- let t = await T(e);
1603
- return await P() && N(e, t).catch(() => {}), t;
1604
- }, xn = async (e, t, n) => {
1605
- let r = t instanceof Blob ? t : new Blob([t], n?.contentType ? { type: n.contentType } : void 0);
1606
- if (await P()) {
1607
- await N(e, r, n), await F() && it(e, r, n).catch((e) => console.warn("fs: cloud replicate failed", e));
1608
- return;
1609
- }
1610
- if (await F()) return it(e, r, n);
1611
- throw Error("fs: no storage backend available");
1612
- }, Sn = async (e) => {
1613
- let t = [];
1614
- if (await P() && t.push(mn(e).catch(() => {})), await F() && t.push(at(e).catch(() => {})), !t.length) throw Error("fs: no storage backend available");
1615
- await Promise.all(t);
1616
- }, Cn = async (e) => {
1617
- let t = await T(e);
1618
- return await P() && await N(e, t), t;
1619
- }, I = new Map([["", {
1620
- kind: "dir",
1621
- mtimeMs: 0
1622
- }]]), L = /* @__PURE__ */ new Set(), R = /* @__PURE__ */ new Set(), wn = () => Date.now(), z = (e, t, n) => {
1623
- let r = /* @__PURE__ */ Error(`${e}: ${{
1624
- ENOENT: "no such file or directory",
1625
- EEXIST: "file already exists",
1626
- ENOTDIR: "not a directory",
1627
- EISDIR: "illegal operation on a directory",
1628
- ENOTEMPTY: "directory not empty"
1629
- }[e] ?? e}, ${n} '${t}'`);
1630
- return r.code = e, r.path = t, r.syscall = n, r;
1631
- }, B = (e) => {
1632
- let t = [];
1633
- for (let n of e.split("/")) if (!(!n || n === ".")) {
1634
- if (n === "..") {
1635
- t.pop();
1636
- continue;
1637
- }
1638
- t.push(n);
1639
- }
1640
- return t.join("/");
1641
- }, V = (e) => e.split("/").slice(0, -1).join("/"), H = (e) => {
1642
- if (!e) return;
1643
- let t = e.split("/"), n = "";
1644
- for (let e of t) {
1645
- n = n ? `${n}/${e}` : e;
1646
- let t = I.get(n);
1647
- if (!t) I.set(n, {
1648
- kind: "dir",
1649
- mtimeMs: wn()
1650
- });
1651
- else if (t.kind === "file") throw z("ENOTDIR", n, "mkdir");
1652
- }
1653
- }, Tn, U = () => Tn ??= (async () => {
1654
- let e = await yn().catch(() => []);
1655
- for (let t of e) try {
1656
- let e = B(t.path);
1657
- if (L.has(e)) continue;
1658
- let n = await (await bn(t.path)).arrayBuffer();
1659
- H(V(e));
1660
- let r = Date.parse(t.updatedAt ?? "");
1661
- I.set(e, {
1662
- kind: "file",
1663
- data: new Uint8Array(n),
1664
- mtimeMs: Number.isFinite(r) ? r : wn()
1665
- });
1666
- } catch {}
1667
- })(), En = async () => {
1668
- Tn = void 0, await U();
1669
- }, W = async () => {
1670
- let e = [...L].map(async (e) => {
1671
- let t = I.get(e);
1672
- if (t?.kind !== "file") {
1673
- L.delete(e);
1674
- return;
1675
- }
1676
- let n = t.data;
1677
- try {
1678
- await xn(e, n), I.get(e)?.kind === "file" && I.get(e).data === n && L.delete(e);
1679
- } catch {}
1680
- }), t = [...R].map(async (e) => {
1681
- try {
1682
- await Sn(e), R.delete(e);
1683
- } catch {}
1684
- });
1685
- await Promise.all([...e, ...t]);
1686
- }, Dn, On = () => {
1687
- Dn ||= setTimeout(() => {
1688
- Dn = void 0, W().catch(() => {});
1689
- }, 250);
1690
- };
1691
- typeof addEventListener < "u" && (addEventListener("pagehide", () => {
1692
- W().catch(() => {});
1693
- }), addEventListener("visibilitychange", () => {
1694
- typeof document < "u" && document.visibilityState === "hidden" && W().catch(() => {});
1695
- }));
1696
- var kn = (e, t) => ({
1697
- size: t.kind === "file" ? t.data.byteLength : 0,
1698
- mtimeMs: t.mtimeMs,
1699
- mtime: new Date(t.mtimeMs),
1700
- atimeMs: t.mtimeMs,
1701
- ctimeMs: t.mtimeMs,
1702
- mode: t.kind === "file" ? 420 : 493,
1703
- isFile: () => t.kind === "file",
1704
- isDirectory: () => t.kind === "dir",
1705
- isSymbolicLink: () => !1
1706
- }), An = (e) => I.has(B(e)), G = (e) => {
1707
- let t = B(e), n = I.get(t);
1708
- if (!n) throw z("ENOENT", e, "stat");
1709
- return kn(t, n);
1710
- }, jn = (e) => {
1711
- let t = I.get(B(e));
1712
- if (!t) throw z("ENOENT", e, "open");
1713
- if (t.kind === "dir") throw z("EISDIR", e, "read");
1714
- return t.data;
1715
- }, K = (e, t, n) => {
1716
- let r = B(e);
1717
- if (!r) throw z("EISDIR", e, "open");
1718
- let i = I.get(r);
1719
- if (i?.kind === "dir") throw z("EISDIR", e, "open");
1720
- H(V(r));
1721
- let a = n && i?.kind === "file" ? Mn(i.data, t) : t;
1722
- I.set(r, {
1723
- kind: "file",
1724
- data: a,
1725
- mtimeMs: wn()
1726
- }), L.add(r), R.delete(r), On();
1727
- }, Mn = (e, t) => {
1728
- let n = new Uint8Array(e.byteLength + t.byteLength);
1729
- return n.set(e, 0), n.set(t, e.byteLength), n;
1730
- }, Nn = (e, t) => {
1731
- let n = B(e);
1732
- if (n) {
1733
- if (I.has(n)) {
1734
- if (t) return;
1735
- throw z("EEXIST", e, "mkdir");
1736
- }
1737
- if (!t && !I.has(V(n))) throw z("ENOENT", e, "mkdir");
1738
- H(n);
1739
- }
1740
- }, Pn = (e) => {
1741
- let t = B(e), n = I.get(t);
1742
- if (!n) throw z("ENOENT", e, "scandir");
1743
- if (n.kind === "file") throw z("ENOTDIR", e, "scandir");
1744
- let r = t ? `${t}/` : "", i = /* @__PURE__ */ new Set();
1745
- for (let e of I.keys()) {
1746
- if (!e || !e.startsWith(r)) continue;
1747
- let t = e.slice(r.length);
1748
- if (!t || t.includes("/")) {
1749
- t.includes("/") && i.add(t.split("/")[0]);
1750
- continue;
1751
- }
1752
- i.add(t);
1753
- }
1754
- return [...i];
1755
- }, q = (e, t) => {
1756
- let n = B(e);
1757
- if (!I.get(n)) {
1758
- if (t) return;
1759
- throw z("ENOENT", e, "unlink");
1760
- }
1761
- let r = `${n}/`, i = [...I.keys()].filter((e) => e.startsWith(r));
1762
- if (i.length && !t) throw z("ENOTEMPTY", e, "rmdir");
1763
- for (let e of [n, ...i]) {
1764
- let t = I.get(e);
1765
- I.delete(e), t?.kind === "file" && (L.delete(e), R.add(e));
1766
- }
1767
- On();
1768
- }, Fn = (e, t) => {
1769
- let n = B(e), r = B(t);
1770
- if (!n) throw z("EBUSY", e, "rename");
1771
- if (r === n || r.startsWith(`${n}/`)) throw z("EINVAL", e, "rename");
1772
- let i = I.get(n);
1773
- if (!i) throw z("ENOENT", e, "rename");
1774
- let a = I.get(r);
1775
- if (a) {
1776
- if (a.kind !== i.kind) throw z(i.kind === "dir" ? "ENOTDIR" : "EISDIR", t, "rename");
1777
- q(r, !0);
1778
- }
1779
- H(V(r));
1780
- let o = `${n}/`, s = [n, ...[...I.keys()].filter((e) => e.startsWith(o))];
1781
- for (let e of s) {
1782
- let t = r + e.slice(n.length), i = I.get(e);
1783
- I.set(t, i), I.delete(e), i.kind === "file" && (L.add(t), R.delete(t), L.delete(e), R.add(e));
1784
- }
1785
- On();
1786
- }, In = /* @__PURE__ */ n({
1787
- appendFile: () => er,
1788
- appendFileSync: () => Hn,
1789
- exists: () => sr,
1790
- existsSync: () => Un,
1791
- flush: () => W,
1792
- lstatSync: () => Gn,
1793
- mkdir: () => rr,
1794
- mkdirSync: () => qn,
1795
- mount: () => U,
1796
- promises: () => cr,
1797
- readFile: () => Qn,
1798
- readFileSync: () => Bn,
1799
- readdir: () => nr,
1800
- readdirSync: () => Kn,
1801
- remount: () => En,
1802
- rename: () => or,
1803
- renameSync: () => Zn,
1804
- rm: () => ir,
1805
- rmSync: () => Jn,
1806
- rmdirSync: () => Yn,
1807
- stat: () => tr,
1808
- statSync: () => Wn,
1809
- unlink: () => ar,
1810
- unlinkSync: () => Xn,
1811
- writeFile: () => $n,
1812
- writeFileSync: () => Vn
1813
- }), J = (e) => typeof e == "string" ? e : e instanceof URL ? decodeURIComponent(e.pathname) : e.toString(), Ln = (e) => typeof e == "string" ? e : e?.encoding ?? void 0, Rn = (e) => typeof e == "object" && !!e?.recursive, zn = (e, t) => {
1814
- let n = Ln(t);
1815
- return n ? m.from(e).toString(n) : m.from(e);
1816
- }, Y = (e, t) => {
1817
- if (typeof e == "string") return new Uint8Array(m.from(e, Ln(t) ?? "utf8"));
1818
- if (e instanceof Uint8Array) return e.slice();
1819
- if (e instanceof ArrayBuffer) return new Uint8Array(e).slice();
1820
- if (ArrayBuffer.isView(e)) return new Uint8Array(e.buffer, e.byteOffset, e.byteLength).slice();
1821
- throw TypeError("The \"data\" argument must be of type string, Buffer, TypedArray, or DataView");
1822
- }, Bn = (e, t) => zn(jn(J(e)), t), Vn = (e, t, n) => K(J(e), Y(t, n), !1), Hn = (e, t, n) => K(J(e), Y(t, n), !0), Un = (e) => An(J(e)), Wn = (e) => G(J(e)), Gn = Wn, Kn = (e) => Pn(J(e)), qn = (e, t) => Nn(J(e), Rn(t)), Jn = (e, t) => q(J(e), !!t?.recursive), Yn = (e, t) => q(J(e), !!t?.recursive), Xn = (e) => q(J(e), !1), Zn = (e, t) => Fn(J(e), J(t)), X = (e, t) => {
1823
- U().finally(() => {
1824
- let n;
1825
- try {
1826
- n = e();
1827
- } catch (e) {
1828
- t(e);
1829
- return;
1830
- }
1831
- t(null, n);
1832
- });
1833
- }, Z = (e, t) => typeof e == "function" ? e : t, Q = (e) => typeof e == "function" ? void 0 : e, Qn = (e, t, n) => X(() => zn(jn(J(e)), Q(t)), Z(t, n)), $n = (e, t, n, r) => X(() => K(J(e), Y(t, Q(n)), !1), Z(n, r)), er = (e, t, n, r) => X(() => K(J(e), Y(t, Q(n)), !0), Z(n, r)), tr = (e, t) => X(() => G(J(e)), t), nr = (e, t, n) => X(() => Pn(J(e)), Z(t, n)), rr = (e, t, n) => X(() => Nn(J(e), Rn(Q(t))), Z(t, n)), ir = (e, t, n) => X(() => q(J(e), !!Q(t)?.recursive), Z(t, n)), ar = (e, t) => X(() => q(J(e), !1), t), or = (e, t, n) => X(() => Fn(J(e), J(t)), n), sr = (e, t) => {
1834
- U().finally(() => t(An(J(e))));
1835
- }, $ = (e) => U().then(() => e()), cr = {
1836
- readFile: (e, t) => $(() => zn(jn(J(e)), t)),
1837
- writeFile: (e, t, n) => $(() => K(J(e), Y(t, n), !1)),
1838
- appendFile: (e, t, n) => $(() => K(J(e), Y(t, n), !0)),
1839
- stat: (e) => $(() => G(J(e))),
1840
- lstat: (e) => $(() => G(J(e))),
1841
- readdir: (e) => $(() => Pn(J(e))),
1842
- mkdir: (e, t) => $(() => Nn(J(e), Rn(t))),
1843
- rm: (e, t) => $(() => q(J(e), !!t?.recursive)),
1844
- rmdir: (e, t) => $(() => q(J(e), !!t?.recursive)),
1845
- unlink: (e) => $(() => q(J(e), !1)),
1846
- rename: (e, t) => $(() => Fn(J(e), J(t))),
1847
- access: (e) => $(() => {
1848
- if (!An(J(e))) throw z("ENOENT", J(e), "access");
1849
- })
1850
- }, lr = "https://fkn.app", ur = (e, t) => {
1
+ import { d as e, f as t, l as n, m as r, p as i, u as a } from "./locator-DxAsGV_o.js";
2
+ import { C as o, D as s, E as c, O as l, S as u, _ as d, a as f, b as p, c as m, d as h, f as g, g as _, h as v, i as y, l as b, m as x, n as S, o as C, p as w, s as T, t as E, u as D, v as O, w as k, x as A } from "./extension-Dgz0UTy0.js";
3
+ import { r as j, t as M } from "./api-ByfayMm1.js";
4
+ import "./proxy-wiZN4eTR.js";
5
+ import { n as N } from "./cloud-BVnscun4.js";
6
+ import { t as P } from "./dns.js";
7
+ import "./node-fs-Bd_UUx1m.js";
8
+ import "./storage-z0q3iena.js";
9
+ import "./utils-CNydj3OT.js";
10
+ import { s as F } from "./net-Bl6_W3bd.js";
11
+ import { r as I } from "./dgram-5YUb70O2.js";
12
+ import { t as L } from "./http.js";
13
+ import { t as R } from "./desktop.js";
14
+ import { s as z } from "./fs-B7JumDCn.js";
15
+ import { t as B } from "./opfs.js";
16
+ import { t as V } from "./account.js";
17
+ import { relay as H } from "osra";
18
+ import { createElement as U } from "react";
19
+ //#region src/lib/relay.ts
20
+ var W = "https://fkn.app", G = (e, t) => {
1851
21
  if (typeof window > "u") throw Error("FKN @fkn/lib: relayWorker must be called from the main thread");
1852
- if (!C?.contentWindow) throw Error("FKN @fkn/lib: relayWorker called before the FKN iframe was injected");
1853
- te({
22
+ if (!j?.contentWindow) throw Error("FKN @fkn/lib: relayWorker called before the FKN iframe was injected");
23
+ H({
1854
24
  receive: window,
1855
- emit: C.contentWindow
25
+ emit: j.contentWindow
1856
26
  }, e, {
1857
27
  key: "fkn-api",
1858
- originA: t?.originA ?? lr,
28
+ originA: t?.originA ?? W,
1859
29
  originB: t?.originB ?? "*",
1860
30
  unregisterSignal: t?.unregisterSignal
1861
31
  });
1862
- }, dr = async () => typeof window > "u" ? !1 : (await w).connect.prompt(location.origin).catch(() => !1), fr = /* @__PURE__ */ n({
1863
- info: () => hr,
1864
- login: () => pr,
1865
- logout: () => mr,
1866
- onChange: () => gr
1867
- }), pr = async () => typeof window > "u" ? !1 : (await w).account.login(location.origin).catch(() => !1), mr = async () => {
1868
- typeof window > "u" || await (await w).account.logout().catch(() => {});
1869
- }, hr = async () => {
1870
- if (typeof window > "u") return null;
1871
- let e = await w.then((e) => e.account.info()).catch(() => null);
1872
- return e ? {
1873
- name: e.name,
1874
- image: e.image,
1875
- premium: e.premium,
1876
- premiumUntil: e.premiumUntil ? Date.parse(e.premiumUntil) : null
1877
- } : null;
1878
- }, gr = async (e) => {
1879
- if (typeof window > "u") return () => {};
1880
- let t = await w.catch(() => null);
1881
- if (!t) return () => {};
1882
- let n = await t.account.onChange(e).catch(() => null);
1883
- return typeof n == "function" ? n : () => {};
1884
- }, _r = "https://fkn.app", vr = (e = location.origin) => `${_r}/connect-button?origin=${encodeURIComponent(e)}`, yr = ({ className: e, style: t } = {}) => re("iframe", {
1885
- src: vr(),
32
+ }, K = async () => typeof window > "u" ? !1 : (await M).connect.prompt(location.origin).catch(() => !1), q = "https://fkn.app", J = (e = location.origin) => `${q}/connect-button?origin=${encodeURIComponent(e)}`, Y = ({ className: e, style: t } = {}) => U("iframe", {
33
+ src: J(),
1886
34
  title: "Connect your FKN account",
1887
35
  className: e,
1888
36
  style: {
@@ -1895,4 +43,4 @@ var kn = (e, t) => ({
1895
43
  }
1896
44
  });
1897
45
  //#endregion
1898
- export { Ee as ATTACH_FRAME_EVENT_KEY, yr as ConnectButton, fr as account, y as assertAttachableFrameUrl, _e as assertFetchableUrl, je as attachFrame, Oe as attachFramePermission, l as box, qt as cloud, dr as connect, vr as connectButtonUrl, Se as cookies, e as createVideoElementHandle, Zt as desktop, vt as dgram, Qe as dns, Ae as evaluatePermission, sn as extension, on as fetch, de as fetchCredentialedPermission, fe as fetchLocalPermission, ue as fetchPermission, gn as fs, ke as gotoPermission, i as handleRevivableModules, wt as http, ge as isBlockedFetchUrl, De as isBlockedFrameUrl, g as isExtensionExposed, me as isLocalNetworkUrl, t as isType, Ce as modifyRequestHeadersPermission, pt as net, In as nodeFs, cn as opfs, Me as permissions, Yt as promptInstall, xe as readCookiePermission, ur as relayWorker, Te as removeRequestHeaderRule, o as revive, se as setMissingExtensionHandler, we as setRequestHeaderRule, a as type, _ as waitForExtensionExposure };
46
+ export { C as ATTACH_FRAME_EVENT_KEY, Y as ConnectButton, V as account, T as assertAttachableFrameUrl, O as assertFetchableUrl, m as attachFrame, b as attachFramePermission, a as box, N as cloud, K as connect, J as connectButtonUrl, _ as cookies, e as createVideoElementHandle, R as desktop, I as dgram, P as dns, D as evaluatePermission, E as extension, S as fetch, p as fetchCredentialedPermission, A as fetchLocalPermission, u as fetchPermission, z as fs, h as gotoPermission, n as handleRevivableModules, L as http, o as isBlockedFetchUrl, g as isBlockedFrameUrl, c as isExtensionExposed, k as isLocalNetworkUrl, t as isType, w as modifyRequestHeadersPermission, F as net, B as opfs, f as permissions, y as promptInstall, d as readCookiePermission, G as relayWorker, x as removeRequestHeaderRule, i as revive, s as setMissingExtensionHandler, v as setRequestHeaderRule, r as type, l as waitForExtensionExposure };