@dxos/async 0.8.3 → 0.8.4-main.1068cf700f

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 (65) hide show
  1. package/dist/lib/browser/index.mjs +346 -218
  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 +346 -218
  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 -2
  12. package/dist/types/src/cleanup.d.ts.map +1 -1
  13. package/dist/types/src/debounce.d.ts +34 -1
  14. package/dist/types/src/debounce.d.ts.map +1 -1
  15. package/dist/types/src/debounce.test.d.ts +2 -0
  16. package/dist/types/src/debounce.test.d.ts.map +1 -0
  17. package/dist/types/src/index.d.ts +0 -4
  18. package/dist/types/src/index.d.ts.map +1 -1
  19. package/dist/types/src/persistent-lifecycle.d.ts +2 -2
  20. package/dist/types/src/persistent-lifecycle.d.ts.map +1 -1
  21. package/dist/types/src/task-scheduling.d.ts +29 -1
  22. package/dist/types/src/task-scheduling.d.ts.map +1 -1
  23. package/dist/types/src/testing.d.ts +13 -0
  24. package/dist/types/src/testing.d.ts.map +1 -1
  25. package/dist/types/src/timeout.d.ts +1 -1
  26. package/dist/types/src/timeout.d.ts.map +1 -1
  27. package/dist/types/src/trigger.d.ts +11 -0
  28. package/dist/types/src/trigger.d.ts.map +1 -1
  29. package/dist/types/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +13 -9
  31. package/src/callback.ts +3 -3
  32. package/src/chain.ts +1 -1
  33. package/src/cleanup.ts +6 -5
  34. package/src/debounce.test.ts +115 -0
  35. package/src/debounce.ts +88 -4
  36. package/src/event-emitter.test.ts +2 -1
  37. package/src/events.test.ts +1 -1
  38. package/src/index.ts +0 -4
  39. package/src/observable-value.test.ts +1 -1
  40. package/src/persistent-lifecycle.test.ts +1 -1
  41. package/src/persistent-lifecycle.ts +2 -2
  42. package/src/task-scheduling.ts +95 -1
  43. package/src/testing.test.ts +41 -1
  44. package/src/testing.ts +53 -0
  45. package/src/timeout.ts +23 -22
  46. package/src/trigger.ts +58 -1
  47. package/src/update-scheduler.ts +1 -1
  48. package/dist/lib/node/index.cjs +0 -1638
  49. package/dist/lib/node/index.cjs.map +0 -7
  50. package/dist/lib/node/meta.json +0 -1
  51. package/dist/types/src/latch.d.ts +0 -11
  52. package/dist/types/src/latch.d.ts.map +0 -1
  53. package/dist/types/src/sink.d.ts +0 -6
  54. package/dist/types/src/sink.d.ts.map +0 -1
  55. package/dist/types/src/types.d.ts +0 -2
  56. package/dist/types/src/types.d.ts.map +0 -1
  57. package/dist/types/src/until.d.ts +0 -14
  58. package/dist/types/src/until.d.ts.map +0 -1
  59. package/dist/types/src/until.test.d.ts +0 -2
  60. package/dist/types/src/until.test.d.ts.map +0 -1
  61. package/src/latch.ts +0 -60
  62. package/src/sink.ts +0 -26
  63. package/src/types.ts +0 -5
  64. package/src/until.test.ts +0 -47
  65. package/src/until.ts +0 -58
