edgeflowjs 0.1.0 → 0.2.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 (152) hide show
  1. package/README.md +200 -66
  2. package/dist/backends/index.d.ts +9 -2
  3. package/dist/backends/index.d.ts.map +1 -1
  4. package/dist/backends/index.js +13 -13
  5. package/dist/backends/index.js.map +1 -1
  6. package/dist/backends/onnx.d.ts +11 -4
  7. package/dist/backends/onnx.d.ts.map +1 -1
  8. package/dist/backends/onnx.js +97 -78
  9. package/dist/backends/onnx.js.map +1 -1
  10. package/dist/backends/transformers-adapter.d.ts +99 -0
  11. package/dist/backends/transformers-adapter.d.ts.map +1 -0
  12. package/dist/backends/transformers-adapter.js +171 -0
  13. package/dist/backends/transformers-adapter.js.map +1 -0
  14. package/dist/backends/webgpu.d.ts +7 -5
  15. package/dist/backends/webgpu.d.ts.map +1 -1
  16. package/dist/backends/webgpu.js +7 -5
  17. package/dist/backends/webgpu.js.map +1 -1
  18. package/dist/backends/webnn.d.ts +6 -5
  19. package/dist/backends/webnn.d.ts.map +1 -1
  20. package/dist/backends/webnn.js +6 -5
  21. package/dist/backends/webnn.js.map +1 -1
  22. package/dist/core/composer.d.ts +118 -0
  23. package/dist/core/composer.d.ts.map +1 -0
  24. package/dist/core/composer.js +163 -0
  25. package/dist/core/composer.js.map +1 -0
  26. package/dist/core/device-profiler.d.ts +75 -0
  27. package/dist/core/device-profiler.d.ts.map +1 -0
  28. package/dist/core/device-profiler.js +131 -0
  29. package/dist/core/device-profiler.js.map +1 -0
  30. package/dist/core/index.d.ts +4 -0
  31. package/dist/core/index.d.ts.map +1 -1
  32. package/dist/core/index.js +8 -0
  33. package/dist/core/index.js.map +1 -1
  34. package/dist/core/memory.d.ts +22 -2
  35. package/dist/core/memory.d.ts.map +1 -1
  36. package/dist/core/memory.js +49 -13
  37. package/dist/core/memory.js.map +1 -1
  38. package/dist/core/plugin.d.ts +100 -0
  39. package/dist/core/plugin.d.ts.map +1 -0
  40. package/dist/core/plugin.js +106 -0
  41. package/dist/core/plugin.js.map +1 -0
  42. package/dist/core/runtime.d.ts +4 -0
  43. package/dist/core/runtime.d.ts.map +1 -1
  44. package/dist/core/runtime.js +18 -0
  45. package/dist/core/runtime.js.map +1 -1
  46. package/dist/core/scheduler.d.ts +17 -0
  47. package/dist/core/scheduler.d.ts.map +1 -1
  48. package/dist/core/scheduler.js +101 -3
  49. package/dist/core/scheduler.js.map +1 -1
  50. package/dist/core/types.d.ts +14 -0
  51. package/dist/core/types.d.ts.map +1 -1
  52. package/dist/core/types.js.map +1 -1
  53. package/dist/core/worker.d.ts +202 -0
  54. package/dist/core/worker.d.ts.map +1 -0
  55. package/dist/core/worker.js +477 -0
  56. package/dist/core/worker.js.map +1 -0
  57. package/dist/edgeflow.browser.js +9770 -4383
  58. package/dist/edgeflow.browser.js.map +4 -4
  59. package/dist/edgeflow.browser.min.js +435 -5
  60. package/dist/edgeflow.browser.min.js.map +4 -4
  61. package/dist/index.d.ts +7 -4
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +28 -10
  64. package/dist/index.js.map +1 -1
  65. package/dist/pipelines/automatic-speech-recognition.d.ts +63 -0
  66. package/dist/pipelines/automatic-speech-recognition.d.ts.map +1 -0
  67. package/dist/pipelines/automatic-speech-recognition.js +269 -0
  68. package/dist/pipelines/automatic-speech-recognition.js.map +1 -0
  69. package/dist/pipelines/base.d.ts +6 -1
  70. package/dist/pipelines/base.d.ts.map +1 -1
  71. package/dist/pipelines/base.js +12 -2
  72. package/dist/pipelines/base.js.map +1 -1
  73. package/dist/pipelines/feature-extraction.d.ts +5 -40
  74. package/dist/pipelines/feature-extraction.d.ts.map +1 -1
  75. package/dist/pipelines/feature-extraction.js +44 -63
  76. package/dist/pipelines/feature-extraction.js.map +1 -1
  77. package/dist/pipelines/image-classification.d.ts +4 -36
  78. package/dist/pipelines/image-classification.d.ts.map +1 -1
  79. package/dist/pipelines/image-classification.js +22 -60
  80. package/dist/pipelines/image-classification.js.map +1 -1
  81. package/dist/pipelines/image-segmentation.d.ts +221 -0
  82. package/dist/pipelines/image-segmentation.d.ts.map +1 -0
  83. package/dist/pipelines/image-segmentation.js +535 -0
  84. package/dist/pipelines/image-segmentation.js.map +1 -0
  85. package/dist/pipelines/index.d.ts +18 -0
  86. package/dist/pipelines/index.d.ts.map +1 -1
  87. package/dist/pipelines/index.js +51 -2
  88. package/dist/pipelines/index.js.map +1 -1
  89. package/dist/pipelines/object-detection.d.ts +44 -0
  90. package/dist/pipelines/object-detection.d.ts.map +1 -0
  91. package/dist/pipelines/object-detection.js +218 -0
  92. package/dist/pipelines/object-detection.js.map +1 -0
  93. package/dist/pipelines/question-answering.d.ts +41 -0
  94. package/dist/pipelines/question-answering.d.ts.map +1 -0
  95. package/dist/pipelines/question-answering.js +164 -0
  96. package/dist/pipelines/question-answering.js.map +1 -0
  97. package/dist/pipelines/text-classification.d.ts +3 -39
  98. package/dist/pipelines/text-classification.d.ts.map +1 -1
  99. package/dist/pipelines/text-classification.js +29 -67
  100. package/dist/pipelines/text-classification.js.map +1 -1
  101. package/dist/pipelines/text-generation.d.ts +281 -0
  102. package/dist/pipelines/text-generation.d.ts.map +1 -0
  103. package/dist/pipelines/text-generation.js +766 -0
  104. package/dist/pipelines/text-generation.js.map +1 -0
  105. package/dist/pipelines/zero-shot-classification.d.ts +45 -0
  106. package/dist/pipelines/zero-shot-classification.d.ts.map +1 -0
  107. package/dist/pipelines/zero-shot-classification.js +140 -0
  108. package/dist/pipelines/zero-shot-classification.js.map +1 -0
  109. package/dist/tools/benchmark.d.ts +92 -0
  110. package/dist/tools/benchmark.d.ts.map +1 -0
  111. package/dist/tools/benchmark.js +213 -0
  112. package/dist/tools/benchmark.js.map +1 -0
  113. package/dist/tools/debugger.d.ts +258 -0
  114. package/dist/tools/debugger.d.ts.map +1 -0
  115. package/dist/tools/debugger.js +624 -0
  116. package/dist/tools/debugger.js.map +1 -0
  117. package/dist/tools/index.d.ts +8 -0
  118. package/dist/tools/index.d.ts.map +1 -1
  119. package/dist/tools/index.js +16 -0
  120. package/dist/tools/index.js.map +1 -1
  121. package/dist/tools/monitor.d.ts +284 -0
  122. package/dist/tools/monitor.d.ts.map +1 -0
  123. package/dist/tools/monitor.js +921 -0
  124. package/dist/tools/monitor.js.map +1 -0
  125. package/dist/tools/quantization.d.ts +235 -0
  126. package/dist/tools/quantization.d.ts.map +1 -0
  127. package/dist/tools/quantization.js +830 -0
  128. package/dist/tools/quantization.js.map +1 -0
  129. package/dist/utils/hub.d.ts +162 -0
  130. package/dist/utils/hub.d.ts.map +1 -0
  131. package/dist/utils/hub.js +311 -0
  132. package/dist/utils/hub.js.map +1 -0
  133. package/dist/utils/index.d.ts +3 -1
  134. package/dist/utils/index.d.ts.map +1 -1
  135. package/dist/utils/index.js +5 -1
  136. package/dist/utils/index.js.map +1 -1
  137. package/dist/utils/model-loader.d.ts.map +1 -1
  138. package/dist/utils/model-loader.js +106 -30
  139. package/dist/utils/model-loader.js.map +1 -1
  140. package/dist/utils/offline.d.ts +147 -0
  141. package/dist/utils/offline.d.ts.map +1 -0
  142. package/dist/utils/offline.js +405 -0
  143. package/dist/utils/offline.js.map +1 -0
  144. package/dist/utils/preprocessor.d.ts +82 -6
  145. package/dist/utils/preprocessor.d.ts.map +1 -1
  146. package/dist/utils/preprocessor.js +278 -21
  147. package/dist/utils/preprocessor.js.map +1 -1
  148. package/dist/utils/tokenizer.d.ts +197 -72
  149. package/dist/utils/tokenizer.d.ts.map +1 -1
  150. package/dist/utils/tokenizer.js +558 -274
  151. package/dist/utils/tokenizer.js.map +1 -1
  152. package/package.json +26 -11
