@kbve/droid 0.0.5 → 0.1.1

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 (109) hide show
  1. package/README.md +3 -1
  2. package/comlink.js +1 -7
  3. package/droid.mjs +191 -61
  4. package/index.d.ts +29 -0
  5. package/index.js +9054 -2763
  6. package/lib/gateway/SupabaseGateway.d.ts +38 -0
  7. package/lib/gateway/SupabaseGateway.d.ts.map +1 -0
  8. package/lib/gateway/WorkerCommunication.d.ts +39 -0
  9. package/lib/gateway/WorkerCommunication.d.ts.map +1 -0
  10. package/lib/gateway/WorkerPool.d.ts +55 -0
  11. package/lib/gateway/WorkerPool.d.ts.map +1 -0
  12. package/lib/gateway/capabilities.d.ts +23 -0
  13. package/lib/gateway/capabilities.d.ts.map +1 -0
  14. package/lib/gateway/index.d.ts +9 -0
  15. package/lib/gateway/index.d.ts.map +1 -0
  16. package/lib/gateway/strategies/DirectStrategy.d.ts +52 -0
  17. package/lib/gateway/strategies/DirectStrategy.d.ts.map +1 -0
  18. package/lib/gateway/strategies/SharedWorkerStrategy.d.ts +46 -0
  19. package/lib/gateway/strategies/SharedWorkerStrategy.d.ts.map +1 -0
  20. package/lib/gateway/strategies/WebWorkerStrategy.d.ts +45 -0
  21. package/lib/gateway/strategies/WebWorkerStrategy.d.ts.map +1 -0
  22. package/lib/gateway/types.d.ts +81 -0
  23. package/lib/gateway/types.d.ts.map +1 -0
  24. package/lib/workers/canvas-ui-renderer.d.ts +25 -0
  25. package/lib/workers/canvas-ui-renderer.d.ts.map +1 -0
  26. package/lib/workers/canvas-worker.d.ts +14 -0
  27. package/lib/workers/canvas-worker.d.ts.map +1 -0
  28. package/lib/workers/canvas-worker.js +291 -145
  29. package/lib/workers/data.d.ts +40 -0
  30. package/lib/workers/data.d.ts.map +1 -0
  31. package/lib/workers/db-worker.d.ts +69 -0
  32. package/lib/workers/db-worker.d.ts.map +1 -0
  33. package/lib/workers/db-worker.js +2680 -2147
  34. package/lib/workers/events.d.ts +11 -0
  35. package/lib/workers/events.d.ts.map +1 -0
  36. package/lib/workers/flexbuilder.d.ts +4 -0
  37. package/lib/workers/flexbuilder.d.ts.map +1 -0
  38. package/lib/workers/init.d.ts +11 -0
  39. package/lib/workers/init.d.ts.map +1 -0
  40. package/lib/workers/main.d.ts +107 -0
  41. package/lib/workers/main.d.ts.map +1 -0
  42. package/lib/workers/supabase-db-worker.d.ts +2 -0
  43. package/lib/workers/supabase-db-worker.d.ts.map +1 -0
  44. package/lib/workers/supabase-db-worker.js +9337 -0
  45. package/lib/workers/supabase-shared-worker.d.ts +2 -0
  46. package/lib/workers/supabase-shared-worker.d.ts.map +1 -0
  47. package/lib/workers/supabase-shared-worker.js +12635 -0
  48. package/lib/workers/tools.d.ts +4 -0
  49. package/lib/workers/tools.d.ts.map +1 -0
  50. package/lib/workers/validate.d.ts +15 -0
  51. package/lib/workers/validate.d.ts.map +1 -0
  52. package/lib/workers/ws-worker.d.ts +11 -0
  53. package/lib/workers/ws-worker.d.ts.map +1 -0
  54. package/lib/workers/ws-worker.js +174 -115
  55. package/main.js +4875 -0
  56. package/package.json +17 -6
  57. package/reference.js +688 -228
  58. package/src/index.ts +38 -13
  59. package/src/lib/droid.spec.ts +14 -19
  60. package/src/lib/droid.ts +48 -4
  61. package/src/lib/gateway/SupabaseGateway.ts +183 -0
  62. package/src/lib/gateway/WorkerCommunication.ts +132 -0
  63. package/src/lib/gateway/WorkerPool.ts +304 -0
  64. package/src/lib/gateway/capabilities.ts +80 -0
  65. package/src/lib/gateway/index.ts +15 -0
  66. package/src/lib/gateway/strategies/DirectStrategy.ts +443 -0
  67. package/src/lib/gateway/strategies/SharedWorkerStrategy.ts +278 -0
  68. package/src/lib/gateway/strategies/WebWorkerStrategy.ts +278 -0
  69. package/src/lib/gateway/types.ts +112 -0
  70. package/src/lib/mod/mod-manager.ts +13 -8
  71. package/src/lib/mod/module/bento/mod-bento.worker.ts +1 -1
  72. package/src/lib/mod/module/supabase/mod-supabase.spec.ts +21 -25
  73. package/src/lib/mod/module/supabase/mod-supabase.ts +68 -0
  74. package/src/lib/mod/module/supabase/mod-supabase.worker.ts +1 -56
  75. package/src/lib/state/auth.spec.ts +58 -0
  76. package/src/lib/state/auth.ts +30 -0
  77. package/src/lib/state/index.ts +34 -0
  78. package/src/lib/state/overlay-manager.ts +125 -0
  79. package/src/lib/state/router.ts +24 -0
  80. package/src/lib/state/theme-sync.ts +75 -0
  81. package/src/lib/state/toasts.spec.ts +106 -0
  82. package/src/lib/state/toasts.ts +34 -0
  83. package/src/lib/state/ui.spec.ts +148 -0
  84. package/src/lib/state/ui.ts +45 -0
  85. package/src/lib/state/welcome-toast.ts +76 -0
  86. package/src/lib/types/bento.spec.ts +116 -0
  87. package/src/lib/types/bento.ts +94 -55
  88. package/src/lib/types/event-types.spec.ts +93 -0
  89. package/src/lib/types/event-types.ts +39 -3
  90. package/src/lib/types/modules.ts +12 -5
  91. package/src/lib/types/ui-event-types.ts +66 -0
  92. package/src/lib/workers/canvas-ui-renderer.ts +266 -0
  93. package/src/lib/workers/canvas-worker.ts +94 -9
  94. package/src/lib/workers/data.ts +59 -36
  95. package/src/lib/workers/db-worker.ts +79 -32
  96. package/src/lib/workers/events.spec.ts +208 -0
  97. package/src/lib/workers/events.ts +27 -14
  98. package/src/lib/workers/flexbuilder.ts +2 -2
  99. package/src/lib/workers/init.ts +25 -17
  100. package/src/lib/workers/main.ts +509 -272
  101. package/src/lib/workers/supabase-db-worker.ts +221 -0
  102. package/src/lib/workers/supabase-shared-worker.ts +572 -0
  103. package/src/lib/workers/validate.ts +64 -0
  104. package/src/lib/workers/ws-worker.ts +156 -25
  105. package/src/setup-vitest.ts +4 -2
  106. package/src/types.ts +30 -0
  107. package/src/vite-env.d.ts +1 -0
  108. package/workers/main.js +10 -1089
  109. package/src/types.d.ts +0 -31
