@dxos/async 0.8.4-main.84f28bd → 0.8.4-main.937b3ca

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 (65) hide show
  1. package/dist/lib/browser/index.mjs +297 -196
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +297 -196
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/callback.d.ts +2 -1
  8. package/dist/types/src/callback.d.ts.map +1 -1
  9. package/dist/types/src/chain.d.ts +1 -1
  10. package/dist/types/src/chain.d.ts.map +1 -1
  11. package/dist/types/src/cleanup.d.ts +2 -1
  12. package/dist/types/src/cleanup.d.ts.map +1 -1
  13. package/dist/types/src/debounce.d.ts +31 -2
  14. package/dist/types/src/debounce.d.ts.map +1 -1
  15. package/dist/types/src/index.d.ts +0 -5
  16. package/dist/types/src/index.d.ts.map +1 -1
  17. package/dist/types/src/persistent-lifecycle.d.ts +2 -2
  18. package/dist/types/src/persistent-lifecycle.d.ts.map +1 -1
  19. package/dist/types/src/task-scheduling.d.ts +28 -0
  20. package/dist/types/src/task-scheduling.d.ts.map +1 -1
  21. package/dist/types/src/testing.d.ts +13 -0
  22. package/dist/types/src/testing.d.ts.map +1 -1
  23. package/dist/types/src/timeout.d.ts +1 -1
  24. package/dist/types/src/timeout.d.ts.map +1 -1
  25. package/dist/types/src/trigger.d.ts +11 -0
  26. package/dist/types/src/trigger.d.ts.map +1 -1
  27. package/dist/types/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +13 -9
  29. package/src/callback.ts +3 -3
  30. package/src/chain.ts +1 -1
  31. package/src/cleanup.ts +4 -3
  32. package/src/debounce.test.ts +69 -12
  33. package/src/debounce.ts +82 -13
  34. package/src/event-emitter.test.ts +2 -1
  35. package/src/index.ts +0 -5
  36. package/src/observable-value.test.ts +1 -1
  37. package/src/persistent-lifecycle.test.ts +1 -1
  38. package/src/persistent-lifecycle.ts +2 -2
  39. package/src/task-scheduling.ts +94 -1
  40. package/src/testing.test.ts +41 -1
  41. package/src/testing.ts +53 -0
  42. package/src/timeout.ts +23 -22
  43. package/src/trigger.ts +58 -1
  44. package/src/update-scheduler.ts +1 -1
  45. package/dist/types/src/latch.d.ts +0 -11
  46. package/dist/types/src/latch.d.ts.map +0 -1
  47. package/dist/types/src/sink.d.ts +0 -6
  48. package/dist/types/src/sink.d.ts.map +0 -1
  49. package/dist/types/src/throttle.d.ts +0 -2
  50. package/dist/types/src/throttle.d.ts.map +0 -1
  51. package/dist/types/src/throttle.test.d.ts +0 -2
  52. package/dist/types/src/throttle.test.d.ts.map +0 -1
  53. package/dist/types/src/types.d.ts +0 -2
  54. package/dist/types/src/types.d.ts.map +0 -1
  55. package/dist/types/src/until.d.ts +0 -14
  56. package/dist/types/src/until.d.ts.map +0 -1
  57. package/dist/types/src/until.test.d.ts +0 -2
  58. package/dist/types/src/until.test.d.ts.map +0 -1
  59. package/src/latch.ts +0 -60
  60. package/src/sink.ts +0 -26
  61. package/src/throttle.test.ts +0 -65
  62. package/src/throttle.ts +0 -14
  63. package/src/types.ts +0 -5
  64. package/src/until.test.ts +0 -47
  65. package/src/until.ts +0 -58
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
 
3
3
  // src/callback.ts
