@dxos/async 0.8.1 → 0.8.2-main.10c050d

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 (56) hide show
  1. package/dist/lib/browser/index.mjs +79 -58
  2. package/dist/lib/browser/index.mjs.map +3 -3
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +82 -58
  5. package/dist/lib/node/index.cjs.map +3 -3
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/lib/node-esm/index.mjs +79 -58
  8. package/dist/lib/node-esm/index.mjs.map +3 -3
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/callback.d.ts.map +1 -1
  11. package/dist/types/src/chain.d.ts.map +1 -1
  12. package/dist/types/src/cleanup.d.ts +11 -0
  13. package/dist/types/src/cleanup.d.ts.map +1 -1
  14. package/dist/types/src/debounce.d.ts.map +1 -1
  15. package/dist/types/src/errors.d.ts.map +1 -1
  16. package/dist/types/src/event-emitter.d.ts.map +1 -1
  17. package/dist/types/src/events.d.ts +5 -0
  18. package/dist/types/src/events.d.ts.map +1 -1
  19. package/dist/types/src/latch.d.ts.map +1 -1
  20. package/dist/types/src/mutex.d.ts +1 -1
  21. package/dist/types/src/mutex.d.ts.map +1 -1
  22. package/dist/types/src/observable-value.d.ts.map +1 -1
  23. package/dist/types/src/observable.d.ts.map +1 -1
  24. package/dist/types/src/persistent-lifecycle.d.ts +1 -1
  25. package/dist/types/src/persistent-lifecycle.d.ts.map +1 -1
  26. package/dist/types/src/push-iterable.d.ts.map +1 -1
  27. package/dist/types/src/sink.d.ts.map +1 -1
  28. package/dist/types/src/stream-to-array.d.ts.map +1 -1
  29. package/dist/types/src/task-scheduling.d.ts.map +1 -1
  30. package/dist/types/src/test-stream.d.ts.map +1 -1
  31. package/dist/types/src/testing.d.ts +2 -1
  32. package/dist/types/src/testing.d.ts.map +1 -1
  33. package/dist/types/src/timeout.d.ts.map +1 -1
  34. package/dist/types/src/timer.d.ts.map +1 -1
  35. package/dist/types/src/track-leaks.d.ts.map +1 -1
  36. package/dist/types/src/trigger.d.ts.map +1 -1
  37. package/dist/types/src/until.d.ts.map +1 -1
  38. package/dist/types/src/update-scheduler.d.ts.map +1 -1
  39. package/dist/types/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +7 -7
  41. package/src/cleanup.ts +32 -4
  42. package/src/events.ts +21 -13
  43. package/src/mutex.test.ts +2 -2
  44. package/src/mutex.ts +1 -1
  45. package/src/observable-value.ts +2 -2
  46. package/src/observable.ts +7 -4
  47. package/src/persistent-lifecycle.test.ts +2 -2
  48. package/src/persistent-lifecycle.ts +5 -5
  49. package/src/task-scheduling.ts +3 -3
  50. package/src/test-stream.ts +2 -2
  51. package/src/testing.test.ts +7 -1
  52. package/src/testing.ts +8 -4
  53. package/src/timeout.ts +1 -0
  54. package/src/timer.ts +2 -2
  55. package/src/trigger.ts +3 -3
  56. package/src/update-scheduler.ts +4 -4
@@ -25,6 +25,18 @@ var combine = (...cleanupFns) => {
25
25
  cleanupFns.forEach((cleanupFn) => cleanupFn());
26
26
  };
27
27
  };
