@flaxia/node 0.3.7 → 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 (93) hide show
  1. package/README.md +43 -19
  2. package/dist/__tests__/consent-policy.test.d.ts +2 -0
  3. package/dist/__tests__/consent-policy.test.d.ts.map +1 -0
  4. package/dist/assets/VectorStoreEngine.js +140 -85
  5. package/dist/assets/ai-inference.js +173 -33
  6. package/dist/assets/container.js +368 -260
  7. package/dist/assets/dist.js +209 -0
  8. package/dist/assets/egress-guard.js +174 -0
  9. package/dist/assets/image-process.js +184 -19
  10. package/dist/assets/nudenet.js +2 -2
  11. package/dist/client/SignalingClient.d.ts +6 -0
  12. package/dist/client/SignalingClient.d.ts.map +1 -1
  13. package/dist/consent/ConsentUI.d.ts +44 -5
  14. package/dist/consent/ConsentUI.d.ts.map +1 -1
  15. package/dist/consent/notice.d.ts +29 -0
  16. package/dist/consent/notice.d.ts.map +1 -0
  17. package/dist/consent/storage.d.ts +91 -7
  18. package/dist/consent/storage.d.ts.map +1 -1
  19. package/dist/executor/WorkerPool.d.ts +35 -1
  20. package/dist/executor/WorkerPool.d.ts.map +1 -1
  21. package/dist/executor/__tests__/WorkerPool.swarm.test.d.ts +13 -0
  22. package/dist/executor/__tests__/WorkerPool.swarm.test.d.ts.map +1 -0
  23. package/dist/executor/__tests__/container-executor.test.d.ts +2 -0
  24. package/dist/executor/__tests__/container-executor.test.d.ts.map +1 -0
  25. package/dist/executor/__tests__/egress-guard.test.d.ts +2 -0
  26. package/dist/executor/__tests__/egress-guard.test.d.ts.map +1 -0
  27. package/dist/executor/__tests__/webgpuProbe.test.d.ts +2 -0
  28. package/dist/executor/__tests__/webgpuProbe.test.d.ts.map +1 -0
  29. package/dist/executor/container-executor.d.ts +49 -1
  30. package/dist/executor/container-executor.d.ts.map +1 -1
  31. package/dist/executor/egress-guard.d.ts +105 -0
  32. package/dist/executor/egress-guard.d.ts.map +1 -0
  33. package/dist/executor/memoryProbe.d.ts +25 -0
  34. package/dist/executor/memoryProbe.d.ts.map +1 -1
  35. package/dist/executor/throttle.d.ts +62 -4
  36. package/dist/executor/throttle.d.ts.map +1 -1
  37. package/dist/executor/webgpuProbe.d.ts +9 -0
  38. package/dist/executor/webgpuProbe.d.ts.map +1 -0
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +766 -230
  42. package/dist/swarm/__tests__/adapter.test.d.ts +2 -0
  43. package/dist/swarm/__tests__/adapter.test.d.ts.map +1 -0
  44. package/dist/swarm/__tests__/controller.test.d.ts +2 -0
  45. package/dist/swarm/__tests__/controller.test.d.ts.map +1 -0
  46. package/dist/swarm/__tests__/defects.test.d.ts +16 -0
  47. package/dist/swarm/__tests__/defects.test.d.ts.map +1 -0
  48. package/dist/swarm/__tests__/hardening.test.d.ts +2 -0
  49. package/dist/swarm/__tests__/hardening.test.d.ts.map +1 -0
  50. package/dist/swarm/__tests__/runtime.test.d.ts +2 -0
  51. package/dist/swarm/__tests__/runtime.test.d.ts.map +1 -0
  52. package/dist/swarm/__tests__/session.test.d.ts +2 -0
  53. package/dist/swarm/__tests__/session.test.d.ts.map +1 -0
  54. package/dist/swarm/adapter.d.ts +115 -0
  55. package/dist/swarm/adapter.d.ts.map +1 -0
  56. package/dist/swarm/controller.d.ts +87 -0
  57. package/dist/swarm/controller.d.ts.map +1 -0
  58. package/dist/swarm/messages.d.ts +41 -0
  59. package/dist/swarm/messages.d.ts.map +1 -0
  60. package/dist/swarm/runtime.d.ts +16 -0
  61. package/dist/swarm/runtime.d.ts.map +1 -0
  62. package/dist/swarm/session.d.ts +73 -0
  63. package/dist/swarm/session.d.ts.map +1 -0
  64. package/dist/swarm-engine.js +7477 -0
  65. package/dist/vector-store/HNSWIndex.d.ts +30 -0
  66. package/dist/vector-store/HNSWIndex.d.ts.map +1 -1
  67. package/dist/vector-store/VectorStoreEngine.d.ts +43 -0
  68. package/dist/vector-store/VectorStoreEngine.d.ts.map +1 -1
  69. package/dist/vector-store/__tests__/HNSWIndex.test.d.ts +2 -0
  70. package/dist/vector-store/__tests__/HNSWIndex.test.d.ts.map +1 -0
  71. package/dist/vector-store/__tests__/VectorStoreEngine.test.d.ts +2 -0
  72. package/dist/vector-store/__tests__/VectorStoreEngine.test.d.ts.map +1 -0
  73. package/dist/worker/__tests__/main.worker.abort.test.d.ts +2 -0
  74. package/dist/worker/__tests__/main.worker.abort.test.d.ts.map +1 -0
  75. package/dist/worker/__tests__/main.worker.control.test.d.ts +2 -0
  76. package/dist/worker/__tests__/main.worker.control.test.d.ts.map +1 -0
  77. package/dist/worker.js +643 -67
  78. package/dist/workloads/__tests__/nudenet.test.d.ts +2 -0
  79. package/dist/workloads/__tests__/nudenet.test.d.ts.map +1 -0
  80. package/dist/workloads/ai-inference.d.ts +2 -1
  81. package/dist/workloads/ai-inference.d.ts.map +1 -1
  82. package/dist/workloads/ai-model-registry.d.ts +72 -0
  83. package/dist/workloads/ai-model-registry.d.ts.map +1 -0
  84. package/dist/workloads/container.d.ts +1 -1
  85. package/dist/workloads/container.d.ts.map +1 -1
  86. package/dist/workloads/image-process.d.ts +27 -0
  87. package/dist/workloads/image-process.d.ts.map +1 -1
  88. package/dist/workloads/nudenet.d.ts +8 -0
  89. package/dist/workloads/nudenet.d.ts.map +1 -1
  90. package/package.json +3 -2
  91. package/dist/assets/memoryProbe.js +0 -28
  92. package/dist/client/WebRTCPeer.d.ts +0 -8
  93. package/dist/client/WebRTCPeer.d.ts.map +0 -1
