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