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