@@ -1,6 +1,107 @@
1
1
  import { TextStreamer as e, env as t, pipeline as n } from "./transformers.web.js";
2
+ //#region src/workloads/ai-model-registry.ts
3
+ var r = 512 * 1024 * 1024, i = 4 * 1024 ** 3, a = new Map(Object.entries({
4
+ "Xenova/bert-base-multilingual-uncased-sentiment": {
5
+ repo: "Xenova/bert-base-multilingual-uncased-sentiment",
6
+ revision: "main",
7
+ maxBytes: r
8
+ },
9
+ "onnx-community/Qwen3-Embedding-0.6B-ONNX": {
10
+ repo: "onnx-community/Qwen3-Embedding-0.6B-ONNX",
11
+ revision: "main",
12
+ maxBytes: r
13
+ }
14
+ }).map(([e, t]) => [e, { ...t }])), o = [
15
+ "wasm",
16
+ "cpu",
17
+ "webgpu"
18
+ ], s = [
19
+ "q4",
20
+ "q4f16",
21
+ "q8",
22
+ "int8",
23
+ "uint8"
24
+ ], c = {
25
+ max_new_tokens: {
26
+ min: 1,
27
+ max: 1024
28
+ },
29
+ temperature: {
30
+ min: 0,
31
+ max: 4
32
+ },
33
+ top_p: {
34
+ min: 0,
35
+ max: 1
36
+ },
37
+ top_k: {
38
+ min: 0,
39
+ max: 1e3
40
+ },
41
+ repetition_penalty: {
42
+ min: 0,
43
+ max: 4
44
+ }
45
+ }, l = 1e5;
46
+ function u() {
47
+ return [...a.keys()];
48
+ }
49
+ function d(e) {
50
+ if (typeof e != "string" || !e) throw Error(`ai-inference: model must be a non-empty string, got ${JSON.stringify(e)}`);
51
+ let t = a.get(e);
52
+ if (!t) throw Error(`ai-inference: model not allowed: ${e} (allowed: ${u().join(", ") || "none"})`);
53
+ return t;
54
+ }
55
+ function f(e) {
56
+ if (e != null) {
57
+ if (typeof e != "string" || !o.includes(e)) throw Error(`ai-inference: device not allowed: ${JSON.stringify(e)} (allowed: ${o.join(", ")})`);
58
+ return e;
59
+ }
60
+ }
61
+ function p(e) {
62
+ if (e != null) {
63
+ if (typeof e != "string" || !s.includes(e)) throw Error(`ai-inference: dtype not allowed: ${JSON.stringify(e)} (allowed: ${s.join(", ")})`);
64
+ return e;
65
+ }
66
+ }
67
+ function m(e) {
68
+ if (typeof e == "string") {
69
+ if (e.length > 1e5) throw Error(`ai-inference: input exceeds ${l} characters`);
70
+ return e;
71
+ }
72
+ if (Array.isArray(e)) {
73
+ if (e.length === 0 || e.length > 64) throw Error("ai-inference: input array must hold 1..64 items");
74
+ for (let t of e) {
75
+ if (typeof t != "string") throw Error("ai-inference: input array items must be strings");
76
+ if (t.length > 1e5) throw Error(`ai-inference: input exceeds ${l} characters`);
77
+ }
78
+ return e;
79
+ }
80
+ throw Error("ai-inference: input must be a string or an array of strings");
81
+ }
82
+ function h(e, t) {
83
+ for (let [n, r] of Object.entries(c)) {
84
+ let i = t[n];
85
+ if (i != null) {
86
+ if (typeof i != "number" || !Number.isFinite(i) || i < r.min || i > r.max) throw Error(`ai-inference: option ${n} must be a number within ${r.min}..${r.max}, got ${JSON.stringify(i)}`);
87
+ e[n] = i;
88
+ }
89
+ }
90
+ if (t.do_sample !== void 0) {
91
+ if (typeof t.do_sample != "boolean") throw Error("ai-inference: option do_sample must be a boolean");
92
+ e.do_sample = t.do_sample;
93
+ }
94
+ for (let n of ["src_lang", "tgt_lang"]) {
95
+ let r = t[n];
96
+ if (r != null) {
97
+ if (typeof r != "string" || !/^[a-z]{2,3}(_[A-Za-z0-9]{2,8})?$/.test(r)) throw Error(`ai-inference: option ${n} must be a language code like 'en_XX'`);
98
+ e[n] = r;
99
+ }
100
+ }
101
+ }
102
+ //#endregion
2
103
  //#region src/workloads/ai-inference.ts