28
+ var timeout = (cb, ms = 0) => {
29
+ const t = setTimeout(cb, ms);
30
+ return () => clearTimeout(t);
31
+ };
32
+ var interval = (cb, ms) => {
33
+ const t = setInterval(cb, ms);
34
+ return () => clearInterval(t);
35
+ };
36
+ var addEventListener = (el, event, handler, options) => {
37
+ el.addEventListener(event, handler, options);
38
+ return () => el.removeEventListener(event, handler, options);
39
+ };
28
40
  var SubscriptionList = class {
29
41
  constructor() {
30
42
  this._cleanups = [];
@@ -64,8 +76,8 @@ var debounce = (cb, wait = 100) => {
64
76
  // packages/common/async/src/errors.ts
65
77
  var toError = (err) => err === void 0 || typeof err === "string" ? new Error(err) : err;
66
78
  var TimeoutError = class extends Error {
67
- constructor(timeout, label) {
68
- super(timeout ? `Timeout [${timeout.toLocaleString()}ms]${label === void 0 ? "" : `: ${label}`}` : "Timeout");
79
+ constructor(timeout2, label) {
80
+ super(timeout2 ? `Timeout [${timeout2.toLocaleString()}ms]${label === void 0 ? "" : `: ${label}`}` : "Timeout");
69
81
  }
70
82
  };
71
83
  var observableError = (observable, err) => {
@@ -93,13 +105,13 @@ var sleep = (ms) => {
93
105
  });
94
106
  };
95
107
  var asyncReturn = () => sleep(0);
96
- var asyncTimeout = async (promise, timeout, err) => {
108
+ var asyncTimeout = async (promise, timeout2, err) => {
97
109
  let timeoutId;
98
- const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout, err) : err;
110
+ const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
99
111
  const timeoutPromise = new Promise((resolve, reject) => {
100
112
  timeoutId = setTimeout(() => {
101
113
  reject(throwable);
102
- }, timeout);
114
+ }, timeout2);
103
115
  unrefTimeout(timeoutId);
104
116
  });
105
117
  const conditionTimeout = typeof promise === "function" ? createPromiseFromCallback(promise) : promise;
@@ -122,12 +134,12 @@ var sleepWithContext = (ctx, ms) => {
122
134
  reject(error);
123
135
  return;
124
136
  }
125
- const timeout = setTimeout(() => {
137
+ const timeout2 = setTimeout(() => {
126
138
  clearDispose();
127
139
  resolve();
128
140
  }, ms);
129
141
  const clearDispose = ctx.onDispose(() => {
130
- clearTimeout(timeout);
142
+ clearTimeout(timeout2);
131
143
  reject(error);
132
144
  });
133
145
  });
@@ -144,7 +156,7 @@ var addListener = (eventEmitter, eventName, callback) => {
144
156
  remove: () => off()
145
157
  };
146
158
  };
147
- var waitForEvent = (eventEmitter, eventName, test, timeout, error) => {
159
+ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
148
160
  let off;
149
161
  const promise = new Promise((resolve) => {
150
162
  off = onEvent(eventEmitter, eventName, (...args) => {
@@ -153,7 +165,7 @@ var waitForEvent = (eventEmitter, eventName, test, timeout, error) => {
153
165
  }
154
166
  });
155
167
  });
156
- return timeout ? asyncTimeout(promise, timeout, error ?? new Error()).finally(off) : promise.finally(off);
168
+ return timeout2 ? asyncTimeout(promise, timeout2, error ?? new Error()).finally(off) : promise.finally(off);
157
169
  };
158
170
 
159
171
  // packages/common/async/src/events.ts
@@ -348,14 +360,14 @@ var Event = class _Event {
348
360
  * the event is emitted after `timeout / 8` ms.
349
361
  */
350
362
  // TODO(burdon): Factor out generic function.
351
- debounce(timeout = 0) {
363
+ debounce(timeout2 = 0) {
352
364
  let firing;
353
365
  let lastFired;
354
366
  const debouncedEvent = new _Event();
355
367
  debouncedEvent.addEffect(() => {
356
368
  const unsubscribe = this.on(() => {
357
369
  if (!firing) {
358
- const fireIn = !lastFired || Date.now() - lastFired > timeout ? timeout / 8 : timeout;
370
+ const fireIn = !lastFired || Date.now() - lastFired > timeout2 ? timeout2 / 8 : timeout2;
359
371
  firing = setTimeout(() => {
360
372
  lastFired = Date.now();
361
373
  firing = void 0;
@@ -377,6 +389,13 @@ var Event = class _Event {
377
389
  return this;
378
390
  }
379
391
  /**
392
+ * Pipe the events into another event.
393
+ * @param event
394
+ */
395
+ pipeInto(event) {
396
+ return this.on((data) => event.emit(data));
397
+ }
398
+ /**
380
399
  * Overridden to not return implementation details.
381
400
  */
382
401
  toJSON() {
@@ -480,7 +499,7 @@ var weakListeners = () => {
480
499
  // packages/common/async/src/latch.ts
481
500
  import { invariant } from "@dxos/invariant";
482
501
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/common/async/src/latch.ts";
483
- var latch = ({ count = 1, timeout } = {}) => {
502
+ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
484
503
  invariant(count >= 0, void 0, {
485
504
  F: __dxlog_file2,
486
505
  L: 19,
@@ -508,10 +527,10 @@ var latch = ({ count = 1, timeout } = {}) => {
508
527
  doResolve(0);
509
528
  });
510
529
  } else {
511
- if (timeout) {
530
+ if (timeout2) {
512
531
  t = setTimeout(() => {
513
- doReject(new Error(`Timed out after ${timeout.toLocaleString()}ms`));
514
- }, timeout);
532
+ doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
533
+ }, timeout2);
515
534
  }
516
535
  }
517
536
  let i = 0;
@@ -624,11 +643,11 @@ import Observable from "zen-observable";
624
643
  import PushStream from "zen-push";
625
644
 
626
645
  // packages/common/async/src/trigger.ts
627
- var trigger = (timeout) => {
646
+ var trigger = (timeout2) => {
628
647
  let callback;
629
648
  const promise = new Promise((resolve, reject) => {
630
- if (timeout) {
631
- setTimeout(() => reject(new Error(`Timed out after ${timeout.toLocaleString()}ms`)), timeout);
649
+ if (timeout2) {
650
+ setTimeout(() => reject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`)), timeout2);
632
651
  }
633
652
  callback = resolve;
634
653
  });
@@ -639,12 +658,12 @@ var trigger = (timeout) => {
639
658
  resolver
640
659
  ];
641
660
  };
642
- var TriggerState;
643
- (function(TriggerState2) {
661
+ var TriggerState = /* @__PURE__ */ function(TriggerState2) {
644
662
  TriggerState2["WAITING"] = "WAITING";
645
663
  TriggerState2["RESOLVED"] = "RESOLVED";
646
664
  TriggerState2["REJECTED"] = "REJECTED";
647
- })(TriggerState || (TriggerState = {}));
665
+ return TriggerState2;
666
+ }({});
648
667
  var Trigger = class {
649
668
  constructor(_options = {
650
669
  autoReset: false
@@ -659,9 +678,9 @@ var Trigger = class {
659
678
  /**
660
679
  * Wait until wake is called, with optional timeout.
661
680
  */
662
- async wait({ timeout } = {}) {
663
- if (timeout) {
664
- return asyncTimeout(this._promise, timeout, new TimeoutError(timeout));
681
+ async wait({ timeout: timeout2 } = {}) {
682
+ if (timeout2) {
683
+ return asyncTimeout(this._promise, timeout2, new TimeoutError(timeout2));
665
684
  } else {
666
685
  return this._promise;
667
686
  }
@@ -714,11 +733,7 @@ var Trigger = class {
714
733
  // packages/common/async/src/observable.ts
715
734
  var MulticastObservable = class _MulticastObservable extends Observable {
716
735
  constructor(subscriber, _value) {
717
- super((observer) => this._subscribe(observer));
718
- this._value = _value;
719
- this._observers = /* @__PURE__ */ new Set();
720
- this._completed = new Trigger();
721
- this._handlers = {
736
+ super((observer) => this._subscribe(observer)), this._value = _value, this._observers = /* @__PURE__ */ new Set(), this._completed = new Trigger(), this._handlers = {
722
737
  next: (value) => {
723
738
  this._value = value;
724
739
  this._observers.forEach((observer) => observer.next?.(value));
@@ -768,9 +783,9 @@ var MulticastObservable = class _MulticastObservable extends Observable {
768
783
  *
769
784
  * @returns Promise that resolves to the value of the observable at the time of completion.
770
785
  */
771
- async wait({ timeout } = {}) {
786
+ async wait({ timeout: timeout2 } = {}) {
772
787
  await this._completed.wait({
773
- timeout
788
+ timeout: timeout2
774
789
  });
775
790
  return this.get();
776
791
  }
@@ -847,9 +862,7 @@ var ObservableProvider = class {
847
862
  };
848
863
  var CancellableObservableProvider = class extends ObservableProvider {
849
864
  constructor(_handleCancel) {
850
- super();
851
- this._handleCancel = _handleCancel;
852
- this._cancelled = false;
865
+ super(), this._handleCancel = _handleCancel, this._cancelled = false;
853
866
  }
854
867
  get cancelled() {
855
868
  return this._cancelled;
@@ -1032,17 +1045,17 @@ var scheduleTask = (ctx, fn, afterMs) => {
1032
1045
  name: `task (${fn.name || "anonymous"})`,
1033
1046
  openStack: new StackTrace2()
1034
1047
  }));
1035
- const timeout = setTimeout(async () => {
1048
+ const timeout2 = setTimeout(async () => {
1036
1049
  clearDispose();
1037
1050
  await runInContextAsync(ctx, fn);
1038
1051
  clearTracking();
1039
1052
  }, afterMs);
1040
1053
  const clearDispose = ctx.onDispose(() => {
1041
1054
  clearTracking();
1042
- clearTimeout(timeout);
1055
+ clearTimeout(timeout2);
1043
1056
  });
1044
1057
  };
1045
- var scheduleTaskInterval = (ctx, task, interval) => {
1058
+ var scheduleTaskInterval = (ctx, task, interval2) => {
1046
1059
  const clearTracking = trackResource(() => ({
1047
1060
  name: `repeating task (${task.name || "anonymous"})`,
1048
1061
  openStack: new StackTrace2()
@@ -1053,9 +1066,9 @@ var scheduleTaskInterval = (ctx, task, interval) => {
1053
1066
  if (ctx.disposed) {
1054
1067
  return;
1055
1068
  }
1056
- timeoutId = setTimeout(run, interval);
1069
+ timeoutId = setTimeout(run, interval2);
1057
1070
  };
1058
- timeoutId = setTimeout(run, interval);
1071
+ timeoutId = setTimeout(run, interval2);
1059
1072
  ctx.onDispose(() => {
1060
1073
  clearTracking();
1061
1074
  clearTimeout(timeoutId);
@@ -1067,16 +1080,16 @@ var scheduleExponentialBackoffTaskInterval = (ctx, task, initialInterval) => {
1067
1080
  openStack: new StackTrace2()
1068
1081
  }));
1069
1082
  let timeoutId;
1070
- let interval = initialInterval;
1083
+ let interval2 = initialInterval;
1071
1084
  const repeat = async () => {
1072
1085
  await runInContextAsync(ctx, task);
1073
1086
  if (ctx.disposed) {
1074
1087
  return;
1075
1088
  }
1076
- interval *= 2;
1077
- timeoutId = setTimeout(repeat, interval);
1089
+ interval2 *= 2;
1090
+ timeoutId = setTimeout(repeat, interval2);
1078
1091
  };
1079
- timeoutId = setTimeout(repeat, interval);
1092
+ timeoutId = setTimeout(repeat, interval2);
1080
1093
  ctx.onDispose(() => {
1081
1094
  clearTracking();
1082
1095
  clearTimeout(timeoutId);
@@ -1180,7 +1193,7 @@ var PersistentLifecycle = class extends Resource {
1180
1193
  /**
1181
1194
  * Scheduling restart should be done from outside.
1182
1195
  */
1183
- scheduleRestart() {
1196
+ async scheduleRestart() {
1184
1197
  if (this._lifecycleState !== LifecycleState.OPEN) {
1185
1198
  return;
1186
1199
  }
@@ -1324,15 +1337,15 @@ var TestStream = class extends Duplex {
1324
1337
  this._received = Buffer.alloc(0);
1325
1338
  this._onWrite = new Event();
1326
1339
  }
1327
- static async assertConnectivity(stream1, stream2, { timeout = 200 } = {}) {
1340
+ static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1328
1341
  stream1.push("ping");
1329
1342
  stream2.push("pong");
1330
1343
  await Promise.all([
1331
1344
  stream2.assertReceivedAsync("ping", {
1332
- timeout
1345
+ timeout: timeout2
1333
1346
  }),
1334
1347
  stream1.assertReceivedAsync("pong", {
1335
- timeout
1348
+ timeout: timeout2
1336
1349
  })
1337
1350
  ]);
1338
1351
  }
@@ -1346,15 +1359,15 @@ var TestStream = class extends Duplex {
1346
1359
  }
1347
1360
  _read(size) {
1348
1361
  }
1349
- assertReceivedAsync(data, { timeout = 200 } = {}) {
1362
+ assertReceivedAsync(data, { timeout: timeout2 = 200 } = {}) {
1350
1363
  const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
1351
- return asyncTimeout(this._onWrite.waitForCondition(() => this._received.equals(dataBuffer)), timeout);
1364
+ return asyncTimeout(this._onWrite.waitForCondition(() => this._received.equals(dataBuffer)), timeout2);
1352
1365
  }
1353
1366
  };
1354
1367
 
1355
1368
  // packages/common/async/src/testing.ts
1356
- var waitForCondition = ({ condition, timeout = 0, interval = 10, error }) => {
1357
- const stopTime = timeout ? Date.now() + timeout : 0;
1369
+ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2 = 10, error, breakOnError = false }) => {
1370
+ const stopTime = timeout2 ? Date.now() + timeout2 : 0;
1358
1371
  const trigger2 = new Trigger();
1359
1372
  const waiter = async () => {
1360
1373
  while (!stopTime || Date.now() < stopTime) {
@@ -1365,12 +1378,17 @@ var waitForCondition = ({ condition, timeout = 0, interval = 10, error }) => {
1365
1378
  break;
1366
1379
  }
1367
1380
  } catch (err) {
1381
+ if (breakOnError === true) {
1382
+ trigger2.throw(err);
1383
+ }
1368
1384
  }
1369
- await sleep(interval);
1385
+ await sleep(interval2);
1370
1386
  }
1371
1387
  };
1372
1388
  setTimeout(waiter, 0);
1373
- return timeout ? asyncTimeout(trigger2.wait(), timeout, error ?? new Error("Timeout")) : trigger2.wait();
1389
+ return trigger2.wait({
1390
+ timeout: timeout2
1391
+ });
1374
1392
  };
1375
1393
 
1376
1394
  // packages/common/async/src/timer.ts
@@ -1401,11 +1419,11 @@ var Timer = class {
1401
1419
  if (this._count >= (options.count ?? 0)) {
1402
1420
  stop();
1403
1421
  } else {
1404
- const interval = (options.interval ?? 0) + Math.random() * (options.jitter ?? 0);
1422
+ const interval2 = (options.interval ?? 0) + Math.random() * (options.jitter ?? 0);
1405
1423
  this._timer = setTimeout(async () => {
1406
1424
  await this._callback(this._count++);
1407
1425
  run();
1408
- }, interval);
1426
+ }, interval2);
1409
1427
  }
1410
1428
  };
1411
1429
  this._state.emit(true);
@@ -1422,11 +1440,11 @@ var Timer = class {
1422
1440
  };
1423
1441
 
1424
1442
  // packages/common/async/src/until.ts
1425
- var until = (cb, timeout) => {
1443
+ var until = (cb, timeout2) => {
1426
1444
  return new Promise((resolve, reject) => {
1427
- const t = timeout && setTimeout(() => {
1445
+ const t = timeout2 && setTimeout(() => {
1428
1446
  reject(new Error(`Timeout after ${t}ms`));
1429
- }, timeout);
1447
+ }, timeout2);
1430
1448
  setTimeout(async () => {
1431
1449
  try {
1432
1450
  await cb((value) => {
@@ -1546,6 +1564,7 @@ export {
1546
1564
  Trigger,
1547
1565
  TriggerState,
1548
1566
  UpdateScheduler,
1567
+ addEventListener,
1549
1568
  addListener,
1550
1569
  asyncChain,
1551
1570
  asyncReturn,
@@ -1554,6 +1573,7 @@ export {
1554
1573
  createPromiseFromCallback,
1555
1574
  debounce,
1556
1575
  dumpLeaks,
1576
+ interval,
1557
1577
  latch,
1558
1578
  makePushIterable,
1559
1579
  observableError,
@@ -1569,6 +1589,7 @@ export {
1569
1589
  sleepWithContext,
1570
1590
  streamToArray,
1571
1591
  synchronized,
1592
+ timeout,
1572
1593
  toError,
1573
1594
  trackLeaks,
1574
1595
  trackResource,