@workglow/util 0.0.120 → 0.0.122

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 (62) hide show
  1. package/dist/browser.js +337 -1250
  2. package/dist/browser.js.map +6 -11
  3. package/dist/bun.js +334 -1260
  4. package/dist/bun.js.map +6 -11
  5. package/dist/common.d.ts +0 -5
  6. package/dist/common.d.ts.map +1 -1
  7. package/dist/credentials/ChainedCredentialStore.d.ts.map +1 -1
  8. package/dist/credentials/EnvCredentialStore.d.ts.map +1 -1
  9. package/dist/credentials/InMemoryCredentialStore.d.ts.map +1 -1
  10. package/dist/di/Container.d.ts.map +1 -1
  11. package/dist/di/ServiceRegistry.d.ts.map +1 -1
  12. package/dist/events/EventEmitter.d.ts.map +1 -1
  13. package/dist/graph/directedAcyclicGraph.d.ts.map +1 -1
  14. package/dist/graph/directedGraph.d.ts.map +1 -1
  15. package/dist/graph/errors.d.ts.map +1 -1
  16. package/dist/graph/graph.d.ts.map +1 -1
  17. package/dist/logging/ConsoleLogger.d.ts.map +1 -1
  18. package/dist/logging/NullLogger.d.ts.map +1 -1
  19. package/dist/node.js +335 -1260
  20. package/dist/node.js.map +6 -11
  21. package/dist/telemetry/ConsoleTelemetryProvider.d.ts.map +1 -1
  22. package/dist/telemetry/NoopTelemetryProvider.d.ts.map +1 -1
  23. package/dist/telemetry/OTelTelemetryProvider.d.ts.map +1 -1
  24. package/dist/types.d.ts +0 -1
  25. package/dist/types.d.ts.map +1 -1
  26. package/dist/utilities/BaseError.d.ts.map +1 -1
  27. package/dist/vector/Tensor.d.ts +1 -1
  28. package/dist/vector/Tensor.d.ts.map +1 -1
  29. package/dist/vector/TypedArray.d.ts +4 -4
  30. package/dist/vector/TypedArray.d.ts.map +1 -1
  31. package/dist/worker/Worker.browser.d.ts +6 -1
  32. package/dist/worker/Worker.browser.d.ts.map +1 -1
  33. package/dist/worker/Worker.bun.d.ts +6 -1
  34. package/dist/worker/Worker.bun.d.ts.map +1 -1
  35. package/dist/worker/Worker.node.d.ts +6 -1
  36. package/dist/worker/Worker.node.d.ts.map +1 -1
  37. package/dist/worker/WorkerManager.d.ts +7 -1
  38. package/dist/worker/WorkerManager.d.ts.map +1 -1
  39. package/dist/worker/{WorkerServer.d.ts → WorkerServerBase.d.ts} +5 -4
  40. package/dist/worker/WorkerServerBase.d.ts.map +1 -0
  41. package/dist/worker-browser.js +894 -0
  42. package/dist/worker-browser.js.map +19 -0
  43. package/dist/worker-bun.js +895 -0
  44. package/dist/worker-bun.js.map +19 -0
  45. package/dist/worker-entry.d.ts +25 -0
  46. package/dist/worker-entry.d.ts.map +1 -0
  47. package/dist/worker-node.js +914 -0
  48. package/dist/worker-node.js.map +19 -0
  49. package/package.json +23 -20
  50. package/dist/json-schema/SchemaUtils.d.ts +0 -58
  51. package/dist/json-schema/SchemaUtils.d.ts.map +0 -1
  52. package/dist/json-schema/SchemaValidation.d.ts +0 -8
  53. package/dist/json-schema/SchemaValidation.d.ts.map +0 -1
  54. package/dist/mcp/McpAuthProvider.d.ts +0 -70
  55. package/dist/mcp/McpAuthProvider.d.ts.map +0 -1
  56. package/dist/mcp/McpAuthTypes.d.ts +0 -218
  57. package/dist/mcp/McpAuthTypes.d.ts.map +0 -1
  58. package/dist/mcp/McpClientUtil.browser.d.ts +0 -198
  59. package/dist/mcp/McpClientUtil.browser.d.ts.map +0 -1
  60. package/dist/mcp/McpClientUtil.node.d.ts +0 -222
  61. package/dist/mcp/McpClientUtil.node.d.ts.map +0 -1
  62. package/dist/worker/WorkerServer.d.ts.map +0 -1
