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