@dxos/async 0.8.4-main.f9ba587 → 0.8.4-main.fcc0d83b33

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 (77) hide show
  1. package/dist/lib/browser/index.mjs +306 -269
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +306 -269
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/callback.d.ts +2 -1
  8. package/dist/types/src/callback.d.ts.map +1 -1
  9. package/dist/types/src/chain.d.ts +1 -1
  10. package/dist/types/src/chain.d.ts.map +1 -1
  11. package/dist/types/src/cleanup.d.ts +3 -3
  12. package/dist/types/src/cleanup.d.ts.map +1 -1
  13. package/dist/types/src/debounce.d.ts +37 -3
  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.map +1 -1
  18. package/dist/types/src/index.d.ts +0 -5
  19. package/dist/types/src/index.d.ts.map +1 -1
  20. package/dist/types/src/mutex.d.ts.map +1 -1
  21. package/dist/types/src/observable-value.d.ts.map +1 -1
  22. package/dist/types/src/observable.d.ts.map +1 -1
  23. package/dist/types/src/persistent-lifecycle.d.ts +2 -2
  24. package/dist/types/src/persistent-lifecycle.d.ts.map +1 -1
  25. package/dist/types/src/stream-to-array.d.ts.map +1 -1
  26. package/dist/types/src/task-scheduling.d.ts +29 -1
  27. package/dist/types/src/task-scheduling.d.ts.map +1 -1
  28. package/dist/types/src/test-stream.d.ts.map +1 -1
  29. package/dist/types/src/testing.d.ts +13 -0
  30. package/dist/types/src/testing.d.ts.map +1 -1
  31. package/dist/types/src/timeout.d.ts +2 -2
  32. package/dist/types/src/timeout.d.ts.map +1 -1
  33. package/dist/types/src/timer.d.ts.map +1 -1
  34. package/dist/types/src/track-leaks.d.ts.map +1 -1
  35. package/dist/types/src/trigger.d.ts +11 -0
  36. package/dist/types/src/trigger.d.ts.map +1 -1
  37. package/dist/types/src/update-scheduler.d.ts.map +1 -1
  38. package/dist/types/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +13 -12
  40. package/src/callback.ts +3 -3
  41. package/src/chain.ts +1 -1
  42. package/src/cleanup.ts +10 -7
  43. package/src/debounce.test.ts +69 -12
  44. package/src/debounce.ts +88 -14
  45. package/src/event-emitter.test.ts +1 -1
  46. package/src/index.ts +0 -5
  47. package/src/observable-value.test.ts +1 -1
  48. package/src/observable-value.ts +4 -2
  49. package/src/persistent-lifecycle.test.ts +1 -1
  50. package/src/persistent-lifecycle.ts +2 -2
  51. package/src/task-scheduling.ts +95 -1
  52. package/src/testing.test.ts +41 -1
  53. package/src/testing.ts +53 -0
  54. package/src/timeout.ts +27 -29
  55. package/src/trigger.ts +58 -1
  56. package/src/update-scheduler.ts +1 -1
  57. package/dist/types/src/latch.d.ts +0 -11
  58. package/dist/types/src/latch.d.ts.map +0 -1
  59. package/dist/types/src/sink.d.ts +0 -6
  60. package/dist/types/src/sink.d.ts.map +0 -1
  61. package/dist/types/src/throttle.d.ts +0 -2
  62. package/dist/types/src/throttle.d.ts.map +0 -1
  63. package/dist/types/src/throttle.test.d.ts +0 -2
  64. package/dist/types/src/throttle.test.d.ts.map +0 -1
  65. package/dist/types/src/types.d.ts +0 -2
  66. package/dist/types/src/types.d.ts.map +0 -1
  67. package/dist/types/src/until.d.ts +0 -14
  68. package/dist/types/src/until.d.ts.map +0 -1
  69. package/dist/types/src/until.test.d.ts +0 -2
  70. package/dist/types/src/until.test.d.ts.map +0 -1
  71. package/src/latch.ts +0 -60
  72. package/src/sink.ts +0 -26
  73. package/src/throttle.test.ts +0 -65
  74. package/src/throttle.ts +0 -14
  75. package/src/types.ts +0 -5
  76. package/src/until.test.ts +0 -47
  77. package/src/until.ts +0 -58
@@ -1,5 +1,5 @@
1
1
  // src/callback.ts
