@dxos/async 0.8.3 → 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,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;
|
|
@@ -1127,25 +1222,21 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1127
1222
|
try {
|
|
1128
1223
|
await this._restart();
|
|
1129
1224
|
} catch (err) {
|
|
1225
|
+
if (this._ctx?.disposed) {
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1130
1228
|
log2.warn("Restart failed", {
|
|
1131
1229
|
err
|
|
1132
|
-
}, {
|
|
1133
|
-
F: __dxlog_file4,
|
|
1134
|
-
L: 72,
|
|
1135
|
-
S: this,
|
|
1136
|
-
C: (f, a) => f(...a)
|
|
1137
1230
|
});
|
|
1138
1231
|
this._restartTask?.schedule();
|
|
1139
1232
|
}
|
|
1140
1233
|
});
|
|
1141
1234
|
this._currentState = await this._start().catch((err) => {
|
|
1235
|
+
if (this._ctx?.disposed) {
|
|
1236
|
+
return void 0;
|
|
1237
|
+
}
|
|
1142
1238
|
log2.warn("Start failed", {
|
|
1143
1239
|
err
|
|
1144
|
-
}, {
|
|
1145
|
-
F: __dxlog_file4,
|
|
1146
|
-
L: 78,
|
|
1147
|
-
S: this,
|
|
1148
|
-
C: (f, a) => f(...a)
|
|
1149
1240
|
});
|
|
1150
1241
|
this._restartTask?.schedule();
|
|
1151
1242
|
return void 0;
|
|
@@ -1159,11 +1250,6 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1159
1250
|
async _restart() {
|
|
1160
1251
|
log2(`restarting in ${this._restartAfter}ms`, {
|
|
1161
1252
|
state: this._lifecycleState
|
|
1162
|
-
}, {
|
|
1163
|
-
F: __dxlog_file4,
|
|
1164
|
-
L: 91,
|
|
1165
|
-
S: this,
|
|
1166
|
-
C: (f, a) => f(...a)
|
|
1167
1253
|
});
|
|
1168
1254
|
await this._stopCurrentState();
|
|
1169
1255
|
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
@@ -1182,12 +1268,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1182
1268
|
try {
|
|
1183
1269
|
await this._stop(this._currentState);
|
|
1184
1270
|
} catch (err) {
|
|
1185
|
-
log2.catch(err
|
|
1186
|
-
F: __dxlog_file4,
|
|
1187
|
-
L: 113,
|
|
1188
|
-
S: this,
|
|
1189
|
-
C: (f, a) => f(...a)
|
|
1190
|
-
});
|
|
1271
|
+
log2.catch(err);
|
|
1191
1272
|
}
|
|
1192
1273
|
this._currentState = void 0;
|
|
1193
1274
|
}
|
|
@@ -1209,9 +1290,8 @@ _ts_decorate([
|
|
|
1209
1290
|
synchronized
|
|
1210
1291
|
], PersistentLifecycle.prototype, "scheduleRestart", null);
|
|
1211
1292
|
|
|
1212
|
-
//
|
|
1293
|
+
// src/push-iterable.ts
|
|
1213
1294
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
1214
|
-
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/common/async/src/push-iterable.ts";
|
|
1215
1295
|
var makePushIterable = () => {
|
|
1216
1296
|
const buf = [];
|
|
1217
1297
|
const trigger2 = new Trigger({
|
|
@@ -1225,15 +1305,7 @@ var makePushIterable = () => {
|
|
|
1225
1305
|
await trigger2.wait();
|
|
1226
1306
|
}
|
|
1227
1307
|
const item = buf.shift();
|
|
1228
|
-
invariant2(item
|
|
1229
|
-
F: __dxlog_file5,
|
|
1230
|
-
L: 42,
|
|
1231
|
-
S: this,
|
|
1232
|
-
A: [
|
|
1233
|
-
"item",
|
|
1234
|
-
""
|
|
1235
|
-
]
|
|
1236
|
-
});
|
|
1308
|
+
invariant2(item);
|
|
1237
1309
|
switch (item.kind) {
|
|
1238
1310
|
case "next":
|
|
1239
1311
|
return {
|
|
@@ -1275,21 +1347,7 @@ var makePushIterable = () => {
|
|
|
1275
1347
|
};
|
|
1276
1348
|
};
|
|
1277
1349
|
|
|
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
|
|
1350
|
+
// src/stream-to-array.ts
|
|
1293
1351
|
var streamToArray = (stream) => {
|
|
1294
1352
|
let deferred;
|
|
1295
1353
|
if (!stream.readable) {
|
|
@@ -1331,14 +1389,9 @@ var streamToArray = (stream) => {
|
|
|
1331
1389
|
return deferred;
|
|
1332
1390
|
};
|
|
1333
1391
|
|
|
1334
|
-
//
|
|
1392
|
+
// src/test-stream.ts
|
|
1335
1393
|
import { Duplex } from "node:stream";
|
|
1336
1394
|
var TestStream = class extends Duplex {
|
|
1337
|
-
constructor() {
|
|
1338
|
-
super(...arguments);
|
|
1339
|
-
this._received = Buffer.alloc(0);
|
|
1340
|
-
this._onWrite = new Event();
|
|
1341
|
-
}
|
|
1342
1395
|
static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
|
|
1343
1396
|
stream1.push("ping");
|
|
1344
1397
|
stream2.push("pong");
|
|
@@ -1351,6 +1404,8 @@ var TestStream = class extends Duplex {
|
|
|
1351
1404
|
})
|
|
1352
1405
|
]);
|
|
1353
1406
|
}
|
|
1407
|
+
_received = Buffer.alloc(0);
|
|
1408
|
+
_onWrite = new Event();
|
|
1354
1409
|
_write(chunk, encoding, callback) {
|
|
1355
1410
|
this._received = Buffer.concat([
|
|
1356
1411
|
this._received,
|
|
@@ -1367,7 +1422,7 @@ var TestStream = class extends Duplex {
|
|
|
1367
1422
|
}
|
|
1368
1423
|
};
|
|
1369
1424
|
|
|
1370
|
-
//
|
|
1425
|
+
// src/testing.ts
|
|
1371
1426
|
var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2 = 10, error, breakOnError = false }) => {
|
|
1372
1427
|
const stopTime = timeout2 ? Date.now() + timeout2 : 0;
|
|
1373
1428
|
const trigger2 = new Trigger();
|
|
@@ -1392,13 +1447,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
|
|
|
1392
1447
|
timeout: timeout2
|
|
1393
1448
|
});
|
|
1394
1449
|
};
|
|
1450
|
+
var until = (cb, timeout2) => {
|
|
1451
|
+
return new Promise((resolve, reject) => {
|
|
1452
|
+
const t = timeout2 && setTimeout(() => {
|
|
1453
|
+
reject(new Error(`Timeout after ${t}ms`));
|
|
1454
|
+
}, timeout2);
|
|
1455
|
+
setTimeout(async () => {
|
|
1456
|
+
try {
|
|
1457
|
+
await cb((value) => {
|
|
1458
|
+
t && clearTimeout(t);
|
|
1459
|
+
resolve(value);
|
|
1460
|
+
}, (error) => {
|
|
1461
|
+
t && clearTimeout(t);
|
|
1462
|
+
reject(error);
|
|
1463
|
+
});
|
|
1464
|
+
} catch (err) {
|
|
1465
|
+
reject(err);
|
|
1466
|
+
}
|
|
1467
|
+
});
|
|
1468
|
+
});
|
|
1469
|
+
};
|
|
1470
|
+
var untilPromise = (cb) => cb();
|
|
1471
|
+
var untilError = (cb) => {
|
|
1472
|
+
return new Promise((resolve, reject) => {
|
|
1473
|
+
setTimeout(async () => {
|
|
1474
|
+
try {
|
|
1475
|
+
await cb();
|
|
1476
|
+
reject(new Error("No error was thrown."));
|
|
1477
|
+
} catch (err) {
|
|
1478
|
+
resolve(err);
|
|
1479
|
+
}
|
|
1480
|
+
});
|
|
1481
|
+
});
|
|
1482
|
+
};
|
|
1395
1483
|
|
|
1396
|
-
//
|
|
1484
|
+
// src/timer.ts
|
|
1397
1485
|
var Timer = class {
|
|
1486
|
+
_callback;
|
|
1487
|
+
_state = new Event();
|
|
1488
|
+
_timer;
|
|
1489
|
+
_count = 0;
|
|
1398
1490
|
constructor(_callback) {
|
|
1399
1491
|
this._callback = _callback;
|
|
1400
|
-
this._state = new Event();
|
|
1401
|
-
this._count = 0;
|
|
1402
1492
|
}
|
|
1403
1493
|
get state() {
|
|
1404
1494
|
return this._state;
|
|
@@ -1441,51 +1531,23 @@ var Timer = class {
|
|
|
1441
1531
|
}
|
|
1442
1532
|
};
|
|
1443
1533
|
|
|
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
|
|
1534
|
+
// src/update-scheduler.ts
|
|
1480
1535
|
var TIME_PERIOD = 1e3;
|
|
1481
1536
|
var UpdateScheduler = class {
|
|
1537
|
+
_ctx;
|
|
1538
|
+
_callback;
|
|
1539
|
+
_params;
|
|
1540
|
+
/**
|
|
1541
|
+
* Promise that resolves when the callback is done.
|
|
1542
|
+
* Never rejects.
|
|
1543
|
+
*/
|
|
1544
|
+
_promise = null;
|
|
1545
|
+
_scheduled = false;
|
|
1546
|
+
_lastUpdateTime = -TIME_PERIOD;
|
|
1482
1547
|
constructor(_ctx, _callback, _params = {}) {
|
|
1483
1548
|
this._ctx = _ctx;
|
|
1484
1549
|
this._callback = _callback;
|
|
1485
1550
|
this._params = _params;
|
|
1486
|
-
this._promise = null;
|
|
1487
|
-
this._scheduled = false;
|
|
1488
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1489
1551
|
_ctx.onDispose(async () => {
|
|
1490
1552
|
await this._promise;
|
|
1491
1553
|
});
|
|
@@ -1498,13 +1560,13 @@ var UpdateScheduler = class {
|
|
|
1498
1560
|
await this._promise;
|
|
1499
1561
|
if (this._params.maxFrequency) {
|
|
1500
1562
|
const now = performance.now();
|
|
1501
|
-
const
|
|
1502
|
-
if (
|
|
1563
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1564
|
+
if (delay2 > 0) {
|
|
1503
1565
|
await new Promise((resolve) => {
|
|
1504
1566
|
const timeoutId = setTimeout(() => {
|
|
1505
1567
|
clearContext();
|
|
1506
1568
|
resolve();
|
|
1507
|
-
},
|
|
1569
|
+
}, delay2);
|
|
1508
1570
|
const clearContext = this._ctx.onDispose(() => {
|
|
1509
1571
|
clearTimeout(timeoutId);
|
|
1510
1572
|
resolve();
|
|
@@ -1548,6 +1610,7 @@ var UpdateScheduler = class {
|
|
|
1548
1610
|
}
|
|
1549
1611
|
};
|
|
1550
1612
|
export {
|
|
1613
|
+
AsyncTask,
|
|
1551
1614
|
CancellableObservableProvider,
|
|
1552
1615
|
DeferredTask,
|
|
1553
1616
|
Event,
|
|
@@ -1568,29 +1631,31 @@ export {
|
|
|
1568
1631
|
UpdateScheduler,
|
|
1569
1632
|
addEventListener,
|
|
1570
1633
|
addListener,
|
|
1571
|
-
asyncChain,
|
|
1572
1634
|
asyncReturn,
|
|
1573
1635
|
asyncTimeout,
|
|
1636
|
+
chain,
|
|
1574
1637
|
combine,
|
|
1575
|
-
createPromiseFromCallback,
|
|
1576
1638
|
debounce,
|
|
1639
|
+
debounceAndThrottle,
|
|
1640
|
+
delay,
|
|
1577
1641
|
dumpLeaks,
|
|
1578
1642
|
interval,
|
|
1579
1643
|
latch,
|
|
1580
1644
|
makePushIterable,
|
|
1581
1645
|
observableError,
|
|
1582
1646
|
onEvent,
|
|
1647
|
+
promiseFromCallback,
|
|
1583
1648
|
runInContext,
|
|
1584
1649
|
runInContextAsync,
|
|
1585
1650
|
scheduleExponentialBackoffTaskInterval,
|
|
1586
1651
|
scheduleMicroTask,
|
|
1587
1652
|
scheduleTask,
|
|
1588
1653
|
scheduleTaskInterval,
|
|
1589
|
-
sink,
|
|
1590
1654
|
sleep,
|
|
1591
1655
|
sleepWithContext,
|
|
1592
1656
|
streamToArray,
|
|
1593
1657
|
synchronized,
|
|
1658
|
+
throttle,
|
|
1594
1659
|
timeout,
|
|
1595
1660
|
toError,
|
|
1596
1661
|
trackLeaks,
|