@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
|
@@ -22,7 +22,7 @@ var chain = (chain2) => async (elements) => {
|
|
|
22
22
|
import { ComplexMap } from "@dxos/util";
|
|
23
23
|
var combine = (...cleanupFns) => {
|
|
24
24
|
return () => {
|
|
25
|
-
cleanupFns.flat().forEach((cleanupFn) => cleanupFn());
|
|
25
|
+
cleanupFns.flat().filter((f) => typeof f === "function").forEach((cleanupFn) => cleanupFn());
|
|
26
26
|
};
|
|
27
27
|
};
|
|
28
28
|
var timeout = (cb, ms = 0) => {
|
|
@@ -39,8 +39,8 @@ var addEventListener = (target, type, listener, options) => {
|
|
|
39
39
|
};
|
|
40
40
|
var SubscriptionList = class {
|
|
41
41
|
_cleanups = [];
|
|
42
|
-
add(cb) {
|
|
43
|
-
this._cleanups.push(cb);
|
|
42
|
+
add(...cb) {
|
|
43
|
+
this._cleanups.push(...cb);
|
|
44
44
|
return this;
|
|
45
45
|
}
|
|
46
46
|
clear() {
|
|
@@ -64,29 +64,55 @@ var SubscriptionSet = class {
|
|
|
64
64
|
};
|
|
65
65
|
|
|
66
66
|
// src/debounce.ts
|
|
67
|
-
var
|
|
67
|
+
var delay = (cb, delay2 = 100) => {
|
|
68
|
+
let pending = false;
|
|
69
|
+
return (...args) => {
|
|
70
|
+
if (pending) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
pending = true;
|
|
74
|
+
setTimeout(() => {
|
|
75
|
+
try {
|
|
76
|
+
cb(...args);
|
|
77
|
+
} finally {
|
|
78
|
+
pending = false;
|
|
79
|
+
}
|
|
80
|
+
}, delay2);
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
var debounce = (cb, delay2 = 100) => {
|
|
68
84
|
let t;
|
|
69
85
|
return (...args) => {
|
|
70
86
|
clearTimeout(t);
|
|
71
|
-
t = setTimeout(() => cb(...args),
|
|
87
|
+
t = setTimeout(() => cb(...args), delay2);
|
|
72
88
|
};
|
|
73
89
|
};
|
|
74
|
-
var throttle = (cb,
|
|
90
|
+
var throttle = (cb, delay2 = 100) => {
|
|
75
91
|
let lastCall = 0;
|
|
76
92
|
return (...args) => {
|
|
77
93
|
const now = Date.now();
|
|
78
|
-
if (now - lastCall >=
|
|
94
|
+
if (now - lastCall >= delay2) {
|
|
79
95
|
cb(...args);
|
|
80
96
|
lastCall = now;
|
|
81
97
|
}
|
|
82
98
|
};
|
|
83
99
|
};
|
|
84
|
-
var debounceAndThrottle = (cb,
|
|
85
|
-
|
|
86
|
-
|
|
100
|
+
var debounceAndThrottle = (cb, delay2 = 100) => {
|
|
101
|
+
let timeout2;
|
|
102
|
+
let lastCall = 0;
|
|
87
103
|
return (...args) => {
|
|
88
|
-
|
|
89
|
-
|
|
104
|
+
const now = Date.now();
|
|
105
|
+
const delta = now - lastCall;
|
|
106
|
+
clearTimeout(timeout2);
|
|
107
|
+
if (delta >= delay2) {
|
|
108
|
+
cb(...args);
|
|
109
|
+
lastCall = now;
|
|
110
|
+
} else {
|
|
111
|
+
timeout2 = setTimeout(() => {
|
|
112
|
+
cb(...args);
|
|
113
|
+
lastCall = Date.now();
|
|
114
|
+
}, delay2 - delta);
|
|
115
|
+
}
|
|
90
116
|
};
|
|
91
117
|
};
|
|
92
118
|
|
|
@@ -140,6 +166,9 @@ var sleepWithContext = (ctx, ms) => {
|
|
|
140
166
|
};
|
|
141
167
|
var asyncReturn = () => sleep(0);
|
|
142
168
|
var asyncTimeout = async (promise, timeout2, err) => {
|
|
169
|
+
if (typeof promise === "function") {
|
|
170
|
+
throw new Error("First argument must be a promise.");
|
|
171
|
+
}
|
|
143
172
|
let timeoutId;
|
|
144
173
|
const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
|
|
145
174
|
const timeoutPromise = new Promise((resolve, reject) => {
|
|
@@ -148,9 +177,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
|
|
|
148
177
|
}, timeout2);
|
|
149
178
|
unrefTimeout(timeoutId);
|
|
150
179
|
});
|
|
151
|
-
const conditionTimeout = typeof promise === "function" ? promiseFromCallback(promise) : promise;
|
|
152
180
|
return await Promise.race([
|
|
153
|
-
|
|
181
|
+
promise,
|
|
154
182
|
timeoutPromise
|
|
155
183
|
]).finally(() => {
|
|
156
184
|
clearTimeout(timeoutId);
|
|
@@ -187,7 +215,6 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
|
|
|
187
215
|
|
|
188
216
|
// src/events.ts
|
|
189
217
|
import { Context } from "@dxos/context";
|
|
190
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
|
|
191
218
|
var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
|
|
192
219
|
var Event = class _Event {
|
|
193
220
|
/**
|
|
@@ -242,10 +269,7 @@ var Event = class _Event {
|
|
|
242
269
|
_ctx,
|
|
243
270
|
_callback
|
|
244
271
|
] : [
|
|
245
|
-
new Context(
|
|
246
|
-
F: __dxlog_file,
|
|
247
|
-
L: 132
|
|
248
|
-
}),
|
|
272
|
+
new Context(),
|
|
249
273
|
_ctx
|
|
250
274
|
];
|
|
251
275
|
const weak = !!options?.weak;
|
|
@@ -275,10 +299,7 @@ var Event = class _Event {
|
|
|
275
299
|
_ctx,
|
|
276
300
|
_callback
|
|
277
301
|
] : [
|
|
278
|
-
new Context(
|
|
279
|
-
F: __dxlog_file,
|
|
280
|
-
L: 169
|
|
281
|
-
}),
|
|
302
|
+
new Context(),
|
|
282
303
|
_ctx
|
|
283
304
|
];
|
|
284
305
|
const listener = new EventListener(this, callback, ctx, true, false);
|
|
@@ -451,12 +472,11 @@ var EventListener = class {
|
|
|
451
472
|
once;
|
|
452
473
|
weak;
|
|
453
474
|
callback;
|
|
454
|
-
_clearDispose;
|
|
475
|
+
_clearDispose = void 0;
|
|
455
476
|
constructor(event, listener, ctx, once, weak) {
|
|
456
477
|
this.ctx = ctx;
|
|
457
478
|
this.once = once;
|
|
458
479
|
this.weak = weak;
|
|
459
|
-
this._clearDispose = void 0;
|
|
460
480
|
this._clearDispose = ctx.onDispose(() => {
|
|
461
481
|
event._removeListener(this);
|
|
462
482
|
});
|
|
@@ -582,7 +602,7 @@ var MutexGuard = class {
|
|
|
582
602
|
this.release();
|
|
583
603
|
}
|
|
584
604
|
};
|
|
585
|
-
var classMutexSymbol = Symbol("class-mutex");
|
|
605
|
+
var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
|
|
586
606
|
var FORCE_DISABLE_WARNING = false;
|
|
587
607
|
var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
|
|
588
608
|
var synchronized = (target, propertyName, descriptor) => {
|
|
@@ -613,7 +633,6 @@ import PushStream from "zen-push";
|
|
|
613
633
|
|
|
614
634
|
// src/trigger.ts
|
|
615
635
|
import { invariant } from "@dxos/invariant";
|
|
616
|
-
var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/trigger.ts";
|
|
617
636
|
var trigger = (timeout2) => {
|
|
618
637
|
let callback;
|
|
619
638
|
const promise = new Promise((resolve, reject) => {
|
|
@@ -629,23 +648,22 @@ var trigger = (timeout2) => {
|
|
|
629
648
|
resolver
|
|
630
649
|
];
|
|
631
650
|
};
|
|
632
|
-
var TriggerState = /* @__PURE__ */ function(TriggerState2) {
|
|
651
|
+
var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
|
|
633
652
|
TriggerState2["WAITING"] = "WAITING";
|
|
634
653
|
TriggerState2["RESOLVED"] = "RESOLVED";
|
|
635
654
|
TriggerState2["REJECTED"] = "REJECTED";
|
|
636
655
|
return TriggerState2;
|
|
637
|
-
}({});
|
|
656
|
+
})({});
|
|
638
657
|
var Trigger = class {
|
|
639
658
|
_options;
|
|
640
659
|
_promise;
|
|
641
660
|
_resolve;
|
|
642
661
|
_reject;
|
|
643
|
-
_state;
|
|
662
|
+
_state = "WAITING";
|
|
644
663
|
constructor(_options = {
|
|
645
664
|
autoReset: false
|
|
646
665
|
}) {
|
|
647
666
|
this._options = _options;
|
|
648
|
-
this._state = "WAITING";
|
|
649
667
|
this.reset();
|
|
650
668
|
}
|
|
651
669
|
get state() {
|
|
@@ -706,15 +724,7 @@ var Trigger = class {
|
|
|
706
724
|
}
|
|
707
725
|
};
|
|
708
726
|
var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
709
|
-
invariant(count >= 0
|
|
710
|
-
F: __dxlog_file2,
|
|
711
|
-
L: 139,
|
|
712
|
-
S: void 0,
|
|
713
|
-
A: [
|
|
714
|
-
"count >= 0",
|
|
715
|
-
""
|
|
716
|
-
]
|
|
717
|
-
});
|
|
727
|
+
invariant(count >= 0);
|
|
718
728
|
let t;
|
|
719
729
|
let doResolve;
|
|
720
730
|
let doReject;
|
|
@@ -755,23 +765,11 @@ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
|
755
765
|
// src/observable.ts
|
|
756
766
|
var MulticastObservable = class _MulticastObservable extends Observable {
|
|
757
767
|
_value;
|
|
758
|
-
_observers;
|
|
768
|
+
_observers = /* @__PURE__ */ new Set();
|
|
759
769
|
_observable;
|
|
760
|
-
_completed;
|
|
770
|
+
_completed = new Trigger();
|
|
761
771
|
constructor(subscriber, _value) {
|
|
762
|
-
super((observer) => this._subscribe(observer)), this._value = _value
|
|
763
|
-
next: (value) => {
|
|
764
|
-
this._value = value;
|
|
765
|
-
this._observers.forEach((observer) => observer.next?.(value));
|
|
766
|
-
},
|
|
767
|
-
error: (err) => {
|
|
768
|
-
this._observers.forEach((observer) => observer.error?.(err));
|
|
769
|
-
},
|
|
770
|
-
complete: () => {
|
|
771
|
-
this._completed.wake();
|
|
772
|
-
this._observers.forEach((observer) => observer.complete?.());
|
|
773
|
-
}
|
|
774
|
-
};
|
|
772
|
+
super((observer) => this._subscribe(observer)), this._value = _value;
|
|
775
773
|
this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
|
|
776
774
|
this._observable.subscribe(this._handlers);
|
|
777
775
|
}
|
|
@@ -855,7 +853,19 @@ var MulticastObservable = class _MulticastObservable extends Observable {
|
|
|
855
853
|
this._observers.delete(observer);
|
|
856
854
|
};
|
|
857
855
|
}
|
|
858
|
-
_handlers
|
|
856
|
+
_handlers = {
|
|
857
|
+
next: (value) => {
|
|
858
|
+
this._value = value;
|
|
859
|
+
this._observers.forEach((observer) => observer.next?.(value));
|
|
860
|
+
},
|
|
861
|
+
error: (err) => {
|
|
862
|
+
this._observers.forEach((observer) => observer.error?.(err));
|
|
863
|
+
},
|
|
864
|
+
complete: () => {
|
|
865
|
+
this._completed.wake();
|
|
866
|
+
this._observers.forEach((observer) => observer.complete?.());
|
|
867
|
+
}
|
|
868
|
+
};
|
|
859
869
|
};
|
|
860
870
|
var EMPTY_OBSERVABLE = MulticastObservable.of(null);
|
|
861
871
|
|
|
@@ -888,9 +898,9 @@ var ObservableProvider = class {
|
|
|
888
898
|
};
|
|
889
899
|
var CancellableObservableProvider = class extends ObservableProvider {
|
|
890
900
|
_handleCancel;
|
|
891
|
-
_cancelled;
|
|
901
|
+
_cancelled = false;
|
|
892
902
|
constructor(_handleCancel) {
|
|
893
|
-
super(), this._handleCancel = _handleCancel
|
|
903
|
+
super(), this._handleCancel = _handleCancel;
|
|
894
904
|
}
|
|
895
905
|
get cancelled() {
|
|
896
906
|
return this._cancelled;
|
|
@@ -911,16 +921,15 @@ import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
|
|
|
911
921
|
import { log as log2 } from "@dxos/log";
|
|
912
922
|
|
|
913
923
|
// src/task-scheduling.ts
|
|
914
|
-
import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
924
|
+
import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
915
925
|
import { StackTrace as StackTrace2 } from "@dxos/debug";
|
|
916
926
|
|
|
917
927
|
// src/track-leaks.ts
|
|
918
928
|
import { StackTrace } from "@dxos/debug";
|
|
919
929
|
import { log } from "@dxos/log";
|
|
920
|
-
var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
|
|
921
930
|
var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
|
|
922
931
|
var openResources = /* @__PURE__ */ new Set();
|
|
923
|
-
var handleSymbol = Symbol("checkLeaksHandle");
|
|
932
|
+
var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
|
|
924
933
|
var trackResource = (resourceProvider) => {
|
|
925
934
|
if (!enabled) {
|
|
926
935
|
return () => {
|
|
@@ -967,31 +976,11 @@ var dumpLeaks = () => {
|
|
|
967
976
|
if (!enabled) {
|
|
968
977
|
return;
|
|
969
978
|
}
|
|
970
|
-
log.info(`Leaked resources ${openResources.size}
|
|
971
|
-
F: __dxlog_file3,
|
|
972
|
-
L: 82,
|
|
973
|
-
S: void 0,
|
|
974
|
-
C: (f, a) => f(...a)
|
|
975
|
-
});
|
|
979
|
+
log.info(`Leaked resources ${openResources.size}:`);
|
|
976
980
|
for (const resource of openResources) {
|
|
977
|
-
log.info(`- ${resource.name} at
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
S: void 0,
|
|
981
|
-
C: (f, a) => f(...a)
|
|
982
|
-
});
|
|
983
|
-
log.info(resource.openStack.getStack(1), void 0, {
|
|
984
|
-
F: __dxlog_file3,
|
|
985
|
-
L: 85,
|
|
986
|
-
S: void 0,
|
|
987
|
-
C: (f, a) => f(...a)
|
|
988
|
-
});
|
|
989
|
-
log.info("\n", void 0, {
|
|
990
|
-
F: __dxlog_file3,
|
|
991
|
-
L: 86,
|
|
992
|
-
S: void 0,
|
|
993
|
-
C: (f, a) => f(...a)
|
|
994
|
-
});
|
|
981
|
+
log.info(`- ${resource.name} at`);
|
|
982
|
+
log.info(resource.openStack.getStack(1));
|
|
983
|
+
log.info("\n");
|
|
995
984
|
}
|
|
996
985
|
};
|
|
997
986
|
if (enabled) {
|
|
@@ -1002,15 +991,12 @@ if (enabled) {
|
|
|
1002
991
|
var DeferredTask = class {
|
|
1003
992
|
_ctx;
|
|
1004
993
|
_callback;
|
|
1005
|
-
_scheduled;
|
|
1006
|
-
_currentTask;
|
|
1007
|
-
_nextTask;
|
|
994
|
+
_scheduled = false;
|
|
995
|
+
_currentTask = null;
|
|
996
|
+
_nextTask = new Trigger();
|
|
1008
997
|
constructor(_ctx, _callback) {
|
|
1009
998
|
this._ctx = _ctx;
|
|
1010
999
|
this._callback = _callback;
|
|
1011
|
-
this._scheduled = false;
|
|
1012
|
-
this._currentTask = null;
|
|
1013
|
-
this._nextTask = new Trigger();
|
|
1014
1000
|
}
|
|
1015
1001
|
get scheduled() {
|
|
1016
1002
|
return this._scheduled;
|
|
@@ -1051,6 +1037,79 @@ var DeferredTask = class {
|
|
|
1051
1037
|
await this._currentTask;
|
|
1052
1038
|
}
|
|
1053
1039
|
};
|
|
1040
|
+
var AsyncTask = class {
|
|
1041
|
+
#callback;
|
|
1042
|
+
#ctx = void 0;
|
|
1043
|
+
#scheduled = false;
|
|
1044
|
+
#currentTask = null;
|
|
1045
|
+
#nextTask = new Trigger();
|
|
1046
|
+
constructor(callback) {
|
|
1047
|
+
this.#callback = callback;
|
|
1048
|
+
}
|
|
1049
|
+
get scheduled() {
|
|
1050
|
+
return this.#scheduled;
|
|
1051
|
+
}
|
|
1052
|
+
/**
|
|
1053
|
+
* Context of the resource that owns the task.
|
|
1054
|
+
* When the context is disposed, the task is cancelled and cannot be scheduled again.
|
|
1055
|
+
*/
|
|
1056
|
+
open() {
|
|
1057
|
+
this.#ctx = new Context2();
|
|
1058
|
+
}
|
|
1059
|
+
/**
|
|
1060
|
+
* Closes the task and waits for it to finish if it is running.
|
|
1061
|
+
*/
|
|
1062
|
+
async close() {
|
|
1063
|
+
await this.#ctx?.dispose();
|
|
1064
|
+
await this.join();
|
|
1065
|
+
this.#ctx = void 0;
|
|
1066
|
+
}
|
|
1067
|
+
[Symbol.asyncDispose]() {
|
|
1068
|
+
return this.close();
|
|
1069
|
+
}
|
|
1070
|
+
/**
|
|
1071
|
+
* Schedule the task to run asynchronously.
|
|
1072
|
+
*/
|
|
1073
|
+
// TODO(dmaretskyi): Add scheduleAt. Where the earlier time will override the later one.
|
|
1074
|
+
schedule() {
|
|
1075
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1076
|
+
throw new Error("AsyncTask not open");
|
|
1077
|
+
}
|
|
1078
|
+
if (this.#scheduled) {
|
|
1079
|
+
return;
|
|
1080
|
+
}
|
|
1081
|
+
scheduleTask(this.#ctx, async () => {
|
|
1082
|
+
await this.#currentTask;
|
|
1083
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1084
|
+
return;
|
|
1085
|
+
}
|
|
1086
|
+
this.#scheduled = false;
|
|
1087
|
+
const completionTrigger = this.#nextTask;
|
|
1088
|
+
this.#nextTask = new Trigger();
|
|
1089
|
+
this.#currentTask = runInContextAsync(this.#ctx, () => this.#callback()).then(() => {
|
|
1090
|
+
completionTrigger.wake();
|
|
1091
|
+
});
|
|
1092
|
+
});
|
|
1093
|
+
this.#scheduled = true;
|
|
1094
|
+
}
|
|
1095
|
+
/**
|
|
1096
|
+
* Schedule the task to run and wait for it to finish.
|
|
1097
|
+
*/
|
|
1098
|
+
async runBlocking() {
|
|
1099
|
+
if (this.#ctx?.disposed) {
|
|
1100
|
+
throw new ContextDisposedError2();
|
|
1101
|
+
}
|
|
1102
|
+
this.schedule();
|
|
1103
|
+
await this.#nextTask.wait();
|
|
1104
|
+
}
|
|
1105
|
+
/**
|
|
1106
|
+
* Waits for the current task to finish if it is running.
|
|
1107
|
+
* Does not schedule a new task.
|
|
1108
|
+
*/
|
|
1109
|
+
async join() {
|
|
1110
|
+
await this.#currentTask;
|
|
1111
|
+
}
|
|
1112
|
+
};
|
|
1054
1113
|
var runInContext = (ctx, fn) => {
|
|
1055
1114
|
try {
|
|
1056
1115
|
fn();
|
|
@@ -1136,9 +1195,9 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
1136
1195
|
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;
|
|
1137
1196
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1138
1197
|
}
|
|
1139
|
-
var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
|
|
1140
1198
|
var INIT_RESTART_DELAY = 100;
|
|
1141
1199
|
var DEFAULT_MAX_RESTART_DELAY = 5e3;
|
|
1200
|
+
var STABLE_CONNECTION_THRESHOLD = 5e3;
|
|
1142
1201
|
var PersistentLifecycle = class extends Resource {
|
|
1143
1202
|
_start;
|
|
1144
1203
|
_stop;
|
|
@@ -1147,6 +1206,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1147
1206
|
_currentState = void 0;
|
|
1148
1207
|
_restartTask = void 0;
|
|
1149
1208
|
_restartAfter = 0;
|
|
1209
|
+
_connectedAt = void 0;
|
|
1150
1210
|
constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
|
|
1151
1211
|
super();
|
|
1152
1212
|
this._start = start;
|
|
@@ -1162,29 +1222,27 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1162
1222
|
try {
|
|
1163
1223
|
await this._restart();
|
|
1164
1224
|
} catch (err) {
|
|
1225
|
+
if (this._ctx?.disposed) {
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1165
1228
|
log2.warn("Restart failed", {
|
|
1166
1229
|
err
|
|
1167
|
-
}, {
|
|
1168
|
-
F: __dxlog_file4,
|
|
1169
|
-
L: 72,
|
|
1170
|
-
S: this,
|
|
1171
|
-
C: (f, a) => f(...a)
|
|
1172
1230
|
});
|
|
1173
1231
|
this._restartTask?.schedule();
|
|
1174
1232
|
}
|
|
1175
1233
|
});
|
|
1176
|
-
|
|
1234
|
+
try {
|
|
1235
|
+
this._currentState = await this._start();
|
|
1236
|
+
this._connectedAt = Date.now();
|
|
1237
|
+
} catch (err) {
|
|
1238
|
+
if (this._ctx?.disposed) {
|
|
1239
|
+
return;
|
|
1240
|
+
}
|
|
1177
1241
|
log2.warn("Start failed", {
|
|
1178
1242
|
err
|
|
1179
|
-
}, {
|
|
1180
|
-
F: __dxlog_file4,
|
|
1181
|
-
L: 78,
|
|
1182
|
-
S: this,
|
|
1183
|
-
C: (f, a) => f(...a)
|
|
1184
1243
|
});
|
|
1185
1244
|
this._restartTask?.schedule();
|
|
1186
|
-
|
|
1187
|
-
});
|
|
1245
|
+
}
|
|
1188
1246
|
}
|
|
1189
1247
|
async _close() {
|
|
1190
1248
|
await this._restartTask?.join();
|
|
@@ -1194,12 +1252,11 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1194
1252
|
async _restart() {
|
|
1195
1253
|
log2(`restarting in ${this._restartAfter}ms`, {
|
|
1196
1254
|
state: this._lifecycleState
|
|
1197
|
-
}, {
|
|
1198
|
-
F: __dxlog_file4,
|
|
1199
|
-
L: 91,
|
|
1200
|
-
S: this,
|
|
1201
|
-
C: (f, a) => f(...a)
|
|
1202
1255
|
});
|
|
1256
|
+
if (this._connectedAt !== void 0 && Date.now() - this._connectedAt >= STABLE_CONNECTION_THRESHOLD) {
|
|
1257
|
+
this._restartAfter = 0;
|
|
1258
|
+
}
|
|
1259
|
+
this._connectedAt = void 0;
|
|
1203
1260
|
await this._stopCurrentState();
|
|
1204
1261
|
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
1205
1262
|
return;
|
|
@@ -1209,7 +1266,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1209
1266
|
await warnAfterTimeout2(5e3, "Connection establishment takes too long", async () => {
|
|
1210
1267
|
this._currentState = await this._start();
|
|
1211
1268
|
});
|
|
1212
|
-
this.
|
|
1269
|
+
this._connectedAt = Date.now();
|
|
1213
1270
|
await this._onRestart?.();
|
|
1214
1271
|
}
|
|
1215
1272
|
async _stopCurrentState() {
|
|
@@ -1217,12 +1274,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1217
1274
|
try {
|
|
1218
1275
|
await this._stop(this._currentState);
|
|
1219
1276
|
} catch (err) {
|
|
1220
|
-
log2.catch(err
|
|
1221
|
-
F: __dxlog_file4,
|
|
1222
|
-
L: 113,
|
|
1223
|
-
S: this,
|
|
1224
|
-
C: (f, a) => f(...a)
|
|
1225
|
-
});
|
|
1277
|
+
log2.catch(err);
|
|
1226
1278
|
}
|
|
1227
1279
|
this._currentState = void 0;
|
|
1228
1280
|
}
|
|
@@ -1246,7 +1298,6 @@ _ts_decorate([
|
|
|
1246
1298
|
|
|
1247
1299
|
// src/push-iterable.ts
|
|
1248
1300
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
1249
|
-
var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
|
|
1250
1301
|
var makePushIterable = () => {
|
|
1251
1302
|
const buf = [];
|
|
1252
1303
|
const trigger2 = new Trigger({
|
|
@@ -1260,15 +1311,7 @@ var makePushIterable = () => {
|
|
|
1260
1311
|
await trigger2.wait();
|
|
1261
1312
|
}
|
|
1262
1313
|
const item = buf.shift();
|
|
1263
|
-
invariant2(item
|
|
1264
|
-
F: __dxlog_file5,
|
|
1265
|
-
L: 42,
|
|
1266
|
-
S: this,
|
|
1267
|
-
A: [
|
|
1268
|
-
"item",
|
|
1269
|
-
""
|
|
1270
|
-
]
|
|
1271
|
-
});
|
|
1314
|
+
invariant2(item);
|
|
1272
1315
|
switch (item.kind) {
|
|
1273
1316
|
case "next":
|
|
1274
1317
|
return {
|
|
@@ -1447,13 +1490,11 @@ var untilError = (cb) => {
|
|
|
1447
1490
|
// src/timer.ts
|
|
1448
1491
|
var Timer = class {
|
|
1449
1492
|
_callback;
|
|
1450
|
-
_state;
|
|
1493
|
+
_state = new Event();
|
|
1451
1494
|
_timer;
|
|
1452
|
-
_count;
|
|
1495
|
+
_count = 0;
|
|
1453
1496
|
constructor(_callback) {
|
|
1454
1497
|
this._callback = _callback;
|
|
1455
|
-
this._state = new Event();
|
|
1456
|
-
this._count = 0;
|
|
1457
1498
|
}
|
|
1458
1499
|
get state() {
|
|
1459
1500
|
return this._state;
|
|
@@ -1506,16 +1547,13 @@ var UpdateScheduler = class {
|
|
|
1506
1547
|
* Promise that resolves when the callback is done.
|
|
1507
1548
|
* Never rejects.
|
|
1508
1549
|
*/
|
|
1509
|
-
_promise;
|
|
1510
|
-
_scheduled;
|
|
1511
|
-
_lastUpdateTime;
|
|
1550
|
+
_promise = null;
|
|
1551
|
+
_scheduled = false;
|
|
1552
|
+
_lastUpdateTime = -TIME_PERIOD;
|
|
1512
1553
|
constructor(_ctx, _callback, _params = {}) {
|
|
1513
1554
|
this._ctx = _ctx;
|
|
1514
1555
|
this._callback = _callback;
|
|
1515
1556
|
this._params = _params;
|
|
1516
|
-
this._promise = null;
|
|
1517
|
-
this._scheduled = false;
|
|
1518
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1519
1557
|
_ctx.onDispose(async () => {
|
|
1520
1558
|
await this._promise;
|
|
1521
1559
|
});
|
|
@@ -1528,13 +1566,13 @@ var UpdateScheduler = class {
|
|
|
1528
1566
|
await this._promise;
|
|
1529
1567
|
if (this._params.maxFrequency) {
|
|
1530
1568
|
const now = performance.now();
|
|
1531
|
-
const
|
|
1532
|
-
if (
|
|
1569
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1570
|
+
if (delay2 > 0) {
|
|
1533
1571
|
await new Promise((resolve) => {
|
|
1534
1572
|
const timeoutId = setTimeout(() => {
|
|
1535
1573
|
clearContext();
|
|
1536
1574
|
resolve();
|
|
1537
|
-
},
|
|
1575
|
+
}, delay2);
|
|
1538
1576
|
const clearContext = this._ctx.onDispose(() => {
|
|
1539
1577
|
clearTimeout(timeoutId);
|
|
1540
1578
|
resolve();
|
|
@@ -1578,6 +1616,7 @@ var UpdateScheduler = class {
|
|
|
1578
1616
|
}
|
|
1579
1617
|
};
|
|
1580
1618
|
export {
|
|
1619
|
+
AsyncTask,
|
|
1581
1620
|
CancellableObservableProvider,
|
|
1582
1621
|
DeferredTask,
|
|
1583
1622
|
Event,
|
|
@@ -1604,6 +1643,7 @@ export {
|
|
|
1604
1643
|
combine,
|
|
1605
1644
|
debounce,
|
|
1606
1645
|
debounceAndThrottle,
|
|
1646
|
+
delay,
|
|
1607
1647
|
dumpLeaks,
|
|
1608
1648
|
interval,
|
|
1609
1649
|
latch,
|