2
- var createPromiseFromCallback = (run) => new Promise((resolve, reject) => {
2
+ var promiseFromCallback = (run) => new Promise((resolve, reject) => {
3
3
  run((error, value) => {
4
4
  if (error) {
5
5
  reject(error);
@@ -10,9 +10,9 @@ var createPromiseFromCallback = (run) => new Promise((resolve, reject) => {
10
10
  });
11
11
 
12
12
  // src/chain.ts
13
- var asyncChain = (chain) => async (elements) => {
13
+ var chain = (chain2) => async (elements) => {
14
14
  let result = await elements;
15
- for (const part of chain) {
15
+ for (const part of chain2) {
16
16
  result = await Promise.all(result.map(async (element) => await part(element)));
17
17
  }
18
18
  return result;
@@ -22,7 +22,7 @@ var asyncChain = (chain) => async (elements) => {
22
22
  import { ComplexMap } from "@dxos/util";
23
23
  var combine = (...cleanupFns) => {
24
24
  return () => {
25
- cleanupFns.flat().forEach((cleanupFn) => cleanupFn());
25
+ cleanupFns.flat().filter((f) => typeof f === "function").forEach((cleanupFn) => cleanupFn());
26
26
  };
27
27
  };
28
28
  var timeout = (cb, ms = 0) => {
@@ -33,16 +33,14 @@ var interval = (cb, ms) => {
33
33
  const t = setInterval(cb, ms);
34
34
  return () => clearInterval(t);
35
35
  };
36
- function addEventListener(target, type, listener, options) {
36
+ var addEventListener = (target, type, listener, options) => {
37
37
  target.addEventListener(type, listener, options);
38
38
  return () => target.removeEventListener(type, listener, options);
39
- }
39
+ };
40
40
  var SubscriptionList = class {
41
- constructor() {
42
- this._cleanups = [];
43
- }
44
- add(cb) {
45
- this._cleanups.push(cb);
41
+ _cleanups = [];
42
+ add(...cb) {
43
+ this._cleanups.push(...cb);
46
44
  return this;
47
45
  }
48
46
  clear() {
@@ -51,6 +49,7 @@ var SubscriptionList = class {
51
49
  }
52
50
  };
53
51
  var SubscriptionSet = class {
52
+ _cleanupMap;
54
53
  constructor(keyProjection) {
55
54
  this._cleanupMap = new ComplexMap(keyProjection);
56
55
  }
@@ -64,32 +63,56 @@ var SubscriptionSet = class {
64
63
  }
65
64
  };
66
65
 
67
- // src/throttle.ts
68
- var throttle = (cb, wait = 100) => {
69
- let lastCall = 0;
66
+ // src/debounce.ts
67
+ var delay = (cb, delay2 = 100) => {
68
+ let pending = false;
70
69
  return (...args) => {
71
- const now = Date.now();
72
- if (now - lastCall >= wait) {
73
- cb(...args);
74
- lastCall = now;
70
+ if (pending) {
71
+ return;
75
72
  }
73
+ pending = true;
74
+ setTimeout(() => {
75
+ try {
76
+ cb(...args);
77
+ } finally {
78
+ pending = false;
79
+ }
80
+ }, delay2);
76
81
  };
77
82
  };
78
-
79
- // src/debounce.ts
80
- var debounce = (cb, wait = 100) => {
83
+ var debounce = (cb, delay2 = 100) => {
81
84
  let t;
82
85
  return (...args) => {
83
86
  clearTimeout(t);
84
- t = setTimeout(() => cb(...args), wait);
87
+ t = setTimeout(() => cb(...args), delay2);
85
88
  };
86
89
  };
87
- var debounceAndThrottle = (cb, wait = 100) => {
88
- const debounced = debounce(cb, wait);
89
- const throttled = throttle(cb, wait);
90
+ var throttle = (cb, delay2 = 100) => {
91
+ let lastCall = 0;
90
92
  return (...args) => {
91
- debounced(...args);
92
- throttled(...args);
93
+ const now = Date.now();
94
+ if (now - lastCall >= delay2) {
95
+ cb(...args);
96
+ lastCall = now;
97
+ }
98
+ };
99
+ };
100
+ var debounceAndThrottle = (cb, delay2 = 100) => {
101
+ let timeout2;
102
+ let lastCall = 0;
103
+ return (...args) => {
104
+ const now = Date.now();
105
+ const delta = now - lastCall;
106
+ clearTimeout(timeout2);
107
+ if (delta >= delay2) {
108
+ cb(...args);
109
+ lastCall = now;
110
+ } else {
111
+ timeout2 = setTimeout(() => {
112
+ cb(...args);
113
+ lastCall = Date.now();
114
+ }, delay2 - delta);
115
+ }
93
116
  };
94
117
  };
95
118
 
@@ -124,8 +147,28 @@ var sleep = (ms) => {
124
147
  sleeper();
125
148
  });
126
149
  };
150
+ var sleepWithContext = (ctx, ms) => {
151
+ const error = new ContextDisposedError();
152
+ return new Promise((resolve, reject) => {
153
+ if (ctx.disposed) {
154
+ reject(error);
155
+ return;
156
+ }
157
+ const timeout2 = setTimeout(() => {
158
+ clearDispose();
159
+ resolve();
160
+ }, ms);
161
+ const clearDispose = ctx.onDispose(() => {
162
+ clearTimeout(timeout2);
163
+ reject(error);
164
+ });
165
+ });
166
+ };
127
167
  var asyncReturn = () => sleep(0);
128
168
  var asyncTimeout = async (promise, timeout2, err) => {
169
+ if (typeof promise === "function") {
170
+ throw new Error("First argument must be a promise.");
171
+ }
129
172
  let timeoutId;
130
173
  const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
131
174
  const timeoutPromise = new Promise((resolve, reject) => {
@@ -134,9 +177,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
134
177
  }, timeout2);
135
178
  unrefTimeout(timeoutId);
136
179
  });
137
- const conditionTimeout = typeof promise === "function" ? createPromiseFromCallback(promise) : promise;
138
180
  return await Promise.race([
139
- conditionTimeout,
181
+ promise,
140
182
  timeoutPromise
141
183
  ]).finally(() => {
142
184
  clearTimeout(timeoutId);
@@ -147,23 +189,6 @@ var unrefTimeout = (timeoutId) => {
147
189
  timeoutId.unref();
148
190
  }
149
191
  };
150
- var sleepWithContext = (ctx, ms) => {
151
- const error = new ContextDisposedError();
152
- return new Promise((resolve, reject) => {
153
- if (ctx.disposed) {
154
- reject(error);
155
- return;
156
- }
157
- const timeout2 = setTimeout(() => {
158
- clearDispose();
159
- resolve();
160
- }, ms);
161
- const clearDispose = ctx.onDispose(() => {
162
- clearTimeout(timeout2);
163
- reject(error);
164
- });
165
- });
166
- };
167
192
 
168
193
  // src/event-emitter.ts
169
194
  var onEvent = (eventEmitter, eventName, callback) => {
@@ -190,13 +215,8 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
190
215
 
191
216
  // src/events.ts
192
217
  import { Context } from "@dxos/context";
193
- var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
194
218
  var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
195
219
  var Event = class _Event {
196
- constructor() {
197
- this._listeners = /* @__PURE__ */ new Set();
198
- this._effects = /* @__PURE__ */ new Set();
199
- }
200
220
  /**
201
221
  * Wrap objects that have on/off style event emitters.
202
222
  */
@@ -209,6 +229,8 @@ var Event = class _Event {
209
229
  });
210
230
  return event;
211
231
  }
232
+ _listeners = /* @__PURE__ */ new Set();
233
+ _effects = /* @__PURE__ */ new Set();
212
234
  /**
213
235
  * Emit an event.
214
236
  * In most cases should only be called by the class or entity containing the event.
@@ -247,10 +269,7 @@ var Event = class _Event {
247
269
  _ctx,
248
270
  _callback
249
271
  ] : [
250
- new Context(void 0, {
251
- F: __dxlog_file,
252
- L: 132
253
- }),
272
+ new Context(),
254
273
  _ctx
255
274
  ];
256
275
  const weak = !!options?.weak;
@@ -280,10 +299,7 @@ var Event = class _Event {
280
299
  _ctx,
281
300
  _callback
282
301
  ] : [
283
- new Context(void 0, {
284
- F: __dxlog_file,
285
- L: 169
286
- }),
302
+ new Context(),
287
303
  _ctx
288
304
  ];
289
305
  const listener = new EventListener(this, callback, ctx, true, false);
@@ -452,11 +468,15 @@ var Event = class _Event {
452
468
  }
453
469
  };
454
470
  var EventListener = class {
471
+ ctx;
472
+ once;
473
+ weak;
474
+ callback;
475
+ _clearDispose = void 0;
455
476
  constructor(event, listener, ctx, once, weak) {
456
477
  this.ctx = ctx;
457
478
  this.once = once;
458
479
  this.weak = weak;
459
- this._clearDispose = void 0;
460
480
  this._clearDispose = ctx.onDispose(() => {
461
481
  event._removeListener(this);
462
482
  });
@@ -516,65 +536,13 @@ var weakListeners = () => {
516
536
  };
517
537
  };
518
538
 
519
- // src/latch.ts
520
- import { invariant } from "@dxos/invariant";
521
- var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/latch.ts";
522
- var latch = ({ count = 1, timeout: timeout2 } = {}) => {
523
- invariant(count >= 0, void 0, {
524
- F: __dxlog_file2,
525
- L: 19,
526
- S: void 0,
527
- A: [
528
- "count >= 0",
529
- ""
530
- ]
531
- });
532
- let t;
533
- let doResolve;
534
- let doReject;
535
- const promise = new Promise((resolve, reject) => {
536
- doResolve = (value) => {
537
- clearTimeout(t);
538
- resolve(value);
539
- };
540
- doReject = (err) => {
541
- clearTimeout(t);
542
- reject(err);
543
- };
544
- });
545
- if (count === 0) {
546
- setTimeout(() => {
547
- doResolve(0);
548
- });
549
- } else {
550
- if (timeout2) {
551
- t = setTimeout(() => {
552
- doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
553
- }, timeout2);
554
- }
555
- }
556
- let i = 0;
557
- return [
558
- async () => await promise,
559
- () => {
560
- if (++i === count) {
561
- doResolve(i);
562
- }
563
- return i;
564
- },
565
- (err) => doReject(err)
566
- ];
567
- };
568
-
569
539
  // src/mutex.ts
570
540
  import "@dxos/util";
571
541
  import { warnAfterTimeout } from "@dxos/debug";
572
542
  var Mutex = class {
573
- constructor() {
574
- this._queue = Promise.resolve();
575
- this._queueLength = 0;
576
- this._tag = null;
577
- }
543
+ _queue = Promise.resolve();
544
+ _queueLength = 0;
545
+ _tag = null;
578
546
  get tag() {
579
547
  return this._tag;
580
548
  }
@@ -620,6 +588,7 @@ var Mutex = class {
620
588
  }
621
589
  };
622
590
  var MutexGuard = class {
591
+ _release;
623
592
  constructor(_release) {
624
593
  this._release = _release;
625
594
  }
@@ -633,7 +602,7 @@ var MutexGuard = class {
633
602
  this.release();
634
603
  }
635
604
  };
636
- var classMutexSymbol = Symbol("class-mutex");
605
+ var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
637
606
  var FORCE_DISABLE_WARNING = false;
638
607
  var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
639
608
  var synchronized = (target, propertyName, descriptor) => {
@@ -663,6 +632,7 @@ import Observable from "zen-observable";
663
632
  import PushStream from "zen-push";
664
633
 
665
634
  // src/trigger.ts
635
+ import { invariant } from "@dxos/invariant";
666
636
  var trigger = (timeout2) => {
667
637
  let callback;
668
638
  const promise = new Promise((resolve, reject) => {
@@ -678,18 +648,22 @@ var trigger = (timeout2) => {
678
648
  resolver
679
649
  ];
680
650
  };
681
- var TriggerState = /* @__PURE__ */ function(TriggerState2) {
651
+ var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
682
652
  TriggerState2["WAITING"] = "WAITING";
683
653
  TriggerState2["RESOLVED"] = "RESOLVED";
684
654
  TriggerState2["REJECTED"] = "REJECTED";
685
655
  return TriggerState2;
686
- }({});
656
+ })({});
687
657
  var Trigger = class {
658
+ _options;
659
+ _promise;
660
+ _resolve;
661
+ _reject;
662
+ _state = "WAITING";
688
663
  constructor(_options = {
689
664
  autoReset: false
690
665
  }) {
691
666
  this._options = _options;
692
- this._state = "WAITING";
693
667
  this.reset();
694
668
  }
695
669
  get state() {
@@ -749,23 +723,53 @@ var Trigger = class {
749
723
  return this;
750
724
  }
751
725
  };
726
+ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
727
+ invariant(count >= 0);
728
+ let t;
729
+ let doResolve;
730
+ let doReject;
731
+ const promise = new Promise((resolve, reject) => {
732
+ doResolve = (value) => {
733
+ clearTimeout(t);
734
+ resolve(value);
735
+ };
736
+ doReject = (err) => {
737
+ clearTimeout(t);
738
+ reject(err);
739
+ };
740
+ });
741
+ if (count === 0) {
742
+ setTimeout(() => {
743
+ doResolve(0);
744
+ });
745
+ } else {
746
+ if (timeout2) {
747
+ t = setTimeout(() => {
748
+ doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
749
+ }, timeout2);
750
+ }
751
+ }
752
+ let i = 0;
753
+ return [
754
+ async () => await promise,
755
+ () => {
756
+ if (++i === count) {
757
+ doResolve(i);
758
+ }
759
+ return i;
760
+ },
761
+ (err) => doReject(err)
762
+ ];
763
+ };
752
764
 
753
765
  // src/observable.ts
754
766
  var MulticastObservable = class _MulticastObservable extends Observable {
767
+ _value;
768
+ _observers = /* @__PURE__ */ new Set();
769
+ _observable;
770
+ _completed = new Trigger();
755
771
  constructor(subscriber, _value) {
756
- super((observer) => this._subscribe(observer)), this._value = _value, this._observers = /* @__PURE__ */ new Set(), this._completed = new Trigger(), this._handlers = {
757
- next: (value) => {
758
- this._value = value;
759
- this._observers.forEach((observer) => observer.next?.(value));
760
- },
761
- error: (err) => {
762
- this._observers.forEach((observer) => observer.error?.(err));
763
- },
764
- complete: () => {
765
- this._completed.wake();
766
- this._observers.forEach((observer) => observer.complete?.());
767
- }
768
- };
772
+ super((observer) => this._subscribe(observer)), this._value = _value;
769
773
  this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
770
774
  this._observable.subscribe(this._handlers);
771
775
  }
@@ -849,18 +853,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
849
853
  this._observers.delete(observer);
850
854
  };
851
855
  }
856
+ _handlers = {
857
+ next: (value) => {
858
+ this._value = value;
859
+ this._observers.forEach((observer) => observer.next?.(value));
860
+ },
861
+ error: (err) => {
862
+ this._observers.forEach((observer) => observer.error?.(err));
863
+ },
864
+ complete: () => {
865
+ this._completed.wake();
866
+ this._observers.forEach((observer) => observer.complete?.());
867
+ }
868
+ };
852
869
  };
853
870
  var EMPTY_OBSERVABLE = MulticastObservable.of(null);
854
871
 
855
872
  // src/observable-value.ts
856
873
  import { createSetDispatch } from "@dxos/util";
857
874
  var ObservableProvider = class {
858
- constructor() {
859
- this._handlers = /* @__PURE__ */ new Set();
860
- this._proxy = createSetDispatch({
861
- handlers: this._handlers
862
- });
863
- }
875
+ _handlers = /* @__PURE__ */ new Set();
876
+ _proxy = createSetDispatch({
877
+ handlers: this._handlers
878
+ });
879
+ _value;
864
880
  /**
865
881
  * Proxy used to dispatch callbacks to each subscription.
866
882
  */
@@ -881,8 +897,10 @@ var ObservableProvider = class {
881
897
  }
882
898
  };
883
899
  var CancellableObservableProvider = class extends ObservableProvider {
900
+ _handleCancel;
901
+ _cancelled = false;
884
902
  constructor(_handleCancel) {
885
- super(), this._handleCancel = _handleCancel, this._cancelled = false;
903
+ super(), this._handleCancel = _handleCancel;
886
904
  }
887
905
  get cancelled() {
888
906
  return this._cancelled;
@@ -903,16 +921,15 @@ import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
903
921
  import { log as log2 } from "@dxos/log";
904
922
 
905
923
  // src/task-scheduling.ts
906
- import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
924
+ import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
907
925
  import { StackTrace as StackTrace2 } from "@dxos/debug";
908
926
 
909
927
  // src/track-leaks.ts
910
928
  import { StackTrace } from "@dxos/debug";
911
929
  import { log } from "@dxos/log";
912
- var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
913
930
  var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
914
931
  var openResources = /* @__PURE__ */ new Set();
915
- var handleSymbol = Symbol("checkLeaksHandle");
932
+ var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
916
933
  var trackResource = (resourceProvider) => {
917
934
  if (!enabled) {
918
935
  return () => {
@@ -959,31 +976,11 @@ var dumpLeaks = () => {
959
976
  if (!enabled) {
960
977
  return;
961
978
  }
962
- log.info(`Leaked resources ${openResources.size}:`, void 0, {
963
- F: __dxlog_file3,
964
- L: 82,
965
- S: void 0,
966
- C: (f, a) => f(...a)
967
- });
979
+ log.info(`Leaked resources ${openResources.size}:`);
968
980
  for (const resource of openResources) {
969
- log.info(`- ${resource.name} at`, void 0, {
970
- F: __dxlog_file3,
971
- L: 84,
972
- S: void 0,
973
- C: (f, a) => f(...a)
974
- });
975
- log.info(resource.openStack.getStack(1), void 0, {
976
- F: __dxlog_file3,
977
- L: 85,
978
- S: void 0,
979
- C: (f, a) => f(...a)
980
- });
981
- log.info("\n", void 0, {
982
- F: __dxlog_file3,
983
- L: 86,
984
- S: void 0,
985
- C: (f, a) => f(...a)
986
- });
981
+ log.info(`- ${resource.name} at`);
982
+ log.info(resource.openStack.getStack(1));
983
+ log.info("\n");
987
984
  }
988
985
  };
989
986
  if (enabled) {
@@ -992,12 +989,14 @@ if (enabled) {
992
989
 
993
990
  // src/task-scheduling.ts
994
991
  var DeferredTask = class {
992
+ _ctx;
993
+ _callback;
994
+ _scheduled = false;
995
+ _currentTask = null;
996
+ _nextTask = new Trigger();
995
997
  constructor(_ctx, _callback) {
996
998
  this._ctx = _ctx;
997
999
  this._callback = _callback;
998
- this._scheduled = false;
999
- this._currentTask = null;
1000
- this._nextTask = new Trigger();
1001
1000
  }
1002
1001
  get scheduled() {
1003
1002
  return this._scheduled;
@@ -1038,6 +1037,79 @@ var DeferredTask = class {
1038
1037
  await this._currentTask;
1039
1038
  }
1040
1039
  };
1040
+ var AsyncTask = class {
1041
+ #callback;
1042
+ #ctx = void 0;
1043
+ #scheduled = false;
1044
+ #currentTask = null;
1045
+ #nextTask = new Trigger();
1046
+ constructor(callback) {
1047
+ this.#callback = callback;
1048
+ }
1049
+ get scheduled() {
1050
+ return this.#scheduled;
1051
+ }
1052
+ /**
1053
+ * Context of the resource that owns the task.
1054
+ * When the context is disposed, the task is cancelled and cannot be scheduled again.
1055
+ */
1056
+ open() {
1057
+ this.#ctx = new Context2();
1058
+ }
1059
+ /**
1060
+ * Closes the task and waits for it to finish if it is running.
1061
+ */
1062
+ async close() {
1063
+ await this.#ctx?.dispose();
1064
+ await this.join();
1065
+ this.#ctx = void 0;
1066
+ }
1067
+ [Symbol.asyncDispose]() {
1068
+ return this.close();
1069
+ }
1070
+ /**
1071
+ * Schedule the task to run asynchronously.
1072
+ */
1073
+ // TODO(dmaretskyi): Add scheduleAt. Where the earlier time will override the later one.
1074
+ schedule() {
1075
+ if (!this.#ctx || this.#ctx.disposed) {
1076
+ throw new Error("AsyncTask not open");
1077
+ }
1078
+ if (this.#scheduled) {
1079
+ return;
1080
+ }
1081
+ scheduleTask(this.#ctx, async () => {
1082
+ await this.#currentTask;
1083
+ if (!this.#ctx || this.#ctx.disposed) {
1084
+ return;
1085
+ }
1086
+ this.#scheduled = false;
1087
+ const completionTrigger = this.#nextTask;
1088
+ this.#nextTask = new Trigger();
1089
+ this.#currentTask = runInContextAsync(this.#ctx, () => this.#callback()).then(() => {
1090
+ completionTrigger.wake();
1091
+ });
1092
+ });
1093
+ this.#scheduled = true;
1094
+ }
1095
+ /**
1096
+ * Schedule the task to run and wait for it to finish.
1097
+ */
1098
+ async runBlocking() {
1099
+ if (this.#ctx?.disposed) {
1100
+ throw new ContextDisposedError2();
1101
+ }
1102
+ this.schedule();
1103
+ await this.#nextTask.wait();
1104
+ }
1105
+ /**
1106
+ * Waits for the current task to finish if it is running.
1107
+ * Does not schedule a new task.
1108
+ */
1109
+ async join() {
1110
+ await this.#currentTask;
1111
+ }
1112
+ };
1041
1113
  var runInContext = (ctx, fn) => {
1042
1114
  try {
1043
1115
  fn();
@@ -1123,15 +1195,18 @@ function _ts_decorate(decorators, target, key, desc) {
1123
1195
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1124
1196
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1125
1197
  }
1126
- var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
1127
1198
  var INIT_RESTART_DELAY = 100;
1128
1199
  var DEFAULT_MAX_RESTART_DELAY = 5e3;
1129
1200
  var PersistentLifecycle = class extends Resource {
1201
+ _start;
1202
+ _stop;
1203
+ _onRestart;
1204
+ _maxRestartDelay;
1205
+ _currentState = void 0;
1206
+ _restartTask = void 0;
1207
+ _restartAfter = 0;
1130
1208
  constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
1131
1209
  super();
1132
- this._currentState = void 0;
1133
- this._restartTask = void 0;
1134
- this._restartAfter = 0;
1135
1210
  this._start = start;
1136
1211
  this._stop = stop;
1137
1212
  this._onRestart = onRestart;
@@ -1147,11 +1222,6 @@ var PersistentLifecycle = class extends Resource {
1147
1222
  } catch (err) {
1148
1223
  log2.warn("Restart failed", {
1149
1224
  err
1150
- }, {
1151
- F: __dxlog_file4,
1152
- L: 72,
1153
- S: this,
1154
- C: (f, a) => f(...a)
1155
1225
  });
1156
1226
  this._restartTask?.schedule();
1157
1227
  }
@@ -1159,11 +1229,6 @@ var PersistentLifecycle = class extends Resource {
1159
1229
  this._currentState = await this._start().catch((err) => {
1160
1230
  log2.warn("Start failed", {
1161
1231
  err
1162
- }, {
1163
- F: __dxlog_file4,
1164
- L: 78,
1165
- S: this,
1166
- C: (f, a) => f(...a)
1167
1232
  });
1168
1233
  this._restartTask?.schedule();
1169
1234
  return void 0;
@@ -1177,11 +1242,6 @@ var PersistentLifecycle = class extends Resource {
1177
1242
  async _restart() {
1178
1243
  log2(`restarting in ${this._restartAfter}ms`, {
1179
1244
  state: this._lifecycleState
1180
- }, {
1181
- F: __dxlog_file4,
1182
- L: 91,
1183
- S: this,
1184
- C: (f, a) => f(...a)
1185
1245
  });
1186
1246
  await this._stopCurrentState();
1187
1247
  if (this._lifecycleState !== LifecycleState.OPEN) {
@@ -1200,12 +1260,7 @@ var PersistentLifecycle = class extends Resource {
1200
1260
  try {
1201
1261
  await this._stop(this._currentState);
1202
1262
  } catch (err) {
1203
- log2.catch(err, void 0, {
1204
- F: __dxlog_file4,
1205
- L: 113,
1206
- S: this,
1207
- C: (f, a) => f(...a)
1208
- });
1263
+ log2.catch(err);
1209
1264
  }
1210
1265
  this._currentState = void 0;
1211
1266
  }
@@ -1229,7 +1284,6 @@ _ts_decorate([
1229
1284
 
1230
1285
  // src/push-iterable.ts
1231
1286
  import { invariant as invariant2 } from "@dxos/invariant";
1232
- var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
1233
1287
  var makePushIterable = () => {
1234
1288
  const buf = [];
1235
1289
  const trigger2 = new Trigger({
@@ -1243,15 +1297,7 @@ var makePushIterable = () => {
1243
1297
  await trigger2.wait();
1244
1298
  }
1245
1299
  const item = buf.shift();
1246
- invariant2(item, void 0, {
1247
- F: __dxlog_file5,
1248
- L: 42,
1249
- S: this,
1250
- A: [
1251
- "item",
1252
- ""
1253
- ]
1254
- });
1300
+ invariant2(item);
1255
1301
  switch (item.kind) {
1256
1302
  case "next":
1257
1303
  return {
@@ -1293,20 +1339,6 @@ var makePushIterable = () => {
1293
1339
  };
1294
1340
  };
1295
1341
 
1296
- // src/sink.ts
1297
- var sink = (emitter, event, count = 1) => {
1298
- const [getPromise, resolve] = trigger();
1299
- let counter = 0;
1300
- const listener = () => {
1301
- if (++counter === count) {
1302
- emitter.off(event, listener);
1303
- resolve();
1304
- }
1305
- };
1306
- emitter.on(event, listener);
1307
- return getPromise();
1308
- };
1309
-
1310
1342
  // src/stream-to-array.ts
1311
1343
  var streamToArray = (stream) => {
1312
1344
  let deferred;
@@ -1352,11 +1384,6 @@ var streamToArray = (stream) => {
1352
1384
  // src/test-stream.ts
1353
1385
  import { Duplex } from "@dxos/node-std/stream";
1354
1386
  var TestStream = class extends Duplex {
1355
- constructor() {
1356
- super(...arguments);
1357
- this._received = Buffer.alloc(0);
1358
- this._onWrite = new Event();
1359
- }
1360
1387
  static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1361
1388
  stream1.push("ping");
1362
1389
  stream2.push("pong");
@@ -1369,6 +1396,8 @@ var TestStream = class extends Duplex {
1369
1396
  })
1370
1397
  ]);
1371
1398
  }
1399
+ _received = Buffer.alloc(0);
1400
+ _onWrite = new Event();
1372
1401
  _write(chunk, encoding, callback) {
1373
1402
  this._received = Buffer.concat([
1374
1403
  this._received,
@@ -1410,13 +1439,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
1410
1439
  timeout: timeout2
1411
1440
  });
1412
1441
  };
1442
+ var until = (cb, timeout2) => {
1443
+ return new Promise((resolve, reject) => {
1444
+ const t = timeout2 && setTimeout(() => {
1445
+ reject(new Error(`Timeout after ${t}ms`));
1446
+ }, timeout2);
1447
+ setTimeout(async () => {
1448
+ try {
1449
+ await cb((value) => {
1450
+ t && clearTimeout(t);
1451
+ resolve(value);
1452
+ }, (error) => {
1453
+ t && clearTimeout(t);
1454
+ reject(error);
1455
+ });
1456
+ } catch (err) {
1457
+ reject(err);
1458
+ }
1459
+ });
1460
+ });
1461
+ };
1462
+ var untilPromise = (cb) => cb();
1463
+ var untilError = (cb) => {
1464
+ return new Promise((resolve, reject) => {
1465
+ setTimeout(async () => {
1466
+ try {
1467
+ await cb();
1468
+ reject(new Error("No error was thrown."));
1469
+ } catch (err) {
1470
+ resolve(err);
1471
+ }
1472
+ });
1473
+ });
1474
+ };
1413
1475
 
1414
1476
  // src/timer.ts
1415
1477
  var Timer = class {
1478
+ _callback;
1479
+ _state = new Event();
1480
+ _timer;
1481
+ _count = 0;
1416
1482
  constructor(_callback) {
1417
1483
  this._callback = _callback;
1418
- this._state = new Event();
1419
- this._count = 0;
1420
1484
  }
1421
1485
  get state() {
1422
1486
  return this._state;
@@ -1459,51 +1523,23 @@ var Timer = class {
1459
1523
  }
1460
1524
  };
1461
1525
 
1462
- // src/until.ts
1463
- var until = (cb, timeout2) => {
1464
- return new Promise((resolve, reject) => {
1465
- const t = timeout2 && setTimeout(() => {
1466
- reject(new Error(`Timeout after ${t}ms`));
1467
- }, timeout2);
1468
- setTimeout(async () => {
1469
- try {
1470
- await cb((value) => {
1471
- t && clearTimeout(t);
1472
- resolve(value);
1473
- }, (error) => {
1474
- t && clearTimeout(t);
1475
- reject(error);
1476
- });
1477
- } catch (err) {
1478
- reject(err);
1479
- }
1480
- });
1481
- });
1482
- };
1483
- var untilPromise = (cb) => cb();
1484
- var untilError = (cb) => {
1485
- return new Promise((resolve, reject) => {
1486
- setTimeout(async () => {
1487
- try {
1488
- await cb();
1489
- reject(new Error("No error was thrown."));
1490
- } catch (err) {
1491
- resolve(err);
1492
- }
1493
- });
1494
- });
1495
- };
1496
-
1497
1526
  // src/update-scheduler.ts
1498
1527
  var TIME_PERIOD = 1e3;
1499
1528
  var UpdateScheduler = class {
1529
+ _ctx;
1530
+ _callback;
1531
+ _params;
1532
+ /**
1533
+ * Promise that resolves when the callback is done.
1534
+ * Never rejects.
1535
+ */
1536
+ _promise = null;
1537
+ _scheduled = false;
1538
+ _lastUpdateTime = -TIME_PERIOD;
1500
1539
  constructor(_ctx, _callback, _params = {}) {
1501
1540
  this._ctx = _ctx;
1502
1541
  this._callback = _callback;
1503
1542
  this._params = _params;
1504
- this._promise = null;
1505
- this._scheduled = false;
1506
- this._lastUpdateTime = -TIME_PERIOD;
1507
1543
  _ctx.onDispose(async () => {
1508
1544
  await this._promise;
1509
1545
  });
@@ -1516,13 +1552,13 @@ var UpdateScheduler = class {
1516
1552
  await this._promise;
1517
1553
  if (this._params.maxFrequency) {
1518
1554
  const now = performance.now();
1519
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1520
- if (delay > 0) {
1555
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1556
+ if (delay2 > 0) {
1521
1557
  await new Promise((resolve) => {
1522
1558
  const timeoutId = setTimeout(() => {
1523
1559
  clearContext();
1524
1560
  resolve();
1525
- }, delay);
1561
+ }, delay2);
1526
1562
  const clearContext = this._ctx.onDispose(() => {
1527
1563
  clearTimeout(timeoutId);
1528
1564
  resolve();
@@ -1566,6 +1602,7 @@ var UpdateScheduler = class {
1566
1602
  }
1567
1603
  };
1568
1604
  export {
1605
+ AsyncTask,
1569
1606
  CancellableObservableProvider,
1570
1607
  DeferredTask,
1571
1608
  Event,
@@ -1586,26 +1623,26 @@ export {
1586
1623
  UpdateScheduler,
1587
1624
  addEventListener,
1588
1625
  addListener,
1589
- asyncChain,
1590
1626
  asyncReturn,
1591
1627
  asyncTimeout,
1628
+ chain,
1592
1629
  combine,
1593
- createPromiseFromCallback,
1594
1630
  debounce,
1595
1631
  debounceAndThrottle,
1632
+ delay,
1596
1633
  dumpLeaks,
1597
1634
  interval,
1598
1635
  latch,
1599
1636
  makePushIterable,
1600
1637
  observableError,
1601
1638
  onEvent,
1639
+ promiseFromCallback,
1602
1640
  runInContext,
1603
1641
  runInContextAsync,
1604
1642
  scheduleExponentialBackoffTaskInterval,
1605
1643
  scheduleMicroTask,
1606
1644
  scheduleTask,
1607
1645
  scheduleTaskInterval,
1608
- sink,
1609
1646
  sleep,
1610
1647
  sleepWithContext,
1611
1648
  streamToArray,