@dxos/async 0.8.4-main.dedc0f3 → 0.8.4-main.e00bdcdb52

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 (40) hide show
  1. package/dist/lib/browser/index.mjs +265 -374
  2. package/dist/lib/browser/index.mjs.map +3 -3
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +265 -374
  5. package/dist/lib/node-esm/index.mjs.map +3 -3
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/callback.d.ts.map +1 -1
  8. package/dist/types/src/chain.d.ts.map +1 -1
  9. package/dist/types/src/cleanup.d.ts +2 -2
  10. package/dist/types/src/cleanup.d.ts.map +1 -1
  11. package/dist/types/src/debounce.d.ts +29 -9
  12. package/dist/types/src/debounce.d.ts.map +1 -1
  13. package/dist/types/src/errors.d.ts.map +1 -1
  14. package/dist/types/src/event-emitter.d.ts.map +1 -1
  15. package/dist/types/src/events.d.ts.map +1 -1
  16. package/dist/types/src/mutex.d.ts.map +1 -1
  17. package/dist/types/src/observable-value.d.ts.map +1 -1
  18. package/dist/types/src/observable.d.ts.map +1 -1
  19. package/dist/types/src/persistent-lifecycle.d.ts +2 -2
  20. package/dist/types/src/persistent-lifecycle.d.ts.map +1 -1
  21. package/dist/types/src/stream-to-array.d.ts.map +1 -1
  22. package/dist/types/src/task-scheduling.d.ts +29 -1
  23. package/dist/types/src/task-scheduling.d.ts.map +1 -1
  24. package/dist/types/src/test-stream.d.ts.map +1 -1
  25. package/dist/types/src/testing.d.ts.map +1 -1
  26. package/dist/types/src/timeout.d.ts +1 -1
  27. package/dist/types/src/timeout.d.ts.map +1 -1
  28. package/dist/types/src/timer.d.ts.map +1 -1
  29. package/dist/types/src/track-leaks.d.ts.map +1 -1
  30. package/dist/types/src/trigger.d.ts.map +1 -1
  31. package/dist/types/src/update-scheduler.d.ts.map +1 -1
  32. package/dist/types/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +11 -10
  34. package/src/cleanup.ts +7 -4
  35. package/src/debounce.ts +69 -16
  36. package/src/event-emitter.test.ts +0 -1
  37. package/src/observable-value.ts +4 -2
  38. package/src/persistent-lifecycle.ts +2 -2
  39. package/src/task-scheduling.ts +95 -1
  40. package/src/timeout.ts +6 -9
