@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,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;
|
|
@@ -24,7 +24,7 @@ var asyncChain = (chain) => async (elements) => {
|
|
|
24
24
|
import { ComplexMap } from "@dxos/util";
|
|
25
25
|
var combine = (...cleanupFns) => {
|
|
26
26
|
return () => {
|
|
27
|
-
cleanupFns.flat().forEach((cleanupFn) => cleanupFn());
|
|
27
|
+
cleanupFns.flat().filter((f) => typeof f === "function").forEach((cleanupFn) => cleanupFn());
|
|
28
28
|
};
|
|
29
29
|
};
|
|
30
30
|
var timeout = (cb, ms = 0) => {
|
|
@@ -35,16 +35,14 @@ 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
|
-
|
|
45
|
-
|
|
46
|
-
add(cb) {
|
|
47
|
-
this._cleanups.push(cb);
|
|
43
|
+
_cleanups = [];
|
|
44
|
+
add(...cb) {
|
|
45
|
+
this._cleanups.push(...cb);
|
|
48
46
|
return this;
|
|
49
47
|
}
|
|
50
48
|
clear() {
|
|
@@ -53,6 +51,7 @@ var SubscriptionList = class {
|
|
|
53
51
|
}
|
|
54
52
|
};
|
|
55
53
|
var SubscriptionSet = class {
|
|
54
|
+
_cleanupMap;
|
|
56
55
|
constructor(keyProjection) {
|
|
57
56
|
this._cleanupMap = new ComplexMap(keyProjection);
|
|
58
57
|
}
|
|
@@ -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,8 +149,28 @@ 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) => {
|
|
171
|
+
if (typeof promise === "function") {
|
|
172
|
+
throw new Error("First argument must be a promise.");
|
|
173
|
+
}
|
|
131
174
|
let timeoutId;
|
|
132
175
|
const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
|
|
133
176
|
const timeoutPromise = new Promise((resolve, reject) => {
|
|
@@ -136,9 +179,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
|
|
|
136
179
|
}, timeout2);
|
|
137
180
|
unrefTimeout(timeoutId);
|
|
138
181
|
});
|
|
139
|
-
const conditionTimeout = typeof promise === "function" ? createPromiseFromCallback(promise) : promise;
|
|
140
182
|
return await Promise.race([
|
|
141
|
-
|
|
183
|
+
promise,
|
|
142
184
|
timeoutPromise
|
|
143
185
|
]).finally(() => {
|
|
144
186
|
clearTimeout(timeoutId);
|
|
@@ -149,23 +191,6 @@ var unrefTimeout = (timeoutId) => {
|
|
|
149
191
|
timeoutId.unref();
|
|
150
192
|
}
|
|
151
193
|
};
|
|
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
194
|
|
|
170
195
|
// src/event-emitter.ts
|
|
171
196
|
var onEvent = (eventEmitter, eventName, callback) => {
|
|
@@ -192,13 +217,8 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
|
|
|
192
217
|
|
|
193
218
|
// src/events.ts
|
|
194
219
|
import { Context } from "@dxos/context";
|
|
195
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
|
|
196
220
|
var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
|
|
197
221
|
var Event = class _Event {
|
|
198
|
-
constructor() {
|
|
199
|
-
this._listeners = /* @__PURE__ */ new Set();
|
|
200
|
-
this._effects = /* @__PURE__ */ new Set();
|
|
201
|
-
}
|
|
202
222
|
/**
|
|
203
223
|
* Wrap objects that have on/off style event emitters.
|
|
204
224
|
*/
|
|
@@ -211,6 +231,8 @@ var Event = class _Event {
|
|
|
211
231
|
});
|
|
212
232
|
return event;
|
|
213
233
|
}
|
|
234
|
+
_listeners = /* @__PURE__ */ new Set();
|
|
235
|
+
_effects = /* @__PURE__ */ new Set();
|
|
214
236
|
/**
|
|
215
237
|
* Emit an event.
|
|
216
238
|
* In most cases should only be called by the class or entity containing the event.
|
|
@@ -249,10 +271,7 @@ var Event = class _Event {
|
|
|
249
271
|
_ctx,
|
|
250
272
|
_callback
|
|
251
273
|
] : [
|
|
252
|
-
new Context(
|
|
253
|
-
F: __dxlog_file,
|
|
254
|
-
L: 132
|
|
255
|
-
}),
|
|
274
|
+
new Context(),
|
|
256
275
|
_ctx
|
|
257
276
|
];
|
|
258
277
|
const weak = !!options?.weak;
|
|
@@ -282,10 +301,7 @@ var Event = class _Event {
|
|
|
282
301
|
_ctx,
|
|
283
302
|
_callback
|
|
284
303
|
] : [
|
|
285
|
-
new Context(
|
|
286
|
-
F: __dxlog_file,
|
|
287
|
-
L: 169
|
|
288
|
-
}),
|
|
304
|
+
new Context(),
|
|
289
305
|
_ctx
|
|
290
306
|
];
|
|
291
307
|
const listener = new EventListener(this, callback, ctx, true, false);
|
|
@@ -454,11 +470,15 @@ var Event = class _Event {
|
|
|
454
470
|
}
|
|
455
471
|
};
|
|
456
472
|
var EventListener = class {
|
|
473
|
+
ctx;
|
|
474
|
+
once;
|
|
475
|
+
weak;
|
|
476
|
+
callback;
|
|
477
|
+
_clearDispose = void 0;
|
|
457
478
|
constructor(event, listener, ctx, once, weak) {
|
|
458
479
|
this.ctx = ctx;
|
|
459
480
|
this.once = once;
|
|
460
481
|
this.weak = weak;
|
|
461
|
-
this._clearDispose = void 0;
|
|
462
482
|
this._clearDispose = ctx.onDispose(() => {
|
|
463
483
|
event._removeListener(this);
|
|
464
484
|
});
|
|
@@ -518,65 +538,13 @@ var weakListeners = () => {
|
|
|
518
538
|
};
|
|
519
539
|
};
|
|
520
540
|
|
|
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
541
|
// src/mutex.ts
|
|
572
542
|
import "@dxos/util";
|
|
573
543
|
import { warnAfterTimeout } from "@dxos/debug";
|
|
574
544
|
var Mutex = class {
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
this._tag = null;
|
|
579
|
-
}
|
|
545
|
+
_queue = Promise.resolve();
|
|
546
|
+
_queueLength = 0;
|
|
547
|
+
_tag = null;
|
|
580
548
|
get tag() {
|
|
581
549
|
return this._tag;
|
|
582
550
|
}
|
|
@@ -622,6 +590,7 @@ var Mutex = class {
|
|
|
622
590
|
}
|
|
623
591
|
};
|
|
624
592
|
var MutexGuard = class {
|
|
593
|
+
_release;
|
|
625
594
|
constructor(_release) {
|
|
626
595
|
this._release = _release;
|
|
627
596
|
}
|
|
@@ -635,7 +604,7 @@ var MutexGuard = class {
|
|
|
635
604
|
this.release();
|
|
636
605
|
}
|
|
637
606
|
};
|
|
638
|
-
var classMutexSymbol = Symbol("class-mutex");
|
|
607
|
+
var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
|
|
639
608
|
var FORCE_DISABLE_WARNING = false;
|
|
640
609
|
var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
|
|
641
610
|
var synchronized = (target, propertyName, descriptor) => {
|
|
@@ -665,6 +634,7 @@ import Observable from "zen-observable";
|
|
|
665
634
|
import PushStream from "zen-push";
|
|
666
635
|
|
|
667
636
|
// src/trigger.ts
|
|
637
|
+
import { invariant } from "@dxos/invariant";
|
|
668
638
|
var trigger = (timeout2) => {
|
|
669
639
|
let callback;
|
|
670
640
|
const promise = new Promise((resolve, reject) => {
|
|
@@ -680,18 +650,22 @@ var trigger = (timeout2) => {
|
|
|
680
650
|
resolver
|
|
681
651
|
];
|
|
682
652
|
};
|
|
683
|
-
var TriggerState = /* @__PURE__ */ function(TriggerState2) {
|
|
653
|
+
var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
|
|
684
654
|
TriggerState2["WAITING"] = "WAITING";
|
|
685
655
|
TriggerState2["RESOLVED"] = "RESOLVED";
|
|
686
656
|
TriggerState2["REJECTED"] = "REJECTED";
|
|
687
657
|
return TriggerState2;
|
|
688
|
-
}({});
|
|
658
|
+
})({});
|
|
689
659
|
var Trigger = class {
|
|
660
|
+
_options;
|
|
661
|
+
_promise;
|
|
662
|
+
_resolve;
|
|
663
|
+
_reject;
|
|
664
|
+
_state = "WAITING";
|
|
690
665
|
constructor(_options = {
|
|
691
666
|
autoReset: false
|
|
692
667
|
}) {
|
|
693
668
|
this._options = _options;
|
|
694
|
-
this._state = "WAITING";
|
|
695
669
|
this.reset();
|
|
696
670
|
}
|
|
697
671
|
get state() {
|
|
@@ -751,23 +725,53 @@ var Trigger = class {
|
|
|
751
725
|
return this;
|
|
752
726
|
}
|
|
753
727
|
};
|
|
728
|
+
var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
729
|
+
invariant(count >= 0);
|
|
730
|
+
let t;
|
|
731
|
+
let doResolve;
|
|
732
|
+
let doReject;
|
|
733
|
+
const promise = new Promise((resolve, reject) => {
|
|
734
|
+
doResolve = (value) => {
|
|
735
|
+
clearTimeout(t);
|
|
736
|
+
resolve(value);
|
|
737
|
+
};
|
|
738
|
+
doReject = (err) => {
|
|
739
|
+
clearTimeout(t);
|
|
740
|
+
reject(err);
|
|
741
|
+
};
|
|
742
|
+
});
|
|
743
|
+
if (count === 0) {
|
|
744
|
+
setTimeout(() => {
|
|
745
|
+
doResolve(0);
|
|
746
|
+
});
|
|
747
|
+
} else {
|
|
748
|
+
if (timeout2) {
|
|
749
|
+
t = setTimeout(() => {
|
|
750
|
+
doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
|
|
751
|
+
}, timeout2);
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
let i = 0;
|
|
755
|
+
return [
|
|
756
|
+
async () => await promise,
|
|
757
|
+
() => {
|
|
758
|
+
if (++i === count) {
|
|
759
|
+
doResolve(i);
|
|
760
|
+
}
|
|
761
|
+
return i;
|
|
762
|
+
},
|
|
763
|
+
(err) => doReject(err)
|
|
764
|
+
];
|
|
765
|
+
};
|
|
754
766
|
|
|
755
767
|
// src/observable.ts
|
|
756
768
|
var MulticastObservable = class _MulticastObservable extends Observable {
|
|
769
|
+
_value;
|
|
770
|
+
_observers = /* @__PURE__ */ new Set();
|
|
771
|
+
_observable;
|
|
772
|
+
_completed = new Trigger();
|
|
757
773
|
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
|
-
};
|
|
774
|
+
super((observer) => this._subscribe(observer)), this._value = _value;
|
|
771
775
|
this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
|
|
772
776
|
this._observable.subscribe(this._handlers);
|
|
773
777
|
}
|
|
@@ -851,18 +855,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
|
|
|
851
855
|
this._observers.delete(observer);
|
|
852
856
|
};
|
|
853
857
|
}
|
|
858
|
+
_handlers = {
|
|
859
|
+
next: (value) => {
|
|
860
|
+
this._value = value;
|
|
861
|
+
this._observers.forEach((observer) => observer.next?.(value));
|
|
862
|
+
},
|
|
863
|
+
error: (err) => {
|
|
864
|
+
this._observers.forEach((observer) => observer.error?.(err));
|
|
865
|
+
},
|
|
866
|
+
complete: () => {
|
|
867
|
+
this._completed.wake();
|
|
868
|
+
this._observers.forEach((observer) => observer.complete?.());
|
|
869
|
+
}
|
|
870
|
+
};
|
|
854
871
|
};
|
|
855
872
|
var EMPTY_OBSERVABLE = MulticastObservable.of(null);
|
|
856
873
|
|
|
857
874
|
// src/observable-value.ts
|
|
858
875
|
import { createSetDispatch } from "@dxos/util";
|
|
859
876
|
var ObservableProvider = class {
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
this.
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
}
|
|
877
|
+
_handlers = /* @__PURE__ */ new Set();
|
|
878
|
+
_proxy = createSetDispatch({
|
|
879
|
+
handlers: this._handlers
|
|
880
|
+
});
|
|
881
|
+
_value;
|
|
866
882
|
/**
|
|
867
883
|
* Proxy used to dispatch callbacks to each subscription.
|
|
868
884
|
*/
|
|
@@ -883,8 +899,10 @@ var ObservableProvider = class {
|
|
|
883
899
|
}
|
|
884
900
|
};
|
|
885
901
|
var CancellableObservableProvider = class extends ObservableProvider {
|
|
902
|
+
_handleCancel;
|
|
903
|
+
_cancelled = false;
|
|
886
904
|
constructor(_handleCancel) {
|
|
887
|
-
super(), this._handleCancel = _handleCancel
|
|
905
|
+
super(), this._handleCancel = _handleCancel;
|
|
888
906
|
}
|
|
889
907
|
get cancelled() {
|
|
890
908
|
return this._cancelled;
|
|
@@ -905,16 +923,15 @@ import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
|
|
|
905
923
|
import { log as log2 } from "@dxos/log";
|
|
906
924
|
|
|
907
925
|
// src/task-scheduling.ts
|
|
908
|
-
import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
926
|
+
import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
909
927
|
import { StackTrace as StackTrace2 } from "@dxos/debug";
|
|
910
928
|
|
|
911
929
|
// src/track-leaks.ts
|
|
912
930
|
import { StackTrace } from "@dxos/debug";
|
|
913
931
|
import { log } from "@dxos/log";
|
|
914
|
-
var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
|
|
915
932
|
var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
|
|
916
933
|
var openResources = /* @__PURE__ */ new Set();
|
|
917
|
-
var handleSymbol = Symbol("checkLeaksHandle");
|
|
934
|
+
var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
|
|
918
935
|
var trackResource = (resourceProvider) => {
|
|
919
936
|
if (!enabled) {
|
|
920
937
|
return () => {
|
|
@@ -961,31 +978,11 @@ var dumpLeaks = () => {
|
|
|
961
978
|
if (!enabled) {
|
|
962
979
|
return;
|
|
963
980
|
}
|
|
964
|
-
log.info(`Leaked resources ${openResources.size}
|
|
965
|
-
F: __dxlog_file3,
|
|
966
|
-
L: 82,
|
|
967
|
-
S: void 0,
|
|
968
|
-
C: (f, a) => f(...a)
|
|
969
|
-
});
|
|
981
|
+
log.info(`Leaked resources ${openResources.size}:`);
|
|
970
982
|
for (const resource of openResources) {
|
|
971
|
-
log.info(`- ${resource.name} at
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
S: void 0,
|
|
975
|
-
C: (f, a) => f(...a)
|
|
976
|
-
});
|
|
977
|
-
log.info(resource.openStack.getStack(1), void 0, {
|
|
978
|
-
F: __dxlog_file3,
|
|
979
|
-
L: 85,
|
|
980
|
-
S: void 0,
|
|
981
|
-
C: (f, a) => f(...a)
|
|
982
|
-
});
|
|
983
|
-
log.info("\n", void 0, {
|
|
984
|
-
F: __dxlog_file3,
|
|
985
|
-
L: 86,
|
|
986
|
-
S: void 0,
|
|
987
|
-
C: (f, a) => f(...a)
|
|
988
|
-
});
|
|
983
|
+
log.info(`- ${resource.name} at`);
|
|
984
|
+
log.info(resource.openStack.getStack(1));
|
|
985
|
+
log.info("\n");
|
|
989
986
|
}
|
|
990
987
|
};
|
|
991
988
|
if (enabled) {
|
|
@@ -994,12 +991,14 @@ if (enabled) {
|
|
|
994
991
|
|
|
995
992
|
// src/task-scheduling.ts
|
|
996
993
|
var DeferredTask = class {
|
|
994
|
+
_ctx;
|
|
995
|
+
_callback;
|
|
996
|
+
_scheduled = false;
|
|
997
|
+
_currentTask = null;
|
|
998
|
+
_nextTask = new Trigger();
|
|
997
999
|
constructor(_ctx, _callback) {
|
|
998
1000
|
this._ctx = _ctx;
|
|
999
1001
|
this._callback = _callback;
|
|
1000
|
-
this._scheduled = false;
|
|
1001
|
-
this._currentTask = null;
|
|
1002
|
-
this._nextTask = new Trigger();
|
|
1003
1002
|
}
|
|
1004
1003
|
get scheduled() {
|
|
1005
1004
|
return this._scheduled;
|
|
@@ -1040,6 +1039,79 @@ var DeferredTask = class {
|
|
|
1040
1039
|
await this._currentTask;
|
|
1041
1040
|
}
|
|
1042
1041
|
};
|
|
1042
|
+
var AsyncTask = class {
|
|
1043
|
+
#callback;
|
|
1044
|
+
#ctx = void 0;
|
|
1045
|
+
#scheduled = false;
|
|
1046
|
+
#currentTask = null;
|
|
1047
|
+
#nextTask = new Trigger();
|
|
1048
|
+
constructor(callback) {
|
|
1049
|
+
this.#callback = callback;
|
|
1050
|
+
}
|
|
1051
|
+
get scheduled() {
|
|
1052
|
+
return this.#scheduled;
|
|
1053
|
+
}
|
|
1054
|
+
/**
|
|
1055
|
+
* Context of the resource that owns the task.
|
|
1056
|
+
* When the context is disposed, the task is cancelled and cannot be scheduled again.
|
|
1057
|
+
*/
|
|
1058
|
+
open() {
|
|
1059
|
+
this.#ctx = new Context2();
|
|
1060
|
+
}
|
|
1061
|
+
/**
|
|
1062
|
+
* Closes the task and waits for it to finish if it is running.
|
|
1063
|
+
*/
|
|
1064
|
+
async close() {
|
|
1065
|
+
await this.#ctx?.dispose();
|
|
1066
|
+
await this.join();
|
|
1067
|
+
this.#ctx = void 0;
|
|
1068
|
+
}
|
|
1069
|
+
[Symbol.asyncDispose]() {
|
|
1070
|
+
return this.close();
|
|
1071
|
+
}
|
|
1072
|
+
/**
|
|
1073
|
+
* Schedule the task to run asynchronously.
|
|
1074
|
+
*/
|
|
1075
|
+
// TODO(dmaretskyi): Add scheduleAt. Where the earlier time will override the later one.
|
|
1076
|
+
schedule() {
|
|
1077
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1078
|
+
throw new Error("AsyncTask not open");
|
|
1079
|
+
}
|
|
1080
|
+
if (this.#scheduled) {
|
|
1081
|
+
return;
|
|
1082
|
+
}
|
|
1083
|
+
scheduleTask(this.#ctx, async () => {
|
|
1084
|
+
await this.#currentTask;
|
|
1085
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1086
|
+
return;
|
|
1087
|
+
}
|
|
1088
|
+
this.#scheduled = false;
|
|
1089
|
+
const completionTrigger = this.#nextTask;
|
|
1090
|
+
this.#nextTask = new Trigger();
|
|
1091
|
+
this.#currentTask = runInContextAsync(this.#ctx, () => this.#callback()).then(() => {
|
|
1092
|
+
completionTrigger.wake();
|
|
1093
|
+
});
|
|
1094
|
+
});
|
|
1095
|
+
this.#scheduled = true;
|
|
1096
|
+
}
|
|
1097
|
+
/**
|
|
1098
|
+
* Schedule the task to run and wait for it to finish.
|
|
1099
|
+
*/
|
|
1100
|
+
async runBlocking() {
|
|
1101
|
+
if (this.#ctx?.disposed) {
|
|
1102
|
+
throw new ContextDisposedError2();
|
|
1103
|
+
}
|
|
1104
|
+
this.schedule();
|
|
1105
|
+
await this.#nextTask.wait();
|
|
1106
|
+
}
|
|
1107
|
+
/**
|
|
1108
|
+
* Waits for the current task to finish if it is running.
|
|
1109
|
+
* Does not schedule a new task.
|
|
1110
|
+
*/
|
|
1111
|
+
async join() {
|
|
1112
|
+
await this.#currentTask;
|
|
1113
|
+
}
|
|
1114
|
+
};
|
|
1043
1115
|
var runInContext = (ctx, fn) => {
|
|
1044
1116
|
try {
|
|
1045
1117
|
fn();
|
|
@@ -1125,15 +1197,18 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
1125
1197
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1126
1198
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1127
1199
|
}
|
|
1128
|
-
var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
|
|
1129
1200
|
var INIT_RESTART_DELAY = 100;
|
|
1130
1201
|
var DEFAULT_MAX_RESTART_DELAY = 5e3;
|
|
1131
1202
|
var PersistentLifecycle = class extends Resource {
|
|
1203
|
+
_start;
|
|
1204
|
+
_stop;
|
|
1205
|
+
_onRestart;
|
|
1206
|
+
_maxRestartDelay;
|
|
1207
|
+
_currentState = void 0;
|
|
1208
|
+
_restartTask = void 0;
|
|
1209
|
+
_restartAfter = 0;
|
|
1132
1210
|
constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
|
|
1133
1211
|
super();
|
|
1134
|
-
this._currentState = void 0;
|
|
1135
|
-
this._restartTask = void 0;
|
|
1136
|
-
this._restartAfter = 0;
|
|
1137
1212
|
this._start = start;
|
|
1138
1213
|
this._stop = stop;
|
|
1139
1214
|
this._onRestart = onRestart;
|
|
@@ -1147,25 +1222,21 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1147
1222
|
try {
|
|
1148
1223
|
await this._restart();
|
|
1149
1224
|
} catch (err) {
|
|
1225
|
+
if (this._ctx?.disposed) {
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1150
1228
|
log2.warn("Restart failed", {
|
|
1151
1229
|
err
|
|
1152
|
-
}, {
|
|
1153
|
-
F: __dxlog_file4,
|
|
1154
|
-
L: 72,
|
|
1155
|
-
S: this,
|
|
1156
|
-
C: (f, a) => f(...a)
|
|
1157
1230
|
});
|
|
1158
1231
|
this._restartTask?.schedule();
|
|
1159
1232
|
}
|
|
1160
1233
|
});
|
|
1161
1234
|
this._currentState = await this._start().catch((err) => {
|
|
1235
|
+
if (this._ctx?.disposed) {
|
|
1236
|
+
return void 0;
|
|
1237
|
+
}
|
|
1162
1238
|
log2.warn("Start failed", {
|
|
1163
1239
|
err
|
|
1164
|
-
}, {
|
|
1165
|
-
F: __dxlog_file4,
|
|
1166
|
-
L: 78,
|
|
1167
|
-
S: this,
|
|
1168
|
-
C: (f, a) => f(...a)
|
|
1169
1240
|
});
|
|
1170
1241
|
this._restartTask?.schedule();
|
|
1171
1242
|
return void 0;
|
|
@@ -1179,11 +1250,6 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1179
1250
|
async _restart() {
|
|
1180
1251
|
log2(`restarting in ${this._restartAfter}ms`, {
|
|
1181
1252
|
state: this._lifecycleState
|
|
1182
|
-
}, {
|
|
1183
|
-
F: __dxlog_file4,
|
|
1184
|
-
L: 91,
|
|
1185
|
-
S: this,
|
|
1186
|
-
C: (f, a) => f(...a)
|
|
1187
1253
|
});
|
|
1188
1254
|
await this._stopCurrentState();
|
|
1189
1255
|
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
@@ -1202,12 +1268,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1202
1268
|
try {
|
|
1203
1269
|
await this._stop(this._currentState);
|
|
1204
1270
|
} catch (err) {
|
|
1205
|
-
log2.catch(err
|
|
1206
|
-
F: __dxlog_file4,
|
|
1207
|
-
L: 113,
|
|
1208
|
-
S: this,
|
|
1209
|
-
C: (f, a) => f(...a)
|
|
1210
|
-
});
|
|
1271
|
+
log2.catch(err);
|
|
1211
1272
|
}
|
|
1212
1273
|
this._currentState = void 0;
|
|
1213
1274
|
}
|
|
@@ -1231,7 +1292,6 @@ _ts_decorate([
|
|
|
1231
1292
|
|
|
1232
1293
|
// src/push-iterable.ts
|
|
1233
1294
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
1234
|
-
var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
|
|
1235
1295
|
var makePushIterable = () => {
|
|
1236
1296
|
const buf = [];
|
|
1237
1297
|
const trigger2 = new Trigger({
|
|
@@ -1245,15 +1305,7 @@ var makePushIterable = () => {
|
|
|
1245
1305
|
await trigger2.wait();
|
|
1246
1306
|
}
|
|
1247
1307
|
const item = buf.shift();
|
|
1248
|
-
invariant2(item
|
|
1249
|
-
F: __dxlog_file5,
|
|
1250
|
-
L: 42,
|
|
1251
|
-
S: this,
|
|
1252
|
-
A: [
|
|
1253
|
-
"item",
|
|
1254
|
-
""
|
|
1255
|
-
]
|
|
1256
|
-
});
|
|
1308
|
+
invariant2(item);
|
|
1257
1309
|
switch (item.kind) {
|
|
1258
1310
|
case "next":
|
|
1259
1311
|
return {
|
|
@@ -1295,20 +1347,6 @@ var makePushIterable = () => {
|
|
|
1295
1347
|
};
|
|
1296
1348
|
};
|
|
1297
1349
|
|
|
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
1350
|
// src/stream-to-array.ts
|
|
1313
1351
|
var streamToArray = (stream) => {
|
|
1314
1352
|
let deferred;
|
|
@@ -1354,11 +1392,6 @@ var streamToArray = (stream) => {
|
|
|
1354
1392
|
// src/test-stream.ts
|
|
1355
1393
|
import { Duplex } from "node:stream";
|
|
1356
1394
|
var TestStream = class extends Duplex {
|
|
1357
|
-
constructor() {
|
|
1358
|
-
super(...arguments);
|
|
1359
|
-
this._received = Buffer.alloc(0);
|
|
1360
|
-
this._onWrite = new Event();
|
|
1361
|
-
}
|
|
1362
1395
|
static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
|
|
1363
1396
|
stream1.push("ping");
|
|
1364
1397
|
stream2.push("pong");
|
|
@@ -1371,6 +1404,8 @@ var TestStream = class extends Duplex {
|
|
|
1371
1404
|
})
|
|
1372
1405
|
]);
|
|
1373
1406
|
}
|
|
1407
|
+
_received = Buffer.alloc(0);
|
|
1408
|
+
_onWrite = new Event();
|
|
1374
1409
|
_write(chunk, encoding, callback) {
|
|
1375
1410
|
this._received = Buffer.concat([
|
|
1376
1411
|
this._received,
|
|
@@ -1412,13 +1447,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
|
|
|
1412
1447
|
timeout: timeout2
|
|
1413
1448
|
});
|
|
1414
1449
|
};
|
|
1450
|
+
var until = (cb, timeout2) => {
|
|
1451
|
+
return new Promise((resolve, reject) => {
|
|
1452
|
+
const t = timeout2 && setTimeout(() => {
|
|
1453
|
+
reject(new Error(`Timeout after ${t}ms`));
|
|
1454
|
+
}, timeout2);
|
|
1455
|
+
setTimeout(async () => {
|
|
1456
|
+
try {
|
|
1457
|
+
await cb((value) => {
|
|
1458
|
+
t && clearTimeout(t);
|
|
1459
|
+
resolve(value);
|
|
1460
|
+
}, (error) => {
|
|
1461
|
+
t && clearTimeout(t);
|
|
1462
|
+
reject(error);
|
|
1463
|
+
});
|
|
1464
|
+
} catch (err) {
|
|
1465
|
+
reject(err);
|
|
1466
|
+
}
|
|
1467
|
+
});
|
|
1468
|
+
});
|
|
1469
|
+
};
|
|
1470
|
+
var untilPromise = (cb) => cb();
|
|
1471
|
+
var untilError = (cb) => {
|
|
1472
|
+
return new Promise((resolve, reject) => {
|
|
1473
|
+
setTimeout(async () => {
|
|
1474
|
+
try {
|
|
1475
|
+
await cb();
|
|
1476
|
+
reject(new Error("No error was thrown."));
|
|
1477
|
+
} catch (err) {
|
|
1478
|
+
resolve(err);
|
|
1479
|
+
}
|
|
1480
|
+
});
|
|
1481
|
+
});
|
|
1482
|
+
};
|
|
1415
1483
|
|
|
1416
1484
|
// src/timer.ts
|
|
1417
1485
|
var Timer = class {
|
|
1486
|
+
_callback;
|
|
1487
|
+
_state = new Event();
|
|
1488
|
+
_timer;
|
|
1489
|
+
_count = 0;
|
|
1418
1490
|
constructor(_callback) {
|
|
1419
1491
|
this._callback = _callback;
|
|
1420
|
-
this._state = new Event();
|
|
1421
|
-
this._count = 0;
|
|
1422
1492
|
}
|
|
1423
1493
|
get state() {
|
|
1424
1494
|
return this._state;
|
|
@@ -1461,51 +1531,23 @@ var Timer = class {
|
|
|
1461
1531
|
}
|
|
1462
1532
|
};
|
|
1463
1533
|
|
|
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
1534
|
// src/update-scheduler.ts
|
|
1500
1535
|
var TIME_PERIOD = 1e3;
|
|
1501
1536
|
var UpdateScheduler = class {
|
|
1537
|
+
_ctx;
|
|
1538
|
+
_callback;
|
|
1539
|
+
_params;
|
|
1540
|
+
/**
|
|
1541
|
+
* Promise that resolves when the callback is done.
|
|
1542
|
+
* Never rejects.
|
|
1543
|
+
*/
|
|
1544
|
+
_promise = null;
|
|
1545
|
+
_scheduled = false;
|
|
1546
|
+
_lastUpdateTime = -TIME_PERIOD;
|
|
1502
1547
|
constructor(_ctx, _callback, _params = {}) {
|
|
1503
1548
|
this._ctx = _ctx;
|
|
1504
1549
|
this._callback = _callback;
|
|
1505
1550
|
this._params = _params;
|
|
1506
|
-
this._promise = null;
|
|
1507
|
-
this._scheduled = false;
|
|
1508
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1509
1551
|
_ctx.onDispose(async () => {
|
|
1510
1552
|
await this._promise;
|
|
1511
1553
|
});
|
|
@@ -1518,13 +1560,13 @@ var UpdateScheduler = class {
|
|
|
1518
1560
|
await this._promise;
|
|
1519
1561
|
if (this._params.maxFrequency) {
|
|
1520
1562
|
const now = performance.now();
|
|
1521
|
-
const
|
|
1522
|
-
if (
|
|
1563
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1564
|
+
if (delay2 > 0) {
|
|
1523
1565
|
await new Promise((resolve) => {
|
|
1524
1566
|
const timeoutId = setTimeout(() => {
|
|
1525
1567
|
clearContext();
|
|
1526
1568
|
resolve();
|
|
1527
|
-
},
|
|
1569
|
+
}, delay2);
|
|
1528
1570
|
const clearContext = this._ctx.onDispose(() => {
|
|
1529
1571
|
clearTimeout(timeoutId);
|
|
1530
1572
|
resolve();
|
|
@@ -1568,6 +1610,7 @@ var UpdateScheduler = class {
|
|
|
1568
1610
|
}
|
|
1569
1611
|
};
|
|
1570
1612
|
export {
|
|
1613
|
+
AsyncTask,
|
|
1571
1614
|
CancellableObservableProvider,
|
|
1572
1615
|
DeferredTask,
|
|
1573
1616
|
Event,
|
|
@@ -1588,26 +1631,26 @@ export {
|
|
|
1588
1631
|
UpdateScheduler,
|
|
1589
1632
|
addEventListener,
|
|
1590
1633
|
addListener,
|
|
1591
|
-
asyncChain,
|
|
1592
1634
|
asyncReturn,
|
|
1593
1635
|
asyncTimeout,
|
|
1636
|
+
chain,
|
|
1594
1637
|
combine,
|
|
1595
|
-
createPromiseFromCallback,
|
|
1596
1638
|
debounce,
|
|
1597
1639
|
debounceAndThrottle,
|
|
1640
|
+
delay,
|
|
1598
1641
|
dumpLeaks,
|
|
1599
1642
|
interval,
|
|
1600
1643
|
latch,
|
|
1601
1644
|
makePushIterable,
|
|
1602
1645
|
observableError,
|
|
1603
1646
|
onEvent,
|
|
1647
|
+
promiseFromCallback,
|
|
1604
1648
|
runInContext,
|
|
1605
1649
|
runInContextAsync,
|
|
1606
1650
|
scheduleExponentialBackoffTaskInterval,
|
|
1607
1651
|
scheduleMicroTask,
|
|
1608
1652
|
scheduleTask,
|
|
1609
1653
|
scheduleTaskInterval,
|
|
1610
|
-
sink,
|
|
1611
1654
|
sleep,
|
|
1612
1655
|
sleepWithContext,
|
|
1613
1656
|
streamToArray,
|