@dxos/async 0.8.3 → 0.8.4-main.16b68245aa
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 +338 -279
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +338 -279
- 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 +40 -2
- package/dist/types/src/debounce.d.ts.map +1 -1
- package/dist/types/src/debounce.test.d.ts +2 -0
- package/dist/types/src/debounce.test.d.ts.map +1 -0
- 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 -4
- 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 +13 -12
- package/src/callback.ts +3 -3
- package/src/chain.ts +1 -1
- package/src/cleanup.ts +10 -7
- package/src/debounce.test.ts +115 -0
- package/src/debounce.ts +94 -5
- package/src/event-emitter.test.ts +1 -1
- package/src/events.test.ts +1 -1
- package/src/index.ts +0 -4
- 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 +2 -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/lib/node/index.cjs +0 -1638
- package/dist/lib/node/index.cjs.map +0 -7
- package/dist/lib/node/meta.json +0 -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/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/types.ts +0 -5
- package/src/until.test.ts +0 -47
- package/src/until.ts +0 -58
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
//
|
|
2
|
-
var
|
|
1
|
+
// src/callback.ts
|
|
2
|
+
var promiseFromCallback = (run) => new Promise((resolve, reject) => {
|
|
3
3
|
run((error, value) => {
|
|
4
4
|
if (error) {
|
|
5
5
|
reject(error);
|
|
@@ -9,20 +9,20 @@ var createPromiseFromCallback = (run) => new Promise((resolve, reject) => {
|
|
|
9
9
|
});
|
|
10
10
|
});
|
|
11
11
|
|
|
12
|
-
//
|
|
13
|
-
var
|
|
12
|
+
// src/chain.ts
|
|
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;
|
|
19
19
|
};
|
|
20
20
|
|
|
21
|
-
//
|
|
21
|
+
// src/cleanup.ts
|
|
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,16 +63,60 @@ var SubscriptionSet = class {
|
|
|
64
63
|
}
|
|
65
64
|
};
|
|
66
65
|
|
|
67
|
-
//
|
|
68
|
-
var
|
|
66
|
+
// src/debounce.ts
|
|
67
|
+
var delay = (cb, delay2 = 100) => {
|
|
68
|
+
let pending = false;
|
|
69
|
+
return (...args) => {
|
|
70
|
+
if (pending) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
pending = true;
|
|
74
|
+
setTimeout(() => {
|
|
75
|
+
try {
|
|
76
|
+
cb(...args);
|
|
77
|
+
} finally {
|
|
78
|
+
pending = false;
|
|
79
|
+
}
|
|
80
|
+
}, delay2);
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
var debounce = (cb, delay2 = 100) => {
|
|
69
84
|
let t;
|
|
70
85
|
return (...args) => {
|
|
71
86
|
clearTimeout(t);
|
|
72
|
-
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
|
+
}
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
var debounceAndThrottle = (cb, delay2 = 100) => {
|
|
101
|
+
let timeout2;
|
|
102
|
+
let lastCall = 0;
|
|
103
|
+
return (...args) => {
|
|
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
|
+
}
|
|
73
116
|
};
|
|
74
117
|
};
|
|
75
118
|
|
|
76
|
-
//
|
|
119
|
+
// src/errors.ts
|
|
77
120
|
var toError = (err) => err === void 0 || typeof err === "string" ? new Error(err) : err;
|
|
78
121
|
var TimeoutError = class extends Error {
|
|
79
122
|
constructor(timeout2, label) {
|
|
@@ -88,7 +131,7 @@ var observableError = (observable, err) => {
|
|
|
88
131
|
}
|
|
89
132
|
};
|
|
90
133
|
|
|
91
|
-
//
|
|
134
|
+
// src/timeout.ts
|
|
92
135
|
import { ContextDisposedError } from "@dxos/context";
|
|
93
136
|
var sleep = (ms) => {
|
|
94
137
|
return new Promise((resolve) => {
|
|
@@ -104,8 +147,28 @@ var sleep = (ms) => {
|
|
|
104
147
|
sleeper();
|
|
105
148
|
});
|
|
106
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
|
+
};
|
|
107
167
|
var asyncReturn = () => sleep(0);
|
|
108
168
|
var asyncTimeout = async (promise, timeout2, err) => {
|
|
169
|
+
if (typeof promise === "function") {
|
|
170
|
+
throw new Error("First argument must be a promise.");
|
|
171
|
+
}
|
|
109
172
|
let timeoutId;
|
|
110
173
|
const throwable = err === void 0 || typeof err === "string" ? new TimeoutError(timeout2, err) : err;
|
|
111
174
|
const timeoutPromise = new Promise((resolve, reject) => {
|
|
@@ -114,9 +177,8 @@ var asyncTimeout = async (promise, timeout2, err) => {
|
|
|
114
177
|
}, timeout2);
|
|
115
178
|
unrefTimeout(timeoutId);
|
|
116
179
|
});
|
|
117
|
-
const conditionTimeout = typeof promise === "function" ? createPromiseFromCallback(promise) : promise;
|
|
118
180
|
return await Promise.race([
|
|
119
|
-
|
|
181
|
+
promise,
|
|
120
182
|
timeoutPromise
|
|
121
183
|
]).finally(() => {
|
|
122
184
|
clearTimeout(timeoutId);
|
|
@@ -127,25 +189,8 @@ var unrefTimeout = (timeoutId) => {
|
|
|
127
189
|
timeoutId.unref();
|
|
128
190
|
}
|
|
129
191
|
};
|
|
130
|
-
var sleepWithContext = (ctx, ms) => {
|
|
131
|
-
const error = new ContextDisposedError();
|
|
132
|
-
return new Promise((resolve, reject) => {
|
|
133
|
-
if (ctx.disposed) {
|
|
134
|
-
reject(error);
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
const timeout2 = setTimeout(() => {
|
|
138
|
-
clearDispose();
|
|
139
|
-
resolve();
|
|
140
|
-
}, ms);
|
|
141
|
-
const clearDispose = ctx.onDispose(() => {
|
|
142
|
-
clearTimeout(timeout2);
|
|
143
|
-
reject(error);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
};
|
|
147
192
|
|
|
148
|
-
//
|
|
193
|
+
// src/event-emitter.ts
|
|
149
194
|
var onEvent = (eventEmitter, eventName, callback) => {
|
|
150
195
|
eventEmitter.on(eventName, callback);
|
|
151
196
|
return () => eventEmitter.off(eventName, callback);
|
|
@@ -168,15 +213,10 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
|
|
|
168
213
|
return timeout2 ? asyncTimeout(promise, timeout2, error ?? new Error()).finally(off) : promise.finally(off);
|
|
169
214
|
};
|
|
170
215
|
|
|
171
|
-
//
|
|
216
|
+
// src/events.ts
|
|
172
217
|
import { Context } from "@dxos/context";
|
|
173
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/async/src/events.ts";
|
|
174
218
|
var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
|
|
175
219
|
var Event = class _Event {
|
|
176
|
-
constructor() {
|
|
177
|
-
this._listeners = /* @__PURE__ */ new Set();
|
|
178
|
-
this._effects = /* @__PURE__ */ new Set();
|
|
179
|
-
}
|
|
180
220
|
/**
|
|
181
221
|
* Wrap objects that have on/off style event emitters.
|
|
182
222
|
*/
|
|
@@ -189,6 +229,8 @@ var Event = class _Event {
|
|
|
189
229
|
});
|
|
190
230
|
return event;
|
|
191
231
|
}
|
|
232
|
+
_listeners = /* @__PURE__ */ new Set();
|
|
233
|
+
_effects = /* @__PURE__ */ new Set();
|
|
192
234
|
/**
|
|
193
235
|
* Emit an event.
|
|
194
236
|
* In most cases should only be called by the class or entity containing the event.
|
|
@@ -227,10 +269,7 @@ var Event = class _Event {
|
|
|
227
269
|
_ctx,
|
|
228
270
|
_callback
|
|
229
271
|
] : [
|
|
230
|
-
new Context(
|
|
231
|
-
F: __dxlog_file,
|
|
232
|
-
L: 132
|
|
233
|
-
}),
|
|
272
|
+
new Context(),
|
|
234
273
|
_ctx
|
|
235
274
|
];
|
|
236
275
|
const weak = !!options?.weak;
|
|
@@ -260,10 +299,7 @@ var Event = class _Event {
|
|
|
260
299
|
_ctx,
|
|
261
300
|
_callback
|
|
262
301
|
] : [
|
|
263
|
-
new Context(
|
|
264
|
-
F: __dxlog_file,
|
|
265
|
-
L: 169
|
|
266
|
-
}),
|
|
302
|
+
new Context(),
|
|
267
303
|
_ctx
|
|
268
304
|
];
|
|
269
305
|
const listener = new EventListener(this, callback, ctx, true, false);
|
|
@@ -432,11 +468,15 @@ var Event = class _Event {
|
|
|
432
468
|
}
|
|
433
469
|
};
|
|
434
470
|
var EventListener = class {
|
|
471
|
+
ctx;
|
|
472
|
+
once;
|
|
473
|
+
weak;
|
|
474
|
+
callback;
|
|
475
|
+
_clearDispose = void 0;
|
|
435
476
|
constructor(event, listener, ctx, once, weak) {
|
|
436
477
|
this.ctx = ctx;
|
|
437
478
|
this.once = once;
|
|
438
479
|
this.weak = weak;
|
|
439
|
-
this._clearDispose = void 0;
|
|
440
480
|
this._clearDispose = ctx.onDispose(() => {
|
|
441
481
|
event._removeListener(this);
|
|
442
482
|
});
|
|
@@ -496,65 +536,13 @@ var weakListeners = () => {
|
|
|
496
536
|
};
|
|
497
537
|
};
|
|
498
538
|
|
|
499
|
-
//
|
|
500
|
-
import { invariant } from "@dxos/invariant";
|
|
501
|
-
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/common/async/src/latch.ts";
|
|
502
|
-
var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
503
|
-
invariant(count >= 0, void 0, {
|
|
504
|
-
F: __dxlog_file2,
|
|
505
|
-
L: 19,
|
|
506
|
-
S: void 0,
|
|
507
|
-
A: [
|
|
508
|
-
"count >= 0",
|
|
509
|
-
""
|
|
510
|
-
]
|
|
511
|
-
});
|
|
512
|
-
let t;
|
|
513
|
-
let doResolve;
|
|
514
|
-
let doReject;
|
|
515
|
-
const promise = new Promise((resolve, reject) => {
|
|
516
|
-
doResolve = (value) => {
|
|
517
|
-
clearTimeout(t);
|
|
518
|
-
resolve(value);
|
|
519
|
-
};
|
|
520
|
-
doReject = (err) => {
|
|
521
|
-
clearTimeout(t);
|
|
522
|
-
reject(err);
|
|
523
|
-
};
|
|
524
|
-
});
|
|
525
|
-
if (count === 0) {
|
|
526
|
-
setTimeout(() => {
|
|
527
|
-
doResolve(0);
|
|
528
|
-
});
|
|
529
|
-
} else {
|
|
530
|
-
if (timeout2) {
|
|
531
|
-
t = setTimeout(() => {
|
|
532
|
-
doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
|
|
533
|
-
}, timeout2);
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
let i = 0;
|
|
537
|
-
return [
|
|
538
|
-
async () => await promise,
|
|
539
|
-
() => {
|
|
540
|
-
if (++i === count) {
|
|
541
|
-
doResolve(i);
|
|
542
|
-
}
|
|
543
|
-
return i;
|
|
544
|
-
},
|
|
545
|
-
(err) => doReject(err)
|
|
546
|
-
];
|
|
547
|
-
};
|
|
548
|
-
|
|
549
|
-
// packages/common/async/src/mutex.ts
|
|
539
|
+
// src/mutex.ts
|
|
550
540
|
import "@dxos/util";
|
|
551
541
|
import { warnAfterTimeout } from "@dxos/debug";
|
|
552
542
|
var Mutex = class {
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
this._tag = null;
|
|
557
|
-
}
|
|
543
|
+
_queue = Promise.resolve();
|
|
544
|
+
_queueLength = 0;
|
|
545
|
+
_tag = null;
|
|
558
546
|
get tag() {
|
|
559
547
|
return this._tag;
|
|
560
548
|
}
|
|
@@ -600,6 +588,7 @@ var Mutex = class {
|
|
|
600
588
|
}
|
|
601
589
|
};
|
|
602
590
|
var MutexGuard = class {
|
|
591
|
+
_release;
|
|
603
592
|
constructor(_release) {
|
|
604
593
|
this._release = _release;
|
|
605
594
|
}
|
|
@@ -613,7 +602,7 @@ var MutexGuard = class {
|
|
|
613
602
|
this.release();
|
|
614
603
|
}
|
|
615
604
|
};
|
|
616
|
-
var classMutexSymbol = Symbol("class-mutex");
|
|
605
|
+
var classMutexSymbol = /* @__PURE__ */ Symbol("class-mutex");
|
|
617
606
|
var FORCE_DISABLE_WARNING = false;
|
|
618
607
|
var enableWarning = !FORCE_DISABLE_WARNING && globalThis.mochaExecutor;
|
|
619
608
|
var synchronized = (target, propertyName, descriptor) => {
|
|
@@ -638,11 +627,12 @@ var synchronized = (target, propertyName, descriptor) => {
|
|
|
638
627
|
});
|
|
639
628
|
};
|
|
640
629
|
|
|
641
|
-
//
|
|
630
|
+
// src/observable.ts
|
|
642
631
|
import Observable from "zen-observable";
|
|
643
632
|
import PushStream from "zen-push";
|
|
644
633
|
|
|
645
|
-
//
|
|
634
|
+
// src/trigger.ts
|
|
635
|
+
import { invariant } from "@dxos/invariant";
|
|
646
636
|
var trigger = (timeout2) => {
|
|
647
637
|
let callback;
|
|
648
638
|
const promise = new Promise((resolve, reject) => {
|
|
@@ -658,18 +648,22 @@ var trigger = (timeout2) => {
|
|
|
658
648
|
resolver
|
|
659
649
|
];
|
|
660
650
|
};
|
|
661
|
-
var TriggerState = /* @__PURE__ */ function(TriggerState2) {
|
|
651
|
+
var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
|
|
662
652
|
TriggerState2["WAITING"] = "WAITING";
|
|
663
653
|
TriggerState2["RESOLVED"] = "RESOLVED";
|
|
664
654
|
TriggerState2["REJECTED"] = "REJECTED";
|
|
665
655
|
return TriggerState2;
|
|
666
|
-
}({});
|
|
656
|
+
})({});
|
|
667
657
|
var Trigger = class {
|
|
658
|
+
_options;
|
|
659
|
+
_promise;
|
|
660
|
+
_resolve;
|
|
661
|
+
_reject;
|
|
662
|
+
_state = "WAITING";
|
|
668
663
|
constructor(_options = {
|
|
669
664
|
autoReset: false
|
|
670
665
|
}) {
|
|
671
666
|
this._options = _options;
|
|
672
|
-
this._state = "WAITING";
|
|
673
667
|
this.reset();
|
|
674
668
|
}
|
|
675
669
|
get state() {
|
|
@@ -729,23 +723,53 @@ var Trigger = class {
|
|
|
729
723
|
return this;
|
|
730
724
|
}
|
|
731
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
|
+
};
|
|
732
764
|
|
|
733
|
-
//
|
|
765
|
+
// src/observable.ts
|
|
734
766
|
var MulticastObservable = class _MulticastObservable extends Observable {
|
|
767
|
+
_value;
|
|
768
|
+
_observers = /* @__PURE__ */ new Set();
|
|
769
|
+
_observable;
|
|
770
|
+
_completed = new Trigger();
|
|
735
771
|
constructor(subscriber, _value) {
|
|
736
|
-
super((observer) => this._subscribe(observer)), this._value = _value
|
|
737
|
-
next: (value) => {
|
|
738
|
-
this._value = value;
|
|
739
|
-
this._observers.forEach((observer) => observer.next?.(value));
|
|
740
|
-
},
|
|
741
|
-
error: (err) => {
|
|
742
|
-
this._observers.forEach((observer) => observer.error?.(err));
|
|
743
|
-
},
|
|
744
|
-
complete: () => {
|
|
745
|
-
this._completed.wake();
|
|
746
|
-
this._observers.forEach((observer) => observer.complete?.());
|
|
747
|
-
}
|
|
748
|
-
};
|
|
772
|
+
super((observer) => this._subscribe(observer)), this._value = _value;
|
|
749
773
|
this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
|
|
750
774
|
this._observable.subscribe(this._handlers);
|
|
751
775
|
}
|
|
@@ -829,18 +853,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
|
|
|
829
853
|
this._observers.delete(observer);
|
|
830
854
|
};
|
|
831
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
|
+
};
|
|
832
869
|
};
|
|
833
870
|
var EMPTY_OBSERVABLE = MulticastObservable.of(null);
|
|
834
871
|
|
|
835
|
-
//
|
|
872
|
+
// src/observable-value.ts
|
|
836
873
|
import { createSetDispatch } from "@dxos/util";
|
|
837
874
|
var ObservableProvider = class {
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
this.
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
}
|
|
875
|
+
_handlers = /* @__PURE__ */ new Set();
|
|
876
|
+
_proxy = createSetDispatch({
|
|
877
|
+
handlers: this._handlers
|
|
878
|
+
});
|
|
879
|
+
_value;
|
|
844
880
|
/**
|
|
845
881
|
* Proxy used to dispatch callbacks to each subscription.
|
|
846
882
|
*/
|
|
@@ -861,8 +897,10 @@ var ObservableProvider = class {
|
|
|
861
897
|
}
|
|
862
898
|
};
|
|
863
899
|
var CancellableObservableProvider = class extends ObservableProvider {
|
|
900
|
+
_handleCancel;
|
|
901
|
+
_cancelled = false;
|
|
864
902
|
constructor(_handleCancel) {
|
|
865
|
-
super(), this._handleCancel = _handleCancel
|
|
903
|
+
super(), this._handleCancel = _handleCancel;
|
|
866
904
|
}
|
|
867
905
|
get cancelled() {
|
|
868
906
|
return this._cancelled;
|
|
@@ -877,22 +915,21 @@ var CancellableObservableProvider = class extends ObservableProvider {
|
|
|
877
915
|
}
|
|
878
916
|
};
|
|
879
917
|
|
|
880
|
-
//
|
|
918
|
+
// src/persistent-lifecycle.ts
|
|
881
919
|
import { LifecycleState, Resource, cancelWithContext } from "@dxos/context";
|
|
882
920
|
import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
|
|
883
921
|
import { log as log2 } from "@dxos/log";
|
|
884
922
|
|
|
885
|
-
//
|
|
886
|
-
import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
923
|
+
// src/task-scheduling.ts
|
|
924
|
+
import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
887
925
|
import { StackTrace as StackTrace2 } from "@dxos/debug";
|
|
888
926
|
|
|
889
|
-
//
|
|
927
|
+
// src/track-leaks.ts
|
|
890
928
|
import { StackTrace } from "@dxos/debug";
|
|
891
929
|
import { log } from "@dxos/log";
|
|
892
|
-
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/common/async/src/track-leaks.ts";
|
|
893
930
|
var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
|
|
894
931
|
var openResources = /* @__PURE__ */ new Set();
|
|
895
|
-
var handleSymbol = Symbol("checkLeaksHandle");
|
|
932
|
+
var handleSymbol = /* @__PURE__ */ Symbol("checkLeaksHandle");
|
|
896
933
|
var trackResource = (resourceProvider) => {
|
|
897
934
|
if (!enabled) {
|
|
898
935
|
return () => {
|
|
@@ -939,45 +976,27 @@ var dumpLeaks = () => {
|
|
|
939
976
|
if (!enabled) {
|
|
940
977
|
return;
|
|
941
978
|
}
|
|
942
|
-
log.info(`Leaked resources ${openResources.size}
|
|
943
|
-
F: __dxlog_file3,
|
|
944
|
-
L: 82,
|
|
945
|
-
S: void 0,
|
|
946
|
-
C: (f, a) => f(...a)
|
|
947
|
-
});
|
|
979
|
+
log.info(`Leaked resources ${openResources.size}:`);
|
|
948
980
|
for (const resource of openResources) {
|
|
949
|
-
log.info(`- ${resource.name} at
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
S: void 0,
|
|
953
|
-
C: (f, a) => f(...a)
|
|
954
|
-
});
|
|
955
|
-
log.info(resource.openStack.getStack(1), void 0, {
|
|
956
|
-
F: __dxlog_file3,
|
|
957
|
-
L: 85,
|
|
958
|
-
S: void 0,
|
|
959
|
-
C: (f, a) => f(...a)
|
|
960
|
-
});
|
|
961
|
-
log.info("\n", void 0, {
|
|
962
|
-
F: __dxlog_file3,
|
|
963
|
-
L: 86,
|
|
964
|
-
S: void 0,
|
|
965
|
-
C: (f, a) => f(...a)
|
|
966
|
-
});
|
|
981
|
+
log.info(`- ${resource.name} at`);
|
|
982
|
+
log.info(resource.openStack.getStack(1));
|
|
983
|
+
log.info("\n");
|
|
967
984
|
}
|
|
968
985
|
};
|
|
969
986
|
if (enabled) {
|
|
970
987
|
global.dxDumpLeaks = dumpLeaks;
|
|
971
988
|
}
|
|
972
989
|
|
|
973
|
-
//
|
|
990
|
+
// src/task-scheduling.ts
|
|
974
991
|
var DeferredTask = class {
|
|
992
|
+
_ctx;
|
|
993
|
+
_callback;
|
|
994
|
+
_scheduled = false;
|
|
995
|
+
_currentTask = null;
|
|
996
|
+
_nextTask = new Trigger();
|
|
975
997
|
constructor(_ctx, _callback) {
|
|
976
998
|
this._ctx = _ctx;
|
|
977
999
|
this._callback = _callback;
|
|
978
|
-
this._scheduled = false;
|
|
979
|
-
this._currentTask = null;
|
|
980
|
-
this._nextTask = new Trigger();
|
|
981
1000
|
}
|
|
982
1001
|
get scheduled() {
|
|
983
1002
|
return this._scheduled;
|
|
@@ -1018,6 +1037,79 @@ var DeferredTask = class {
|
|
|
1018
1037
|
await this._currentTask;
|
|
1019
1038
|
}
|
|
1020
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
|
+
};
|
|
1021
1113
|
var runInContext = (ctx, fn) => {
|
|
1022
1114
|
try {
|
|
1023
1115
|
fn();
|
|
@@ -1096,22 +1188,25 @@ var scheduleExponentialBackoffTaskInterval = (ctx, task, initialInterval) => {
|
|
|
1096
1188
|
});
|
|
1097
1189
|
};
|
|
1098
1190
|
|
|
1099
|
-
//
|
|
1191
|
+
// src/persistent-lifecycle.ts
|
|
1100
1192
|
function _ts_decorate(decorators, target, key, desc) {
|
|
1101
1193
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1102
1194
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1103
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;
|
|
1104
1196
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1105
1197
|
}
|
|
1106
|
-
var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
|
|
1107
1198
|
var INIT_RESTART_DELAY = 100;
|
|
1108
1199
|
var DEFAULT_MAX_RESTART_DELAY = 5e3;
|
|
1109
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;
|
|
1110
1208
|
constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
|
|
1111
1209
|
super();
|
|
1112
|
-
this._currentState = void 0;
|
|
1113
|
-
this._restartTask = void 0;
|
|
1114
|
-
this._restartAfter = 0;
|
|
1115
1210
|
this._start = start;
|
|
1116
1211
|
this._stop = stop;
|
|
1117
1212
|
this._onRestart = onRestart;
|
|
@@ -1127,11 +1222,6 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1127
1222
|
} catch (err) {
|
|
1128
1223
|
log2.warn("Restart failed", {
|
|
1129
1224
|
err
|
|
1130
|
-
}, {
|
|
1131
|
-
F: __dxlog_file4,
|
|
1132
|
-
L: 72,
|
|
1133
|
-
S: this,
|
|
1134
|
-
C: (f, a) => f(...a)
|
|
1135
1225
|
});
|
|
1136
1226
|
this._restartTask?.schedule();
|
|
1137
1227
|
}
|
|
@@ -1139,11 +1229,6 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1139
1229
|
this._currentState = await this._start().catch((err) => {
|
|
1140
1230
|
log2.warn("Start failed", {
|
|
1141
1231
|
err
|
|
1142
|
-
}, {
|
|
1143
|
-
F: __dxlog_file4,
|
|
1144
|
-
L: 78,
|
|
1145
|
-
S: this,
|
|
1146
|
-
C: (f, a) => f(...a)
|
|
1147
1232
|
});
|
|
1148
1233
|
this._restartTask?.schedule();
|
|
1149
1234
|
return void 0;
|
|
@@ -1157,11 +1242,6 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1157
1242
|
async _restart() {
|
|
1158
1243
|
log2(`restarting in ${this._restartAfter}ms`, {
|
|
1159
1244
|
state: this._lifecycleState
|
|
1160
|
-
}, {
|
|
1161
|
-
F: __dxlog_file4,
|
|
1162
|
-
L: 91,
|
|
1163
|
-
S: this,
|
|
1164
|
-
C: (f, a) => f(...a)
|
|
1165
1245
|
});
|
|
1166
1246
|
await this._stopCurrentState();
|
|
1167
1247
|
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
@@ -1180,12 +1260,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1180
1260
|
try {
|
|
1181
1261
|
await this._stop(this._currentState);
|
|
1182
1262
|
} catch (err) {
|
|
1183
|
-
log2.catch(err
|
|
1184
|
-
F: __dxlog_file4,
|
|
1185
|
-
L: 113,
|
|
1186
|
-
S: this,
|
|
1187
|
-
C: (f, a) => f(...a)
|
|
1188
|
-
});
|
|
1263
|
+
log2.catch(err);
|
|
1189
1264
|
}
|
|
1190
1265
|
this._currentState = void 0;
|
|
1191
1266
|
}
|
|
@@ -1207,9 +1282,8 @@ _ts_decorate([
|
|
|
1207
1282
|
synchronized
|
|
1208
1283
|
], PersistentLifecycle.prototype, "scheduleRestart", null);
|
|
1209
1284
|
|
|
1210
|
-
//
|
|
1285
|
+
// src/push-iterable.ts
|
|
1211
1286
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
1212
|
-
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/common/async/src/push-iterable.ts";
|
|
1213
1287
|
var makePushIterable = () => {
|
|
1214
1288
|
const buf = [];
|
|
1215
1289
|
const trigger2 = new Trigger({
|
|
@@ -1223,15 +1297,7 @@ var makePushIterable = () => {
|
|
|
1223
1297
|
await trigger2.wait();
|
|
1224
1298
|
}
|
|
1225
1299
|
const item = buf.shift();
|
|
1226
|
-
invariant2(item
|
|
1227
|
-
F: __dxlog_file5,
|
|
1228
|
-
L: 42,
|
|
1229
|
-
S: this,
|
|
1230
|
-
A: [
|
|
1231
|
-
"item",
|
|
1232
|
-
""
|
|
1233
|
-
]
|
|
1234
|
-
});
|
|
1300
|
+
invariant2(item);
|
|
1235
1301
|
switch (item.kind) {
|
|
1236
1302
|
case "next":
|
|
1237
1303
|
return {
|
|
@@ -1273,21 +1339,7 @@ var makePushIterable = () => {
|
|
|
1273
1339
|
};
|
|
1274
1340
|
};
|
|
1275
1341
|
|
|
1276
|
-
//
|
|
1277
|
-
var sink = (emitter, event, count = 1) => {
|
|
1278
|
-
const [getPromise, resolve] = trigger();
|
|
1279
|
-
let counter = 0;
|
|
1280
|
-
const listener = () => {
|
|
1281
|
-
if (++counter === count) {
|
|
1282
|
-
emitter.off(event, listener);
|
|
1283
|
-
resolve();
|
|
1284
|
-
}
|
|
1285
|
-
};
|
|
1286
|
-
emitter.on(event, listener);
|
|
1287
|
-
return getPromise();
|
|
1288
|
-
};
|
|
1289
|
-
|
|
1290
|
-
// packages/common/async/src/stream-to-array.ts
|
|
1342
|
+
// src/stream-to-array.ts
|
|
1291
1343
|
var streamToArray = (stream) => {
|
|
1292
1344
|
let deferred;
|
|
1293
1345
|
if (!stream.readable) {
|
|
@@ -1329,14 +1381,9 @@ var streamToArray = (stream) => {
|
|
|
1329
1381
|
return deferred;
|
|
1330
1382
|
};
|
|
1331
1383
|
|
|
1332
|
-
//
|
|
1384
|
+
// src/test-stream.ts
|
|
1333
1385
|
import { Duplex } from "@dxos/node-std/stream";
|
|
1334
1386
|
var TestStream = class extends Duplex {
|
|
1335
|
-
constructor() {
|
|
1336
|
-
super(...arguments);
|
|
1337
|
-
this._received = Buffer.alloc(0);
|
|
1338
|
-
this._onWrite = new Event();
|
|
1339
|
-
}
|
|
1340
1387
|
static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
|
|
1341
1388
|
stream1.push("ping");
|
|
1342
1389
|
stream2.push("pong");
|
|
@@ -1349,6 +1396,8 @@ var TestStream = class extends Duplex {
|
|
|
1349
1396
|
})
|
|
1350
1397
|
]);
|
|
1351
1398
|
}
|
|
1399
|
+
_received = Buffer.alloc(0);
|
|
1400
|
+
_onWrite = new Event();
|
|
1352
1401
|
_write(chunk, encoding, callback) {
|
|
1353
1402
|
this._received = Buffer.concat([
|
|
1354
1403
|
this._received,
|
|
@@ -1365,7 +1414,7 @@ var TestStream = class extends Duplex {
|
|
|
1365
1414
|
}
|
|
1366
1415
|
};
|
|
1367
1416
|
|
|
1368
|
-
//
|
|
1417
|
+
// src/testing.ts
|
|
1369
1418
|
var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2 = 10, error, breakOnError = false }) => {
|
|
1370
1419
|
const stopTime = timeout2 ? Date.now() + timeout2 : 0;
|
|
1371
1420
|
const trigger2 = new Trigger();
|
|
@@ -1390,13 +1439,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
|
|
|
1390
1439
|
timeout: timeout2
|
|
1391
1440
|
});
|
|
1392
1441
|
};
|
|
1442
|
+
var until = (cb, timeout2) => {
|
|
1443
|
+
return new Promise((resolve, reject) => {
|
|
1444
|
+
const t = timeout2 && setTimeout(() => {
|
|
1445
|
+
reject(new Error(`Timeout after ${t}ms`));
|
|
1446
|
+
}, timeout2);
|
|
1447
|
+
setTimeout(async () => {
|
|
1448
|
+
try {
|
|
1449
|
+
await cb((value) => {
|
|
1450
|
+
t && clearTimeout(t);
|
|
1451
|
+
resolve(value);
|
|
1452
|
+
}, (error) => {
|
|
1453
|
+
t && clearTimeout(t);
|
|
1454
|
+
reject(error);
|
|
1455
|
+
});
|
|
1456
|
+
} catch (err) {
|
|
1457
|
+
reject(err);
|
|
1458
|
+
}
|
|
1459
|
+
});
|
|
1460
|
+
});
|
|
1461
|
+
};
|
|
1462
|
+
var untilPromise = (cb) => cb();
|
|
1463
|
+
var untilError = (cb) => {
|
|
1464
|
+
return new Promise((resolve, reject) => {
|
|
1465
|
+
setTimeout(async () => {
|
|
1466
|
+
try {
|
|
1467
|
+
await cb();
|
|
1468
|
+
reject(new Error("No error was thrown."));
|
|
1469
|
+
} catch (err) {
|
|
1470
|
+
resolve(err);
|
|
1471
|
+
}
|
|
1472
|
+
});
|
|
1473
|
+
});
|
|
1474
|
+
};
|
|
1393
1475
|
|
|
1394
|
-
//
|
|
1476
|
+
// src/timer.ts
|
|
1395
1477
|
var Timer = class {
|
|
1478
|
+
_callback;
|
|
1479
|
+
_state = new Event();
|
|
1480
|
+
_timer;
|
|
1481
|
+
_count = 0;
|
|
1396
1482
|
constructor(_callback) {
|
|
1397
1483
|
this._callback = _callback;
|
|
1398
|
-
this._state = new Event();
|
|
1399
|
-
this._count = 0;
|
|
1400
1484
|
}
|
|
1401
1485
|
get state() {
|
|
1402
1486
|
return this._state;
|
|
@@ -1439,51 +1523,23 @@ var Timer = class {
|
|
|
1439
1523
|
}
|
|
1440
1524
|
};
|
|
1441
1525
|
|
|
1442
|
-
//
|
|
1443
|
-
var until = (cb, timeout2) => {
|
|
1444
|
-
return new Promise((resolve, reject) => {
|
|
1445
|
-
const t = timeout2 && setTimeout(() => {
|
|
1446
|
-
reject(new Error(`Timeout after ${t}ms`));
|
|
1447
|
-
}, timeout2);
|
|
1448
|
-
setTimeout(async () => {
|
|
1449
|
-
try {
|
|
1450
|
-
await cb((value) => {
|
|
1451
|
-
t && clearTimeout(t);
|
|
1452
|
-
resolve(value);
|
|
1453
|
-
}, (error) => {
|
|
1454
|
-
t && clearTimeout(t);
|
|
1455
|
-
reject(error);
|
|
1456
|
-
});
|
|
1457
|
-
} catch (err) {
|
|
1458
|
-
reject(err);
|
|
1459
|
-
}
|
|
1460
|
-
});
|
|
1461
|
-
});
|
|
1462
|
-
};
|
|
1463
|
-
var untilPromise = (cb) => cb();
|
|
1464
|
-
var untilError = (cb) => {
|
|
1465
|
-
return new Promise((resolve, reject) => {
|
|
1466
|
-
setTimeout(async () => {
|
|
1467
|
-
try {
|
|
1468
|
-
await cb();
|
|
1469
|
-
reject(new Error("No error was thrown."));
|
|
1470
|
-
} catch (err) {
|
|
1471
|
-
resolve(err);
|
|
1472
|
-
}
|
|
1473
|
-
});
|
|
1474
|
-
});
|
|
1475
|
-
};
|
|
1476
|
-
|
|
1477
|
-
// packages/common/async/src/update-scheduler.ts
|
|
1526
|
+
// src/update-scheduler.ts
|
|
1478
1527
|
var TIME_PERIOD = 1e3;
|
|
1479
1528
|
var UpdateScheduler = class {
|
|
1529
|
+
_ctx;
|
|
1530
|
+
_callback;
|
|
1531
|
+
_params;
|
|
1532
|
+
/**
|
|
1533
|
+
* Promise that resolves when the callback is done.
|
|
1534
|
+
* Never rejects.
|
|
1535
|
+
*/
|
|
1536
|
+
_promise = null;
|
|
1537
|
+
_scheduled = false;
|
|
1538
|
+
_lastUpdateTime = -TIME_PERIOD;
|
|
1480
1539
|
constructor(_ctx, _callback, _params = {}) {
|
|
1481
1540
|
this._ctx = _ctx;
|
|
1482
1541
|
this._callback = _callback;
|
|
1483
1542
|
this._params = _params;
|
|
1484
|
-
this._promise = null;
|
|
1485
|
-
this._scheduled = false;
|
|
1486
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1487
1543
|
_ctx.onDispose(async () => {
|
|
1488
1544
|
await this._promise;
|
|
1489
1545
|
});
|
|
@@ -1496,13 +1552,13 @@ var UpdateScheduler = class {
|
|
|
1496
1552
|
await this._promise;
|
|
1497
1553
|
if (this._params.maxFrequency) {
|
|
1498
1554
|
const now = performance.now();
|
|
1499
|
-
const
|
|
1500
|
-
if (
|
|
1555
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1556
|
+
if (delay2 > 0) {
|
|
1501
1557
|
await new Promise((resolve) => {
|
|
1502
1558
|
const timeoutId = setTimeout(() => {
|
|
1503
1559
|
clearContext();
|
|
1504
1560
|
resolve();
|
|
1505
|
-
},
|
|
1561
|
+
}, delay2);
|
|
1506
1562
|
const clearContext = this._ctx.onDispose(() => {
|
|
1507
1563
|
clearTimeout(timeoutId);
|
|
1508
1564
|
resolve();
|
|
@@ -1546,6 +1602,7 @@ var UpdateScheduler = class {
|
|
|
1546
1602
|
}
|
|
1547
1603
|
};
|
|
1548
1604
|
export {
|
|
1605
|
+
AsyncTask,
|
|
1549
1606
|
CancellableObservableProvider,
|
|
1550
1607
|
DeferredTask,
|
|
1551
1608
|
Event,
|
|
@@ -1566,29 +1623,31 @@ export {
|
|
|
1566
1623
|
UpdateScheduler,
|
|
1567
1624
|
addEventListener,
|
|
1568
1625
|
addListener,
|
|
1569
|
-
asyncChain,
|
|
1570
1626
|
asyncReturn,
|
|
1571
1627
|
asyncTimeout,
|
|
1628
|
+
chain,
|
|
1572
1629
|
combine,
|
|
1573
|
-
createPromiseFromCallback,
|
|
1574
1630
|
debounce,
|
|
1631
|
+
debounceAndThrottle,
|
|
1632
|
+
delay,
|
|
1575
1633
|
dumpLeaks,
|
|
1576
1634
|
interval,
|
|
1577
1635
|
latch,
|
|
1578
1636
|
makePushIterable,
|
|
1579
1637
|
observableError,
|
|
1580
1638
|
onEvent,
|
|
1639
|
+
promiseFromCallback,
|
|
1581
1640
|
runInContext,
|
|
1582
1641
|
runInContextAsync,
|
|
1583
1642
|
scheduleExponentialBackoffTaskInterval,
|
|
1584
1643
|
scheduleMicroTask,
|
|
1585
1644
|
scheduleTask,
|
|
1586
1645
|
scheduleTaskInterval,
|
|
1587
|
-
sink,
|
|
1588
1646
|
sleep,
|
|
1589
1647
|
sleepWithContext,
|
|
1590
1648
|
streamToArray,
|
|
1591
1649
|
synchronized,
|
|
1650
|
+
throttle,
|
|
1592
1651
|
timeout,
|
|
1593
1652
|
toError,
|
|
1594
1653
|
trackLeaks,
|