@@ -22,22 +22,9 @@ var chain = (chain2) => async (elements) => {
22
22
 
23
23
  // src/cleanup.ts
24
24
  import { ComplexMap } from "@dxos/util";
25
- function _define_property(obj, key, value) {
26
- if (key in obj) {
27
- Object.defineProperty(obj, key, {
28
- value,
29
- enumerable: true,
30
- configurable: true,
31
- writable: true
32
- });
33
- } else {
34
- obj[key] = value;
35
- }
36
- return obj;
37
- }
38
25
  var combine = (...cleanupFns) => {
39
26
  return () => {
40
- cleanupFns.flat().forEach((cleanupFn) => cleanupFn());
27
+ cleanupFns.flat().filter((f) => typeof f === "function").forEach((cleanupFn) => cleanupFn());
41
28
  };
42
29
  };
43
30
  var timeout = (cb, ms = 0) => {
@@ -53,19 +40,21 @@ var addEventListener = (target, type, listener, options) => {
53
40
  return () => target.removeEventListener(type, listener, options);
54
41
  };
55
42
  var SubscriptionList = class {
56
- add(cb) {
57
- this._cleanups.push(cb);
43
+ _cleanups = [];
44
+ add(...cb) {
45
+ this._cleanups.push(...cb);
58
46
  return this;
59
47
  }
60
48
  clear() {
61
49
  this._cleanups.forEach((cb) => cb());
62
50
  this._cleanups.length = 0;
63
51
  }
64
- constructor() {
65
- _define_property(this, "_cleanups", []);
66
- }
67
52
  };
68
53
  var SubscriptionSet = class {
54
+ _cleanupMap;
55
+ constructor(keyProjection) {
56
+ this._cleanupMap = new ComplexMap(keyProjection);
57
+ }
69
58
  set(key, cb) {
70
59
  this._cleanupMap.set(key, cb);
71
60
  return this;
@@ -74,36 +63,58 @@ var SubscriptionSet = class {
74
63
  this._cleanupMap.forEach((cb) => cb());
75
64
  this._cleanupMap.clear();
76
65
  }
77
- constructor(keyProjection) {
78
- _define_property(this, "_cleanupMap", void 0);
79
- this._cleanupMap = new ComplexMap(keyProjection);
80
- }
81
66
  };
82
67
 
83
68
  // src/debounce.ts
84
- var debounce = (cb, delay = 100) => {
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) => {
85
86
  let t;
86
87
  return (...args) => {
87
88
  clearTimeout(t);
88
- t = setTimeout(() => cb(...args), delay);
89
+ t = setTimeout(() => cb(...args), delay2);
89
90
  };
90
91
  };
91
- var throttle = (cb, delay = 100) => {
92
+ var throttle = (cb, delay2 = 100) => {
92
93
  let lastCall = 0;
93
94
  return (...args) => {
94
95
  const now = Date.now();
95
- if (now - lastCall >= delay) {
96
+ if (now - lastCall >= delay2) {
96
97
  cb(...args);
97
98
  lastCall = now;
98
99
  }
99
100
  };
100
101
  };
101
- var debounceAndThrottle = (cb, delay = 100) => {
102
- const debounced = debounce(cb, delay);
103
- const throttled = throttle(cb, delay);
102
+ var debounceAndThrottle = (cb, delay2 = 100) => {
103
+ let timeout2;
104
+ let lastCall = 0;
104
105
  return (...args) => {
105
- debounced(...args);
106
- throttled(...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
+ }
107
118
  };
108
119
  };
109
120
 
@@ -157,6 +168,9 @@ var sleepWithContext = (ctx, ms) => {
157
168
  };
158
169
  var asyncReturn = () => sleep(0);
159
170
  var asyncTimeout = async (promise, timeout2, err) => {
171
+ if (typeof promise === "function") {
172
+ throw new Error("First argument must be a promise.");
173
+ }
160
174
  let timeoutId;
161
175
  const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
162
176
  const timeoutPromise = new Promise((resolve, reject) => {
@@ -165,9 +179,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
165
179
  }, timeout2);
166
180
  unrefTimeout(timeoutId);
167
181
  });
168
- const conditionTimeout = typeof promise === "function" ? promiseFromCallback(promise) : promise;
169
182
  return await Promise.race([
170
- conditionTimeout,
183
+ promise,
171
184
  timeoutPromise
172
185
  ]).finally(() => {
173
186
  clearTimeout(timeoutId);
@@ -204,20 +217,6 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
204
217
 
205
218
  // src/events.ts
206
219
  import { Context } from "@dxos/context";
207
- function _define_property2(obj, key, value) {
208
- if (key in obj) {
209
- Object.defineProperty(obj, key, {
210
- value,
211
- enumerable: true,
212
- configurable: true,
213
- writable: true
214
- });
215
- } else {
216
- obj[key] = value;
217
- }
218
- return obj;
219
- }
220
- var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
221
220
  var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
222
221
  var Event = class _Event {
223
222
  /**
@@ -232,6 +231,8 @@ var Event = class _Event {
232
231
  });
233
232
  return event;
234
233
  }
234
+ _listeners = /* @__PURE__ */ new Set();
235
+ _effects = /* @__PURE__ */ new Set();
235
236
  /**
236
237
  * Emit an event.
237
238
  * In most cases should only be called by the class or entity containing the event.
@@ -270,10 +271,7 @@ var Event = class _Event {
270
271
  _ctx,
271
272
  _callback
272
273
  ] : [
273
- new Context(void 0, {
274
- F: __dxlog_file,
275
- L: 132
276
- }),
274
+ new Context(),
277
275
  _ctx
278
276
  ];
279
277
  const weak = !!options?.weak;
@@ -303,10 +301,7 @@ var Event = class _Event {
303
301
  _ctx,
304
302
  _callback
305
303
  ] : [
306
- new Context(void 0, {
307
- F: __dxlog_file,
308
- L: 169
309
- }),
304
+ new Context(),
310
305
  _ctx
311
306
  ];
312
307
  const listener = new EventListener(this, callback, ctx, true, false);
@@ -473,12 +468,30 @@ var Event = class _Event {
473
468
  handle.cleanup = void 0;
474
469
  }
475
470
  }
476
- constructor() {
477
- _define_property2(this, "_listeners", /* @__PURE__ */ new Set());
478
- _define_property2(this, "_effects", /* @__PURE__ */ new Set());
479
- }
480
471
  };
481
472
  var EventListener = class {
473
+ ctx;
474
+ once;
475
+ weak;
476
+ callback;
477
+ _clearDispose = void 0;
478
+ constructor(event, listener, ctx, once, weak) {
479
+ this.ctx = ctx;
480
+ this.once = once;
481
+ this.weak = weak;
482
+ this._clearDispose = ctx.onDispose(() => {
483
+ event._removeListener(this);
484
+ });
485
+ if (weak) {
486
+ this.callback = new WeakRef(listener);
487
+ weakListeners().registry?.register(listener, {
488
+ event: new WeakRef(event),
489
+ listener: this
490
+ }, this);
491
+ } else {
492
+ this.callback = listener;
493
+ }
494
+ }
482
495
  derefCallback() {
483
496
  return this.weak ? this.callback.deref() : this.callback;
484
497
  }
@@ -508,29 +521,6 @@ var EventListener = class {
508
521
  this._clearDispose?.();
509
522
  weakListeners().registry?.unregister(this);
510
523
  }
511
- constructor(event, listener, ctx, once, weak) {
512
- _define_property2(this, "ctx", void 0);
513
- _define_property2(this, "once", void 0);
514
- _define_property2(this, "weak", void 0);
515
- _define_property2(this, "callback", void 0);
516
- _define_property2(this, "_clearDispose", void 0);
517
- this.ctx = ctx;
518
- this.once = once;
519
- this.weak = weak;
520
- this._clearDispose = void 0;
521
- this._clearDispose = ctx.onDispose(() => {
522
- event._removeListener(this);
523
- });
524
- if (weak) {
525
- this.callback = new WeakRef(listener);
526
- weakListeners().registry?.register(listener, {
527
- event: new WeakRef(event),
528
- listener: this
529
- }, this);
530
- } else {
531
- this.callback = listener;
532
- }
533
- }
534
524
  };
535
525
  var weakListenersState = null;
536
526
  var FINALIZATION_REGISTRY_SUPPORTED = !!globalThis.FinalizationRegistry;
@@ -540,9 +530,9 @@ var weakListeners = () => {
540
530
  registry: void 0
541
531
  };
542
532
  }
543
- weakListenersState ?? (weakListenersState = new FinalizationRegistry(({ event, listener }) => {
533
+ weakListenersState ??= new FinalizationRegistry(({ event, listener }) => {
544
534
  event.deref()?._removeListener(listener);
545
- }));
535
+ });
546
536
  return {
547
537
  registry: weakListenersState
548
538
  };
@@ -551,20 +541,10 @@ var weakListeners = () => {
551
541
  // src/mutex.ts
552
542
  import "@dxos/util";
553
543
  import { warnAfterTimeout } from "@dxos/debug";
554
- function _define_property3(obj, key, value) {
555
- if (key in obj) {
556
- Object.defineProperty(obj, key, {
557
- value,
558
- enumerable: true,
559
- configurable: true,
560
- writable: true
561
- });
562
- } else {
563
- obj[key] = value;
564
- }
565
- return obj;
566
- }
567
544
  var Mutex = class {
545
+ _queue = Promise.resolve();
546
+ _queueLength = 0;
547
+ _tag = null;
568
548
  get tag() {
569
549
  return this._tag;
570
550
  }
@@ -608,13 +588,12 @@ var Mutex = class {
608
588
  guard.release();
609
589
  }
610
590
  }
611
- constructor() {
612
- _define_property3(this, "_queue", Promise.resolve());
613
- _define_property3(this, "_queueLength", 0);
614
- _define_property3(this, "_tag", null);
615
- }
616
591
  };
617
592
  var MutexGuard = class {
593
+ _release;
594
+ constructor(_release) {
595
+ this._release = _release;
596
+ }
618
597
  /**
619
598
  * Releases the lock.
620
599
  */
@@ -624,19 +603,14 @@ var MutexGuard = class {
624
603
  [Symbol.dispose]() {
625
604
  this.release();
626
605
  }
627
- constructor(_release) {
628
- _define_property3(this, "_release", void 0);
629
- this._release = _release;
630
- }
631
606
  };
632
- var classMutexSymbol = Symbol("class-mutex");
607
+ var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
633
608
  var FORCE_DISABLE_WARNING = false;
634
609
  var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
635
610
  var synchronized = (target, propertyName, descriptor) => {
636
611
  const method = descriptor.value;
637
612
  descriptor.value = async function synchronizedMethod(...args) {
638
- var _classMutexSymbol;
639
- const mutex = this[_classMutexSymbol = classMutexSymbol] ?? (this[_classMutexSymbol] = new Mutex());
613
+ const mutex = this[classMutexSymbol] ??= new Mutex();
640
614
  const tag = `${target.constructor.name}.${propertyName}`;
641
615
  let guard;
642
616
  if (!enableWarning) {
@@ -661,20 +635,6 @@ import PushStream from "zen-push";
661
635
 
662
636
  // src/trigger.ts
663
637
  import { invariant } from "@dxos/invariant";
664
- function _define_property4(obj, key, value) {
665
- if (key in obj) {
666
- Object.defineProperty(obj, key, {
667
- value,
668
- enumerable: true,
669
- configurable: true,
670
- writable: true
671
- });
672
- } else {
673
- obj[key] = value;
674
- }
675
- return obj;
676
- }
677
- var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/trigger.ts";
678
638
  var trigger = (timeout2) => {
679
639
  let callback;
680
640
  const promise = new Promise((resolve, reject) => {
@@ -690,13 +650,24 @@ var trigger = (timeout2) => {
690
650
  resolver
691
651
  ];
692
652
  };
693
- var TriggerState = /* @__PURE__ */ function(TriggerState2) {
653
+ var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
694
654
  TriggerState2["WAITING"] = "WAITING";
695
655
  TriggerState2["RESOLVED"] = "RESOLVED";
696
656
  TriggerState2["REJECTED"] = "REJECTED";
697
657
  return TriggerState2;
698
- }({});
658
+ })({});
699
659
  var Trigger = class {
660
+ _options;
661
+ _promise;
662
+ _resolve;
663
+ _reject;
664
+ _state = "WAITING";
665
+ constructor(_options = {
666
+ autoReset: false
667
+ }) {
668
+ this._options = _options;
669
+ this.reset();
670
+ }
700
671
  get state() {
701
672
  return this._state;
702
673
  }
@@ -753,29 +724,9 @@ var Trigger = class {
753
724
  }
754
725
  return this;
755
726
  }
756
- constructor(_options = {
757
- autoReset: false
758
- }) {
759
- _define_property4(this, "_options", void 0);
760
- _define_property4(this, "_promise", void 0);
761
- _define_property4(this, "_resolve", void 0);
762
- _define_property4(this, "_reject", void 0);
763
- _define_property4(this, "_state", void 0);
764
- this._options = _options;
765
- this._state = "WAITING";
766
- this.reset();
767
- }
768
727
  };
769
728
  var latch = ({ count = 1, timeout: timeout2 } = {}) => {
770
- invariant(count >= 0, void 0, {
771
- F: __dxlog_file2,
772
- L: 139,
773
- S: void 0,
774
- A: [
775
- "count >= 0",
776
- ""
777
- ]
778
- });
729
+ invariant(count >= 0);
779
730
  let t;
780
731
  let doResolve;
781
732
  let doReject;
@@ -814,20 +765,16 @@ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
814
765
  };
815
766
 
816
767
  // src/observable.ts
817
- function _define_property5(obj, key, value) {
818
- if (key in obj) {
819
- Object.defineProperty(obj, key, {
820
- value,
821
- enumerable: true,
822
- configurable: true,
823
- writable: true
824
- });
825
- } else {
826
- obj[key] = value;
827
- }
828
- return obj;
829
- }
830
768
  var MulticastObservable = class _MulticastObservable extends Observable {
769
+ _value;
770
+ _observers = /* @__PURE__ */ new Set();
771
+ _observable;
772
+ _completed = new Trigger();
773
+ constructor(subscriber, _value) {
774
+ super((observer) => this._subscribe(observer)), this._value = _value;
775
+ this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
776
+ this._observable.subscribe(this._handlers);
777
+ }
831
778
  static from(value, initialValue) {
832
779
  if ("emit" in value) {
833
780
  return new _MulticastObservable((observer) => {
@@ -908,42 +855,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
908
855
  this._observers.delete(observer);
909
856
  };
910
857
  }
911
- constructor(subscriber, _value) {
912
- super((observer) => this._subscribe(observer)), _define_property5(this, "_value", void 0), _define_property5(this, "_observers", void 0), _define_property5(this, "_observable", void 0), _define_property5(this, "_completed", void 0), _define_property5(this, "_handlers", void 0), this._value = _value, this._observers = /* @__PURE__ */ new Set(), this._completed = new Trigger(), this._handlers = {
913
- next: (value) => {
914
- this._value = value;
915
- this._observers.forEach((observer) => observer.next?.(value));
916
- },
917
- error: (err) => {
918
- this._observers.forEach((observer) => observer.error?.(err));
919
- },
920
- complete: () => {
921
- this._completed.wake();
922
- this._observers.forEach((observer) => observer.complete?.());
923
- }
924
- };
925
- this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
926
- this._observable.subscribe(this._handlers);
927
- }
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
+ };
928
871
  };
929
872
  var EMPTY_OBSERVABLE = MulticastObservable.of(null);
930
873
 
931
874
  // src/observable-value.ts
932
875
  import { createSetDispatch } from "@dxos/util";
933
- function _define_property6(obj, key, value) {
934
- if (key in obj) {
935
- Object.defineProperty(obj, key, {
936
- value,
937
- enumerable: true,
938
- configurable: true,
939
- writable: true
940
- });
941
- } else {
942
- obj[key] = value;
943
- }
944
- return obj;
945
- }
946
876
  var ObservableProvider = class {
877
+ _handlers = /* @__PURE__ */ new Set();
878
+ _proxy = createSetDispatch({
879
+ handlers: this._handlers
880
+ });
881
+ _value;
947
882
  /**
948
883
  * Proxy used to dispatch callbacks to each subscription.
949
884
  */
@@ -962,15 +897,13 @@ var ObservableProvider = class {
962
897
  this._handlers.delete(handler);
963
898
  };
964
899
  }
965
- constructor() {
966
- _define_property6(this, "_handlers", /* @__PURE__ */ new Set());
967
- _define_property6(this, "_proxy", createSetDispatch({
968
- handlers: this._handlers
969
- }));
970
- _define_property6(this, "_value", void 0);
971
- }
972
900
  };
973
901
  var CancellableObservableProvider = class extends ObservableProvider {
902
+ _handleCancel;
903
+ _cancelled = false;
904
+ constructor(_handleCancel) {
905
+ super(), this._handleCancel = _handleCancel;
906
+ }
974
907
  get cancelled() {
975
908
  return this._cancelled;
976
909
  }
@@ -982,9 +915,6 @@ var CancellableObservableProvider = class extends ObservableProvider {
982
915
  await this._handleCancel?.();
983
916
  this.callback.onCancelled?.();
984
917
  }
985
- constructor(_handleCancel) {
986
- super(), _define_property6(this, "_handleCancel", void 0), _define_property6(this, "_cancelled", void 0), this._handleCancel = _handleCancel, this._cancelled = false;
987
- }
988
918
  };
989
919
 
990
920
  // src/persistent-lifecycle.ts
@@ -993,16 +923,15 @@ import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
993
923
  import { log as log2 } from "@dxos/log";
994
924
 
995
925
  // src/task-scheduling.ts
996
- import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
926
+ import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
997
927
  import { StackTrace as StackTrace2 } from "@dxos/debug";
998
928
 
999
929
  // src/track-leaks.ts
1000
930
  import { StackTrace } from "@dxos/debug";
1001
931
  import { log } from "@dxos/log";
1002
- var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
1003
932
  var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
1004
933
  var openResources = /* @__PURE__ */ new Set();
1005
- var handleSymbol = Symbol("checkLeaksHandle");
934
+ var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
1006
935
  var trackResource = (resourceProvider) => {
1007
936
  if (!enabled) {
1008
937
  return () => {
@@ -1049,31 +978,11 @@ var dumpLeaks = () => {
1049
978
  if (!enabled) {
1050
979
  return;
1051
980
  }
1052
- log.info(`Leaked resources ${openResources.size}:`, void 0, {
1053
- F: __dxlog_file3,
1054
- L: 82,
1055
- S: void 0,
1056
- C: (f, a) => f(...a)
1057
- });
981
+ log.info(`Leaked resources ${openResources.size}:`);
1058
982
  for (const resource of openResources) {
1059
- log.info(`- ${resource.name} at`, void 0, {
1060
- F: __dxlog_file3,
1061
- L: 84,
1062
- S: void 0,
1063
- C: (f, a) => f(...a)
1064
- });
1065
- log.info(resource.openStack.getStack(1), void 0, {
1066
- F: __dxlog_file3,
1067
- L: 85,
1068
- S: void 0,
1069
- C: (f, a) => f(...a)
1070
- });
1071
- log.info("\n", void 0, {
1072
- F: __dxlog_file3,
1073
- L: 86,
1074
- S: void 0,
1075
- C: (f, a) => f(...a)
1076
- });
983
+ log.info(`- ${resource.name} at`);
984
+ log.info(resource.openStack.getStack(1));
985
+ log.info("\n");
1077
986
  }
1078
987
  };
1079
988
  if (enabled) {
@@ -1081,20 +990,16 @@ if (enabled) {
1081
990
  }
1082
991
 
1083
992
  // src/task-scheduling.ts
1084
- function _define_property7(obj, key, value) {
1085
- if (key in obj) {
1086
- Object.defineProperty(obj, key, {
1087
- value,
1088
- enumerable: true,
1089
- configurable: true,
1090
- writable: true
1091
- });
1092
- } else {
1093
- obj[key] = value;
1094
- }
1095
- return obj;
1096
- }
1097
993
  var DeferredTask = class {
994
+ _ctx;
995
+ _callback;
996
+ _scheduled = false;
997
+ _currentTask = null;
998
+ _nextTask = new Trigger();
999
+ constructor(_ctx, _callback) {
1000
+ this._ctx = _ctx;
1001
+ this._callback = _callback;
1002
+ }
1098
1003
  get scheduled() {
1099
1004
  return this._scheduled;
1100
1005
  }
@@ -1133,17 +1038,78 @@ var DeferredTask = class {
1133
1038
  async join() {
1134
1039
  await this._currentTask;
1135
1040
  }
1136
- constructor(_ctx, _callback) {
1137
- _define_property7(this, "_ctx", void 0);
1138
- _define_property7(this, "_callback", void 0);
1139
- _define_property7(this, "_scheduled", void 0);
1140
- _define_property7(this, "_currentTask", void 0);
1141
- _define_property7(this, "_nextTask", void 0);
1142
- this._ctx = _ctx;
1143
- this._callback = _callback;
1144
- this._scheduled = false;
1145
- this._currentTask = null;
1146
- this._nextTask = new Trigger();
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;
1147
1113
  }
1148
1114
  };
1149
1115
  var runInContext = (ctx, fn) => {
@@ -1225,29 +1191,29 @@ var scheduleExponentialBackoffTaskInterval = (ctx, task, initialInterval) => {
1225
1191
  };
1226
1192
 
1227
1193
  // src/persistent-lifecycle.ts
1228
- function _define_property8(obj, key, value) {
1229
- if (key in obj) {
1230
- Object.defineProperty(obj, key, {
1231
- value,
1232
- enumerable: true,
1233
- configurable: true,
1234
- writable: true
1235
- });
1236
- } else {
1237
- obj[key] = value;
1238
- }
1239
- return obj;
1240
- }
1241
1194
  function _ts_decorate(decorators, target, key, desc) {
1242
1195
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1243
1196
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1244
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;
1245
1198
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1246
1199
  }
1247
- var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
1248
1200
  var INIT_RESTART_DELAY = 100;
1249
1201
  var DEFAULT_MAX_RESTART_DELAY = 5e3;
1250
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;
1210
+ constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
1211
+ super();
1212
+ this._start = start;
1213
+ this._stop = stop;
1214
+ this._onRestart = onRestart;
1215
+ this._maxRestartDelay = maxRestartDelay;
1216
+ }
1251
1217
  get state() {
1252
1218
  return this._currentState;
1253
1219
  }
@@ -1258,11 +1224,6 @@ var PersistentLifecycle = class extends Resource {
1258
1224
  } catch (err) {
1259
1225
  log2.warn("Restart failed", {
1260
1226
  err
1261
- }, {
1262
- F: __dxlog_file4,
1263
- L: 72,
1264
- S: this,
1265
- C: (f, a) => f(...a)
1266
1227
  });
1267
1228
  this._restartTask?.schedule();
1268
1229
  }
@@ -1270,11 +1231,6 @@ var PersistentLifecycle = class extends Resource {
1270
1231
  this._currentState = await this._start().catch((err) => {
1271
1232
  log2.warn("Start failed", {
1272
1233
  err
1273
- }, {
1274
- F: __dxlog_file4,
1275
- L: 78,
1276
- S: this,
1277
- C: (f, a) => f(...a)
1278
1234
  });
1279
1235
  this._restartTask?.schedule();
1280
1236
  return void 0;
@@ -1288,11 +1244,6 @@ var PersistentLifecycle = class extends Resource {
1288
1244
  async _restart() {
1289
1245
  log2(`restarting in ${this._restartAfter}ms`, {
1290
1246
  state: this._lifecycleState
1291
- }, {
1292
- F: __dxlog_file4,
1293
- L: 91,
1294
- S: this,
1295
- C: (f, a) => f(...a)
1296
1247
  });
1297
1248
  await this._stopCurrentState();
1298
1249
  if (this._lifecycleState !== LifecycleState.OPEN) {
@@ -1311,12 +1262,7 @@ var PersistentLifecycle = class extends Resource {
1311
1262
  try {
1312
1263
  await this._stop(this._currentState);
1313
1264
  } catch (err) {
1314
- log2.catch(err, void 0, {
1315
- F: __dxlog_file4,
1316
- L: 113,
1317
- S: this,
1318
- C: (f, a) => f(...a)
1319
- });
1265
+ log2.catch(err);
1320
1266
  }
1321
1267
  this._currentState = void 0;
1322
1268
  }
@@ -1330,13 +1276,6 @@ var PersistentLifecycle = class extends Resource {
1330
1276
  }
1331
1277
  this._restartTask.schedule();
1332
1278
  }
1333
- constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
1334
- super(), _define_property8(this, "_start", void 0), _define_property8(this, "_stop", void 0), _define_property8(this, "_onRestart", void 0), _define_property8(this, "_maxRestartDelay", void 0), _define_property8(this, "_currentState", void 0), _define_property8(this, "_restartTask", void 0), _define_property8(this, "_restartAfter", 0);
1335
- this._start = start;
1336
- this._stop = stop;
1337
- this._onRestart = onRestart;
1338
- this._maxRestartDelay = maxRestartDelay;
1339
- }
1340
1279
  };
1341
1280
  _ts_decorate([
1342
1281
  synchronized
@@ -1347,7 +1286,6 @@ _ts_decorate([
1347
1286
 
1348
1287
  // src/push-iterable.ts
1349
1288
  import { invariant as invariant2 } from "@dxos/invariant";
1350
- var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
1351
1289
  var makePushIterable = () => {
1352
1290
  const buf = [];
1353
1291
  const trigger2 = new Trigger({
@@ -1361,15 +1299,7 @@ var makePushIterable = () => {
1361
1299
  await trigger2.wait();
1362
1300
  }
1363
1301
  const item = buf.shift();
1364
- invariant2(item, void 0, {
1365
- F: __dxlog_file5,
1366
- L: 42,
1367
- S: this,
1368
- A: [
1369
- "item",
1370
- ""
1371
- ]
1372
- });
1302
+ invariant2(item);
1373
1303
  switch (item.kind) {
1374
1304
  case "next":
1375
1305
  return {
@@ -1455,19 +1385,6 @@ var streamToArray = (stream) => {
1455
1385
 
1456
1386
  // src/test-stream.ts
1457
1387
  import { Duplex } from "node:stream";
1458
- function _define_property9(obj, key, value) {
1459
- if (key in obj) {
1460
- Object.defineProperty(obj, key, {
1461
- value,
1462
- enumerable: true,
1463
- configurable: true,
1464
- writable: true
1465
- });
1466
- } else {
1467
- obj[key] = value;
1468
- }
1469
- return obj;
1470
- }
1471
1388
  var TestStream = class extends Duplex {
1472
1389
  static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1473
1390
  stream1.push("ping");
@@ -1481,6 +1398,8 @@ var TestStream = class extends Duplex {
1481
1398
  })
1482
1399
  ]);
1483
1400
  }
1401
+ _received = Buffer.alloc(0);
1402
+ _onWrite = new Event();
1484
1403
  _write(chunk, encoding, callback) {
1485
1404
  this._received = Buffer.concat([
1486
1405
  this._received,
@@ -1495,9 +1414,6 @@ var TestStream = class extends Duplex {
1495
1414
  const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
1496
1415
  return asyncTimeout(this._onWrite.waitForCondition(() => this._received.equals(dataBuffer)), timeout2);
1497
1416
  }
1498
- constructor(...args) {
1499
- super(...args), _define_property9(this, "_received", Buffer.alloc(0)), _define_property9(this, "_onWrite", new Event());
1500
- }
1501
1417
  };
1502
1418
 
1503
1419
  // src/testing.ts
@@ -1560,20 +1476,14 @@ var untilError = (cb) => {
1560
1476
  };
1561
1477
 
1562
1478
  // src/timer.ts
1563
- function _define_property10(obj, key, value) {
1564
- if (key in obj) {
1565
- Object.defineProperty(obj, key, {
1566
- value,
1567
- enumerable: true,
1568
- configurable: true,
1569
- writable: true
1570
- });
1571
- } else {
1572
- obj[key] = value;
1573
- }
1574
- return obj;
1575
- }
1576
1479
  var Timer = class {
1480
+ _callback;
1481
+ _state = new Event();
1482
+ _timer;
1483
+ _count = 0;
1484
+ constructor(_callback) {
1485
+ this._callback = _callback;
1486
+ }
1577
1487
  get state() {
1578
1488
  return this._state;
1579
1489
  }
@@ -1613,33 +1523,29 @@ var Timer = class {
1613
1523
  this._state.emit(false);
1614
1524
  return this;
1615
1525
  }
1616
- constructor(_callback) {
1617
- _define_property10(this, "_callback", void 0);
1618
- _define_property10(this, "_state", void 0);
1619
- _define_property10(this, "_timer", void 0);
1620
- _define_property10(this, "_count", void 0);
1621
- this._callback = _callback;
1622
- this._state = new Event();
1623
- this._count = 0;
1624
- }
1625
1526
  };
1626
1527
 
1627
1528
  // src/update-scheduler.ts
1628
- function _define_property11(obj, key, value) {
1629
- if (key in obj) {
1630
- Object.defineProperty(obj, key, {
1631
- value,
1632
- enumerable: true,
1633
- configurable: true,
1634
- writable: true
1635
- });
1636
- } else {
1637
- obj[key] = value;
1638
- }
1639
- return obj;
1640
- }
1641
1529
  var TIME_PERIOD = 1e3;
1642
1530
  var UpdateScheduler = class {
1531
+ _ctx;
1532
+ _callback;
1533
+ _params;
1534
+ /**
1535
+ * Promise that resolves when the callback is done.
1536
+ * Never rejects.
1537
+ */
1538
+ _promise = null;
1539
+ _scheduled = false;
1540
+ _lastUpdateTime = -TIME_PERIOD;
1541
+ constructor(_ctx, _callback, _params = {}) {
1542
+ this._ctx = _ctx;
1543
+ this._callback = _callback;
1544
+ this._params = _params;
1545
+ _ctx.onDispose(async () => {
1546
+ await this._promise;
1547
+ });
1548
+ }
1643
1549
  trigger() {
1644
1550
  if (this._scheduled) {
1645
1551
  return;
@@ -1648,13 +1554,13 @@ var UpdateScheduler = class {
1648
1554
  await this._promise;
1649
1555
  if (this._params.maxFrequency) {
1650
1556
  const now = performance.now();
1651
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1652
- if (delay > 0) {
1557
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1558
+ if (delay2 > 0) {
1653
1559
  await new Promise((resolve) => {
1654
1560
  const timeoutId = setTimeout(() => {
1655
1561
  clearContext();
1656
1562
  resolve();
1657
- }, delay);
1563
+ }, delay2);
1658
1564
  const clearContext = this._ctx.onDispose(() => {
1659
1565
  clearTimeout(timeoutId);
1660
1566
  resolve();
@@ -1696,25 +1602,9 @@ var UpdateScheduler = class {
1696
1602
  this._promise = this._callback();
1697
1603
  await this._promise;
1698
1604
  }
1699
- constructor(_ctx, _callback, _params = {}) {
1700
- _define_property11(this, "_ctx", void 0);
1701
- _define_property11(this, "_callback", void 0);
1702
- _define_property11(this, "_params", void 0);
1703
- _define_property11(this, "_promise", void 0);
1704
- _define_property11(this, "_scheduled", void 0);
1705
- _define_property11(this, "_lastUpdateTime", void 0);
1706
- this._ctx = _ctx;
1707
- this._callback = _callback;
1708
- this._params = _params;
1709
- this._promise = null;
1710
- this._scheduled = false;
1711
- this._lastUpdateTime = -TIME_PERIOD;
1712
- _ctx.onDispose(async () => {
1713
- await this._promise;
1714
- });
1715
- }
1716
1605
  };
1717
1606
  export {
1607
+ AsyncTask,
1718
1608
  CancellableObservableProvider,
1719
1609
  DeferredTask,
1720
1610
  Event,
@@ -1741,6 +1631,7 @@ export {
1741
1631
  combine,
1742
1632
  debounce,
1743
1633
  debounceAndThrottle,
1634
+ delay,
1744
1635
  dumpLeaks,
1745
1636
  interval,
1746
1637
  latch,