@@ -0,0 +1,4 @@
1
+ import { VirtualNode } from '../types/modules';
2
+ export declare function dispatchAsync(fn: () => void): void;
3
+ export declare function renderVNode(vnode: VirtualNode): HTMLElement;
4
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/workers/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,IAAI,QAM3C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAiD3D"}
@@ -0,0 +1,15 @@
1
+ export type UIMessageType = 'toast' | 'toast-remove' | 'tooltip-open' | 'tooltip-close' | 'modal-open' | 'modal-close';
2
+ export interface ValidatedWorkerMessage {
3
+ type: UIMessageType;
4
+ payload: unknown;
5
+ }
6
+ /**
7
+ * Validate a UI message payload BEFORE postMessage to main thread.
8
+ * Returns the validated message or throws with a descriptive error.
9
+ *
10
+ * Usage (inside worker):
11
+ * const msg = validateUIMessage('toast', rawPayload);
12
+ * emitFromWorker(msg); // guaranteed valid
13
+ */
14
+ export declare function validateUIMessage(type: UIMessageType, payload: unknown): ValidatedWorkerMessage;
15
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/workers/validate.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GACtB,OAAO,GACP,cAAc,GACd,cAAc,GACd,eAAe,GACf,YAAY,GACZ,aAAa,CAAC;AAQjB,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,OAAO,GACd,sBAAsB,CA0BxB"}
@@ -0,0 +1,11 @@
1
+ declare const wsInstanceAPI: {
2
+ connect(url: string): Promise<void>;
3
+ send(payload: Uint8Array): Promise<void>;
4
+ close(): Promise<void>;
5
+ onMessage(callback: (data: string | ArrayBuffer) => void): void;
6
+ onStatus(callback: (status: string) => void): void;
7
+ getStatus(): Promise<string>;
8
+ };
9
+ export type WSInstance = typeof wsInstanceAPI;
10
+ export {};
11
+ //# sourceMappingURL=ws-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-worker.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/workers/ws-worker.ts"],"names":[],"mappings":"AAkFA,QAAA,MAAM,aAAa;iBACC,MAAM;kBAiEL,UAAU;;wBAqBV,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,KAAK,IAAI;uBAIrC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;iBAIxB,OAAO,CAAC,MAAM,CAAC;CAUlC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,OAAO,aAAa,CAAC"}
@@ -1,19 +1,14 @@
1
- /**
2
- * @license
3
- * Copyright 2019 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- const T = Symbol("Comlink.proxy"), N = Symbol("Comlink.endpoint"), H = Symbol("Comlink.releaseProxy"), k = Symbol("Comlink.finalizer"), h = Symbol("Comlink.thrown"), C = (e) => typeof e == "object" && e !== null || typeof e == "function", I = {
7
- canHandle: (e) => C(e) && e[T],
1
+ const L = /* @__PURE__ */ Symbol("Comlink.proxy"), $ = /* @__PURE__ */ Symbol("Comlink.endpoint"), B = /* @__PURE__ */ Symbol("Comlink.releaseProxy"), R = /* @__PURE__ */ Symbol("Comlink.finalizer"), k = /* @__PURE__ */ Symbol("Comlink.thrown"), z = (e) => typeof e == "object" && e !== null || typeof e == "function", Y = {
2
+ canHandle: (e) => z(e) && e[L],
8
3
  serialize(e) {
9
4
  const { port1: t, port2: n } = new MessageChannel();
10
- return M(e, t), [n, [n]];
5
+ return H(e, t), [n, [n]];
11
6
  },
12
7
  deserialize(e) {
13
- return e.start(), D(e);
8
+ return e.start(), v(e);
14
9
  }
15
- }, L = {
16
- canHandle: (e) => C(e) && h in e,
10
+ }, q = {
11
+ canHandle: (e) => z(e) && k in e,
17
12
  serialize({ value: e }) {
18
13
  let t;
19
14
  return e instanceof Error ? t = {
@@ -28,48 +23,48 @@ const T = Symbol("Comlink.proxy"), N = Symbol("Comlink.endpoint"), H = Symbol("C
28
23
  deserialize(e) {
29
24
  throw e.isError ? Object.assign(new Error(e.value.message), e.value) : e.value;
30
25
  }
31
- }, R = /* @__PURE__ */ new Map([
32
- ["proxy", I],
33
- ["throw", L]
26
+ }, D = /* @__PURE__ */ new Map([
27
+ ["proxy", Y],
28
+ ["throw", q]
34
29
  ]);
35
- function V(e, t) {
30
+ function J(e, t) {
36
31
  for (const n of e)
37
32
  if (t === n || n === "*" || n instanceof RegExp && n.test(t))
38
33
  return !0;
39
34
  return !1;
40
35
  }
41
- function M(e, t = globalThis, n = ["*"]) {
42
- t.addEventListener("message", function y(r) {
43
- if (!r || !r.data)
36
+ function H(e, t = globalThis, n = ["*"]) {
37
+ t.addEventListener("message", function d(o) {
38
+ if (!o || !o.data)
44
39
  return;
45
- if (!V(n, r.origin)) {
46
- console.warn(`Invalid origin '${r.origin}' for comlink proxy`);
40
+ if (!J(n, o.origin)) {
41
+ console.warn(`Invalid origin '${o.origin}' for comlink proxy`);
47
42
  return;
48
43
  }
49
- const { id: a, type: g, path: c } = Object.assign({ path: [] }, r.data), u = (r.data.argumentList || []).map(d);
44
+ const { id: a, type: g, path: l } = Object.assign({ path: [] }, o.data), u = (o.data.argumentList || []).map(y);
50
45
  let s;
51
46
  try {
52
- const o = c.slice(0, -1).reduce((i, w) => i[w], e), f = c.reduce((i, w) => i[w], e);
47
+ const c = l.slice(0, -1).reduce((i, b) => i[b], e), f = l.reduce((i, b) => i[b], e);
53
48
  switch (g) {
54
49
  case "GET":
55
50
  s = f;
56
51
  break;
57
52
  case "SET":
58
- o[c.slice(-1)[0]] = d(r.data.value), s = !0;
53
+ c[l.slice(-1)[0]] = y(o.data.value), s = !0;
59
54
  break;
60
55
  case "APPLY":
61
- s = f.apply(o, u);
56
+ s = f.apply(c, u);
62
57
  break;
63
58
  case "CONSTRUCT":
64
59
  {
65
60
  const i = new f(...u);
66
- s = Y(i);
61
+ s = te(i);
67
62
  }
68
63
  break;
69
64
  case "ENDPOINT":
70
65
  {
71
- const { port1: i, port2: w } = new MessageChannel();
72
- M(e, w), s = G(i, [i]);
66
+ const { port1: i, port2: b } = new MessageChannel();
67
+ H(e, b), s = ee(i, [i]);
73
68
  }
74
69
  break;
75
70
  case "RELEASE":
@@ -78,31 +73,31 @@ function M(e, t = globalThis, n = ["*"]) {
78
73
  default:
79
74
  return;
80
75
  }
81
- } catch (o) {
82
- s = { value: o, [h]: 0 };
76
+ } catch (c) {
77
+ s = { value: c, [k]: 0 };
83
78
  }
84
- Promise.resolve(s).catch((o) => ({ value: o, [h]: 0 })).then((o) => {
85
- const [f, i] = S(o);
86
- t.postMessage(Object.assign(Object.assign({}, f), { id: a }), i), g === "RELEASE" && (t.removeEventListener("message", y), O(t), k in e && typeof e[k] == "function" && e[k]());
87
- }).catch((o) => {
88
- const [f, i] = S({
79
+ Promise.resolve(s).catch((c) => ({ value: c, [k]: 0 })).then((c) => {
80
+ const [f, i] = P(c);
81
+ t.postMessage(Object.assign(Object.assign({}, f), { id: a }), i), g === "RELEASE" && (t.removeEventListener("message", d), F(t), R in e && typeof e[R] == "function" && e[R]());
82
+ }).catch((c) => {
83
+ const [f, i] = P({
89
84
  value: new TypeError("Unserializable return value"),
90
- [h]: 0
85
+ [k]: 0
91
86
  });
92
87
  t.postMessage(Object.assign(Object.assign({}, f), { id: a }), i);
93
88
  });
94
89
  }), t.start && t.start();
95
90
  }
96
- function _(e) {
91
+ function X(e) {
97
92
  return e.constructor.name === "MessagePort";
98
93
  }
99
- function O(e) {
100
- _(e) && e.close();
94
+ function F(e) {
95
+ X(e) && e.close();
101
96
  }
102
- function D(e, t) {
97
+ function v(e, t) {
103
98
  const n = /* @__PURE__ */ new Map();
104
- return e.addEventListener("message", function(r) {
105
- const { data: a } = r;
99
+ return e.addEventListener("message", function(o) {
100
+ const { data: a } = o;
106
101
  if (!a || !a.id)
107
102
  return;
108
103
  const g = n.get(a.id);
@@ -112,112 +107,112 @@ function D(e, t) {
112
107
  } finally {
113
108
  n.delete(a.id);
114
109
  }
115
- }), P(e, n, [], t);
110
+ }), _(e, n, [], t);
116
111
  }
117
- function b(e) {
112
+ function h(e) {
118
113
  if (e)
119
114
  throw new Error("Proxy has been released and is not useable");
120
115
  }
121
- function W(e) {
116
+ function V(e) {
122
117
  return m(e, /* @__PURE__ */ new Map(), {
123
118
  type: "RELEASE"
124
119
  }).then(() => {
125
- O(e);
120
+ F(e);
126
121
  });
127
122
  }
128
- const E = /* @__PURE__ */ new WeakMap(), p = "FinalizationRegistry" in globalThis && new FinalizationRegistry((e) => {
129
- const t = (E.get(e) || 0) - 1;
130
- E.set(e, t), t === 0 && W(e);
123
+ const C = /* @__PURE__ */ new WeakMap(), O = "FinalizationRegistry" in globalThis && new FinalizationRegistry((e) => {
124
+ const t = (C.get(e) || 0) - 1;
125
+ C.set(e, t), t === 0 && V(e);
131
126
  });
132
- function F(e, t) {
133
- const n = (E.get(t) || 0) + 1;
134
- E.set(t, n), p && p.register(e, t, e);
127
+ function K(e, t) {
128
+ const n = (C.get(t) || 0) + 1;
129
+ C.set(t, n), O && O.register(e, t, e);
135
130
  }
136
- function j(e) {
137
- p && p.unregister(e);
131
+ function Q(e) {
132
+ O && O.unregister(e);
138
133
  }
139
- function P(e, t, n = [], y = function() {
134
+ function _(e, t, n = [], d = function() {
140
135
  }) {
141
- let r = !1;
142
- const a = new Proxy(y, {
143
- get(g, c) {
144
- if (b(r), c === H)
136
+ let o = !1;
137
+ const a = new Proxy(d, {
138
+ get(g, l) {
139
+ if (h(o), l === B)
145
140
  return () => {
146
- j(a), W(e), t.clear(), r = !0;
141
+ Q(a), V(e), t.clear(), o = !0;
147
142
  };
148
- if (c === "then") {
143
+ if (l === "then") {
149
144
  if (n.length === 0)
150
145
  return { then: () => a };
151
146
  const u = m(e, t, {
152
147
  type: "GET",
153
148
  path: n.map((s) => s.toString())
154
- }).then(d);
149
+ }).then(y);
155
150
  return u.then.bind(u);
156
151
  }
157
- return P(e, t, [...n, c]);
152
+ return _(e, t, [...n, l]);
158
153
  },
159
- set(g, c, u) {
160
- b(r);
161
- const [s, o] = S(u);
154
+ set(g, l, u) {
155
+ h(o);
156
+ const [s, c] = P(u);
162
157
  return m(e, t, {
163
158
  type: "SET",
164
- path: [...n, c].map((f) => f.toString()),
159
+ path: [...n, l].map((f) => f.toString()),
165
160
  value: s
166
- }, o).then(d);
161
+ }, c).then(y);
167
162
  },
168
- apply(g, c, u) {
169
- b(r);
163
+ apply(g, l, u) {
164
+ h(o);
170
165
  const s = n[n.length - 1];
171
- if (s === N)
166
+ if (s === $)
172
167
  return m(e, t, {
173
168
  type: "ENDPOINT"
174
- }).then(d);
169
+ }).then(y);
175
170
  if (s === "bind")
176
- return P(e, t, n.slice(0, -1));
177
- const [o, f] = x(u);
171
+ return _(e, t, n.slice(0, -1));
172
+ const [c, f] = I(u);
178
173
  return m(e, t, {
179
174
  type: "APPLY",
180
175
  path: n.map((i) => i.toString()),
181
- argumentList: o
182
- }, f).then(d);
176
+ argumentList: c
177
+ }, f).then(y);
183
178
  },
184
- construct(g, c) {
185
- b(r);
186
- const [u, s] = x(c);
179
+ construct(g, l) {
180
+ h(o);
181
+ const [u, s] = I(l);
187
182
  return m(e, t, {
188
183
  type: "CONSTRUCT",
189
- path: n.map((o) => o.toString()),
184
+ path: n.map((c) => c.toString()),
190
185
  argumentList: u
191
- }, s).then(d);
186
+ }, s).then(y);
192
187
  }
193
188
  });
194
- return F(a, e), a;
189
+ return K(a, e), a;
195
190
  }
196
- function U(e) {
191
+ function Z(e) {
197
192
  return Array.prototype.concat.apply([], e);
198
193
  }
199
- function x(e) {
200
- const t = e.map(S);
201
- return [t.map((n) => n[0]), U(t.map((n) => n[1]))];
194
+ function I(e) {
195
+ const t = e.map(P);
196
+ return [t.map((n) => n[0]), Z(t.map((n) => n[1]))];
202
197
  }
203
- const z = /* @__PURE__ */ new WeakMap();
204
- function G(e, t) {
205
- return z.set(e, t), e;
198
+ const U = /* @__PURE__ */ new WeakMap();
199
+ function ee(e, t) {
200
+ return U.set(e, t), e;
206
201
  }
207
- function Y(e) {
208
- return Object.assign(e, { [T]: !0 });
202
+ function te(e) {
203
+ return Object.assign(e, { [L]: !0 });
209
204
  }
210
- function S(e) {
211
- for (const [t, n] of R)
205
+ function P(e) {
206
+ for (const [t, n] of D)
212
207
  if (n.canHandle(e)) {
213
- const [y, r] = n.serialize(e);
208
+ const [d, o] = n.serialize(e);
214
209
  return [
215
210
  {
216
211
  type: "HANDLER",
217
212
  name: t,
218
- value: y
213
+ value: d
219
214
  },
220
- r
215
+ o
221
216
  ];
222
217
  }
223
218
  return [
@@ -225,50 +220,114 @@ function S(e) {
225
220
  type: "RAW",
226
221
  value: e
227
222
  },
228
- z.get(e) || []
223
+ U.get(e) || []
229
224
  ];
230
225
  }
231
- function d(e) {
226
+ function y(e) {
232
227
  switch (e.type) {
233
228
  case "HANDLER":
234
- return R.get(e.name).deserialize(e.value);
229
+ return D.get(e.name).deserialize(e.value);
235
230
  case "RAW":
236
231
  return e.value;
237
232
  }
238
233
  }
239
- function m(e, t, n, y) {
240
- return new Promise((r) => {
241
- const a = q();
242
- t.set(a, r), e.start && e.start(), e.postMessage(Object.assign({ id: a }, n), y);
234
+ function m(e, t, n, d) {
235
+ return new Promise((o) => {
236
+ const a = ne();
237
+ t.set(a, o), e.start && e.start(), e.postMessage(Object.assign({ id: a }, n), d);
243
238
  });
244
239
  }
245
- function q() {
240
+ function ne() {
246
241
  return new Array(4).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join("-");
247
242
  }
248
- let l = null, A = null;
249
- const v = {
243
+ let r = null, W = null, j = null, M = null, N = 0;
244
+ const re = 3e4, oe = 6e4;
245
+ let A = null, E = 0, p = null;
246
+ const T = 5, se = 3e3;
247
+ function ae() {
248
+ w(), M = setInterval(() => {
249
+ if (!r || r.readyState !== WebSocket.OPEN) {
250
+ w();
251
+ return;
252
+ }
253
+ if (N > 0 && Date.now() - N > oe) {
254
+ console.warn("[WS] Heartbeat timeout — closing connection"), w(), r.close(1001, "Heartbeat timeout");
255
+ return;
256
+ }
257
+ try {
258
+ r.send(JSON.stringify({ type: "ping" }));
259
+ } catch (e) {
260
+ console.error("[WS] Failed to send heartbeat:", e);
261
+ }
262
+ }, re);
263
+ }
264
+ function w() {
265
+ M && (clearInterval(M), M = null);
266
+ }
267
+ function S(e) {
268
+ j?.(e);
269
+ }
270
+ function ce() {
271
+ if (!p || E >= T) {
272
+ E >= T && (console.error(
273
+ `[WS] Max reconnect attempts (${T}) reached`
274
+ ), S("failed"));
275
+ return;
276
+ }
277
+ E++, console.log(
278
+ `[WS] Reconnecting (${E}/${T})...`
279
+ ), S("reconnecting"), A = setTimeout(() => {
280
+ p && G.connect(p);
281
+ }, se);
282
+ }
283
+ const G = {
250
284
  async connect(e) {
251
- l || (l = new WebSocket(e), l.binaryType = "arraybuffer", l.onopen = () => console.log("[WS] Connected:", e), l.onmessage = (t) => {
285
+ r && r.readyState === WebSocket.OPEN || (r && (r.onclose = null, r.close(), r = null), p = e, r = new WebSocket(e), r.binaryType = "arraybuffer", r.onopen = () => {
286
+ console.log("[WS] Connected:", e), E = 0, N = Date.now(), ae(), S("connected");
287
+ }, r.onmessage = (t) => {
252
288
  try {
253
- console.log("[WS] Received binary message"), t.data instanceof ArrayBuffer && A?.(t.data);
289
+ if (typeof t.data == "string")
290
+ try {
291
+ if (JSON.parse(t.data).type === "pong") {
292
+ N = Date.now();
293
+ return;
294
+ }
295
+ } catch {
296
+ }
297
+ t.data instanceof ArrayBuffer, W?.(t.data);
254
298
  } catch (n) {
255
299
  console.error("[WS] Failed to forward message", n);
256
300
  }
257
- }, l.onerror = (t) => console.error("[WS] Error:", t), l.onclose = () => {
258
- console.log("[WS] Disconnected"), l = null;
301
+ }, r.onerror = (t) => {
302
+ console.error("[WS] Error:", t), S("error");
303
+ }, r.onclose = (t) => {
304
+ console.log("[WS] Disconnected:", t.code, t.reason), r = null, w(), S("disconnected"), t.code !== 1e3 && ce();
259
305
  });
260
306
  },
261
307
  async send(e) {
262
- l?.readyState === WebSocket.OPEN ? l.send(e) : console.warn("[WS] Tried to send while disconnected");
308
+ r?.readyState === WebSocket.OPEN ? r.send(e) : console.warn("[WS] Tried to send while disconnected");
263
309
  },
264
310
  async close() {
265
- l?.close(), l = null;
311
+ A && (clearTimeout(A), A = null), w(), E = 0, p = null, r?.close(1e3, "Client request"), r = null, S("disconnected");
266
312
  },
267
313
  onMessage(e) {
268
- A = e;
314
+ W = e;
315
+ },
316
+ onStatus(e) {
317
+ j = e;
318
+ },
319
+ async getStatus() {
320
+ return r ? {
321
+ [WebSocket.CONNECTING]: "connecting",
322
+ [WebSocket.OPEN]: "connected",
323
+ [WebSocket.CLOSING]: "closing",
324
+ [WebSocket.CLOSED]: "disconnected"
325
+ }[r.readyState] || "unknown" : "disconnected";
269
326
  }
270
- };
327
+ }, x = /* @__PURE__ */ new Set();
271
328
  self.onconnect = (e) => {
272
- const t = e.ports[0];
273
- t.start(), M(v, t);
329
+ const t = e.ports[0], n = x.size === 0;
330
+ x.add(t), t.start(), t.postMessage({ type: n ? "first-connect" : "reconnect" }), t.addEventListener("message", (d) => {
331
+ d.data?.type === "close" && x.delete(t);
332
+ }), H(G, t);
274
333
  };