@@ -0,0 +1,477 @@
1
+ /**
2
+ * edgeFlow.js - Web Worker Support
3
+ *
4
+ * Run inference in a Web Worker to avoid blocking the main thread.
5
+ */
6
+ // ============================================================================
7
+ // Tensor Serialization
8
+ // ============================================================================
9
+ /**
10
+ * Serialize a tensor for transfer to worker
11
+ */
12
+ export function serializeTensor(tensor) {
13
+ const data = tensor.toFloat32Array();
14
+ // Create a copy of the ArrayBuffer
15
+ const buffer = new ArrayBuffer(data.byteLength);
16
+ new Float32Array(buffer).set(data);
17
+ return {
18
+ data: buffer,
19
+ shape: [...tensor.shape],
20
+ dtype: tensor.dtype,
21
+ };
22
+ }
23
+ /**
24
+ * Deserialize a tensor from worker.
25
+ * Uses a lazy import to avoid circular dependency issues.
26
+ */
27
+ export async function deserializeTensor(serialized) {
28
+ const { EdgeFlowTensor } = await import('./tensor.js');
29
+ const data = new Float32Array(serialized.data);
30
+ return new EdgeFlowTensor(data, serialized.shape, serialized.dtype);
31
+ }
32
+ /**
33
+ * Synchronous deserialisation used internally where async is not feasible.
34
+ * Requires EdgeFlowTensor to be passed in to avoid require().
35
+ */
36
+ export function deserializeTensorSync(serialized, TensorClass) {
37
+ const data = new Float32Array(serialized.data);
38
+ return new TensorClass(data, serialized.shape, serialized.dtype);
39
+ }
40
+ const MAX_RESTART_ATTEMPTS = 3;
41
+ const RESTART_BASE_DELAY_MS = 1000;
42
+ /**
43
+ * InferenceWorker - Wrapper for a single Web Worker with auto-restart
44
+ */
45
+ export class InferenceWorker {
46
+ worker = null;
47
+ pendingRequests = new Map();
48
+ isReady = false;
49
+ readyPromise;
50
+ readyResolve;
51
+ workerUrl;
52
+ _health = 'alive';
53
+ restartAttempts = 0;
54
+ constructor(workerUrl) {
55
+ this.workerUrl = workerUrl;
56
+ this.readyPromise = new Promise(resolve => {
57
+ this.readyResolve = resolve;
58
+ });
59
+ this.initWorker(workerUrl);
60
+ }
61
+ get health() {
62
+ return this._health;
63
+ }
64
+ /**
65
+ * Initialize the worker
66
+ */
67
+ initWorker(workerUrl) {
68
+ const url = workerUrl ?? this.createWorkerBlob();
69
+ this.worker = new Worker(url, { type: 'module' });
70
+ this.worker.onmessage = (event) => {
71
+ this.handleMessage(event.data);
72
+ };
73
+ this.worker.onerror = (error) => {
74
+ console.error('Worker error:', error);
75
+ this.handleCrash();
76
+ };
77
+ this.worker.onmessageerror = () => {
78
+ this.handleCrash();
79
+ };
80
+ }
81
+ /**
82
+ * Handle worker crash: reject pending, mark dead, attempt restart
83
+ */
84
+ handleCrash() {
85
+ this._health = 'dead';
86
+ this.isReady = false;
87
+ const crashError = new Error('Worker crashed');
88
+ for (const [, { reject }] of this.pendingRequests) {
89
+ reject(crashError);
90
+ }
91
+ this.pendingRequests.clear();
92
+ this.attemptRestart();
93
+ }
94
+ /**
95
+ * Restart the worker with exponential backoff
96
+ */
97
+ attemptRestart() {
98
+ if (this.restartAttempts >= MAX_RESTART_ATTEMPTS) {
99
+ console.error(`Worker failed to restart after ${MAX_RESTART_ATTEMPTS} attempts`);
100
+ return;
101
+ }
102
+ this._health = 'restarting';
103
+ const delay = RESTART_BASE_DELAY_MS * Math.pow(2, this.restartAttempts);
104
+ this.restartAttempts++;
105
+ setTimeout(() => {
106
+ this.restart();
107
+ }, delay);
108
+ }
109
+ /**
110
+ * Restart: terminate old, create new
111
+ */
112
+ restart() {
113
+ if (this.worker) {
114
+ try {
115
+ this.worker.terminate();
116
+ }
117
+ catch { /* already dead */ }
118
+ this.worker = null;
119
+ }
120
+ this.readyPromise = new Promise(resolve => {
121
+ this.readyResolve = resolve;
122
+ });
123
+ this.isReady = false;
124
+ try {
125
+ this.initWorker(this.workerUrl);
126
+ this._health = 'alive';
127
+ this.restartAttempts = 0;
128
+ }
129
+ catch {
130
+ this._health = 'dead';
131
+ this.attemptRestart();
132
+ }
133
+ }
134
+ /**
135
+ * Create worker code as blob URL
136
+ */
137
+ createWorkerBlob() {
138
+ const workerCode = `
139
+ // edgeFlow.js Worker
140
+ let models = new Map();
141
+ let ort = null;
142
+
143
+ // Load ONNX Runtime
144
+ async function loadOrt() {
145
+ if (ort) return ort;
146
+ ort = await import('https://cdn.jsdelivr.net/npm/onnxruntime-web@1.17.0/dist/esm/ort.min.js');
147
+ return ort;
148
+ }
149
+
150
+ // Handle messages
151
+ self.onmessage = async (event) => {
152
+ const { id, type, payload } = event.data;
153
+
154
+ try {
155
+ switch (type) {
156
+ case 'init': {
157
+ await loadOrt();
158
+ self.postMessage({ id, type: 'ready' });
159
+ break;
160
+ }
161
+
162
+ case 'load_model': {
163
+ await loadOrt();
164
+ const { url, options } = payload;
165
+ const response = await fetch(url);
166
+ const arrayBuffer = await response.arrayBuffer();
167
+ const session = await ort.InferenceSession.create(
168
+ new Uint8Array(arrayBuffer),
169
+ { executionProviders: ['wasm'] }
170
+ );
171
+ const modelId = 'model_' + Date.now();
172
+ models.set(modelId, session);
173
+ self.postMessage({
174
+ id,
175
+ type: 'result',
176
+ payload: { modelId }
177
+ });
178
+ break;
179
+ }
180
+
181
+ case 'run_inference': {
182
+ const { modelId, inputs } = payload;
183
+ const session = models.get(modelId);
184
+ if (!session) {
185
+ throw new Error('Model not found: ' + modelId);
186
+ }
187
+
188
+ // Prepare inputs
189
+ const feeds = {};
190
+ const inputNames = session.inputNames;
191
+ for (let i = 0; i < inputs.length && i < inputNames.length; i++) {
192
+ const input = inputs[i];
193
+ const data = new Float32Array(input.data);
194
+ feeds[inputNames[i]] = new ort.Tensor(input.dtype, data, input.shape);
195
+ }
196
+
197
+ // Run inference
198
+ const results = await session.run(feeds);
199
+
200
+ // Serialize outputs
201
+ const outputs = [];
202
+ for (const name of session.outputNames) {
203
+ const tensor = results[name];
204
+ outputs.push({
205
+ data: tensor.data.buffer.slice(0),
206
+ shape: tensor.dims,
207
+ dtype: tensor.type
208
+ });
209
+ }
210
+
211
+ self.postMessage(
212
+ { id, type: 'result', payload: { outputs } },
213
+ outputs.map(o => o.data)
214
+ );
215
+ break;
216
+ }
217
+
218
+ case 'dispose': {
219
+ const { modelId } = payload;
220
+ const session = models.get(modelId);
221
+ if (session) {
222
+ // session.release(); // Not available in all versions
223
+ models.delete(modelId);
224
+ }
225
+ self.postMessage({ id, type: 'result', payload: { success: true } });
226
+ break;
227
+ }
228
+ }
229
+ } catch (error) {
230
+ self.postMessage({
231
+ id,
232
+ type: 'error',
233
+ payload: { message: error.message }
234
+ });
235
+ }
236
+ };
237
+ `;
238
+ const blob = new Blob([workerCode], { type: 'application/javascript' });
239
+ return URL.createObjectURL(blob);
240
+ }
241
+ /**
242
+ * Handle worker message
243
+ */
244
+ handleMessage(message) {
245
+ if (message.type === 'ready') {
246
+ this.isReady = true;
247
+ this.readyResolve();
248
+ return;
249
+ }
250
+ const request = this.pendingRequests.get(message.id);
251
+ if (!request)
252
+ return;
253
+ this.pendingRequests.delete(message.id);
254
+ if (message.type === 'error') {
255
+ const payload = message.payload;
256
+ request.reject(new Error(payload.message));
257
+ }
258
+ else {
259
+ request.resolve(message.payload);
260
+ }
261
+ }
262
+ /**
263
+ * Send a request to the worker
264
+ */
265
+ async sendRequest(type, payload) {
266
+ if (!this.worker) {
267
+ throw new Error('Worker not initialized');
268
+ }
269
+ const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
270
+ return new Promise((resolve, reject) => {
271
+ this.pendingRequests.set(id, { resolve: resolve, reject });
272
+ const message = { id, type, payload };
273
+ // Transfer ArrayBuffers for efficiency
274
+ const transfers = [];
275
+ if (payload && typeof payload === 'object' && 'inputs' in payload) {
276
+ const inputs = payload.inputs;
277
+ for (const input of inputs) {
278
+ if (input.data instanceof ArrayBuffer) {
279
+ transfers.push(input.data);
280
+ }
281
+ }
282
+ }
283
+ this.worker.postMessage(message, transfers);
284
+ });
285
+ }
286
+ /**
287
+ * Initialize the worker
288
+ */
289
+ async init() {
290
+ if (this.isReady)
291
+ return;
292
+ await this.sendRequest('init');
293
+ await this.readyPromise;
294
+ }
295
+ /**
296
+ * Load a model
297
+ */
298
+ async loadModel(url, options) {
299
+ await this.init();
300
+ const result = await this.sendRequest('load_model', { url, options });
301
+ return result.modelId;
302
+ }
303
+ /**
304
+ * Run inference
305
+ */
306
+ async runInference(modelId, inputs) {
307
+ const serializedInputs = inputs.map(serializeTensor);
308
+ const result = await this.sendRequest('run_inference', { modelId, inputs: serializedInputs });
309
+ return Promise.all(result.outputs.map(deserializeTensor));
310
+ }
311
+ /**
312
+ * Dispose a model
313
+ */
314
+ async dispose(modelId) {
315
+ await this.sendRequest('dispose', { modelId });
316
+ }
317
+ /**
318
+ * Terminate the worker
319
+ */
320
+ terminate() {
321
+ if (this.worker) {
322
+ this.worker.terminate();
323
+ this.worker = null;
324
+ }
325
+ this.pendingRequests.clear();
326
+ }
327
+ }
328
+ // ============================================================================
329
+ // Worker Pool
330
+ // ============================================================================
331
+ /**
332
+ * WorkerPool - Manage multiple workers for parallel inference.
333
+ * Automatically falls back to healthy workers when one is dead.
334
+ */
335
+ export class WorkerPool {
336
+ workers = [];
337
+ currentIndex = 0;
338
+ modelAssignments = new Map();
339
+ poolOptions;
340
+ constructor(options = {}) {
341
+ this.poolOptions = options;
342
+ const numWorkers = options.numWorkers ??
343
+ (typeof navigator !== 'undefined' ? navigator.hardwareConcurrency : 4) ?? 4;
344
+ for (let i = 0; i < numWorkers; i++) {
345
+ this.workers.push(new InferenceWorker(options.workerUrl));
346
+ }
347
+ }
348
+ /**
349
+ * Get next healthy worker (round-robin, skipping dead ones)
350
+ */
351
+ getNextHealthyWorker() {
352
+ const len = this.workers.length;
353
+ for (let attempt = 0; attempt < len; attempt++) {
354
+ const worker = this.workers[this.currentIndex];
355
+ this.currentIndex = (this.currentIndex + 1) % len;
356
+ if (worker.health === 'alive')
357
+ return worker;
358
+ }
359
+ // All dead — try restarting first one and return it
360
+ const worker = this.workers[0];
361
+ if (worker.health === 'dead')
362
+ worker.restart();
363
+ return worker;
364
+ }
365
+ /**
366
+ * Get worker for a specific model, falling back to any healthy worker
367
+ */
368
+ getWorkerForModel(modelId) {
369
+ const index = this.modelAssignments.get(modelId);
370
+ if (index !== undefined) {
371
+ const worker = this.workers[index];
372
+ if (worker.health === 'alive')
373
+ return worker;
374
+ // Assigned worker is dead — pick a healthy one and reassign
375
+ const replacement = this.getNextHealthyWorker();
376
+ this.modelAssignments.set(modelId, this.workers.indexOf(replacement));
377
+ return replacement;
378
+ }
379
+ return this.getNextHealthyWorker();
380
+ }
381
+ /**
382
+ * Replace a worker at a given index with a fresh one
383
+ */
384
+ replaceWorker(index) {
385
+ if (index < 0 || index >= this.workers.length)
386
+ return;
387
+ const old = this.workers[index];
388
+ old.terminate();
389
+ this.workers[index] = new InferenceWorker(this.poolOptions.workerUrl);
390
+ }
391
+ /**
392
+ * Initialize all workers
393
+ */
394
+ async init() {
395
+ await Promise.all(this.workers.map(w => w.init()));
396
+ }
397
+ /**
398
+ * Load a model on a worker
399
+ */
400
+ async loadModel(url, options) {
401
+ const worker = this.getNextHealthyWorker();
402
+ const modelId = await worker.loadModel(url, options);
403
+ this.modelAssignments.set(modelId, this.workers.indexOf(worker));
404
+ return modelId;
405
+ }
406
+ /**
407
+ * Run inference (auto-retries on a healthy worker if assigned one is dead)
408
+ */
409
+ async runInference(modelId, inputs) {
410
+ const worker = this.getWorkerForModel(modelId);
411
+ return worker.runInference(modelId, inputs);
412
+ }
413
+ /**
414
+ * Run inference on multiple inputs in parallel
415
+ */
416
+ async runBatch(modelId, batchInputs) {
417
+ const results = await Promise.all(batchInputs.map((inputs, i) => {
418
+ const worker = this.workers[i % this.workers.length];
419
+ return worker.runInference(modelId, inputs);
420
+ }));
421
+ return results;
422
+ }
423
+ /**
424
+ * Dispose a model
425
+ */
426
+ async dispose(modelId) {
427
+ const worker = this.getWorkerForModel(modelId);
428
+ await worker.dispose(modelId);
429
+ this.modelAssignments.delete(modelId);
430
+ }
431
+ /**
432
+ * Terminate all workers
433
+ */
434
+ terminate() {
435
+ for (const worker of this.workers) {
436
+ worker.terminate();
437
+ }
438
+ this.workers = [];
439
+ this.modelAssignments.clear();
440
+ }
441
+ /**
442
+ * Get number of workers
443
+ */
444
+ get size() {
445
+ return this.workers.length;
446
+ }
447
+ }
448
+ // ============================================================================
449
+ // Global Instance
450
+ // ============================================================================
451
+ let globalWorkerPool = null;
452
+ /**
453
+ * Get or create global worker pool
454
+ */
455
+ export function getWorkerPool(options) {
456
+ if (!globalWorkerPool) {
457
+ globalWorkerPool = new WorkerPool(options);
458
+ }
459
+ return globalWorkerPool;
460
+ }
461
+ /**
462
+ * Run inference in a worker
463
+ */
464
+ export async function runInWorker(modelUrl, inputs, options) {
465
+ const pool = getWorkerPool();
466
+ await pool.init();
467
+ const modelId = await pool.loadModel(modelUrl, options);
468
+ const outputs = await pool.runInference(modelId, inputs);
469
+ return outputs;
470
+ }
471
+ /**
472
+ * Check if Web Workers are supported
473
+ */
474
+ export function isWorkerSupported() {
475
+ return typeof Worker !== 'undefined';
476
+ }
477
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/core/worker.ts"],"names":[],"mappings":"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"}