@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
@@ -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) => {
@@ -695,6 +655,17 @@ var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
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
  }
@@ -1254,25 +1220,21 @@ var PersistentLifecycle = class extends Resource {
1254
1220
  try {
1255
1221
  await this._restart();
1256
1222
  } catch (err) {
1223
+ if (this._ctx?.disposed) {
1224
+ return;
1225
+ }
1257
1226
  log2.warn("Restart failed", {
1258
1227
  err
1259
- }, {
1260
- F: __dxlog_file4,
1261
- L: 72,
1262
- S: this,
1263
- C: (f, a) => f(...a)
1264
1228
  });
1265
1229
  this._restartTask?.schedule();
1266
1230
  }
1267
1231
  });
1268
1232
  this._currentState = await this._start().catch((err) => {
1233
+ if (this._ctx?.disposed) {
1234
+ return void 0;
1235
+ }
1269
1236
  log2.warn("Start failed", {
1270
1237
  err
1271
- }, {
1272
- F: __dxlog_file4,
1273
- L: 78,
1274
- S: this,
1275
- C: (f, a) => f(...a)
1276
1238
  });
1277
1239
  this._restartTask?.schedule();
1278
1240
  return void 0;
@@ -1286,11 +1248,6 @@ var PersistentLifecycle = class extends Resource {
1286
1248
  async _restart() {
1287
1249
  log2(`restarting in ${this._restartAfter}ms`, {
1288
1250
  state: this._lifecycleState
1289
- }, {
1290
- F: __dxlog_file4,
1291
- L: 91,
1292
- S: this,
1293
- C: (f, a) => f(...a)
1294
1251
  });
1295
1252
  await this._stopCurrentState();
1296
1253
  if (this._lifecycleState !== LifecycleState.OPEN) {
@@ -1309,12 +1266,7 @@ var PersistentLifecycle = class extends Resource {
1309
1266
  try {
1310
1267
  await this._stop(this._currentState);
1311
1268
  } 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
- });
1269
+ log2.catch(err);
1318
1270
  }
1319
1271
  this._currentState = void 0;
1320
1272
  }
@@ -1328,13 +1280,6 @@ var PersistentLifecycle = class extends Resource {
1328
1280
  }
1329
1281
  this._restartTask.schedule();
1330
1282
  }
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
1283
  };
1339
1284
  _ts_decorate([
1340
1285
  synchronized
@@ -1345,7 +1290,6 @@ _ts_decorate([
1345
1290
 
1346
1291
  // src/push-iterable.ts
1347
1292
  import { invariant as invariant2 } from "@dxos/invariant";
1348
- var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
1349
1293
  var makePushIterable = () => {
1350
1294
  const buf = [];
1351
1295
  const trigger2 = new Trigger({
@@ -1359,15 +1303,7 @@ var makePushIterable = () => {
1359
1303
  await trigger2.wait();
1360
1304
  }
1361
1305
  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
- });
1306
+ invariant2(item);
1371
1307
  switch (item.kind) {
1372
1308
  case "next":
1373
1309
  return {
@@ -1453,19 +1389,6 @@ var streamToArray = (stream) => {
1453
1389
 
1454
1390
  // src/test-stream.ts
1455
1391
  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
1392
  var TestStream = class extends Duplex {
1470
1393
  static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1471
1394
  stream1.push("ping");
@@ -1479,6 +1402,8 @@ var TestStream = class extends Duplex {
1479
1402
  })
1480
1403
  ]);
1481
1404
  }
1405
+ _received = Buffer.alloc(0);
1406
+ _onWrite = new Event();
1482
1407
  _write(chunk, encoding, callback) {
1483
1408
  this._received = Buffer.concat([
1484
1409
  this._received,
@@ -1493,9 +1418,6 @@ var TestStream = class extends Duplex {
1493
1418
  const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
1494
1419
  return asyncTimeout(this._onWrite.waitForCondition(() => this._received.equals(dataBuffer)), timeout2);
1495
1420
  }
1496
- constructor(...args) {
1497
- super(...args), _define_property9(this, "_received", Buffer.alloc(0)), _define_property9(this, "_onWrite", new Event());
1498
- }
1499
1421
  };
1500
1422
 
1501
1423
  // src/testing.ts
@@ -1558,20 +1480,14 @@ var untilError = (cb) => {
1558
1480
  };
1559
1481
 
1560
1482
  // 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
1483
  var Timer = class {
1484
+ _callback;
1485
+ _state = new Event();
1486
+ _timer;
1487
+ _count = 0;
1488
+ constructor(_callback) {
1489
+ this._callback = _callback;
1490
+ }
1575
1491
  get state() {
1576
1492
  return this._state;
1577
1493
  }
@@ -1611,33 +1527,29 @@ var Timer = class {
1611
1527
  this._state.emit(false);
1612
1528
  return this;
1613
1529
  }
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
1530
  };
1624
1531
 
1625
1532
  // 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
1533
  var TIME_PERIOD = 1e3;
1640
1534
  var UpdateScheduler = class {
1535
+ _ctx;
1536
+ _callback;
1537
+ _params;
1538
+ /**
1539
+ * Promise that resolves when the callback is done.
1540
+ * Never rejects.
1541
+ */
1542
+ _promise = null;
1543
+ _scheduled = false;
1544
+ _lastUpdateTime = -TIME_PERIOD;
1545
+ constructor(_ctx, _callback, _params = {}) {
1546
+ this._ctx = _ctx;
1547
+ this._callback = _callback;
1548
+ this._params = _params;
1549
+ _ctx.onDispose(async () => {
1550
+ await this._promise;
1551
+ });
1552
+ }
1641
1553
  trigger() {
1642
1554
  if (this._scheduled) {
1643
1555
  return;
@@ -1646,13 +1558,13 @@ var UpdateScheduler = class {
1646
1558
  await this._promise;
1647
1559
  if (this._params.maxFrequency) {
1648
1560
  const now = performance.now();
1649
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1650
- if (delay > 0) {
1561
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1562
+ if (delay2 > 0) {
1651
1563
  await new Promise((resolve) => {
1652
1564
  const timeoutId = setTimeout(() => {
1653
1565
  clearContext();
1654
1566
  resolve();
1655
- }, delay);
1567
+ }, delay2);
1656
1568
  const clearContext = this._ctx.onDispose(() => {
1657
1569
  clearTimeout(timeoutId);
1658
1570
  resolve();
@@ -1694,25 +1606,9 @@ var UpdateScheduler = class {
1694
1606
  this._promise = this._callback();
1695
1607
  await this._promise;
1696
1608
  }
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
1609
  };
1715
1610
  export {
1611
+ AsyncTask,
1716
1612
  CancellableObservableProvider,
1717
1613
  DeferredTask,
1718
1614
  Event,
@@ -1739,6 +1635,7 @@ export {
1739
1635
  combine,
1740
1636
  debounce,
1741
1637
  debounceAndThrottle,
1638
+ delay,
1742
1639
  dumpLeaks,
1743
1640
  interval,
1744
1641
  latch,