@dxos/async 0.8.3 → 0.8.4-main.1068cf700f
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 +346 -218
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +346 -218
- 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 -2
- package/dist/types/src/cleanup.d.ts.map +1 -1
- package/dist/types/src/debounce.d.ts +34 -1
- 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/index.d.ts +0 -4
- package/dist/types/src/index.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/task-scheduling.d.ts +29 -1
- package/dist/types/src/task-scheduling.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 +1 -1
- package/dist/types/src/timeout.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/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -9
- package/src/callback.ts +3 -3
- package/src/chain.ts +1 -1
- package/src/cleanup.ts +6 -5
- package/src/debounce.test.ts +115 -0
- package/src/debounce.ts +88 -4
- package/src/event-emitter.test.ts +2 -1
- package/src/events.test.ts +1 -1
- package/src/index.ts +0 -4
- package/src/observable-value.test.ts +1 -1
- 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 +23 -22
- 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,16 +9,16 @@ 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 () => {
|
|
@@ -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,6 +147,23 @@ 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) => {
|
|
109
169
|
let timeoutId;
|
|
@@ -114,7 +174,7 @@ var asyncTimeout = async (promise, timeout2, err) => {
|
|
|
114
174
|
}, timeout2);
|
|
115
175
|
unrefTimeout(timeoutId);
|
|
116
176
|
});
|
|
117
|
-
const conditionTimeout = typeof promise === "function" ?
|
|
177
|
+
const conditionTimeout = typeof promise === "function" ? promiseFromCallback(promise) : promise;
|
|
118
178
|
return await Promise.race([
|
|
119
179
|
conditionTimeout,
|
|
120
180
|
timeoutPromise
|
|
@@ -127,25 +187,8 @@ var unrefTimeout = (timeoutId) => {
|
|
|
127
187
|
timeoutId.unref();
|
|
128
188
|
}
|
|
129
189
|
};
|
|
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
190
|
|
|
148
|
-
//
|
|
191
|
+
// src/event-emitter.ts
|
|
149
192
|
var onEvent = (eventEmitter, eventName, callback) => {
|
|
150
193
|
eventEmitter.on(eventName, callback);
|
|
151
194
|
return () => eventEmitter.off(eventName, callback);
|
|
@@ -168,15 +211,11 @@ var waitForEvent = (eventEmitter, eventName, test, timeout2, error) => {
|
|
|
168
211
|
return timeout2 ? asyncTimeout(promise, timeout2, error ?? new Error()).finally(off) : promise.finally(off);
|
|
169
212
|
};
|
|
170
213
|
|
|
171
|
-
//
|
|
214
|
+
// src/events.ts
|
|
172
215
|
import { Context } from "@dxos/context";
|
|
173
|
-
var __dxlog_file = "/
|
|
216
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/common/async/src/events.ts";
|
|
174
217
|
var DO_NOT_ERROR_ON_ASYNC_CALLBACK = true;
|
|
175
218
|
var Event = class _Event {
|
|
176
|
-
constructor() {
|
|
177
|
-
this._listeners = /* @__PURE__ */ new Set();
|
|
178
|
-
this._effects = /* @__PURE__ */ new Set();
|
|
179
|
-
}
|
|
180
219
|
/**
|
|
181
220
|
* Wrap objects that have on/off style event emitters.
|
|
182
221
|
*/
|
|
@@ -189,6 +228,8 @@ var Event = class _Event {
|
|
|
189
228
|
});
|
|
190
229
|
return event;
|
|
191
230
|
}
|
|
231
|
+
_listeners = /* @__PURE__ */ new Set();
|
|
232
|
+
_effects = /* @__PURE__ */ new Set();
|
|
192
233
|
/**
|
|
193
234
|
* Emit an event.
|
|
194
235
|
* In most cases should only be called by the class or entity containing the event.
|
|
@@ -432,11 +473,15 @@ var Event = class _Event {
|
|
|
432
473
|
}
|
|
433
474
|
};
|
|
434
475
|
var EventListener = class {
|
|
476
|
+
ctx;
|
|
477
|
+
once;
|
|
478
|
+
weak;
|
|
479
|
+
callback;
|
|
480
|
+
_clearDispose = void 0;
|
|
435
481
|
constructor(event, listener, ctx, once, weak) {
|
|
436
482
|
this.ctx = ctx;
|
|
437
483
|
this.once = once;
|
|
438
484
|
this.weak = weak;
|
|
439
|
-
this._clearDispose = void 0;
|
|
440
485
|
this._clearDispose = ctx.onDispose(() => {
|
|
441
486
|
event._removeListener(this);
|
|
442
487
|
});
|
|
@@ -496,65 +541,13 @@ var weakListeners = () => {
|
|
|
496
541
|
};
|
|
497
542
|
};
|
|
498
543
|
|
|
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
|
|
544
|
+
// src/mutex.ts
|
|
550
545
|
import "@dxos/util";
|
|
551
546
|
import { warnAfterTimeout } from "@dxos/debug";
|
|
552
547
|
var Mutex = class {
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
this._tag = null;
|
|
557
|
-
}
|
|
548
|
+
_queue = Promise.resolve();
|
|
549
|
+
_queueLength = 0;
|
|
550
|
+
_tag = null;
|
|
558
551
|
get tag() {
|
|
559
552
|
return this._tag;
|
|
560
553
|
}
|
|
@@ -600,6 +593,7 @@ var Mutex = class {
|
|
|
600
593
|
}
|
|
601
594
|
};
|
|
602
595
|
var MutexGuard = class {
|
|
596
|
+
_release;
|
|
603
597
|
constructor(_release) {
|
|
604
598
|
this._release = _release;
|
|
605
599
|
}
|
|
@@ -638,11 +632,13 @@ var synchronized = (target, propertyName, descriptor) => {
|
|
|
638
632
|
});
|
|
639
633
|
};
|
|
640
634
|
|
|
641
|
-
//
|
|
635
|
+
// src/observable.ts
|
|
642
636
|
import Observable from "zen-observable";
|
|
643
637
|
import PushStream from "zen-push";
|
|
644
638
|
|
|
645
|
-
//
|
|
639
|
+
// src/trigger.ts
|
|
640
|
+
import { invariant } from "@dxos/invariant";
|
|
641
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/common/async/src/trigger.ts";
|
|
646
642
|
var trigger = (timeout2) => {
|
|
647
643
|
let callback;
|
|
648
644
|
const promise = new Promise((resolve, reject) => {
|
|
@@ -658,18 +654,22 @@ var trigger = (timeout2) => {
|
|
|
658
654
|
resolver
|
|
659
655
|
];
|
|
660
656
|
};
|
|
661
|
-
var TriggerState = /* @__PURE__ */ function(TriggerState2) {
|
|
657
|
+
var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
|
|
662
658
|
TriggerState2["WAITING"] = "WAITING";
|
|
663
659
|
TriggerState2["RESOLVED"] = "RESOLVED";
|
|
664
660
|
TriggerState2["REJECTED"] = "REJECTED";
|
|
665
661
|
return TriggerState2;
|
|
666
|
-
}({});
|
|
662
|
+
})({});
|
|
667
663
|
var Trigger = class {
|
|
664
|
+
_options;
|
|
665
|
+
_promise;
|
|
666
|
+
_resolve;
|
|
667
|
+
_reject;
|
|
668
|
+
_state = "WAITING";
|
|
668
669
|
constructor(_options = {
|
|
669
670
|
autoReset: false
|
|
670
671
|
}) {
|
|
671
672
|
this._options = _options;
|
|
672
|
-
this._state = "WAITING";
|
|
673
673
|
this.reset();
|
|
674
674
|
}
|
|
675
675
|
get state() {
|
|
@@ -729,23 +729,61 @@ var Trigger = class {
|
|
|
729
729
|
return this;
|
|
730
730
|
}
|
|
731
731
|
};
|
|
732
|
+
var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
733
|
+
invariant(count >= 0, void 0, {
|
|
734
|
+
F: __dxlog_file2,
|
|
735
|
+
L: 139,
|
|
736
|
+
S: void 0,
|
|
737
|
+
A: [
|
|
738
|
+
"count >= 0",
|
|
739
|
+
""
|
|
740
|
+
]
|
|
741
|
+
});
|
|
742
|
+
let t;
|
|
743
|
+
let doResolve;
|
|
744
|
+
let doReject;
|
|
745
|
+
const promise = new Promise((resolve, reject) => {
|
|
746
|
+
doResolve = (value) => {
|
|
747
|
+
clearTimeout(t);
|
|
748
|
+
resolve(value);
|
|
749
|
+
};
|
|
750
|
+
doReject = (err) => {
|
|
751
|
+
clearTimeout(t);
|
|
752
|
+
reject(err);
|
|
753
|
+
};
|
|
754
|
+
});
|
|
755
|
+
if (count === 0) {
|
|
756
|
+
setTimeout(() => {
|
|
757
|
+
doResolve(0);
|
|
758
|
+
});
|
|
759
|
+
} else {
|
|
760
|
+
if (timeout2) {
|
|
761
|
+
t = setTimeout(() => {
|
|
762
|
+
doReject(new Error(`Timed out after ${timeout2.toLocaleString()}ms`));
|
|
763
|
+
}, timeout2);
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
let i = 0;
|
|
767
|
+
return [
|
|
768
|
+
async () => await promise,
|
|
769
|
+
() => {
|
|
770
|
+
if (++i === count) {
|
|
771
|
+
doResolve(i);
|
|
772
|
+
}
|
|
773
|
+
return i;
|
|
774
|
+
},
|
|
775
|
+
(err) => doReject(err)
|
|
776
|
+
];
|
|
777
|
+
};
|
|
732
778
|
|
|
733
|
-
//
|
|
779
|
+
// src/observable.ts
|
|
734
780
|
var MulticastObservable = class _MulticastObservable extends Observable {
|
|
781
|
+
_value;
|
|
782
|
+
_observers = /* @__PURE__ */ new Set();
|
|
783
|
+
_observable;
|
|
784
|
+
_completed = new Trigger();
|
|
735
785
|
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
|
-
};
|
|
786
|
+
super((observer) => this._subscribe(observer)), this._value = _value;
|
|
749
787
|
this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
|
|
750
788
|
this._observable.subscribe(this._handlers);
|
|
751
789
|
}
|
|
@@ -829,18 +867,30 @@ var MulticastObservable = class _MulticastObservable extends Observable {
|
|
|
829
867
|
this._observers.delete(observer);
|
|
830
868
|
};
|
|
831
869
|
}
|
|
870
|
+
_handlers = {
|
|
871
|
+
next: (value) => {
|
|
872
|
+
this._value = value;
|
|
873
|
+
this._observers.forEach((observer) => observer.next?.(value));
|
|
874
|
+
},
|
|
875
|
+
error: (err) => {
|
|
876
|
+
this._observers.forEach((observer) => observer.error?.(err));
|
|
877
|
+
},
|
|
878
|
+
complete: () => {
|
|
879
|
+
this._completed.wake();
|
|
880
|
+
this._observers.forEach((observer) => observer.complete?.());
|
|
881
|
+
}
|
|
882
|
+
};
|
|
832
883
|
};
|
|
833
884
|
var EMPTY_OBSERVABLE = MulticastObservable.of(null);
|
|
834
885
|
|
|
835
|
-
//
|
|
886
|
+
// src/observable-value.ts
|
|
836
887
|
import { createSetDispatch } from "@dxos/util";
|
|
837
888
|
var ObservableProvider = class {
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
this.
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
}
|
|
889
|
+
_handlers = /* @__PURE__ */ new Set();
|
|
890
|
+
_proxy = createSetDispatch({
|
|
891
|
+
handlers: this._handlers
|
|
892
|
+
});
|
|
893
|
+
_value;
|
|
844
894
|
/**
|
|
845
895
|
* Proxy used to dispatch callbacks to each subscription.
|
|
846
896
|
*/
|
|
@@ -861,8 +911,10 @@ var ObservableProvider = class {
|
|
|
861
911
|
}
|
|
862
912
|
};
|
|
863
913
|
var CancellableObservableProvider = class extends ObservableProvider {
|
|
914
|
+
_handleCancel;
|
|
915
|
+
_cancelled = false;
|
|
864
916
|
constructor(_handleCancel) {
|
|
865
|
-
super(), this._handleCancel = _handleCancel
|
|
917
|
+
super(), this._handleCancel = _handleCancel;
|
|
866
918
|
}
|
|
867
919
|
get cancelled() {
|
|
868
920
|
return this._cancelled;
|
|
@@ -877,19 +929,19 @@ var CancellableObservableProvider = class extends ObservableProvider {
|
|
|
877
929
|
}
|
|
878
930
|
};
|
|
879
931
|
|
|
880
|
-
//
|
|
932
|
+
// src/persistent-lifecycle.ts
|
|
881
933
|
import { LifecycleState, Resource, cancelWithContext } from "@dxos/context";
|
|
882
934
|
import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
|
|
883
935
|
import { log as log2 } from "@dxos/log";
|
|
884
936
|
|
|
885
|
-
//
|
|
886
|
-
import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
937
|
+
// src/task-scheduling.ts
|
|
938
|
+
import { Context as Context2, ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
|
|
887
939
|
import { StackTrace as StackTrace2 } from "@dxos/debug";
|
|
888
940
|
|
|
889
|
-
//
|
|
941
|
+
// src/track-leaks.ts
|
|
890
942
|
import { StackTrace } from "@dxos/debug";
|
|
891
943
|
import { log } from "@dxos/log";
|
|
892
|
-
var __dxlog_file3 = "/
|
|
944
|
+
var __dxlog_file3 = "/__w/dxos/dxos/packages/common/async/src/track-leaks.ts";
|
|
893
945
|
var enabled = typeof process !== "undefined" && !!process.env.DX_TRACK_LEAKS;
|
|
894
946
|
var openResources = /* @__PURE__ */ new Set();
|
|
895
947
|
var handleSymbol = Symbol("checkLeaksHandle");
|
|
@@ -970,14 +1022,17 @@ if (enabled) {
|
|
|
970
1022
|
global.dxDumpLeaks = dumpLeaks;
|
|
971
1023
|
}
|
|
972
1024
|
|
|
973
|
-
//
|
|
1025
|
+
// src/task-scheduling.ts
|
|
1026
|
+
var __dxlog_file4 = "/__w/dxos/dxos/packages/common/async/src/task-scheduling.ts";
|
|
974
1027
|
var DeferredTask = class {
|
|
1028
|
+
_ctx;
|
|
1029
|
+
_callback;
|
|
1030
|
+
_scheduled = false;
|
|
1031
|
+
_currentTask = null;
|
|
1032
|
+
_nextTask = new Trigger();
|
|
975
1033
|
constructor(_ctx, _callback) {
|
|
976
1034
|
this._ctx = _ctx;
|
|
977
1035
|
this._callback = _callback;
|
|
978
|
-
this._scheduled = false;
|
|
979
|
-
this._currentTask = null;
|
|
980
|
-
this._nextTask = new Trigger();
|
|
981
1036
|
}
|
|
982
1037
|
get scheduled() {
|
|
983
1038
|
return this._scheduled;
|
|
@@ -1018,6 +1073,82 @@ var DeferredTask = class {
|
|
|
1018
1073
|
await this._currentTask;
|
|
1019
1074
|
}
|
|
1020
1075
|
};
|
|
1076
|
+
var AsyncTask = class {
|
|
1077
|
+
#callback;
|
|
1078
|
+
#ctx = void 0;
|
|
1079
|
+
#scheduled = false;
|
|
1080
|
+
#currentTask = null;
|
|
1081
|
+
#nextTask = new Trigger();
|
|
1082
|
+
constructor(callback) {
|
|
1083
|
+
this.#callback = callback;
|
|
1084
|
+
}
|
|
1085
|
+
get scheduled() {
|
|
1086
|
+
return this.#scheduled;
|
|
1087
|
+
}
|
|
1088
|
+
/**
|
|
1089
|
+
* Context of the resource that owns the task.
|
|
1090
|
+
* When the context is disposed, the task is cancelled and cannot be scheduled again.
|
|
1091
|
+
*/
|
|
1092
|
+
open() {
|
|
1093
|
+
this.#ctx = new Context2(void 0, {
|
|
1094
|
+
F: __dxlog_file4,
|
|
1095
|
+
L: 102
|
|
1096
|
+
});
|
|
1097
|
+
}
|
|
1098
|
+
/**
|
|
1099
|
+
* Closes the task and waits for it to finish if it is running.
|
|
1100
|
+
*/
|
|
1101
|
+
async close() {
|
|
1102
|
+
await this.#ctx?.dispose();
|
|
1103
|
+
await this.join();
|
|
1104
|
+
this.#ctx = void 0;
|
|
1105
|
+
}
|
|
1106
|
+
[Symbol.asyncDispose]() {
|
|
1107
|
+
return this.close();
|
|
1108
|
+
}
|
|
1109
|
+
/**
|
|
1110
|
+
* Schedule the task to run asynchronously.
|
|
1111
|
+
*/
|
|
1112
|
+
// TODO(dmaretskyi): Add scheduleAt. Where the earlier time will override the later one.
|
|
1113
|
+
schedule() {
|
|
1114
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1115
|
+
throw new Error("AsyncTask not open");
|
|
1116
|
+
}
|
|
1117
|
+
if (this.#scheduled) {
|
|
1118
|
+
return;
|
|
1119
|
+
}
|
|
1120
|
+
scheduleTask(this.#ctx, async () => {
|
|
1121
|
+
await this.#currentTask;
|
|
1122
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1123
|
+
return;
|
|
1124
|
+
}
|
|
1125
|
+
this.#scheduled = false;
|
|
1126
|
+
const completionTrigger = this.#nextTask;
|
|
1127
|
+
this.#nextTask = new Trigger();
|
|
1128
|
+
this.#currentTask = runInContextAsync(this.#ctx, () => this.#callback()).then(() => {
|
|
1129
|
+
completionTrigger.wake();
|
|
1130
|
+
});
|
|
1131
|
+
});
|
|
1132
|
+
this.#scheduled = true;
|
|
1133
|
+
}
|
|
1134
|
+
/**
|
|
1135
|
+
* Schedule the task to run and wait for it to finish.
|
|
1136
|
+
*/
|
|
1137
|
+
async runBlocking() {
|
|
1138
|
+
if (this.#ctx?.disposed) {
|
|
1139
|
+
throw new ContextDisposedError2();
|
|
1140
|
+
}
|
|
1141
|
+
this.schedule();
|
|
1142
|
+
await this.#nextTask.wait();
|
|
1143
|
+
}
|
|
1144
|
+
/**
|
|
1145
|
+
* Waits for the current task to finish if it is running.
|
|
1146
|
+
* Does not schedule a new task.
|
|
1147
|
+
*/
|
|
1148
|
+
async join() {
|
|
1149
|
+
await this.#currentTask;
|
|
1150
|
+
}
|
|
1151
|
+
};
|
|
1021
1152
|
var runInContext = (ctx, fn) => {
|
|
1022
1153
|
try {
|
|
1023
1154
|
fn();
|
|
@@ -1096,22 +1227,26 @@ var scheduleExponentialBackoffTaskInterval = (ctx, task, initialInterval) => {
|
|
|
1096
1227
|
});
|
|
1097
1228
|
};
|
|
1098
1229
|
|
|
1099
|
-
//
|
|
1230
|
+
// src/persistent-lifecycle.ts
|
|
1100
1231
|
function _ts_decorate(decorators, target, key, desc) {
|
|
1101
1232
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1102
1233
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1103
1234
|
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
1235
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1105
1236
|
}
|
|
1106
|
-
var
|
|
1237
|
+
var __dxlog_file5 = "/__w/dxos/dxos/packages/common/async/src/persistent-lifecycle.ts";
|
|
1107
1238
|
var INIT_RESTART_DELAY = 100;
|
|
1108
1239
|
var DEFAULT_MAX_RESTART_DELAY = 5e3;
|
|
1109
1240
|
var PersistentLifecycle = class extends Resource {
|
|
1241
|
+
_start;
|
|
1242
|
+
_stop;
|
|
1243
|
+
_onRestart;
|
|
1244
|
+
_maxRestartDelay;
|
|
1245
|
+
_currentState = void 0;
|
|
1246
|
+
_restartTask = void 0;
|
|
1247
|
+
_restartAfter = 0;
|
|
1110
1248
|
constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }) {
|
|
1111
1249
|
super();
|
|
1112
|
-
this._currentState = void 0;
|
|
1113
|
-
this._restartTask = void 0;
|
|
1114
|
-
this._restartAfter = 0;
|
|
1115
1250
|
this._start = start;
|
|
1116
1251
|
this._stop = stop;
|
|
1117
1252
|
this._onRestart = onRestart;
|
|
@@ -1128,7 +1263,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1128
1263
|
log2.warn("Restart failed", {
|
|
1129
1264
|
err
|
|
1130
1265
|
}, {
|
|
1131
|
-
F:
|
|
1266
|
+
F: __dxlog_file5,
|
|
1132
1267
|
L: 72,
|
|
1133
1268
|
S: this,
|
|
1134
1269
|
C: (f, a) => f(...a)
|
|
@@ -1140,7 +1275,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1140
1275
|
log2.warn("Start failed", {
|
|
1141
1276
|
err
|
|
1142
1277
|
}, {
|
|
1143
|
-
F:
|
|
1278
|
+
F: __dxlog_file5,
|
|
1144
1279
|
L: 78,
|
|
1145
1280
|
S: this,
|
|
1146
1281
|
C: (f, a) => f(...a)
|
|
@@ -1158,7 +1293,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1158
1293
|
log2(`restarting in ${this._restartAfter}ms`, {
|
|
1159
1294
|
state: this._lifecycleState
|
|
1160
1295
|
}, {
|
|
1161
|
-
F:
|
|
1296
|
+
F: __dxlog_file5,
|
|
1162
1297
|
L: 91,
|
|
1163
1298
|
S: this,
|
|
1164
1299
|
C: (f, a) => f(...a)
|
|
@@ -1181,7 +1316,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
1181
1316
|
await this._stop(this._currentState);
|
|
1182
1317
|
} catch (err) {
|
|
1183
1318
|
log2.catch(err, void 0, {
|
|
1184
|
-
F:
|
|
1319
|
+
F: __dxlog_file5,
|
|
1185
1320
|
L: 113,
|
|
1186
1321
|
S: this,
|
|
1187
1322
|
C: (f, a) => f(...a)
|
|
@@ -1207,9 +1342,9 @@ _ts_decorate([
|
|
|
1207
1342
|
synchronized
|
|
1208
1343
|
], PersistentLifecycle.prototype, "scheduleRestart", null);
|
|
1209
1344
|
|
|
1210
|
-
//
|
|
1345
|
+
// src/push-iterable.ts
|
|
1211
1346
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
1212
|
-
var
|
|
1347
|
+
var __dxlog_file6 = "/__w/dxos/dxos/packages/common/async/src/push-iterable.ts";
|
|
1213
1348
|
var makePushIterable = () => {
|
|
1214
1349
|
const buf = [];
|
|
1215
1350
|
const trigger2 = new Trigger({
|
|
@@ -1224,7 +1359,7 @@ var makePushIterable = () => {
|
|
|
1224
1359
|
}
|
|
1225
1360
|
const item = buf.shift();
|
|
1226
1361
|
invariant2(item, void 0, {
|
|
1227
|
-
F:
|
|
1362
|
+
F: __dxlog_file6,
|
|
1228
1363
|
L: 42,
|
|
1229
1364
|
S: this,
|
|
1230
1365
|
A: [
|
|
@@ -1273,21 +1408,7 @@ var makePushIterable = () => {
|
|
|
1273
1408
|
};
|
|
1274
1409
|
};
|
|
1275
1410
|
|
|
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
|
|
1411
|
+
// src/stream-to-array.ts
|
|
1291
1412
|
var streamToArray = (stream) => {
|
|
1292
1413
|
let deferred;
|
|
1293
1414
|
if (!stream.readable) {
|
|
@@ -1329,14 +1450,9 @@ var streamToArray = (stream) => {
|
|
|
1329
1450
|
return deferred;
|
|
1330
1451
|
};
|
|
1331
1452
|
|
|
1332
|
-
//
|
|
1453
|
+
// src/test-stream.ts
|
|
1333
1454
|
import { Duplex } from "@dxos/node-std/stream";
|
|
1334
1455
|
var TestStream = class extends Duplex {
|
|
1335
|
-
constructor() {
|
|
1336
|
-
super(...arguments);
|
|
1337
|
-
this._received = Buffer.alloc(0);
|
|
1338
|
-
this._onWrite = new Event();
|
|
1339
|
-
}
|
|
1340
1456
|
static async assertConnectivity(stream1, stream2, { timeout: timeout2 = 200 } = {}) {
|
|
1341
1457
|
stream1.push("ping");
|
|
1342
1458
|
stream2.push("pong");
|
|
@@ -1349,6 +1465,8 @@ var TestStream = class extends Duplex {
|
|
|
1349
1465
|
})
|
|
1350
1466
|
]);
|
|
1351
1467
|
}
|
|
1468
|
+
_received = Buffer.alloc(0);
|
|
1469
|
+
_onWrite = new Event();
|
|
1352
1470
|
_write(chunk, encoding, callback) {
|
|
1353
1471
|
this._received = Buffer.concat([
|
|
1354
1472
|
this._received,
|
|
@@ -1365,7 +1483,7 @@ var TestStream = class extends Duplex {
|
|
|
1365
1483
|
}
|
|
1366
1484
|
};
|
|
1367
1485
|
|
|
1368
|
-
//
|
|
1486
|
+
// src/testing.ts
|
|
1369
1487
|
var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2 = 10, error, breakOnError = false }) => {
|
|
1370
1488
|
const stopTime = timeout2 ? Date.now() + timeout2 : 0;
|
|
1371
1489
|
const trigger2 = new Trigger();
|
|
@@ -1390,13 +1508,48 @@ var waitForCondition = ({ condition, timeout: timeout2 = 0, interval: interval2
|
|
|
1390
1508
|
timeout: timeout2
|
|
1391
1509
|
});
|
|
1392
1510
|
};
|
|
1511
|
+
var until = (cb, timeout2) => {
|
|
1512
|
+
return new Promise((resolve, reject) => {
|
|
1513
|
+
const t = timeout2 && setTimeout(() => {
|
|
1514
|
+
reject(new Error(`Timeout after ${t}ms`));
|
|
1515
|
+
}, timeout2);
|
|
1516
|
+
setTimeout(async () => {
|
|
1517
|
+
try {
|
|
1518
|
+
await cb((value) => {
|
|
1519
|
+
t && clearTimeout(t);
|
|
1520
|
+
resolve(value);
|
|
1521
|
+
}, (error) => {
|
|
1522
|
+
t && clearTimeout(t);
|
|
1523
|
+
reject(error);
|
|
1524
|
+
});
|
|
1525
|
+
} catch (err) {
|
|
1526
|
+
reject(err);
|
|
1527
|
+
}
|
|
1528
|
+
});
|
|
1529
|
+
});
|
|
1530
|
+
};
|
|
1531
|
+
var untilPromise = (cb) => cb();
|
|
1532
|
+
var untilError = (cb) => {
|
|
1533
|
+
return new Promise((resolve, reject) => {
|
|
1534
|
+
setTimeout(async () => {
|
|
1535
|
+
try {
|
|
1536
|
+
await cb();
|
|
1537
|
+
reject(new Error("No error was thrown."));
|
|
1538
|
+
} catch (err) {
|
|
1539
|
+
resolve(err);
|
|
1540
|
+
}
|
|
1541
|
+
});
|
|
1542
|
+
});
|
|
1543
|
+
};
|
|
1393
1544
|
|
|
1394
|
-
//
|
|
1545
|
+
// src/timer.ts
|
|
1395
1546
|
var Timer = class {
|
|
1547
|
+
_callback;
|
|
1548
|
+
_state = new Event();
|
|
1549
|
+
_timer;
|
|
1550
|
+
_count = 0;
|
|
1396
1551
|
constructor(_callback) {
|
|
1397
1552
|
this._callback = _callback;
|
|
1398
|
-
this._state = new Event();
|
|
1399
|
-
this._count = 0;
|
|
1400
1553
|
}
|
|
1401
1554
|
get state() {
|
|
1402
1555
|
return this._state;
|
|
@@ -1439,51 +1592,23 @@ var Timer = class {
|
|
|
1439
1592
|
}
|
|
1440
1593
|
};
|
|
1441
1594
|
|
|
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
|
|
1595
|
+
// src/update-scheduler.ts
|
|
1478
1596
|
var TIME_PERIOD = 1e3;
|
|
1479
1597
|
var UpdateScheduler = class {
|
|
1598
|
+
_ctx;
|
|
1599
|
+
_callback;
|
|
1600
|
+
_params;
|
|
1601
|
+
/**
|
|
1602
|
+
* Promise that resolves when the callback is done.
|
|
1603
|
+
* Never rejects.
|
|
1604
|
+
*/
|
|
1605
|
+
_promise = null;
|
|
1606
|
+
_scheduled = false;
|
|
1607
|
+
_lastUpdateTime = -TIME_PERIOD;
|
|
1480
1608
|
constructor(_ctx, _callback, _params = {}) {
|
|
1481
1609
|
this._ctx = _ctx;
|
|
1482
1610
|
this._callback = _callback;
|
|
1483
1611
|
this._params = _params;
|
|
1484
|
-
this._promise = null;
|
|
1485
|
-
this._scheduled = false;
|
|
1486
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1487
1612
|
_ctx.onDispose(async () => {
|
|
1488
1613
|
await this._promise;
|
|
1489
1614
|
});
|
|
@@ -1496,13 +1621,13 @@ var UpdateScheduler = class {
|
|
|
1496
1621
|
await this._promise;
|
|
1497
1622
|
if (this._params.maxFrequency) {
|
|
1498
1623
|
const now = performance.now();
|
|
1499
|
-
const
|
|
1500
|
-
if (
|
|
1624
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1625
|
+
if (delay2 > 0) {
|
|
1501
1626
|
await new Promise((resolve) => {
|
|
1502
1627
|
const timeoutId = setTimeout(() => {
|
|
1503
1628
|
clearContext();
|
|
1504
1629
|
resolve();
|
|
1505
|
-
},
|
|
1630
|
+
}, delay2);
|
|
1506
1631
|
const clearContext = this._ctx.onDispose(() => {
|
|
1507
1632
|
clearTimeout(timeoutId);
|
|
1508
1633
|
resolve();
|
|
@@ -1546,6 +1671,7 @@ var UpdateScheduler = class {
|
|
|
1546
1671
|
}
|
|
1547
1672
|
};
|
|
1548
1673
|
export {
|
|
1674
|
+
AsyncTask,
|
|
1549
1675
|
CancellableObservableProvider,
|
|
1550
1676
|
DeferredTask,
|
|
1551
1677
|
Event,
|
|
@@ -1566,29 +1692,31 @@ export {
|
|
|
1566
1692
|
UpdateScheduler,
|
|
1567
1693
|
addEventListener,
|
|
1568
1694
|
addListener,
|
|
1569
|
-
asyncChain,
|
|
1570
1695
|
asyncReturn,
|
|
1571
1696
|
asyncTimeout,
|
|
1697
|
+
chain,
|
|
1572
1698
|
combine,
|
|
1573
|
-
createPromiseFromCallback,
|
|
1574
1699
|
debounce,
|
|
1700
|
+
debounceAndThrottle,
|
|
1701
|
+
delay,
|
|
1575
1702
|
dumpLeaks,
|
|
1576
1703
|
interval,
|
|
1577
1704
|
latch,
|
|
1578
1705
|
makePushIterable,
|
|
1579
1706
|
observableError,
|
|
1580
1707
|
onEvent,
|
|
1708
|
+
promiseFromCallback,
|
|
1581
1709
|
runInContext,
|
|
1582
1710
|
runInContextAsync,
|
|
1583
1711
|
scheduleExponentialBackoffTaskInterval,
|
|
1584
1712
|
scheduleMicroTask,
|
|
1585
1713
|
scheduleTask,
|
|
1586
1714
|
scheduleTaskInterval,
|
|
1587
|
-
sink,
|
|
1588
1715
|
sleep,
|
|
1589
1716
|
sleepWithContext,
|
|
1590
1717
|
streamToArray,
|
|
1591
1718
|
synchronized,
|
|
1719
|
+
throttle,
|
|
1592
1720
|
timeout,
|
|
1593
1721
|
toError,
|
|
1594
1722
|
trackLeaks,
|