@dxos/async 0.8.4-main.ead640a → 0.8.4-main.effb148878

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 (41) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/index.mjs +269 -372
  3. package/dist/lib/browser/index.mjs.map +3 -3
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/node-esm/index.mjs +269 -372
  6. package/dist/lib/node-esm/index.mjs.map +3 -3
  7. package/dist/lib/node-esm/meta.json +1 -1
  8. package/dist/types/src/callback.d.ts.map +1 -1
  9. package/dist/types/src/chain.d.ts.map +1 -1
  10. package/dist/types/src/cleanup.d.ts +2 -2
  11. package/dist/types/src/cleanup.d.ts.map +1 -1
  12. package/dist/types/src/debounce.d.ts +29 -9
  13. package/dist/types/src/debounce.d.ts.map +1 -1
  14. package/dist/types/src/errors.d.ts.map +1 -1
  15. package/dist/types/src/event-emitter.d.ts.map +1 -1
  16. package/dist/types/src/events.d.ts.map +1 -1
  17. package/dist/types/src/mutex.d.ts.map +1 -1
  18. package/dist/types/src/observable-value.d.ts.map +1 -1
  19. package/dist/types/src/observable.d.ts.map +1 -1
  20. package/dist/types/src/persistent-lifecycle.d.ts +2 -2
  21. package/dist/types/src/persistent-lifecycle.d.ts.map +1 -1
  22. package/dist/types/src/stream-to-array.d.ts.map +1 -1
  23. package/dist/types/src/task-scheduling.d.ts +29 -1
  24. package/dist/types/src/task-scheduling.d.ts.map +1 -1
  25. package/dist/types/src/test-stream.d.ts.map +1 -1
  26. package/dist/types/src/testing.d.ts.map +1 -1
  27. package/dist/types/src/timeout.d.ts +1 -1
  28. package/dist/types/src/timeout.d.ts.map +1 -1
  29. package/dist/types/src/timer.d.ts.map +1 -1
  30. package/dist/types/src/track-leaks.d.ts.map +1 -1
  31. package/dist/types/src/trigger.d.ts.map +1 -1
  32. package/dist/types/src/update-scheduler.d.ts.map +1 -1
  33. package/dist/types/tsconfig.tsbuildinfo +1 -1
  34. package/package.json +12 -11
  35. package/src/cleanup.ts +7 -4
  36. package/src/debounce.ts +69 -16
  37. package/src/event-emitter.test.ts +0 -1
  38. package/src/observable-value.ts +4 -2
  39. package/src/persistent-lifecycle.ts +10 -2
  40. package/src/task-scheduling.ts +95 -1
  41. 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) => {
@@ -697,6 +657,17 @@ var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
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
  }
@@ -1256,25 +1222,21 @@ var PersistentLifecycle = class extends Resource {
1256
1222
  try {
1257
1223
  await this._restart();
1258
1224
  } catch (err) {
1225
+ if (this._ctx?.disposed) {
1226
+ return;
1227
+ }
1259
1228
  log2.warn("Restart failed", {
1260
1229
  err
1261
- }, {
1262
- F: __dxlog_file4,
1263
- L: 72,
1264
- S: this,
1265
- C: (f, a) => f(...a)
1266
1230
  });
1267
1231
  this._restartTask?.schedule();
1268
1232
  }
1269
1233
  });
1270
1234
  this._currentState = await this._start().catch((err) => {
1235
+ if (this._ctx?.disposed) {
1236
+ return void 0;
1237
+ }
1271
1238
  log2.warn("Start failed", {
1272
1239
  err
1273
- }, {
1274
- F: __dxlog_file4,
1275
- L: 78,
1276
- S: this,
1277
- C: (f, a) => f(...a)
1278
1240
  });
1279
1241
  this._restartTask?.schedule();
1280
1242
  return void 0;
@@ -1288,11 +1250,6 @@ var PersistentLifecycle = class extends Resource {
1288
1250
  async _restart() {
1289
1251
  log2(`restarting in ${this._restartAfter}ms`, {
1290
1252
  state: this._lifecycleState
1291
- }, {
1292
- F: __dxlog_file4,
1293
- L: 91,
1294
- S: this,
1295
- C: (f, a) => f(...a)
1296
1253
  });
1297
1254
  await this._stopCurrentState();
1298
1255
  if (this._lifecycleState !== LifecycleState.OPEN) {
@@ -1311,12 +1268,7 @@ var PersistentLifecycle = class extends Resource {
1311
1268
  try {
1312
1269
  await this._stop(this._currentState);
1313
1270
  } 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
- });
1271
+ log2.catch(err);
1320
1272
  }
1321
1273
  this._currentState = void 0;
1322
1274
  }
@@ -1330,13 +1282,6 @@ var PersistentLifecycle = class extends Resource {
1330
1282
  }
1331
1283
  this._restartTask.schedule();
1332
1284
  }
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
1285
  };
