@dxos/async 0.8.3 → 0.8.4-main.16b68245aa

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 +338 -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 +338 -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 +2 -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;
@@ -1127,11 +1222,6 @@ var PersistentLifecycle = class extends Resource {
1127
1222
  } catch (err) {
1128
1223
  log2.warn("Restart failed", {
1129
1224
  err
1130
- }, {
1131
- F: __dxlog_file4,
1132
- L: 72,
1133
- S: this,
1134
- C: (f, a) => f(...a)
1135
1225
  });
1136
1226
  this._restartTask?.schedule();
1137
1227
  }
@@ -1139,11 +1229,6 @@ var PersistentLifecycle = class extends Resource {
1139
1229
  this._currentState = await this._start().catch((err) => {
1140
1230
  log2.warn("Start failed", {
1141
1231
  err
1142
- }, {
1143
- F: __dxlog_file4,
1144
- L: 78,
1145
- S: this,
1146
- C: (f, a) => f(...a)
1147
1232
  });
1148
1233
  this._restartTask?.schedule();
1149
1234
  return void 0;
@@ -1157,11 +1242,6 @@ var PersistentLifecycle = class extends Resource {
1157
1242
  async _restart() {
1158
1243
  log2(`restarting in ${this._restartAfter}ms`, {
1159
1244
  state: this._lifecycleState
1160
- }, {
1161
- F: __dxlog_file4,
1162
- L: 91,
1163
- S: this,
1164
- C: (f, a) => f(...a)
1165
1245
  });
1166
1246
  await this._stopCurrentState();
1167
1247
  if (this._lifecycleState !== LifecycleState.OPEN) {
@@ -1180,12 +1260,7 @@ var PersistentLifecycle = class extends Resource {
1180
1260
  try {
1181
1261
  await this._stop(this._currentState);
1182
1262
  } 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
- });
1263
+ log2.catch(err);
1189
1264
  }
1190
1265
  this._currentState = void 0;
1191
1266
  }
@@ -1207,9 +1282,8 @@ _ts_decorate([
1207
1282
  synchronized
1208
1283
  ], PersistentLifecycle.prototype, "scheduleRestart", null);
1209
1284
 
1210
- // packages/common/async/src/push-iterable.ts
1285
+ // src/push-iterable.ts
1211
1286
  import { invariant as invariant2 } from "@dxos/invariant";
1212
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/common/async/src/push-iterable.ts";
1213
1287
  var makePushIterable = () => {
1214
1288
  const buf = [];
1215
1289
  const trigger2 = new Trigger({
@@ -1223,15 +1297,7 @@ var makePushIterable = () => {
1223
1297
  await trigger2.wait();
1224
1298
  }
1225
1299
  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
- });
1300
+ invariant2(item);
1235
1301
  switch (item.kind) {
1236
1302
  case "next":
1237
1303
  return {
@@ -1273,21 +1339,7 @@ var makePushIterable = () => {
1273
1339
  };
1274
1340
  };
1275
1341
 
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
1342
+ // src/stream-to-array.ts
1291
1343
  var streamToArray = (stream) => {
1292
1344
  let deferred;
1293
1345
  if (!stream.readable) {
@@ -1329,14 +1381,9 @@ var streamToArray = (stream) => {
1329
1381
  return deferred;
1330
1382
  };
1331
1383
 
1332
- // packages/common/async/src/test-stream.ts
1384
+ // src/test-stream.ts
1333
1385
  import { Duplex } from "@dxos/node-std/stream";
1334
1386
  var TestStream = class extends Duplex {
1335
- constructor() {
1336
- super(...arguments);
1337
- this._received = Buffer.alloc(0);
1338
- this._onWrite = new Event();
1339
- }
1340
1387
  static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1341
1388
  stream1.push("ping");
1342
1389
  stream2.push("pong");
@@ -1349,6 +1396,8 @@ var TestStream = class extends Duplex {
1349
1396
  })
1350
1397
  ]);
1351
1398
  }
1399
+ _received = Buffer.alloc(0);
1400
+ _onWrite = new Event();
1352
1401
  _write(chunk, encoding, callback) {
1353
1402
  this._received = Buffer.concat([
1354
1403
  this._received,
@@ -1365,7 +1414,7 @@ var TestStream = class extends Duplex {
1365
1414
  }
1366
1415
  };
1367
1416
 
1368
- // packages/common/async/src/testing.ts
1417
+ // src/testing.ts
1369
1418
  var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2 = 10, error, breakOnError = false }) => {
1370
1419
  const stopTime = timeout2 ? Date.now() + timeout2 : 0;
1371
1420
  const trigger2 = new Trigger();
@@ -1390,13 +1439,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
1390
1439
  timeout: timeout2
1391
1440
  });
1392
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
+ };
1393
1475
 
1394
- // packages/common/async/src/timer.ts
1476
+ // src/timer.ts
1395
1477
  var Timer = class {
1478
+ _callback;
1479
+ _state = new Event();
1480
+ _timer;
1481
+ _count = 0;
1396
1482
  constructor(_callback) {
1397
1483
  this._callback = _callback;
1398
- this._state = new Event();
1399
- this._count = 0;
1400
1484
  }
1401
1485
  get state() {
1402
1486
  return this._state;
@@ -1439,51 +1523,23 @@ var Timer = class {
1439
1523
  }
1440
1524
  };
1441
1525
 
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
1526
+ // src/update-scheduler.ts
1478
1527
  var TIME_PERIOD = 1e3;
1479
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;
1480
1539
  constructor(_ctx, _callback, _params = {}) {
1481
1540
  this._ctx = _ctx;
1482
1541
  this._callback = _callback;
1483
1542
  this._params = _params;
1484
- this._promise = null;
1485
- this._scheduled = false;
1486
- this._lastUpdateTime = -TIME_PERIOD;
1487
1543
  _ctx.onDispose(async () => {
1488
1544
  await this._promise;
1489
1545
  });
@@ -1496,13 +1552,13 @@ var UpdateScheduler = class {
1496
1552
  await this._promise;
1497
1553
  if (this._params.maxFrequency) {
1498
1554
  const now = performance.now();
1499
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1500
- if (delay > 0) {
1555
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1556
+ if (delay2 > 0) {
1501
1557
  await new Promise((resolve) => {
1502
1558
  const timeoutId = setTimeout(() => {
1503
1559
  clearContext();
1504
1560
  resolve();
1505
- }, delay);
1561
+ }, delay2);
1506
1562
  const clearContext = this._ctx.onDispose(() => {
1507
1563
  clearTimeout(timeoutId);
1508
1564
  resolve();
@@ -1546,6 +1602,7 @@ var UpdateScheduler = class {
1546
1602
  }
1547
1603
  };
1548
1604
  export {
1605
+ AsyncTask,
1549
1606
  CancellableObservableProvider,
1550
1607
  DeferredTask,
1551
1608
  Event,
@@ -1566,29 +1623,31 @@ export {
1566
1623
  UpdateScheduler,
1567
1624
  addEventListener,
1568
1625
  addListener,
1569
- asyncChain,
1570
1626
  asyncReturn,
1571
1627
  asyncTimeout,
1628
+ chain,
1572
1629
  combine,
1573
- createPromiseFromCallback,
1574
1630
  debounce,
1631
+ debounceAndThrottle,
1632
+ delay,
1575
1633
  dumpLeaks,
1576
1634
  interval,
1577
1635
  latch,
1578
1636
  makePushIterable,
1579
1637
  observableError,
1580
1638
  onEvent,
1639
+ promiseFromCallback,
1581
1640
  runInContext,
1582
1641
  runInContextAsync,
1583
1642
  scheduleExponentialBackoffTaskInterval,
1584
1643
  scheduleMicroTask,
1585
1644
  scheduleTask,
1586
1645
  scheduleTaskInterval,
1587
- sink,
1588
1646
  sleep,
1589
1647
  sleepWithContext,
1590
1648
  streamToArray,
1591
1649
  synchronized,
1650
+ throttle,
1592
1651
  timeout,
1593
1652
  toError,
1594
1653
  trackLeaks,