@dxos/async 0.8.3-staging.0fa589b → 0.8.4-main.03d5cd7b56

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 +344 -279
  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 +344 -279
  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 +40 -2
  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/errors.d.ts.map +1 -1
  18. package/dist/types/src/event-emitter.d.ts.map +1 -1
  19. package/dist/types/src/events.d.ts.map +1 -1
  20. package/dist/types/src/index.d.ts +0 -4
  21. package/dist/types/src/index.d.ts.map +1 -1
  22. package/dist/types/src/mutex.d.ts.map +1 -1
  23. package/dist/types/src/observable-value.d.ts.map +1 -1
  24. package/dist/types/src/observable.d.ts.map +1 -1
  25. package/dist/types/src/persistent-lifecycle.d.ts +2 -2
  26. package/dist/types/src/persistent-lifecycle.d.ts.map +1 -1
  27. package/dist/types/src/stream-to-array.d.ts.map +1 -1
  28. package/dist/types/src/task-scheduling.d.ts +29 -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 +13 -0
  32. package/dist/types/src/testing.d.ts.map +1 -1
  33. package/dist/types/src/timeout.d.ts +2 -2
  34. package/dist/types/src/timeout.d.ts.map +1 -1
  35. package/dist/types/src/timer.d.ts.map +1 -1
  36. package/dist/types/src/track-leaks.d.ts.map +1 -1
  37. package/dist/types/src/trigger.d.ts +11 -0
  38. package/dist/types/src/trigger.d.ts.map +1 -1
  39. package/dist/types/src/update-scheduler.d.ts.map +1 -1
  40. package/dist/types/tsconfig.tsbuildinfo +1 -1
  41. package/package.json +13 -12
  42. package/src/callback.ts +3 -3
  43. package/src/chain.ts +1 -1
  44. package/src/cleanup.ts +10 -7
  45. package/src/debounce.test.ts +115 -0
  46. package/src/debounce.ts +94 -5
  47. package/src/event-emitter.test.ts +1 -1
  48. package/src/events.test.ts +1 -1
  49. package/src/index.ts +0 -4
  50. package/src/observable-value.test.ts +1 -1
  51. package/src/observable-value.ts +4 -2
  52. package/src/persistent-lifecycle.test.ts +1 -1
  53. package/src/persistent-lifecycle.ts +10 -2
  54. package/src/task-scheduling.ts +95 -1
  55. package/src/testing.test.ts +41 -1
  56. package/src/testing.ts +53 -0
  57. package/src/timeout.ts +27 -29
  58. package/src/trigger.ts +58 -1
  59. package/src/update-scheduler.ts +1 -1
  60. package/dist/lib/node/index.cjs +0 -1638
  61. package/dist/lib/node/index.cjs.map +0 -7
  62. package/dist/lib/node/meta.json +0 -1
  63. package/dist/types/src/latch.d.ts +0 -11
  64. package/dist/types/src/latch.d.ts.map +0 -1
  65. package/dist/types/src/sink.d.ts +0 -6
  66. package/dist/types/src/sink.d.ts.map +0 -1
  67. package/dist/types/src/types.d.ts +0 -2
  68. package/dist/types/src/types.d.ts.map +0 -1
  69. package/dist/types/src/until.d.ts +0 -14
  70. package/dist/types/src/until.d.ts.map +0 -1
  71. package/dist/types/src/until.test.d.ts +0 -2
  72. package/dist/types/src/until.test.d.ts.map +0 -1
  73. package/src/latch.ts +0 -60
  74. package/src/sink.ts +0 -26
  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
- // 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,20 +9,20 @@ 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 () => {
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,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,8 +147,28 @@ 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) => {
169
+ if (typeof promise === "function") {
170
+ throw new Error("First argument must be a promise.");
171
+ }
109
172
  let timeoutId;
110
173
  const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
111
174
  const timeoutPromise = new Promise((resolve, reject) => {
@@ -114,9 +177,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
114
177
  }, timeout2);
115
178
  unrefTimeout(timeoutId);
116
179
  });