4
- var createPromiseFromCallback = (run) => new Promise((resolve, reject) => {
4
+ var promiseFromCallback = (run) => new Promise((resolve, reject) => {
5
5
  run((error, value) => {
6
6
  if (error) {
7
7
  reject(error);
@@ -12,9 +12,9 @@ var createPromiseFromCallback = (run) => new Promise((resolve, reject) => {
12
12
  });
13
13
 
14
14
  // src/chain.ts
15
- var asyncChain = (chain) => async (elements) => {
15
+ var chain = (chain2) => async (elements) => {
16
16
  let result = await elements;
17
- for (const part of chain) {
17
+ for (const part of chain2) {
18
18
  result = await Promise.all(result.map(async (element) => await part(element)));
19
19
  }
20
20
  return result;
@@ -35,14 +35,12 @@ var interval = (cb, ms) => {
35
35
  const t = setInterval(cb, ms);
36
36
  return () => clearInterval(t);
37
37
  };
38
- function addEventListener(target, type, listener, options) {
38
+ var addEventListener = (target, type, listener, options) => {
39
39
  target.addEventListener(type, listener, options);
40
40
  return () => target.removeEventListener(type, listener, options);
41
- }
41
+ };
42
42
  var SubscriptionList = class {
43
- constructor() {
44
- this._cleanups = [];
45
- }
43
+ _cleanups = [];
46
44
  add(cb) {
47
45
  this._cleanups.push(cb);
48
46
  return this;
@@ -53,6 +51,7 @@ var SubscriptionList = class {
53
51
  }
54
52
  };
55
53
  var SubscriptionSet = class {
54
+ _cleanupMap;
56
55
  constructor(keyProjection) {
57
56
  this._cleanupMap = new ComplexMap(keyProjection);
58
57
  }
@@ -66,32 +65,56 @@ var SubscriptionSet = class {
66
65
  }
67
66
  };
68
67
 
69
- // src/throttle.ts
70
- var throttle = (cb, wait = 100) => {
71
- let lastCall = 0;
68
+ // src/debounce.ts
69
+ var delay = (cb, delay2 = 100) => {
70
+ let pending = false;
72
71
  return (...args) => {
73
- const now = Date.now();
74
- if (now - lastCall >= wait) {
75
- cb(...args);
76
- lastCall = now;
72
+ if (pending) {
73
+ return;
77
74
  }
75
+ pending = true;
76
+ setTimeout(() => {
77
+ try {
78
+ cb(...args);
79
+ } finally {
80
+ pending = false;
81
+ }
82
+ }, delay2);
78
83
  };
79
84
  };
80
-
81
- // src/debounce.ts
82
- var debounce = (cb, wait = 100) => {
85
+ var debounce = (cb, delay2 = 100) => {
83
86
  let t;
84
87
  return (...args) => {
85
88
  clearTimeout(t);
86
- t = setTimeout(() => cb(...args), wait);
89
+ t = setTimeout(() => cb(...args), delay2);
90
+ };
91
+ };
92
+ var throttle = (cb, delay2 = 100) => {
93
+ let lastCall = 0;
94
+ return (...args) => {
95
+ const now = Date.now();
96
+ if (now - lastCall >= delay2) {
97
+ cb(...args);
98
+ lastCall = now;
99
+ }
87
100
  };
88
101
  };
89
- var debounceAndThrottle = (cb, wait = 100) => {
90
- const debounced = debounce(cb, wait);
91
- const throttled = throttle(cb, wait);
102
+ var debounceAndThrottle = (cb, delay2 = 100) => {
103
+ let timeout2;
104
+ let lastCall = 0;
92
105
  return (...args) => {
93
- debounced(...args);
94
- 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
+ }
95
118
  };
96
119
  };
97
120
 
@@ -126,6 +149,23 @@ var sleep = (ms) => {
126
149
  sleeper();
127
150
  });
128
151
  };
152
+ var sleepWithContext = (ctx, ms) => {
153
+ const error = new ContextDisposedError();
154
+ return new Promise((resolve, reject) => {
155
+ if (ctx.disposed) {
156
+ reject(error);
157
+ return;
158
+ }
159
+ const timeout2 = setTimeout(() => {
160
+ clearDispose();
161
+ resolve();
162
+ }, ms);
163
+ const clearDispose = ctx.onDispose(() => {
164
+ clearTimeout(timeout2);
165
+ reject(error);
166
+ });
167
+ });
168
+ };
129
169
  var asyncReturn = () => sleep(0);
130
170
  var asyncTimeout = async (promise, timeout2, err) => {
131
171
  let timeoutId;
@@ -136,7 +176,7 @@ var asyncTimeout = async (promise, timeout2, err) => {
136
176
  }, timeout2);
137
177
  unrefTimeout(timeoutId);
138
178
  });
139
- const conditionTimeout = typeof promise === "function" ? createPromiseFromCallback(promise) : promise;
179
+ const conditionTimeout = typeof promise === "function" ? promiseFromCallback(promise) : promise;
140
180
  return await Promise.race([
141
181
  conditionTimeout,
142
182
  timeoutPromise
@@ -149,23 +189,6 @@ var unrefTimeout = (timeoutId) => {
149
189
  timeoutId.unref();
150
190
  }
151
191
  };
152
- var sleepWithContext = (ctx, ms) => {
153
- const error = new ContextDisposedError();
154
- return new Promise((resolve, reject) => {
155
- if (ctx.disposed) {
156
- reject(error);
157
- return;
158
- }
159
- const timeout2 = setTimeout(() => {
160
- clearDispose();
161
- resolve();
162
- }, ms);
163
- const clearDispose = ctx.onDispose(() => {
164
- clearTimeout(timeout2);
165
- reject(error);
166
- });
167
- });
168
- };
169
192
 
170
193
  // src/event-emitter.ts
171
194
  var onEvent = (eventEmitter, eventName, callback) => {
@@ -195,10 +218,6 @@ import { Context } from "@dxos/context";
195
218
  var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
196
219
  var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
197
220
  var Event = class _Event {
198
- constructor() {
199
- this._listeners = /* @__PURE__ */ new Set();
200
- this._effects = /* @__PURE__ */ new Set();
201
- }
202
221
  /**
203
222
  * Wrap objects that have on/off style event emitters.
204
223
  */
@@ -211,6 +230,8 @@ var Event = class _Event {
211
230
  });
212
231
  return event;
213
232
  }
233
+ _listeners = /* @__PURE__ */ new Set();
234
+ _effects = /* @__PURE__ */ new Set();
214
235
  /**
215
236
  * Emit an event.
216
237
  * In most cases should only be called by the class or entity containing the event.
@@ -454,11 +475,15 @@ var Event = class _Event {
454
475
  }
455
476
  };
456
477
  var EventListener = class {
478
+ ctx;
479
+ once;
480
+ weak;
481
+ callback;
482
+ _clearDispose = void 0;
457
483
  constructor(event, listener, ctx, once, weak) {
458
484
  this.ctx = ctx;
459
485
  this.once = once;
460
486
  this.weak = weak;
461
- this._clearDispose = void 0;
462
487
  this._clearDispose = ctx.onDispose(() => {
463
488
  event._removeListener(this);
464
489
  });
@@ -518,65 +543,13 @@ var weakListeners = () => {
518
543
  };
519
544
  };
520
545
 
521
- // src/latch.ts
522
- import { invariant } from "@dxos/invariant";
523
- var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/latch.ts";
524
- var latch = ({ count = 1, timeout: timeout2 } = {}) => {
525
- invariant(count >= 0, void 0, {
526
- F: __dxlog_file2,
527
- L: 19,
528
- S: void 0,
529
- A: [
530
- "count >= 0",
531
- ""
532
- ]
533
- });
534
- let t;
535
- let doResolve;
536
- let doReject;
537
- const promise = new Promise((resolve, reject) => {
538
- doResolve = (value) => {
539
- clearTimeout(t);
540
- resolve(value);
541
- };
542
- doReject = (err) => {
543
- clearTimeout(t);
544
- reject(err);
545
- };
546
- });
547
- if (count === 0) {
548
- setTimeout(() => {
549
- doResolve(0);
550
- });
551
- } else {
552
- if (timeout2) {
553
- t = setTimeout(() => {
554
- doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
555
- }, timeout2);
556
- }
557
- }
558
- let i = 0;
559
- return [
560
- async () => await promise,
561
- () => {
562
- if (++i === count) {
563
- doResolve(i);
564
- }
565
- return i;
566
- },
567
- (err) => doReject(err)
568
- ];
569
- };
570
-
571
546
  // src/mutex.ts
572
547
  import "@dxos/util";
573
548
  import { warnAfterTimeout } from "@dxos/debug";
574
549
  var Mutex = class {
575
- constructor() {
576
- this._queue = Promise.resolve();
577
- this._queueLength = 0;
578
- this._tag = null;
579
- }
550
+ _queue = Promise.resolve();
551
+ _queueLength = 0;
552
+ _tag = null;
580
553
  get tag() {
581
554
  return this._tag;
582
555
  }
@@ -622,6 +595,7 @@ var Mutex = class {
622
595
  }
623
596
  };
624
597
  var MutexGuard = class {
598
+ _release;
625
599
  constructor(_release) {
626
600
  this._release = _release;
627
601
  }
@@ -665,6 +639,8 @@ import Observable from "zen-observable";
665
639
  import PushStream from "zen-push";
666
640
 
667
641
  // src/trigger.ts
642
+ import { invariant } from "@dxos/invariant";
643
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/trigger.ts";
668
644
  var trigger = (timeout2) => {
669
645
  let callback;
670
646
  const promise = new Promise((resolve, reject) => {
@@ -680,18 +656,22 @@ var trigger = (timeout2) => {
680
656
  resolver
681
657
  ];
682
658
  };
683
- var TriggerState = /* @__PURE__ */ function(TriggerState2) {
659
+ var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
684
660
  TriggerState2["WAITING"] = "WAITING";
685
661
  TriggerState2["RESOLVED"] = "RESOLVED";
686
662
  TriggerState2["REJECTED"] = "REJECTED";
687
663
  return TriggerState2;
688
- }({});
664
+ })({});
689
665
  var Trigger = class {
666
+ _options;
667
+ _promise;
668
+ _resolve;
669
+ _reject;
670
+ _state = "WAITING";
690
671
  constructor(_options = {
691
672
  autoReset: false
692
673
  }) {
693
674
  this._options = _options;
694
- this._state = "WAITING";
695
675
  this.reset();
696
676
  }
697
677
  get state() {
@@ -751,23 +731,61 @@ var Trigger = class {
751
731
  return this;
752
732
  }
753
733
  };
734
+ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
735
+ invariant(count >= 0, void 0, {
736
+ F: __dxlog_file2,
737
+ L: 139,
738
+ S: void 0,
739
+ A: [
740
+ "count >= 0",
741
+ ""
742
+ ]
743
+ });
744
+ let t;
745
+ let doResolve;
746
+ let doReject;
747
+ const promise = new Promise((resolve, reject) => {
748
+ doResolve = (value) => {
749
+ clearTimeout(t);
750
+ resolve(value);
751
+ };
752
+ doReject = (err) => {
753
+ clearTimeout(t);
754
+ reject(err);
755
+ };
756
+ });
757
+ if (count === 0) {
758
+ setTimeout(() => {
759
+ doResolve(0);
760
+ });
761
+ } else {
762
+ if (timeout2) {
763
+ t = setTimeout(() => {
764
+ doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
765
+ }, timeout2);
766
+ }
767
+ }
768
+ let i = 0;
769
+ return [
770
+ async () => await promise,
771
+ () => {
772
+ if (++i === count) {
773
+ doResolve(i);
774
+ }
775
+ return i;
776
+ },
777
+ (err) => doReject(err)
778
+ ];
779
+ };
754
780
 
755
781
  // src/observable.ts
756
782
  var MulticastObservable = class _MulticastObservable extends Observable {
783
+ _value;
784
+ _observers = /* @__PURE__ */ new Set();
785
+ _observable;
786
+ _completed = new Trigger();
757
787
  constructor(subscriber, _value) {
758
- super((observer) => this._subscribe(observer)), this._value = _value, this._observers = /* @__PURE__ */ new Set(), this._completed = new Trigger(), this._handlers = {
759
- next: (value) => {
760
- this._value = value;
761
- this._observers.forEach((observer) => observer.next?.(value));
762
- },
763
- error: (err) => {
764
- this._observers.forEach((observer) => observer.error?.(err));
765
- },
766
- complete: () => {
767
- this._completed.wake();
768
- this._observers.forEach((observer) => observer.complete?.());
769
- }
770
- };
788
+ super((observer) => this._subscribe(observer)), this._value = _value;
771
789
  this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
772
790
  this._observable.subscribe(this._handlers);
773
791
  }
@@ -851,18 +869,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
851
869
  this._observers.delete(observer);
852
870
  };
853
871
  }
872
+ _handlers = {
873
+ next: (value) => {
874
+ this._value = value;
875
+ this._observers.forEach((observer) => observer.next?.(value));
876
+ },
877
+ error: (err) => {
878
+ this._observers.forEach((observer) => observer.error?.(err));
879
+ },
880
+ complete: () => {
881
+ this._completed.wake();
882
+ this._observers.forEach((observer) => observer.complete?.());
883
+ }
884
+ };
854
885
  };
855
886
  var EMPTY_OBSERVABLE = MulticastObservable.of(null);
856
887
 
857
888
  // src/observable-value.ts
858
889
  import { createSetDispatch } from "@dxos/util";
859
890
  var ObservableProvider = class {
860
- constructor() {
861
- this._handlers = /* @__PURE__ */ new Set();
862
- this._proxy = createSetDispatch({
863
- handlers: this._handlers
864
- });
865
- }
891
+ _handlers = /* @__PURE__ */ new Set();
892
+ _proxy = createSetDispatch({
893
+ handlers: this._handlers
894
+ });
895
+ _value;
866
896
  /**
867
897
  * Proxy used to dispatch callbacks to each subscription.
868
898
  */
@@ -883,8 +913,10 @@ var ObservableProvider = class {
883
913
  }
884
914
  };
885
915
  var CancellableObservableProvider = class extends ObservableProvider {
916
+ _handleCancel;
917
+ _cancelled = false;
886
918
  constructor(_handleCancel) {
887
- super(), this._handleCancel = _handleCancel, this._cancelled = false;
919
+ super(), this._handleCancel = _handleCancel;
888
920
  }
889
921
  get cancelled() {
890
922
  return this._cancelled;
@@ -994,12 +1026,14 @@ if (enabled) {
994
1026
 
995
1027
  // src/task-scheduling.ts
996
1028
  var DeferredTask = class {
1029
+ _ctx;
1030
+ _callback;
1031
+ _scheduled = false;
1032
+ _currentTask = null;
1033
+ _nextTask = new Trigger();
997
1034
  constructor(_ctx, _callback) {
998
1035
  this._ctx = _ctx;
999
1036
  this._callback = _callback;
1000
- this._scheduled = false;
1001
- this._currentTask = null;
1002
- this._nextTask = new Trigger();
1003
1037
  }
1004
1038
  get scheduled() {
1005
1039
  return this._scheduled;
@@ -1040,6 +1074,78 @@ var DeferredTask = class {
1040
1074
  await this._currentTask;
1041
1075
  }
1042
1076
  };
1077
+ var AsyncTask = class {
1078
+ #callback;
1079
+ #ctx = void 0;
1080
+ #scheduled = false;
1081
+ #currentTask = null;
1082
+ #nextTask = new Trigger();
1083
+ constructor(callback) {
1084
+ this.#callback = callback;
1085
+ }
1086
+ get scheduled() {
1087
+ return this.#scheduled;
1088
+ }
1089
+ /**
1090
+ * Context of the resource that owns the task.
1091
+ * When the context is disposed, the task is cancelled and cannot be scheduled again.
1092
+ */
1093
+ // TODO(dmaretskyi): We don't really need to pass ctx in here, since close will also signal dispose.
1094
+ open(ctx) {
1095
+ this.#ctx = ctx;
1096
+ }
1097
+ /**
1098
+ * Closes the task and waits for it to finish if it is running.
1099
+ */
1100
+ async close() {
1101
+ this.#ctx = void 0;
1102
+ await this.join();
1103
+ }
1104
+ [Symbol.asyncDispose]() {
1105
+ return this.close();
1106
+ }
1107
+ /**
1108
+ * Schedule the task to run asynchronously.
1109
+ */
1110
+ schedule() {
1111
+ if (!this.#ctx || this.#ctx.disposed) {
1112
+ throw new Error("AsyncTask not open");
1113
+ }
1114
+ if (this.#scheduled) {
1115
+ return;
1116
+ }
1117
+ scheduleTask(this.#ctx, async () => {
1118
+ await this.#currentTask;
1119
+ if (!this.#ctx || this.#ctx.disposed) {
1120
+ return;
1121
+ }
1122
+ this.#scheduled = false;
1123
+ const completionTrigger = this.#nextTask;
1124
+ this.#nextTask = new Trigger();
1125
+ this.#currentTask = runInContextAsync(this.#ctx, () => this.#callback()).then(() => {
1126
+ completionTrigger.wake();
1127
+ });
1128
+ });
1129
+ this.#scheduled = true;
1130
+ }
1131
+ /**
1132
+ * Schedule the task to run and wait for it to finish.
1133
+ */
1134
+ async runBlocking() {
1135
+ if (this.#ctx?.disposed) {
1136
+ throw new ContextDisposedError2();
1137
+ }
1138
+ this.schedule();
1139
+ await this.#nextTask.wait();
1140
+ }
1141
+ /**
1142
+ * Waits for the current task to finish if it is running.
1143
+ * Does not schedule a new task.
1144
+ */
1145
+ async join() {
1146
+ await this.#currentTask;
1147
+ }
1148
+ };
1043
1149
  var runInContext = (ctx, fn) => {
1044
1150
  try {
1045
1151
  fn();
@@ -1129,11 +1235,15 @@ var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecyc
1129
1235
  var INIT_RESTART_DELAY = 100;
1130
1236
  var DEFAULT_MAX_RESTART_DELAY = 5e3;
1131
1237
  var PersistentLifecycle = class extends Resource {
1238
+ _start;
1239
+ _stop;
1240
+ _onRestart;
1241
+ _maxRestartDelay;
1242
+ _currentState = void 0;
1243
+ _restartTask = void 0;
1244
+ _restartAfter = 0;
1132
1245
  constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
1133
1246
  super();
1134
- this._currentState = void 0;
1135
- this._restartTask = void 0;
1136
- this._restartAfter = 0;
1137
1247
  this._start = start;
1138
1248
  this._stop = stop;
1139
1249
  this._onRestart = onRestart;
@@ -1295,20 +1405,6 @@ var makePushIterable = () => {
1295
1405
  };
1296
1406
  };
1297
1407
 
1298
- // src/sink.ts
1299
- var sink = (emitter, event, count = 1) => {
1300
- const [getPromise, resolve] = trigger();
1301
- let counter = 0;
1302
- const listener = () => {
1303
- if (++counter === count) {
1304
- emitter.off(event, listener);
1305
- resolve();
1306
- }
1307
- };
1308
- emitter.on(event, listener);
1309
- return getPromise();
1310
- };
1311
-
1312
1408
  // src/stream-to-array.ts
1313
1409
  var streamToArray = (stream) => {
1314
1410
  let deferred;
@@ -1354,11 +1450,6 @@ var streamToArray = (stream) => {
1354
1450
  // src/test-stream.ts
1355
1451
  import { Duplex } from "node:stream";
1356
1452
  var TestStream = class extends Duplex {
1357
- constructor() {
1358
- super(...arguments);
1359
- this._received = Buffer.alloc(0);
1360
- this._onWrite = new Event();
1361
- }
1362
1453
  static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1363
1454
  stream1.push("ping");
1364
1455
  stream2.push("pong");
@@ -1371,6 +1462,8 @@ var TestStream = class extends Duplex {
1371
1462
  })
1372
1463
  ]);
1373
1464
  }
1465
+ _received = Buffer.alloc(0);
1466
+ _onWrite = new Event();
1374
1467
  _write(chunk, encoding, callback) {
1375
1468
  this._received = Buffer.concat([
1376
1469
  this._received,
@@ -1412,13 +1505,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
1412
1505
  timeout: timeout2
1413
1506
  });
1414
1507
  };
1508
+ var until = (cb, timeout2) => {
1509
+ return new Promise((resolve, reject) => {
1510
+ const t = timeout2 && setTimeout(() => {
1511
+ reject(new Error(`Timeout after ${t}ms`));
1512
+ }, timeout2);
1513
+ setTimeout(async () => {
1514
+ try {
1515
+ await cb((value) => {
1516
+ t && clearTimeout(t);
1517
+ resolve(value);
1518
+ }, (error) => {
1519
+ t && clearTimeout(t);
1520
+ reject(error);
1521
+ });
1522
+ } catch (err) {
1523
+ reject(err);
1524
+ }
1525
+ });
1526
+ });
1527
+ };
1528
+ var untilPromise = (cb) => cb();
1529
+ var untilError = (cb) => {
1530
+ return new Promise((resolve, reject) => {
1531
+ setTimeout(async () => {
1532
+ try {
1533
+ await cb();
1534
+ reject(new Error("No error was thrown."));
1535
+ } catch (err) {
1536
+ resolve(err);
1537
+ }
1538
+ });
1539
+ });
1540
+ };
1415
1541
 
1416
1542
  // src/timer.ts
1417
1543
  var Timer = class {
1544
+ _callback;
1545
+ _state = new Event();
1546
+ _timer;
1547
+ _count = 0;
1418
1548
  constructor(_callback) {
1419
1549
  this._callback = _callback;
1420
- this._state = new Event();
1421
- this._count = 0;
1422
1550
  }
1423
1551
  get state() {
1424
1552
  return this._state;
@@ -1461,51 +1589,23 @@ var Timer = class {
1461
1589
  }
1462
1590
  };
1463
1591
 
1464
- // src/until.ts
1465
- var until = (cb, timeout2) => {
1466
- return new Promise((resolve, reject) => {
1467
- const t = timeout2 && setTimeout(() => {
1468
- reject(new Error(`Timeout after ${t}ms`));
1469
- }, timeout2);
1470
- setTimeout(async () => {
1471
- try {
1472
- await cb((value) => {
1473
- t && clearTimeout(t);
1474
- resolve(value);
1475
- }, (error) => {
1476
- t && clearTimeout(t);
1477
- reject(error);
1478
- });
1479
- } catch (err) {
1480
- reject(err);
1481
- }
1482
- });
1483
- });
1484
- };
1485
- var untilPromise = (cb) => cb();
1486
- var untilError = (cb) => {
1487
- return new Promise((resolve, reject) => {
1488
- setTimeout(async () => {
1489
- try {
1490
- await cb();
1491
- reject(new Error("No error was thrown."));
1492
- } catch (err) {
1493
- resolve(err);
1494
- }
1495
- });
1496
- });
1497
- };
1498
-
1499
1592
  // src/update-scheduler.ts
1500
1593
  var TIME_PERIOD = 1e3;
1501
1594
  var UpdateScheduler = class {
1595
+ _ctx;
1596
+ _callback;
1597
+ _params;
1598
+ /**
1599
+ * Promise that resolves when the callback is done.
1600
+ * Never rejects.
1601
+ */
1602
+ _promise = null;
1603
+ _scheduled = false;
1604
+ _lastUpdateTime = -TIME_PERIOD;
1502
1605
  constructor(_ctx, _callback, _params = {}) {
1503
1606
  this._ctx = _ctx;
1504
1607
  this._callback = _callback;
1505
1608
  this._params = _params;
1506
- this._promise = null;
1507
- this._scheduled = false;
1508
- this._lastUpdateTime = -TIME_PERIOD;
1509
1609
  _ctx.onDispose(async () => {
1510
1610
  await this._promise;
1511
1611
  });
@@ -1518,13 +1618,13 @@ var UpdateScheduler = class {
1518
1618
  await this._promise;
1519
1619
  if (this._params.maxFrequency) {
1520
1620
  const now = performance.now();
1521
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1522
- if (delay > 0) {
1621
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1622
+ if (delay2 > 0) {
1523
1623
  await new Promise((resolve) => {
1524
1624
  const timeoutId = setTimeout(() => {
1525
1625
  clearContext();
1526
1626
  resolve();
1527
- }, delay);
1627
+ }, delay2);
1528
1628
  const clearContext = this._ctx.onDispose(() => {
1529
1629
  clearTimeout(timeoutId);
1530
1630
  resolve();
@@ -1568,6 +1668,7 @@ var UpdateScheduler = class {
1568
1668
  }
1569
1669
  };
1570
1670
  export {
1671
+ AsyncTask,
1571
1672
  CancellableObservableProvider,
1572
1673
  DeferredTask,
1573
1674
  Event,
@@ -1588,26 +1689,26 @@ export {
1588
1689
  UpdateScheduler,
1589
1690
  addEventListener,
1590
1691
  addListener,
1591
- asyncChain,
1592
1692
  asyncReturn,
1593
1693
  asyncTimeout,
1694
+ chain,
1594
1695
  combine,
1595
- createPromiseFromCallback,
1596
1696
  debounce,
1597
1697
  debounceAndThrottle,
1698
+ delay,
1598
1699
  dumpLeaks,
1599
1700
  interval,
1600
1701
  latch,
1601
1702
  makePushIterable,
1602
1703
  observableError,
1603
1704
  onEvent,
1705
+ promiseFromCallback,
1604
1706
  runInContext,
1605
1707
  runInContextAsync,
1606
1708
  scheduleExponentialBackoffTaskInterval,
1607
1709
  scheduleMicroTask,
1608
1710
  scheduleTask,
1609
1711
  scheduleTaskInterval,
1610
- sink,
1611
1712
  sleep,
1612
1713
  sleepWithContext,
1613
1714
  streamToArray,