@dxos/async 0.8.4-main.84f28bd → 0.8.4-main.9735255
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 +297 -196
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +297 -196
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/callback.d.ts +2 -1
- package/dist/types/src/callback.d.ts.map +1 -1
- package/dist/types/src/chain.d.ts +1 -1
- package/dist/types/src/chain.d.ts.map +1 -1
- package/dist/types/src/cleanup.d.ts +2 -1
- package/dist/types/src/cleanup.d.ts.map +1 -1
- package/dist/types/src/debounce.d.ts +31 -2
- package/dist/types/src/debounce.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +0 -5
- package/dist/types/src/index.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 +28 -0
- package/dist/types/src/task-scheduling.d.ts.map +1 -1
- package/dist/types/src/testing.d.ts +13 -0
- 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/trigger.d.ts +11 -0
- package/dist/types/src/trigger.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -9
- package/src/callback.ts +3 -3
- package/src/chain.ts +1 -1
- package/src/cleanup.ts +4 -3
- package/src/debounce.test.ts +69 -12
- package/src/debounce.ts +82 -13
- package/src/event-emitter.test.ts +2 -1
- package/src/index.ts +0 -5
- package/src/observable-value.test.ts +1 -1
- package/src/persistent-lifecycle.test.ts +1 -1
- package/src/persistent-lifecycle.ts +2 -2
- package/src/task-scheduling.ts +94 -1
- package/src/testing.test.ts +41 -1
- package/src/testing.ts +53 -0
- package/src/timeout.ts +23 -22
- package/src/trigger.ts +58 -1
- package/src/update-scheduler.ts +1 -1
- package/dist/types/src/latch.d.ts +0 -11
- package/dist/types/src/latch.d.ts.map +0 -1
- package/dist/types/src/sink.d.ts +0 -6
- package/dist/types/src/sink.d.ts.map +0 -1
- package/dist/types/src/throttle.d.ts +0 -2
- package/dist/types/src/throttle.d.ts.map +0 -1
- package/dist/types/src/throttle.test.d.ts +0 -2
- package/dist/types/src/throttle.test.d.ts.map +0 -1
- package/dist/types/src/types.d.ts +0 -2
- package/dist/types/src/types.d.ts.map +0 -1
- package/dist/types/src/until.d.ts +0 -14
- package/dist/types/src/until.d.ts.map +0 -1
- package/dist/types/src/until.test.d.ts +0 -2
- package/dist/types/src/until.test.d.ts.map +0 -1
- package/src/latch.ts +0 -60
- package/src/sink.ts +0 -26
- package/src/throttle.test.ts +0 -65
- package/src/throttle.ts +0 -14
- package/src/types.ts +0 -5
- package/src/until.test.ts +0 -47
- package/src/until.ts +0 -58
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
2
|
|
|
3
3
|
// src/callback.ts
|
|
4
|
-
var
|
|
4
|
+
var promiseFromCallback = (run) => new Promise((resolve, reject) => {
|
|
5
5
|
run((error, value) => {
|
|
6
6
|
if (error) {
|
|
7
7
|
reject(error);
|
|
@@ -12,9 +12,9 @@ var createPromiseFromCallback = (run) => new Promise((resolve, reject) => {
|
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
// src/chain.ts
|
|
15
|
-
var
|
|
15
|
+
var chain = (chain2) => async (elements) => {
|
|
16
16
|
let result = await elements;
|
|
17
|
-
for (const part of
|
|
17
|
+
for (const part of chain2) {
|
|
18
18
|
result = await Promise.all(result.map(async (element) => await part(element)));
|
|
19
19
|
}
|
|
20
20
|
return result;
|
|
@@ -35,14 +35,12 @@ var interval = (cb, ms) => {
|
|
|
35
35
|
const t = setInterval(cb, ms);
|
|
36
36
|
return () => clearInterval(t);
|
|
37
37
|
};
|
|
38
|
-
|
|
38
|
+
var addEventListener = (target, type, listener, options) => {
|
|
39
39
|
target.addEventListener(type, listener, options);
|
|
40
40
|
return () => target.removeEventListener(type, listener, options);
|
|
41
|
-
}
|
|
41
|
+
};
|
|
42
42
|
var SubscriptionList = class {
|
|
43
|
-
|
|
44
|
-
this._cleanups = [];
|
|
45
|
-
}
|
|
43
|
+
_cleanups = [];
|
|
46
44
|
add(cb) {
|
|
47
45
|
this._cleanups.push(cb);
|
|
48
46
|
return this;
|
|
@@ -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
|
}
|
|
@@ -66,32 +65,56 @@ var SubscriptionSet = class {
|
|
|
66
65
|
}
|
|
67
66
|
};
|
|
68
67
|
|
|
69
|
-
// src/
|
|
70
|
-
var
|
|
71
|
-
let
|
|
68
|
+
// src/debounce.ts
|
|
69
|
+
var delay = (cb, delay2 = 100) => {
|
|
70
|
+
let pending = false;
|
|
72
71
|
return (...args) => {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
cb(...args);
|
|
76
|
-
lastCall = now;
|
|
72
|
+
if (pending) {
|
|
73
|
+
return;
|
|
77
74
|
}
|
|
75
|
+
pending = true;
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
try {
|
|
78
|
+
cb(...args);
|
|
79
|
+
} finally {
|
|
80
|
+
pending = false;
|
|
81
|
+
}
|
|
82
|
+
}, delay2);
|
|
78
83
|
};
|
|
79
84
|
};
|
|
80
|
-
|
|
81
|
-
// src/debounce.ts
|
|
82
|
-
var debounce = (cb, wait = 100) => {
|
|
85
|
+
var debounce = (cb, delay2 = 100) => {
|
|
83
86
|
let t;
|
|
84
87
|
return (...args) => {
|
|
85
88
|
clearTimeout(t);
|
|
86
|
-
t = setTimeout(() => cb(...args),
|
|
89
|
+
t = setTimeout(() => cb(...args), delay2);
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
var throttle = (cb, delay2 = 100) => {
|
|
93
|
+
let lastCall = 0;
|
|
94
|
+
return (...args) => {
|
|
95
|
+
const now = Date.now();
|
|
96
|
+
if (now - lastCall >= delay2) {
|
|
97
|
+
cb(...args);
|
|
98
|
+
lastCall = now;
|
|
99
|
+
}
|
|
87
100
|
};
|
|
88
101
|
};
|
|
89
|
-
var debounceAndThrottle = (cb,
|
|
90
|
-
|
|
91
|
-
|
|
102
|
+
var debounceAndThrottle = (cb, delay2 = 100) => {
|
|
103
|
+
let timeout2;
|
|
104
|
+
let lastCall = 0;
|
|
92
105
|
return (...args) => {
|
|
93
|
-
|
|
94
|
-
|
|
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
|
+
}
|
|
95
118
|
};
|
|
96
119
|
};
|
|
97
120
|
|
|
@@ -126,6 +149,23 @@ var sleep = (ms) => {
|
|
|
126
149
|
sleeper();
|
|
127
150
|
});
|
|
128
151
|
};
|
|
152
|
+
var sleepWithContext = (ctx, ms) => {
|
|
153
|
+
const error = new ContextDisposedError();
|
|
154
|
+
return new Promise((resolve, reject) => {
|
|
155
|
+
if (ctx.disposed) {
|
|
156
|
+
reject(error);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const timeout2 = setTimeout(() => {
|
|
160
|
+
clearDispose();
|
|
161
|
+
resolve();
|
|
162
|
+
}, ms);
|
|
163
|
+
const clearDispose = ctx.onDispose(() => {
|
|
164
|
+
clearTimeout(timeout2);
|
|
165
|
+
reject(error);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
};
|
|
129
169
|
var asyncReturn = () => sleep(0);
|
|
130
170
|
var asyncTimeout = async (promise, timeout2, err) => {
|
|
131
171
|
let timeoutId;
|
|
@@ -136,7 +176,7 @@ var asyncTimeout = async (promise, timeout2, err) => {
|
|
|
136
176
|
}, timeout2);
|
|
137
177
|
unrefTimeout(timeoutId);
|
|
138
178
|
});
|
|
139
|
-
const conditionTimeout = typeof promise === "function" ?
|
|
179
|
+
const conditionTimeout = typeof promise === "function" ? promiseFromCallback(promise) : promise;
|
|
140
180
|
return await Promise.race([
|
|
141
181
|
conditionTimeout,
|
|
142
182
|
timeoutPromise
|
|
@@ -149,23 +189,6 @@ var unrefTimeout = (timeoutId) => {
|
|
|
149
189
|
timeoutId.unref();
|
|
150
190
|
}
|
|
151
191
|
};
|
|
152
|
-
var sleepWithContext = (ctx, ms) => {
|
|
153
|
-
const error = new ContextDisposedError();
|
|
154
|
-
return new Promise((resolve, reject) => {
|
|
155
|
-
if (ctx.disposed) {
|
|
156
|
-
reject(error);
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
const timeout2 = setTimeout(() => {
|
|
160
|
-
clearDispose();
|
|
161
|
-
resolve();
|
|
162
|
-
}, ms);
|
|
163
|
-
const clearDispose = ctx.onDispose(() => {
|
|
164
|
-
clearTimeout(timeout2);
|
|
165
|
-
reject(error);
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
};
|
|
169
192
|
|
|
170
193
|
// src/event-emitter.ts
|
|
171
194
|
var onEvent = (eventEmitter, eventName, callback) => {
|
|
@@ -195,10 +218,6 @@ import { Context } from "@dxos/context";
|
|
|
195
218
|
var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
|
|
196
219
|
var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
|
|
197
220
|
var Event = class _Event {
|
|
198
|
-
constructor() {
|
|
199
|
-
this._listeners = /* @__PURE__ */ new Set();
|
|
200
|
-
this._effects = /* @__PURE__ */ new Set();
|
|
201
|
-
}
|
|
202
221
|
/**
|
|
203
222
|
* Wrap objects that have on/off style event emitters.
|
|
204
223
|
*/
|
|
@@ -211,6 +230,8 @@ var Event = class _Event {
|
|
|
211
230
|
});
|
|
212
231
|
return event;
|
|
213
232
|
}
|
|
233
|
+
_listeners = /* @__PURE__ */ new Set();
|
|
234
|
+
_effects = /* @__PURE__ */ new Set();
|
|
214
235
|
/**
|
|
215
236
|
* Emit an event.
|
|
216
237
|
* In most cases should only be called by the class or entity containing the event.
|
|
@@ -454,11 +475,15 @@ var Event = class _Event {
|
|
|
454
475
|
}
|
|
455
476
|
};
|
|
456
477
|
var EventListener = class {
|
|
478
|
+
ctx;
|
|
479
|
+
once;
|
|
480
|
+
weak;
|
|
481
|
+
callback;
|
|
482
|
+
_clearDispose = void 0;
|
|
457
483
|
constructor(event, listener, ctx, once, weak) {
|
|
458
484
|
this.ctx = ctx;
|
|
459
485
|
this.once = once;
|
|
460
486
|
this.weak = weak;
|
|
461
|
-
this._clearDispose = void 0;
|
|
462
487
|
this._clearDispose = ctx.onDispose(() => {
|
|
463
488
|
event._removeListener(this);
|
|
464
489
|
});
|
|
@@ -518,65 +543,13 @@ var weakListeners = () => {
|
|
|
518
543
|
};
|
|
519
544
|
};
|
|
520
545
|
|
|
521
|
-
// src/latch.ts
|
|
522
|
-
import { invariant } from "@dxos/invariant";
|
|
523
|
-
var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/latch.ts";
|
|
524
|
-
var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
525
|
-
invariant(count >= 0, void 0, {
|
|
526
|
-
F: __dxlog_file2,
|
|
527
|
-
L: 19,
|
|
528
|
-
S: void 0,
|
|
529
|
-
A: [
|
|
530
|
-
"count >= 0",
|
|
531
|
-
""
|
|
532
|
-
]
|
|
533
|
-
});
|
|
534
|
-
let t;
|
|
535
|
-
let doResolve;
|
|
536
|
-
let doReject;
|
|
537
|
-
const promise = new Promise((resolve, reject) => {
|
|
538
|
-
doResolve = (value) => {
|
|
539
|
-
clearTimeout(t);
|
|
540
|
-
resolve(value);
|
|
541
|
-
};
|
|
542
|
-
doReject = (err) => {
|
|
543
|
-
clearTimeout(t);
|
|
544
|
-
reject(err);
|
|
545
|
-
};
|
|
546
|
-
});
|
|
547
|
-
if (count === 0) {
|
|
548
|
-
setTimeout(() => {
|
|
549
|
-
doResolve(0);
|
|
550
|
-
});
|
|
551
|
-
} else {
|
|
552
|
-
if (timeout2) {
|
|
553
|
-
t = setTimeout(() => {
|
|
554
|
-
doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
|
|
555
|
-
}, timeout2);
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
let i = 0;
|
|
559
|
-
return [
|
|
560
|
-
async () => await promise,
|
|
561
|
-
() => {
|
|
562
|
-
if (++i === count) {
|
|
563
|
-
doResolve(i);
|
|
564
|
-
}
|
|
565
|
-
return i;
|
|
566
|
-
},
|
|
567
|
-
(err) => doReject(err)
|
|
568
|
-
];
|
|
569
|
-
};
|
|
570
|
-
|
|
571
546
|
// src/mutex.ts
|
|
572
547
|
import "@dxos/util";
|
|
573
548
|
import { warnAfterTimeout } from "@dxos/debug";
|
|
574
549
|
var Mutex = class {
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
this._tag = null;
|
|
579
|
-
}
|
|
550
|
+
_queue = Promise.resolve();
|
|
551
|
+
_queueLength = 0;
|
|
552
|
+
_tag = null;
|
|
580
553
|
get tag() {
|
|
581
554
|
return this._tag;
|
|
582
555
|
}
|
|
@@ -622,6 +595,7 @@ var Mutex = class {
|
|
|
622
595
|
}
|
|
623
596
|
};
|
|
624
597
|
var MutexGuard = class {
|
|
598
|
+
_release;
|
|
625
599
|
constructor(_release) {
|
|
626
600
|
this._release = _release;
|
|
627
601
|
}
|
|
@@ -665,6 +639,8 @@ import Observable from "zen-observable";
|
|
|
665
639
|
import PushStream from "zen-push";
|
|
666
640
|
|
|
667
641
|
// src/trigger.ts
|
|
642
|
+
import { invariant } from "@dxos/invariant";
|
|
643
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/trigger.ts";
|
|
668
644
|
var trigger = (timeout2) => {
|
|
669
645
|
let callback;
|
|
670
646
|
const promise = new Promise((resolve, reject) => {
|
|
@@ -680,18 +656,22 @@ var trigger = (timeout2) => {
|
|
|
680
656
|
resolver
|
|
681
657
|
];
|
|
682
658
|
};
|
|
683
|
-
var TriggerState = /* @__PURE__ */ function(TriggerState2) {
|
|
659
|
+
var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
|
|
684
660
|
TriggerState2["WAITING"] = "WAITING";
|
|
685
661
|
TriggerState2["RESOLVED"] = "RESOLVED";
|
|
686
662
|
TriggerState2["REJECTED"] = "REJECTED";
|
|
687
663
|
return TriggerState2;
|
|
688
|
-
}({});
|
|
664
|
+
})({});
|
|
689
665
|
var Trigger = class {
|
|
666
|
+
_options;
|
|
667
|
+
_promise;
|
|
668
|
+
_resolve;
|
|
669
|
+
_reject;
|
|
670
|
+
_state = "WAITING";
|
|
690
671
|
constructor(_options = {
|
|
691
672
|
autoReset: false
|
|
692
673
|
}) {
|
|
693
674
|
this._options = _options;
|
|
694
|
-
this._state = "WAITING";
|
|
695
675
|
this.reset();
|
|
696
676
|
}
|
|
697
677
|
get state() {
|
|
@@ -751,23 +731,61 @@ var Trigger = class {
|
|
|
751
731
|
return this;
|
|
752
732
|
}
|
|
753
733
|
};
|
|
734
|
+
var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
735
|
+
invariant(count >= 0, void 0, {
|
|
736
|
+
F: __dxlog_file2,
|
|
737
|
+
L: 139,
|
|
738
|
+
S: void 0,
|
|
739
|
+
A: [
|
|
740
|
+
"count >= 0",
|
|
741
|
+
""
|
|
742
|
+
]
|
|
743
|
+
});
|
|
744
|
+
let t;
|
|
745
|
+
let doResolve;
|
|
746
|
+
let doReject;
|
|
747
|
+
const promise = new Promise((resolve, reject) => {
|
|
748
|
+
doResolve = (value) => {
|
|
749
|
+
clearTimeout(t);
|
|
750
|
+
resolve(value);
|
|
751
|
+
};
|
|
752
|
+
doReject = (err) => {
|
|
753
|
+
clearTimeout(t);
|
|
754
|
+
reject(err);
|
|
755
|
+
};
|
|
756
|
+
});
|
|
757
|
+
if (count === 0) {
|
|
758
|
+
setTimeout(() => {
|
|
759
|
+
doResolve(0);
|
|
760
|
+
});
|
|
761
|
+
} else {
|
|
762
|
+
if (timeout2) {
|
|
763
|
+
t = setTimeout(() => {
|
|
764
|
+
doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
|
|
765
|
+
}, timeout2);
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
let i = 0;
|
|
769
|
+
return [
|
|
770
|
+
async () => await promise,
|
|
771
|
+
() => {
|
|
772
|
+
if (++i === count) {
|
|
773
|
+
doResolve(i);
|
|
774
|
+
}
|
|
775
|
+
return i;
|
|
776
|
+
},
|
|
777
|
+
(err) => doReject(err)
|
|
778
|
+
];
|
|
779
|
+
};
|
|
754
780
|
|
|
755
781
|
// src/observable.ts
|
|
756
782
|
var MulticastObservable = class _MulticastObservable extends Observable {
|
|
783
|
+
_value;
|
|
784
|
+
_observers = /* @__PURE__ */ new Set();
|
|
785
|
+
_observable;
|
|
786
|
+
_completed = new Trigger();
|
|
757
787
|
constructor(subscriber, _value) {
|
|
758
|
-
super((observer) => this._subscribe(observer)), this._value = _value
|
|
759
|
-
next: (value) => {
|
|
760
|
-
this._value = value;
|
|
761
|
-
this._observers.forEach((observer) => observer.next?.(value));
|
|
762
|
-
},
|
|
763
|
-
error: (err) => {
|
|
764
|
-
this._observers.forEach((observer) => observer.error?.(err));
|
|
765
|
-
},
|
|
766
|
-
complete: () => {
|
|
767
|
-
this._completed.wake();
|
|
768
|
-
this._observers.forEach((observer) => observer.complete?.());
|
|
769
|
-
}
|
|
770
|
-
};
|
|
788
|
+
super((observer) => this._subscribe(observer)), this._value = _value;
|
|
771
789
|
this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
|
|
772
790
|
this._observable.subscribe(this._handlers);
|
|
773
791
|
}
|
|
@@ -851,18 +869,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
|
|
|
851
869
|
this._observers.delete(observer);
|
|
852
870
|
};
|
|
853
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
|
+
};
|
|
854
885
|
};
|
|
855
886
|
var EMPTY_OBSERVABLE = MulticastObservable.of(null);
|
|
856
887
|
|
|
857
888
|
// src/observable-value.ts
|
|
858
889
|
import { createSetDispatch } from "@dxos/util";
|
|
859
890
|
var ObservableProvider = class {
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
this.
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
}
|
|
891
|
+
_handlers = /* @__PURE__ */ new Set();
|
|
892
|
+
_proxy = createSetDispatch({
|
|
893
|
+
handlers: this._handlers
|
|
894
|
+
});
|
|
895
|
+
_value;
|
|
866
896
|
/**
|
|
867
897
|
* Proxy used to dispatch callbacks to each subscription.
|
|
868
898
|
*/
|
|
@@ -883,8 +913,10 @@ var ObservableProvider = class {
|
|
|
883
913
|
}
|
|
884
914
|
};
|
|
885
915
|
var CancellableObservableProvider = class extends ObservableProvider {
|
|
916
|
+
_handleCancel;
|
|
917
|
+
_cancelled = false;
|
|
886
918
|
constructor(_handleCancel) {
|
|
887
|
-
super(), this._handleCancel = _handleCancel
|
|
919
|
+
super(), this._handleCancel = _handleCancel;
|
|
888
920
|
}
|
|
889
921
|
get cancelled() {
|
|
890
922
|
return this._cancelled;
|
|
@@ -994,12 +1026,14 @@ if (enabled) {
|
|
|
994
1026
|
|
|
995
1027
|
// src/task-scheduling.ts
|
|
996
1028
|
var DeferredTask = class {
|
|
1029
|
+
_ctx;
|
|
1030
|
+
_callback;
|
|
1031
|
+
_scheduled = false;
|
|
1032
|
+
_currentTask = null;
|
|
1033
|
+
_nextTask = new Trigger();
|
|
997
1034
|
constructor(_ctx, _callback) {
|
|
998
1035
|
this._ctx = _ctx;
|
|
999
1036
|
this._callback = _callback;
|
|
1000
|
-
this._scheduled = false;
|
|
1001
|
-
this._currentTask = null;
|
|
1002
|
-
this._nextTask = new Trigger();
|
|
1003
1037
|
}
|
|
1004
1038
|
get scheduled() {
|
|
1005
1039
|
return this._scheduled;
|
|
@@ -1040,6 +1074,78 @@ var DeferredTask = class {
|
|
|
1040
1074
|
await this._currentTask;
|
|
1041
1075
|
}
|
|
1042
1076
|
};
|
|
1077
|
+
var AsyncTask = class {
|
|
1078
|
+
#callback;
|
|
1079
|
+
#ctx = void 0;
|
|
1080
|
+
#scheduled = false;
|
|
1081
|
+
#currentTask = null;
|
|
1082
|
+
#nextTask = new Trigger();
|
|
1083
|
+
constructor(callback) {
|
|
1084
|
+
this.#callback = callback;
|
|
1085
|
+
}
|
|
1086
|
+
get scheduled() {
|
|
1087
|
+
return this.#scheduled;
|
|
1088
|
+
}
|
|
1089
|
+
/**
|
|
1090
|
+
* Context of the resource that owns the task.
|
|
1091
|
+
* When the context is disposed, the task is cancelled and cannot be scheduled again.
|
|
1092
|
+
*/
|
|
1093
|
+
// TODO(dmaretskyi): We don't really need to pass ctx in here, since close will also signal dispose.
|
|
1094
|
+
open(ctx) {
|
|
1095
|
+
this.#ctx = ctx;
|
|
1096
|
+
}
|
|
1097
|
+
/**
|
|
1098
|
+
* Closes the task and waits for it to finish if it is running.
|
|
1099
|
+
*/
|
|
1100
|
+
async close() {
|
|
1101
|
+
this.#ctx = void 0;
|
|
1102
|
+
await this.join();
|
|
1103
|
+
}
|
|
1104
|
+
[Symbol.asyncDispose]() {
|
|
1105
|
+
return this.close();
|
|
1106
|
+
}
|
|
1107
|
+
/**
|
|
1108
|
+
* Schedule the task to run asynchronously.
|
|
1109
|
+
*/
|
|
1110
|
+
schedule() {
|
|
1111
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1112
|
+
throw new Error("AsyncTask not open");
|
|
1113
|
+
}
|
|
1114
|
+
if (this.#scheduled) {
|
|
1115
|
+
return;
|
|
1116
|
+
}
|
|
1117
|
+
scheduleTask(this.#ctx, async () => {
|
|
1118
|
+
await this.#currentTask;
|
|
1119
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1120
|
+
return;
|
|
1121
|
+
}
|
|
1122
|
+
this.#scheduled = false;
|
|
1123
|
+
const completionTrigger = this.#nextTask;
|
|
1124
|
+
this.#nextTask = new Trigger();
|
|
1125
|
+
this.#currentTask = runInContextAsync(this.#ctx, () => this.#callback()).then(() => {
|
|
1126
|
+
completionTrigger.wake();
|
|
1127
|
+
});
|
|
1128
|
+
});
|
|
1129
|
+
this.#scheduled = true;
|
|
1130
|
+
}
|
|
1131
|
+
/**
|
|
1132
|
+
* Schedule the task to run and wait for it to finish.
|
|
1133
|
+
*/
|
|
1134
|
+
async runBlocking() {
|
|
1135
|
+
if (this.#ctx?.disposed) {
|
|
1136
|
+
throw new ContextDisposedError2();
|
|
1137
|
+
}
|
|
1138
|
+
this.schedule();
|
|
1139
|
+
await this.#nextTask.wait();
|
|
1140
|
+
}
|
|
1141
|
+
/**
|
|
1142
|
+
* Waits for the current task to finish if it is running.
|
|
1143
|
+
* Does not schedule a new task.
|
|
1144
|
+
*/
|
|
1145
|
+
async join() {
|
|
1146
|
+
await this.#currentTask;
|
|
1147
|
+
}
|
|
1148
|
+
};
|
|
1043
1149
|
var runInContext = (ctx, fn) => {
|
|
1044
1150
|
try {
|
|
1045
1151
|
fn();
|
|
@@ -1129,11 +1235,15 @@ var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecyc
|
|
|
1129
1235
|
var INIT_RESTART_DELAY = 100;
|
|
1130
1236
|
var DEFAULT_MAX_RESTART_DELAY = 5e3;
|
|
1131
1237
|
var PersistentLifecycle = class extends Resource {
|
|
1238
|
+
_start;
|
|
1239
|
+
_stop;
|
|
1240
|
+
_onRestart;
|
|
1241
|
+
_maxRestartDelay;
|
|
1242
|
+
_currentState = void 0;
|
|
1243
|
+
_restartTask = void 0;
|
|
1244
|
+
_restartAfter = 0;
|
|
1132
1245
|
constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
|
|
1133
1246
|
super();
|
|
1134
|
-
this._currentState = void 0;
|
|
1135
|
-
this._restartTask = void 0;
|
|
1136
|
-
this._restartAfter = 0;
|
|
1137
1247
|
this._start = start;
|
|
1138
1248
|
this._stop = stop;
|
|
1139
1249
|
this._onRestart = onRestart;
|
|
@@ -1295,20 +1405,6 @@ var makePushIterable = () => {
|
|
|
1295
1405
|
};
|
|
1296
1406
|
};
|
|
1297
1407
|
|
|
1298
|
-
// src/sink.ts
|
|
1299
|
-
var sink = (emitter, event, count = 1) => {
|
|
1300
|
-
const [getPromise, resolve] = trigger();
|
|
1301
|
-
let counter = 0;
|
|
1302
|
-
const listener = () => {
|
|
1303
|
-
if (++counter === count) {
|
|
1304
|
-
emitter.off(event, listener);
|
|
1305
|
-
resolve();
|
|
1306
|
-
}
|
|
1307
|
-
};
|
|
1308
|
-
emitter.on(event, listener);
|
|
1309
|
-
return getPromise();
|
|
1310
|
-
};
|
|
1311
|
-
|
|
1312
1408
|
// src/stream-to-array.ts
|
|
1313
1409
|
var streamToArray = (stream) => {
|
|
1314
1410
|
let deferred;
|
|
@@ -1354,11 +1450,6 @@ var streamToArray = (stream) => {
|
|
|
1354
1450
|
// src/test-stream.ts
|
|
1355
1451
|
import { Duplex } from "node:stream";
|
|
1356
1452
|
var TestStream = class extends Duplex {
|
|
1357
|
-
constructor() {
|
|
1358
|
-
super(...arguments);
|
|
1359
|
-
this._received = Buffer.alloc(0);
|
|
1360
|
-
this._onWrite = new Event();
|
|
1361
|
-
}
|
|
1362
1453
|
static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
|
|
1363
1454
|
stream1.push("ping");
|
|
1364
1455
|
stream2.push("pong");
|
|
@@ -1371,6 +1462,8 @@ var TestStream = class extends Duplex {
|
|
|
1371
1462
|
})
|
|
1372
1463
|
]);
|
|
1373
1464
|
}
|
|
1465
|
+
_received = Buffer.alloc(0);
|
|
1466
|
+
_onWrite = new Event();
|
|
1374
1467
|
_write(chunk, encoding, callback) {
|
|
1375
1468
|
this._received = Buffer.concat([
|
|
1376
1469
|
this._received,
|
|
@@ -1412,13 +1505,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
|
|
|
1412
1505
|
timeout: timeout2
|
|
1413
1506
|
});
|
|
1414
1507
|
};
|
|
1508
|
+
var until = (cb, timeout2) => {
|
|
1509
|
+
return new Promise((resolve, reject) => {
|
|
1510
|
+
const t = timeout2 && setTimeout(() => {
|
|
1511
|
+
reject(new Error(`Timeout after ${t}ms`));
|
|
1512
|
+
}, timeout2);
|
|
1513
|
+
setTimeout(async () => {
|
|
1514
|
+
try {
|
|
1515
|
+
await cb((value) => {
|
|
1516
|
+
t && clearTimeout(t);
|
|
1517
|
+
resolve(value);
|
|
1518
|
+
}, (error) => {
|
|
1519
|
+
t && clearTimeout(t);
|
|
1520
|
+
reject(error);
|
|
1521
|
+
});
|
|
1522
|
+
} catch (err) {
|
|
1523
|
+
reject(err);
|
|
1524
|
+
}
|
|
1525
|
+
});
|
|
1526
|
+
});
|
|
1527
|
+
};
|
|
1528
|
+
var untilPromise = (cb) => cb();
|
|
1529
|
+
var untilError = (cb) => {
|
|
1530
|
+
return new Promise((resolve, reject) => {
|
|
1531
|
+
setTimeout(async () => {
|
|
1532
|
+
try {
|
|
1533
|
+
await cb();
|
|
1534
|
+
reject(new Error("No error was thrown."));
|
|
1535
|
+
} catch (err) {
|
|
1536
|
+
resolve(err);
|
|
1537
|
+
}
|
|
1538
|
+
});
|
|
1539
|
+
});
|
|
1540
|
+
};
|
|
1415
1541
|
|
|
1416
1542
|
// src/timer.ts
|
|
1417
1543
|
var Timer = class {
|
|
1544
|
+
_callback;
|
|
1545
|
+
_state = new Event();
|
|
1546
|
+
_timer;
|
|
1547
|
+
_count = 0;
|
|
1418
1548
|
constructor(_callback) {
|
|
1419
1549
|
this._callback = _callback;
|
|
1420
|
-
this._state = new Event();
|
|
1421
|
-
this._count = 0;
|
|
1422
1550
|
}
|
|
1423
1551
|
get state() {
|
|
1424
1552
|
return this._state;
|
|
@@ -1461,51 +1589,23 @@ var Timer = class {
|
|
|
1461
1589
|
}
|
|
1462
1590
|
};
|
|
1463
1591
|
|
|
1464
|
-
// src/until.ts
|
|
1465
|
-
var until = (cb, timeout2) => {
|
|
1466
|
-
return new Promise((resolve, reject) => {
|
|
1467
|
-
const t = timeout2 && setTimeout(() => {
|
|
1468
|
-
reject(new Error(`Timeout after ${t}ms`));
|
|
1469
|
-
}, timeout2);
|
|
1470
|
-
setTimeout(async () => {
|
|
1471
|
-
try {
|
|
1472
|
-
await cb((value) => {
|
|
1473
|
-
t && clearTimeout(t);
|
|
1474
|
-
resolve(value);
|
|
1475
|
-
}, (error) => {
|
|
1476
|
-
t && clearTimeout(t);
|
|
1477
|
-
reject(error);
|
|
1478
|
-
});
|
|
1479
|
-
} catch (err) {
|
|
1480
|
-
reject(err);
|
|
1481
|
-
}
|
|
1482
|
-
});
|
|
1483
|
-
});
|
|
1484
|
-
};
|
|
1485
|
-
var untilPromise = (cb) => cb();
|
|
1486
|
-
var untilError = (cb) => {
|
|
1487
|
-
return new Promise((resolve, reject) => {
|
|
1488
|
-
setTimeout(async () => {
|
|
1489
|
-
try {
|
|
1490
|
-
await cb();
|
|
1491
|
-
reject(new Error("No error was thrown."));
|
|
1492
|
-
} catch (err) {
|
|
1493
|
-
resolve(err);
|
|
1494
|
-
}
|
|
1495
|
-
});
|
|
1496
|
-
});
|
|
1497
|
-
};
|
|
1498
|
-
|
|
1499
1592
|
// src/update-scheduler.ts
|
|
1500
1593
|
var TIME_PERIOD = 1e3;
|
|
1501
1594
|
var UpdateScheduler = class {
|
|
1595
|
+
_ctx;
|
|
1596
|
+
_callback;
|
|
1597
|
+
_params;
|
|
1598
|
+
/**
|
|
1599
|
+
* Promise that resolves when the callback is done.
|
|
1600
|
+
* Never rejects.
|
|
1601
|
+
*/
|
|
1602
|
+
_promise = null;
|
|
1603
|
+
_scheduled = false;
|
|
1604
|
+
_lastUpdateTime = -TIME_PERIOD;
|
|
1502
1605
|
constructor(_ctx, _callback, _params = {}) {
|
|
1503
1606
|
this._ctx = _ctx;
|
|
1504
1607
|
this._callback = _callback;
|
|
1505
1608
|
this._params = _params;
|
|
1506
|
-
this._promise = null;
|
|
1507
|
-
this._scheduled = false;
|
|
1508
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1509
1609
|
_ctx.onDispose(async () => {
|
|
1510
1610
|
await this._promise;
|
|
1511
1611
|
});
|
|
@@ -1518,13 +1618,13 @@ var UpdateScheduler = class {
|
|
|
1518
1618
|
await this._promise;
|
|
1519
1619
|
if (this._params.maxFrequency) {
|
|
1520
1620
|
const now = performance.now();
|
|
1521
|
-
const
|
|
1522
|
-
if (
|
|
1621
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1622
|
+
if (delay2 > 0) {
|
|
1523
1623
|
await new Promise((resolve) => {
|
|
1524
1624
|
const timeoutId = setTimeout(() => {
|
|
1525
1625
|
clearContext();
|
|
1526
1626
|
resolve();
|
|
1527
|
-
},
|
|
1627
|
+
}, delay2);
|
|
1528
1628
|
const clearContext = this._ctx.onDispose(() => {
|
|
1529
1629
|
clearTimeout(timeoutId);
|
|
1530
1630
|
resolve();
|
|
@@ -1568,6 +1668,7 @@ var UpdateScheduler = class {
|
|
|
1568
1668
|
}
|
|
1569
1669
|
};
|
|
1570
1670
|
export {
|
|
1671
|
+
AsyncTask,
|
|
1571
1672
|
CancellableObservableProvider,
|
|
1572
1673
|
DeferredTask,
|
|
1573
1674
|
Event,
|
|
@@ -1588,26 +1689,26 @@ export {
|
|
|
1588
1689
|
UpdateScheduler,
|
|
1589
1690
|
addEventListener,
|
|
1590
1691
|
addListener,
|
|
1591
|
-
asyncChain,
|
|
1592
1692
|
asyncReturn,
|
|
1593
1693
|
asyncTimeout,
|
|
1694
|
+
chain,
|
|
1594
1695
|
combine,
|
|
1595
|
-
createPromiseFromCallback,
|
|
1596
1696
|
debounce,
|
|
1597
1697
|
debounceAndThrottle,
|
|
1698
|
+
delay,
|
|
1598
1699
|
dumpLeaks,
|
|
1599
1700
|
interval,
|
|
1600
1701
|
latch,
|
|
1601
1702
|
makePushIterable,
|
|
1602
1703
|
observableError,
|
|
1603
1704
|
onEvent,
|
|
1705
|
+
promiseFromCallback,
|
|
1604
1706
|
runInContext,
|
|
1605
1707
|
runInContextAsync,
|
|
1606
1708
|
scheduleExponentialBackoffTaskInterval,
|
|
1607
1709
|
scheduleMicroTask,
|
|
1608
1710
|
scheduleTask,
|
|
1609
1711
|
scheduleTaskInterval,
|
|
1610
|
-
sink,
|
|
1611
1712
|
sleep,
|
|
1612
1713
|
sleepWithContext,
|
|
1613
1714
|
streamToArray,
|