117
- const conditionTimeout = typeof promise === "function" ? createPromiseFromCallback(promise) : promise;
118
180
  return await Promise.race([
119
- conditionTimeout,
181
+ promise,
120
182
  timeoutPromise
121
183
  ]).finally(() => {
122
184
  clearTimeout(timeoutId);
@@ -127,25 +189,8 @@ var unrefTimeout = (timeoutId) => {
127
189
  timeoutId.unref();
128
190
  }
129
191
  };
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
192
 
148
- // packages/common/async/src/event-emitter.ts
193
+ // src/event-emitter.ts
149
194
  var onEvent = (eventEmitter, eventName, callback) => {
150
195
  eventEmitter.on(eventName, callback);
151
196
  return () => eventEmitter.off(eventName, callback);
@@ -168,15 +213,10 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
168
213
  return timeout2 ? asyncTimeout(promise, timeout2, error ?? new Error()).finally(off) : promise.finally(off);
169
214
  };
170
215
 
171
- // packages/common/async/src/events.ts
216
+ // src/events.ts
172
217
  import { Context } from "@dxos/context";
173
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/async/src/events.ts";
174
218
  var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
175
219
  var Event = class _Event {
176
- constructor() {
177
- this._listeners = /* @__PURE__ */ new Set();
178
- this._effects = /* @__PURE__ */ new Set();
179
- }
180
220
  /**
181
221
  * Wrap objects that have on/off style event emitters.
182
222
  */
@@ -189,6 +229,8 @@ var Event = class _Event {
189
229
  });
190
230
  return event;
191
231
  }
232
+ _listeners = /* @__PURE__ */ new Set();
233
+ _effects = /* @__PURE__ */ new Set();
192
234
  /**
193
235
  * Emit an event.
194
236
  * In most cases should only be called by the class or entity containing the event.
@@ -227,10 +269,7 @@ var Event = class _Event {
227
269
  _ctx,
228
270
  _callback
229
271
  ] : [
230
- new Context(void 0, {
231
- F: __dxlog_file,
232
- L: 132
233
- }),
272
+ new Context(),
234
273
  _ctx
235
274
  ];
236
275
  const weak = !!options?.weak;
@@ -260,10 +299,7 @@ var Event = class _Event {
260
299
  _ctx,
261
300
  _callback
262
301
  ] : [
263
- new Context(void 0, {
264
- F: __dxlog_file,
265
- L: 169
266
- }),
302
+ new Context(),
267
303
  _ctx
268
304
  ];
269
305
  const listener = new EventListener(this, callback, ctx, true, false);
@@ -432,11 +468,15 @@ var Event = class _Event {
432
468
  }
433
469
  };
434
470
  var EventListener = class {
471
+ ctx;
472
+ once;
473
+ weak;
474
+ callback;
475
+ _clearDispose = void 0;
435
476
  constructor(event, listener, ctx, once, weak) {
436
477
  this.ctx = ctx;
437
478
  this.once = once;
438
479
  this.weak = weak;
439
- this._clearDispose = void 0;
440
480
  this._clearDispose = ctx.onDispose(() => {
441
481
  event._removeListener(this);
442
482
  });
@@ -496,65 +536,13 @@ var weakListeners = () => {
496
536
  };
497
537
  };
498
538
 
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
539
+ // src/mutex.ts
550
540
  import "@dxos/util";
551
541
  import { warnAfterTimeout } from "@dxos/debug";
552
542
  var Mutex = class {
553
- constructor() {
554
- this._queue = Promise.resolve();
555
- this._queueLength = 0;
556
- this._tag = null;
557
- }
543
+ _queue = Promise.resolve();
544
+ _queueLength = 0;
545
+ _tag = null;
558
546
  get tag() {
559
547
  return this._tag;
560
548
  }
@@ -600,6 +588,7 @@ var Mutex = class {
600
588
  }
601
589
  };
602
590
  var MutexGuard = class {
591
+ _release;
603
592
  constructor(_release) {
604
593
  this._release = _release;
605
594
  }
@@ -613,7 +602,7 @@ var MutexGuard = class {
613
602
  this.release();
614
603
  }
615
604
  };
616
- var classMutexSymbol = Symbol("class-mutex");
605
+ var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
617
606
  var FORCE_DISABLE_WARNING = false;
618
607
  var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
619
608
  var synchronized = (target, propertyName, descriptor) => {
@@ -638,11 +627,12 @@ var synchronized = (target, propertyName, descriptor) => {
638
627
  });
639
628
  };
640
629
 
641
- // packages/common/async/src/observable.ts
630
+ // src/observable.ts
642
631
  import Observable from "zen-observable";
643
632
  import PushStream from "zen-push";
644
633
 
645
- // packages/common/async/src/trigger.ts
634
+ // src/trigger.ts
635
+ import { invariant } from "@dxos/invariant";
646
636
  var trigger = (timeout2) => {
647
637
  let callback;
648
638
  const promise = new Promise((resolve, reject) => {
@@ -658,18 +648,22 @@ var trigger = (timeout2) => {
658
648
  resolver
659
649
  ];
660
650
  };
661
- var TriggerState = /* @__PURE__ */ function(TriggerState2) {
651
+ var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
662
652
  TriggerState2["WAITING"] = "WAITING";
663
653
  TriggerState2["RESOLVED"] = "RESOLVED";
664
654
  TriggerState2["REJECTED"] = "REJECTED";
665
655
  return TriggerState2;
666
- }({});
656
+ })({});
667
657
  var Trigger = class {
658
+ _options;
659
+ _promise;
660
+ _resolve;
661
+ _reject;
662
+ _state = "WAITING";
668
663
  constructor(_options = {
669
664
  autoReset: false
670
665
  }) {
671
666
  this._options = _options;
672
- this._state = "WAITING";
673
667
  this.reset();
674
668
  }
675
669
  get state() {
@@ -729,23 +723,53 @@ var Trigger = class {
729
723
  return this;
730
724
  }
731
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
+ };
732
764
 
733
- // packages/common/async/src/observable.ts
765
+ // src/observable.ts
734
766
  var MulticastObservable = class _MulticastObservable extends Observable {
767
+ _value;
768
+ _observers = /* @__PURE__ */ new Set();
769
+ _observable;
770
+ _completed = new Trigger();
735
771
  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
- };
772
+ super((observer) => this._subscribe(observer)), this._value = _value;
749
773
  this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
750
774
  this._observable.subscribe(this._handlers);
751
775
  }
