@dxos/async 0.8.4-main.c1de068 → 0.8.4-main.c85a9c8dae
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 +204 -77
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +204 -77
- 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/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
|
@@ -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":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":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":104482},"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":1486},"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":43973}}}
|
|
@@ -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
|
|
|
@@ -193,10 +218,6 @@ import { Context } from "@dxos/context";
|
|
|
193
218
|
var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
|
|
194
219
|
var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
|
|
195
220
|
var Event = class _Event {
|
|
196
|
-
constructor() {
|
|
197
|
-
this._listeners = /* @__PURE__ */ new Set();
|
|
198
|
-
this._effects = /* @__PURE__ */ new Set();
|
|
199
|
-
}
|
|
200
221
|
/**
|
|
201
222
|
* Wrap objects that have on/off style event emitters.
|
|
202
223
|
*/
|
|
@@ -209,6 +230,8 @@ var Event = class _Event {
|
|
|
209
230
|
});
|
|
210
231
|
return event;
|
|
211
232
|
}
|
|
233
|
+
_listeners = /* @__PURE__ */ new Set();
|
|
234
|
+
_effects = /* @__PURE__ */ new Set();
|
|
212
235
|
/**
|
|
213
236
|
* Emit an event.
|
|
214
237
|
* In most cases should only be called by the class or entity containing the event.
|
|
@@ -452,11 +475,15 @@ var Event = class _Event {
|
|
|
452
475
|
}
|
|
453
476
|
};
|
|
454
477
|
var EventListener = class {
|
|
478
|
+
ctx;
|
|
479
|
+
once;
|
|
480
|
+
weak;
|
|
481
|
+
callback;
|
|
482
|
+
_clearDispose = void 0;
|
|
455
483
|
constructor(event, listener, ctx, once, weak) {
|
|
456
484
|
this.ctx = ctx;
|
|
457
485
|
this.once = once;
|
|
458
486
|
this.weak = weak;
|
|
459
|
-
this._clearDispose = void 0;
|
|
460
487
|
this._clearDispose = ctx.onDispose(() => {
|
|
461
488
|
event._removeListener(this);
|
|
462
489
|
});
|
|
@@ -520,11 +547,9 @@ var weakListeners = () => {
|
|
|
520
547
|
import "@dxos/util";
|
|
521
548
|
import { warnAfterTimeout } from "@dxos/debug";
|
|
522
549
|
var Mutex = class {
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
this._tag = null;
|
|
527
|
-
}
|
|
550
|
+
_queue = Promise.resolve();
|
|
551
|
+
_queueLength = 0;
|
|
552
|
+
_tag = null;
|
|
528
553
|
get tag() {
|
|
529
554
|
return this._tag;
|
|
530
555
|
}
|
|
@@ -570,6 +595,7 @@ var Mutex = class {
|
|
|
570
595
|
}
|
|
571
596
|
};
|
|
572
597
|
var MutexGuard = class {
|
|
598
|
+
_release;
|
|
573
599
|
constructor(_release) {
|
|
574
600
|
this._release = _release;
|
|
575
601
|
}
|
|
@@ -583,7 +609,7 @@ var MutexGuard = class {
|
|
|
583
609
|
this.release();
|
|
584
610
|
}
|
|
585
611
|
};
|
|
586
|
-
var classMutexSymbol = Symbol("class-mutex");
|
|
612
|
+
var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
|
|
587
613
|
var FORCE_DISABLE_WARNING = false;
|
|
588
614
|
var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
|
|
589
615
|
var synchronized = (target, propertyName, descriptor) => {
|
|
@@ -630,18 +656,22 @@ var trigger = (timeout2) => {
|
|
|
630
656
|
resolver
|
|
631
657
|
];
|
|
632
658
|
};
|
|
633
|
-
var TriggerState = /* @__PURE__ */ function(TriggerState2) {
|
|
659
|
+
var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
|
|
634
660
|
TriggerState2["WAITING"] = "WAITING";
|
|
635
661
|
TriggerState2["RESOLVED"] = "RESOLVED";
|
|
636
662
|
TriggerState2["REJECTED"] = "REJECTED";
|
|
637
663
|
return TriggerState2;
|
|
638
|
-
}({});
|
|
664
|
+
})({});
|
|
639
665
|
var Trigger = class {
|
|
666
|
+
_options;
|
|
667
|
+
_promise;
|
|
668
|
+
_resolve;
|
|
669
|
+
_reject;
|
|
670
|
+
_state = "WAITING";
|
|
640
671
|
constructor(_options = {
|
|
641
672
|
autoReset: false
|
|
642
673
|
}) {
|
|
643
674
|
this._options = _options;
|
|
644
|
-
this._state = "WAITING";
|
|
645
675
|
this.reset();
|
|
646
676
|
}
|
|
647
677
|
get state() {
|
|
@@ -750,20 +780,12 @@ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
|
750
780
|
|
|
751
781
|
// src/observable.ts
|
|
752
782
|
var MulticastObservable = class _MulticastObservable extends Observable {
|
|
783
|
+
_value;
|
|
784
|
+
_observers = /* @__PURE__ */ new Set();
|
|
785
|
+
_observable;
|
|
786
|
+
_completed = new Trigger();
|
|
753
787
|
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
|
-
};
|
|
788
|
+
super((observer) => this._subscribe(observer)), this._value = _value;
|
|
767
789
|
this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
|
|
768
790
|
this._observable.subscribe(this._handlers);
|
|
769
791
|
}
|
|
@@ -847,18 +869,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
|
|
|
847
869
|
this._observers.delete(observer);
|
|
848
870
|
};
|
|
849
871
|
}
|
|
872
|
+
_handlers = {
|
|
873
|
+
next: (value) => {
|
|
874
|
+
this._value = value;
|
|
875
|
+
this._observers.forEach((observer) => observer.next?.(value));
|
|
876
|
+
},
|
|
877
|
+
error: (err) => {
|
|
878
|
+
this._observers.forEach((observer) => observer.error?.(err));
|
|
879
|
+
},
|
|
880
|
+
complete: () => {
|
|
881
|
+
this._completed.wake();
|
|
882
|
+
this._observers.forEach((observer) => observer.complete?.());
|
|
883
|
+
}
|
|
884
|
+
};
|
|
850
885
|
};
|
|
851
886
|
var EMPTY_OBSERVABLE = MulticastObservable.of(null);
|
|
852
887
|
|
|
853
888
|
// src/observable-value.ts
|
|
854
889
|
import { createSetDispatch } from "@dxos/util";
|
|
855
890
|
var ObservableProvider = class {
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
this.
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
}
|
|
891
|
+
_handlers = /* @__PURE__ */ new Set();
|
|
892
|
+
_proxy = createSetDispatch({
|
|
893
|
+
handlers: this._handlers
|
|
894
|
+
});
|
|
895
|
+
_value;
|
|
862
896
|
/**
|
|
863
897
|
* Proxy used to dispatch callbacks to each subscription.
|
|
864
898
|
*/
|
|
@@ -879,8 +913,10 @@ var ObservableProvider = class {
|
|
|
879
913
|
}
|
|
880
914
|
};
|
|
881
915
|
var CancellableObservableProvider = class extends ObservableProvider {
|
|
916
|
+
_handleCancel;
|
|
917
|
+
_cancelled = false;
|
|
882
918
|
constructor(_handleCancel) {
|
|
883
|
-
super(), this._handleCancel = _handleCancel
|
|
919
|
+
super(), this._handleCancel = _handleCancel;
|
|
884
920
|
}
|
|
885
921
|
get cancelled() {
|
|
886
922
|
return this._cancelled;
|
|
@@ -901,7 +937,7 @@ import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
|
|
|
901
937
|
import { log as log2 } from "@dxos/log";
|
|
902
938
|
|
|
903
939
|
// src/task-scheduling.ts
|
|
904
|
-
import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
940
|
+
import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
905
941
|
import { StackTrace as StackTrace2 } from "@dxos/debug";
|
|
906
942
|
|
|
907
943
|
// src/track-leaks.ts
|
|
@@ -910,7 +946,7 @@ import { log } from "@dxos/log";
|
|
|
910
946
|
var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
|
|
911
947
|
var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
|
|
912
948
|
var openResources = /* @__PURE__ */ new Set();
|
|
913
|
-
var handleSymbol = Symbol("checkLeaksHandle");
|
|
949
|
+
var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
|
|
914
950
|
var trackResource = (resourceProvider) => {
|
|
915
951
|
if (!enabled) {
|
|
916
952
|
return () => {
|
|
@@ -989,13 +1025,16 @@ if (enabled) {
|
|
|
989
1025
|
}
|
|
990
1026
|
|
|
991
1027
|
// src/task-scheduling.ts
|
|
1028
|
+
var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/task-scheduling.ts";
|
|
992
1029
|
var DeferredTask = class {
|
|
1030
|
+
_ctx;
|
|
1031
|
+
_callback;
|
|
1032
|
+
_scheduled = false;
|
|
1033
|
+
_currentTask = null;
|
|
1034
|
+
_nextTask = new Trigger();
|
|
993
1035
|
constructor(_ctx, _callback) {
|
|
994
1036
|
this._ctx = _ctx;
|
|
995
1037
|
this._callback = _callback;
|
|
996
|
-
this._scheduled = false;
|
|
997
|
-
this._currentTask = null;
|
|
998
|
-
this._nextTask = new Trigger();
|
|
999
1038
|
}
|
|
1000
1039
|
get scheduled() {
|
|
1001
1040
|
return this._scheduled;
|
|
@@ -1036,6 +1075,82 @@ var DeferredTask = class {
|
|
|
1036
1075
|
await this._currentTask;
|
|
1037
1076
|
}
|
|
1038
1077
|
};
|
|
1078
|
+
var AsyncTask = class {
|
|
1079
|
+
#callback;
|
|
1080
|
+
#ctx = void 0;
|
|
1081
|
+
#scheduled = false;
|
|
1082
|
+
#currentTask = null;
|
|
1083
|
+
#nextTask = new Trigger();
|
|
1084
|
+
constructor(callback) {
|
|
1085
|
+
this.#callback = callback;
|
|
1086
|
+
}
|
|
1087
|
+
get scheduled() {
|
|
1088
|
+
return this.#scheduled;
|
|
1089
|
+
}
|
|
1090
|
+
/**
|
|
1091
|
+
* Context of the resource that owns the task.
|
|
1092
|
+
* When the context is disposed, the task is cancelled and cannot be scheduled again.
|
|
1093
|
+
*/
|
|
1094
|
+
open() {
|
|
1095
|
+
this.#ctx = new Context2(void 0, {
|
|
1096
|
+
F: __dxlog_file4,
|
|
1097
|
+
L: 102
|
|
1098
|
+
});
|
|
1099
|
+
}
|
|
1100
|
+
/**
|
|
1101
|
+
* Closes the task and waits for it to finish if it is running.
|
|
1102
|
+
*/
|
|
1103
|
+
async close() {
|
|
1104
|
+
await this.#ctx?.dispose();
|
|
1105
|
+
await this.join();
|
|
1106
|
+
this.#ctx = void 0;
|
|
1107
|
+
}
|
|
1108
|
+
[Symbol.asyncDispose]() {
|
|
1109
|
+
return this.close();
|
|
1110
|
+
}
|
|
1111
|
+
/**
|
|
1112
|
+
* Schedule the task to run asynchronously.
|
|
1113
|
+
*/
|
|
1114
|
+
// TODO(dmaretskyi): Add scheduleAt. Where the earlier time will override the later one.
|
|
1115
|
+
schedule() {
|
|
1116
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1117
|
+
throw new Error("AsyncTask not open");
|
|
1118
|
+
}
|
|
1119
|
+
if (this.#scheduled) {
|
|
1120
|
+
return;
|
|
1121
|
+
}
|
|
1122
|
+
scheduleTask(this.#ctx, async () => {
|
|
1123
|
+
await this.#currentTask;
|
|
1124
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1125
|
+
return;
|
|
1126
|
+
}
|
|
1127
|
+
this.#scheduled = false;
|
|
1128
|
+
const completionTrigger = this.#nextTask;
|
|
1129
|
+
this.#nextTask = new Trigger();
|
|
1130
|
+
this.#currentTask = runInContextAsync(this.#ctx, () => this.#callback()).then(() => {
|
|
1131
|
+
completionTrigger.wake();
|
|
1132
|
+
});
|
|
1133
|
+
});
|
|
1134
|
+
this.#scheduled = true;
|
|
1135
|
+
}
|
|
1136
|
+
/**
|
|
1137
|
+
* Schedule the task to run and wait for it to finish.
|
|
1138
|
+
*/
|
|
1139
|
+
async runBlocking() {
|
|
1140
|
+
if (this.#ctx?.disposed) {
|
|
1141
|
+
throw new ContextDisposedError2();
|
|
1142
|
+
}
|
|
1143
|
+
this.schedule();
|
|
1144
|
+
await this.#nextTask.wait();
|
|
1145
|
+
}
|
|
1146
|
+
/**
|
|
1147
|
+
* Waits for the current task to finish if it is running.
|
|
1148
|
+
* Does not schedule a new task.
|
|
1149
|
+
*/
|
|
1150
|
+
async join() {
|
|
1151
|
+
await this.#currentTask;
|
|
1152
|
+
}
|
|
1153
|
+
};
|
|
1039
1154
|
var runInContext = (ctx, fn) => {
|
|
1040
1155
|
try {
|
|
1041
1156
|
fn();
|
|
@@ -1121,15 +1236,19 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
1121
1236
|
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
1237
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1123
1238
|
}
|
|
1124
|
-
var
|
|
1239
|
+
var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
|
|
1125
1240
|
var INIT_RESTART_DELAY = 100;
|
|
1126
1241
|
var DEFAULT_MAX_RESTART_DELAY = 5e3;
|
|
1127
1242
|
var PersistentLifecycle = class extends Resource {
|
|
1243
|
+
_start;
|
|
1244
|
+
_stop;
|
|
1245
|
+
_onRestart;
|
|
1246
|
+
_maxRestartDelay;
|
|
1247
|
+
_currentState = void 0;
|
|
1248
|
+
_restartTask = void 0;
|
|
1249
|
+
_restartAfter = 0;
|
|
1128
1250
|
constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
|
|
1129
1251
|
super();
|
|
1130
|
-
this._currentState = void 0;
|
|
1131
|
-
this._restartTask = void 0;
|
|
1132
|
-
this._restartAfter = 0;
|
|
1133
1252
|
this._start = start;
|
|
1134
1253
|
this._stop = stop;
|
|
1135
1254
|
this._onRestart = onRestart;
|
|
@@ -1146,7 +1265,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1146
1265
|
log2.warn("Restart failed", {
|
|
1147
1266
|
err
|
|
1148
1267
|
}, {
|
|
1149
|
-
F:
|
|
1268
|
+
F: __dxlog_file5,
|
|
1150
1269
|
L: 72,
|
|
1151
1270
|
S: this,
|
|
1152
1271
|
C: (f, a) => f(...a)
|
|
@@ -1158,7 +1277,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1158
1277
|
log2.warn("Start failed", {
|
|
1159
1278
|
err
|
|
1160
1279
|
}, {
|
|
1161
|
-
F:
|
|
1280
|
+
F: __dxlog_file5,
|
|
1162
1281
|
L: 78,
|
|
1163
1282
|
S: this,
|
|
1164
1283
|
C: (f, a) => f(...a)
|
|
@@ -1176,7 +1295,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1176
1295
|
log2(`restarting in ${this._restartAfter}ms`, {
|
|
1177
1296
|
state: this._lifecycleState
|
|
1178
1297
|
}, {
|
|
1179
|
-
F:
|
|
1298
|
+
F: __dxlog_file5,
|
|
1180
1299
|
L: 91,
|
|
1181
1300
|
S: this,
|
|
1182
1301
|
C: (f, a) => f(...a)
|
|
@@ -1199,7 +1318,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1199
1318
|
await this._stop(this._currentState);
|
|
1200
1319
|
} catch (err) {
|
|
1201
1320
|
log2.catch(err, void 0, {
|
|
1202
|
-
F:
|
|
1321
|
+
F: __dxlog_file5,
|
|
1203
1322
|
L: 113,
|
|
1204
1323
|
S: this,
|
|
1205
1324
|
C: (f, a) => f(...a)
|
|
@@ -1227,7 +1346,7 @@ _ts_decorate([
|
|
|
1227
1346
|
|
|
1228
1347
|
// src/push-iterable.ts
|
|
1229
1348
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
1230
|
-
var
|
|
1349
|
+
var __dxlog_file6 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
|
|
1231
1350
|
var makePushIterable = () => {
|
|
1232
1351
|
const buf = [];
|
|
1233
1352
|
const trigger2 = new Trigger({
|
|
@@ -1242,7 +1361,7 @@ var makePushIterable = () => {
|
|
|
1242
1361
|
}
|
|
1243
1362
|
const item = buf.shift();
|
|
1244
1363
|
invariant2(item, void 0, {
|
|
1245
|
-
F:
|
|
1364
|
+
F: __dxlog_file6,
|
|
1246
1365
|
L: 42,
|
|
1247
1366
|
S: this,
|
|
1248
1367
|
A: [
|
|
@@ -1336,11 +1455,6 @@ var streamToArray = (stream) => {
|
|
|
1336
1455
|
// src/test-stream.ts
|
|
1337
1456
|
import { Duplex } from "node:stream";
|
|
1338
1457
|
var TestStream = class extends Duplex {
|
|
1339
|
-
constructor() {
|
|
1340
|
-
super(...arguments);
|
|
1341
|
-
this._received = Buffer.alloc(0);
|
|
1342
|
-
this._onWrite = new Event();
|
|
1343
|
-
}
|
|
1344
1458
|
static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
|
|
1345
1459
|
stream1.push("ping");
|
|
1346
1460
|
stream2.push("pong");
|
|
@@ -1353,6 +1467,8 @@ var TestStream = class extends Duplex {
|
|
|
1353
1467
|
})
|
|
1354
1468
|
]);
|
|
1355
1469
|
}
|
|
1470
|
+
_received = Buffer.alloc(0);
|
|
1471
|
+
_onWrite = new Event();
|
|
1356
1472
|
_write(chunk, encoding, callback) {
|
|
1357
1473
|
this._received = Buffer.concat([
|
|
1358
1474
|
this._received,
|
|
@@ -1430,10 +1546,12 @@ var untilError = (cb) => {
|
|
|
1430
1546
|
|
|
1431
1547
|
// src/timer.ts
|
|
1432
1548
|
var Timer = class {
|
|
1549
|
+
_callback;
|
|
1550
|
+
_state = new Event();
|
|
1551
|
+
_timer;
|
|
1552
|
+
_count = 0;
|
|
1433
1553
|
constructor(_callback) {
|
|
1434
1554
|
this._callback = _callback;
|
|
1435
|
-
this._state = new Event();
|
|
1436
|
-
this._count = 0;
|
|
1437
1555
|
}
|
|
1438
1556
|
get state() {
|
|
1439
1557
|
return this._state;
|
|
@@ -1479,13 +1597,20 @@ var Timer = class {
|
|
|
1479
1597
|
// src/update-scheduler.ts
|
|
1480
1598
|
var TIME_PERIOD = 1e3;
|
|
1481
1599
|
var UpdateScheduler = class {
|
|
1600
|
+
_ctx;
|
|
1601
|
+
_callback;
|
|
1602
|
+
_params;
|
|
1603
|
+
/**
|
|
1604
|
+
* Promise that resolves when the callback is done.
|
|
1605
|
+
* Never rejects.
|
|
1606
|
+
*/
|
|
1607
|
+
_promise = null;
|
|
1608
|
+
_scheduled = false;
|
|
1609
|
+
_lastUpdateTime = -TIME_PERIOD;
|
|
1482
1610
|
constructor(_ctx, _callback, _params = {}) {
|
|
1483
1611
|
this._ctx = _ctx;
|
|
1484
1612
|
this._callback = _callback;
|
|
1485
1613
|
this._params = _params;
|
|
1486
|
-
this._promise = null;
|
|
1487
|
-
this._scheduled = false;
|
|
1488
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1489
1614
|
_ctx.onDispose(async () => {
|
|
1490
1615
|
await this._promise;
|
|
1491
1616
|
});
|
|
@@ -1498,13 +1623,13 @@ var UpdateScheduler = class {
|
|
|
1498
1623
|
await this._promise;
|
|
1499
1624
|
if (this._params.maxFrequency) {
|
|
1500
1625
|
const now = performance.now();
|
|
1501
|
-
const
|
|
1502
|
-
if (
|
|
1626
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1627
|
+
if (delay2 > 0) {
|
|
1503
1628
|
await new Promise((resolve) => {
|
|
1504
1629
|
const timeoutId = setTimeout(() => {
|
|
1505
1630
|
clearContext();
|
|
1506
1631
|
resolve();
|
|
1507
|
-
},
|
|
1632
|
+
}, delay2);
|
|
1508
1633
|
const clearContext = this._ctx.onDispose(() => {
|
|
1509
1634
|
clearTimeout(timeoutId);
|
|
1510
1635
|
resolve();
|
|
@@ -1548,6 +1673,7 @@ var UpdateScheduler = class {
|
|
|
1548
1673
|
}
|
|
1549
1674
|
};
|
|
1550
1675
|
export {
|
|
1676
|
+
AsyncTask,
|
|
1551
1677
|
CancellableObservableProvider,
|
|
1552
1678
|
DeferredTask,
|
|
1553
1679
|
Event,
|
|
@@ -1574,6 +1700,7 @@ export {
|
|
|
1574
1700
|
combine,
|
|
1575
1701
|
debounce,
|
|
1576
1702
|
debounceAndThrottle,
|
|
1703
|
+
delay,
|
|
1577
1704
|
dumpLeaks,
|
|
1578
1705
|
interval,
|
|
1579
1706
|
latch,
|