@dxos/async 0.8.4-main.f9ba587 → 0.8.4-main.fbb7a13

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