@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
@@ -27,6 +27,18 @@ var combine = (...cleanupFns) => {
27
27
  cleanupFns.forEach((cleanupFn) => cleanupFn());
28
28
  };
29
29
  };
30
+ var timeout = (cb, ms = 0) => {
31
+ const t = setTimeout(cb, ms);
32
+ return () => clearTimeout(t);
33
+ };
34
+ var interval = (cb, ms) => {
35
+ const t = setInterval(cb, ms);
36
+ return () => clearInterval(t);
37
+ };
38
+ var addEventListener = (el, event, handler, options) => {
39
+ el.addEventListener(event, handler, options);
40
+ return () => el.removeEventListener(event, handler, options);
41
+ };
30
42
  var SubscriptionList = class {
31
43
  constructor() {
32
44
  this._cleanups = [];
@@ -66,8 +78,8 @@ var debounce = (cb, wait = 100) => {
66
78
  // packages/common/async/src/errors.ts
67
79
  var toError = (err) => err === void 0 || typeof err === "string" ? new Error(err) : err;
68
80
  var TimeoutError = class extends Error {
69
- constructor(timeout, label) {
70
- super(timeout ? `Timeout [${timeout.toLocaleString()}ms]${label === void 0 ? "" : `: ${label}`}` : "Timeout");
81
+ constructor(timeout2, label) {
82
+ super(timeout2 ? `Timeout [${timeout2.toLocaleString()}ms]${label === void 0 ? "" : `: ${label}`}` : "Timeout");
71
83
  }
72
84
  };
73
85
  var observableError = (observable, err) => {
@@ -95,13 +107,13 @@ var sleep = (ms) => {
95
107
  });
96
108
  };
97
109
  var asyncReturn = () => sleep(0);
98
- var asyncTimeout = async (promise, timeout, err) => {
110
+ var asyncTimeout = async (promise, timeout2, err) => {
99
111
  let timeoutId;
100
- const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout, err) : err;
112
+ const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
101
113
  const timeoutPromise = new Promise((resolve, reject) => {
102
114
  timeoutId = setTimeout(() => {
103
115
  reject(throwable);
104
- }, timeout);
116
+ }, timeout2);
105
117
  unrefTimeout(timeoutId);
106
118
  });
107
119
  const conditionTimeout = typeof promise === "function" ? createPromiseFromCallback(promise) : promise;
@@ -124,12 +136,12 @@ var sleepWithContext = (ctx, ms) => {
124
136
  reject(error);
125
137
  return;
126
138
  }
127
- const timeout = setTimeout(() => {
139
+ const timeout2 = setTimeout(() => {
128
140
  clearDispose();
129
141
  resolve();
130
142
  }, ms);
131
143
  const clearDispose = ctx.onDispose(() => {
132
- clearTimeout(timeout);
144
+ clearTimeout(timeout2);
133
145
  reject(error);
134
146
  });
135
147
  });
@@ -146,7 +158,7 @@ var addListener = (eventEmitter, eventName, callback) => {
146
158
  remove: () => off()
147
159
  };
148
160
  };
149
- var waitForEvent = (eventEmitter, eventName, test, timeout, error) => {
161
+ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
150
162
  let off;
151
163
  const promise = new Promise((resolve) => {
152
164
  off = onEvent(eventEmitter, eventName, (...args) => {
@@ -155,7 +167,7 @@ var waitForEvent = (eventEmitter, eventName, test, timeout, error) => {
155
167
  }
156
168
  });
157
169
  });
158
- return timeout ? asyncTimeout(promise, timeout, error ?? new Error()).finally(off) : promise.finally(off);
170
+ return timeout2 ? asyncTimeout(promise, timeout2, error ?? new Error()).finally(off) : promise.finally(off);
159
171
  };
160
172
 
161
173
  // packages/common/async/src/events.ts
@@ -350,14 +362,14 @@ var Event = class _Event {
350
362
  * the event is emitted after `timeout / 8` ms.
351
363
  */
352
364
  // TODO(burdon): Factor out generic function.
353
- debounce(timeout = 0) {
365
+ debounce(timeout2 = 0) {
354
366
  let firing;
355
367
  let lastFired;
356
368
  const debouncedEvent = new _Event();
357
369
  debouncedEvent.addEffect(() => {
358
370
  const unsubscribe = this.on(() => {
359
371
  if (!firing) {
360
- const fireIn = !lastFired || Date.now() - lastFired > timeout ? timeout / 8 : timeout;
372
+ const fireIn = !lastFired || Date.now() - lastFired > timeout2 ? timeout2 / 8 : timeout2;
361
373
  firing = setTimeout(() => {
362
374
  lastFired = Date.now();
363
375
  firing = void 0;
@@ -379,6 +391,13 @@ var Event = class _Event {
379
391
  return this;
380
392
  }
381
393
  /**
394
+ * Pipe the events into another event.
395
+ * @param event
396
+ */
397
+ pipeInto(event) {
398
+ return this.on((data) => event.emit(data));
399
+ }
400
+ /**
382
401
  * Overridden to not return implementation details.
383
402
  */
384
403
  toJSON() {
@@ -482,7 +501,7 @@ var weakListeners = () => {
482
501
  // packages/common/async/src/latch.ts
483
502
  import { invariant } from "@dxos/invariant";
484
503
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/common/async/src/latch.ts";
485
- var latch = ({ count = 1, timeout } = {}) => {
504
+ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
486
505
  invariant(count >= 0, void 0, {
487
506
  F: __dxlog_file2,
488
507
  L: 19,
@@ -510,10 +529,10 @@ var latch = ({ count = 1, timeout } = {}) => {
510
529
  doResolve(0);
511
530
  });
512
531
  } else {
513
- if (timeout) {
532
+ if (timeout2) {
514
533
  t = setTimeout(() => {
515
- doReject(new Error(`Timed out after ${timeout.toLocaleString()}ms`));
516
- }, timeout);
534
+ doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
535
+ }, timeout2);
517
536
  }
518
537
  }
519
538
  let i = 0;
@@ -626,11 +645,11 @@ import Observable from "zen-observable";
626
645
  import PushStream from "zen-push";
627
646
 
628
647
  // packages/common/async/src/trigger.ts
629
- var trigger = (timeout) => {
648
+ var trigger = (timeout2) => {
630
649
  let callback;
631
650
  const promise = new Promise((resolve, reject) => {
632
- if (timeout) {
633
- setTimeout(() => reject(new Error(`Timed out after ${timeout.toLocaleString()}ms`)), timeout);
651
+ if (timeout2) {
652
+ setTimeout(() => reject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`)), timeout2);
634
653
  }
635
654
  callback = resolve;
636
655
  });
@@ -641,12 +660,12 @@ var trigger = (timeout) => {
641
660
  resolver
642
661
  ];
643
662
  };
644
- var TriggerState;
645
- (function(TriggerState2) {
663
+ var TriggerState = /* @__PURE__ */ function(TriggerState2) {
646
664
  TriggerState2["WAITING"] = "WAITING";
647
665
  TriggerState2["RESOLVED"] = "RESOLVED";
648
666
  TriggerState2["REJECTED"] = "REJECTED";
649
- })(TriggerState || (TriggerState = {}));
667
+ return TriggerState2;
668
+ }({});
650
669
  var Trigger = class {
651
670
  constructor(_options = {
652
671
  autoReset: false
@@ -661,9 +680,9 @@ var Trigger = class {
661
680
  /**
662
681
  * Wait until wake is called, with optional timeout.
663
682
  */
664
- async wait({ timeout } = {}) {
665
- if (timeout) {
666
- return asyncTimeout(this._promise, timeout, new TimeoutError(timeout));
683
+ async wait({ timeout: timeout2 } = {}) {
684
+ if (timeout2) {
685
+ return asyncTimeout(this._promise, timeout2, new TimeoutError(timeout2));
667
686
  } else {
668
687
  return this._promise;
669
688
  }
@@ -716,11 +735,7 @@ var Trigger = class {
716
735
  // packages/common/async/src/observable.ts
717
736
  var MulticastObservable = class _MulticastObservable extends Observable {
718
737
  constructor(subscriber, _value) {
719
- super((observer) => this._subscribe(observer));
720
- this._value = _value;
721
- this._observers = /* @__PURE__ */ new Set();
722
- this._completed = new Trigger();
723
- this._handlers = {
738
+ super((observer) => this._subscribe(observer)), this._value = _value, this._observers = /* @__PURE__ */ new Set(), this._completed = new Trigger(), this._handlers = {
724
739
  next: (value) => {
725
740
  this._value = value;
726
741
  this._observers.forEach((observer) => observer.next?.(value));
@@ -770,9 +785,9 @@ var MulticastObservable = class _MulticastObservable extends Observable {
770
785
  *
771
786
  * @returns Promise that resolves to the value of the observable at the time of completion.
772
787
  */
773
- async wait({ timeout } = {}) {
788
+ async wait({ timeout: timeout2 } = {}) {
774
789
  await this._completed.wait({
775
- timeout
790
+ timeout: timeout2
776
791
  });
777
792
  return this.get();
778
793
  }
@@ -849,9 +864,7 @@ var ObservableProvider = class {
849
864
  };
850
865
  var CancellableObservableProvider = class extends ObservableProvider {
851
866
  constructor(_handleCancel) {
852
- super();
853
- this._handleCancel = _handleCancel;
854
- this._cancelled = false;
867
+ super(), this._handleCancel = _handleCancel, this._cancelled = false;
855
868
  }
856
869
  get cancelled() {
857
870
  return this._cancelled;
@@ -1034,17 +1047,17 @@ var scheduleTask = (ctx, fn, afterMs) => {
1034
1047
  name: `task (${fn.name || "anonymous"})`,
1035
1048
  openStack: new StackTrace2()
1036
1049
  }));
1037
- const timeout = setTimeout(async () => {
1050
+ const timeout2 = setTimeout(async () => {
1038
1051
  clearDispose();
1039
1052
  await runInContextAsync(ctx, fn);
1040
1053
  clearTracking();
1041
1054
  }, afterMs);
1042
1055
  const clearDispose = ctx.onDispose(() => {
1043
1056
  clearTracking();
1044
- clearTimeout(timeout);
1057
+ clearTimeout(timeout2);
1045
1058
  });
1046
1059
  };
1047
- var scheduleTaskInterval = (ctx, task, interval) => {
1060
+ var scheduleTaskInterval = (ctx, task, interval2) => {
1048
1061
  const clearTracking = trackResource(() => ({
1049
1062
  name: `repeating task (${task.name || "anonymous"})`,
1050
1063
  openStack: new StackTrace2()
@@ -1055,9 +1068,9 @@ var scheduleTaskInterval = (ctx, task, interval) => {
1055
1068
  if (ctx.disposed) {
1056
1069
  return;
1057
1070
  }
1058
- timeoutId = setTimeout(run, interval);
1071
+ timeoutId = setTimeout(run, interval2);
1059
1072
  };
1060
- timeoutId = setTimeout(run, interval);
1073
+ timeoutId = setTimeout(run, interval2);
1061
1074
  ctx.onDispose(() => {
1062
1075
  clearTracking();
1063
1076
  clearTimeout(timeoutId);
@@ -1069,16 +1082,16 @@ var scheduleExponentialBackoffTaskInterval = (ctx, task, initialInterval) => {
1069
1082
  openStack: new StackTrace2()
1070
1083
  }));
1071
1084
  let timeoutId;
1072
- let interval = initialInterval;
1085
+ let interval2 = initialInterval;
1073
1086
  const repeat = async () => {
1074
1087
  await runInContextAsync(ctx, task);
1075
1088
  if (ctx.disposed) {
1076
1089
  return;
1077
1090
  }
1078
- interval *= 2;
1079
- timeoutId = setTimeout(repeat, interval);
1091
+ interval2 *= 2;
1092
+ timeoutId = setTimeout(repeat, interval2);
1080
1093
  };
1081
- timeoutId = setTimeout(repeat, interval);
1094
+ timeoutId = setTimeout(repeat, interval2);
1082
1095
  ctx.onDispose(() => {
1083
1096
  clearTracking();
1084
1097
  clearTimeout(timeoutId);
@@ -1182,7 +1195,7 @@ var PersistentLifecycle = class extends Resource {
1182
1195
  /**
1183
1196
  * Scheduling restart should be done from outside.
1184
1197
  */
1185
- scheduleRestart() {
1198
+ async scheduleRestart() {
1186
1199
  if (this._lifecycleState !== LifecycleState.OPEN) {
1187
1200
  return;
1188
1201
  }
@@ -1326,15 +1339,15 @@ var TestStream = class extends Duplex {
1326
1339
  this._received = Buffer.alloc(0);
1327
1340
  this._onWrite = new Event();
1328
1341
  }
1329
- static async assertConnectivity(stream1, stream2, { timeout = 200 } = {}) {
1342
+ static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1330
1343
  stream1.push("ping");
1331
1344
  stream2.push("pong");
1332
1345
  await Promise.all([
1333
1346
  stream2.assertReceivedAsync("ping", {
1334
- timeout
1347
+ timeout: timeout2
1335
1348
  }),
1336
1349
  stream1.assertReceivedAsync("pong", {
1337
- timeout
1350
+ timeout: timeout2
1338
1351
  })
1339
1352
  ]);
1340
1353
  }
@@ -1348,15 +1361,15 @@ var TestStream = class extends Duplex {
1348
1361
  }
1349
1362
  _read(size) {
1350
1363
  }
1351
- assertReceivedAsync(data, { timeout = 200 } = {}) {
1364
+ assertReceivedAsync(data, { timeout: timeout2 = 200 } = {}) {
1352
1365
  const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
1353
- return asyncTimeout(this._onWrite.waitForCondition(() => this._received.equals(dataBuffer)), timeout);
1366
+ return asyncTimeout(this._onWrite.waitForCondition(() => this._received.equals(dataBuffer)), timeout2);
1354
1367
  }
1355
1368
  };
1356
1369
 
1357
1370
  // packages/common/async/src/testing.ts
1358
- var waitForCondition = ({ condition, timeout = 0, interval = 10, error }) => {
1359
- const stopTime = timeout ? Date.now() + timeout : 0;
1371
+ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2 = 10, error, breakOnError = false }) => {
1372
+ const stopTime = timeout2 ? Date.now() + timeout2 : 0;
1360
1373
  const trigger2 = new Trigger();
1361
1374
  const waiter = async () => {
1362
1375
  while (!stopTime || Date.now() < stopTime) {
@@ -1367,12 +1380,17 @@ var waitForCondition = ({ condition, timeout = 0, interval = 10, error }) => {
1367
1380
  break;
1368
1381
  }
1369
1382
  } catch (err) {
1383
+ if (breakOnError === true) {
1384
+ trigger2.throw(err);
1385
+ }
1370
1386
  }
1371
- await sleep(interval);
1387
+ await sleep(interval2);
1372
1388
  }
1373
1389
  };
1374
1390
  setTimeout(waiter, 0);
1375
- return timeout ? asyncTimeout(trigger2.wait(), timeout, error ?? new Error("Timeout")) : trigger2.wait();
1391
+ return trigger2.wait({
1392
+ timeout: timeout2
1393
+ });
1376
1394
  };
1377
1395
 
1378
1396
  // packages/common/async/src/timer.ts
@@ -1403,11 +1421,11 @@ var Timer = class {
1403
1421
  if (this._count >= (options.count ?? 0)) {
1404
1422
  stop();
1405
1423
  } else {
1406
- const interval = (options.interval ?? 0) + Math.random() * (options.jitter ?? 0);
1424
+ const interval2 = (options.interval ?? 0) + Math.random() * (options.jitter ?? 0);
1407
1425
  this._timer = setTimeout(async () => {
1408
1426
  await this._callback(this._count++);
1409
1427
  run();
1410
- }, interval);
1428
+ }, interval2);
1411
1429
  }
1412
1430
  };
1413
1431
  this._state.emit(true);
@@ -1424,11 +1442,11 @@ var Timer = class {
1424
1442
  };
1425
1443
 
1426
1444
  // packages/common/async/src/until.ts
1427
- var until = (cb, timeout) => {
1445
+ var until = (cb, timeout2) => {
1428
1446
  return new Promise((resolve, reject) => {
1429
- const t = timeout && setTimeout(() => {
1447
+ const t = timeout2 && setTimeout(() => {
1430
1448
  reject(new Error(`Timeout after ${t}ms`));
1431
- }, timeout);
1449
+ }, timeout2);
1432
1450
  setTimeout(async () => {
1433
1451
  try {
1434
1452
  await cb((value) => {
@@ -1548,6 +1566,7 @@ export {
1548
1566
  Trigger,
1549
1567
  TriggerState,
1550
1568
  UpdateScheduler,
1569
+ addEventListener,
1551
1570
  addListener,
1552
1571
  asyncChain,
1553
1572
  asyncReturn,
@@ -1556,6 +1575,7 @@ export {
1556
1575
  createPromiseFromCallback,
1557
1576
  debounce,
1558
1577
  dumpLeaks,
1578
+ interval,
1559
1579
  latch,
1560
1580
  makePushIterable,
1561
1581
  observableError,
@@ -1571,6 +1591,7 @@ export {
1571
1591
  sleepWithContext,
1572
1592
  streamToArray,
1573
1593
  synchronized,
1594
+ timeout,
1574
1595
  toError,
1575
1596
  trackLeaks,
1576
1597
  trackResource,