@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,7 +1,7 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
 
3
- // packages/common/async/src/callback.ts
4
- var createPromiseFromCallback = (run) => new Promise((resolve, reject) => {
3
+ // src/callback.ts
4
+ var promiseFromCallback = (run) => new Promise((resolve, reject) => {
5
5
  run((error, value) => {
6
6
  if (error) {
7
7
  reject(error);
@@ -11,20 +11,20 @@ var createPromiseFromCallback = (run) => new Promise((resolve, reject) => {
11
11
  });
12
12
  });
13
13
 
14
- // packages/common/async/src/chain.ts
15
- var asyncChain = (chain) => async (elements) => {
14
+ // src/chain.ts
15
+ var chain = (chain2) => async (elements) => {
16
16
  let result = await elements;
17
- for (const part of chain) {
17
+ for (const part of chain2) {
18
18
  result = await Promise.all(result.map(async (element) => await part(element)));
19
19
  }
20
20
  return result;
21
21
  };
22
22
 
23
- // packages/common/async/src/cleanup.ts
23
+ // src/cleanup.ts
24
24
  import { ComplexMap } from "@dxos/util";
25
25
  var combine = (...cleanupFns) => {
26
26
  return () => {
27
- cleanupFns.flat().forEach((cleanupFn) => cleanupFn());
27
+ cleanupFns.flat().filter((f) => typeof f === "function").forEach((cleanupFn) => cleanupFn());
28
28
  };
29
29
  };
30
30
  var timeout = (cb, ms = 0) => {
@@ -35,16 +35,14 @@ var interval = (cb, ms) => {
35
35
  const t = setInterval(cb, ms);
36
36
  return () => clearInterval(t);
37
37
  };
38
- function addEventListener(target, type, listener, options) {
38
+ var addEventListener = (target, type, listener, options) => {
39
39
  target.addEventListener(type, listener, options);
40
40
  return () => target.removeEventListener(type, listener, options);
41
- }
41
+ };
42
42
  var SubscriptionList = class {
43
- constructor() {
44
- this._cleanups = [];
45
- }
46
- add(cb) {
47
- this._cleanups.push(cb);
43
+ _cleanups = [];
44
+ add(...cb) {
45
+ this._cleanups.push(...cb);
48
46
  return this;
49
47
  }
50
48
  clear() {
@@ -53,6 +51,7 @@ var SubscriptionList = class {
53
51
  }
54
52
  };
55
53
  var SubscriptionSet = class {
54
+ _cleanupMap;
56
55
  constructor(keyProjection) {
57
56
  this._cleanupMap = new ComplexMap(keyProjection);
58
57
  }
@@ -66,16 +65,60 @@ var SubscriptionSet = class {
66
65
  }
67
66
  };
68
67
 
69
- // packages/common/async/src/debounce.ts
70
- var debounce = (cb, wait = 100) => {
68
+ // src/debounce.ts
69
+ var delay = (cb, delay2 = 100) => {
70
+ let pending = false;
71
+ return (...args) => {
72
+ if (pending) {
73
+ return;
74
+ }
75
+ pending = true;
76
+ setTimeout(() => {
77
+ try {
78
+ cb(...args);
79
+ } finally {
80
+ pending = false;
81
+ }
82
+ }, delay2);
83
+ };
84
+ };
85
+ var debounce = (cb, delay2 = 100) => {
71
86
  let t;
72
87
  return (...args) => {
73
88
  clearTimeout(t);
74
- t = setTimeout(() => cb(...args), wait);
89
+ t = setTimeout(() => cb(...args), delay2);
90
+ };
91
+ };
92
+ var throttle = (cb, delay2 = 100) => {
93
+ let lastCall = 0;
94
+ return (...args) => {
95
+ const now = Date.now();
96
+ if (now - lastCall >= delay2) {
97
+ cb(...args);
98
+ lastCall = now;
99
+ }
100
+ };
101
+ };
102
+ var debounceAndThrottle = (cb, delay2 = 100) => {
103
+ let timeout2;
104
+ let lastCall = 0;
105
+ return (...args) => {
106
+ const now = Date.now();
107
+ const delta = now - lastCall;
108
+ clearTimeout(timeout2);
109
+ if (delta >= delay2) {
110
+ cb(...args);
111
+ lastCall = now;
112
+ } else {
113
+ timeout2 = setTimeout(() => {
114
+ cb(...args);
115
+ lastCall = Date.now();
116
+ }, delay2 - delta);
117
+ }
75
118
  };
76
119
  };
77
120
 
78
- // packages/common/async/src/errors.ts
121
+ // src/errors.ts
79
122
  var toError = (err) => err === void 0 || typeof err === "string" ? new Error(err) : err;
80
123
  var TimeoutError = class extends Error {
81
124
  constructor(timeout2, label) {
@@ -90,7 +133,7 @@ var observableError = (observable, err) => {
90
133
  }
91
134
  };
92
135
 
93
- // packages/common/async/src/timeout.ts
136
+ // src/timeout.ts
94
137
  import { ContextDisposedError } from "@dxos/context";
95
138
  var sleep = (ms) => {
96
139
  return new Promise((resolve) => {
@@ -106,8 +149,28 @@ var sleep = (ms) => {
106
149
  sleeper();
107
150
  });
108
151
  };
152
+ var sleepWithContext = (ctx, ms) => {
153
+ const error = new ContextDisposedError();
154
+ return new Promise((resolve, reject) => {
155
+ if (ctx.disposed) {
156
+ reject(error);
157
+ return;
158
+ }
159
+ const timeout2 = setTimeout(() => {
160
+ clearDispose();
161
+ resolve();
162
+ }, ms);
163
+ const clearDispose = ctx.onDispose(() => {
164
+ clearTimeout(timeout2);
165
+ reject(error);
166
+ });
167
+ });
168
+ };
109
169
  var asyncReturn = () => sleep(0);
110
170
  var asyncTimeout = async (promise, timeout2, err) => {
171
+ if (typeof promise === "function") {
172
+ throw new Error("First argument must be a promise.");
173
+ }
111
174
  let timeoutId;
112
175
  const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
113
176
  const timeoutPromise = new Promise((resolve, reject) => {
@@ -116,9 +179,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
116
179
  }, timeout2);
117
180
  unrefTimeout(timeoutId);
118
181
  });
119
- const conditionTimeout = typeof promise === "function" ? createPromiseFromCallback(promise) : promise;
120
182
  return await Promise.race([
121
- conditionTimeout,
183
+ promise,
122
184
  timeoutPromise
123
185
  ]).finally(() => {
124
186
  clearTimeout(timeoutId);
@@ -129,25 +191,8 @@ var unrefTimeout = (timeoutId) => {
129
191
  timeoutId.unref();
130
192
  }
131
193
  };
132
- var sleepWithContext = (ctx, ms) => {
133
- const error = new ContextDisposedError();
134
- return new Promise((resolve, reject) => {
135
- if (ctx.disposed) {
136
- reject(error);
137
- return;
138
- }
139
- const timeout2 = setTimeout(() => {
140
- clearDispose();
141
- resolve();
142
- }, ms);
143
- const clearDispose = ctx.onDispose(() => {
144
- clearTimeout(timeout2);
145
- reject(error);
146
- });
147
- });
148
- };
149
194
 
150
- // packages/common/async/src/event-emitter.ts
195
+ // src/event-emitter.ts
151
196
  var onEvent = (eventEmitter, eventName, callback) => {
152
197
  eventEmitter.on(eventName, callback);
153
198
  return () => eventEmitter.off(eventName, callback);
@@ -170,15 +215,10 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
170
215
  return timeout2 ? asyncTimeout(promise, timeout2, error ?? new Error()).finally(off) : promise.finally(off);
171
216
  };
172
217
 
173
- // packages/common/async/src/events.ts
218
+ // src/events.ts
174
219
  import { Context } from "@dxos/context";
175
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/async/src/events.ts";
176
220
  var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
177
221
  var Event = class _Event {
178
- constructor() {
179
- this._listeners = /* @__PURE__ */ new Set();
180
- this._effects = /* @__PURE__ */ new Set();
181
- }
182
222
  /**
183
223
  * Wrap objects that have on/off style event emitters.
184
224
  */
@@ -191,6 +231,8 @@ var Event = class _Event {
191
231
  });
192
232
  return event;
193
233
  }
234
+ _listeners = /* @__PURE__ */ new Set();
235
+ _effects = /* @__PURE__ */ new Set();
194
236
  /**
195
237
  * Emit an event.
196
238
  * In most cases should only be called by the class or entity containing the event.
@@ -229,10 +271,7 @@ var Event = class _Event {
229
271
  _ctx,
230
272
  _callback
231
273
  ] : [
232
- new Context(void 0, {
233
- F: __dxlog_file,
234
- L: 132
235
- }),
274
+ new Context(),
236
275
  _ctx
237
276
  ];
238
277
  const weak = !!options?.weak;
@@ -262,10 +301,7 @@ var Event = class _Event {
262
301
  _ctx,
263
302
  _callback
264
303
  ] : [
265
- new Context(void 0, {
266
- F: __dxlog_file,
267
- L: 169
268
- }),
304
+ new Context(),
269
305
  _ctx
270
306
  ];
271
307
  const listener = new EventListener(this, callback, ctx, true, false);
@@ -434,11 +470,15 @@ var Event = class _Event {
434
470
  }
435
471
  };
436
472
  var EventListener = class {
473
+ ctx;
474
+ once;
475
+ weak;
476
+ callback;
477
+ _clearDispose = void 0;
437
478
  constructor(event, listener, ctx, once, weak) {
438
479
  this.ctx = ctx;
439
480
  this.once = once;
440
481
  this.weak = weak;
441
- this._clearDispose = void 0;
442
482
  this._clearDispose = ctx.onDispose(() => {
443
483
  event._removeListener(this);
444
484
  });
@@ -498,65 +538,13 @@ var weakListeners = () => {
498
538
  };
499
539
  };
500
540
 
501
- // packages/common/async/src/latch.ts
502
- import { invariant } from "@dxos/invariant";
503
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/common/async/src/latch.ts";
504
- var latch = ({ count = 1, timeout: timeout2 } = {}) => {
505
- invariant(count >= 0, void 0, {
506
- F: __dxlog_file2,
507
- L: 19,
508
- S: void 0,
509
- A: [
510
- "count >= 0",
511
- ""
512
- ]
513
- });
514
- let t;
515
- let doResolve;
516
- let doReject;
517
- const promise = new Promise((resolve, reject) => {
518
- doResolve = (value) => {
519
- clearTimeout(t);
520
- resolve(value);
521
- };
522
- doReject = (err) => {
523
- clearTimeout(t);
524
- reject(err);
525
- };
526
- });
527
- if (count === 0) {
528
- setTimeout(() => {
529
- doResolve(0);
530
- });
531
- } else {
532
- if (timeout2) {
533
- t = setTimeout(() => {
534
- doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
535
- }, timeout2);
536
- }
537
- }
538
- let i = 0;
539
- return [
540
- async () => await promise,
541
- () => {
542
- if (++i === count) {
543
- doResolve(i);
544
- }
545
- return i;
546
- },
547
- (err) => doReject(err)
548
- ];
549
- };
550
-
551
- // packages/common/async/src/mutex.ts
541
+ // src/mutex.ts
552
542
  import "@dxos/util";
553
543
  import { warnAfterTimeout } from "@dxos/debug";
554
544
  var Mutex = class {
555
- constructor() {
556
- this._queue = Promise.resolve();
557
- this._queueLength = 0;
558
- this._tag = null;
559
- }
545
+ _queue = Promise.resolve();
546
+ _queueLength = 0;
547
+ _tag = null;
560
548
  get tag() {
561
549
  return this._tag;
562
550
  }
@@ -602,6 +590,7 @@ var Mutex = class {
602
590
  }
603
591
  };
604
592
  var MutexGuard = class {
593
+ _release;
605
594
  constructor(_release) {
606
595
  this._release = _release;
607
596
  }
@@ -615,7 +604,7 @@ var MutexGuard = class {
615
604
  this.release();
616
605
  }
617
606
  };
618
- var classMutexSymbol = Symbol("class-mutex");
607
+ var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
619
608
  var FORCE_DISABLE_WARNING = false;
620
609
  var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
621
610
  var synchronized = (target, propertyName, descriptor) => {
@@ -640,11 +629,12 @@ var synchronized = (target, propertyName, descriptor) => {
640
629
  });
641
630
  };
642
631
 
643
- // packages/common/async/src/observable.ts
632
+ // src/observable.ts
644
633
  import Observable from "zen-observable";
645
634
  import PushStream from "zen-push";
646
635
 
647
- // packages/common/async/src/trigger.ts
636
+ // src/trigger.ts
637
+ import { invariant } from "@dxos/invariant";
648
638
  var trigger = (timeout2) => {
649
639
  let callback;
650
640
  const promise = new Promise((resolve, reject) => {
@@ -660,18 +650,22 @@ var trigger = (timeout2) => {
660
650
  resolver
661
651
  ];
662
652
  };
663
- var TriggerState = /* @__PURE__ */ function(TriggerState2) {
653
+ var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
664
654
  TriggerState2["WAITING"] = "WAITING";
665
655
  TriggerState2["RESOLVED"] = "RESOLVED";
666
656
  TriggerState2["REJECTED"] = "REJECTED";
667
657
  return TriggerState2;
668
- }({});
658
+ })({});
669
659
  var Trigger = class {
660
+ _options;
661
+ _promise;
662
+ _resolve;
663
+ _reject;
664
+ _state = "WAITING";
670
665
  constructor(_options = {
671
666
  autoReset: false
672
667
  }) {
673
668
  this._options = _options;
674
- this._state = "WAITING";
675
669
  this.reset();
676
670
  }
677
671
  get state() {
@@ -731,23 +725,53 @@ var Trigger = class {
731
725
  return this;
732
726
  }
733
727
  };
728
+ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
729
+ invariant(count >= 0);
730
+ let t;
731
+ let doResolve;
732
+ let doReject;
733
+ const promise = new Promise((resolve, reject) => {
734
+ doResolve = (value) => {
735
+ clearTimeout(t);
736
+ resolve(value);
737
+ };
738
+ doReject = (err) => {
739
+ clearTimeout(t);
740
+ reject(err);
741
+ };
742
+ });
743
+ if (count === 0) {
744
+ setTimeout(() => {
745
+ doResolve(0);
746
+ });
747
+ } else {
748
+ if (timeout2) {
749
+ t = setTimeout(() => {
750
+ doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
751
+ }, timeout2);
752
+ }
753
+ }
754
+ let i = 0;
755
+ return [
756
+ async () => await promise,
757
+ () => {
758
+ if (++i === count) {
759
+ doResolve(i);
760
+ }
761
+ return i;
762
+ },
763
+ (err) => doReject(err)
764
+ ];
765
+ };
734
766
 
735
- // packages/common/async/src/observable.ts
767
+ // src/observable.ts
736
768
  var MulticastObservable = class _MulticastObservable extends Observable {
769
+ _value;
770
+ _observers = /* @__PURE__ */ new Set();
771
+ _observable;
772
+ _completed = new Trigger();
737
773
  constructor(subscriber, _value) {
738
- super((observer) => this._subscribe(observer)), this._value = _value, this._observers = /* @__PURE__ */ new Set(), this._completed = new Trigger(), this._handlers = {
739
- next: (value) => {
740
- this._value = value;
741
- this._observers.forEach((observer) => observer.next?.(value));
742
- },
743
- error: (err) => {
744
- this._observers.forEach((observer) => observer.error?.(err));
745
- },
746
- complete: () => {
747
- this._completed.wake();
748
- this._observers.forEach((observer) => observer.complete?.());
749
- }
750
- };
774
+ super((observer) => this._subscribe(observer)), this._value = _value;
751
775
  this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
752
776
  this._observable.subscribe(this._handlers);
753
777
  }
@@ -831,18 +855,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
831
855
  this._observers.delete(observer);
832
856
  };
833
857
  }
858
+ _handlers = {
859
+ next: (value) => {
860
+ this._value = value;
861
+ this._observers.forEach((observer) => observer.next?.(value));
862
+ },
863
+ error: (err) => {
864
+ this._observers.forEach((observer) => observer.error?.(err));
865
+ },
866
+ complete: () => {
867
+ this._completed.wake();
868
+ this._observers.forEach((observer) => observer.complete?.());
869
+ }
870
+ };
834
871
  };
835
872
  var EMPTY_OBSERVABLE = MulticastObservable.of(null);
836
873
 
837
- // packages/common/async/src/observable-value.ts
874
+ // src/observable-value.ts
838
875
  import { createSetDispatch } from "@dxos/util";
839
876
  var ObservableProvider = class {
840
- constructor() {
841
- this._handlers = /* @__PURE__ */ new Set();
842
- this._proxy = createSetDispatch({
843
- handlers: this._handlers
844
- });
845
- }
877
+ _handlers = /* @__PURE__ */ new Set();
878
+ _proxy = createSetDispatch({
879
+ handlers: this._handlers
880
+ });
881
+ _value;
846
882
  /**
847
883
  * Proxy used to dispatch callbacks to each subscription.
848
884
  */
@@ -863,8 +899,10 @@ var ObservableProvider = class {
863
899
  }
864
900
  };
865
901
  var CancellableObservableProvider = class extends ObservableProvider {
902
+ _handleCancel;
903
+ _cancelled = false;
866
904
  constructor(_handleCancel) {
867
- super(), this._handleCancel = _handleCancel, this._cancelled = false;
905
+ super(), this._handleCancel = _handleCancel;
868
906
  }
869
907
  get cancelled() {
870
908
  return this._cancelled;
@@ -879,22 +917,21 @@ var CancellableObservableProvider = class extends ObservableProvider {
879
917
  }
880
918
  };
881
919
 
882
- // packages/common/async/src/persistent-lifecycle.ts
920
+ // src/persistent-lifecycle.ts
883
921
  import { LifecycleState, Resource, cancelWithContext } from "@dxos/context";
884
922
  import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
885
923
  import { log as log2 } from "@dxos/log";
886
924
 
887
- // packages/common/async/src/task-scheduling.ts
888
- import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
925
+ // src/task-scheduling.ts
926
+ import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
889
927
  import { StackTrace as StackTrace2 } from "@dxos/debug";
890
928
 
891
- // packages/common/async/src/track-leaks.ts
929
+ // src/track-leaks.ts
892
930
  import { StackTrace } from "@dxos/debug";
893
931
  import { log } from "@dxos/log";
894
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/common/async/src/track-leaks.ts";
895
932
  var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
896
933
  var openResources = /* @__PURE__ */ new Set();
897
- var handleSymbol = Symbol("checkLeaksHandle");
934
+ var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
898
935
  var trackResource = (resourceProvider) => {
899
936
  if (!enabled) {
900
937
  return () => {
@@ -941,45 +978,27 @@ var dumpLeaks = () => {
941
978
  if (!enabled) {
942
979
  return;
943
980
  }
944
- log.info(`Leaked resources ${openResources.size}:`, void 0, {
945
- F: __dxlog_file3,
946
- L: 82,
947
- S: void 0,
948
- C: (f, a) => f(...a)
949
- });
981
+ log.info(`Leaked resources ${openResources.size}:`);
950
982
  for (const resource of openResources) {
951
- log.info(`- ${resource.name} at`, void 0, {
952
- F: __dxlog_file3,
953
- L: 84,
954
- S: void 0,
955
- C: (f, a) => f(...a)
956
- });
957
- log.info(resource.openStack.getStack(1), void 0, {
958
- F: __dxlog_file3,
959
- L: 85,
960
- S: void 0,
961
- C: (f, a) => f(...a)
962
- });
963
- log.info("\n", void 0, {
964
- F: __dxlog_file3,
965
- L: 86,
966
- S: void 0,
967
- C: (f, a) => f(...a)
968
- });
983
+ log.info(`- ${resource.name} at`);
984
+ log.info(resource.openStack.getStack(1));
985
+ log.info("\n");
969
986
  }
970
987
  };
971
988
  if (enabled) {
972
989
  global.dxDumpLeaks = dumpLeaks;
973
990
  }
974
991
 
975
- // packages/common/async/src/task-scheduling.ts
992
+ // src/task-scheduling.ts
976
993
  var DeferredTask = class {
994
+ _ctx;
995
+ _callback;
996
+ _scheduled = false;
997
+ _currentTask = null;
998
+ _nextTask = new Trigger();
977
999
  constructor(_ctx, _callback) {
978
1000
  this._ctx = _ctx;
979
1001
  this._callback = _callback;
980
- this._scheduled = false;
981
- this._currentTask = null;
982
- this._nextTask = new Trigger();
983
1002
  }
984
1003
  get scheduled() {
985
1004
  return this._scheduled;
@@ -1020,6 +1039,79 @@ var DeferredTask = class {
1020
1039
  await this._currentTask;
1021
1040
  }
1022
1041
  };
1042
+ var AsyncTask = class {
1043
+ #callback;
1044
+ #ctx = void 0;
1045
+ #scheduled = false;
1046
+ #currentTask = null;
1047
+ #nextTask = new Trigger();
1048
+ constructor(callback) {
1049
+ this.#callback = callback;
1050
+ }
1051
+ get scheduled() {
1052
+ return this.#scheduled;
1053
+ }
1054
+ /**
1055
+ * Context of the resource that owns the task.
1056
+ * When the context is disposed, the task is cancelled and cannot be scheduled again.
1057
+ */
1058
+ open() {
1059
+ this.#ctx = new Context2();
1060
+ }
1061
+ /**
1062
+ * Closes the task and waits for it to finish if it is running.
1063
+ */
1064
+ async close() {
1065
+ await this.#ctx?.dispose();
1066
+ await this.join();
1067
+ this.#ctx = void 0;
1068
+ }
1069
+ [Symbol.asyncDispose]() {
1070
+ return this.close();
1071
+ }
1072
+ /**
1073
+ * Schedule the task to run asynchronously.
1074
+ */
1075
+ // TODO(dmaretskyi): Add scheduleAt. Where the earlier time will override the later one.
1076
+ schedule() {
1077
+ if (!this.#ctx || this.#ctx.disposed) {
1078
+ throw new Error("AsyncTask not open");
1079
+ }
1080
+ if (this.#scheduled) {
1081
+ return;
1082
+ }
1083
+ scheduleTask(this.#ctx, async () => {
1084
+ await this.#currentTask;
1085
+ if (!this.#ctx || this.#ctx.disposed) {
1086
+ return;
1087
+ }
1088
+ this.#scheduled = false;
1089
+ const completionTrigger = this.#nextTask;
1090
+ this.#nextTask = new Trigger();
1091
+ this.#currentTask = runInContextAsync(this.#ctx, () => this.#callback()).then(() => {
1092
+ completionTrigger.wake();
1093
+ });
1094
+ });
1095
+ this.#scheduled = true;
1096
+ }
1097
+ /**
1098
+ * Schedule the task to run and wait for it to finish.
1099
+ */
1100
+ async runBlocking() {
1101
+ if (this.#ctx?.disposed) {
1102
+ throw new ContextDisposedError2();
1103
+ }
1104
+ this.schedule();
1105
+ await this.#nextTask.wait();
1106
+ }
1107
+ /**
1108
+ * Waits for the current task to finish if it is running.
1109
+ * Does not schedule a new task.
1110
+ */
1111
+ async join() {
1112
+ await this.#currentTask;
1113
+ }
1114
+ };
1023
1115
  var runInContext = (ctx, fn) => {
1024
1116
  try {
1025
1117
  fn();
@@ -1098,22 +1190,25 @@ var scheduleExponentialBackoffTaskInterval = (ctx, task, initialInterval) => {
1098
1190
  });
1099
1191
  };
1100
1192
 
1101
- // packages/common/async/src/persistent-lifecycle.ts
1193
+ // src/persistent-lifecycle.ts
1102
1194
  function _ts_decorate(decorators, target, key, desc) {
1103
1195
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1104
1196
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1105
1197
  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;
1106
1198
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1107
1199
  }
1108
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
1109
1200
  var INIT_RESTART_DELAY = 100;
1110
1201
  var DEFAULT_MAX_RESTART_DELAY = 5e3;
1111
1202
  var PersistentLifecycle = class extends Resource {
1203
+ _start;
1204
+ _stop;
1205
+ _onRestart;
1206
+ _maxRestartDelay;
1207
+ _currentState = void 0;
1208
+ _restartTask = void 0;
1209
+ _restartAfter = 0;
1112
1210
  constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
1113
1211
  super();
1114
- this._currentState = void 0;
1115
- this._restartTask = void 0;
1116
- this._restartAfter = 0;
1117
1212
  this._start = start;
1118
1213
  this._stop = stop;
1119
1214
  this._onRestart = onRestart;
@@ -1127,25 +1222,21 @@ var PersistentLifecycle = class extends Resource {
1127
1222
  try {
1128
1223
  await this._restart();
1129
1224
  } catch (err) {
1225
+ if (this._ctx?.disposed) {
1226
+ return;
1227
+ }
1130
1228
  log2.warn("Restart failed", {
1131
1229
  err
1132
- }, {
1133
- F: __dxlog_file4,
1134
- L: 72,
1135
- S: this,
1136
- C: (f, a) => f(...a)
1137
1230
  });
1138
1231
  this._restartTask?.schedule();
1139
1232
  }
1140
1233
  });
1141
1234
  this._currentState = await this._start().catch((err) => {
1235
+ if (this._ctx?.disposed) {
1236
+ return void 0;
1237
+ }
1142
1238
  log2.warn("Start failed", {
1143
1239
  err
1144
- }, {
1145
- F: __dxlog_file4,
1146
- L: 78,
1147
- S: this,
1148
- C: (f, a) => f(...a)
1149
1240
  });
1150
1241
  this._restartTask?.schedule();
1151
1242
  return void 0;
@@ -1159,11 +1250,6 @@ var PersistentLifecycle = class extends Resource {
1159
1250
  async _restart() {
1160
1251
  log2(`restarting in ${this._restartAfter}ms`, {
1161
1252
  state: this._lifecycleState
1162
- }, {
1163
- F: __dxlog_file4,
1164
- L: 91,
1165
- S: this,
1166
- C: (f, a) => f(...a)
1167
1253
  });
1168
1254
  await this._stopCurrentState();
1169
1255
  if (this._lifecycleState !== LifecycleState.OPEN) {
@@ -1182,12 +1268,7 @@ var PersistentLifecycle = class extends Resource {
1182
1268
  try {
1183
1269
  await this._stop(this._currentState);
1184
1270
  } catch (err) {
1185
- log2.catch(err, void 0, {
1186
- F: __dxlog_file4,
1187
- L: 113,
1188
- S: this,
1189
- C: (f, a) => f(...a)
1190
- });
1271
+ log2.catch(err);
1191
1272
  }
1192
1273
  this._currentState = void 0;
1193
1274
  }
@@ -1209,9 +1290,8 @@ _ts_decorate([
1209
1290
  synchronized
1210
1291
  ], PersistentLifecycle.prototype, "scheduleRestart", null);
1211
1292
 
1212
- // packages/common/async/src/push-iterable.ts
1293
+ // src/push-iterable.ts
1213
1294
  import { invariant as invariant2 } from "@dxos/invariant";
1214
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/common/async/src/push-iterable.ts";
1215
1295
  var makePushIterable = () => {
1216
1296
  const buf = [];
1217
1297
  const trigger2 = new Trigger({
@@ -1225,15 +1305,7 @@ var makePushIterable = () => {
1225
1305
  await trigger2.wait();
1226
1306
  }
1227
1307
  const item = buf.shift();
1228
- invariant2(item, void 0, {
1229
- F: __dxlog_file5,
1230
- L: 42,
1231
- S: this,
1232
- A: [
1233
- "item",
1234
- ""
1235
- ]
1236
- });
1308
+ invariant2(item);
1237
1309
  switch (item.kind) {
1238
1310
  case "next":
1239
1311
  return {
@@ -1275,21 +1347,7 @@ var makePushIterable = () => {
1275
1347
  };
1276
1348
  };
1277
1349
 
1278
- // packages/common/async/src/sink.ts
1279
- var sink = (emitter, event, count = 1) => {
1280
- const [getPromise, resolve] = trigger();
1281
- let counter = 0;
1282
- const listener = () => {
1283
- if (++counter === count) {
1284
- emitter.off(event, listener);
1285
- resolve();
1286
- }
1287
- };
1288
- emitter.on(event, listener);
1289
- return getPromise();
1290
- };
1291
-
1292
- // packages/common/async/src/stream-to-array.ts
1350
+ // src/stream-to-array.ts
1293
1351
  var streamToArray = (stream) => {
1294
1352
  let deferred;
1295
1353
  if (!stream.readable) {
@@ -1331,14 +1389,9 @@ var streamToArray = (stream) => {
1331
1389
  return deferred;
1332
1390
  };
1333
1391
 
1334
- // packages/common/async/src/test-stream.ts
1392
+ // src/test-stream.ts
1335
1393
  import { Duplex } from "node:stream";
1336
1394
  var TestStream = class extends Duplex {
1337
- constructor() {
1338
- super(...arguments);
1339
- this._received = Buffer.alloc(0);
1340
- this._onWrite = new Event();
1341
- }
1342
1395
  static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1343
1396
  stream1.push("ping");
1344
1397
  stream2.push("pong");
@@ -1351,6 +1404,8 @@ var TestStream = class extends Duplex {
1351
1404
  })
1352
1405
  ]);
1353
1406
  }
1407
+ _received = Buffer.alloc(0);
1408
+ _onWrite = new Event();
1354
1409
  _write(chunk, encoding, callback) {
1355
1410
  this._received = Buffer.concat([
1356
1411
  this._received,
@@ -1367,7 +1422,7 @@ var TestStream = class extends Duplex {
1367
1422
  }
1368
1423
  };
1369
1424
 
1370
- // packages/common/async/src/testing.ts
1425
+ // src/testing.ts
1371
1426
  var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2 = 10, error, breakOnError = false }) => {
1372
1427
  const stopTime = timeout2 ? Date.now() + timeout2 : 0;
1373
1428
  const trigger2 = new Trigger();
@@ -1392,13 +1447,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
1392
1447
  timeout: timeout2
1393
1448
  });
1394
1449
  };
1450
+ var until = (cb, timeout2) => {
1451
+ return new Promise((resolve, reject) => {
1452
+ const t = timeout2 && setTimeout(() => {
1453
+ reject(new Error(`Timeout after ${t}ms`));
1454
+ }, timeout2);
1455
+ setTimeout(async () => {
1456
+ try {
1457
+ await cb((value) => {
1458
+ t && clearTimeout(t);
1459
+ resolve(value);
1460
+ }, (error) => {
1461
+ t && clearTimeout(t);
1462
+ reject(error);
1463
+ });
1464
+ } catch (err) {
1465
+ reject(err);
1466
+ }
1467
+ });
1468
+ });
1469
+ };
1470
+ var untilPromise = (cb) => cb();
1471
+ var untilError = (cb) => {
1472
+ return new Promise((resolve, reject) => {
1473
+ setTimeout(async () => {
1474
+ try {
1475
+ await cb();
1476
+ reject(new Error("No error was thrown."));
1477
+ } catch (err) {
1478
+ resolve(err);
1479
+ }
1480
+ });
1481
+ });
1482
+ };
1395
1483
 
1396
- // packages/common/async/src/timer.ts
1484
+ // src/timer.ts
1397
1485
  var Timer = class {
1486
+ _callback;
1487
+ _state = new Event();
1488
+ _timer;
1489
+ _count = 0;
1398
1490
  constructor(_callback) {
1399
1491
  this._callback = _callback;
1400
- this._state = new Event();
1401
- this._count = 0;
1402
1492
  }
1403
1493
  get state() {
1404
1494
  return this._state;
@@ -1441,51 +1531,23 @@ var Timer = class {
1441
1531
  }
1442
1532
  };
1443
1533
 
1444
- // packages/common/async/src/until.ts
1445
- var until = (cb, timeout2) => {
1446
- return new Promise((resolve, reject) => {
1447
- const t = timeout2 && setTimeout(() => {
1448
- reject(new Error(`Timeout after ${t}ms`));
1449
- }, timeout2);
1450
- setTimeout(async () => {
1451
- try {
1452
- await cb((value) => {
1453
- t && clearTimeout(t);
1454
- resolve(value);
1455
- }, (error) => {
1456
- t && clearTimeout(t);
1457
- reject(error);
1458
- });
1459
- } catch (err) {
1460
- reject(err);
1461
- }
1462
- });
1463
- });
1464
- };
1465
- var untilPromise = (cb) => cb();
1466
- var untilError = (cb) => {
1467
- return new Promise((resolve, reject) => {
1468
- setTimeout(async () => {
1469
- try {
1470
- await cb();
1471
- reject(new Error("No error was thrown."));
1472
- } catch (err) {
1473
- resolve(err);
1474
- }
1475
- });
1476
- });
1477
- };
1478
-
1479
- // packages/common/async/src/update-scheduler.ts
1534
+ // src/update-scheduler.ts
1480
1535
  var TIME_PERIOD = 1e3;
1481
1536
  var UpdateScheduler = class {
1537
+ _ctx;
1538
+ _callback;
1539
+ _params;
1540
+ /**
1541
+ * Promise that resolves when the callback is done.
1542
+ * Never rejects.
1543
+ */
1544
+ _promise = null;
1545
+ _scheduled = false;
1546
+ _lastUpdateTime = -TIME_PERIOD;
1482
1547
  constructor(_ctx, _callback, _params = {}) {
1483
1548
  this._ctx = _ctx;
1484
1549
  this._callback = _callback;
1485
1550
  this._params = _params;
1486
- this._promise = null;
1487
- this._scheduled = false;
1488
- this._lastUpdateTime = -TIME_PERIOD;
1489
1551
  _ctx.onDispose(async () => {
1490
1552
  await this._promise;
1491
1553
  });
@@ -1498,13 +1560,13 @@ var UpdateScheduler = class {
1498
1560
  await this._promise;
1499
1561
  if (this._params.maxFrequency) {
1500
1562
  const now = performance.now();
1501
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1502
- if (delay > 0) {
1563
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1564
+ if (delay2 > 0) {
1503
1565
  await new Promise((resolve) => {
1504
1566
  const timeoutId = setTimeout(() => {
1505
1567
  clearContext();
1506
1568
  resolve();
1507
- }, delay);
1569
+ }, delay2);
1508
1570
  const clearContext = this._ctx.onDispose(() => {
1509
1571
  clearTimeout(timeoutId);
1510
1572
  resolve();
@@ -1548,6 +1610,7 @@ var UpdateScheduler = class {
1548
1610
  }
1549
1611
  };
1550
1612
  export {
1613
+ AsyncTask,
1551
1614
  CancellableObservableProvider,
1552
1615
  DeferredTask,
1553
1616
  Event,
@@ -1568,29 +1631,31 @@ export {
1568
1631
  UpdateScheduler,
1569
1632
  addEventListener,
1570
1633
  addListener,
1571
- asyncChain,
1572
1634
  asyncReturn,
1573
1635
  asyncTimeout,
1636
+ chain,
1574
1637
  combine,
1575
- createPromiseFromCallback,
1576
1638
  debounce,
1639
+ debounceAndThrottle,
1640
+ delay,
1577
1641
  dumpLeaks,
1578
1642
  interval,
1579
1643
  latch,
1580
1644
  makePushIterable,
1581
1645
  observableError,
1582
1646
  onEvent,
1647
+ promiseFromCallback,
1583
1648
  runInContext,
1584
1649
  runInContextAsync,
1585
1650
  scheduleExponentialBackoffTaskInterval,
1586
1651
  scheduleMicroTask,
1587
1652
  scheduleTask,
1588
1653
  scheduleTaskInterval,
1589
- sink,
1590
1654
  sleep,
1591
1655
  sleepWithContext,
1592
1656
  streamToArray,
1593
1657
  synchronized,
1658
+ throttle,
1594
1659
  timeout,
1595
1660
  toError,
1596
1661
  trackLeaks,