@workglow/util 0.0.126 → 0.1.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.
package/dist/bun.js CHANGED
@@ -216,10 +216,19 @@ class EventEmitter {
216
216
  emit(event, ...args) {
217
217
  const listeners = this.listeners[event];
218
218
  if (listeners) {
219
- listeners.forEach(({ listener }) => {
220
- listener(...args);
221
- });
219
+ const snapshot = [...listeners];
220
+ const errors = [];
221
+ for (const { listener } of snapshot) {
222
+ try {
223
+ listener(...args);
224
+ } catch (e) {
225
+ errors.push(e);
226
+ }
227
+ }
222
228
  this.listeners[event] = listeners.filter((l) => !l.once);
229
+ if (errors.length > 0) {
230
+ throw errors[0];
231
+ }
223
232
  }
224
233
  }
225
234
  subscribe(event, listener) {
@@ -767,10 +776,23 @@ class WorkerManager {
767
776
  worker.addEventListener("messageerror", (event) => {
768
777
  console.error("Worker message error:", event);
769
778
  });
770
- const readyPromise = new Promise((resolve) => {
779
+ const readyPromise = new Promise((resolve, reject) => {
780
+ const timeout = setTimeout(() => {
781
+ worker.removeEventListener("message", handleReady);
782
+ worker.removeEventListener("error", handleError);
783
+ reject(new Error(`Worker "${name}" did not become ready within 10s`));
784
+ }, 1e4);
785
+ const handleError = (event) => {
786
+ clearTimeout(timeout);
787
+ worker.removeEventListener("message", handleReady);
788
+ worker.removeEventListener("error", handleError);
789
+ reject(new Error(`Worker "${name}" initialization error: ${event.message ?? "unknown error"}`));
790
+ };
771
791
  const handleReady = (event) => {
772
792
  if (event.data?.type === "ready") {
793
+ clearTimeout(timeout);
773
794
  worker.removeEventListener("message", handleReady);
795
+ worker.removeEventListener("error", handleError);
774
796
  this.workerFunctions.set(name, new Set(event.data.functions ?? []));
775
797
  this.workerStreamFunctions.set(name, new Set(event.data.streamFunctions ?? []));
776
798
  this.workerReactiveFunctions.set(name, new Set(event.data.reactiveFunctions ?? []));
@@ -778,6 +800,7 @@ class WorkerManager {
778
800
  }
779
801
  };
780
802
  worker.addEventListener("message", handleReady);
803
+ worker.addEventListener("error", handleError);
781
804
  });
782
805
  this.readyWorkers.set(name, readyPromise);
783
806
  }
@@ -836,7 +859,10 @@ class WorkerManager {
836
859
  } else if (type === "error") {
837
860
  cleanup();
838
861
  getLogger().debug(`Worker ${workerName} function ${functionName} error.`, { data });
839
- reject(new Error(data));
862
+ const err = typeof data === "object" && data !== null ? Object.assign(new Error(data.message ?? String(data)), {
863
+ name: data.name ?? "Error"
864
+ }) : new Error(String(data));
865
+ reject(err);
840
866
  }
841
867
  };
842
868
  const handleAbort = () => {
@@ -1163,7 +1189,7 @@ var SALT_LENGTH = 16;
1163
1189
  async function deriveKey(passphrase, salt) {
1164
1190
  const enc = new TextEncoder;
1165
1191
  const keyMaterial = await crypto.subtle.importKey("raw", enc.encode(passphrase), "PBKDF2", false, ["deriveKey"]);
1166
- return crypto.subtle.deriveKey({ name: "PBKDF2", salt, iterations: 1e5, hash: "SHA-256" }, keyMaterial, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]);
1192
+ return crypto.subtle.deriveKey({ name: "PBKDF2", salt, iterations: 600000, hash: "SHA-256" }, keyMaterial, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]);
1167
1193
  }
1168
1194
  async function encrypt(plaintext, passphrase, keyCache) {
1169
1195
  const enc = new TextEncoder;
@@ -1418,12 +1444,20 @@ class WorkerServerBase {
1418
1444
  const uniqueTransferables = [...new Set(transferables)];
1419
1445
  postMessage({ id, type: "complete", data: result }, uniqueTransferables);
1420
1446
  };
1421
- postError = (id, errorMessage) => {
1447
+ postError = (id, error) => {
1422
1448
  if (this.completedRequests.has(id)) {
1423
1449
  return;
1424
1450
  }
1425
1451
  this.completedRequests.add(id);
1426
- postMessage({ id, type: "error", data: errorMessage });
1452
+ let data;
1453
+ if (typeof error === "string") {
1454
+ data = { message: error, name: "Error" };
1455
+ } else if (error instanceof Error) {
1456
+ data = { message: error.message, name: error.name };
1457
+ } else {
1458
+ data = { message: String(error), name: "Error" };
1459
+ }
1460
+ postMessage({ id, type: "error", data });
1427
1461
  };
1428
1462
  postStreamChunk = (id, event) => {
1429
1463
  if (this.completedRequests.has(id)) {
@@ -1469,6 +1503,7 @@ class WorkerServerBase {
1469
1503
  controller?.abort();
1470
1504
  this.requestControllers.delete(id);
1471
1505
  this.postError(id, "Operation aborted");
1506
+ this.scheduleCompletedRequestCleanup(id);
1472
1507
  }
1473
1508
  }
1474
1509
  async handleReactiveCall(id, functionName, [input, output, model]) {
@@ -1481,7 +1516,7 @@ class WorkerServerBase {
1481
1516
  const result = await fn(input, output, model);
1482
1517
  this.postResult(id, result);
1483
1518
  } catch (error) {
1484
- this.postError(id, error.message);
1519
+ this.postError(id, error);
1485
1520
  }
1486
1521
  }
1487
1522
  async handleCall(id, functionName, [input, model]) {
@@ -1501,12 +1536,10 @@ class WorkerServerBase {
1501
1536
  const result = await fn(input, model, postProgress, abortController.signal);
1502
1537
  this.postResult(id, result);
1503
1538
  } catch (error) {
1504
- this.postError(id, error.message);
1539
+ this.postError(id, error);
1505
1540
  } finally {
1506
1541
  this.requestControllers.delete(id);
1507
- setTimeout(() => {
1508
- this.completedRequests.delete(id);
1509
- }, 1000);
1542
+ this.scheduleCompletedRequestCleanup(id);
1510
1543
  }
1511
1544
  }
1512
1545
  async handleStreamCall(id, functionName, [input, model]) {
@@ -1523,12 +1556,10 @@ class WorkerServerBase {
1523
1556
  }
1524
1557
  this.postResult(id, undefined);
1525
1558
  } catch (error) {
1526
- this.postError(id, error.message);
1559
+ this.postError(id, error);
1527
1560
  } finally {
1528
1561
  this.requestControllers.delete(id);
1529
- setTimeout(() => {
1530
- this.completedRequests.delete(id);
1531
- }, 1000);
1562
+ this.scheduleCompletedRequestCleanup(id);
1532
1563
  }
1533
1564
  } else if (functionName in this.functions) {
1534
1565
  try {
@@ -1540,17 +1571,29 @@ class WorkerServerBase {
1540
1571
  this.postStreamChunk(id, { type: "finish", data: result });
1541
1572
  this.postResult(id, undefined);
1542
1573
  } catch (error) {
1543
- this.postError(id, error.message);
1574
+ this.postError(id, error);
1544
1575
  } finally {
1545
1576
  this.requestControllers.delete(id);
1546
- setTimeout(() => {
1547
- this.completedRequests.delete(id);
1548
- }, 1000);
1577
+ this.scheduleCompletedRequestCleanup(id);
1549
1578
  }
1550
1579
  } else {
1551
1580
  this.postError(id, `Function ${functionName} not found`);
1552
1581
  }
1553
1582
  }
1583
+ scheduleCompletedRequestCleanup(id) {
1584
+ setTimeout(() => {
1585
+ this.completedRequests.delete(id);
1586
+ }, 5000);
1587
+ if (this.completedRequests.size > 1e4) {
1588
+ const iter = this.completedRequests.values();
1589
+ for (let i = 0;i < 5000; i++) {
1590
+ const entry = iter.next();
1591
+ if (entry.done)
1592
+ break;
1593
+ this.completedRequests.delete(entry.value);
1594
+ }
1595
+ }
1596
+ }
1554
1597
  }
1555
1598
 
1556
1599
  // src/worker/Worker.bun.ts
@@ -1623,4 +1666,4 @@ export {
1623
1666
  BaseError
1624
1667
  };
1625
1668
 
1626
- //# debugId=9C84CCE9541649D064756E2164756E21
1669
+ //# debugId=98A19D1FE1EE3D8D64756E2164756E21