@dxos/async 0.8.4-main.b97322e → 0.8.4-main.bcb3aa67d6
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/dist/lib/browser/index.mjs +208 -79
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +208 -79
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/cleanup.d.ts +3 -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/observable-value.d.ts.map +1 -1
- package/dist/types/src/persistent-lifecycle.d.ts +2 -2
- package/dist/types/src/persistent-lifecycle.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/timeout.d.ts +1 -1
- package/dist/types/src/timeout.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -9
- package/src/cleanup.ts +8 -4
- package/src/debounce.ts +69 -16
- package/src/event-emitter.test.ts +1 -0
- package/src/observable-value.ts +4 -2
- package/src/persistent-lifecycle.test.ts +1 -1
- package/src/persistent-lifecycle.ts +2 -2
- package/src/task-scheduling.ts +95 -1
- package/src/testing.test.ts +1 -1
- 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":
|
|
1
|
+
{"inputs":{"src/callback.ts":{"bytes":1595,"imports":[],"format":"esm"},"src/chain.ts":{"bytes":1619,"imports":[],"format":"esm"},"src/cleanup.ts":{"bytes":6902,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/debounce.ts":{"bytes":9168,"imports":[],"format":"esm"},"src/errors.ts":{"bytes":2911,"imports":[],"format":"esm"},"src/timeout.ts":{"bytes":7598,"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":4155,"imports":[{"path":"src/timeout.ts","kind":"import-statement","original":"./timeout"}],"format":"esm"},"src/events.ts":{"bytes":39464,"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":14052,"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":17824,"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":6444,"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":23503,"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":12773,"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":5879,"imports":[{"path":"src/events.ts","kind":"import-statement","original":"./events"}],"format":"esm"},"src/update-scheduler.ts":{"bytes":9706,"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":104287},"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":8703},"src/mutex.ts":{"bytesInOutput":2429},"src/observable.ts":{"bytesInOutput":3691},"src/trigger.ts":{"bytesInOutput":3014},"src/observable-value.ts":{"bytesInOutput":951},"src/persistent-lifecycle.ts":{"bytesInOutput":3536},"src/task-scheduling.ts":{"bytesInOutput":5099},"src/track-leaks.ts":{"bytesInOutput":2152},"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":1065},"src/update-scheduler.ts":{"bytesInOutput":1952}},"bytes":43966}}}
|
|
@@ -24,7 +24,7 @@ var chain = (chain2) => async (elements) => {
|
|
|
24
24
|
import { ComplexMap } from "@dxos/util";
|
|
25
25
|
var combine = (...cleanupFns) => {
|
|
26
26
|
return () => {
|
|
27
|
-
cleanupFns.flat().forEach((cleanupFn) => cleanupFn());
|
|
27
|
+
cleanupFns.flat().filter((f) => typeof f === "function").forEach((cleanupFn) => cleanupFn());
|
|
28
28
|
};
|
|
29
29
|
};
|
|
30
30
|
var timeout = (cb, ms = 0) => {
|
|
@@ -40,11 +40,9 @@ var addEventListener = (target, type, listener, options) => {
|
|
|
40
40
|
return () => target.removeEventListener(type, listener, options);
|
|
41
41
|
};
|
|
42
42
|
var SubscriptionList = class {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
add(cb) {
|
|
47
|
-
this._cleanups.push(cb);
|
|
43
|
+
_cleanups = [];
|
|
44
|
+
add(...cb) {
|
|
45
|
+
this._cleanups.push(...cb);
|
|
48
46
|
return this;
|
|
49
47
|
}
|
|
50
48
|
clear() {
|
|
@@ -53,6 +51,7 @@ var SubscriptionList = class {
|
|
|
53
51
|
}
|
|
54
52
|
};
|
|
55
53
|
var SubscriptionSet = class {
|
|
54
|
+
_cleanupMap;
|
|
56
55
|
constructor(keyProjection) {
|
|
57
56
|
this._cleanupMap = new ComplexMap(keyProjection);
|
|
58
57
|
}
|
|
@@ -67,29 +66,55 @@ var SubscriptionSet = class {
|
|
|
67
66
|
};
|
|
68
67
|
|
|
69
68
|
// src/debounce.ts
|
|
70
|
-
var
|
|
69
|
+
var delay = (cb, delay2 = 100) => {
|
|
70
|
+
let pending = false;
|
|
71
|
+
return (...args) => {
|
|
72
|
+
if (pending) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
pending = true;
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
try {
|
|
78
|
+
cb(...args);
|
|
79
|
+
} finally {
|
|
80
|
+
pending = false;
|
|
81
|
+
}
|
|
82
|
+
}, delay2);
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
var debounce = (cb, delay2 = 100) => {
|
|
71
86
|
let t;
|
|
72
87
|
return (...args) => {
|
|
73
88
|
clearTimeout(t);
|
|
74
|
-
t = setTimeout(() => cb(...args),
|
|
89
|
+
t = setTimeout(() => cb(...args), delay2);
|
|
75
90
|
};
|
|
76
91
|
};
|
|
77
|
-
var throttle = (cb,
|
|
92
|
+
var throttle = (cb, delay2 = 100) => {
|
|
78
93
|
let lastCall = 0;
|
|
79
94
|
return (...args) => {
|
|
80
95
|
const now = Date.now();
|
|
81
|
-
if (now - lastCall >=
|
|
96
|
+
if (now - lastCall >= delay2) {
|
|
82
97
|
cb(...args);
|
|
83
98
|
lastCall = now;
|
|
84
99
|
}
|
|
85
100
|
};
|
|
86
101
|
};
|
|
87
|
-
var debounceAndThrottle = (cb,
|
|
88
|
-
|
|
89
|
-
|
|
102
|
+
var debounceAndThrottle = (cb, delay2 = 100) => {
|
|
103
|
+
let timeout2;
|
|
104
|
+
let lastCall = 0;
|
|
90
105
|
return (...args) => {
|
|
91
|
-
|
|
92
|
-
|
|
106
|
+
const now = Date.now();
|
|
107
|
+
const delta = now - lastCall;
|
|
108
|
+
clearTimeout(timeout2);
|
|
109
|
+
if (delta >= delay2) {
|
|
110
|
+
cb(...args);
|
|
111
|
+
lastCall = now;
|
|
112
|
+
} else {
|
|
113
|
+
timeout2 = setTimeout(() => {
|
|
114
|
+
cb(...args);
|
|
115
|
+
lastCall = Date.now();
|
|
116
|
+
}, delay2 - delta);
|
|
117
|
+
}
|
|
93
118
|
};
|
|
94
119
|
};
|
|
95
120
|
|
|
@@ -143,6 +168,9 @@ var sleepWithContext = (ctx, ms) => {
|
|
|
143
168
|
};
|
|
144
169
|
var asyncReturn = () => sleep(0);
|
|
145
170
|
var asyncTimeout = async (promise, timeout2, err) => {
|
|
171
|
+
if (typeof promise === "function") {
|
|
172
|
+
throw new Error("First argument must be a promise.");
|
|
173
|
+
}
|
|
146
174
|
let timeoutId;
|
|
147
175
|
const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
|
|
148
176
|
const timeoutPromise = new Promise((resolve, reject) => {
|
|
@@ -151,9 +179,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
|
|
|
151
179
|
}, timeout2);
|
|
152
180
|
unrefTimeout(timeoutId);
|
|
153
181
|
});
|
|
154
|
-
const conditionTimeout = typeof promise === "function" ? promiseFromCallback(promise) : promise;
|
|
155
182
|
return await Promise.race([
|
|
156
|
-
|
|
183
|
+
promise,
|
|
157
184
|
timeoutPromise
|
|
158
185
|
]).finally(() => {
|
|
159
186
|
clearTimeout(timeoutId);
|
|
@@ -193,10 +220,6 @@ import { Context } from "@dxos/context";
|
|
|
193
220
|
var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
|
|
194
221
|
var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
|
|
195
222
|
var Event = class _Event {
|
|
196
|
-
constructor() {
|
|
197
|
-
this._listeners = /* @__PURE__ */ new Set();
|
|
198
|
-
this._effects = /* @__PURE__ */ new Set();
|
|
199
|
-
}
|
|
200
223
|
/**
|
|
201
224
|
* Wrap objects that have on/off style event emitters.
|
|
202
225
|
*/
|
|
@@ -209,6 +232,8 @@ var Event = class _Event {
|
|
|
209
232
|
});
|
|
210
233
|
return event;
|
|
211
234
|
}
|
|
235
|
+
_listeners = /* @__PURE__ */ new Set();
|
|
236
|
+
_effects = /* @__PURE__ */ new Set();
|
|
212
237
|
/**
|
|
213
238
|
* Emit an event.
|
|
214
239
|
* In most cases should only be called by the class or entity containing the event.
|
|
@@ -452,11 +477,15 @@ var Event = class _Event {
|
|
|
452
477
|
}
|
|
453
478
|
};
|
|
454
479
|
var EventListener = class {
|
|
480
|
+
ctx;
|
|
481
|
+
once;
|
|
482
|
+
weak;
|
|
483
|
+
callback;
|
|
484
|
+
_clearDispose = void 0;
|
|
455
485
|
constructor(event, listener, ctx, once, weak) {
|
|
456
486
|
this.ctx = ctx;
|
|
457
487
|
this.once = once;
|
|
458
488
|
this.weak = weak;
|
|
459
|
-
this._clearDispose = void 0;
|
|
460
489
|
this._clearDispose = ctx.onDispose(() => {
|
|
461
490
|
event._removeListener(this);
|
|
462
491
|
});
|
|
@@ -520,11 +549,9 @@ var weakListeners = () => {
|
|
|
520
549
|
import "@dxos/util";
|
|
521
550
|
import { warnAfterTimeout } from "@dxos/debug";
|
|
522
551
|
var Mutex = class {
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
this._tag = null;
|
|
527
|
-
}
|
|
552
|
+
_queue = Promise.resolve();
|
|
553
|
+
_queueLength = 0;
|
|
554
|
+
_tag = null;
|
|
528
555
|
get tag() {
|
|
529
556
|
return this._tag;
|
|
530
557
|
}
|
|
@@ -570,6 +597,7 @@ var Mutex = class {
|
|
|
570
597
|
}
|
|
571
598
|
};
|
|
572
599
|
var MutexGuard = class {
|
|
600
|
+
_release;
|
|
573
601
|
constructor(_release) {
|
|
574
602
|
this._release = _release;
|
|
575
603
|
}
|
|
@@ -583,7 +611,7 @@ var MutexGuard = class {
|
|
|
583
611
|
this.release();
|
|
584
612
|
}
|
|
585
613
|
};
|
|
586
|
-
var classMutexSymbol = Symbol("class-mutex");
|
|
614
|
+
var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
|
|
587
615
|
var FORCE_DISABLE_WARNING = false;
|
|
588
616
|
var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
|
|
589
617
|
var synchronized = (target, propertyName, descriptor) => {
|
|
@@ -630,18 +658,22 @@ var trigger = (timeout2) => {
|
|
|
630
658
|
resolver
|
|
631
659
|
];
|
|
632
660
|
};
|
|
633
|
-
var TriggerState = /* @__PURE__ */ function(TriggerState2) {
|
|
661
|
+
var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
|
|
634
662
|
TriggerState2["WAITING"] = "WAITING";
|
|
635
663
|
TriggerState2["RESOLVED"] = "RESOLVED";
|
|
636
664
|
TriggerState2["REJECTED"] = "REJECTED";
|
|
637
665
|
return TriggerState2;
|
|
638
|
-
}({});
|
|
666
|
+
})({});
|
|
639
667
|
var Trigger = class {
|
|
668
|
+
_options;
|
|
669
|
+
_promise;
|
|
670
|
+
_resolve;
|
|
671
|
+
_reject;
|
|
672
|
+
_state = "WAITING";
|
|
640
673
|
constructor(_options = {
|
|
641
674
|
autoReset: false
|
|
642
675
|
}) {
|
|
643
676
|
this._options = _options;
|
|
644
|
-
this._state = "WAITING";
|
|
645
677
|
this.reset();
|
|
646
678
|
}
|
|
647
679
|
get state() {
|
|
@@ -750,20 +782,12 @@ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
|
750
782
|
|
|
751
783
|
// src/observable.ts
|
|
752
784
|
var MulticastObservable = class _MulticastObservable extends Observable {
|
|
785
|
+
_value;
|
|
786
|
+
_observers = /* @__PURE__ */ new Set();
|
|
787
|
+
_observable;
|
|
788
|
+
_completed = new Trigger();
|
|
753
789
|
constructor(subscriber, _value) {
|
|
754
|
-
super((observer) => this._subscribe(observer)), this._value = _value
|
|
755
|
-
next: (value) => {
|
|
756
|
-
this._value = value;
|
|
757
|
-
this._observers.forEach((observer) => observer.next?.(value));
|
|
758
|
-
},
|
|
759
|
-
error: (err) => {
|
|
760
|
-
this._observers.forEach((observer) => observer.error?.(err));
|
|
761
|
-
},
|
|
762
|
-
complete: () => {
|
|
763
|
-
this._completed.wake();
|
|
764
|
-
this._observers.forEach((observer) => observer.complete?.());
|
|
765
|
-
}
|
|
766
|
-
};
|
|
790
|
+
super((observer) => this._subscribe(observer)), this._value = _value;
|
|
767
791
|
this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
|
|
768
792
|
this._observable.subscribe(this._handlers);
|
|
769
793
|
}
|
|
@@ -847,18 +871,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
|
|
|
847
871
|
this._observers.delete(observer);
|
|
848
872
|
};
|
|
849
873
|
}
|
|
874
|
+
_handlers = {
|
|
875
|
+
next: (value) => {
|
|
876
|
+
this._value = value;
|
|
877
|
+
this._observers.forEach((observer) => observer.next?.(value));
|
|
878
|
+
},
|
|
879
|
+
error: (err) => {
|
|
880
|
+
this._observers.forEach((observer) => observer.error?.(err));
|
|
881
|
+
},
|
|
882
|
+
complete: () => {
|
|
883
|
+
this._completed.wake();
|
|
884
|
+
this._observers.forEach((observer) => observer.complete?.());
|
|
885
|
+
}
|
|
886
|
+
};
|
|
850
887
|
};
|
|
851
888
|
var EMPTY_OBSERVABLE = MulticastObservable.of(null);
|
|
852
889
|
|
|
853
890
|
// src/observable-value.ts
|
|
854
891
|
import { createSetDispatch } from "@dxos/util";
|
|
855
892
|
var ObservableProvider = class {
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
this.
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
}
|
|
893
|
+
_handlers = /* @__PURE__ */ new Set();
|
|
894
|
+
_proxy = createSetDispatch({
|
|
895
|
+
handlers: this._handlers
|
|
896
|
+
});
|
|
897
|
+
_value;
|
|
862
898
|
/**
|
|
863
899
|
* Proxy used to dispatch callbacks to each subscription.
|
|
864
900
|
*/
|
|
@@ -879,8 +915,10 @@ var ObservableProvider = class {
|
|
|
879
915
|
}
|
|
880
916
|
};
|
|
881
917
|
var CancellableObservableProvider = class extends ObservableProvider {
|
|
918
|
+
_handleCancel;
|
|
919
|
+
_cancelled = false;
|
|
882
920
|
constructor(_handleCancel) {
|
|
883
|
-
super(), this._handleCancel = _handleCancel
|
|
921
|
+
super(), this._handleCancel = _handleCancel;
|
|
884
922
|
}
|
|
885
923
|
get cancelled() {
|
|
886
924
|
return this._cancelled;
|
|
@@ -901,7 +939,7 @@ import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
|
|
|
901
939
|
import { log as log2 } from "@dxos/log";
|
|
902
940
|
|
|
903
941
|
// src/task-scheduling.ts
|
|
904
|
-
import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
942
|
+
import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
905
943
|
import { StackTrace as StackTrace2 } from "@dxos/debug";
|
|
906
944
|
|
|
907
945
|
// src/track-leaks.ts
|
|
@@ -910,7 +948,7 @@ import { log } from "@dxos/log";
|
|
|
910
948
|
var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
|
|
911
949
|
var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
|
|
912
950
|
var openResources = /* @__PURE__ */ new Set();
|
|
913
|
-
var handleSymbol = Symbol("checkLeaksHandle");
|
|
951
|
+
var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
|
|
914
952
|
var trackResource = (resourceProvider) => {
|
|
915
953
|
if (!enabled) {
|
|
916
954
|
return () => {
|
|
@@ -989,13 +1027,16 @@ if (enabled) {
|
|
|
989
1027
|
}
|
|
990
1028
|
|
|
991
1029
|
// src/task-scheduling.ts
|
|
1030
|
+
var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/task-scheduling.ts";
|
|
992
1031
|
var DeferredTask = class {
|
|
1032
|
+
_ctx;
|
|
1033
|
+
_callback;
|
|
1034
|
+
_scheduled = false;
|
|
1035
|
+
_currentTask = null;
|
|
1036
|
+
_nextTask = new Trigger();
|
|
993
1037
|
constructor(_ctx, _callback) {
|
|
994
1038
|
this._ctx = _ctx;
|
|
995
1039
|
this._callback = _callback;
|
|
996
|
-
this._scheduled = false;
|
|
997
|
-
this._currentTask = null;
|
|
998
|
-
this._nextTask = new Trigger();
|
|
999
1040
|
}
|
|
1000
1041
|
get scheduled() {
|
|
1001
1042
|
return this._scheduled;
|
|
@@ -1036,6 +1077,82 @@ var DeferredTask = class {
|
|
|
1036
1077
|
await this._currentTask;
|
|
1037
1078
|
}
|
|
1038
1079
|
};
|
|
1080
|
+
var AsyncTask = class {
|
|
1081
|
+
#callback;
|
|
1082
|
+
#ctx = void 0;
|
|
1083
|
+
#scheduled = false;
|
|
1084
|
+
#currentTask = null;
|
|
1085
|
+
#nextTask = new Trigger();
|
|
1086
|
+
constructor(callback) {
|
|
1087
|
+
this.#callback = callback;
|
|
1088
|
+
}
|
|
1089
|
+
get scheduled() {
|
|
1090
|
+
return this.#scheduled;
|
|
1091
|
+
}
|
|
1092
|
+
/**
|
|
1093
|
+
* Context of the resource that owns the task.
|
|
1094
|
+
* When the context is disposed, the task is cancelled and cannot be scheduled again.
|
|
1095
|
+
*/
|
|
1096
|
+
open() {
|
|
1097
|
+
this.#ctx = new Context2(void 0, {
|
|
1098
|
+
F: __dxlog_file4,
|
|
1099
|
+
L: 102
|
|
1100
|
+
});
|
|
1101
|
+
}
|
|
1102
|
+
/**
|
|
1103
|
+
* Closes the task and waits for it to finish if it is running.
|
|
1104
|
+
*/
|
|
1105
|
+
async close() {
|
|
1106
|
+
await this.#ctx?.dispose();
|
|
1107
|
+
await this.join();
|
|
1108
|
+
this.#ctx = void 0;
|
|
1109
|
+
}
|
|
1110
|
+
[Symbol.asyncDispose]() {
|
|
1111
|
+
return this.close();
|
|
1112
|
+
}
|
|
1113
|
+
/**
|
|
1114
|
+
* Schedule the task to run asynchronously.
|
|
1115
|
+
*/
|
|
1116
|
+
// TODO(dmaretskyi): Add scheduleAt. Where the earlier time will override the later one.
|
|
1117
|
+
schedule() {
|
|
1118
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1119
|
+
throw new Error("AsyncTask not open");
|
|
1120
|
+
}
|
|
1121
|
+
if (this.#scheduled) {
|
|
1122
|
+
return;
|
|
1123
|
+
}
|
|
1124
|
+
scheduleTask(this.#ctx, async () => {
|
|
1125
|
+
await this.#currentTask;
|
|
1126
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1127
|
+
return;
|
|
1128
|
+
}
|
|
1129
|
+
this.#scheduled = false;
|
|
1130
|
+
const completionTrigger = this.#nextTask;
|
|
1131
|
+
this.#nextTask = new Trigger();
|
|
1132
|
+
this.#currentTask = runInContextAsync(this.#ctx, () => this.#callback()).then(() => {
|
|
1133
|
+
completionTrigger.wake();
|
|
1134
|
+
});
|
|
1135
|
+
});
|
|
1136
|
+
this.#scheduled = true;
|
|
1137
|
+
}
|
|
1138
|
+
/**
|
|
1139
|
+
* Schedule the task to run and wait for it to finish.
|
|
1140
|
+
*/
|
|
1141
|
+
async runBlocking() {
|
|
1142
|
+
if (this.#ctx?.disposed) {
|
|
1143
|
+
throw new ContextDisposedError2();
|
|
1144
|
+
}
|
|
1145
|
+
this.schedule();
|
|
1146
|
+
await this.#nextTask.wait();
|
|
1147
|
+
}
|
|
1148
|
+
/**
|
|
1149
|
+
* Waits for the current task to finish if it is running.
|
|
1150
|
+
* Does not schedule a new task.
|
|
1151
|
+
*/
|
|
1152
|
+
async join() {
|
|
1153
|
+
await this.#currentTask;
|
|
1154
|
+
}
|
|
1155
|
+
};
|
|
1039
1156
|
var runInContext = (ctx, fn) => {
|
|
1040
1157
|
try {
|
|
1041
1158
|
fn();
|
|
@@ -1121,15 +1238,19 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
1121
1238
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1122
1239
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1123
1240
|
}
|
|
1124
|
-
var
|
|
1241
|
+
var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
|
|
1125
1242
|
var INIT_RESTART_DELAY = 100;
|
|
1126
1243
|
var DEFAULT_MAX_RESTART_DELAY = 5e3;
|
|
1127
1244
|
var PersistentLifecycle = class extends Resource {
|
|
1245
|
+
_start;
|
|
1246
|
+
_stop;
|
|
1247
|
+
_onRestart;
|
|
1248
|
+
_maxRestartDelay;
|
|
1249
|
+
_currentState = void 0;
|
|
1250
|
+
_restartTask = void 0;
|
|
1251
|
+
_restartAfter = 0;
|
|
1128
1252
|
constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
|
|
1129
1253
|
super();
|
|
1130
|
-
this._currentState = void 0;
|
|
1131
|
-
this._restartTask = void 0;
|
|
1132
|
-
this._restartAfter = 0;
|
|
1133
1254
|
this._start = start;
|
|
1134
1255
|
this._stop = stop;
|
|
1135
1256
|
this._onRestart = onRestart;
|
|
@@ -1146,7 +1267,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1146
1267
|
log2.warn("Restart failed", {
|
|
1147
1268
|
err
|
|
1148
1269
|
}, {
|
|
1149
|
-
F:
|
|
1270
|
+
F: __dxlog_file5,
|
|
1150
1271
|
L: 72,
|
|
1151
1272
|
S: this,
|
|
1152
1273
|
C: (f, a) => f(...a)
|
|
@@ -1158,7 +1279,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1158
1279
|
log2.warn("Start failed", {
|
|
1159
1280
|
err
|
|
1160
1281
|
}, {
|
|
1161
|
-
F:
|
|
1282
|
+
F: __dxlog_file5,
|
|
1162
1283
|
L: 78,
|
|
1163
1284
|
S: this,
|
|
1164
1285
|
C: (f, a) => f(...a)
|
|
@@ -1176,7 +1297,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1176
1297
|
log2(`restarting in ${this._restartAfter}ms`, {
|
|
1177
1298
|
state: this._lifecycleState
|
|
1178
1299
|
}, {
|
|
1179
|
-
F:
|
|
1300
|
+
F: __dxlog_file5,
|
|
1180
1301
|
L: 91,
|
|
1181
1302
|
S: this,
|
|
1182
1303
|
C: (f, a) => f(...a)
|
|
@@ -1199,7 +1320,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1199
1320
|
await this._stop(this._currentState);
|
|
1200
1321
|
} catch (err) {
|
|
1201
1322
|
log2.catch(err, void 0, {
|
|
1202
|
-
F:
|
|
1323
|
+
F: __dxlog_file5,
|
|
1203
1324
|
L: 113,
|
|
1204
1325
|
S: this,
|
|
1205
1326
|
C: (f, a) => f(...a)
|
|
@@ -1227,7 +1348,7 @@ _ts_decorate([
|
|
|
1227
1348
|
|
|
1228
1349
|
// src/push-iterable.ts
|
|
1229
1350
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
1230
|
-
var
|
|
1351
|
+
var __dxlog_file6 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
|
|
1231
1352
|
var makePushIterable = () => {
|
|
1232
1353
|
const buf = [];
|
|
1233
1354
|
const trigger2 = new Trigger({
|
|
@@ -1242,7 +1363,7 @@ var makePushIterable = () => {
|
|
|
1242
1363
|
}
|
|
1243
1364
|
const item = buf.shift();
|
|
1244
1365
|
invariant2(item, void 0, {
|
|
1245
|
-
F:
|
|
1366
|
+
F: __dxlog_file6,
|
|
1246
1367
|
L: 42,
|
|
1247
1368
|
S: this,
|
|
1248
1369
|
A: [
|
|
@@ -1336,11 +1457,6 @@ var streamToArray = (stream) => {
|
|
|
1336
1457
|
// src/test-stream.ts
|
|
1337
1458
|
import { Duplex } from "node:stream";
|
|
1338
1459
|
var TestStream = class extends Duplex {
|
|
1339
|
-
constructor() {
|
|
1340
|
-
super(...arguments);
|
|
1341
|
-
this._received = Buffer.alloc(0);
|
|
1342
|
-
this._onWrite = new Event();
|
|
1343
|
-
}
|
|
1344
1460
|
static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
|
|
1345
1461
|
stream1.push("ping");
|
|
1346
1462
|
stream2.push("pong");
|
|
@@ -1353,6 +1469,8 @@ var TestStream = class extends Duplex {
|
|
|
1353
1469
|
})
|
|
1354
1470
|
]);
|
|
1355
1471
|
}
|
|
1472
|
+
_received = Buffer.alloc(0);
|
|
1473
|
+
_onWrite = new Event();
|
|
1356
1474
|
_write(chunk, encoding, callback) {
|
|
1357
1475
|
this._received = Buffer.concat([
|
|
1358
1476
|
this._received,
|
|
@@ -1430,10 +1548,12 @@ var untilError = (cb) => {
|
|
|
1430
1548
|
|
|
1431
1549
|
// src/timer.ts
|
|
1432
1550
|
var Timer = class {
|
|
1551
|
+
_callback;
|
|
1552
|
+
_state = new Event();
|
|
1553
|
+
_timer;
|
|
1554
|
+
_count = 0;
|
|
1433
1555
|
constructor(_callback) {
|
|
1434
1556
|
this._callback = _callback;
|
|
1435
|
-
this._state = new Event();
|
|
1436
|
-
this._count = 0;
|
|
1437
1557
|
}
|
|
1438
1558
|
get state() {
|
|
1439
1559
|
return this._state;
|
|
@@ -1479,13 +1599,20 @@ var Timer = class {
|
|
|
1479
1599
|
// src/update-scheduler.ts
|
|
1480
1600
|
var TIME_PERIOD = 1e3;
|
|
1481
1601
|
var UpdateScheduler = class {
|
|
1602
|
+
_ctx;
|
|
1603
|
+
_callback;
|
|
1604
|
+
_params;
|
|
1605
|
+
/**
|
|
1606
|
+
* Promise that resolves when the callback is done.
|
|
1607
|
+
* Never rejects.
|
|
1608
|
+
*/
|
|
1609
|
+
_promise = null;
|
|
1610
|
+
_scheduled = false;
|
|
1611
|
+
_lastUpdateTime = -TIME_PERIOD;
|
|
1482
1612
|
constructor(_ctx, _callback, _params = {}) {
|
|
1483
1613
|
this._ctx = _ctx;
|
|
1484
1614
|
this._callback = _callback;
|
|
1485
1615
|
this._params = _params;
|
|
1486
|
-
this._promise = null;
|
|
1487
|
-
this._scheduled = false;
|
|
1488
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1489
1616
|
_ctx.onDispose(async () => {
|
|
1490
1617
|
await this._promise;
|
|
1491
1618
|
});
|
|
@@ -1498,13 +1625,13 @@ var UpdateScheduler = class {
|
|
|
1498
1625
|
await this._promise;
|
|
1499
1626
|
if (this._params.maxFrequency) {
|
|
1500
1627
|
const now = performance.now();
|
|
1501
|
-
const
|
|
1502
|
-
if (
|
|
1628
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1629
|
+
if (delay2 > 0) {
|
|
1503
1630
|
await new Promise((resolve) => {
|
|
1504
1631
|
const timeoutId = setTimeout(() => {
|
|
1505
1632
|
clearContext();
|
|
1506
1633
|
resolve();
|
|
1507
|
-
},
|
|
1634
|
+
}, delay2);
|
|
1508
1635
|
const clearContext = this._ctx.onDispose(() => {
|
|
1509
1636
|
clearTimeout(timeoutId);
|
|
1510
1637
|
resolve();
|
|
@@ -1548,6 +1675,7 @@ var UpdateScheduler = class {
|
|
|
1548
1675
|
}
|
|
1549
1676
|
};
|
|
1550
1677
|
export {
|
|
1678
|
+
AsyncTask,
|
|
1551
1679
|
CancellableObservableProvider,
|
|
1552
1680
|
DeferredTask,
|
|
1553
1681
|
Event,
|
|
@@ -1574,6 +1702,7 @@ export {
|
|
|
1574
1702
|
combine,
|
|
1575
1703
|
debounce,
|
|
1576
1704
|
debounceAndThrottle,
|
|
1705
|
+
delay,
|
|
1577
1706
|
dumpLeaks,
|
|
1578
1707
|
interval,
|
|
1579
1708
|
latch,
|