3
- var r = [
104
+ var g = [
4
105
  "text-classification",
5
106
  "token-classification",
6
107
  "question-answering",
@@ -26,51 +127,90 @@ var r = [
26
127
  "depth-estimation",
27
128
  "feature-extraction",
28
129
  "image-feature-extraction"
29
- ], i = /* @__PURE__ */ new Map(), a = 2, o = () => {
30
- i.clear();
31
- }, s = (e, t) => {
32
- if (!t.tokenBuffer) return e;
33
- let n = "", r = null, i = t.tokenBufferIntervalMs ?? 50, a = () => {
34
- n &&= (e(n), ""), r = null;
130
+ ], _ = /* @__PURE__ */ new Map(), v = 2, y = () => {
131
+ _.clear();
132
+ }, b = (e, t) => {
133
+ let n = "", r = null, i = Promise.resolve(), a, o = !1, s = !1, c = (t) => {
134
+ i = i.then(() => {
135
+ if (!o) return e(t);
136
+ }).then(() => void 0, (e) => {
137
+ o = !0, a = e;
138
+ });
139
+ }, l = () => {
140
+ r !== null && clearTimeout(r), r = null;
141
+ let e = n;
142
+ n = "", e && !o && c(e);
143
+ }, u = (e) => {
144
+ if (!s) {
145
+ if (o) throw a;
146
+ if (!t.tokenBuffer) {
147
+ c(e);
148
+ return;
149
+ }
150
+ n += e, r === null && (r = setTimeout(l, t.tokenBufferIntervalMs ?? 50));
151
+ }
152
+ }, d = async (e) => {
153
+ if (s = !0, r !== null && clearTimeout(r), r = null, e && !o ? l() : n = "", await i, o) throw a;
35
154
  };
36
- return (e) => {
37
- n += e, r ||= setTimeout(a, i);
155
+ return {
156
+ callback: u,
157
+ finish: () => d(!0),
158
+ cancel: () => d(!1)
38
159
  };
39
160
  };
40
- t.backends?.onnx?.wasm && (t.backends.onnx.wasm.numThreads = 1, t.backends.onnx.wasm.proxy = !1);
41
- var c = async (t, o) => {
42
- let { task: c, model: l, input: u, options: d = {} } = t;
43
- if (!r.includes(c)) throw Error(`Invalid or unsupported task: ${c}. Supported tasks are: ${r.join(", ")}`);
44
- let f = `${c}:${l}`, p = i.get(f);
45
- if (!p) {
46
- if (i.size >= a) {
47
- let e = i.keys().next().value;
48
- i.delete(e);
161
+ function x() {
162
+ let e = globalThis.fetch.bind(globalThis);
163
+ t.fetch = async (t, n) => {
164
+ let r = new URL(String(t));
165
+ if (!/(^|\.)huggingface\.co$/.test(r.hostname) && !/(^|\.)hf\.co$/.test(r.hostname)) throw Error(`ai-inference: model download blocked from ${r.hostname}`);
166
+ let a = await e(r, n), o = Number(a.headers.get("content-length"));
167
+ if (Number.isFinite(o) && o > i) throw Error(`ai-inference: model file too large (${o} bytes > ${i})`);
168
+ return a;
169
+ };
170
+ }
171
+ x(), t.backends?.onnx?.wasm && (t.backends.onnx.wasm.numThreads = 1, t.backends.onnx.wasm.proxy = !1);
172
+ var S = async (t, r) => {
173
+ let { task: i, model: a, input: o, options: s = {} } = t;
174
+ if (!g.includes(i)) throw Error(`Invalid or unsupported task: ${i}. Supported tasks are: ${g.join(", ")}`);
175
+ let c = d(a), l = f(s.device), u = p(s.dtype), y = m(o), x = {};
176
+ h(x, s);
177
+ let S = `${i}:${c.repo}:${u ?? "q4f16"}:${l ?? "wasm"}`, C = _.get(S);
178
+ if (!C) {
179
+ if (_.size >= v) {
180
+ let e = _.keys().next().value;
181
+ _.delete(e);
49
182
  }
50
183
  let e = {
51
- dtype: d.dtype ?? "q4f16",
52
- device: d.device
184
+ dtype: u ?? "q4f16",
185
+ device: l
53
186
  }, t = performance.now();
54
- console.log(`[flaxia-node] ai-inference: loading pipeline task=${c} model=${l} dtype=${e.dtype} device=${e.device ?? "wasm"}`);
187
+ console.log(`[flaxia-node] ai-inference: loading pipeline task=${i} model=${c.repo} revision=${c.revision} dtype=${e.dtype} device=${l ?? "wasm"}`);
55
188
  try {
56
- p = await n(c, l, e);
189
+ C = await n(i, c.repo, e);
57
190
  } catch (t) {
58
- if (d.device && d.device !== "wasm") console.warn(`[AiInference] ${d.device} failed, falling back to wasm:`, t), e.device = "wasm", p = await n(c, l, e);
59
- else throw console.error(`[flaxia-node] ai-inference: pipeline load FAILED task=${c} model=${l} error=${t instanceof Error ? t.message : String(t)}`), t;
191
+ if (l && l !== "wasm") console.warn(`[AiInference] ${l} failed, falling back to wasm:`, t), e.device = "wasm", C = await n(i, c.repo, e);
192
+ else throw console.error(`[flaxia-node] ai-inference: pipeline load FAILED task=${i} model=${c.repo} error=${t instanceof Error ? t.message : String(t)}`), t;
60
193
  }
61
- console.log(`[flaxia-node] ai-inference: pipeline ready task=${c} model=${l} loadMs=${Math.round(performance.now() - t)}`), i.set(f, p);
194
+ console.log(`[flaxia-node] ai-inference: pipeline ready task=${i} model=${c.repo} loadMs=${Math.round(performance.now() - t)}`), _.set(S, C);
62
195
  }
63
- let m = {
64
- max_new_tokens: d.max_new_tokens ?? 128,
65
- do_sample: d.do_sample ?? !1
196
+ let w = {
197
+ max_new_tokens: x.max_new_tokens ?? 128,
198
+ do_sample: x.do_sample ?? !1
66
199
  };
67
- d.temperature != null && (m.temperature = d.temperature), d.top_p != null && (m.top_p = d.top_p), d.top_k != null && (m.top_k = d.top_k), d.repetition_penalty != null && (m.repetition_penalty = d.repetition_penalty), d.src_lang != null && (m.src_lang = d.src_lang), d.tgt_lang != null && (m.tgt_lang = d.tgt_lang), o && p.tokenizer && (m.streamer = new e(p.tokenizer, {
200
+ for (let [e, t] of Object.entries(x)) e === "max_new_tokens" || e === "do_sample" || (w[e] = t);
201
+ let T = r && C.tokenizer ? b(r, s) : null;
202
+ T && (w.streamer = new e(C.tokenizer, {
68
203
  skip_prompt: !0,
69
204
  skip_special_tokens: !0,
70
- callback_function: s(o, d)
205
+ callback_function: T.callback
71
206
  }));
72
- let h = performance.now(), g = await p(u, m);
73
- return console.log(`[flaxia-node] ai-inference: done task=${c} model=${l} execMs=${Math.round(performance.now() - h)} inputLen=${String(u).length}`), { output: g };
207
+ let E = performance.now(), D;
208
+ try {
209
+ D = await C(y, w);
210
+ } catch (e) {
211
+ throw T && await T.cancel(), e;
212
+ }
213
+ return await T?.finish(), console.log(`[flaxia-node] ai-inference: done task=${i} model=${c.repo} execMs=${Math.round(performance.now() - E)} inputLen=${String(y).length}`), { output: D };
74
214
  };
75
215
  //#endregion
76
- export { c as handleAiInference, o as releaseCache };
216
+ export { S as handleAiInference, y as releaseCache };