@dxos/async 0.8.4-main.fd6878d → 0.8.4-staging.60fe92afc8

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 +180 -140
  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 +180 -140
  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 +3 -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.test.ts +36 -0
  40. package/src/persistent-lifecycle.ts +33 -6
  41. package/src/task-scheduling.ts +95 -1
  42. package/src/timeout.ts +6 -9
@@ -22,7 +22,7 @@ var chain = (chain2) => async (elements) => {
22
22
  import { ComplexMap } from "@dxos/util";
23
23
  var combine = (...cleanupFns) => {
24
24
  return () => {
25
- cleanupFns.flat().forEach((cleanupFn) => cleanupFn());
25
+ cleanupFns.flat().filter((f) => typeof f === "function").forEach((cleanupFn) => cleanupFn());
26
26
  };
27
27
  };
28
28
  var timeout = (cb, ms = 0) => {
@@ -39,8 +39,8 @@ var addEventListener = (target, type, listener, options) => {
39
39
  };
40
40
  var SubscriptionList = class {
41
41
  _cleanups = [];
42
- add(cb) {
43
- this._cleanups.push(cb);
42
+ add(...cb) {
43
+ this._cleanups.push(...cb);
44
44
  return this;
45
45
  }
46
46
  clear() {
@@ -64,29 +64,55 @@ var SubscriptionSet = class {
64
64
  };
65
65
 
66
66
  // src/debounce.ts
67
- 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) => {
68
84
  let t;
69
85
  return (...args) => {
70
86
  clearTimeout(t);
71
- t = setTimeout(() => cb(...args), delay);
87
+ t = setTimeout(() => cb(...args), delay2);
72
88
  };
73
89
  };
74
- var throttle = (cb, delay = 100) => {
90
+ var throttle = (cb, delay2 = 100) => {
75
91
  let lastCall = 0;
76
92
  return (...args) => {
77
93
  const now = Date.now();
78
- if (now - lastCall >= delay) {
94
+ if (now - lastCall >= delay2) {
79
95
  cb(...args);
80
96
  lastCall = now;
81
97
  }
82
98
  };
83
99
  };
84
- var debounceAndThrottle = (cb, delay = 100) => {
85
- const debounced = debounce(cb, delay);
86
- const throttled = throttle(cb, delay);
100
+ var debounceAndThrottle = (cb, delay2 = 100) => {
101
+ let timeout2;
102
+ let lastCall = 0;
87
103
  return (...args) => {
88
- debounced(...args);
89
- 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
+ }
90
116
  };
91
117
  };
92
118
 
@@ -140,6 +166,9 @@ var sleepWithContext = (ctx, ms) => {
140
166
  };
141
167
  var asyncReturn = () => sleep(0);
142
168
  var asyncTimeout = async (promise, timeout2, err) => {
169
+ if (typeof promise === "function") {
170
+ throw new Error("First argument must be a promise.");
171
+ }
143
172
  let timeoutId;
144
173
  const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
145
174
  const timeoutPromise = new Promise((resolve, reject) => {
@@ -148,9 +177,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
148
177
  }, timeout2);
149
178
  unrefTimeout(timeoutId);
150
179
  });
151
- const conditionTimeout = typeof promise === "function" ? promiseFromCallback(promise) : promise;
152
180
  return await Promise.race([
153
- conditionTimeout,
181
+ promise,
154
182
  timeoutPromise
155
183
  ]).finally(() => {
156
184
  clearTimeout(timeoutId);
@@ -187,7 +215,6 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
187
215
 
188
216
  // src/events.ts
189
217
  import { Context } from "@dxos/context";
190
- var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
191
218
  var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
192
219
  var Event = class _Event {
193
220
  /**
@@ -242,10 +269,7 @@ var Event = class _Event {
242
269
  _ctx,
243
270
  _callback
244
271
  ] : [
245
- new Context(void 0, {
246
- F: __dxlog_file,
247
- L: 132
248
- }),
272
+ new Context(),
249
273
  _ctx
250
274
  ];
251
275
  const weak = !!options?.weak;
@@ -275,10 +299,7 @@ var Event = class _Event {
275
299
  _ctx,
276
300
  _callback
277
301
  ] : [
278
- new Context(void 0, {
279
- F: __dxlog_file,
280
- L: 169
281
- }),
302
+ new Context(),
282
303
  _ctx
283
304
  ];
284
305
  const listener = new EventListener(this, callback, ctx, true, false);
@@ -451,12 +472,11 @@ var EventListener = class {
451
472
  once;
452
473
  weak;
453
474
  callback;
454
- _clearDispose;
475
+ _clearDispose = void 0;
455
476
  constructor(event, listener, ctx, once, weak) {
456
477
  this.ctx = ctx;
457
478
  this.once = once;
458
479
  this.weak = weak;
459
- this._clearDispose = void 0;
460
480
  this._clearDispose = ctx.onDispose(() => {
461
481
  event._removeListener(this);
462
482
  });
@@ -582,7 +602,7 @@ var MutexGuard = class {
582
602
  this.release();
583
603
  }
584
604
  };
585
- var classMutexSymbol = Symbol("class-mutex");
605
+ var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
586
606
  var FORCE_DISABLE_WARNING = false;
587
607
  var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
588
608
  var synchronized = (target, propertyName, descriptor) => {
@@ -613,7 +633,6 @@ import PushStream from "zen-push";
613
633
 
614
634
  // src/trigger.ts
615
635
  import { invariant } from "@dxos/invariant";
616
- var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/trigger.ts";
617
636
  var trigger = (timeout2) => {
618
637
  let callback;
619
638
  const promise = new Promise((resolve, reject) => {
@@ -629,23 +648,22 @@ var trigger = (timeout2) => {
629
648
  resolver
630
649
  ];
631
650
  };
632
- var TriggerState = /* @__PURE__ */ function(TriggerState2) {
651
+ var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
633
652
  TriggerState2["WAITING"] = "WAITING";
634
653
  TriggerState2["RESOLVED"] = "RESOLVED";
635
654
  TriggerState2["REJECTED"] = "REJECTED";
636
655
  return TriggerState2;
637
- }({});
656
+ })({});
638
657
  var Trigger = class {
639
658
  _options;
640
659
  _promise;
641
660
  _resolve;
642
661
  _reject;
643
- _state;
662
+ _state = "WAITING";
644
663
  constructor(_options = {
645
664
  autoReset: false
646
665
  }) {
647
666
  this._options = _options;
648
- this._state = "WAITING";
649
667
  this.reset();
650
668
  }
651
669
  get state() {
@@ -706,15 +724,7 @@ var Trigger = class {
706
724
  }
707
725
  };
708
726
  var latch = ({ count = 1, timeout: timeout2 } = {}) => {
709
- invariant(count >= 0, void 0, {
710
- F: __dxlog_file2,
711
- L: 139,
712
- S: void 0,
713
- A: [
714
- "count >= 0",
715
- ""
716
- ]
717
- });
727
+ invariant(count >= 0);
718
728
  let t;
719
729
  let doResolve;
720
730
  let doReject;
@@ -755,23 +765,11 @@ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
755
765
  // src/observable.ts
756
766
  var MulticastObservable = class _MulticastObservable extends Observable {
757
767
  _value;
758
- _observers;
768
+ _observers = /* @__PURE__ */ new Set();
759
769
  _observable;
760
- _completed;
770
+ _completed = new Trigger();
761
771
  constructor(subscriber, _value) {
762
- super((observer) => this._subscribe(observer)), this._value = _value, this._observers = /* @__PURE__ */ new Set(), this._completed = new Trigger(), this._handlers = {
763
- next: (value) => {
764
- this._value = value;
765
- this._observers.forEach((observer) => observer.next?.(value));
766
- },
767
- error: (err) => {
768
- this._observers.forEach((observer) => observer.error?.(err));
769
- },
770
- complete: () => {
771
- this._completed.wake();
772
- this._observers.forEach((observer) => observer.complete?.());
773
- }
774
- };
772
+ super((observer) => this._subscribe(observer)), this._value = _value;
775
773
  this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
776
774
  this._observable.subscribe(this._handlers);
777
775
  }
@@ -855,7 +853,19 @@ var MulticastObservable = class _MulticastObservable extends Observable {
855
853
  this._observers.delete(observer);
856
854
  };
857
855
  }
858
- _handlers;
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
+ };
859
869
  };
860
870
  var EMPTY_OBSERVABLE = MulticastObservable.of(null);
861
871
 
@@ -888,9 +898,9 @@ var ObservableProvider = class {
888
898
  };
889
899
  var CancellableObservableProvider = class extends ObservableProvider {
890
900
  _handleCancel;
891
- _cancelled;
901
+ _cancelled = false;
892
902
  constructor(_handleCancel) {
893
- super(), this._handleCancel = _handleCancel, this._cancelled = false;
903
+ super(), this._handleCancel = _handleCancel;
894
904
  }
895
905
  get cancelled() {
896
906
  return this._cancelled;
@@ -911,16 +921,15 @@ import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
911
921
  import { log as log2 } from "@dxos/log";
912
922
 
913
923
  // src/task-scheduling.ts
914
- import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
924
+ import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
915
925
  import { StackTrace as StackTrace2 } from "@dxos/debug";
916
926
 
917
927
  // src/track-leaks.ts
918
928
  import { StackTrace } from "@dxos/debug";
919
929
  import { log } from "@dxos/log";
920
- var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
921
930
  var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
922
931
  var openResources = /* @__PURE__ */ new Set();
923
- var handleSymbol = Symbol("checkLeaksHandle");
932
+ var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
924
933
  var trackResource = (resourceProvider) => {
925
934
  if (!enabled) {
926
935
  return () => {
@@ -967,31 +976,11 @@ var dumpLeaks = () => {
967
976
  if (!enabled) {
968
977
  return;
969
978
  }
970
- log.info(`Leaked resources ${openResources.size}:`, void 0, {
971
- F: __dxlog_file3,
972
- L: 82,
973
- S: void 0,
974
- C: (f, a) => f(...a)
975
- });
979
+ log.info(`Leaked resources ${openResources.size}:`);
976
980
  for (const resource of openResources) {
977
- log.info(`- ${resource.name} at`, void 0, {
978
- F: __dxlog_file3,
979
- L: 84,
980
- S: void 0,
981
- C: (f, a) => f(...a)
982
- });
983
- log.info(resource.openStack.getStack(1), void 0, {
984
- F: __dxlog_file3,
985
- L: 85,
986
- S: void 0,
987
- C: (f, a) => f(...a)
988
- });
989
- log.info("\n", void 0, {
990
- F: __dxlog_file3,
991
- L: 86,
992
- S: void 0,
993
- C: (f, a) => f(...a)
994
- });
981
+ log.info(`- ${resource.name} at`);
982
+ log.info(resource.openStack.getStack(1));
983
+ log.info("\n");
995
984
  }
996
985
  };
997
986
  if (enabled) {
@@ -1002,15 +991,12 @@ if (enabled) {
1002
991
  var DeferredTask = class {
1003
992
  _ctx;
1004
993
  _callback;
1005
- _scheduled;
1006
- _currentTask;
1007
- _nextTask;
994
+ _scheduled = false;
995
+ _currentTask = null;
996
+ _nextTask = new Trigger();
1008
997
  constructor(_ctx, _callback) {
1009
998
  this._ctx = _ctx;
1010
999
  this._callback = _callback;
1011
- this._scheduled = false;
1012
- this._currentTask = null;
1013
- this._nextTask = new Trigger();
1014
1000
  }
1015
1001
  get scheduled() {
1016
1002
  return this._scheduled;
@@ -1051,6 +1037,79 @@ var DeferredTask = class {
1051
1037
  await this._currentTask;
1052
1038
  }
1053
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;
1111
+ }
1112
+ };
1054
1113
  var runInContext = (ctx, fn) => {
1055
1114
  try {
1056
1115
  fn();
@@ -1136,9 +1195,9 @@ function _ts_decorate(decorators, target, key, desc) {
1136
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;
1137
1196
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1138
1197
  }
1139
- var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
1140
1198
  var INIT_RESTART_DELAY = 100;
1141
1199
  var DEFAULT_MAX_RESTART_DELAY = 5e3;
1200
+ var STABLE_CONNECTION_THRESHOLD = 5e3;
1142
1201
  var PersistentLifecycle = class extends Resource {
1143
1202
  _start;
1144
1203
  _stop;
@@ -1147,6 +1206,7 @@ var PersistentLifecycle = class extends Resource {
1147
1206
  _currentState = void 0;
1148
1207
  _restartTask = void 0;
1149
1208
  _restartAfter = 0;
1209
+ _connectedAt = void 0;
1150
1210
  constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
1151
1211
  super();
1152
1212
  this._start = start;
@@ -1162,29 +1222,27 @@ var PersistentLifecycle = class extends Resource {
1162
1222
  try {
1163
1223
  await this._restart();
1164
1224
  } catch (err) {
1225
+ if (this._ctx?.disposed) {
1226
+ return;
1227
+ }
1165
1228
  log2.warn("Restart failed", {
1166
1229
  err
1167
- }, {
1168
- F: __dxlog_file4,
1169
- L: 72,
1170
- S: this,
1171
- C: (f, a) => f(...a)
1172
1230
  });
1173
1231
  this._restartTask?.schedule();
1174
1232
  }
1175
1233
  });
1176
- this._currentState = await this._start().catch((err) => {
1234
+ try {
1235
+ this._currentState = await this._start();
1236
+ this._connectedAt = Date.now();
1237
+ } catch (err) {
1238
+ if (this._ctx?.disposed) {
1239
+ return;
1240
+ }
1177
1241
  log2.warn("Start failed", {
1178
1242
  err
1179
- }, {
1180
- F: __dxlog_file4,
1181
- L: 78,
1182
- S: this,
1183
- C: (f, a) => f(...a)
1184
1243
  });
1185
1244
  this._restartTask?.schedule();
1186
- return void 0;
1187
- });
1245
+ }
1188
1246
  }
1189
1247
  async _close() {
1190
1248
  await this._restartTask?.join();
@@ -1194,12 +1252,11 @@ var PersistentLifecycle = class extends Resource {
1194
1252
  async _restart() {
1195
1253
  log2(`restarting in ${this._restartAfter}ms`, {
1196
1254
  state: this._lifecycleState
1197
- }, {
1198
- F: __dxlog_file4,
1199
- L: 91,
1200
- S: this,
1201
- C: (f, a) => f(...a)
1202
1255
  });
1256
+ if (this._connectedAt !== void 0 && Date.now() - this._connectedAt >= STABLE_CONNECTION_THRESHOLD) {
1257
+ this._restartAfter = 0;
1258
+ }
1259
+ this._connectedAt = void 0;
1203
1260
  await this._stopCurrentState();
1204
1261
  if (this._lifecycleState !== LifecycleState.OPEN) {
1205
1262
  return;
@@ -1209,7 +1266,7 @@ var PersistentLifecycle = class extends Resource {
1209
1266
  await warnAfterTimeout2(5e3, "Connection establishment takes too long", async () => {
1210
1267
  this._currentState = await this._start();
1211
1268
  });
1212
- this._restartAfter = 0;
1269
+ this._connectedAt = Date.now();
1213
1270
  await this._onRestart?.();
1214
1271
  }
1215
1272
  async _stopCurrentState() {
@@ -1217,12 +1274,7 @@ var PersistentLifecycle = class extends Resource {
1217
1274
  try {
1218
1275
  await this._stop(this._currentState);
1219
1276
  } catch (err) {
1220
- log2.catch(err, void 0, {
1221
- F: __dxlog_file4,
1222
- L: 113,
1223
- S: this,
1224
- C: (f, a) => f(...a)
1225
- });
1277
+ log2.catch(err);
1226
1278
  }
1227
1279
  this._currentState = void 0;
1228
1280
  }
@@ -1246,7 +1298,6 @@ _ts_decorate([
1246
1298
 
1247
1299
  // src/push-iterable.ts
1248
1300
  import { invariant as invariant2 } from "@dxos/invariant";
1249
- var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
1250
1301
  var makePushIterable = () => {
1251
1302
  const buf = [];
1252
1303
  const trigger2 = new Trigger({
@@ -1260,15 +1311,7 @@ var makePushIterable = () => {
1260
1311
  await trigger2.wait();
1261
1312
  }
1262
1313
  const item = buf.shift();
1263
- invariant2(item, void 0, {
1264
- F: __dxlog_file5,
1265
- L: 42,
1266
- S: this,
1267
- A: [
1268
- "item",
1269
- ""
1270
- ]
1271
- });
1314
+ invariant2(item);
1272
1315
  switch (item.kind) {
1273
1316
  case "next":
1274
1317
  return {
@@ -1447,13 +1490,11 @@ var untilError = (cb) => {
1447
1490
  // src/timer.ts
1448
1491
  var Timer = class {
1449
1492
  _callback;
1450
- _state;
1493
+ _state = new Event();
1451
1494
  _timer;
1452
- _count;
1495
+ _count = 0;
1453
1496
  constructor(_callback) {
1454
1497
  this._callback = _callback;
1455
- this._state = new Event();
1456
- this._count = 0;
1457
1498
  }
1458
1499
  get state() {
1459
1500
  return this._state;
@@ -1506,16 +1547,13 @@ var UpdateScheduler = class {
1506
1547
  * Promise that resolves when the callback is done.
1507
1548
  * Never rejects.
1508
1549
  */
1509
- _promise;
1510
- _scheduled;
1511
- _lastUpdateTime;
1550
+ _promise = null;
1551
+ _scheduled = false;
1552
+ _lastUpdateTime = -TIME_PERIOD;
1512
1553
  constructor(_ctx, _callback, _params = {}) {
1513
1554
  this._ctx = _ctx;
1514
1555
  this._callback = _callback;
1515
1556
  this._params = _params;
1516
- this._promise = null;
1517
- this._scheduled = false;
1518
- this._lastUpdateTime = -TIME_PERIOD;
1519
1557
  _ctx.onDispose(async () => {
1520
1558
  await this._promise;
1521
1559
  });
@@ -1528,13 +1566,13 @@ var UpdateScheduler = class {
1528
1566
  await this._promise;
1529
1567
  if (this._params.maxFrequency) {
1530
1568
  const now = performance.now();
1531
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1532
- if (delay > 0) {
1569
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1570
+ if (delay2 > 0) {
1533
1571
  await new Promise((resolve) => {
1534
1572
  const timeoutId = setTimeout(() => {
1535
1573
  clearContext();
1536
1574
  resolve();
1537
- }, delay);
1575
+ }, delay2);
1538
1576
  const clearContext = this._ctx.onDispose(() => {
1539
1577
  clearTimeout(timeoutId);
1540
1578
  resolve();
@@ -1578,6 +1616,7 @@ var UpdateScheduler = class {
1578
1616
  }
1579
1617
  };
1580
1618
  export {
1619
+ AsyncTask,
1581
1620
  CancellableObservableProvider,
1582
1621
  DeferredTask,
1583
1622
  Event,
@@ -1604,6 +1643,7 @@ export {
1604
1643
  combine,
1605
1644
  debounce,
1606
1645
  debounceAndThrottle,
1646
+ delay,
1607
1647
  dumpLeaks,
1608
1648
  interval,
1609
1649
  latch,