@dxos/async 0.8.4-main.84f28bd → 0.8.4-main.8baae0fced
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 +312 -269
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +312 -269
- 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 +3 -3
- package/dist/types/src/cleanup.d.ts.map +1 -1
- package/dist/types/src/debounce.d.ts +37 -3
- 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/index.d.ts +0 -5
- package/dist/types/src/index.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 +13 -0
- package/dist/types/src/testing.d.ts.map +1 -1
- package/dist/types/src/timeout.d.ts +2 -2
- 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 +11 -0
- 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/callback.ts +3 -3
- package/src/chain.ts +1 -1
- package/src/cleanup.ts +10 -7
- package/src/debounce.test.ts +69 -12
- package/src/debounce.ts +88 -14
- package/src/event-emitter.test.ts +1 -1
- package/src/index.ts +0 -5
- package/src/observable-value.test.ts +1 -1
- 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 +41 -1
- package/src/testing.ts +53 -0
- package/src/timeout.ts +27 -29
- 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;
|
|
@@ -22,7 +22,7 @@ var asyncChain = (chain) => 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) => {
|
|
@@ -33,16 +33,14 @@ 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
|
-
|
|
43
|
-
|
|
44
|
-
add(cb) {
|
|
45
|
-
this._cleanups.push(cb);
|
|
41
|
+
_cleanups = [];
|
|
42
|
+
add(...cb) {
|
|
43
|
+
this._cleanups.push(...cb);
|
|
46
44
|
return this;
|
|
47
45
|
}
|
|
48
46
|
clear() {
|
|
@@ -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,8 +147,28 @@ 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) => {
|
|
169
|
+
if (typeof promise === "function") {
|
|
170
|
+
throw new Error("First argument must be a promise.");
|
|
171
|
+
}
|
|
129
172
|
let timeoutId;
|
|
130
173
|
const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
|
|
131
174
|
const timeoutPromise = new Promise((resolve, reject) => {
|
|
@@ -134,9 +177,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
|
|
|
134
177
|
}, timeout2);
|
|
135
178
|
unrefTimeout(timeoutId);
|
|
136
179
|
});
|
|
137
|
-
const conditionTimeout = typeof promise === "function" ? createPromiseFromCallback(promise) : promise;
|
|
138
180
|
return await Promise.race([
|
|
139
|
-
|
|
181
|
+
promise,
|
|
140
182
|
timeoutPromise
|
|
141
183
|
]).finally(() => {
|
|
142
184
|
clearTimeout(timeoutId);
|
|
@@ -147,23 +189,6 @@ var unrefTimeout = (timeoutId) => {
|
|
|
147
189
|
timeoutId.unref();
|
|
148
190
|
}
|
|
149
191
|
};
|
|
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
192
|
|
|
168
193
|
// src/event-emitter.ts
|
|
169
194
|
var onEvent = (eventEmitter, eventName, callback) => {
|
|
@@ -190,13 +215,8 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
|
|
|
190
215
|
|
|
191
216
|
// src/events.ts
|
|
192
217
|
import { Context } from "@dxos/context";
|
|
193
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
|
|
194
218
|
var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
|
|
195
219
|
var Event = class _Event {
|
|
196
|
-
constructor() {
|
|
197
|
-
this._listeners = /* @__PURE__ */ new Set();
|
|
198
|
-
this._effects = /* @__PURE__ */ new Set();
|
|
199
|
-
}
|
|
200
220
|
/**
|
|
201
221
|
* Wrap objects that have on/off style event emitters.
|
|
202
222
|
*/
|
|
@@ -209,6 +229,8 @@ var Event = class _Event {
|
|
|
209
229
|
});
|
|
210
230
|
return event;
|
|
211
231
|
}
|
|
232
|
+
_listeners = /* @__PURE__ */ new Set();
|
|
233
|
+
_effects = /* @__PURE__ */ new Set();
|
|
212
234
|
/**
|
|
213
235
|
* Emit an event.
|
|
214
236
|
* In most cases should only be called by the class or entity containing the event.
|
|
@@ -247,10 +269,7 @@ var Event = class _Event {
|
|
|
247
269
|
_ctx,
|
|
248
270
|
_callback
|
|
249
271
|
] : [
|
|
250
|
-
new Context(
|
|
251
|
-
F: __dxlog_file,
|
|
252
|
-
L: 132
|
|
253
|
-
}),
|
|
272
|
+
new Context(),
|
|
254
273
|
_ctx
|
|
255
274
|
];
|
|
256
275
|
const weak = !!options?.weak;
|
|
@@ -280,10 +299,7 @@ var Event = class _Event {
|
|
|
280
299
|
_ctx,
|
|
281
300
|
_callback
|
|
282
301
|
] : [
|
|
283
|
-
new Context(
|
|
284
|
-
F: __dxlog_file,
|
|
285
|
-
L: 169
|
|
286
|
-
}),
|
|
302
|
+
new Context(),
|
|
287
303
|
_ctx
|
|
288
304
|
];
|
|
289
305
|
const listener = new EventListener(this, callback, ctx, true, false);
|
|
@@ -452,11 +468,15 @@ var Event = class _Event {
|
|
|
452
468
|
}
|
|
453
469
|
};
|
|
454
470
|
var EventListener = class {
|
|
471
|
+
ctx;
|
|
472
|
+
once;
|
|
473
|
+
weak;
|
|
474
|
+
callback;
|
|
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
|
});
|
|
@@ -516,65 +536,13 @@ var weakListeners = () => {
|
|
|
516
536
|
};
|
|
517
537
|
};
|
|
518
538
|
|
|
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
539
|
// src/mutex.ts
|
|
570
540
|
import "@dxos/util";
|
|
571
541
|
import { warnAfterTimeout } from "@dxos/debug";
|
|
572
542
|
var Mutex = class {
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
this._tag = null;
|
|
577
|
-
}
|
|
543
|
+
_queue = Promise.resolve();
|
|
544
|
+
_queueLength = 0;
|
|
545
|
+
_tag = null;
|
|
578
546
|
get tag() {
|
|
579
547
|
return this._tag;
|
|
580
548
|
}
|
|
@@ -620,6 +588,7 @@ var Mutex = class {
|
|
|
620
588
|
}
|
|
621
589
|
};
|
|
622
590
|
var MutexGuard = class {
|
|
591
|
+
_release;
|
|
623
592
|
constructor(_release) {
|
|
624
593
|
this._release = _release;
|
|
625
594
|
}
|
|
@@ -633,7 +602,7 @@ var MutexGuard = class {
|
|
|
633
602
|
this.release();
|
|
634
603
|
}
|
|
635
604
|
};
|
|
636
|
-
var classMutexSymbol = Symbol("class-mutex");
|
|
605
|
+
var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
|
|
637
606
|
var FORCE_DISABLE_WARNING = false;
|
|
638
607
|
var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
|
|
639
608
|
var synchronized = (target, propertyName, descriptor) => {
|
|
@@ -663,6 +632,7 @@ import Observable from "zen-observable";
|
|
|
663
632
|
import PushStream from "zen-push";
|
|
664
633
|
|
|
665
634
|
// src/trigger.ts
|
|
635
|
+
import { invariant } from "@dxos/invariant";
|
|
666
636
|
var trigger = (timeout2) => {
|
|
667
637
|
let callback;
|
|
668
638
|
const promise = new Promise((resolve, reject) => {
|
|
@@ -678,18 +648,22 @@ var trigger = (timeout2) => {
|
|
|
678
648
|
resolver
|
|
679
649
|
];
|
|
680
650
|
};
|
|
681
|
-
var TriggerState = /* @__PURE__ */ function(TriggerState2) {
|
|
651
|
+
var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
|
|
682
652
|
TriggerState2["WAITING"] = "WAITING";
|
|
683
653
|
TriggerState2["RESOLVED"] = "RESOLVED";
|
|
684
654
|
TriggerState2["REJECTED"] = "REJECTED";
|
|
685
655
|
return TriggerState2;
|
|
686
|
-
}({});
|
|
656
|
+
})({});
|
|
687
657
|
var Trigger = class {
|
|
658
|
+
_options;
|
|
659
|
+
_promise;
|
|
660
|
+
_resolve;
|
|
661
|
+
_reject;
|
|
662
|
+
_state = "WAITING";
|
|
688
663
|
constructor(_options = {
|
|
689
664
|
autoReset: false
|
|
690
665
|
}) {
|
|
691
666
|
this._options = _options;
|
|
692
|
-
this._state = "WAITING";
|
|
693
667
|
this.reset();
|
|
694
668
|
}
|
|
695
669
|
get state() {
|
|
@@ -749,23 +723,53 @@ var Trigger = class {
|
|
|
749
723
|
return this;
|
|
750
724
|
}
|
|
751
725
|
};
|
|
726
|
+
var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
727
|
+
invariant(count >= 0);
|
|
728
|
+
let t;
|
|
729
|
+
let doResolve;
|
|
730
|
+
let doReject;
|
|
731
|
+
const promise = new Promise((resolve, reject) => {
|
|
732
|
+
doResolve = (value) => {
|
|
733
|
+
clearTimeout(t);
|
|
734
|
+
resolve(value);
|
|
735
|
+
};
|
|
736
|
+
doReject = (err) => {
|
|
737
|
+
clearTimeout(t);
|
|
738
|
+
reject(err);
|
|
739
|
+
};
|
|
740
|
+
});
|
|
741
|
+
if (count === 0) {
|
|
742
|
+
setTimeout(() => {
|
|
743
|
+
doResolve(0);
|
|
744
|
+
});
|
|
745
|
+
} else {
|
|
746
|
+
if (timeout2) {
|
|
747
|
+
t = setTimeout(() => {
|
|
748
|
+
doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
|
|
749
|
+
}, timeout2);
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
let i = 0;
|
|
753
|
+
return [
|
|
754
|
+
async () => await promise,
|
|
755
|
+
() => {
|
|
756
|
+
if (++i === count) {
|
|
757
|
+
doResolve(i);
|
|
758
|
+
}
|
|
759
|
+
return i;
|
|
760
|
+
},
|
|
761
|
+
(err) => doReject(err)
|
|
762
|
+
];
|
|
763
|
+
};
|
|
752
764
|
|
|
753
765
|
// src/observable.ts
|
|
754
766
|
var MulticastObservable = class _MulticastObservable extends Observable {
|
|
767
|
+
_value;
|
|
768
|
+
_observers = /* @__PURE__ */ new Set();
|
|
769
|
+
_observable;
|
|
770
|
+
_completed = new Trigger();
|
|
755
771
|
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
|
-
};
|
|
772
|
+
super((observer) => this._subscribe(observer)), this._value = _value;
|
|
769
773
|
this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
|
|
770
774
|
this._observable.subscribe(this._handlers);
|
|
771
775
|
}
|
|
@@ -849,18 +853,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
|
|
|
849
853
|
this._observers.delete(observer);
|
|
850
854
|
};
|
|
851
855
|
}
|
|
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
|
+
};
|
|
852
869
|
};
|
|
853
870
|
var EMPTY_OBSERVABLE = MulticastObservable.of(null);
|
|
854
871
|
|
|
855
872
|
// src/observable-value.ts
|
|
856
873
|
import { createSetDispatch } from "@dxos/util";
|
|
857
874
|
var ObservableProvider = class {
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
this.
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
}
|
|
875
|
+
_handlers = /* @__PURE__ */ new Set();
|
|
876
|
+
_proxy = createSetDispatch({
|
|
877
|
+
handlers: this._handlers
|
|
878
|
+
});
|
|
879
|
+
_value;
|
|
864
880
|
/**
|
|
865
881
|
* Proxy used to dispatch callbacks to each subscription.
|
|
866
882
|
*/
|
|
@@ -881,8 +897,10 @@ var ObservableProvider = class {
|
|
|
881
897
|
}
|
|
882
898
|
};
|
|
883
899
|
var CancellableObservableProvider = class extends ObservableProvider {
|
|
900
|
+
_handleCancel;
|
|
901
|
+
_cancelled = false;
|
|
884
902
|
constructor(_handleCancel) {
|
|
885
|
-
super(), this._handleCancel = _handleCancel
|
|
903
|
+
super(), this._handleCancel = _handleCancel;
|
|
886
904
|
}
|
|
887
905
|
get cancelled() {
|
|
888
906
|
return this._cancelled;
|
|
@@ -903,16 +921,15 @@ import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
|
|
|
903
921
|
import { log as log2 } from "@dxos/log";
|
|
904
922
|
|
|
905
923
|
// src/task-scheduling.ts
|
|
906
|
-
import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
924
|
+
import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
907
925
|
import { StackTrace as StackTrace2 } from "@dxos/debug";
|
|
908
926
|
|
|
909
927
|
// src/track-leaks.ts
|
|
910
928
|
import { StackTrace } from "@dxos/debug";
|
|
911
929
|
import { log } from "@dxos/log";
|
|
912
|
-
var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
|
|
913
930
|
var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
|
|
914
931
|
var openResources = /* @__PURE__ */ new Set();
|
|
915
|
-
var handleSymbol = Symbol("checkLeaksHandle");
|
|
932
|
+
var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
|
|
916
933
|
var trackResource = (resourceProvider) => {
|
|
917
934
|
if (!enabled) {
|
|
918
935
|
return () => {
|
|
@@ -959,31 +976,11 @@ var dumpLeaks = () => {
|
|
|
959
976
|
if (!enabled) {
|
|
960
977
|
return;
|
|
961
978
|
}
|
|
962
|
-
log.info(`Leaked resources ${openResources.size}
|
|
963
|
-
F: __dxlog_file3,
|
|
964
|
-
L: 82,
|
|
965
|
-
S: void 0,
|
|
966
|
-
C: (f, a) => f(...a)
|
|
967
|
-
});
|
|
979
|
+
log.info(`Leaked resources ${openResources.size}:`);
|
|
968
980
|
for (const resource of openResources) {
|
|
969
|
-
log.info(`- ${resource.name} at
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
S: void 0,
|
|
973
|
-
C: (f, a) => f(...a)
|
|
974
|
-
});
|
|
975
|
-
log.info(resource.openStack.getStack(1), void 0, {
|
|
976
|
-
F: __dxlog_file3,
|
|
977
|
-
L: 85,
|
|
978
|
-
S: void 0,
|
|
979
|
-
C: (f, a) => f(...a)
|
|
980
|
-
});
|
|
981
|
-
log.info("\n", void 0, {
|
|
982
|
-
F: __dxlog_file3,
|
|
983
|
-
L: 86,
|
|
984
|
-
S: void 0,
|
|
985
|
-
C: (f, a) => f(...a)
|
|
986
|
-
});
|
|
981
|
+
log.info(`- ${resource.name} at`);
|
|
982
|
+
log.info(resource.openStack.getStack(1));
|
|
983
|
+
log.info("\n");
|
|
987
984
|
}
|
|
988
985
|
};
|
|
989
986
|
if (enabled) {
|
|
@@ -992,12 +989,14 @@ if (enabled) {
|
|
|
992
989
|
|
|
993
990
|
// src/task-scheduling.ts
|
|
994
991
|
var DeferredTask = class {
|
|
992
|
+
_ctx;
|
|
993
|
+
_callback;
|
|
994
|
+
_scheduled = false;
|
|
995
|
+
_currentTask = null;
|
|
996
|
+
_nextTask = new Trigger();
|
|
995
997
|
constructor(_ctx, _callback) {
|
|
996
998
|
this._ctx = _ctx;
|
|
997
999
|
this._callback = _callback;
|
|
998
|
-
this._scheduled = false;
|
|
999
|
-
this._currentTask = null;
|
|
1000
|
-
this._nextTask = new Trigger();
|
|
1001
1000
|
}
|
|
1002
1001
|
get scheduled() {
|
|
1003
1002
|
return this._scheduled;
|
|
@@ -1038,6 +1037,79 @@ var DeferredTask = class {
|
|
|
1038
1037
|
await this._currentTask;
|
|
1039
1038
|
}
|
|
1040
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
|
+
};
|
|
1041
1113
|
var runInContext = (ctx, fn) => {
|
|
1042
1114
|
try {
|
|
1043
1115
|
fn();
|
|
@@ -1123,15 +1195,18 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
1123
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;
|
|
1124
1196
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1125
1197
|
}
|
|
1126
|
-
var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
|
|
1127
1198
|
var INIT_RESTART_DELAY = 100;
|
|
1128
1199
|
var DEFAULT_MAX_RESTART_DELAY = 5e3;
|
|
1129
1200
|
var PersistentLifecycle = class extends Resource {
|
|
1201
|
+
_start;
|
|
1202
|
+
_stop;
|
|
1203
|
+
_onRestart;
|
|
1204
|
+
_maxRestartDelay;
|
|
1205
|
+
_currentState = void 0;
|
|
1206
|
+
_restartTask = void 0;
|
|
1207
|
+
_restartAfter = 0;
|
|
1130
1208
|
constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
|
|
1131
1209
|
super();
|
|
1132
|
-
this._currentState = void 0;
|
|
1133
|
-
this._restartTask = void 0;
|
|
1134
|
-
this._restartAfter = 0;
|
|
1135
1210
|
this._start = start;
|
|
1136
1211
|
this._stop = stop;
|
|
1137
1212
|
this._onRestart = onRestart;
|
|
@@ -1145,25 +1220,21 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1145
1220
|
try {
|
|
1146
1221
|
await this._restart();
|
|
1147
1222
|
} catch (err) {
|
|
1223
|
+
if (this._ctx?.disposed) {
|
|
1224
|
+
return;
|
|
1225
|
+
}
|
|
1148
1226
|
log2.warn("Restart failed", {
|
|
1149
1227
|
err
|
|
1150
|
-
}, {
|
|
1151
|
-
F: __dxlog_file4,
|
|
1152
|
-
L: 72,
|
|
1153
|
-
S: this,
|
|
1154
|
-
C: (f, a) => f(...a)
|
|
1155
1228
|
});
|
|
1156
1229
|
this._restartTask?.schedule();
|
|
1157
1230
|
}
|
|
1158
1231
|
});
|
|
1159
1232
|
this._currentState = await this._start().catch((err) => {
|
|
1233
|
+
if (this._ctx?.disposed) {
|
|
1234
|
+
return void 0;
|
|
1235
|
+
}
|
|
1160
1236
|
log2.warn("Start failed", {
|
|
1161
1237
|
err
|
|
1162
|
-
}, {
|
|
1163
|
-
F: __dxlog_file4,
|
|
1164
|
-
L: 78,
|
|
1165
|
-
S: this,
|
|
1166
|
-
C: (f, a) => f(...a)
|
|
1167
1238
|
});
|
|
1168
1239
|
this._restartTask?.schedule();
|
|
1169
1240
|
return void 0;
|
|
@@ -1177,11 +1248,6 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1177
1248
|
async _restart() {
|
|
1178
1249
|
log2(`restarting in ${this._restartAfter}ms`, {
|
|
1179
1250
|
state: this._lifecycleState
|
|
1180
|
-
}, {
|
|
1181
|
-
F: __dxlog_file4,
|
|
1182
|
-
L: 91,
|
|
1183
|
-
S: this,
|
|
1184
|
-
C: (f, a) => f(...a)
|
|
1185
1251
|
});
|
|
1186
1252
|
await this._stopCurrentState();
|
|
1187
1253
|
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
@@ -1200,12 +1266,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1200
1266
|
try {
|
|
1201
1267
|
await this._stop(this._currentState);
|
|
1202
1268
|
} catch (err) {
|
|
1203
|
-
log2.catch(err
|
|
1204
|
-
F: __dxlog_file4,
|
|
1205
|
-
L: 113,
|
|
1206
|
-
S: this,
|
|
1207
|
-
C: (f, a) => f(...a)
|
|
1208
|
-
});
|
|
1269
|
+
log2.catch(err);
|
|
1209
1270
|
}
|
|
1210
1271
|
this._currentState = void 0;
|
|
1211
1272
|
}
|
|
@@ -1229,7 +1290,6 @@ _ts_decorate([
|
|
|
1229
1290
|
|
|
1230
1291
|
// src/push-iterable.ts
|
|
1231
1292
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
1232
|
-
var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
|
|
1233
1293
|
var makePushIterable = () => {
|
|
1234
1294
|
const buf = [];
|
|
1235
1295
|
const trigger2 = new Trigger({
|
|
@@ -1243,15 +1303,7 @@ var makePushIterable = () => {
|
|
|
1243
1303
|
await trigger2.wait();
|
|
1244
1304
|
}
|
|
1245
1305
|
const item = buf.shift();
|
|
1246
|
-
invariant2(item
|
|
1247
|
-
F: __dxlog_file5,
|
|
1248
|
-
L: 42,
|
|
1249
|
-
S: this,
|
|
1250
|
-
A: [
|
|
1251
|
-
"item",
|
|
1252
|
-
""
|
|
1253
|
-
]
|
|
1254
|
-
});
|
|
1306
|
+
invariant2(item);
|
|
1255
1307
|
switch (item.kind) {
|
|
1256
1308
|
case "next":
|
|
1257
1309
|
return {
|
|
@@ -1293,20 +1345,6 @@ var makePushIterable = () => {
|
|
|
1293
1345
|
};
|
|
1294
1346
|
};
|
|
1295
1347
|
|
|
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
1348
|
// src/stream-to-array.ts
|
|
1311
1349
|
var streamToArray = (stream) => {
|
|
1312
1350
|
let deferred;
|
|
@@ -1352,11 +1390,6 @@ var streamToArray = (stream) => {
|
|
|
1352
1390
|
// src/test-stream.ts
|
|
1353
1391
|
import { Duplex } from "@dxos/node-std/stream";
|
|
1354
1392
|
var TestStream = class extends Duplex {
|
|
1355
|
-
constructor() {
|
|
1356
|
-
super(...arguments);
|
|
1357
|
-
this._received = Buffer.alloc(0);
|
|
1358
|
-
this._onWrite = new Event();
|
|
1359
|
-
}
|
|
1360
1393
|
static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
|
|
1361
1394
|
stream1.push("ping");
|
|
1362
1395
|
stream2.push("pong");
|
|
@@ -1369,6 +1402,8 @@ var TestStream = class extends Duplex {
|
|
|
1369
1402
|
})
|
|
1370
1403
|
]);
|
|
1371
1404
|
}
|
|
1405
|
+
_received = Buffer.alloc(0);
|
|
1406
|
+
_onWrite = new Event();
|
|
1372
1407
|
_write(chunk, encoding, callback) {
|
|
1373
1408
|
this._received = Buffer.concat([
|
|
1374
1409
|
this._received,
|
|
@@ -1410,13 +1445,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
|
|
|
1410
1445
|
timeout: timeout2
|
|
1411
1446
|
});
|
|
1412
1447
|
};
|
|
1448
|
+
var until = (cb, timeout2) => {
|
|
1449
|
+
return new Promise((resolve, reject) => {
|
|
1450
|
+
const t = timeout2 && setTimeout(() => {
|
|
1451
|
+
reject(new Error(`Timeout after ${t}ms`));
|
|
1452
|
+
}, timeout2);
|
|
1453
|
+
setTimeout(async () => {
|
|
1454
|
+
try {
|
|
1455
|
+
await cb((value) => {
|
|
1456
|
+
t && clearTimeout(t);
|
|
1457
|
+
resolve(value);
|
|
1458
|
+
}, (error) => {
|
|
1459
|
+
t && clearTimeout(t);
|
|
1460
|
+
reject(error);
|
|
1461
|
+
});
|
|
1462
|
+
} catch (err) {
|
|
1463
|
+
reject(err);
|
|
1464
|
+
}
|
|
1465
|
+
});
|
|
1466
|
+
});
|
|
1467
|
+
};
|
|
1468
|
+
var untilPromise = (cb) => cb();
|
|
1469
|
+
var untilError = (cb) => {
|
|
1470
|
+
return new Promise((resolve, reject) => {
|
|
1471
|
+
setTimeout(async () => {
|
|
1472
|
+
try {
|
|
1473
|
+
await cb();
|
|
1474
|
+
reject(new Error("No error was thrown."));
|
|
1475
|
+
} catch (err) {
|
|
1476
|
+
resolve(err);
|
|
1477
|
+
}
|
|
1478
|
+
});
|
|
1479
|
+
});
|
|
1480
|
+
};
|
|
1413
1481
|
|
|
1414
1482
|
// src/timer.ts
|
|
1415
1483
|
var Timer = class {
|
|
1484
|
+
_callback;
|
|
1485
|
+
_state = new Event();
|
|
1486
|
+
_timer;
|
|
1487
|
+
_count = 0;
|
|
1416
1488
|
constructor(_callback) {
|
|
1417
1489
|
this._callback = _callback;
|
|
1418
|
-
this._state = new Event();
|
|
1419
|
-
this._count = 0;
|
|
1420
1490
|
}
|
|
1421
1491
|
get state() {
|
|
1422
1492
|
return this._state;
|
|
@@ -1459,51 +1529,23 @@ var Timer = class {
|
|
|
1459
1529
|
}
|
|
1460
1530
|
};
|
|
1461
1531
|
|
|
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
1532
|
// src/update-scheduler.ts
|
|
1498
1533
|
var TIME_PERIOD = 1e3;
|
|
1499
1534
|
var UpdateScheduler = class {
|
|
1535
|
+
_ctx;
|
|
1536
|
+
_callback;
|
|
1537
|
+
_params;
|
|
1538
|
+
/**
|
|
1539
|
+
* Promise that resolves when the callback is done.
|
|
1540
|
+
* Never rejects.
|
|
1541
|
+
*/
|
|
1542
|
+
_promise = null;
|
|
1543
|
+
_scheduled = false;
|
|
1544
|
+
_lastUpdateTime = -TIME_PERIOD;
|
|
1500
1545
|
constructor(_ctx, _callback, _params = {}) {
|
|
1501
1546
|
this._ctx = _ctx;
|
|
1502
1547
|
this._callback = _callback;
|
|
1503
1548
|
this._params = _params;
|
|
1504
|
-
this._promise = null;
|
|
1505
|
-
this._scheduled = false;
|
|
1506
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1507
1549
|
_ctx.onDispose(async () => {
|
|
1508
1550
|
await this._promise;
|
|
1509
1551
|
});
|
|
@@ -1516,13 +1558,13 @@ var UpdateScheduler = class {
|
|
|
1516
1558
|
await this._promise;
|
|
1517
1559
|
if (this._params.maxFrequency) {
|
|
1518
1560
|
const now = performance.now();
|
|
1519
|
-
const
|
|
1520
|
-
if (
|
|
1561
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1562
|
+
if (delay2 > 0) {
|
|
1521
1563
|
await new Promise((resolve) => {
|
|
1522
1564
|
const timeoutId = setTimeout(() => {
|
|
1523
1565
|
clearContext();
|
|
1524
1566
|
resolve();
|
|
1525
|
-
},
|
|
1567
|
+
}, delay2);
|
|
1526
1568
|
const clearContext = this._ctx.onDispose(() => {
|
|
1527
1569
|
clearTimeout(timeoutId);
|
|
1528
1570
|
resolve();
|
|
@@ -1566,6 +1608,7 @@ var UpdateScheduler = class {
|
|
|
1566
1608
|
}
|
|
1567
1609
|
};
|
|
1568
1610
|
export {
|
|
1611
|
+
AsyncTask,
|
|
1569
1612
|
CancellableObservableProvider,
|
|
1570
1613
|
DeferredTask,
|
|
1571
1614
|
Event,
|
|
@@ -1586,26 +1629,26 @@ export {
|
|
|
1586
1629
|
UpdateScheduler,
|
|
1587
1630
|
addEventListener,
|
|
1588
1631
|
addListener,
|
|
1589
|
-
asyncChain,
|
|
1590
1632
|
asyncReturn,
|
|
1591
1633
|
asyncTimeout,
|
|
1634
|
+
chain,
|
|
1592
1635
|
combine,
|
|
1593
|
-
createPromiseFromCallback,
|
|
1594
1636
|
debounce,
|
|
1595
1637
|
debounceAndThrottle,
|
|
1638
|
+
delay,
|
|
1596
1639
|
dumpLeaks,
|
|
1597
1640
|
interval,
|
|
1598
1641
|
latch,
|
|
1599
1642
|
makePushIterable,
|
|
1600
1643
|
observableError,
|
|
1601
1644
|
onEvent,
|
|
1645
|
+
promiseFromCallback,
|
|
1602
1646
|
runInContext,
|
|
1603
1647
|
runInContextAsync,
|
|
1604
1648
|
scheduleExponentialBackoffTaskInterval,
|
|
1605
1649
|
scheduleMicroTask,
|
|
1606
1650
|
scheduleTask,
|
|
1607
1651
|
scheduleTaskInterval,
|
|
1608
|
-
sink,
|
|
1609
1652
|
sleep,
|
|
1610
1653
|
sleepWithContext,
|
|
1611
1654
|
streamToArray,
|