@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
@@ -1 +1 @@
1
- {"inputs":{"src/callback.ts":{"bytes":1595,"imports":[],"format":"esm"},"src/chain.ts":{"bytes":1619,"imports":[],"format":"esm"},"src/cleanup.ts":{"bytes":6540,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/debounce.ts":{"bytes":4306,"imports":[],"format":"esm"},"src/errors.ts":{"bytes":2911,"imports":[],"format":"esm"},"src/timeout.ts":{"bytes":8042,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"src/callback.ts","kind":"import-statement","original":"./callback"},{"path":"src/errors.ts","kind":"import-statement","original":"./errors"}],"format":"esm"},"src/event-emitter.ts":{"bytes":4155,"imports":[{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"}],"format":"esm"},"src/events.ts":{"bytes":39504,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true}],"format":"esm"},"src/mutex.ts":{"bytes":12647,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true}],"format":"esm"},"src/trigger.ts":{"bytes":14081,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"}],"format":"esm"},"src/observable.ts":{"bytes":17950,"imports":[{"path":"zen-observable","kind":"import-statement","external":true},{"path":"zen-push","kind":"import-statement","external":true},{"path":"src/trigger.ts","kind":"import-statement","original":"./trigger"}],"format":"esm"},"src/observable-value.ts":{"bytes":6465,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/track-leaks.ts":{"bytes":8414,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"src/task-scheduling.ts":{"bytes":15492,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"src/track-leaks.ts","kind":"import-statement","original":"./track-leaks"},{"path":"src/trigger.ts","kind":"import-statement","original":"./trigger"}],"format":"esm"},"src/persistent-lifecycle.ts":{"bytes":12777,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"src/mutex.ts","kind":"import-statement","original":"./mutex"},{"path":"src/task-scheduling.ts","kind":"import-statement","original":"./task-scheduling"},{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"}],"format":"esm"},"src/push-iterable.ts":{"bytes":5922,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"src/trigger.ts","kind":"import-statement","original":"./trigger"}],"format":"esm"},"src/stream-to-array.ts":{"bytes":4935,"imports":[],"format":"esm"},"src/test-stream.ts":{"bytes":5038,"imports":[{"path":"@dxos/node-std/stream","kind":"import-statement","external":true},{"path":"src/events.ts","kind":"import-statement","original":"./events"},{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"}],"format":"esm"},"src/testing.ts":{"bytes":8388,"imports":[{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"},{"path":"src/trigger.ts","kind":"import-statement","original":"./trigger"}],"format":"esm"},"src/timer.ts":{"bytes":5937,"imports":[{"path":"src/events.ts","kind":"import-statement","original":"./events"}],"format":"esm"},"src/update-scheduler.ts":{"bytes":9812,"imports":[{"path":"src/task-scheduling.ts","kind":"import-statement","original":"./task-scheduling"}],"format":"esm"},"src/index.ts":{"bytes":2335,"imports":[{"path":"src/callback.ts","kind":"import-statement","original":"./callback"},{"path":"src/chain.ts","kind":"import-statement","original":"./chain"},{"path":"src/cleanup.ts","kind":"import-statement","original":"./cleanup"},{"path":"src/debounce.ts","kind":"import-statement","original":"./debounce"},{"path":"src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"src/event-emitter.ts","kind":"import-statement","original":"./event-emitter"},{"path":"src/events.ts","kind":"import-statement","original":"./events"},{"path":"src/mutex.ts","kind":"import-statement","original":"./mutex"},{"path":"src/observable.ts","kind":"import-statement","original":"./observable"},{"path":"src/observable-value.ts","kind":"import-statement","original":"./observable-value"},{"path":"src/persistent-lifecycle.ts","kind":"import-statement","original":"./persistent-lifecycle"},{"path":"src/push-iterable.ts","kind":"import-statement","original":"./push-iterable"},{"path":"src/stream-to-array.ts","kind":"import-statement","original":"./stream-to-array"},{"path":"src/task-scheduling.ts","kind":"import-statement","original":"./task-scheduling"},{"path":"src/test-stream.ts","kind":"import-statement","original":"./test-stream"},{"path":"src/testing.ts","kind":"import-statement","original":"./testing"},{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"},{"path":"src/timer.ts","kind":"import-statement","original":"./timer"},{"path":"src/track-leaks.ts","kind":"import-statement","original":"./track-leaks"},{"path":"src/trigger.ts","kind":"import-statement","original":"./trigger"},{"path":"src/update-scheduler.ts","kind":"import-statement","original":"./update-scheduler"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":98484},"dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"zen-observable","kind":"import-statement","external":true},{"path":"zen-push","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/node-std/stream","kind":"import-statement","external":true}],"exports":["CancellableObservableProvider","DeferredTask","Event","MulticastObservable","Mutex","MutexGuard","Observable","ObservableProvider","PersistentLifecycle","PushStream","SubscriptionList","SubscriptionSet","TestStream","TimeoutError","Timer","Trigger","TriggerState","UpdateScheduler","addEventListener","addListener","asyncReturn","asyncTimeout","chain","combine","debounce","debounceAndThrottle","dumpLeaks","interval","latch","makePushIterable","observableError","onEvent","promiseFromCallback","runInContext","runInContextAsync","scheduleExponentialBackoffTaskInterval","scheduleMicroTask","scheduleTask","scheduleTaskInterval","sleep","sleepWithContext","streamToArray","synchronized","throttle","timeout","toError","trackLeaks","trackResource","trigger","unrefTimeout","until","untilError","untilPromise","waitForCondition","waitForEvent"],"entryPoint":"src/index.ts","inputs":{"src/callback.ts":{"bytesInOutput":185},"src/index.ts":{"bytesInOutput":0},"src/chain.ts":{"bytesInOutput":216},"src/cleanup.ts":{"bytesInOutput":1045},"src/debounce.ts":{"bytesInOutput":557},"src/errors.ts":{"bytesInOutput":476},"src/timeout.ts":{"bytesInOutput":1486},"src/event-emitter.ts":{"bytesInOutput":697},"src/events.ts":{"bytesInOutput":8727},"src/mutex.ts":{"bytesInOutput":2413},"src/observable.ts":{"bytesInOutput":3765},"src/trigger.ts":{"bytesInOutput":3029},"src/observable-value.ts":{"bytesInOutput":968},"src/persistent-lifecycle.ts":{"bytesInOutput":3536},"src/task-scheduling.ts":{"bytesInOutput":3215},"src/track-leaks.ts":{"bytesInOutput":2136},"src/push-iterable.ts":{"bytesInOutput":1389},"src/stream-to-array.ts":{"bytesInOutput":967},"src/test-stream.ts":{"bytesInOutput":915},"src/testing.ts":{"bytesInOutput":1419},"src/timer.ts":{"bytesInOutput":1099},"src/update-scheduler.ts":{"bytesInOutput":2015}},"bytes":41742}}}
1
+ {"inputs":{"src/callback.ts":{"bytes":1516,"imports":[],"format":"esm"},"src/chain.ts":{"bytes":1547,"imports":[],"format":"esm"},"src/cleanup.ts":{"bytes":6733,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/debounce.ts":{"bytes":9093,"imports":[],"format":"esm"},"src/errors.ts":{"bytes":2838,"imports":[],"format":"esm"},"src/timeout.ts":{"bytes":7524,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"src/errors.ts","kind":"import-statement","original":"./errors"}],"format":"esm"},"src/event-emitter.ts":{"bytes":4075,"imports":[{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"}],"format":"esm"},"src/events.ts":{"bytes":39225,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true}],"format":"esm"},"src/mutex.ts":{"bytes":12575,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true}],"format":"esm"},"src/trigger.ts":{"bytes":13827,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"}],"format":"esm"},"src/observable.ts":{"bytes":17747,"imports":[{"path":"zen-observable","kind":"import-statement","external":true},{"path":"zen-push","kind":"import-statement","external":true},{"path":"src/trigger.ts","kind":"import-statement","original":"./trigger"}],"format":"esm"},"src/observable-value.ts":{"bytes":6361,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/track-leaks.ts":{"bytes":7844,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"src/task-scheduling.ts":{"bytes":23346,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"src/track-leaks.ts","kind":"import-statement","original":"./track-leaks"},{"path":"src/trigger.ts","kind":"import-statement","original":"./trigger"}],"format":"esm"},"src/persistent-lifecycle.ts":{"bytes":15479,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"src/mutex.ts","kind":"import-statement","original":"./mutex"},{"path":"src/task-scheduling.ts","kind":"import-statement","original":"./task-scheduling"},{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"}],"format":"esm"},"src/push-iterable.ts":{"bytes":5570,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"src/trigger.ts","kind":"import-statement","original":"./trigger"}],"format":"esm"},"src/stream-to-array.ts":{"bytes":4853,"imports":[],"format":"esm"},"src/test-stream.ts":{"bytes":4960,"imports":[{"path":"@dxos/node-std/stream","kind":"import-statement","external":true},{"path":"src/events.ts","kind":"import-statement","original":"./events"},{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"}],"format":"esm"},"src/testing.ts":{"bytes":8314,"imports":[{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"},{"path":"src/trigger.ts","kind":"import-statement","original":"./trigger"}],"format":"esm"},"src/timer.ts":{"bytes":5803,"imports":[{"path":"src/events.ts","kind":"import-statement","original":"./events"}],"format":"esm"},"src/update-scheduler.ts":{"bytes":9619,"imports":[{"path":"src/task-scheduling.ts","kind":"import-statement","original":"./task-scheduling"}],"format":"esm"},"src/index.ts":{"bytes":2259,"imports":[{"path":"src/callback.ts","kind":"import-statement","original":"./callback"},{"path":"src/chain.ts","kind":"import-statement","original":"./chain"},{"path":"src/cleanup.ts","kind":"import-statement","original":"./cleanup"},{"path":"src/debounce.ts","kind":"import-statement","original":"./debounce"},{"path":"src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"src/event-emitter.ts","kind":"import-statement","original":"./event-emitter"},{"path":"src/events.ts","kind":"import-statement","original":"./events"},{"path":"src/mutex.ts","kind":"import-statement","original":"./mutex"},{"path":"src/observable.ts","kind":"import-statement","original":"./observable"},{"path":"src/observable-value.ts","kind":"import-statement","original":"./observable-value"},{"path":"src/persistent-lifecycle.ts","kind":"import-statement","original":"./persistent-lifecycle"},{"path":"src/push-iterable.ts","kind":"import-statement","original":"./push-iterable"},{"path":"src/stream-to-array.ts","kind":"import-statement","original":"./stream-to-array"},{"path":"src/task-scheduling.ts","kind":"import-statement","original":"./task-scheduling"},{"path":"src/test-stream.ts","kind":"import-statement","original":"./test-stream"},{"path":"src/testing.ts","kind":"import-statement","original":"./testing"},{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"},{"path":"src/timer.ts","kind":"import-statement","original":"./timer"},{"path":"src/track-leaks.ts","kind":"import-statement","original":"./track-leaks"},{"path":"src/trigger.ts","kind":"import-statement","original":"./trigger"},{"path":"src/update-scheduler.ts","kind":"import-statement","original":"./update-scheduler"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":105548},"dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"zen-observable","kind":"import-statement","external":true},{"path":"zen-push","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/node-std/stream","kind":"import-statement","external":true}],"exports":["AsyncTask","CancellableObservableProvider","DeferredTask","Event","MulticastObservable","Mutex","MutexGuard","Observable","ObservableProvider","PersistentLifecycle","PushStream","SubscriptionList","SubscriptionSet","TestStream","TimeoutError","Timer","Trigger","TriggerState","UpdateScheduler","addEventListener","addListener","asyncReturn","asyncTimeout","chain","combine","debounce","debounceAndThrottle","delay","dumpLeaks","interval","latch","makePushIterable","observableError","onEvent","promiseFromCallback","runInContext","runInContextAsync","scheduleExponentialBackoffTaskInterval","scheduleMicroTask","scheduleTask","scheduleTaskInterval","sleep","sleepWithContext","streamToArray","synchronized","throttle","timeout","toError","trackLeaks","trackResource","trigger","unrefTimeout","until","untilError","untilPromise","waitForCondition","waitForEvent"],"entryPoint":"src/index.ts","inputs":{"src/callback.ts":{"bytesInOutput":185},"src/index.ts":{"bytesInOutput":0},"src/chain.ts":{"bytesInOutput":216},"src/cleanup.ts":{"bytesInOutput":1090},"src/debounce.ts":{"bytesInOutput":1032},"src/errors.ts":{"bytesInOutput":476},"src/timeout.ts":{"bytesInOutput":1479},"src/event-emitter.ts":{"bytesInOutput":697},"src/events.ts":{"bytesInOutput":8516},"src/mutex.ts":{"bytesInOutput":2429},"src/observable.ts":{"bytesInOutput":3691},"src/trigger.ts":{"bytesInOutput":2831},"src/observable-value.ts":{"bytesInOutput":951},"src/persistent-lifecycle.ts":{"bytesInOutput":3433},"src/task-scheduling.ts":{"bytesInOutput":4964},"src/track-leaks.ts":{"bytesInOutput":1691},"src/push-iterable.ts":{"bytesInOutput":1145},"src/stream-to-array.ts":{"bytesInOutput":967},"src/test-stream.ts":{"bytesInOutput":915},"src/testing.ts":{"bytesInOutput":1419},"src/timer.ts":{"bytesInOutput":1065},"src/update-scheduler.ts":{"bytesInOutput":1952}},"bytes":42653}}}
@@ -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) => {
@@ -41,8 +41,8 @@ var addEventListener = (target, type, listener, options) => {
41
41
  };
42
42
  var SubscriptionList = class {
43
43
  _cleanups = [];
44
- add(cb) {
45
- this._cleanups.push(cb);
44
+ add(...cb) {
45
+ this._cleanups.push(...cb);
46
46
  return this;
47
47
  }
48
48
  clear() {
@@ -66,29 +66,55 @@ var SubscriptionSet = class {
66
66
  };
67
67
 
68
68
  // src/debounce.ts
69
- 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) => {
70
86
  let t;
71
87
  return (...args) => {
72
88
  clearTimeout(t);
73
- t = setTimeout(() => cb(...args), delay);
89
+ t = setTimeout(() => cb(...args), delay2);
74
90
  };
75
91
  };
76
- var throttle = (cb, delay = 100) => {
92
+ var throttle = (cb, delay2 = 100) => {
77
93
  let lastCall = 0;
78
94
  return (...args) => {
79
95
  const now = Date.now();
80
- if (now - lastCall >= delay) {
96
+ if (now - lastCall >= delay2) {
81
97
  cb(...args);
82
98
  lastCall = now;
83
99
  }
84
100
  };
85
101
  };
86
- var debounceAndThrottle = (cb, delay = 100) => {
87
- const debounced = debounce(cb, delay);
88
- const throttled = throttle(cb, delay);
102
+ var debounceAndThrottle = (cb, delay2 = 100) => {
103
+ let timeout2;
104
+ let lastCall = 0;
89
105
  return (...args) => {
90
- debounced(...args);
91
- 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
+ }
92
118
  };
93
119
  };
94
120
 
@@ -142,6 +168,9 @@ var sleepWithContext = (ctx, ms) => {
142
168
  };
143
169
  var asyncReturn = () => sleep(0);
144
170
  var asyncTimeout = async (promise, timeout2, err) => {
171
+ if (typeof promise === "function") {
172
+ throw new Error("First argument must be a promise.");
173
+ }
145
174
  let timeoutId;
146
175
  const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
147
176
  const timeoutPromise = new Promise((resolve, reject) => {
@@ -150,9 +179,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
150
179
  }, timeout2);
151
180
  unrefTimeout(timeoutId);
152
181
  });
153
- const conditionTimeout = typeof promise === "function" ? promiseFromCallback(promise) : promise;
154
182
  return await Promise.race([
155
- conditionTimeout,
183
+ promise,
156
184
  timeoutPromise
157
185
  ]).finally(() => {
158
186
  clearTimeout(timeoutId);
@@ -189,7 +217,6 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
189
217
 
190
218
  // src/events.ts
191
219
  import { Context } from "@dxos/context";
192
- var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
193
220
  var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
194
221
  var Event = class _Event {
195
222
  /**
@@ -244,10 +271,7 @@ var Event = class _Event {
244
271
  _ctx,
245
272
  _callback
246
273
  ] : [
247
- new Context(void 0, {
248
- F: __dxlog_file,
249
- L: 132
250
- }),
274
+ new Context(),
251
275
  _ctx
252
276
  ];
253
277
  const weak = !!options?.weak;
@@ -277,10 +301,7 @@ var Event = class _Event {
277
301
  _ctx,
278
302
  _callback
279
303
  ] : [
280
- new Context(void 0, {
281
- F: __dxlog_file,
282
- L: 169
283
- }),
304
+ new Context(),
284
305
  _ctx
285
306
  ];
286
307
  const listener = new EventListener(this, callback, ctx, true, false);
@@ -453,12 +474,11 @@ var EventListener = class {
453
474
  once;
454
475
  weak;
455
476
  callback;
456
- _clearDispose;
477
+ _clearDispose = void 0;
457
478
  constructor(event, listener, ctx, once, weak) {
458
479
  this.ctx = ctx;
459
480
  this.once = once;
460
481
  this.weak = weak;
461
- this._clearDispose = void 0;
462
482
  this._clearDispose = ctx.onDispose(() => {
463
483
  event._removeListener(this);
464
484
  });
@@ -584,7 +604,7 @@ var MutexGuard = class {
584
604
  this.release();
585
605
  }
586
606
  };
587
- var classMutexSymbol = Symbol("class-mutex");
607
+ var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
588
608
  var FORCE_DISABLE_WARNING = false;
589
609
  var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
590
610
  var synchronized = (target, propertyName, descriptor) => {
@@ -615,7 +635,6 @@ import PushStream from "zen-push";
615
635
 
616
636
  // src/trigger.ts
617
637
  import { invariant } from "@dxos/invariant";
618
- var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/trigger.ts";
619
638
  var trigger = (timeout2) => {
620
639
  let callback;
621
640
  const promise = new Promise((resolve, reject) => {
@@ -631,23 +650,22 @@ var trigger = (timeout2) => {
631
650
  resolver
632
651
  ];
633
652
  };
634
- var TriggerState = /* @__PURE__ */ function(TriggerState2) {
653
+ var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
635
654
  TriggerState2["WAITING"] = "WAITING";
636
655
  TriggerState2["RESOLVED"] = "RESOLVED";
637
656
  TriggerState2["REJECTED"] = "REJECTED";
638
657
  return TriggerState2;
639
- }({});
658
+ })({});
640
659
  var Trigger = class {
641
660
  _options;
642
661
  _promise;
643
662
  _resolve;
644
663
  _reject;
645
- _state;
664
+ _state = "WAITING";
646
665
  constructor(_options = {
647
666
  autoReset: false
648
667
  }) {
649
668
  this._options = _options;
650
- this._state = "WAITING";
651
669
  this.reset();
652
670
  }
653
671
  get state() {
@@ -708,15 +726,7 @@ var Trigger = class {
708
726
  }
709
727
  };
710
728
  var latch = ({ count = 1, timeout: timeout2 } = {}) => {
711
- invariant(count >= 0, void 0, {
712
- F: __dxlog_file2,
713
- L: 139,
714
- S: void 0,
715
- A: [
716
- "count >= 0",
717
- ""
718
- ]
719
- });
729
+ invariant(count >= 0);
720
730
  let t;
721
731
  let doResolve;
722
732
  let doReject;
@@ -757,23 +767,11 @@ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
757
767
  // src/observable.ts
758
768
  var MulticastObservable = class _MulticastObservable extends Observable {
759
769
  _value;
760
- _observers;
770
+ _observers = /* @__PURE__ */ new Set();
761
771
  _observable;
762
- _completed;
772
+ _completed = new Trigger();
763
773
  constructor(subscriber, _value) {
764
- super((observer) => this._subscribe(observer)), this._value = _value, this._observers = /* @__PURE__ */ new Set(), this._completed = new Trigger(), this._handlers = {
765
- next: (value) => {
766
- this._value = value;
767
- this._observers.forEach((observer) => observer.next?.(value));
768
- },
769
- error: (err) => {
770
- this._observers.forEach((observer) => observer.error?.(err));
771
- },
772
- complete: () => {
773
- this._completed.wake();
774
- this._observers.forEach((observer) => observer.complete?.());
775
- }
776
- };
774
+ super((observer) => this._subscribe(observer)), this._value = _value;
777
775
  this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
778
776
  this._observable.subscribe(this._handlers);
779
777
  }
@@ -857,7 +855,19 @@ var MulticastObservable = class _MulticastObservable extends Observable {
857
855
  this._observers.delete(observer);
858
856
  };
859
857
  }
860
- _handlers;
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
+ };
861
871
  };
862
872
  var EMPTY_OBSERVABLE = MulticastObservable.of(null);
863
873
 
@@ -890,9 +900,9 @@ var ObservableProvider = class {
890
900
  };
891
901
  var CancellableObservableProvider = class extends ObservableProvider {
892
902
  _handleCancel;
893
- _cancelled;
903
+ _cancelled = false;
894
904
  constructor(_handleCancel) {
895
- super(), this._handleCancel = _handleCancel, this._cancelled = false;
905
+ super(), this._handleCancel = _handleCancel;
896
906
  }
897
907
  get cancelled() {
898
908
  return this._cancelled;
@@ -913,16 +923,15 @@ import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
913
923
  import { log as log2 } from "@dxos/log";
914
924
 
915
925
  // src/task-scheduling.ts
916
- import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
926
+ import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
917
927
  import { StackTrace as StackTrace2 } from "@dxos/debug";
918
928
 
919
929
  // src/track-leaks.ts
920
930
  import { StackTrace } from "@dxos/debug";
921
931
  import { log } from "@dxos/log";
922
- var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
923
932
  var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
924
933
  var openResources = /* @__PURE__ */ new Set();
925
- var handleSymbol = Symbol("checkLeaksHandle");
934
+ var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
926
935
  var trackResource = (resourceProvider) => {
927
936
  if (!enabled) {
928
937
  return () => {
@@ -969,31 +978,11 @@ var dumpLeaks = () => {
969
978
  if (!enabled) {
970
979
  return;
971
980
  }
972
- log.info(`Leaked resources ${openResources.size}:`, void 0, {
973
- F: __dxlog_file3,
974
- L: 82,
975
- S: void 0,
976
- C: (f, a) => f(...a)
977
- });
981
+ log.info(`Leaked resources ${openResources.size}:`);
978
982
  for (const resource of openResources) {
979
- log.info(`- ${resource.name} at`, void 0, {
980
- F: __dxlog_file3,
981
- L: 84,
982
- S: void 0,
983
- C: (f, a) => f(...a)
984
- });
985
- log.info(resource.openStack.getStack(1), void 0, {
986
- F: __dxlog_file3,
987
- L: 85,
988
- S: void 0,
989
- C: (f, a) => f(...a)
990
- });
991
- log.info("\n", void 0, {
992
- F: __dxlog_file3,
993
- L: 86,
994
- S: void 0,
995
- C: (f, a) => f(...a)
996
- });
983
+ log.info(`- ${resource.name} at`);
984
+ log.info(resource.openStack.getStack(1));
985
+ log.info("\n");
997
986
  }
998
987
  };
999
988
  if (enabled) {
@@ -1004,15 +993,12 @@ if (enabled) {
1004
993
  var DeferredTask = class {
1005
994
  _ctx;
1006
995
  _callback;
1007
- _scheduled;
1008
- _currentTask;
1009
- _nextTask;
996
+ _scheduled = false;
997
+ _currentTask = null;
998
+ _nextTask = new Trigger();
1010
999
  constructor(_ctx, _callback) {
1011
1000
  this._ctx = _ctx;
1012
1001
  this._callback = _callback;
1013
- this._scheduled = false;
1014
- this._currentTask = null;
1015
- this._nextTask = new Trigger();
1016
1002
  }
1017
1003
  get scheduled() {
1018
1004
  return this._scheduled;
@@ -1053,6 +1039,79 @@ var DeferredTask = class {
1053
1039
  await this._currentTask;
1054
1040
  }
1055
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
+ };
1056
1115
  var runInContext = (ctx, fn) => {
1057
1116
  try {
1058
1117
  fn();
@@ -1138,9 +1197,9 @@ function _ts_decorate(decorators, target, key, desc) {
1138
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;
1139
1198
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1140
1199
  }
1141
- var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
1142
1200
  var INIT_RESTART_DELAY = 100;
1143
1201
  var DEFAULT_MAX_RESTART_DELAY = 5e3;
1202
+ var STABLE_CONNECTION_THRESHOLD = 5e3;
1144
1203
  var PersistentLifecycle = class extends Resource {
1145
1204
  _start;
1146
1205
  _stop;
@@ -1149,6 +1208,7 @@ var PersistentLifecycle = class extends Resource {
1149
1208
  _currentState = void 0;
1150
1209
  _restartTask = void 0;
1151
1210
  _restartAfter = 0;
1211
+ _connectedAt = void 0;
1152
1212
  constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
1153
1213
  super();
1154
1214
  this._start = start;
@@ -1164,29 +1224,27 @@ var PersistentLifecycle = class extends Resource {
1164
1224
  try {
1165
1225
  await this._restart();
1166
1226
  } catch (err) {
1227
+ if (this._ctx?.disposed) {
1228
+ return;
1229
+ }
1167
1230
  log2.warn("Restart failed", {
1168
1231
  err
1169
- }, {
1170
- F: __dxlog_file4,
1171
- L: 72,
1172
- S: this,
1173
- C: (f, a) => f(...a)
1174
1232
  });
1175
1233
  this._restartTask?.schedule();
1176
1234
  }
1177
1235
  });
1178
- this._currentState = await this._start().catch((err) => {
1236
+ try {
1237
+ this._currentState = await this._start();
1238
+ this._connectedAt = Date.now();
1239
+ } catch (err) {
1240
+ if (this._ctx?.disposed) {
1241
+ return;
1242
+ }
1179
1243
  log2.warn("Start failed", {
1180
1244
  err
1181
- }, {
1182
- F: __dxlog_file4,
1183
- L: 78,
1184
- S: this,
1185
- C: (f, a) => f(...a)
1186
1245
  });
1187
1246
  this._restartTask?.schedule();
1188
- return void 0;
1189
- });
1247
+ }
1190
1248
  }
1191
1249
  async _close() {
1192
1250
  await this._restartTask?.join();
@@ -1196,12 +1254,11 @@ var PersistentLifecycle = class extends Resource {
1196
1254
  async _restart() {
1197
1255
  log2(`restarting in ${this._restartAfter}ms`, {
1198
1256
  state: this._lifecycleState
1199
- }, {
1200
- F: __dxlog_file4,
1201
- L: 91,
1202
- S: this,
1203
- C: (f, a) => f(...a)
1204
1257
  });
1258
+ if (this._connectedAt !== void 0 && Date.now() - this._connectedAt >= STABLE_CONNECTION_THRESHOLD) {
1259
+ this._restartAfter = 0;
1260
+ }
1261
+ this._connectedAt = void 0;
1205
1262
  await this._stopCurrentState();
1206
1263
  if (this._lifecycleState !== LifecycleState.OPEN) {
1207
1264
  return;
@@ -1211,7 +1268,7 @@ var PersistentLifecycle = class extends Resource {
1211
1268
  await warnAfterTimeout2(5e3, "Connection establishment takes too long", async () => {
1212
1269
  this._currentState = await this._start();
1213
1270
  });
1214
- this._restartAfter = 0;
1271
+ this._connectedAt = Date.now();
1215
1272
  await this._onRestart?.();
1216
1273
  }
1217
1274
  async _stopCurrentState() {
@@ -1219,12 +1276,7 @@ var PersistentLifecycle = class extends Resource {
1219
1276
  try {
1220
1277
  await this._stop(this._currentState);
1221
1278
  } catch (err) {
1222
- log2.catch(err, void 0, {
1223
- F: __dxlog_file4,
1224
- L: 113,
1225
- S: this,
1226
- C: (f, a) => f(...a)
1227
- });
1279
+ log2.catch(err);
1228
1280
  }
1229
1281
  this._currentState = void 0;
1230
1282
  }
@@ -1248,7 +1300,6 @@ _ts_decorate([
1248
1300
 
1249
1301
  // src/push-iterable.ts
1250
1302
  import { invariant as invariant2 } from "@dxos/invariant";
1251
- var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
1252
1303
  var makePushIterable = () => {
1253
1304
  const buf = [];
1254
1305
  const trigger2 = new Trigger({
@@ -1262,15 +1313,7 @@ var makePushIterable = () => {
1262
1313
  await trigger2.wait();
1263
1314
  }
1264
1315
  const item = buf.shift();
1265
- invariant2(item, void 0, {
1266
- F: __dxlog_file5,
1267
- L: 42,
1268
- S: this,
1269
- A: [
1270
- "item",
1271
- ""
1272
- ]
1273
- });
1316
+ invariant2(item);
1274
1317
  switch (item.kind) {
1275
1318
  case "next":
1276
1319
  return {
@@ -1449,13 +1492,11 @@ var untilError = (cb) => {
1449
1492
  // src/timer.ts
1450
1493
  var Timer = class {
1451
1494
  _callback;
1452
- _state;
1495
+ _state = new Event();
1453
1496
  _timer;
1454
- _count;
1497
+ _count = 0;
1455
1498
  constructor(_callback) {
1456
1499
  this._callback = _callback;
1457
- this._state = new Event();
1458
- this._count = 0;
1459
1500
  }
1460
1501
  get state() {
1461
1502
  return this._state;
@@ -1508,16 +1549,13 @@ var UpdateScheduler = class {
1508
1549
  * Promise that resolves when the callback is done.
1509
1550
  * Never rejects.
1510
1551
  */
1511
- _promise;
1512
- _scheduled;
1513
- _lastUpdateTime;
1552
+ _promise = null;
1553
+ _scheduled = false;
1554
+ _lastUpdateTime = -TIME_PERIOD;
1514
1555
  constructor(_ctx, _callback, _params = {}) {
1515
1556
  this._ctx = _ctx;
1516
1557
  this._callback = _callback;
1517
1558
  this._params = _params;
1518
- this._promise = null;
1519
- this._scheduled = false;
1520
- this._lastUpdateTime = -TIME_PERIOD;
1521
1559
  _ctx.onDispose(async () => {
1522
1560
  await this._promise;
1523
1561
  });
@@ -1530,13 +1568,13 @@ var UpdateScheduler = class {
1530
1568
  await this._promise;
1531
1569
  if (this._params.maxFrequency) {
1532
1570
  const now = performance.now();
1533
- const delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1534
- if (delay > 0) {
1571
+ const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1572
+ if (delay2 > 0) {
1535
1573
  await new Promise((resolve) => {
1536
1574
  const timeoutId = setTimeout(() => {
1537
1575
  clearContext();
1538
1576
  resolve();
1539
- }, delay);
1577
+ }, delay2);
1540
1578
  const clearContext = this._ctx.onDispose(() => {
1541
1579
  clearTimeout(timeoutId);
1542
1580
  resolve();
@@ -1580,6 +1618,7 @@ var UpdateScheduler = class {
1580
1618
  }
1581
1619
  };
1582
1620
  export {
1621
+ AsyncTask,
1583
1622
  CancellableObservableProvider,
1584
1623
  DeferredTask,
1585
1624
  Event,
@@ -1606,6 +1645,7 @@ export {
1606
1645
  combine,
1607
1646
  debounce,
1608
1647
  debounceAndThrottle,
1648
+ delay,
1609
1649
  dumpLeaks,
1610
1650
  interval,
1611
1651
  latch,