@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.
- package/LICENSE +102 -5
- package/dist/lib/browser/index.mjs +180 -140
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +180 -140
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/callback.d.ts.map +1 -1
- package/dist/types/src/chain.d.ts.map +1 -1
- package/dist/types/src/cleanup.d.ts +2 -2
- package/dist/types/src/cleanup.d.ts.map +1 -1
- package/dist/types/src/debounce.d.ts +29 -9
- package/dist/types/src/debounce.d.ts.map +1 -1
- package/dist/types/src/errors.d.ts.map +1 -1
- package/dist/types/src/event-emitter.d.ts.map +1 -1
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/mutex.d.ts.map +1 -1
- package/dist/types/src/observable-value.d.ts.map +1 -1
- package/dist/types/src/observable.d.ts.map +1 -1
- package/dist/types/src/persistent-lifecycle.d.ts +3 -2
- package/dist/types/src/persistent-lifecycle.d.ts.map +1 -1
- package/dist/types/src/stream-to-array.d.ts.map +1 -1
- package/dist/types/src/task-scheduling.d.ts +29 -1
- package/dist/types/src/task-scheduling.d.ts.map +1 -1
- package/dist/types/src/test-stream.d.ts.map +1 -1
- package/dist/types/src/testing.d.ts.map +1 -1
- package/dist/types/src/timeout.d.ts +1 -1
- package/dist/types/src/timeout.d.ts.map +1 -1
- package/dist/types/src/timer.d.ts.map +1 -1
- package/dist/types/src/track-leaks.d.ts.map +1 -1
- package/dist/types/src/trigger.d.ts.map +1 -1
- package/dist/types/src/update-scheduler.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -11
- package/src/cleanup.ts +7 -4
- package/src/debounce.ts +69 -16
- package/src/event-emitter.test.ts +0 -1
- package/src/observable-value.ts +4 -2
- package/src/persistent-lifecycle.test.ts +36 -0
- package/src/persistent-lifecycle.ts +33 -6
- package/src/task-scheduling.ts +95 -1
- package/src/timeout.ts +6 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/callback.ts":{"bytes":
|
|
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
|
|
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),
|
|
89
|
+
t = setTimeout(() => cb(...args), delay2);
|
|
74
90
|
};
|
|
75
91
|
};
|
|
76
|
-
var throttle = (cb,
|
|
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 >=
|
|
96
|
+
if (now - lastCall >= delay2) {
|
|
81
97
|
cb(...args);
|
|
82
98
|
lastCall = now;
|
|
83
99
|
}
|
|
84
100
|
};
|
|
85
101
|
};
|
|
86
|
-
var debounceAndThrottle = (cb,
|
|
87
|
-
|
|
88
|
-
|
|
102
|
+
var debounceAndThrottle = (cb, delay2 = 100) => {
|
|
103
|
+
let timeout2;
|
|
104
|
+
let lastCall = 0;
|
|
89
105
|
return (...args) => {
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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}
|
|
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
|
|
980
|
-
|
|
981
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
1534
|
-
if (
|
|
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
|
-
},
|
|
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,
|