@@ -1,5 +1,5 @@
1
- // packages/common/async/src/callback.ts
2
- var createPromiseFromCallback = (run) => new Promise((resolve, reject) => {
1
+ // src/callback.ts
2
+ var promiseFromCallback = (run) => new Promise((resolve, reject) => {
3
3
  run((error, value) => {
4
4
  if (error) {
5
5
  reject(error);
@@ -9,16 +9,16 @@ var createPromiseFromCallback = (run) => new Promise((resolve, reject) => {
9
9
  });
10
10
  });
11
11
 
12
- // packages/common/async/src/chain.ts
13
- var asyncChain = (chain) => async (elements) => {
12
+ // src/chain.ts
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;
19
19
  };
20
20
 
21
- // packages/common/async/src/cleanup.ts
21
+ // src/cleanup.ts
22
22
  import { ComplexMap } from "@dxos/util";
23
23
  var combine = (...cleanupFns) => {
24
24
  return () => {
@@ -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,16 +63,60 @@ var SubscriptionSet = class {
64
63
  }
65
64
  };
66
65
 
67
- // packages/common/async/src/debounce.ts
68
- var debounce = (cb, wait = 100) => {
66
+ // src/debounce.ts
67
+ var delay = (cb, delay2 = 100) => {
68
+ let pending = false;
69
+ return (...args) => {
70
+ if (pending) {
71
+ return;
72
+ }
73
+ pending = true;
74
+ setTimeout(() => {
75
+ try {
76
+ cb(...args);
77
+ } finally {
78
+ pending = false;
79
+ }
80
+ }, delay2);
81
+ };
82
+ };
83
+ var debounce = (cb, delay2 = 100) => {
69
84
  let t;
70
85
  return (...args) => {
71
86
  clearTimeout(t);
72
- t = setTimeout(() => cb(...args), wait);
87
+ t = setTimeout(() => cb(...args), delay2);
88
+ };
89
+ };
90
+ var throttle = (cb, delay2 = 100) => {
91
+ let lastCall = 0;
92
+ return (...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
+ }
73
116
  };
74
117
  };
75
118
 
76
- // packages/common/async/src/errors.ts
119
+ // src/errors.ts
77
120
  var toError = (err) => err === void 0 || typeof err === "string" ? new Error(err) : err;
78
121
  var TimeoutError = class extends Error {
79
122
  constructor(timeout2, label) {
@@ -88,7 +131,7 @@ var observableError = (observable, err) => {
88
131
  }
89
132
  };
90
133
 
91
- // packages/common/async/src/timeout.ts
134
+ // src/timeout.ts
92
135
  import { ContextDisposedError } from "@dxos/context";
93
136
  var sleep = (ms) => {
94
137
  return new Promise((resolve) => {
@@ -104,6 +147,23 @@ var sleep = (ms) => {
104
147
  sleeper();
105
148
  });
106
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
+ };
107
167
  var asyncReturn = () => sleep(0);
108
168
  var asyncTimeout = async (promise, timeout2, err) => {
109
169
  let timeoutId;
@@ -114,7 +174,7 @@ var asyncTimeout = async (promise, timeout2, err) => {
114
174
  }, timeout2);
115
175
  unrefTimeout(timeoutId);
116
176
  });
117
- const conditionTimeout = typeof promise === "function" ? createPromiseFromCallback(promise) : promise;
177
+ const conditionTimeout = typeof promise === "function" ? promiseFromCallback(promise) : promise;
118
178
  return await Promise.race([
119
179
  conditionTimeout,
120
180
  timeoutPromise
@@ -127,25 +187,8 @@ var unrefTimeout = (timeoutId) => {
127
187
  timeoutId.unref();
128
188
  }
129
189
  };
130
- var sleepWithContext = (ctx, ms) => {
131
- const error = new ContextDisposedError();
132
- return new Promise((resolve, reject) => {
133
- if (ctx.disposed) {
134
- reject(error);
135
- return;
136
- }
137
- const timeout2 = setTimeout(() => {
138
- clearDispose();
139
- resolve();
140
- }, ms);
141
- const clearDispose = ctx.onDispose(() => {
142
- clearTimeout(timeout2);
143
- reject(error);
144
- });
145
- });
146
- };
147
190
 
148
- // packages/common/async/src/event-emitter.ts
191
+ // src/event-emitter.ts
149
192
  var onEvent = (eventEmitter, eventName, callback) => {
150
193
  eventEmitter.on(eventName, callback);
151
194
  return () => eventEmitter.off(eventName, callback);
@@ -168,15 +211,11 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
168
211
  return timeout2 ? asyncTimeout(promise, timeout2, error ?? new Error()).finally(off) : promise.finally(off);
169
212
  };
170
213
 
171
- // packages/common/async/src/events.ts
214
+ // src/events.ts
172
215
  import { Context } from "@dxos/context";
173
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/async/src/events.ts";
216
+ var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
174
217
  var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
175
218
  var Event = class _Event {
176
- constructor() {
177
- this._listeners = /* @__PURE__ */ new Set();
178
- this._effects = /* @__PURE__ */ new Set();
179
- }
180
219
  /**
181
220
  * Wrap objects that have on/off style event emitters.
182
221
  */
@@ -189,6 +228,8 @@ var Event = class _Event {
189
228
  });
190
229
  return event;
191
230
  }
231
+ _listeners = /* @__PURE__ */ new Set();
232
+ _effects = /* @__PURE__ */ new Set();
192
233
  /**
193
234
  * Emit an event.
194
235
  * In most cases should only be called by the class or entity containing the event.
@@ -432,11 +473,15 @@ var Event = class _Event {
432
473
  }
433
474
  };
434
475
  var EventListener = class {
476
+ ctx;
477
+ once;
478
+ weak;
479
+ callback;
480
+ _clearDispose = void 0;
435
481
  constructor(event, listener, ctx, once, weak) {
436
482
  this.ctx = ctx;
437
483
  this.once = once;
438
484
  this.weak = weak;
439
- this._clearDispose = void 0;
440
485
  this._clearDispose = ctx.onDispose(() => {
441
486
  event._removeListener(this);
442
487
  });
@@ -496,65 +541,13 @@ var weakListeners = () => {
496
541
  };
497
542
  };
498
543
 
499
- // packages/common/async/src/latch.ts
500
- import { invariant } from "@dxos/invariant";
501
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/common/async/src/latch.ts";
502
- var latch = ({ count = 1, timeout: timeout2 } = {}) => {
503
- invariant(count >= 0, void 0, {
504
- F: __dxlog_file2,
505
- L: 19,
506
- S: void 0,
507
- A: [
508
- "count >= 0",
509
- ""
510
- ]
511
- });
512
- let t;
513
- let doResolve;
514
- let doReject;
515
- const promise = new Promise((resolve, reject) => {
516
- doResolve = (value) => {
517
- clearTimeout(t);
518
- resolve(value);
519
- };
520
- doReject = (err) => {
521
- clearTimeout(t);
522
- reject(err);
523
- };
524
- });
525
- if (count === 0) {
526
- setTimeout(() => {
527
- doResolve(0);
528
- });
529
- } else {
530
- if (timeout2) {
531
- t = setTimeout(() => {
532
- doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
533
- }, timeout2);
534
- }
535
- }
536
- let i = 0;
537
- return [
538
- async () => await promise,
539
- () => {
540
- if (++i === count) {
541
- doResolve(i);
542
- }
543
- return i;
544
- },
545
- (err) => doReject(err)
546
- ];
547
- };
548
-
549
- // packages/common/async/src/mutex.ts
544
+ // src/mutex.ts
550
545
  import "@dxos/util";
551
546
  import { warnAfterTimeout } from "@dxos/debug";
552
547
  var Mutex = class {
553
- constructor() {
554
- this._queue = Promise.resolve();
555
- this._queueLength = 0;
556
- this._tag = null;
557
- }
548
+ _queue = Promise.resolve();
549
+ _queueLength = 0;
550
+ _tag = null;
558
551
  get tag() {
559
552
  return this._tag;
560
553
  }
@@ -600,6 +593,7 @@ var Mutex = class {
600
593
  }
601
594
  };
602
595
  var MutexGuard = class {
596
+ _release;
603
597
  constructor(_release) {
604
598
  this._release = _release;
605
599
  }
@@ -638,11 +632,13 @@ var synchronized = (target, propertyName, descriptor) => {
638
632
  });
639
633
  };
640
634
 
641
- // packages/common/async/src/observable.ts
635
+ // src/observable.ts
642
636
  import Observable from "zen-observable";
643
637
  import PushStream from "zen-push";
644
638
 
645
- // packages/common/async/src/trigger.ts
639
+ // src/trigger.ts
640
+ import { invariant } from "@dxos/invariant";
641
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/trigger.ts";
646
642
  var trigger = (timeout2) => {
647
643
  let callback;
648
644
  const promise = new Promise((resolve, reject) => {
@@ -658,18 +654,22 @@ var trigger = (timeout2) => {
658
654
  resolver
659
655
  ];
660
656
  };
661
- var TriggerState = /* @__PURE__ */ function(TriggerState2) {
657
+ var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
662
658
  TriggerState2["WAITING"] = "WAITING";
663
659
  TriggerState2["RESOLVED"] = "RESOLVED";
664
660
  TriggerState2["REJECTED"] = "REJECTED";
665
661
  return TriggerState2;
666
- }({});
662
+ })({});
667
663
  var Trigger = class {
664
+ _options;
665
+ _promise;
666
+ _resolve;
667
+ _reject;
668
+ _state = "WAITING";
668
669
  constructor(_options = {
669
670
  autoReset: false
670
671
  }) {
671
672
  this._options = _options;
672
- this._state = "WAITING";
673
673
  this.reset();
674
674
  }
675
675
  get state() {
@@ -729,23 +729,61 @@ var Trigger = class {
729
729
  return this;
730
730
  }
731
731
  };
732
+ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
733
+ invariant(count >= 0, void 0, {
734
+ F: __dxlog_file2,
735
+ L: 139,
736
+ S: void 0,
737
+ A: [
738
+ "count >= 0",
739
+ ""
740
+ ]
741
+ });
742
+ let t;
743
+ let doResolve;
744
+ let doReject;
745
+ const promise = new Promise((resolve, reject) => {
746
+ doResolve = (value) => {
747
+ clearTimeout(t);
748
+ resolve(value);
749
+ };
750
+ doReject = (err) => {
751
+ clearTimeout(t);
752
+ reject(err);
753
+ };
754
+ });
755
+ if (count === 0) {
756
+ setTimeout(() => {
757
+ doResolve(0);
758
+ });
759
+ } else {
760
+ if (timeout2) {
761
+ t = setTimeout(() => {
762
+ doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
763
+ }, timeout2);
764
+ }
765
+ }
766
+ let i = 0;
767
+ return [
768
+ async () => await promise,
769
+ () => {
770
+ if (++i === count) {
771
+ doResolve(i);
772
+ }
773
+ return i;
774
+ },
775
+ (err) => doReject(err)
776
+ ];
777
+ };
732
778
 
733
- // packages/common/async/src/observable.ts
779
+ // src/observable.ts
734
780
  var MulticastObservable = class _MulticastObservable extends Observable {
781
+ _value;
782
+ _observers = /* @__PURE__ */ new Set();
783
+ _observable;
784
+ _completed = new Trigger();
735
785
  constructor(subscriber, _value) {
736
- super((observer) => this._subscribe(observer)), this._value = _value, this._observers = /* @__PURE__ */ new Set(), this._completed = new Trigger(), this._handlers = {
737
- next: (value) => {
738
- this._value = value;
739
- this._observers.forEach((observer) => observer.next?.(value));
740
- },
741
- error: (err) => {
742
- this._observers.forEach((observer) => observer.error?.(err));
743
- },
744
- complete: () => {
745
- this._completed.wake();
746
- this._observers.forEach((observer) => observer.complete?.());
747
- }
748
- };
786
+ super((observer) => this._subscribe(observer)), this._value = _value;
749
787
  this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
750
788
  this._observable.subscribe(this._handlers);
751
789
  }
@@ -829,18 +867,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
829
867
  this._observers.delete(observer);
830
868
  };
831
869
  }
870
+ _handlers = {
871
+ next: (value) => {
872
+ this._value = value;
873
+ this._observers.forEach((observer) => observer.next?.(value));
874
+ },
875
+ error: (err) => {
876
+ this._observers.forEach((observer) => observer.error?.(err));
877
+ },
878
+ complete: () => {
879
+ this._completed.wake();
880
+ this._observers.forEach((observer) => observer.complete?.());
881
+ }
882
+ };
832
883
  };
833
884
  var EMPTY_OBSERVABLE = MulticastObservable.of(null);
834
885
 
835
- // packages/common/async/src/observable-value.ts
886
+ // src/observable-value.ts
836
887
  import { createSetDispatch } from "@dxos/util";
837
888
  var ObservableProvider = class {
838
- constructor() {
839
- this._handlers = /* @__PURE__ */ new Set();
840
- this._proxy = createSetDispatch({
841
- handlers: this._handlers
842
- });
843
- }
889
+ _handlers = /* @__PURE__ */ new Set();
890
+ _proxy = createSetDispatch({
891
+ handlers: this._handlers
892
+ });
893
+ _value;
844
894
  /**
845
895
  * Proxy used to dispatch callbacks to each subscription.
846
896
  */
@@ -861,8 +911,10 @@ var ObservableProvider = class {
861
911
  }
862
912
  };
863
913
  var CancellableObservableProvider = class extends ObservableProvider {
914
+ _handleCancel;
915
+ _cancelled = false;
864
916
  constructor(_handleCancel) {
865
- super(), this._handleCancel = _handleCancel, this._cancelled = false;
917
+ super(), this._handleCancel = _handleCancel;
866
918
  }
867
919
  get cancelled() {
868
920
  return this._cancelled;
@@ -877,19 +929,19 @@ var CancellableObservableProvider = class extends ObservableProvider {
877
929
  }
878
930
  };
879
931
 
880
- // packages/common/async/src/persistent-lifecycle.ts
932
+ // src/persistent-lifecycle.ts
881
933
  import { LifecycleState, Resource, cancelWithContext } from "@dxos/context";
882
934
  import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
883
935
  import { log as log2 } from "@dxos/log";
884
936
 
885
- // packages/common/async/src/task-scheduling.ts
886
- import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
937
+ // src/task-scheduling.ts
938
+ import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
887
939
  import { StackTrace as StackTrace2 } from "@dxos/debug";
888
940
 
889
- // packages/common/async/src/track-leaks.ts
941
+ // src/track-leaks.ts
890
942
  import { StackTrace } from "@dxos/debug";
891
943
  import { log } from "@dxos/log";
892
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/common/async/src/track-leaks.ts";
944
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
893
945
  var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
894
946
  var openResources = /* @__PURE__ */ new Set();
895
947
  var handleSymbol = Symbol("checkLeaksHandle");
@@ -970,14 +1022,17 @@ if (enabled) {
970
1022
  global.dxDumpLeaks = dumpLeaks;
971
1023
  }
972
1024
 
973
- // packages/common/async/src/task-scheduling.ts
1025
+ // src/task-scheduling.ts
1026
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/task-scheduling.ts";
974
1027
  var DeferredTask = class {
1028
+ _ctx;
1029
+ _callback;
1030
+ _scheduled = false;
1031
+ _currentTask = null;
1032
+ _nextTask = new Trigger();
975
1033
  constructor(_ctx, _callback) {
976
1034
  this._ctx = _ctx;
977
1035
  this._callback = _callback;
978
- this._scheduled = false;
979
- this._currentTask = null;
980
- this._nextTask = new Trigger();
981
1036
  }
982
1037
  get scheduled() {
983
1038
  return this._scheduled;
@@ -1018,6 +1073,82 @@ var DeferredTask = class {
1018
1073
  await this._currentTask;
1019
1074
  }
1020
1075
  };
1076
+ var AsyncTask = class {
1077
+ #callback;
1078
+ #ctx = void 0;
1079
+ #scheduled = false;
1080
+ #currentTask = null;
1081
+ #nextTask = new Trigger();
1082
+ constructor(callback) {
1083
+ this.#callback = callback;
1084
+ }
1085
+ get scheduled() {
1086
+ return this.#scheduled;
1087
+ }
1088
+ /**
1089
+ * Context of the resource that owns the task.
1090
+ * When the context is disposed, the task is cancelled and cannot be scheduled again.
1091
+ */
1092
+ open() {
1093
+ this.#ctx = new Context2(void 0, {
1094
+ F: __dxlog_file4,
1095
+ L: 102
1096
+ });
1097
+ }
1098
+ /**
1099
+ * Closes the task and waits for it to finish if it is running.
1100
+ */
1101
+ async close() {
1102
+ await this.#ctx?.dispose();
1103
+ await this.join();
1104
+ this.#ctx = void 0;
1105
+ }
1106
+ [Symbol.asyncDispose]() {
1107
+ return this.close();
1108
+ }
1109
+ /**
1110
+ * Schedule the task to run asynchronously.
1111
+ */
1112
+ // TODO(dmaretskyi): Add scheduleAt. Where the earlier time will override the later one.
1113
+ schedule() {
1114
+ if (!this.#ctx || this.#ctx.disposed) {
1115
+ throw new Error("AsyncTask not open");
1116
+ }
1117
+ if (this.#scheduled) {
1118
+ return;
1119
+ }
1120
+ scheduleTask(this.#ctx, async () => {
1121
+ await this.#currentTask;
1122
+ if (!this.#ctx || this.#ctx.disposed) {
1123
+ return;
1124
+ }
1125
+ this.#scheduled = false;
1126
+ const completionTrigger = this.#nextTask;
1127
+ this.#nextTask = new Trigger();
1128
+ this.#currentTask = runInContextAsync(this.#ctx, () => this.#callback()).then(() => {
1129
+ completionTrigger.wake();
1130
+ });
1131
+ });
1132
+ this.#scheduled = true;
1133
+ }
1134
+ /**
1135
+ * Schedule the task to run and wait for it to finish.
1136
+ */
1137
+ async runBlocking() {
1138
+ if (this.#ctx?.disposed) {
1139
+ throw new ContextDisposedError2();
1140
+ }
1141
+ this.schedule();
1142
+ await this.#nextTask.wait();
1143
+ }
1144
+ /**
1145
+ * Waits for the current task to finish if it is running.
1146
+ * Does not schedule a new task.
1147
+ */
1148
+ async join() {
1149
+ await this.#currentTask;
1150
+ }
1151
+ };
1021
1152
  var runInContext = (ctx, fn) => {
1022
1153
  try {
1023
1154
  fn();
@@ -1096,22 +1227,26 @@ var scheduleExponentialBackoffTaskInterval = (ctx, task, initialInterval) => {
1096
1227
  });
1097
1228
  };
