@dxos/async 0.8.4-main.b97322e → 0.8.4-main.bc2380dfbc
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 +212 -148
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +212 -148
- 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 +2 -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 +14 -13
- package/src/cleanup.ts +7 -4
- package/src/debounce.ts +69 -16
- package/src/observable-value.ts +4 -2
- package/src/persistent-lifecycle.test.ts +1 -1
- package/src/persistent-lifecycle.ts +10 -2
- package/src/task-scheduling.ts +95 -1
- package/src/testing.test.ts +1 -1
- package/src/timeout.ts +6 -9
|
@@ -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);
|
|
@@ -190,13 +217,8 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
|
|
|
190
217
|
|
|
191
218
|
// src/events.ts
|
|
192
219
|
import { Context } from "@dxos/context";
|
|
193
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
|
|
194
220
|
var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
|
|
195
221
|
var Event = class _Event {
|
|
196
|
-
constructor() {
|
|
197
|
-
this._listeners = /* @__PURE__ */ new Set();
|
|
198
|
-
this._effects = /* @__PURE__ */ new Set();
|
|
199
|
-
}
|
|
200
222
|
/**
|
|
201
223
|
* Wrap objects that have on/off style event emitters.
|
|
202
224
|
*/
|
|
@@ -209,6 +231,8 @@ var Event = class _Event {
|
|
|
209
231
|
});
|
|
210
232
|
return event;
|
|
211
233
|
}
|
|
234
|
+
_listeners = /* @__PURE__ */ new Set();
|
|
235
|
+
_effects = /* @__PURE__ */ new Set();
|
|
212
236
|
/**
|
|
213
237
|
* Emit an event.
|
|
214
238
|
* In most cases should only be called by the class or entity containing the event.
|
|
@@ -247,10 +271,7 @@ var Event = class _Event {
|
|
|
247
271
|
_ctx,
|
|
248
272
|
_callback
|
|
249
273
|
] : [
|
|
250
|
-
new Context(
|
|
251
|
-
F: __dxlog_file,
|
|
252
|
-
L: 132
|
|
253
|
-
}),
|
|
274
|
+
new Context(),
|
|
254
275
|
_ctx
|
|
255
276
|
];
|
|
256
277
|
const weak = !!options?.weak;
|
|
@@ -280,10 +301,7 @@ var Event = class _Event {
|
|
|
280
301
|
_ctx,
|
|
281
302
|
_callback
|
|
282
303
|
] : [
|
|
283
|
-
new Context(
|
|
284
|
-
F: __dxlog_file,
|
|
285
|
-
L: 169
|
|
286
|
-
}),
|
|
304
|
+
new Context(),
|
|
287
305
|
_ctx
|
|
288
306
|
];
|
|
289
307
|
const listener = new EventListener(this, callback, ctx, true, false);
|
|
@@ -452,11 +470,15 @@ var Event = class _Event {
|
|
|
452
470
|
}
|
|
453
471
|
};
|
|
454
472
|
var EventListener = class {
|
|
473
|
+
ctx;
|
|
474
|
+
once;
|
|
475
|
+
weak;
|
|
476
|
+
callback;
|
|
477
|
+
_clearDispose = void 0;
|
|
455
478
|
constructor(event, listener, ctx, once, weak) {
|
|
456
479
|
this.ctx = ctx;
|
|
457
480
|
this.once = once;
|
|
458
481
|
this.weak = weak;
|
|
459
|
-
this._clearDispose = void 0;
|
|
460
482
|
this._clearDispose = ctx.onDispose(() => {
|
|
461
483
|
event._removeListener(this);
|
|
462
484
|
});
|
|
@@ -520,11 +542,9 @@ var weakListeners = () => {
|
|
|
520
542
|
import "@dxos/util";
|
|
521
543
|
import { warnAfterTimeout } from "@dxos/debug";
|
|
522
544
|
var Mutex = class {
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
this._tag = null;
|
|
527
|
-
}
|
|
545
|
+
_queue = Promise.resolve();
|
|
546
|
+
_queueLength = 0;
|
|
547
|
+
_tag = null;
|
|
528
548
|
get tag() {
|
|
529
549
|
return this._tag;
|
|
530
550
|
}
|
|
@@ -570,6 +590,7 @@ var Mutex = class {
|
|
|
570
590
|
}
|
|
571
591
|
};
|
|
572
592
|
var MutexGuard = class {
|
|
593
|
+
_release;
|
|
573
594
|
constructor(_release) {
|
|
574
595
|
this._release = _release;
|
|
575
596
|
}
|
|
@@ -583,7 +604,7 @@ var MutexGuard = class {
|
|
|
583
604
|
this.release();
|
|
584
605
|
}
|
|
585
606
|
};
|
|
586
|
-
var classMutexSymbol = Symbol("class-mutex");
|
|
607
|
+
var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
|
|
587
608
|
var FORCE_DISABLE_WARNING = false;
|
|
588
609
|
var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
|
|
589
610
|
var synchronized = (target, propertyName, descriptor) => {
|
|
@@ -614,7 +635,6 @@ import PushStream from "zen-push";
|
|
|
614
635
|
|
|
615
636
|
// src/trigger.ts
|
|
616
637
|
import { invariant } from "@dxos/invariant";
|
|
617
|
-
var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/trigger.ts";
|
|
618
638
|
var trigger = (timeout2) => {
|
|
619
639
|
let callback;
|
|
620
640
|
const promise = new Promise((resolve, reject) => {
|
|
@@ -630,18 +650,22 @@ var trigger = (timeout2) => {
|
|
|
630
650
|
resolver
|
|
631
651
|
];
|
|
632
652
|
};
|
|
633
|
-
var TriggerState = /* @__PURE__ */ function(TriggerState2) {
|
|
653
|
+
var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
|
|
634
654
|
TriggerState2["WAITING"] = "WAITING";
|
|
635
655
|
TriggerState2["RESOLVED"] = "RESOLVED";
|
|
636
656
|
TriggerState2["REJECTED"] = "REJECTED";
|
|
637
657
|
return TriggerState2;
|
|
638
|
-
}({});
|
|
658
|
+
})({});
|
|
639
659
|
var Trigger = class {
|
|
660
|
+
_options;
|
|
661
|
+
_promise;
|
|
662
|
+
_resolve;
|
|
663
|
+
_reject;
|
|
664
|
+
_state = "WAITING";
|
|
640
665
|
constructor(_options = {
|
|
641
666
|
autoReset: false
|
|
642
667
|
}) {
|
|
643
668
|
this._options = _options;
|
|
644
|
-
this._state = "WAITING";
|
|
645
669
|
this.reset();
|
|
646
670
|
}
|
|
647
671
|
get state() {
|
|
@@ -702,15 +726,7 @@ var Trigger = class {
|
|
|
702
726
|
}
|
|
703
727
|
};
|
|
704
728
|
var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
705
|
-
invariant(count >= 0
|
|
706
|
-
F: __dxlog_file2,
|
|
707
|
-
L: 139,
|
|
708
|
-
S: void 0,
|
|
709
|
-
A: [
|
|
710
|
-
"count >= 0",
|
|
711
|
-
""
|
|
712
|
-
]
|
|
713
|
-
});
|
|
729
|
+
invariant(count >= 0);
|
|
714
730
|
let t;
|
|
715
731
|
let doResolve;
|
|
716
732
|
let doReject;
|
|
@@ -750,20 +766,12 @@ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
|
750
766
|
|
|
751
767
|
// src/observable.ts
|
|
752
768
|
var MulticastObservable = class _MulticastObservable extends Observable {
|
|
769
|
+
_value;
|
|
770
|
+
_observers = /* @__PURE__ */ new Set();
|
|
771
|
+
_observable;
|
|
772
|
+
_completed = new Trigger();
|
|
753
773
|
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
|
-
};
|
|
774
|
+
super((observer) => this._subscribe(observer)), this._value = _value;
|
|
767
775
|
this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
|
|
768
776
|
this._observable.subscribe(this._handlers);
|
|
769
777
|
}
|
|
@@ -847,18 +855,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
|
|
|
847
855
|
this._observers.delete(observer);
|
|
848
856
|
};
|
|
849
857
|
}
|
|
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
|
+
};
|
|
850
871
|
};
|
|
851
872
|
var EMPTY_OBSERVABLE = MulticastObservable.of(null);
|
|
852
873
|
|
|
853
874
|
// src/observable-value.ts
|
|
854
875
|
import { createSetDispatch } from "@dxos/util";
|
|
855
876
|
var ObservableProvider = class {
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
this.
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
}
|
|
877
|
+
_handlers = /* @__PURE__ */ new Set();
|
|
878
|
+
_proxy = createSetDispatch({
|
|
879
|
+
handlers: this._handlers
|
|
880
|
+
});
|
|
881
|
+
_value;
|
|
862
882
|
/**
|
|
863
883
|
* Proxy used to dispatch callbacks to each subscription.
|
|
864
884
|
*/
|
|
@@ -879,8 +899,10 @@ var ObservableProvider = class {
|
|
|
879
899
|
}
|
|
880
900
|
};
|
|
881
901
|
var CancellableObservableProvider = class extends ObservableProvider {
|
|
902
|
+
_handleCancel;
|
|
903
|
+
_cancelled = false;
|
|
882
904
|
constructor(_handleCancel) {
|
|
883
|
-
super(), this._handleCancel = _handleCancel
|
|
905
|
+
super(), this._handleCancel = _handleCancel;
|
|
884
906
|
}
|
|
885
907
|
get cancelled() {
|
|
886
908
|
return this._cancelled;
|
|
@@ -901,16 +923,15 @@ import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
|
|
|
901
923
|
import { log as log2 } from "@dxos/log";
|
|
902
924
|
|
|
903
925
|
// src/task-scheduling.ts
|
|
904
|
-
import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
926
|
+
import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
905
927
|
import { StackTrace as StackTrace2 } from "@dxos/debug";
|
|
906
928
|
|
|
907
929
|
// src/track-leaks.ts
|
|
908
930
|
import { StackTrace } from "@dxos/debug";
|
|
909
931
|
import { log } from "@dxos/log";
|
|
910
|
-
var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
|
|
911
932
|
var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
|
|
912
933
|
var openResources = /* @__PURE__ */ new Set();
|
|
913
|
-
var handleSymbol = Symbol("checkLeaksHandle");
|
|
934
|
+
var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
|
|
914
935
|
var trackResource = (resourceProvider) => {
|
|
915
936
|
if (!enabled) {
|
|
916
937
|
return () => {
|
|
@@ -957,31 +978,11 @@ var dumpLeaks = () => {
|
|
|
957
978
|
if (!enabled) {
|
|
958
979
|
return;
|
|
959
980
|
}
|
|
960
|
-
log.info(`Leaked resources ${openResources.size}
|
|
961
|
-
F: __dxlog_file3,
|
|
962
|
-
L: 82,
|
|
963
|
-
S: void 0,
|
|
964
|
-
C: (f, a) => f(...a)
|
|
965
|
-
});
|
|
981
|
+
log.info(`Leaked resources ${openResources.size}:`);
|
|
966
982
|
for (const resource of openResources) {
|
|
967
|
-
log.info(`- ${resource.name} at
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
S: void 0,
|
|
971
|
-
C: (f, a) => f(...a)
|
|
972
|
-
});
|
|
973
|
-
log.info(resource.openStack.getStack(1), void 0, {
|
|
974
|
-
F: __dxlog_file3,
|
|
975
|
-
L: 85,
|
|
976
|
-
S: void 0,
|
|
977
|
-
C: (f, a) => f(...a)
|
|
978
|
-
});
|
|
979
|
-
log.info("\n", void 0, {
|
|
980
|
-
F: __dxlog_file3,
|
|
981
|
-
L: 86,
|
|
982
|
-
S: void 0,
|
|
983
|
-
C: (f, a) => f(...a)
|
|
984
|
-
});
|
|
983
|
+
log.info(`- ${resource.name} at`);
|
|
984
|
+
log.info(resource.openStack.getStack(1));
|
|
985
|
+
log.info("\n");
|
|
985
986
|
}
|
|
986
987
|
};
|
|
987
988
|
if (enabled) {
|
|
@@ -990,12 +991,14 @@ if (enabled) {
|
|
|
990
991
|
|
|
991
992
|
// src/task-scheduling.ts
|
|
992
993
|
var DeferredTask = class {
|
|
994
|
+
_ctx;
|
|
995
|
+
_callback;
|
|
996
|
+
_scheduled = false;
|
|
997
|
+
_currentTask = null;
|
|
998
|
+
_nextTask = new Trigger();
|
|
993
999
|
constructor(_ctx, _callback) {
|
|
994
1000
|
this._ctx = _ctx;
|
|
995
1001
|
this._callback = _callback;
|
|
996
|
-
this._scheduled = false;
|
|
997
|
-
this._currentTask = null;
|
|
998
|
-
this._nextTask = new Trigger();
|
|
999
1002
|
}
|
|
1000
1003
|
get scheduled() {
|
|
1001
1004
|
return this._scheduled;
|
|
@@ -1036,6 +1039,79 @@ var DeferredTask = class {
|
|
|
1036
1039
|
await this._currentTask;
|
|
1037
1040
|
}
|
|
1038
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
|
+
};
|
|
1039
1115
|
var runInContext = (ctx, fn) => {
|
|
1040
1116
|
try {
|
|
1041
1117
|
fn();
|
|
@@ -1121,15 +1197,18 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
1121
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;
|
|
1122
1198
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1123
1199
|
}
|
|
1124
|
-
var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
|
|
1125
1200
|
var INIT_RESTART_DELAY = 100;
|
|
1126
1201
|
var DEFAULT_MAX_RESTART_DELAY = 5e3;
|
|
1127
1202
|
var PersistentLifecycle = class extends Resource {
|
|
1203
|
+
_start;
|
|
1204
|
+
_stop;
|
|
1205
|
+
_onRestart;
|
|
1206
|
+
_maxRestartDelay;
|
|
1207
|
+
_currentState = void 0;
|
|
1208
|
+
_restartTask = void 0;
|
|
1209
|
+
_restartAfter = 0;
|
|
1128
1210
|
constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
|
|
1129
1211
|
super();
|
|
1130
|
-
this._currentState = void 0;
|
|
1131
|
-
this._restartTask = void 0;
|
|
1132
|
-
this._restartAfter = 0;
|
|
1133
1212
|
this._start = start;
|
|
1134
1213
|
this._stop = stop;
|
|
1135
1214
|
this._onRestart = onRestart;
|
|
@@ -1143,25 +1222,21 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1143
1222
|
try {
|
|
1144
1223
|
await this._restart();
|
|
1145
1224
|
} catch (err) {
|
|
1225
|
+
if (this._ctx?.disposed) {
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1146
1228
|
log2.warn("Restart failed", {
|
|
1147
1229
|
err
|
|
1148
|
-
}, {
|
|
1149
|
-
F: __dxlog_file4,
|
|
1150
|
-
L: 72,
|
|
1151
|
-
S: this,
|
|
1152
|
-
C: (f, a) => f(...a)
|
|
1153
1230
|
});
|
|
1154
1231
|
this._restartTask?.schedule();
|
|
1155
1232
|
}
|
|
1156
1233
|
});
|
|
1157
1234
|
this._currentState = await this._start().catch((err) => {
|
|
1235
|
+
if (this._ctx?.disposed) {
|
|
1236
|
+
return void 0;
|
|
1237
|
+
}
|
|
1158
1238
|
log2.warn("Start failed", {
|
|
1159
1239
|
err
|
|
1160
|
-
}, {
|
|
1161
|
-
F: __dxlog_file4,
|
|
1162
|
-
L: 78,
|
|
1163
|
-
S: this,
|
|
1164
|
-
C: (f, a) => f(...a)
|
|
1165
1240
|
});
|
|
1166
1241
|
this._restartTask?.schedule();
|
|
1167
1242
|
return void 0;
|
|
@@ -1175,11 +1250,6 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1175
1250
|
async _restart() {
|
|
1176
1251
|
log2(`restarting in ${this._restartAfter}ms`, {
|
|
1177
1252
|
state: this._lifecycleState
|
|
1178
|
-
}, {
|
|
1179
|
-
F: __dxlog_file4,
|
|
1180
|
-
L: 91,
|
|
1181
|
-
S: this,
|
|
1182
|
-
C: (f, a) => f(...a)
|
|
1183
1253
|
});
|
|
1184
1254
|
await this._stopCurrentState();
|
|
1185
1255
|
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
@@ -1198,12 +1268,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1198
1268
|
try {
|
|
1199
1269
|
await this._stop(this._currentState);
|
|
1200
1270
|
} catch (err) {
|
|
1201
|
-
log2.catch(err
|
|
1202
|
-
F: __dxlog_file4,
|
|
1203
|
-
L: 113,
|
|
1204
|
-
S: this,
|
|
1205
|
-
C: (f, a) => f(...a)
|
|
1206
|
-
});
|
|
1271
|
+
log2.catch(err);
|
|
1207
1272
|
}
|
|
1208
1273
|
this._currentState = void 0;
|
|
1209
1274
|
}
|
|
@@ -1227,7 +1292,6 @@ _ts_decorate([
|
|
|
1227
1292
|
|
|
1228
1293
|
// src/push-iterable.ts
|
|
1229
1294
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
1230
|
-
var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
|
|
1231
1295
|
var makePushIterable = () => {
|
|
1232
1296
|
const buf = [];
|
|
1233
1297
|
const trigger2 = new Trigger({
|
|
@@ -1241,15 +1305,7 @@ var makePushIterable = () => {
|
|
|
1241
1305
|
await trigger2.wait();
|
|
1242
1306
|
}
|
|
1243
1307
|
const item = buf.shift();
|
|
1244
|
-
invariant2(item
|
|
1245
|
-
F: __dxlog_file5,
|
|
1246
|
-
L: 42,
|
|
1247
|
-
S: this,
|
|
1248
|
-
A: [
|
|
1249
|
-
"item",
|
|
1250
|
-
""
|
|
1251
|
-
]
|
|
1252
|
-
});
|
|
1308
|
+
invariant2(item);
|
|
1253
1309
|
switch (item.kind) {
|
|
1254
1310
|
case "next":
|
|
1255
1311
|
return {
|
|
@@ -1336,11 +1392,6 @@ var streamToArray = (stream) => {
|
|
|
1336
1392
|
// src/test-stream.ts
|
|
1337
1393
|
import { Duplex } from "node:stream";
|
|
1338
1394
|
var TestStream = class extends Duplex {
|
|
1339
|
-
constructor() {
|
|
1340
|
-
super(...arguments);
|
|
1341
|
-
this._received = Buffer.alloc(0);
|
|
1342
|
-
this._onWrite = new Event();
|
|
1343
|
-
}
|
|
1344
1395
|
static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
|
|
1345
1396
|
stream1.push("ping");
|
|
1346
1397
|
stream2.push("pong");
|
|
@@ -1353,6 +1404,8 @@ var TestStream = class extends Duplex {
|
|
|
1353
1404
|
})
|
|
1354
1405
|
]);
|
|
1355
1406
|
}
|
|
1407
|
+
_received = Buffer.alloc(0);
|
|
1408
|
+
_onWrite = new Event();
|
|
1356
1409
|
_write(chunk, encoding, callback) {
|
|
1357
1410
|
this._received = Buffer.concat([
|
|
1358
1411
|
this._received,
|
|
@@ -1430,10 +1483,12 @@ var untilError = (cb) => {
|
|
|
1430
1483
|
|
|
1431
1484
|
// src/timer.ts
|
|
1432
1485
|
var Timer = class {
|
|
1486
|
+
_callback;
|
|
1487
|
+
_state = new Event();
|
|
1488
|
+
_timer;
|
|
1489
|
+
_count = 0;
|
|
1433
1490
|
constructor(_callback) {
|
|
1434
1491
|
this._callback = _callback;
|
|
1435
|
-
this._state = new Event();
|
|
1436
|
-
this._count = 0;
|
|
1437
1492
|
}
|
|
1438
1493
|
get state() {
|
|
1439
1494
|
return this._state;
|
|
@@ -1479,13 +1534,20 @@ var Timer = class {
|
|
|
1479
1534
|
// src/update-scheduler.ts
|
|
1480
1535
|
var TIME_PERIOD = 1e3;
|
|
1481
1536
|
var UpdateScheduler = class {
|
|
1537
|
+
_ctx;
|
|
1538
|
+
_callback;
|
|
1539
|
+
_params;
|
|
1540
|
+
/**
|
|
1541
|
+
* Promise that resolves when the callback is done.
|
|
1542
|
+
* Never rejects.
|
|
1543
|
+
*/
|
|
1544
|
+
_promise = null;
|
|
1545
|
+
_scheduled = false;
|
|
1546
|
+
_lastUpdateTime = -TIME_PERIOD;
|
|
1482
1547
|
constructor(_ctx, _callback, _params = {}) {
|
|
1483
1548
|
this._ctx = _ctx;
|
|
1484
1549
|
this._callback = _callback;
|
|
1485
1550
|
this._params = _params;
|
|
1486
|
-
this._promise = null;
|
|
1487
|
-
this._scheduled = false;
|
|
1488
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1489
1551
|
_ctx.onDispose(async () => {
|
|
1490
1552
|
await this._promise;
|
|
1491
1553
|
});
|
|
@@ -1498,13 +1560,13 @@ var UpdateScheduler = class {
|
|
|
1498
1560
|
await this._promise;
|
|
1499
1561
|
if (this._params.maxFrequency) {
|
|
1500
1562
|
const now = performance.now();
|
|
1501
|
-
const
|
|
1502
|
-
if (
|
|
1563
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1564
|
+
if (delay2 > 0) {
|
|
1503
1565
|
await new Promise((resolve) => {
|
|
1504
1566
|
const timeoutId = setTimeout(() => {
|
|
1505
1567
|
clearContext();
|
|
1506
1568
|
resolve();
|
|
1507
|
-
},
|
|
1569
|
+
}, delay2);
|
|
1508
1570
|
const clearContext = this._ctx.onDispose(() => {
|
|
1509
1571
|
clearTimeout(timeoutId);
|
|
1510
1572
|
resolve();
|
|
@@ -1548,6 +1610,7 @@ var UpdateScheduler = class {
|
|
|
1548
1610
|
}
|
|
1549
1611
|
};
|
|
1550
1612
|
export {
|
|
1613
|
+
AsyncTask,
|
|
1551
1614
|
CancellableObservableProvider,
|
|
1552
1615
|
DeferredTask,
|
|
1553
1616
|
Event,
|
|
@@ -1574,6 +1637,7 @@ export {
|
|
|
1574
1637
|
combine,
|
|
1575
1638
|
debounce,
|
|
1576
1639
|
debounceAndThrottle,
|
|
1640
|
+
delay,
|
|
1577
1641
|
dumpLeaks,
|
|
1578
1642
|
interval,
|
|
1579
1643
|
latch,
|