1341
1286
  _ts_decorate([
1342
1287
  synchronized
@@ -1347,7 +1292,6 @@ _ts_decorate([
1347
1292
 
1348
1293
  // src/push-iterable.ts
1349
1294
  import { invariant as invariant2 } from "@dxos/invariant";
1350
- var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
1351
1295
  var makePushIterable = () => {
1352
1296
  const buf = [];
1353
1297
  const trigger2 = new Trigger({
@@ -1361,15 +1305,7 @@ var makePushIterable = () => {
1361
1305
  await trigger2.wait();
1362
1306
  }
1363
1307
  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
- });
1308
+ invariant2(item);
1373
1309
  switch (item.kind) {
1374
1310
  case "next":
1375
1311
  return {
@@ -1455,19 +1391,6 @@ var streamToArray = (stream) => {
1455
1391
 
1456
1392
  // src/test-stream.ts
1457
1393
  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
1394
  var TestStream = class extends Duplex {
1472
1395
  static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1473
1396
  stream1.push("ping");
@@ -1481,6 +1404,8 @@ var TestStream = class extends Duplex {
1481
1404
  })
1482
1405
  ]);
1483
1406
  }
1407
+ _received = Buffer.alloc(0);
1408
+ _onWrite = new Event();
1484
1409
  _write(chunk, encoding, callback) {
1485
1410
  this._received = Buffer.concat([
1486
1411
  this._received,
@@ -1495,9 +1420,6 @@ var TestStream = class extends Duplex {
1495
1420
  const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
1496
1421
  return asyncTimeout(this._onWrite.waitForCondition(() => this._received.equals(dataBuffer)), timeout2);
1497
1422
  }
1498
- constructor(...args) {
1499
- super(...args), _define_property9(this, "_received", Buffer.alloc(0)), _define_property9(this, "_onWrite", new Event());
1500
- }
1501
1423
  };
1502
1424
 
1503
1425
  // src/testing.ts
@@ -1560,20 +1482,14 @@ var untilError = (cb) => {
1560
1482
  };
1561
1483
 
1562
1484
  // 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
1485
  var Timer = class {
1486
+ _callback;
1487
+ _state = new Event();
1488
+ _timer;
1489
+ _count = 0;
1490
+ constructor(_callback) {
1491
+ this._callback = _callback;
1492
+ }
1577
1493
  get state() {
1578
1494
  return this._state;
1579
1495
  }
@@ -1613,33 +1529,29 @@ var Timer = class {
1613
1529
  this._state.emit(false);
1614
1530
  return this;
1615
1531
  }
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
1532
  };
1626
1533
 
1627
1534
  // 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
1535
  var TIME_PERIOD = 1e3;
1642
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;
1547
+ constructor(_ctx, _callback, _params = {}) {
1548
+ this._ctx = _ctx;
1549
+ this._callback = _callback;
1550
+ this._params = _params;
1551
+ _ctx.onDispose(async () => {
1552
+ await this._promise;
1553
+ });
1554
+ }
1643
1555
  trigger() {
1644
1556
  if (this._scheduled) {
1645
1557
  return;
@@ -1648,13 +1560,13 @@ var UpdateScheduler = class {
1648
1560
  await this._promise;
1649
1561
  if (this._params.maxFrequency) {
1650
1562
  const now = performance.now();
1651
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1652
- if (delay > 0) {
1563
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1564
+ if (delay2 > 0) {
1653
1565
  await new Promise((resolve) => {
1654
1566
  const timeoutId = setTimeout(() => {
1655
1567
  clearContext();
1656
1568
  resolve();
1657
- }, delay);
1569
+ }, delay2);
1658
1570
  const clearContext = this._ctx.onDispose(() => {
1659
1571
  clearTimeout(timeoutId);
1660
1572
  resolve();
@@ -1696,25 +1608,9 @@ var UpdateScheduler = class {
1696
1608
  this._promise = this._callback();
1697
1609
  await this._promise;
1698
1610
  }
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
1611
  };
1717
1612
  export {
1613
+ AsyncTask,
1718
1614
  CancellableObservableProvider,
1719
1615
  DeferredTask,
1720
1616
  Event,
@@ -1741,6 +1637,7 @@ export {
1741
1637
  combine,
1742
1638
  debounce,
1743
1639
  debounceAndThrottle,
1640
+ delay,
1744
1641
  dumpLeaks,
1745
1642
  interval,
1746
1643
  latch,