1098
1229
 
1099
- // packages/common/async/src/persistent-lifecycle.ts
1230
+ // src/persistent-lifecycle.ts
1100
1231
  function _ts_decorate(decorators, target, key, desc) {
1101
1232
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1102
1233
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1103
1234
  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;
1104
1235
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1105
1236
  }
1106
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
1237
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
1107
1238
  var INIT_RESTART_DELAY = 100;
1108
1239
  var DEFAULT_MAX_RESTART_DELAY = 5e3;
1109
1240
  var PersistentLifecycle = class extends Resource {
1241
+ _start;
1242
+ _stop;
1243
+ _onRestart;
1244
+ _maxRestartDelay;
1245
+ _currentState = void 0;
1246
+ _restartTask = void 0;
1247
+ _restartAfter = 0;
1110
1248
  constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
1111
1249
  super();
1112
- this._currentState = void 0;
1113
- this._restartTask = void 0;
1114
- this._restartAfter = 0;
1115
1250
  this._start = start;
1116
1251
  this._stop = stop;
1117
1252
  this._onRestart = onRestart;
@@ -1128,7 +1263,7 @@ var PersistentLifecycle = class extends Resource {
1128
1263
  log2.warn("Restart failed", {
1129
1264
  err
1130
1265
  }, {
1131
- F: __dxlog_file4,
1266
+ F: __dxlog_file5,
1132
1267
  L: 72,
1133
1268
  S: this,
1134
1269
  C: (f, a) => f(...a)
@@ -1140,7 +1275,7 @@ var PersistentLifecycle = class extends Resource {
1140
1275
  log2.warn("Start failed", {
1141
1276
  err
1142
1277
  }, {
1143
- F: __dxlog_file4,
1278
+ F: __dxlog_file5,
1144
1279
  L: 78,
1145
1280
  S: this,
1146
1281
  C: (f, a) => f(...a)
@@ -1158,7 +1293,7 @@ var PersistentLifecycle = class extends Resource {
1158
1293
  log2(`restarting in ${this._restartAfter}ms`, {
1159
1294
  state: this._lifecycleState
1160
1295
  }, {
1161
- F: __dxlog_file4,
1296
+ F: __dxlog_file5,
1162
1297
  L: 91,
1163
1298
  S: this,
1164
1299
  C: (f, a) => f(...a)
@@ -1181,7 +1316,7 @@ var PersistentLifecycle = class extends Resource {
1181
1316
  await this._stop(this._currentState);
1182
1317
  } catch (err) {
1183
1318
  log2.catch(err, void 0, {
1184
- F: __dxlog_file4,
1319
+ F: __dxlog_file5,
1185
1320
  L: 113,
1186
1321
  S: this,
1187
1322
  C: (f, a) => f(...a)
@@ -1207,9 +1342,9 @@ _ts_decorate([
1207
1342
  synchronized
1208
1343
  ], PersistentLifecycle.prototype, "scheduleRestart", null);
1209
1344
 
1210
- // packages/common/async/src/push-iterable.ts
1345
+ // src/push-iterable.ts
1211
1346
  import { invariant as invariant2 } from "@dxos/invariant";
1212
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/common/async/src/push-iterable.ts";
1347
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
1213
1348
  var makePushIterable = () => {
1214
1349
  const buf = [];
1215
1350
  const trigger2 = new Trigger({
@@ -1224,7 +1359,7 @@ var makePushIterable = () => {
1224
1359
  }
1225
1360
  const item = buf.shift();
1226
1361
  invariant2(item, void 0, {
1227
- F: __dxlog_file5,
1362
+ F: __dxlog_file6,
1228
1363
  L: 42,
1229
1364
  S: this,
1230
1365
  A: [
@@ -1273,21 +1408,7 @@ var makePushIterable = () => {
1273
1408
  };
1274
1409
  };
1275
1410
 
1276
- // packages/common/async/src/sink.ts
1277
- var sink = (emitter, event, count = 1) => {
1278
- const [getPromise, resolve] = trigger();
1279
- let counter = 0;
1280
- const listener = () => {
1281
- if (++counter === count) {
1282
- emitter.off(event, listener);
1283
- resolve();
1284
- }
1285
- };
1286
- emitter.on(event, listener);
1287
- return getPromise();
1288
- };
1289
-
1290
- // packages/common/async/src/stream-to-array.ts
1411
+ // src/stream-to-array.ts
1291
1412
  var streamToArray = (stream) => {
1292
1413
  let deferred;
1293
1414
  if (!stream.readable) {
@@ -1329,14 +1450,9 @@ var streamToArray = (stream) => {
1329
1450
  return deferred;
1330
1451
  };
1331
1452
 
1332
- // packages/common/async/src/test-stream.ts
1453
+ // src/test-stream.ts
1333
1454
  import { Duplex } from "@dxos/node-std/stream";
1334
1455
  var TestStream = class extends Duplex {
1335
- constructor() {
1336
- super(...arguments);
1337
- this._received = Buffer.alloc(0);
1338
- this._onWrite = new Event();
1339
- }
1340
1456
  static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1341
1457
  stream1.push("ping");
1342
1458
  stream2.push("pong");
@@ -1349,6 +1465,8 @@ var TestStream = class extends Duplex {
1349
1465
  })
1350
1466
  ]);
1351
1467
  }
1468
+ _received = Buffer.alloc(0);
1469
+ _onWrite = new Event();
1352
1470
  _write(chunk, encoding, callback) {
1353
1471
  this._received = Buffer.concat([
1354
1472
  this._received,
@@ -1365,7 +1483,7 @@ var TestStream = class extends Duplex {
1365
1483
  }
1366
1484
  };
1367
1485
 
1368
- // packages/common/async/src/testing.ts
1486
+ // src/testing.ts
1369
1487
  var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2 = 10, error, breakOnError = false }) => {
1370
1488
  const stopTime = timeout2 ? Date.now() + timeout2 : 0;
1371
1489
  const trigger2 = new Trigger();
@@ -1390,13 +1508,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
1390
1508
  timeout: timeout2
1391
1509
  });
1392
1510
  };
1511
+ var until = (cb, timeout2) => {
1512
+ return new Promise((resolve, reject) => {
1513
+ const t = timeout2 && setTimeout(() => {
1514
+ reject(new Error(`Timeout after ${t}ms`));
1515
+ }, timeout2);
1516
+ setTimeout(async () => {
1517
+ try {
1518
+ await cb((value) => {
1519
+ t && clearTimeout(t);
1520
+ resolve(value);
1521
+ }, (error) => {
1522
+ t && clearTimeout(t);
1523
+ reject(error);
1524
+ });
1525
+ } catch (err) {
1526
+ reject(err);
1527
+ }
1528
+ });
1529
+ });
1530
+ };
1531
+ var untilPromise = (cb) => cb();
1532
+ var untilError = (cb) => {
1533
+ return new Promise((resolve, reject) => {
1534
+ setTimeout(async () => {
1535
+ try {
1536
+ await cb();
1537
+ reject(new Error("No error was thrown."));
1538
+ } catch (err) {
1539
+ resolve(err);
1540
+ }
1541
+ });
1542
+ });
1543
+ };
1393
1544
 
1394
- // packages/common/async/src/timer.ts
1545
+ // src/timer.ts
1395
1546
  var Timer = class {
1547
+ _callback;
1548
+ _state = new Event();
1549
+ _timer;
1550
+ _count = 0;
1396
1551
  constructor(_callback) {
1397
1552
  this._callback = _callback;
1398
- this._state = new Event();
1399
- this._count = 0;
1400
1553
  }
1401
1554
  get state() {
1402
1555
  return this._state;
@@ -1439,51 +1592,23 @@ var Timer = class {
1439
1592
  }
1440
1593
  };
1441
1594
 
1442
- // packages/common/async/src/until.ts
1443
- var until = (cb, timeout2) => {
1444
- return new Promise((resolve, reject) => {
1445
- const t = timeout2 && setTimeout(() => {
1446
- reject(new Error(`Timeout after ${t}ms`));
1447
- }, timeout2);
1448
- setTimeout(async () => {
1449
- try {
1450
- await cb((value) => {
1451
- t && clearTimeout(t);
1452
- resolve(value);
1453
- }, (error) => {
1454
- t && clearTimeout(t);
1455
- reject(error);
1456
- });
1457
- } catch (err) {
1458
- reject(err);
1459
- }
1460
- });
1461
- });
1462
- };
1463
- var untilPromise = (cb) => cb();
1464
- var untilError = (cb) => {
1465
- return new Promise((resolve, reject) => {
1466
- setTimeout(async () => {
1467
- try {
1468
- await cb();
1469
- reject(new Error("No error was thrown."));
1470
- } catch (err) {
1471
- resolve(err);
1472
- }
1473
- });
1474
- });
1475
- };
1476
-
1477
- // packages/common/async/src/update-scheduler.ts
1595
+ // src/update-scheduler.ts
1478
1596
  var TIME_PERIOD = 1e3;
1479
1597
  var UpdateScheduler = class {
1598
+ _ctx;
1599
+ _callback;
1600
+ _params;
1601
+ /**
1602
+ * Promise that resolves when the callback is done.
1603
+ * Never rejects.
1604
+ */
1605
+ _promise = null;
1606
+ _scheduled = false;
1607
+ _lastUpdateTime = -TIME_PERIOD;
1480
1608
  constructor(_ctx, _callback, _params = {}) {
1481
1609
  this._ctx = _ctx;
1482
1610
  this._callback = _callback;
1483
1611
  this._params = _params;
1484
- this._promise = null;
1485
- this._scheduled = false;
1486
- this._lastUpdateTime = -TIME_PERIOD;
1487
1612
  _ctx.onDispose(async () => {
1488
1613
  await this._promise;
1489
1614
  });
@@ -1496,13 +1621,13 @@ var UpdateScheduler = class {
1496
1621
  await this._promise;
1497
1622
  if (this._params.maxFrequency) {
1498
1623
  const now = performance.now();
1499
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1500
- if (delay > 0) {
1624
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1625
+ if (delay2 > 0) {
1501
1626
  await new Promise((resolve) => {
1502
1627
  const timeoutId = setTimeout(() => {
1503
1628
  clearContext();
1504
1629
  resolve();
1505
- }, delay);
1630
+ }, delay2);
1506
1631
  const clearContext = this._ctx.onDispose(() => {
1507
1632
  clearTimeout(timeoutId);
1508
1633
  resolve();
@@ -1546,6 +1671,7 @@ var UpdateScheduler = class {
1546
1671
  }
1547
1672
  };
1548
1673
  export {
1674
+ AsyncTask,
1549
1675
  CancellableObservableProvider,
1550
1676
  DeferredTask,
1551
1677
  Event,
@@ -1566,29 +1692,31 @@ export {
1566
1692
  UpdateScheduler,
1567
1693
  addEventListener,
1568
1694
  addListener,
1569
- asyncChain,
1570
1695
  asyncReturn,
1571
1696
  asyncTimeout,
1697
+ chain,
1572
1698
  combine,
1573
- createPromiseFromCallback,
1574
1699
  debounce,
1700
+ debounceAndThrottle,
1701
+ delay,
1575
1702
  dumpLeaks,
1576
1703
  interval,
1577
1704
  latch,
1578
1705
  makePushIterable,
1579
1706
  observableError,
1580
1707
  onEvent,
1708
+ promiseFromCallback,
1581
1709
  runInContext,
1582
1710
  runInContextAsync,
1583
1711
  scheduleExponentialBackoffTaskInterval,
1584
1712
  scheduleMicroTask,
1585
1713
  scheduleTask,
1586
1714
  scheduleTaskInterval,
1587
- sink,
1588
1715
  sleep,
1589
1716
  sleepWithContext,
1590
1717
  streamToArray,
1591
1718
  synchronized,
1719
+ throttle,
1592
1720
  timeout,
1593
1721
  toError,
1594
1722
  trackLeaks,