@dxos/async 0.8.3-staging.0fa589b → 0.8.4-main.03d5cd7b56
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 +344 -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 +344 -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 +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/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;
|
|
@@ -1125,25 +1220,21 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1125
1220
|
try {
|
|
1126
1221
|
await this._restart();
|
|
1127
1222
|
} catch (err) {
|
|
1223
|
+
if (this._ctx?.disposed) {
|
|
1224
|
+
return;
|
|
1225
|
+
}
|
|
1128
1226
|
log2.warn("Restart failed", {
|
|
1129
1227
|
err
|
|
1130
|
-
}, {
|
|
1131
|
-
F: __dxlog_file4,
|
|
1132
|
-
L: 72,
|
|
1133
|
-
S: this,
|
|
1134
|
-
C: (f, a) => f(...a)
|
|
1135
1228
|
});
|
|
1136
1229
|
this._restartTask?.schedule();
|
|
1137
1230
|
}
|
|
1138
1231
|
});
|
|
1139
1232
|
this._currentState = await this._start().catch((err) => {
|
|
1233
|
+
if (this._ctx?.disposed) {
|
|
1234
|
+
return void 0;
|
|
1235
|
+
}
|
|
1140
1236
|
log2.warn("Start failed", {
|
|
1141
1237
|
err
|
|
1142
|
-
}, {
|
|
1143
|
-
F: __dxlog_file4,
|
|
1144
|
-
L: 78,
|
|
1145
|
-
S: this,
|
|
1146
|
-
C: (f, a) => f(...a)
|
|
1147
1238
|
});
|
|
1148
1239
|
this._restartTask?.schedule();
|
|
1149
1240
|
return void 0;
|
|
@@ -1157,11 +1248,6 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1157
1248
|
async _restart() {
|
|
1158
1249
|
log2(`restarting in ${this._restartAfter}ms`, {
|
|
1159
1250
|
state: this._lifecycleState
|
|
1160
|
-
}, {
|
|
1161
|
-
F: __dxlog_file4,
|
|
1162
|
-
L: 91,
|
|
1163
|
-
S: this,
|
|
1164
|
-
C: (f, a) => f(...a)
|
|
1165
1251
|
});
|
|
1166
1252
|
await this._stopCurrentState();
|
|
1167
1253
|
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
@@ -1180,12 +1266,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1180
1266
|
try {
|
|
1181
1267
|
await this._stop(this._currentState);
|
|
1182
1268
|
} catch (err) {
|
|
1183
|
-
log2.catch(err
|
|
1184
|
-
F: __dxlog_file4,
|
|
1185
|
-
L: 113,
|
|
1186
|
-
S: this,
|
|
1187
|
-
C: (f, a) => f(...a)
|
|
1188
|
-
});
|
|
1269
|
+
log2.catch(err);
|
|
1189
1270
|
}
|
|
1190
1271
|
this._currentState = void 0;
|
|
1191
1272
|
}
|
|
@@ -1207,9 +1288,8 @@ _ts_decorate([
|
|
|
1207
1288
|
synchronized
|
|
1208
1289
|
], PersistentLifecycle.prototype, "scheduleRestart", null);
|
|
1209
1290
|
|
|
1210
|
-
//
|
|
1291
|
+
// src/push-iterable.ts
|
|
1211
1292
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
1212
|
-
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/common/async/src/push-iterable.ts";
|
|
1213
1293
|
var makePushIterable = () => {
|
|
1214
1294
|
const buf = [];
|
|
1215
1295
|
const trigger2 = new Trigger({
|
|
@@ -1223,15 +1303,7 @@ var makePushIterable = () => {
|
|
|
1223
1303
|
await trigger2.wait();
|
|
1224
1304
|
}
|
|
1225
1305
|
const item = buf.shift();
|
|
1226
|
-
invariant2(item
|
|
1227
|
-
F: __dxlog_file5,
|
|
1228
|
-
L: 42,
|
|
1229
|
-
S: this,
|
|
1230
|
-
A: [
|
|
1231
|
-
"item",
|
|
1232
|
-
""
|
|
1233
|
-
]
|
|
1234
|
-
});
|
|
1306
|
+
invariant2(item);
|
|
1235
1307
|
switch (item.kind) {
|
|
1236
1308
|
case "next":
|
|
1237
1309
|
return {
|
|
@@ -1273,21 +1345,7 @@ var makePushIterable = () => {
|
|
|
1273
1345
|
};
|
|
1274
1346
|
};
|
|
1275
1347
|
|
|
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
|
|
1348
|
+
// src/stream-to-array.ts
|
|
1291
1349
|
var streamToArray = (stream) => {
|
|
1292
1350
|
let deferred;
|
|
1293
1351
|
if (!stream.readable) {
|
|
@@ -1329,14 +1387,9 @@ var streamToArray = (stream) => {
|
|
|
1329
1387
|
return deferred;
|
|
1330
1388
|
};
|
|
1331
1389
|
|
|
1332
|
-
//
|
|
1390
|
+
// src/test-stream.ts
|
|
1333
1391
|
import { Duplex } from "@dxos/node-std/stream";
|
|
1334
1392
|
var TestStream = class extends Duplex {
|
|
1335
|
-
constructor() {
|
|
1336
|
-
super(...arguments);
|
|
1337
|
-
this._received = Buffer.alloc(0);
|
|
1338
|
-
this._onWrite = new Event();
|
|
1339
|
-
}
|
|
1340
1393
|
static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
|
|
1341
1394
|
stream1.push("ping");
|
|
1342
1395
|
stream2.push("pong");
|
|
@@ -1349,6 +1402,8 @@ var TestStream = class extends Duplex {
|
|
|
1349
1402
|
})
|
|
1350
1403
|
]);
|
|
1351
1404
|
}
|
|
1405
|
+
_received = Buffer.alloc(0);
|
|
1406
|
+
_onWrite = new Event();
|
|
1352
1407
|
_write(chunk, encoding, callback) {
|
|
1353
1408
|
this._received = Buffer.concat([
|
|
1354
1409
|
this._received,
|
|
@@ -1365,7 +1420,7 @@ var TestStream = class extends Duplex {
|
|
|
1365
1420
|
}
|
|
1366
1421
|
};
|
|
1367
1422
|
|
|
1368
|
-
//
|
|
1423
|
+
// src/testing.ts
|
|
1369
1424
|
var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2 = 10, error, breakOnError = false }) => {
|
|
1370
1425
|
const stopTime = timeout2 ? Date.now() + timeout2 : 0;
|
|
1371
1426
|
const trigger2 = new Trigger();
|
|
@@ -1390,13 +1445,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
|
|
|
1390
1445
|
timeout: timeout2
|
|
1391
1446
|
});
|
|
1392
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
|
+
};
|
|
1393
1481
|
|
|
1394
|
-
//
|
|
1482
|
+
// src/timer.ts
|
|
1395
1483
|
var Timer = class {
|
|
1484
|
+
_callback;
|
|
1485
|
+
_state = new Event();
|
|
1486
|
+
_timer;
|
|
1487
|
+
_count = 0;
|
|
1396
1488
|
constructor(_callback) {
|
|
1397
1489
|
this._callback = _callback;
|
|
1398
|
-
this._state = new Event();
|
|
1399
|
-
this._count = 0;
|
|
1400
1490
|
}
|
|
1401
1491
|
get state() {
|
|
1402
1492
|
return this._state;
|
|
@@ -1439,51 +1529,23 @@ var Timer = class {
|
|
|
1439
1529
|
}
|
|
1440
1530
|
};
|
|
1441
1531
|
|
|
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
|
|
1532
|
+
// src/update-scheduler.ts
|
|
1478
1533
|
var TIME_PERIOD = 1e3;
|
|
1479
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;
|
|
1480
1545
|
constructor(_ctx, _callback, _params = {}) {
|
|
1481
1546
|
this._ctx = _ctx;
|
|
1482
1547
|
this._callback = _callback;
|
|
1483
1548
|
this._params = _params;
|
|
1484
|
-
this._promise = null;
|
|
1485
|
-
this._scheduled = false;
|
|
1486
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1487
1549
|
_ctx.onDispose(async () => {
|
|
1488
1550
|
await this._promise;
|
|
1489
1551
|
});
|
|
@@ -1496,13 +1558,13 @@ var UpdateScheduler = class {
|
|
|
1496
1558
|
await this._promise;
|
|
1497
1559
|
if (this._params.maxFrequency) {
|
|
1498
1560
|
const now = performance.now();
|
|
1499
|
-
const
|
|
1500
|
-
if (
|
|
1561
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1562
|
+
if (delay2 > 0) {
|
|
1501
1563
|
await new Promise((resolve) => {
|
|
1502
1564
|
const timeoutId = setTimeout(() => {
|
|
1503
1565
|
clearContext();
|
|
1504
1566
|
resolve();
|
|
1505
|
-
},
|
|
1567
|
+
}, delay2);
|
|
1506
1568
|
const clearContext = this._ctx.onDispose(() => {
|
|
1507
1569
|
clearTimeout(timeoutId);
|
|
1508
1570
|
resolve();
|
|
@@ -1546,6 +1608,7 @@ var UpdateScheduler = class {
|
|
|
1546
1608
|
}
|
|
1547
1609
|
};
|
|
1548
1610
|
export {
|
|
1611
|
+
AsyncTask,
|
|
1549
1612
|
CancellableObservableProvider,
|
|
1550
1613
|
DeferredTask,
|
|
1551
1614
|
Event,
|
|
@@ -1566,29 +1629,31 @@ export {
|
|
|
1566
1629
|
UpdateScheduler,
|
|
1567
1630
|
addEventListener,
|
|
1568
1631
|
addListener,
|
|
1569
|
-
asyncChain,
|
|
1570
1632
|
asyncReturn,
|
|
1571
1633
|
asyncTimeout,
|
|
1634
|
+
chain,
|
|
1572
1635
|
combine,
|
|
1573
|
-
createPromiseFromCallback,
|
|
1574
1636
|
debounce,
|
|
1637
|
+
debounceAndThrottle,
|
|
1638
|
+
delay,
|
|
1575
1639
|
dumpLeaks,
|
|
1576
1640
|
interval,
|
|
1577
1641
|
latch,
|
|
1578
1642
|
makePushIterable,
|
|
1579
1643
|
observableError,
|
|
1580
1644
|
onEvent,
|
|
1645
|
+
promiseFromCallback,
|
|
1581
1646
|
runInContext,
|
|
1582
1647
|
runInContextAsync,
|
|
1583
1648
|
scheduleExponentialBackoffTaskInterval,
|
|
1584
1649
|
scheduleMicroTask,
|
|
1585
1650
|
scheduleTask,
|
|
1586
1651
|
scheduleTaskInterval,
|
|
1587
|
-
sink,
|
|
1588
1652
|
sleep,
|
|
1589
1653
|
sleepWithContext,
|
|
1590
1654
|
streamToArray,
|
|
1591
1655
|
synchronized,
|
|
1656
|
+
throttle,
|
|
1592
1657
|
timeout,
|
|
1593
1658
|
toError,
|
|
1594
1659
|
trackLeaks,
|