@dxos/async 0.8.4-main.b97322e → 0.8.4-main.bc2380dfbc

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 (42) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/index.mjs +212 -148
  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 +212 -148
  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 +14 -13
  35. package/src/cleanup.ts +7 -4
  36. package/src/debounce.ts +69 -16
  37. package/src/observable-value.ts +4 -2
  38. package/src/persistent-lifecycle.test.ts +1 -1
  39. package/src/persistent-lifecycle.ts +10 -2
  40. package/src/task-scheduling.ts +95 -1
  41. package/src/testing.test.ts +1 -1
  42. package/src/timeout.ts +6 -9
@@ -24,7 +24,7 @@ var chain = (chain2) => async (elements) => {
24
24
  import { ComplexMap } from "@dxos/util";
25
25
  var combine = (...cleanupFns) => {
26
26
  return () => {
27
- cleanupFns.flat().forEach((cleanupFn) => cleanupFn());
27
+ cleanupFns.flat().filter((f) => typeof f === "function").forEach((cleanupFn) => cleanupFn());
28
28
  };
29
29
  };
30
30
  var timeout = (cb, ms = 0) => {
@@ -40,11 +40,9 @@ var addEventListener = (target, type, listener, options) => {
40
40
  return () => target.removeEventListener(type, listener, options);
41
41
  };
42
42
  var SubscriptionList = class {
43
- constructor() {
44
- this._cleanups = [];
45
- }
46
- add(cb) {
47
- this._cleanups.push(cb);
43
+ _cleanups = [];
44
+ add(...cb) {
45
+ this._cleanups.push(...cb);
48
46
  return this;
49
47
  }
50
48
  clear() {
@@ -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
  }
@@ -67,29 +66,55 @@ var SubscriptionSet = class {
67
66
  };
68
67
 
69
68
  // src/debounce.ts
70
- 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) => {
71
86
  let t;
72
87
  return (...args) => {
73
88
  clearTimeout(t);
74
- t = setTimeout(() => cb(...args), delay);
89
+ t = setTimeout(() => cb(...args), delay2);
75
90
  };
76
91
  };
77
- var throttle = (cb, delay = 100) => {
92
+ var throttle = (cb, delay2 = 100) => {
78
93
  let lastCall = 0;
79
94
  return (...args) => {
80
95
  const now = Date.now();
81
- if (now - lastCall >= delay) {
96
+ if (now - lastCall >= delay2) {
82
97
  cb(...args);
83
98
  lastCall = now;
84
99
  }
85
100
  };
86
101
  };
87
- var debounceAndThrottle = (cb, delay = 100) => {
88
- const debounced = debounce(cb, delay);
89
- const throttled = throttle(cb, delay);
102
+ var debounceAndThrottle = (cb, delay2 = 100) => {
103
+ let timeout2;
104
+ let lastCall = 0;
90
105
  return (...args) => {
91
- debounced(...args);
92
- 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
+ }
93
118
  };
94
119
  };
95
120
 
@@ -143,6 +168,9 @@ var sleepWithContext = (ctx, ms) => {
143
168
  };
144
169
  var asyncReturn = () => sleep(0);
145
170
  var asyncTimeout = async (promise, timeout2, err) => {
171
+ if (typeof promise === "function") {
172
+ throw new Error("First argument must be a promise.");
173
+ }
146
174
  let timeoutId;
147
175
  const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
148
176
  const timeoutPromise = new Promise((resolve, reject) => {
@@ -151,9 +179,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
151
179
  }, timeout2);
152
180
  unrefTimeout(timeoutId);
153
181
  });
154
- const conditionTimeout = typeof promise === "function" ? promiseFromCallback(promise) : promise;
155
182
  return await Promise.race([
156
- conditionTimeout,
183
+ promise,
157
184
  timeoutPromise
158
185
  ]).finally(() => {
159
186
  clearTimeout(timeoutId);
@@ -190,13 +217,8 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
190
217
 
191
218
  // src/events.ts
192
219
  import { Context } from "@dxos/context";
193
- var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
194
220
  var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
195
221
  var Event = class _Event {
196
- constructor() {
197
- this._listeners = /* @__PURE__ */ new Set();
198
- this._effects = /* @__PURE__ */ new Set();
199
- }
200
222
  /**
201
223
  * Wrap objects that have on/off style event emitters.
202
224
  */
@@ -209,6 +231,8 @@ var Event = class _Event {
209
231
  });
210
232
  return event;
211
233
  }
234
+ _listeners = /* @__PURE__ */ new Set();
235
+ _effects = /* @__PURE__ */ new Set();
212
236
  /**
213
237
  * Emit an event.
214
238
  * In most cases should only be called by the class or entity containing the event.
@@ -247,10 +271,7 @@ var Event = class _Event {
247
271
  _ctx,
248
272
  _callback
249
273
  ] : [
250
- new Context(void 0, {
251
- F: __dxlog_file,
252
- L: 132
253
- }),
274
+ new Context(),
254
275
  _ctx
255
276
  ];
256
277
  const weak = !!options?.weak;
@@ -280,10 +301,7 @@ var Event = class _Event {
280
301
  _ctx,
281
302
  _callback
282
303
  ] : [
283
- new Context(void 0, {
284
- F: __dxlog_file,
285
- L: 169
286
- }),
304
+ new Context(),
287
305
  _ctx
288
306
  ];
289
307
  const listener = new EventListener(this, callback, ctx, true, false);
@@ -452,11 +470,15 @@ var Event = class _Event {
452
470
  }
453
471
  };
454
472
  var EventListener = class {
473
+ ctx;
474
+ once;
475
+ weak;
476
+ callback;
477
+ _clearDispose = void 0;
455
478
  constructor(event, listener, ctx, once, weak) {
456
479
  this.ctx = ctx;
457
480
  this.once = once;
458
481
  this.weak = weak;
459
- this._clearDispose = void 0;
460
482
  this._clearDispose = ctx.onDispose(() => {
461
483
  event._removeListener(this);
462
484
  });
@@ -520,11 +542,9 @@ var weakListeners = () => {
520
542
  import "@dxos/util";
521
543
  import { warnAfterTimeout } from "@dxos/debug";
522
544
  var Mutex = class {
523
- constructor() {
524
- this._queue = Promise.resolve();
525
- this._queueLength = 0;
526
- this._tag = null;
527
- }
545
+ _queue = Promise.resolve();
546
+ _queueLength = 0;
547
+ _tag = null;
528
548
  get tag() {
529
549
  return this._tag;
530
550
  }
@@ -570,6 +590,7 @@ var Mutex = class {
570
590
  }
571
591
  };
572
592
  var MutexGuard = class {
593
+ _release;
573
594
  constructor(_release) {
574
595
  this._release = _release;
575
596
  }
@@ -583,7 +604,7 @@ var MutexGuard = class {
583
604
  this.release();
584
605
  }
585
606
  };
586
- var classMutexSymbol = Symbol("class-mutex");
607
+ var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
587
608
  var FORCE_DISABLE_WARNING = false;
588
609
  var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
589
610
  var synchronized = (target, propertyName, descriptor) => {
@@ -614,7 +635,6 @@ import PushStream from "zen-push";
614
635
 
615
636
  // src/trigger.ts
616
637
  import { invariant } from "@dxos/invariant";
617
- var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/trigger.ts";
618
638
  var trigger = (timeout2) => {
619
639
  let callback;
620
640
  const promise = new Promise((resolve, reject) => {
@@ -630,18 +650,22 @@ var trigger = (timeout2) => {
630
650
  resolver
631
651
  ];
632
652
  };
633
- var TriggerState = /* @__PURE__ */ function(TriggerState2) {
653
+ var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
634
654
  TriggerState2["WAITING"] = "WAITING";
635
655
  TriggerState2["RESOLVED"] = "RESOLVED";
636
656
  TriggerState2["REJECTED"] = "REJECTED";
637
657
  return TriggerState2;
638
- }({});
658
+ })({});
639
659
  var Trigger = class {
660
+ _options;
661
+ _promise;
662
+ _resolve;
663
+ _reject;
664
+ _state = "WAITING";
640
665
  constructor(_options = {
641
666
  autoReset: false
642
667
  }) {
643
668
  this._options = _options;
644
- this._state = "WAITING";
645
669
  this.reset();
646
670
  }
647
671
  get state() {
@@ -702,15 +726,7 @@ var Trigger = class {
702
726
  }
703
727
  };
704
728
  var latch = ({ count = 1, timeout: timeout2 } = {}) => {
705
- invariant(count >= 0, void 0, {
706
- F: __dxlog_file2,
707
- L: 139,
708
- S: void 0,
709
- A: [
710
- "count >= 0",
711
- ""
712
- ]
713
- });
729
+ invariant(count >= 0);
714
730
  let t;
715
731
  let doResolve;
716
732
  let doReject;
@@ -750,20 +766,12 @@ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
750
766
 
751
767
  // src/observable.ts
752
768
  var MulticastObservable = class _MulticastObservable extends Observable {
769
+ _value;
770
+ _observers = /* @__PURE__ */ new Set();
771
+ _observable;
772
+ _completed = new Trigger();
753
773
  constructor(subscriber, _value) {
754
- super((observer) => this._subscribe(observer)), this._value = _value, this._observers = /* @__PURE__ */ new Set(), this._completed = new Trigger(), this._handlers = {
755
- next: (value) => {
756
- this._value = value;
757
- this._observers.forEach((observer) => observer.next?.(value));
758
- },
759
- error: (err) => {
760
- this._observers.forEach((observer) => observer.error?.(err));
761
- },
762
- complete: () => {
763
- this._completed.wake();
764
- this._observers.forEach((observer) => observer.complete?.());
765
- }
766
- };
774
+ super((observer) => this._subscribe(observer)), this._value = _value;
767
775
  this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
768
776
  this._observable.subscribe(this._handlers);
769
777
  }
@@ -847,18 +855,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
847
855
  this._observers.delete(observer);
848
856
  };
849
857
  }
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
+ };
850
871
  };
851
872
  var EMPTY_OBSERVABLE = MulticastObservable.of(null);
852
873
 
853
874
  // src/observable-value.ts
854
875
  import { createSetDispatch } from "@dxos/util";
855
876
  var ObservableProvider = class {
856
- constructor() {
857
- this._handlers = /* @__PURE__ */ new Set();
858
- this._proxy = createSetDispatch({
859
- handlers: this._handlers
860
- });
861
- }
877
+ _handlers = /* @__PURE__ */ new Set();
878
+ _proxy = createSetDispatch({
879
+ handlers: this._handlers
880
+ });
881
+ _value;
862
882
  /**
863
883
  * Proxy used to dispatch callbacks to each subscription.
864
884
  */
@@ -879,8 +899,10 @@ var ObservableProvider = class {
879
899
  }
880
900
  };
881
901
  var CancellableObservableProvider = class extends ObservableProvider {
902
+ _handleCancel;
903
+ _cancelled = false;
882
904
  constructor(_handleCancel) {
883
- super(), this._handleCancel = _handleCancel, this._cancelled = false;
905
+ super(), this._handleCancel = _handleCancel;
884
906
  }
885
907
  get cancelled() {
886
908
  return this._cancelled;
@@ -901,16 +923,15 @@ import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
901
923
  import { log as log2 } from "@dxos/log";
902
924
 
903
925
  // src/task-scheduling.ts
904
- import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
926
+ import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
905
927
  import { StackTrace as StackTrace2 } from "@dxos/debug";
906
928
 
907
929
  // src/track-leaks.ts
908
930
  import { StackTrace } from "@dxos/debug";
909
931
  import { log } from "@dxos/log";
910
- var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
911
932
  var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
912
933
  var openResources = /* @__PURE__ */ new Set();
913
- var handleSymbol = Symbol("checkLeaksHandle");
934
+ var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
914
935
  var trackResource = (resourceProvider) => {
915
936
  if (!enabled) {
916
937
  return () => {
@@ -957,31 +978,11 @@ var dumpLeaks = () => {
957
978
  if (!enabled) {
958
979
  return;
959
980
  }
960
- log.info(`Leaked resources ${openResources.size}:`, void 0, {
961
- F: __dxlog_file3,
962
- L: 82,
963
- S: void 0,
964
- C: (f, a) => f(...a)
965
- });
981
+ log.info(`Leaked resources ${openResources.size}:`);
966
982
  for (const resource of openResources) {
967
- log.info(`- ${resource.name} at`, void 0, {
968
- F: __dxlog_file3,
969
- L: 84,
970
- S: void 0,
971
- C: (f, a) => f(...a)
972
- });
973
- log.info(resource.openStack.getStack(1), void 0, {
974
- F: __dxlog_file3,
975
- L: 85,
976
- S: void 0,
977
- C: (f, a) => f(...a)
978
- });
979
- log.info("\n", void 0, {
980
- F: __dxlog_file3,
981
- L: 86,
982
- S: void 0,
983
- C: (f, a) => f(...a)
984
- });
983
+ log.info(`- ${resource.name} at`);
984
+ log.info(resource.openStack.getStack(1));
985
+ log.info("\n");
985
986
  }
986
987
  };
987
988
  if (enabled) {
@@ -990,12 +991,14 @@ if (enabled) {
990
991
 
991
992
  // src/task-scheduling.ts
992
993
  var DeferredTask = class {
994
+ _ctx;
995
+ _callback;
996
+ _scheduled = false;
997
+ _currentTask = null;
998
+ _nextTask = new Trigger();
993
999
  constructor(_ctx, _callback) {
994
1000
  this._ctx = _ctx;
995
1001
  this._callback = _callback;
996
- this._scheduled = false;
997
- this._currentTask = null;
998
- this._nextTask = new Trigger();
999
1002
  }
1000
1003
  get scheduled() {
1001
1004
  return this._scheduled;
@@ -1036,6 +1039,79 @@ var DeferredTask = class {
1036
1039
  await this._currentTask;
1037
1040
  }
1038
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;
1113
+ }
1114
+ };
1039
1115
  var runInContext = (ctx, fn) => {
1040
1116
  try {
1041
1117
  fn();
@@ -1121,15 +1197,18 @@ function _ts_decorate(decorators, target, key, desc) {
1121
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;
1122
1198
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1123
1199
  }
1124
- var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
1125
1200
  var INIT_RESTART_DELAY = 100;
1126
1201
  var DEFAULT_MAX_RESTART_DELAY = 5e3;
1127
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;
1128
1210
  constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
1129
1211
  super();
1130
- this._currentState = void 0;
1131
- this._restartTask = void 0;
1132
- this._restartAfter = 0;
1133
1212
  this._start = start;
1134
1213
  this._stop = stop;
1135
1214
  this._onRestart = onRestart;
@@ -1143,25 +1222,21 @@ var PersistentLifecycle = class extends Resource {
1143
1222
  try {
1144
1223
  await this._restart();
1145
1224
  } catch (err) {
1225
+ if (this._ctx?.disposed) {
1226
+ return;
1227
+ }
1146
1228
  log2.warn("Restart failed", {
1147
1229
  err
1148
- }, {
1149
- F: __dxlog_file4,
1150
- L: 72,
1151
- S: this,
1152
- C: (f, a) => f(...a)
1153
1230
  });
1154
1231
  this._restartTask?.schedule();
1155
1232
  }
1156
1233
  });
1157
1234
  this._currentState = await this._start().catch((err) => {
1235
+ if (this._ctx?.disposed) {
1236
+ return void 0;
1237
+ }
1158
1238
  log2.warn("Start failed", {
1159
1239
  err
1160
- }, {
1161
- F: __dxlog_file4,
1162
- L: 78,
1163
- S: this,
1164
- C: (f, a) => f(...a)
1165
1240
  });
1166
1241
  this._restartTask?.schedule();
1167
1242
  return void 0;
@@ -1175,11 +1250,6 @@ var PersistentLifecycle = class extends Resource {
1175
1250
  async _restart() {
1176
1251
  log2(`restarting in ${this._restartAfter}ms`, {
1177
1252
  state: this._lifecycleState
1178
- }, {
1179
- F: __dxlog_file4,
1180
- L: 91,
1181
- S: this,
1182
- C: (f, a) => f(...a)
1183
1253
  });
1184
1254
  await this._stopCurrentState();
1185
1255
  if (this._lifecycleState !== LifecycleState.OPEN) {
@@ -1198,12 +1268,7 @@ var PersistentLifecycle = class extends Resource {
1198
1268
  try {
1199
1269
  await this._stop(this._currentState);
1200
1270
  } catch (err) {
1201
- log2.catch(err, void 0, {
1202
- F: __dxlog_file4,
1203
- L: 113,
1204
- S: this,
1205
- C: (f, a) => f(...a)
1206
- });
1271
+ log2.catch(err);
1207
1272
  }
1208
1273
  this._currentState = void 0;
1209
1274
  }
@@ -1227,7 +1292,6 @@ _ts_decorate([
1227
1292
 
1228
1293
  // src/push-iterable.ts
1229
1294
  import { invariant as invariant2 } from "@dxos/invariant";
1230
- var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
1231
1295
  var makePushIterable = () => {
1232
1296
  const buf = [];
1233
1297
  const trigger2 = new Trigger({
@@ -1241,15 +1305,7 @@ var makePushIterable = () => {
1241
1305
  await trigger2.wait();
1242
1306
  }
1243
1307
  const item = buf.shift();
1244
- invariant2(item, void 0, {
1245
- F: __dxlog_file5,
1246
- L: 42,
1247
- S: this,
1248
- A: [
1249
- "item",
1250
- ""
1251
- ]
1252
- });
1308
+ invariant2(item);
1253
1309
  switch (item.kind) {
1254
1310
  case "next":
1255
1311
  return {
@@ -1336,11 +1392,6 @@ var streamToArray = (stream) => {
1336
1392
  // src/test-stream.ts
1337
1393
  import { Duplex } from "node:stream";
1338
1394
  var TestStream = class extends Duplex {
1339
- constructor() {
1340
- super(...arguments);
1341
- this._received = Buffer.alloc(0);
1342
- this._onWrite = new Event();
1343
- }
1344
1395
  static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
1345
1396
  stream1.push("ping");
1346
1397
  stream2.push("pong");
@@ -1353,6 +1404,8 @@ var TestStream = class extends Duplex {
1353
1404
  })
1354
1405
  ]);
1355
1406
  }
1407
+ _received = Buffer.alloc(0);
1408
+ _onWrite = new Event();
1356
1409
  _write(chunk, encoding, callback) {
1357
1410
  this._received = Buffer.concat([
1358
1411
  this._received,
@@ -1430,10 +1483,12 @@ var untilError = (cb) => {
1430
1483
 
1431
1484
  // src/timer.ts
1432
1485
  var Timer = class {
1486
+ _callback;
1487
+ _state = new Event();
1488
+ _timer;
1489
+ _count = 0;
1433
1490
  constructor(_callback) {
1434
1491
  this._callback = _callback;
1435
- this._state = new Event();
1436
- this._count = 0;
1437
1492
  }
1438
1493
  get state() {
1439
1494
  return this._state;
@@ -1479,13 +1534,20 @@ var Timer = class {
1479
1534
  // src/update-scheduler.ts
1480
1535
  var TIME_PERIOD = 1e3;
1481
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;
1482
1547
  constructor(_ctx, _callback, _params = {}) {
1483
1548
  this._ctx = _ctx;
1484
1549
  this._callback = _callback;
1485
1550
  this._params = _params;
1486
- this._promise = null;
1487
- this._scheduled = false;
1488
- this._lastUpdateTime = -TIME_PERIOD;
1489
1551
  _ctx.onDispose(async () => {
1490
1552
  await this._promise;
1491
1553
  });
@@ -1498,13 +1560,13 @@ var UpdateScheduler = class {
1498
1560
  await this._promise;
1499
1561
  if (this._params.maxFrequency) {
1500
1562
  const now = performance.now();
1501
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1502
- if (delay > 0) {
1563
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1564
+ if (delay2 > 0) {
1503
1565
  await new Promise((resolve) => {
1504
1566
  const timeoutId = setTimeout(() => {
1505
1567
  clearContext();
1506
1568
  resolve();
1507
- }, delay);
1569
+ }, delay2);
1508
1570
  const clearContext = this._ctx.onDispose(() => {
1509
1571
  clearTimeout(timeoutId);
1510
1572
  resolve();
@@ -1548,6 +1610,7 @@ var UpdateScheduler = class {
1548
1610
  }
1549
1611
  };
1550
1612
  export {
1613
+ AsyncTask,
1551
1614
  CancellableObservableProvider,
1552
1615
  DeferredTask,
1553
1616
  Event,
@@ -1574,6 +1637,7 @@ export {
1574
1637
  combine,
1575
1638
  debounce,
1576
1639
  debounceAndThrottle,
1640
+ delay,
1577
1641
  dumpLeaks,
1578
1642
  interval,
1579
1643
  latch,