@@ -0,0 +1,895 @@
1
+ // @bun
2
+ // src/di/Container.ts
3
+ class Container {
4
+ services = new Map;
5
+ factories = new Map;
6
+ singletons = new Set;
7
+ register(token, factory, singleton = true) {
8
+ this.factories.set(token, factory);
9
+ if (singleton) {
10
+ this.singletons.add(token);
11
+ }
12
+ }
13
+ registerInstance(token, instance) {
14
+ this.services.set(token, instance);
15
+ this.singletons.add(token);
16
+ }
17
+ get(token) {
18
+ if (this.services.has(token)) {
19
+ return this.services.get(token);
20
+ }
21
+ const factory = this.factories.get(token);
22
+ if (!factory) {
23
+ throw new Error(`Service not registered: ${String(token)}`);
24
+ }
25
+ const instance = factory();
26
+ if (this.singletons.has(token)) {
27
+ this.services.set(token, instance);
28
+ }
29
+ return instance;
30
+ }
31
+ has(token) {
32
+ return this.services.has(token) || this.factories.has(token);
33
+ }
34
+ remove(token) {
35
+ this.services.delete(token);
36
+ this.factories.delete(token);
37
+ this.singletons.delete(token);
38
+ }
39
+ createChildContainer() {
40
+ const child = new Container;
41
+ this.factories.forEach((factory, token) => {
42
+ child.factories.set(token, factory);
43
+ if (this.singletons.has(token)) {
44
+ child.singletons.add(token);
45
+ }
46
+ });
47
+ this.services.forEach((service, token) => {
48
+ if (this.singletons.has(token)) {
49
+ child.services.set(token, service);
50
+ child.singletons.add(token);
51
+ }
52
+ });
53
+ return child;
54
+ }
55
+ }
56
+ var globalContainer = new Container;
57
+ // src/di/ServiceRegistry.ts
58
+ function createServiceToken(id) {
59
+ return { id, _type: null };
60
+ }
61
+
62
+ class ServiceRegistry {
63
+ container;
64
+ constructor(container = globalContainer) {
65
+ this.container = container;
66
+ }
67
+ register(token, factory, singleton = true) {
68
+ this.container.register(token.id, factory, singleton);
69
+ }
70
+ registerInstance(token, instance) {
71
+ this.container.registerInstance(token.id, instance);
72
+ }
73
+ get(token) {
74
+ return this.container.get(token.id);
75
+ }
76
+ has(token) {
77
+ return this.container.has(token.id);
78
+ }
79
+ }
80
+ var globalServiceRegistry = new ServiceRegistry(globalContainer);
81
+
82
+ // src/di/InputResolverRegistry.ts
83
+ var INPUT_RESOLVERS = createServiceToken("task.input.resolvers");
84
+ if (!globalServiceRegistry.has(INPUT_RESOLVERS)) {
85
+ globalServiceRegistry.register(INPUT_RESOLVERS, () => new Map, true);
86
+ }
87
+ function getInputResolvers() {
88
+ return globalServiceRegistry.get(INPUT_RESOLVERS);
89
+ }
90
+ function registerInputResolver(formatPrefix, resolver) {
91
+ const resolvers = getInputResolvers();
92
+ resolvers.set(formatPrefix, resolver);
93
+ }
94
+ // src/logging/ConsoleLogger.ts
95
+ var LOG_LEVEL_ORDER = {
96
+ debug: 0,
97
+ info: 1,
98
+ warn: 2,
99
+ error: 3,
100
+ fatal: 4
101
+ };
102
+
103
+ class ConsoleLogger {
104
+ bindings;
105
+ level;
106
+ timings;
107
+ constructor(options = {}) {
108
+ this.bindings = options.bindings ?? {};
109
+ this.level = options.level ?? "debug";
110
+ this.timings = options.timings ?? false;
111
+ }
112
+ enabled(level) {
113
+ return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[this.level];
114
+ }
115
+ info(message, meta) {
116
+ if (!this.enabled("info"))
117
+ return;
118
+ const merged = this.merge(meta);
119
+ if (merged) {
120
+ console.info(message, merged);
121
+ } else {
122
+ console.info(message);
123
+ }
124
+ }
125
+ warn(message, meta) {
126
+ if (!this.enabled("warn"))
127
+ return;
128
+ const merged = this.merge(meta);
129
+ if (merged) {
130
+ console.warn(message, merged);
131
+ } else {
132
+ console.warn(message);
133
+ }
134
+ }
135
+ error(message, meta) {
136
+ if (!this.enabled("error"))
137
+ return;
138
+ const merged = this.merge(meta);
139
+ if (merged) {
140
+ console.error(message, merged);
141
+ } else {
142
+ console.error(message);
143
+ }
144
+ }
145
+ debug(message, meta) {
146
+ if (!this.enabled("debug"))
147
+ return;
148
+ const merged = this.merge(meta);
149
+ if (merged) {
150
+ console.debug(message, merged);
151
+ } else {
152
+ console.debug(message);
153
+ }
154
+ }
155
+ fatal(err, message, meta) {
156
+ if (!this.enabled("fatal"))
157
+ return;
158
+ const merged = this.merge(meta);
159
+ if (merged) {
160
+ console.error(message, { ...merged, error: err });
161
+ } else {
162
+ console.error(message, { error: err });
163
+ }
164
+ }
165
+ time(label, meta) {
166
+ if (!this.timings)
167
+ return;
168
+ const merged = this.merge(meta);
169
+ if (merged) {
170
+ console.info(`[time] ${label}`, merged);
171
+ }
172
+ console.time(label);
173
+ }
174
+ timeEnd(label, meta) {
175
+ if (!this.timings)
176
+ return;
177
+ console.timeEnd(label);
178
+ const merged = this.merge(meta);
179
+ if (merged) {
180
+ console.info(`[timeEnd] ${label}`, merged);
181
+ }
182
+ }
183
+ group(label, meta) {
184
+ const merged = this.merge(meta);
185
+ if (merged) {
186
+ console.group(label, merged);
187
+ } else {
188
+ console.group(label);
189
+ }
190
+ }
191
+ groupEnd() {
192
+ console.groupEnd();
193
+ }
194
+ child(bindings) {
195
+ return new ConsoleLogger({
196
+ bindings: { ...this.bindings, ...bindings },
197
+ level: this.level,
198
+ timings: this.timings
199
+ });
200
+ }
201
+ merge(meta) {
202
+ const hasBindings = Object.keys(this.bindings).length > 0;
203
+ if (!hasBindings && !meta)
204
+ return;
205
+ if (!hasBindings)
206
+ return meta;
207
+ if (!meta)
208
+ return this.bindings;
209
+ return { ...this.bindings, ...meta };
210
+ }
211
+ }
212
+ // src/logging/NullLogger.ts
213
+ class NullLogger {
214
+ info(_message, _meta) {}
215
+ error(_message, _meta) {}
216
+ warn(_message, _meta) {}
217
+ debug(_message, _meta) {}
218
+ fatal(_err, _message, _meta) {}
219
+ time(_label, _meta) {}
220
+ timeEnd(_label, _meta) {}
221
+ group(_label, _meta) {}
222
+ groupEnd() {}
223
+ child(_bindings) {
224
+ return this;
225
+ }
226
+ }
227
+ // src/logging/LoggerRegistry.ts
228
+ var LOGGER = createServiceToken("logger");
229
+ var VALID_LOG_LEVELS = new Set([
230
+ "debug",
231
+ "info",
232
+ "warn",
233
+ "error",
234
+ "fatal"
235
+ ]);
236
+ function getEnv(name) {
237
+ if (typeof process !== "undefined" && process.env) {
238
+ return process.env[name];
239
+ }
240
+ return import.meta.env[name];
241
+ }
242
+ function isTruthy(value) {
243
+ return value !== undefined && value !== "" && value !== "0" && value !== "false";
244
+ }
245
+ function createDefaultLogger() {
246
+ const levelEnv = getEnv("LOGGER_LEVEL")?.toLowerCase();
247
+ if (levelEnv && VALID_LOG_LEVELS.has(levelEnv)) {
248
+ return new ConsoleLogger({
249
+ level: levelEnv,
250
+ timings: isTruthy(getEnv("LOGGER_TIMINGS"))
251
+ });
252
+ }
253
+ if (getEnv("DEV")) {
254
+ return new ConsoleLogger({
255
+ level: "debug",
256
+ timings: true
257
+ });
258
+ }
259
+ return new NullLogger;
260
+ }
261
+ if (!globalServiceRegistry.has(LOGGER)) {
262
+ globalServiceRegistry.register(LOGGER, createDefaultLogger, true);
263
+ }
264
+ function getLogger() {
265
+ return globalServiceRegistry.get(LOGGER);
266
+ }
267
+ function setLogger(logger) {
268
+ globalServiceRegistry.registerInstance(LOGGER, logger);
269
+ }
270
+ // src/worker/WorkerServerBase.ts
271
+ var WORKER_SERVER = createServiceToken("worker.server");
272
+ function extractTransferables(obj) {
273
+ const transferables = [];
274
+ const seen = new WeakSet;
275
+ function findTransferables(value) {
276
+ if (value && typeof value === "object" && seen.has(value)) {
277
+ return;
278
+ }
279
+ if (value && typeof value === "object") {
280
+ seen.add(value);
281
+ }
282
+ if (value instanceof Float32Array || value instanceof Int16Array) {
283
+ transferables.push(value.buffer);
284
+ } else if (value instanceof Uint8Array || value instanceof Uint8ClampedArray || value instanceof Int8Array || value instanceof Uint16Array || value instanceof Int32Array || value instanceof Uint32Array || value instanceof Float64Array || value instanceof BigInt64Array || value instanceof BigUint64Array) {
285
+ transferables.push(value.buffer);
286
+ } else if (typeof OffscreenCanvas !== "undefined" && value instanceof OffscreenCanvas) {
287
+ transferables.push(value);
288
+ } else if (typeof ImageBitmap !== "undefined" && value instanceof ImageBitmap) {
289
+ transferables.push(value);
290
+ } else if (typeof VideoFrame !== "undefined" && value instanceof VideoFrame) {
291
+ transferables.push(value);
292
+ } else if (typeof MessagePort !== "undefined" && value instanceof MessagePort) {
293
+ transferables.push(value);
294
+ } else if (value instanceof ArrayBuffer) {
295
+ transferables.push(value);
296
+ } else if (Array.isArray(value)) {
297
+ value.forEach(findTransferables);
298
+ } else if (value && typeof value === "object") {
299
+ Object.values(value).forEach(findTransferables);
300
+ }
301
+ }
302
+ findTransferables(obj);
303
+ return transferables;
304
+ }
305
+
306
+ class WorkerServerBase {
307
+ constructor() {}
308
+ functions = {};
309
+ streamFunctions = {};
310
+ reactiveFunctions = {};
311
+ requestControllers = new Map;
312
+ completedRequests = new Set;
313
+ postResult = (id, result) => {
314
+ if (this.completedRequests.has(id)) {
315
+ return;
316
+ }
317
+ this.completedRequests.add(id);
318
+ const transferables = extractTransferables(result);
319
+ const uniqueTransferables = [...new Set(transferables)];
320
+ postMessage({ id, type: "complete", data: result }, uniqueTransferables);
321
+ };
322
+ postError = (id, errorMessage) => {
323
+ if (this.completedRequests.has(id)) {
324
+ return;
325
+ }
326
+ this.completedRequests.add(id);
327
+ postMessage({ id, type: "error", data: errorMessage });
328
+ };
329
+ postStreamChunk = (id, event) => {
330
+ if (this.completedRequests.has(id)) {
331
+ return;
332
+ }
333
+ postMessage({ id, type: "stream_chunk", data: event });
334
+ };
335
+ sendReady() {
336
+ postMessage({
337
+ type: "ready",
338
+ functions: Object.keys(this.functions),
339
+ streamFunctions: Object.keys(this.streamFunctions),
340
+ reactiveFunctions: Object.keys(this.reactiveFunctions)
341
+ });
342
+ }
343
+ registerFunction(name, fn) {
344
+ this.functions[name] = fn;
345
+ }
346
+ registerReactiveFunction(name, fn) {
347
+ this.reactiveFunctions[name] = fn;
348
+ }
349
+ registerStreamFunction(name, fn) {
350
+ this.streamFunctions[name] = fn;
351
+ }
352
+ async handleMessage(event) {
353
+ const { id, type, functionName, args, stream, reactive } = event.data;
354
+ if (type === "abort") {
355
+ return await this.handleAbort(id);
356
+ }
357
+ if (type === "call") {
358
+ if (stream) {
359
+ return await this.handleStreamCall(id, functionName, args);
360
+ }
361
+ if (reactive) {
362
+ return await this.handleReactiveCall(id, functionName, args);
363
+ }
364
+ return await this.handleCall(id, functionName, args);
365
+ }
366
+ }
367
+ async handleAbort(id) {
368
+ if (this.requestControllers.has(id)) {
369
+ const controller = this.requestControllers.get(id);
370
+ controller?.abort();
371
+ this.requestControllers.delete(id);
372
+ this.postError(id, "Operation aborted");
373
+ }
374
+ }
375
+ async handleReactiveCall(id, functionName, [input, output, model]) {
376
+ if (!(functionName in this.reactiveFunctions)) {
377
+ this.postResult(id, undefined);
378
+ return;
379
+ }
380
+ try {
381
+ const fn = this.reactiveFunctions[functionName];
382
+ const result = await fn(input, output, model);
383
+ this.postResult(id, result);
384
+ } catch (error) {
385
+ this.postError(id, error.message);
386
+ }
387
+ }
388
+ async handleCall(id, functionName, [input, model]) {
389
+ if (!(functionName in this.functions)) {
390
+ this.postError(id, `Function ${functionName} not found`);
391
+ return;
392
+ }
393
+ try {
394
+ const abortController = new AbortController;
395
+ this.requestControllers.set(id, abortController);
396
+ const fn = this.functions[functionName];
397
+ const postProgress = (progress, message, details) => {
398
+ if (!this.completedRequests.has(id)) {
399
+ postMessage({ id, type: "progress", data: { progress, message, details } });
400
+ }
401
+ };
402
+ const result = await fn(input, model, postProgress, abortController.signal);
403
+ this.postResult(id, result);
404
+ } catch (error) {
405
+ this.postError(id, error.message);
406
+ } finally {
407
+ this.requestControllers.delete(id);
408
+ setTimeout(() => {
409
+ this.completedRequests.delete(id);
410
+ }, 1000);
411
+ }
412
+ }
413
+ async handleStreamCall(id, functionName, [input, model]) {
414
+ if (functionName in this.streamFunctions) {
415
+ try {
416
+ const abortController = new AbortController;
417
+ this.requestControllers.set(id, abortController);
418
+ const fn = this.streamFunctions[functionName];
419
+ const iterable = fn(input, model, abortController.signal);
420
+ for await (const event of iterable) {
421
+ if (this.completedRequests.has(id))
422
+ break;
423
+ this.postStreamChunk(id, event);
424
+ }
425
+ this.postResult(id, undefined);
426
+ } catch (error) {
427
+ this.postError(id, error.message);
428
+ } finally {
429
+ this.requestControllers.delete(id);
430
+ setTimeout(() => {
431
+ this.completedRequests.delete(id);
432
+ }, 1000);
433
+ }
434
+ } else if (functionName in this.functions) {
435
+ try {
436
+ const abortController = new AbortController;
437
+ this.requestControllers.set(id, abortController);
438
+ const fn = this.functions[functionName];
439
+ const noopProgress = () => {};
440
+ const result = await fn(input, model, noopProgress, abortController.signal);
441
+ this.postStreamChunk(id, { type: "finish", data: result });
442
+ this.postResult(id, undefined);
443
+ } catch (error) {
444
+ this.postError(id, error.message);
445
+ } finally {
446
+ this.requestControllers.delete(id);
447
+ setTimeout(() => {
448
+ this.completedRequests.delete(id);
449
+ }, 1000);
450
+ }
451
+ } else {
452
+ this.postError(id, `Function ${functionName} not found`);
453
+ }
454
+ }
455
+ }
456
+ // src/worker/WorkerManager.ts
457
+ class WorkerManager {
458
+ workers = new Map;
459
+ readyWorkers = new Map;
460
+ workerFunctions = new Map;
461
+ workerStreamFunctions = new Map;
462
+ workerReactiveFunctions = new Map;
463
+ lazyFactories = new Map;
464
+ lazyInitPromises = new Map;
465
+ registerWorker(name, workerOrFactory) {
466
+ if (this.workers.has(name)) {
467
+ throw new Error(`Worker ${name} is already registered.`);
468
+ }
469
+ if (this.lazyFactories.has(name)) {
470
+ throw new Error(`Worker ${name} is already registered.`);
471
+ }
472
+ if (typeof workerOrFactory === "function") {
473
+ this.lazyFactories.set(name, workerOrFactory);
474
+ } else {
475
+ this.attachWorkerInstance(name, workerOrFactory);
476
+ }
477
+ }
478
+ attachWorkerInstance(name, worker) {
479
+ this.workers.set(name, worker);
480
+ worker.addEventListener("error", (event) => {
481
+ console.error("Worker Error:", event.message, "at", event.filename, "line:", event.lineno);
482
+ });
483
+ worker.addEventListener("messageerror", (event) => {
484
+ console.error("Worker message error:", event);
485
+ });
486
+ const readyPromise = new Promise((resolve) => {
487
+ const handleReady = (event) => {
488
+ if (event.data?.type === "ready") {
489
+ worker.removeEventListener("message", handleReady);
490
+ this.workerFunctions.set(name, new Set(event.data.functions ?? []));
491
+ this.workerStreamFunctions.set(name, new Set(event.data.streamFunctions ?? []));
492
+ this.workerReactiveFunctions.set(name, new Set(event.data.reactiveFunctions ?? []));
493
+ resolve();
494
+ }
495
+ };
496
+ worker.addEventListener("message", handleReady);
497
+ });
498
+ this.readyWorkers.set(name, readyPromise);
499
+ }
500
+ async ensureWorkerReady(name) {
501
+ if (this.workers.has(name)) {
502
+ await this.readyWorkers.get(name);
503
+ return;
504
+ }
505
+ const factory = this.lazyFactories.get(name);
506
+ if (!factory) {
507
+ throw new Error(`Worker ${name} not found.`);
508
+ }
509
+ let init = this.lazyInitPromises.get(name);
510
+ if (!init) {
511
+ init = (async () => {
512
+ const f = this.lazyFactories.get(name);
513
+ this.lazyFactories.delete(name);
514
+ const worker = f();
515
+ this.attachWorkerInstance(name, worker);
516
+ })();
517
+ this.lazyInitPromises.set(name, init);
518
+ }
519
+ await init;
520
+ await this.readyWorkers.get(name);
521
+ this.lazyInitPromises.delete(name);
522
+ }
523
+ getWorker(name) {
524
+ const worker = this.workers.get(name);
525
+ if (!worker)
526
+ throw new Error(`Worker ${name} not found.`);
527
+ return worker;
528
+ }
529
+ async callWorkerFunction(workerName, functionName, args, options) {
530
+ await this.ensureWorkerReady(workerName);
531
+ const worker = this.workers.get(workerName);
532
+ if (!worker)
533
+ throw new Error(`Worker ${workerName} not found.`);
534
+ await this.readyWorkers.get(workerName);
535
+ const knownFunctions = this.workerFunctions.get(workerName);
536
+ if (knownFunctions && !knownFunctions.has(functionName)) {
537
+ throw new Error(`Function "${functionName}" is not registered on worker "${workerName}".`);
538
+ }
539
+ return new Promise((resolve, reject) => {
540
+ const requestId = crypto.randomUUID();
541
+ const handleMessage = (event) => {
542
+ const { id, type, data } = event.data;
543
+ if (id !== requestId)
544
+ return;
545
+ if (type === "progress" && options?.onProgress) {
546
+ options.onProgress(data.progress, data.message, data.details);
547
+ getLogger().debug(`Worker ${workerName} function ${functionName} progress: ${data.progress}, `, { data });
548
+ } else if (type === "complete") {
549
+ cleanup();
550
+ getLogger().debug(`Worker ${workerName} function ${functionName} complete.`, { data });
551
+ resolve(data);
552
+ } else if (type === "error") {
553
+ cleanup();
554
+ getLogger().debug(`Worker ${workerName} function ${functionName} error.`, { data });
555
+ reject(new Error(data));
556
+ }
557
+ };
558
+ const handleAbort = () => {
559
+ worker.postMessage({ id: requestId, type: "abort" });
560
+ getLogger().info(`Worker ${workerName} function ${functionName} aborted.`);
561
+ };
562
+ const cleanup = () => {
563
+ worker.removeEventListener("message", handleMessage);
564
+ options?.signal?.removeEventListener("abort", handleAbort);
565
+ };
566
+ worker.addEventListener("message", handleMessage);
567
+ if (options?.signal) {
568
+ options.signal.addEventListener("abort", handleAbort, { once: true });
569
+ }
570
+ const message = { id: requestId, type: "call", functionName, args };
571
+ worker.postMessage(message);
572
+ getLogger().info(`Worker ${workerName} function ${functionName} called.`);
573
+ });
574
+ }
575
+ async callWorkerReactiveFunction(workerName, functionName, args) {
576
+ await this.ensureWorkerReady(workerName);
577
+ const worker = this.workers.get(workerName);
578
+ if (!worker)
579
+ return;
580
+ await this.readyWorkers.get(workerName);
581
+ const knownReactive = this.workerReactiveFunctions.get(workerName);
582
+ if (knownReactive && !knownReactive.has(functionName))
583
+ return;
584
+ return new Promise((resolve) => {
585
+ const requestId = crypto.randomUUID();
586
+ const handleMessage = (event) => {
587
+ const { id, type, data } = event.data;
588
+ if (id !== requestId)
589
+ return;
590
+ if (type === "complete") {
591
+ cleanup();
592
+ resolve(data);
593
+ } else if (type === "error") {
594
+ cleanup();
595
+ resolve(undefined);
596
+ }
597
+ };
598
+ const cleanup = () => {
599
+ worker.removeEventListener("message", handleMessage);
600
+ };
601
+ worker.addEventListener("message", handleMessage);
602
+ const message = { id: requestId, type: "call", functionName, args, reactive: true };
603
+ worker.postMessage(message);
604
+ getLogger().info(`Worker ${workerName} reactive function ${functionName} called.`);
605
+ });
606
+ }
607
+ async* callWorkerStreamFunction(workerName, functionName, args, options) {
608
+ await this.ensureWorkerReady(workerName);
609
+ const worker = this.workers.get(workerName);
610
+ if (!worker)
611
+ throw new Error(`Worker ${workerName} not found.`);
612
+ await this.readyWorkers.get(workerName);
613
+ const knownStream = this.workerStreamFunctions.get(workerName);
614
+ const knownFns = this.workerFunctions.get(workerName);
615
+ if (knownStream && knownFns && !knownStream.has(functionName) && !knownFns.has(functionName)) {
616
+ throw new Error(`Function "${functionName}" is not registered on worker "${workerName}".`);
617
+ }
618
+ const requestId = crypto.randomUUID();
619
+ const queue = [];
620
+ let waiting = null;
621
+ const notify = () => {
622
+ if (waiting) {
623
+ const resolve = waiting;
624
+ waiting = null;
625
+ resolve();
626
+ }
627
+ };
628
+ const handleMessage = (event) => {
629
+ const { id, type, data } = event.data;
630
+ if (id !== requestId)
631
+ return;
632
+ if (type === "stream_chunk") {
633
+ queue.push({ kind: "event", data });
634
+ notify();
635
+ } else if (type === "complete") {
636
+ queue.push({ kind: "done" });
637
+ notify();
638
+ } else if (type === "error") {
639
+ queue.push({ kind: "error", error: new Error(data) });
640
+ notify();
641
+ }
642
+ };
643
+ const handleAbort = () => {
644
+ worker.postMessage({ id: requestId, type: "abort" });
645
+ getLogger().info(`Worker ${workerName} stream function ${functionName} aborted.`);
646
+ };
647
+ const cleanup = () => {
648
+ worker.removeEventListener("message", handleMessage);
649
+ options?.signal?.removeEventListener("abort", handleAbort);
650
+ };
651
+ worker.addEventListener("message", handleMessage);
652
+ if (options?.signal) {
653
+ if (options.signal.aborted) {
654
+ cleanup();
655
+ throw new Error("Operation aborted");
656
+ }
657
+ options.signal.addEventListener("abort", handleAbort, { once: true });
658
+ }
659
+ const message = { id: requestId, type: "call", functionName, args, stream: true };
660
+ worker.postMessage(message);
661
+ getLogger().info(`Worker ${workerName} stream function ${functionName} called.`);
662
+ let completedNormally = false;
663
+ try {
664
+ while (true) {
665
+ while (queue.length > 0) {
666
+ const item = queue.shift();
667
+ if (item.kind === "event") {
668
+ yield item.data;
669
+ } else if (item.kind === "done") {
670
+ completedNormally = true;
671
+ return;
672
+ } else if (item.kind === "error") {
673
+ completedNormally = true;
674
+ throw item.error;
675
+ }
676
+ }
677
+ await new Promise((resolve) => {
678
+ waiting = resolve;
679
+ });
680
+ }
681
+ } finally {
682
+ if (!completedNormally) {
683
+ worker.postMessage({ id: requestId, type: "abort" });
684
+ getLogger().info(`Worker ${workerName} stream function ${functionName} aborted.`);
685
+ }
686
+ cleanup();
687
+ }
688
+ }
689
+ }
690
+ var WORKER_MANAGER = createServiceToken("worker.manager");
691
+ globalServiceRegistry.register(WORKER_MANAGER, () => new WorkerManager, true);
692
+ // src/json-schema/parsePartialJson.ts
693
+ function parsePartialJson(text) {
694
+ const trimmed = text.trim();
695
+ if (!trimmed)
696
+ return;
697
+ try {
698
+ const result = JSON.parse(trimmed);
699
+ if (typeof result === "object" && result !== null && !Array.isArray(result)) {
700
+ return result;
701
+ }
702
+ return;
703
+ } catch {}
704
+ if (trimmed[0] !== "{")
705
+ return;
706
+ const repaired = repairJson(trimmed);
707
+ if (repaired === undefined)
708
+ return;
709
+ try {
710
+ const result = JSON.parse(repaired);
711
+ if (typeof result === "object" && result !== null && !Array.isArray(result)) {
712
+ return result;
713
+ }
714
+ return;
715
+ } catch {
716
+ return;
717
+ }
718
+ }
719
+ function repairJson(text) {
720
+ let result = "";
721
+ let i = 0;
722
+ const len = text.length;
723
+ const stack = [];
724
+ let inString = false;
725
+ let escaped = false;
726
+ let lastSafeEnd = 0;
727
+ while (i < len) {
728
+ const ch = text[i];
729
+ if (escaped) {
730
+ escaped = false;
731
+ result += ch;
732
+ i++;
733
+ continue;
734
+ }
735
+ if (ch === "\\") {
736
+ escaped = true;
737
+ result += ch;
738
+ i++;
739
+ continue;
740
+ }
741
+ if (inString) {
742
+ if (ch === '"') {
743
+ inString = false;
744
+ result += ch;
745
+ i++;
746
+ lastSafeEnd = result.length;
747
+ continue;
748
+ }
749
+ result += ch;
750
+ i++;
751
+ continue;
752
+ }
753
+ switch (ch) {
754
+ case '"':
755
+ inString = true;
756
+ result += ch;
757
+ i++;
758
+ break;
759
+ case "{":
760
+ stack.push("}");
761
+ result += ch;
762
+ i++;
763
+ break;
764
+ case "[":
765
+ stack.push("]");
766
+ result += ch;
767
+ i++;
768
+ break;
769
+ case "}":
770
+ if (stack.length > 0 && stack[stack.length - 1] === "}") {
771
+ stack.pop();
772
+ result += ch;
773
+ i++;
774
+ lastSafeEnd = result.length;
775
+ } else {
776
+ return closeStack(result, stack);
777
+ }
778
+ break;
779
+ case "]":
780
+ if (stack.length > 0 && stack[stack.length - 1] === "]") {
781
+ stack.pop();
782
+ result += ch;
783
+ i++;
784
+ lastSafeEnd = result.length;
785
+ } else {
786
+ return closeStack(result, stack);
787
+ }
788
+ break;
789
+ default:
790
+ result += ch;
791
+ i++;
792
+ break;
793
+ }
794
+ }
795
+ if (inString) {
796
+ result += '"';
797
+ }
798
+ if (stack.length === 0) {
799
+ return result;
800
+ }
801
+ return closeStack(cleanTrailing(result), stack);
802
+ }
803
+ function cleanTrailing(text) {
804
+ let s = text.trimEnd();
805
+ let changed = true;
806
+ while (changed) {
807
+ changed = false;
808
+ const trimmed = s.trimEnd();
809
+ if (trimmed.endsWith(",")) {
810
+ s = trimmed.slice(0, -1);
811
+ changed = true;
812
+ continue;
813
+ }
814
+ if (trimmed.endsWith(":")) {
815
+ const withoutColon = trimmed.slice(0, -1).trimEnd();
816
+ if (withoutColon.endsWith('"')) {
817
+ const keyStart = withoutColon.lastIndexOf('"', withoutColon.length - 2);
818
+ if (keyStart >= 0) {
819
+ let before = withoutColon.slice(0, keyStart).trimEnd();
820
+ if (before.endsWith(",")) {
821
+ before = before.slice(0, -1);
822
+ }
823
+ s = before;
824
+ changed = true;
825
+ continue;
826
+ }
827
+ }
828
+ s = withoutColon;
829
+ changed = true;
830
+ continue;
831
+ }
832
+ const bareTokenMatch = trimmed.match(/,\s*"[^"]*"\s*:\s*(?:tru|fal|nul|true|false|null|[\d.eE+-]+)$/);
833
+ if (bareTokenMatch) {
834
+ const valueStr = trimmed.slice(trimmed.lastIndexOf(":") + 1).trim();
835
+ try {
836
+ JSON.parse(valueStr);
837
+ } catch {
838
+ s = trimmed.slice(0, bareTokenMatch.index).trimEnd();
839
+ if (s.endsWith(","))
840
+ s = s.slice(0, -1);
841
+ changed = true;
842
+ continue;
843
+ }
844
+ }
845
+ }
846
+ return s;
847
+ }
848
+ function closeStack(text, stack) {
849
+ let result = text;
850
+ for (let i = stack.length - 1;i >= 0; i--) {
851
+ result += stack[i];
852
+ }
853
+ return result;
854
+ }
855
+ // src/worker/Worker.bun.ts
856
+ var Worker = globalThis.Worker;
857
+ var parentPort = self;
858
+ class WorkerServer extends WorkerServerBase {
859
+ constructor() {
860
+ parentPort?.addEventListener("message", async (event) => {
861
+ const msg = {
862
+ type: event.type,
863
+ data: event.data
864
+ };
865
+ await this.handleMessage(msg);
866
+ });
867
+ super();
868
+ }
869
+ }
870
+ globalServiceRegistry.register(WORKER_SERVER, () => new WorkerServer, true);
871
+ export {
872
+ setLogger,
873
+ registerInputResolver,
874
+ parsePartialJson,
875
+ parentPort,
876
+ globalServiceRegistry,
877
+ globalContainer,
878
+ getLogger,
879
+ getInputResolvers,
880
+ createServiceToken,
881
+ WorkerServerBase,
882
+ WorkerServer,
883
+ WorkerManager,
884
+ Worker,
885
+ WORKER_SERVER,
886
+ WORKER_MANAGER,
887
+ ServiceRegistry,
888
+ NullLogger,
889
+ LOGGER,
890
+ INPUT_RESOLVERS,
891
+ Container,
892
+ ConsoleLogger
893
+ };
894
+
895
+ //# debugId=DC59A52E5EEAB5BF64756E2164756E21