@@ -829,18 +853,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
829
853
  this._observers.delete(observer);
830
854
  };
831
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
+ };
832
869
  };
833
870
  var EMPTY_OBSERVABLE = MulticastObservable.of(null);
834
871
 
835
- // packages/common/async/src/observable-value.ts
872
+ // src/observable-value.ts
836
873
  import { createSetDispatch } from "@dxos/util";
837
874
  var ObservableProvider = class {
838
- constructor() {
839
- this._handlers = /* @__PURE__ */ new Set();
840
- this._proxy = createSetDispatch({
841
- handlers: this._handlers
842
- });
843
- }
875
+ _handlers = /* @__PURE__ */ new Set();
876
+ _proxy = createSetDispatch({
877
+ handlers: this._handlers
878
+ });
879
+ _value;
844
880
  /**
845
881
  * Proxy used to dispatch callbacks to each subscription.
846
882
  */
@@ -861,8 +897,10 @@ var ObservableProvider = class {
861
897
  }
862
898
  };
863
899
  var CancellableObservableProvider = class extends ObservableProvider {
900
+ _handleCancel;
901
+ _cancelled = false;
864
902
  constructor(_handleCancel) {
865
- super(), this._handleCancel = _handleCancel, this._cancelled = false;
903
+ super(), this._handleCancel = _handleCancel;
866
904
  }
867
905
  get cancelled() {
868
906
  return this._cancelled;
@@ -877,22 +915,21 @@ var CancellableObservableProvider = class extends ObservableProvider {
877
915
  }
878
916
  };
879
917
 
880
- // packages/common/async/src/persistent-lifecycle.ts
918
+ // src/persistent-lifecycle.ts
881
919
  import { LifecycleState, Resource, cancelWithContext } from "@dxos/context";
882
920
  import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
883
921
  import { log as log2 } from "@dxos/log";
884
922
 
885
- // packages/common/async/src/task-scheduling.ts
886
- import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
923
+ // src/task-scheduling.ts
924
+ import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
887
925
  import { StackTrace as StackTrace2 } from "@dxos/debug";
888
926
 
889
- // packages/common/async/src/track-leaks.ts
927
+ // src/track-leaks.ts
890
928
  import { StackTrace } from "@dxos/debug";
891
929
  import { log } from "@dxos/log";
892
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/common/async/src/track-leaks.ts";
893
930
  var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
894
931
  var openResources = /* @__PURE__ */ new Set();
895
- var handleSymbol = Symbol("checkLeaksHandle");
932
+ var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
896
933
  var trackResource = (resourceProvider) => {
897
934
  if (!enabled) {
898
935
  return () => {
@@ -939,45 +976,27 @@ var dumpLeaks = () => {
939
976
  if (!enabled) {
940
977
  return;
941
978
  }
942
- log.info(`Leaked resources ${openResources.size}:`, void 0, {
943
- F: __dxlog_file3,
944
- L: 82,
945
- S: void 0,
946
- C: (f, a) => f(...a)
947
- });
979
+ log.info(`Leaked resources ${openResources.size}:`);
948
980
  for (const resource of openResources) {
949
- log.info(`- ${resource.name} at`, void 0, {
950
- F: __dxlog_file3,
951
- L: 84,
952
- S: void 0,
953
- C: (f, a) => f(...a)
954
- });
955
- log.info(resource.openStack.getStack(1), void 0, {
956
- F: __dxlog_file3,
957
- L: 85,
958
- S: void 0,
959
- C: (f, a) => f(...a)
960
- });
961
- log.info("\n", void 0, {
962
- F: __dxlog_file3,
963
- L: 86,
964
- S: void 0,
965
- C: (f, a) => f(...a)
966
- });
981
+ log.info(`- ${resource.name} at`);
982
+ log.info(resource.openStack.getStack(1));
983
+ log.info("\n");
967
984
  }
968
985
  };
969
986
  if (enabled) {
970
987
  global.dxDumpLeaks = dumpLeaks;
971
988
  }
972
989
 
973
- // packages/common/async/src/task-scheduling.ts
990
+ // src/task-scheduling.ts
974
991
  var DeferredTask = class {
992
+ _ctx;
993
+ _callback;
994
+ _scheduled = false;
995
+ _currentTask = null;
996
+ _nextTask = new Trigger();
975
997
  constructor(_ctx, _callback) {
976
998
  this._ctx = _ctx;
977
999
  this._callback = _callback;
978
- this._scheduled = false;
979
- this._currentTask = null;
980
- this._nextTask = new Trigger();
981
1000
  }
982
1001
  get scheduled() {
983
1002
  return this._scheduled;
@@ -1018,6 +1037,79 @@ var DeferredTask = class {
1018
1037
  await this._currentTask;
1019
1038
  }
1020
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
+ };
1021
1113
  var runInContext = (ctx, fn) => {
1022
1114
  try {
1023
1115
  fn();
@@ -1096,22 +1188,25 @@ var scheduleExponentialBackoffTaskInterval = (ctx, task, initialInterval) => {
1096
1188
  });
1097
1189
  };
1098
1190
 
1099
- // packages/common/async/src/persistent-lifecycle.ts
1191
+ // src/persistent-lifecycle.ts
1100
1192
  function _ts_decorate(decorators, target, key, desc) {
1101
1193
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1102
1194
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1103
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;
1104
1196
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1105
1197
  }
1106
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
1107
1198
  var INIT_RESTART_DELAY = 100;
1108
1199
  var DEFAULT_MAX_RESTART_DELAY = 5e3;
1109
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;
1110
1208
  constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
1111
1209
  super();
1112
- this._currentState = void 0;
1113
- this._restartTask = void 0;
1114
- this._restartAfter = 0;
1115
1210
  this._start = start;
1116
1211
  this._stop = stop;
1117
1212
  this._onRestart = onRestart;
@@ -1125,25 +1220,21 @@ var PersistentLifecycle = class extends Resource {
1125
1220
  try {
1126
1221
  await this._restart();
1127
1222
  } catch (err) {
1223
+ if (this._ctx?.disposed) {
1224
+ return;
1225
+ }
1128
1226
  log2.warn("Restart failed", {
1129
1227
  err
1130
- }, {
1131
- F: __dxlog_file4,
1132
- L: 72,
1133
- S: this,
1134
- C: (f, a) => f(...a)
1135
1228
  });
1136
1229
  this._restartTask?.schedule();
1137
1230
  }
1138
1231
  });
1139
1232
  this._currentState = await this._start().catch((err) => {
1233
+ if (this._ctx?.disposed) {
1234
+ return void 0;
1235
+ }
1140
1236
  log2.warn("Start failed", {
1141
1237
  err
1142
- }, {
1143
- F: __dxlog_file4,
1144
- L: 78,
1145
- S: this,
1146
- C: (f, a) => f(...a)
1147
1238
  });
1148
1239
  this._restartTask?.schedule();
1149
1240
  return void 0;
@@ -1157,11 +1248,6 @@ var PersistentLifecycle = class extends Resource {
1157
1248
  async _restart() {
1158
1249
  log2(`restarting in ${this._restartAfter}ms`, {
1159
1250
  state: this._lifecycleState
1160
- }, {
1161
- F: __dxlog_file4,
1162
- L: 91,
1163
- S: this,
1164
- C: (f, a) => f(...a)
1165
1251
  });
1166
1252
  await this._stopCurrentState();
1167
1253
  if (this._lifecycleState !== LifecycleState.OPEN) {
@@ -1180,12 +1266,7 @@ var PersistentLifecycle = class extends Resource {
1180
1266
  try {
1181
1267
  await this._stop(this._currentState);
1182
1268
  } catch (err) {
1183
- log2.catch(err, void 0, {
1184
- F: __dxlog_file4,
1185
- L: 113,
1186
- S: this,
1187
- C: (f, a) => f(...a)
1188
- });
1269
+ log2.catch(err);
1189
1270
  }
1190
1271
  this._currentState = void 0;
1191
1272
  }
@@ -1207,9 +1288,8 @@ _ts_decorate([
1207
1288
  synchronized
1208
1289
  ], PersistentLifecycle.prototype, "scheduleRestart", null);
1209
1290
 
1210
- // packages/common/async/src/push-iterable.ts
1291
+ // src/push-iterable.ts
1211
1292
  import { invariant as invariant2 } from "@dxos/invariant";
1212
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/common/async/src/push-iterable.ts";
1213
1293
  var makePushIterable = () => {
1214
1294
  const buf = [];
1215
1295
  const trigger2 = new Trigger({
@@ -1223,15 +1303,7 @@ var makePushIterable = () => {
1223
1303
  await trigger2.wait();
1224
1304
  }
1225
1305
  const item = buf.shift();
1226
- invariant2(item, void 0, {
1227
- F: __dxlog_file5,
1228
- L: 42,
1229
- S: this,
1230
- A: [
1231
- "item",
1232
- ""
1233
- ]
1234
- });
1306
+ invariant2(item);
1235
1307
  switch (item.kind) {
1236
1308
  case "next":
1237
1309
  return {
@@ -1273,21 +1345,7 @@ var makePushIterable = () => {
1273
1345
  };
1274
1346
  };
1275
1347
 
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
1348
+ // src/stream-to-array.ts
1291
1349
  var streamToArray = (stream) => {
1292
1350
  let deferred;
1293
1351
  if (!stream.readable) {
@@ -1329,14 +1387,9 @@ var streamToArray = (stream) => {
1329
1387
  return deferred;
1330
1388
  };
1331
1389
 
1332
- // packages/common/async/src/test-stream.ts
1390
+ // src/test-stream.ts
1333
1391
  import { Duplex } from "@dxos/node-std/stream";
1334
1392
  var TestStream = class extends Duplex {
1335
- constructor() {
1336
- super(...arguments);
1337
- this._received = Buffer.alloc(0);
1338
- this._onWrite = new Event();
1339
- }
1340
1393
  static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1341
1394
  stream1.push("ping");
1342
1395
  stream2.push("pong");
@@ -1349,6 +1402,8 @@ var TestStream = class extends Duplex {
1349
1402
  })
1350
1403
  ]);
1351
1404
  }
1405
+ _received = Buffer.alloc(0);
1406
+ _onWrite = new Event();
1352
1407
  _write(chunk, encoding, callback) {
1353
1408
  this._received = Buffer.concat([
1354
1409
  this._received,
@@ -1365,7 +1420,7 @@ var TestStream = class extends Duplex {
1365
1420
  }
1366
1421
  };
1367
1422
 
1368
- // packages/common/async/src/testing.ts
1423
+ // src/testing.ts
1369
1424
  var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2 = 10, error, breakOnError = false }) => {
1370
1425
  const stopTime = timeout2 ? Date.now() + timeout2 : 0;
1371
1426
  const trigger2 = new Trigger();
@@ -1390,13 +1445,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
1390
1445
  timeout: timeout2
1391
1446
  });
1392
1447
  };
1448
+ var until = (cb, timeout2) => {
1449
+ return new Promise((resolve, reject) => {
1450
+ const t = timeout2 && setTimeout(() => {
1451
+ reject(new Error(`Timeout after ${t}ms`));
1452
+ }, timeout2);
1453
+ setTimeout(async () => {
1454
+ try {
1455
+ await cb((value) => {
1456
+ t && clearTimeout(t);
1457
+ resolve(value);
1458
+ }, (error) => {
1459
+ t && clearTimeout(t);
1460
+ reject(error);
1461
+ });
1462
+ } catch (err) {
1463
+ reject(err);
1464
+ }
1465
+ });
1466
+ });
1467
+ };
1468
+ var untilPromise = (cb) => cb();
1469
+ var untilError = (cb) => {
1470
+ return new Promise((resolve, reject) => {
1471
+ setTimeout(async () => {
1472
+ try {
1473
+ await cb();
1474
+ reject(new Error("No error was thrown."));
1475
+ } catch (err) {
1476
+ resolve(err);
1477
+ }
1478
+ });
1479
+ });
1480
+ };
1393
1481
 
1394
- // packages/common/async/src/timer.ts
1482
+ // src/timer.ts
1395
1483
  var Timer = class {
1484
+ _callback;
1485
+ _state = new Event();
1486
+ _timer;
1487
+ _count = 0;
1396
1488
  constructor(_callback) {
1397
1489
  this._callback = _callback;
1398
- this._state = new Event();
1399
- this._count = 0;
1400
1490
  }
1401
1491
  get state() {
1402
1492
  return this._state;
@@ -1439,51 +1529,23 @@ var Timer = class {
1439
1529
  }
1440
1530
  };
1441
1531
 
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
1532
+ // src/update-scheduler.ts
1478
1533
  var TIME_PERIOD = 1e3;
1479
1534
  var UpdateScheduler = class {
1535
+ _ctx;
1536
+ _callback;
1537
+ _params;
1538
+ /**
1539
+ * Promise that resolves when the callback is done.
1540
+ * Never rejects.
1541
+ */
1542
+ _promise = null;
1543
+ _scheduled = false;
1544
+ _lastUpdateTime = -TIME_PERIOD;
1480
1545
  constructor(_ctx, _callback, _params = {}) {
1481
1546
  this._ctx = _ctx;
1482
1547
  this._callback = _callback;
1483
1548
  this._params = _params;
1484
- this._promise = null;
1485
- this._scheduled = false;
1486
- this._lastUpdateTime = -TIME_PERIOD;
1487
1549
  _ctx.onDispose(async () => {
1488
1550
  await this._promise;
1489
1551
  });
@@ -1496,13 +1558,13 @@ var UpdateScheduler = class {
1496
1558
  await this._promise;
1497
1559
  if (this._params.maxFrequency) {
1498
1560
  const now = performance.now();
1499
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1500
- if (delay > 0) {
1561
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1562
+ if (delay2 > 0) {
1501
1563
  await new Promise((resolve) => {
1502
1564
  const timeoutId = setTimeout(() => {
1503
1565
  clearContext();
1504
1566
  resolve();
1505
- }, delay);
1567
+ }, delay2);
1506
1568
  const clearContext = this._ctx.onDispose(() => {
1507
1569
  clearTimeout(timeoutId);
1508
1570
  resolve();
@@ -1546,6 +1608,7 @@ var UpdateScheduler = class {
1546
1608
  }
1547
1609
  };
1548
1610
  export {
1611
+ AsyncTask,
1549
1612
  CancellableObservableProvider,
1550
1613
  DeferredTask,
1551
1614
  Event,
@@ -1566,29 +1629,31 @@ export {
1566
1629
  UpdateScheduler,
1567
1630
  addEventListener,
1568
1631
  addListener,
1569
- asyncChain,
1570
1632
  asyncReturn,
1571
1633
  asyncTimeout,
1634
+ chain,
1572
1635
  combine,
1573
- createPromiseFromCallback,
1574
1636
  debounce,
1637
+ debounceAndThrottle,
1638
+ delay,
1575
1639
  dumpLeaks,
1576
1640
  interval,
1577
1641
  latch,
1578
1642
  makePushIterable,
1579
1643
  observableError,
1580
1644
  onEvent,
1645
+ promiseFromCallback,
1581
1646
  runInContext,
1582
1647
  runInContextAsync,
1583
1648
  scheduleExponentialBackoffTaskInterval,
1584
1649
  scheduleMicroTask,
1585
1650
  scheduleTask,
1586
1651
  scheduleTaskInterval,
1587
- sink,
1588
1652
  sleep,
1589
1653
  sleepWithContext,
1590
1654
  streamToArray,
1591
1655
  synchronized,
1656
+ throttle,
1592
1657
  timeout,
1593
1658
  toError,
1594
1659
  trackLeaks,