@peerbit/time 2.2.0 → 2.3.0-e209d2e
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/src/aggregators.d.ts +15 -15
- package/dist/src/aggregators.d.ts.map +1 -1
- package/dist/src/aggregators.js +22 -34
- package/dist/src/aggregators.js.map +1 -1
- package/dist/src/hrtime.browser.d.ts.map +1 -1
- package/dist/src/hrtime.browser.js.map +1 -1
- package/dist/src/hrtime.d.ts.map +1 -1
- package/dist/src/hrtime.js.map +1 -1
- package/dist/src/metrics.d.ts.map +1 -1
- package/dist/src/wait.d.ts.map +1 -1
- package/dist/src/wait.js +15 -19
- package/dist/src/wait.js.map +1 -1
- package/package.json +62 -61
- package/src/aggregators.ts +52 -53
- package/src/hrtime.browser.ts +2 -0
- package/src/hrtime.ts +1 -0
- package/src/metrics.ts +1 -1
- package/src/wait.ts +25 -21
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
export declare const debounceFixedInterval: <T extends (...args: any[]) => any | Promise<any>>(fn: T, delay: number | (() => number), options?: {
|
|
2
|
-
onError
|
|
2
|
+
onError?(error: Error): void;
|
|
3
3
|
leading?: boolean;
|
|
4
4
|
}) => {
|
|
5
|
-
call
|
|
6
|
-
close
|
|
7
|
-
flush
|
|
5
|
+
call(...args: Parameters<T>): Promise<void>;
|
|
6
|
+
close(): void;
|
|
7
|
+
flush(): Promise<void>;
|
|
8
8
|
};
|
|
9
9
|
export declare const debounceAccumulator: <K, T, V>(fn: (args: V) => any, create: () => {
|
|
10
|
-
delete
|
|
11
|
-
add
|
|
12
|
-
size
|
|
10
|
+
delete(key: K): void;
|
|
11
|
+
add(value: T): void;
|
|
12
|
+
size(): number;
|
|
13
13
|
value: V;
|
|
14
|
-
has
|
|
14
|
+
has(key: K): boolean;
|
|
15
15
|
}, delay: number | (() => number), options?: {
|
|
16
16
|
leading?: boolean;
|
|
17
17
|
}) => {
|
|
18
|
-
add
|
|
19
|
-
delete
|
|
20
|
-
size
|
|
21
|
-
has
|
|
22
|
-
invoke
|
|
23
|
-
close
|
|
24
|
-
flush
|
|
18
|
+
add(value: T): Promise<void>;
|
|
19
|
+
delete(key: K): void;
|
|
20
|
+
size(): number;
|
|
21
|
+
has(key: K): boolean;
|
|
22
|
+
invoke(): Promise<void>;
|
|
23
|
+
close(): void;
|
|
24
|
+
flush(): Promise<void>;
|
|
25
25
|
};
|
|
26
26
|
//# sourceMappingURL=aggregators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregators.d.ts","sourceRoot":"","sources":["../../src/aggregators.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,GACjC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAEhD,IAAI,CAAC,EACL,OAAO,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EAC9B,UAAU;IAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"aggregators.d.ts","sourceRoot":"","sources":["../../src/aggregators.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,GACjC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAEhD,IAAI,CAAC,EACL,OAAO,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EAC9B,UAAU;IAAE,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3D;IACF,IAAI,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,KAAK,IAAI,IAAI,CAAC;IACd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAqJvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAC1C,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,GAAG,EACpB,QAAQ,MAAM;IACb,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACpB,IAAI,IAAI,MAAM,CAAC;IACf,KAAK,EAAE,CAAC,CAAC;IACT,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC;CACrB,EACD,OAAO,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EAC9B,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,KAC7B;IACF,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,IAAI,IAAI,MAAM,CAAC;IACf,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC;IACrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;IACd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAgCvB,CAAC"}
|
package/dist/src/aggregators.js
CHANGED
|
@@ -8,17 +8,17 @@ export const debounceFixedInterval = (fn, delay, options) => {
|
|
|
8
8
|
let timeout = null;
|
|
9
9
|
let lastArgs = null;
|
|
10
10
|
let lastThis;
|
|
11
|
-
let pendingCall = false;
|
|
12
|
-
let isRunning = false;
|
|
13
|
-
let waitingResolvers = [];
|
|
11
|
+
let pendingCall = false;
|
|
12
|
+
let isRunning = false;
|
|
13
|
+
let waitingResolvers = [];
|
|
14
14
|
let lastInvokeTime = null;
|
|
15
15
|
let forceNextImmediate = false;
|
|
16
|
-
// Completed run counter + precise run waiters
|
|
17
16
|
let completedRuns = 0;
|
|
18
17
|
let runWaiters = [];
|
|
19
18
|
const resolveRunWaiters = () => {
|
|
20
|
-
if (runWaiters.length === 0)
|
|
19
|
+
if (runWaiters.length === 0) {
|
|
21
20
|
return;
|
|
21
|
+
}
|
|
22
22
|
const remaining = [];
|
|
23
23
|
for (const w of runWaiters) {
|
|
24
24
|
if (completedRuns >= w.target) {
|
|
@@ -31,18 +31,21 @@ export const debounceFixedInterval = (fn, delay, options) => {
|
|
|
31
31
|
runWaiters = remaining;
|
|
32
32
|
};
|
|
33
33
|
const waitForRun = (target) => new Promise((resolve) => {
|
|
34
|
-
if (completedRuns >= target)
|
|
35
|
-
|
|
34
|
+
if (completedRuns >= target) {
|
|
35
|
+
resolve();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
36
38
|
runWaiters.push({ target, resolve });
|
|
37
39
|
});
|
|
38
40
|
const invoke = async () => {
|
|
39
41
|
timeout = null;
|
|
40
|
-
if (!lastArgs)
|
|
41
|
-
return;
|
|
42
|
+
if (!lastArgs) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
42
45
|
const args = lastArgs;
|
|
43
46
|
const ctx = lastThis;
|
|
44
|
-
lastArgs = null;
|
|
45
|
-
pendingCall = false;
|
|
47
|
+
lastArgs = null;
|
|
48
|
+
pendingCall = false;
|
|
46
49
|
isRunning = true;
|
|
47
50
|
try {
|
|
48
51
|
await Promise.resolve(fn.apply(ctx, args));
|
|
@@ -53,15 +56,13 @@ export const debounceFixedInterval = (fn, delay, options) => {
|
|
|
53
56
|
finally {
|
|
54
57
|
isRunning = false;
|
|
55
58
|
lastInvokeTime = Date.now();
|
|
56
|
-
// Resolve all call() promises queued for this completed run
|
|
57
59
|
const resolvers = waitingResolvers;
|
|
58
60
|
waitingResolvers = [];
|
|
59
|
-
for (const r of resolvers)
|
|
61
|
+
for (const r of resolvers) {
|
|
60
62
|
r();
|
|
61
|
-
|
|
63
|
+
}
|
|
62
64
|
completedRuns++;
|
|
63
65
|
resolveRunWaiters();
|
|
64
|
-
// If new calls arrived during this run, schedule the next one
|
|
65
66
|
if (pendingCall) {
|
|
66
67
|
if (forceNextImmediate) {
|
|
67
68
|
forceNextImmediate = false;
|
|
@@ -75,12 +76,10 @@ export const debounceFixedInterval = (fn, delay, options) => {
|
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
};
|
|
78
|
-
// Use a normal function to preserve `this` from the call site
|
|
79
79
|
function debounced(...args) {
|
|
80
80
|
lastArgs = args;
|
|
81
81
|
lastThis = this;
|
|
82
82
|
pendingCall = true;
|
|
83
|
-
// Resolve after the next completed run
|
|
84
83
|
const p = new Promise((resolve) => {
|
|
85
84
|
waitingResolvers.push(resolve);
|
|
86
85
|
});
|
|
@@ -88,7 +87,7 @@ export const debounceFixedInterval = (fn, delay, options) => {
|
|
|
88
87
|
if (!isRunning && !timeout) {
|
|
89
88
|
if (leading) {
|
|
90
89
|
if (lastInvokeTime === null || now - lastInvokeTime >= delayFn()) {
|
|
91
|
-
invoke();
|
|
90
|
+
void invoke();
|
|
92
91
|
}
|
|
93
92
|
else {
|
|
94
93
|
const remaining = delayFn() - (now - lastInvokeTime);
|
|
@@ -103,30 +102,24 @@ export const debounceFixedInterval = (fn, delay, options) => {
|
|
|
103
102
|
}
|
|
104
103
|
const flush = () => {
|
|
105
104
|
if (isRunning) {
|
|
106
|
-
|
|
107
|
-
const hadPendingArgs = !!lastArgs;
|
|
105
|
+
const hadPendingArgs = Boolean(lastArgs);
|
|
108
106
|
if (hadPendingArgs) {
|
|
109
107
|
pendingCall = true;
|
|
110
108
|
forceNextImmediate = true;
|
|
111
109
|
}
|
|
112
|
-
// Wait for the current run (+1) and, if needed, the immediate trailing run (+1)
|
|
113
110
|
const target = completedRuns + 1 + (hadPendingArgs ? 1 : 0);
|
|
114
111
|
return waitForRun(target);
|
|
115
112
|
}
|
|
116
|
-
// Not running
|
|
117
113
|
if (timeout) {
|
|
118
114
|
clearTimeout(timeout);
|
|
119
115
|
timeout = null;
|
|
120
116
|
}
|
|
121
117
|
if (lastArgs) {
|
|
122
|
-
const target = completedRuns + 1;
|
|
123
|
-
invoke();
|
|
118
|
+
const target = completedRuns + 1;
|
|
119
|
+
void invoke();
|
|
124
120
|
return waitForRun(target);
|
|
125
121
|
}
|
|
126
|
-
|
|
127
|
-
// nothing to flush
|
|
128
|
-
return Promise.resolve();
|
|
129
|
-
}
|
|
122
|
+
return Promise.resolve();
|
|
130
123
|
};
|
|
131
124
|
const close = () => {
|
|
132
125
|
if (timeout !== null) {
|
|
@@ -135,7 +128,6 @@ export const debounceFixedInterval = (fn, delay, options) => {
|
|
|
135
128
|
}
|
|
136
129
|
isRunning = false;
|
|
137
130
|
forceNextImmediate = false;
|
|
138
|
-
// no auto-resolving of pending promises on close()
|
|
139
131
|
};
|
|
140
132
|
return { call: debounced, close, flush };
|
|
141
133
|
};
|
|
@@ -150,7 +142,6 @@ export const debounceAccumulator = (fn, create, delay, options) => {
|
|
|
150
142
|
return {
|
|
151
143
|
add: (value) => {
|
|
152
144
|
accumulator.add(value);
|
|
153
|
-
// resolves when the batch (which includes this value) runs
|
|
154
145
|
return deb.call();
|
|
155
146
|
},
|
|
156
147
|
delete: (key) => {
|
|
@@ -158,17 +149,14 @@ export const debounceAccumulator = (fn, create, delay, options) => {
|
|
|
158
149
|
},
|
|
159
150
|
size: () => accumulator.size(),
|
|
160
151
|
has: (key) => accumulator.has(key),
|
|
161
|
-
// Run immediately, and **cancel** any pending scheduled run to avoid a trailing empty run.
|
|
162
152
|
invoke: async () => {
|
|
163
|
-
deb.close();
|
|
153
|
+
deb.close();
|
|
164
154
|
await innerInvoke();
|
|
165
155
|
},
|
|
166
|
-
// Cancel pending schedule AND reset accumulator so size() === 0 afterward.
|
|
167
156
|
close: () => {
|
|
168
157
|
deb.close();
|
|
169
158
|
accumulator = create();
|
|
170
159
|
},
|
|
171
|
-
// If you exposed flush() before, keep passing it through:
|
|
172
160
|
flush: () => deb.flush?.() ?? Promise.resolve(),
|
|
173
161
|
};
|
|
174
162
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregators.js","sourceRoot":"","sources":["../../src/aggregators.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAGpC,EAAK,EACL,KAA8B,EAC9B,
|
|
1
|
+
{"version":3,"file":"aggregators.js","sourceRoot":"","sources":["../../src/aggregators.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAGpC,EAAK,EACL,KAA8B,EAC9B,OAA6D,EAK5D,EAAE;IACH,MAAM,OAAO,GAAiB,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9E,MAAM,OAAO,GACZ,OAAO,EAAE,OAAO;QAChB,CAAC,CAAC,CAAQ,EAAQ,EAAE;YACnB,MAAM,CAAC,CAAC;QACT,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;IAEzC,IAAI,OAAO,GAAyC,IAAI,CAAC;IACzD,IAAI,QAAQ,GAAiB,IAAI,CAAC;IAClC,IAAI,QAAa,CAAC;IAClB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,gBAAgB,GAAsB,EAAE,CAAC;IAC7C,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,IAAI,UAAU,GAAgB,EAAE,CAAC;IAEjC,MAAM,iBAAiB,GAAG,GAAS,EAAE;QACpC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;QACR,CAAC;QACD,MAAM,SAAS,GAAgB,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC5B,IAAI,aAAa,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC/B,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,CAAC;iBAAM,CAAC;gBACP,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;QACF,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,MAAc,EAAiB,EAAE,CACpD,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;YACV,OAAO;QACR,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACxC,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC;QACtB,MAAM,GAAG,GAAG,QAAQ,CAAC;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,WAAW,GAAG,KAAK,CAAC;QACpB,SAAS,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC;YACJ,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAY,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACV,SAAS,GAAG,KAAK,CAAC;YAClB,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE5B,MAAM,SAAS,GAAG,gBAAgB,CAAC;YACnC,gBAAgB,GAAG,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC3B,CAAC,EAAE,CAAC;YACL,CAAC;YAED,aAAa,EAAE,CAAC;YAChB,iBAAiB,EAAE,CAAC;YAEpB,IAAI,WAAW,EAAE,CAAC;gBACjB,IAAI,kBAAkB,EAAE,CAAC;oBACxB,kBAAkB,GAAG,KAAK,CAAC;oBAC3B,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACP,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC;oBACnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;oBACnD,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACzC,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF,SAAS,SAAS,CAAY,GAAG,IAAmB;QACnD,QAAQ,GAAG,IAAI,CAAC;QAChB,QAAQ,GAAG,IAAI,CAAC;QAChB,WAAW,GAAG,IAAI,CAAC;QAEnB,MAAM,CAAC,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACvC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,IAAI,OAAO,EAAE,CAAC;gBACb,IAAI,cAAc,KAAK,IAAI,IAAI,GAAG,GAAG,cAAc,IAAI,OAAO,EAAE,EAAE,CAAC;oBAClE,KAAK,MAAM,EAAE,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACP,MAAM,SAAS,GAAG,OAAO,EAAE,GAAG,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC;oBACrD,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACzC,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACzC,CAAC;QACF,CAAC;QACD,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,KAAK,GAAG,GAAkB,EAAE;QACjC,IAAI,SAAS,EAAE,CAAC;YACf,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,cAAc,EAAE,CAAC;gBACpB,WAAW,GAAG,IAAI,CAAC;gBACnB,kBAAkB,GAAG,IAAI,CAAC;YAC3B,CAAC;YACD,MAAM,MAAM,GAAG,aAAa,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACb,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,aAAa,GAAG,CAAC,CAAC;YACjC,KAAK,MAAM,EAAE,CAAC;YACd,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAS,EAAE;QACxB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACtB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,SAAS,GAAG,KAAK,CAAC;QAClB,kBAAkB,GAAG,KAAK,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAClC,EAAoB,EACpB,MAMC,EACD,KAA8B,EAC9B,OAA+B,EAS9B,EAAE;IACH,IAAI,WAAW,GAAG,MAAM,EAAE,CAAC;IAE3B,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;QAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC;QACjC,WAAW,GAAG,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,qBAAqB,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAE/D,OAAO;QACN,GAAG,EAAE,CAAC,KAAQ,EAAiB,EAAE;YAChC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,EAAE,CAAC,GAAM,EAAQ,EAAE;YACxB,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,EAAE,GAAW,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE;QACtC,GAAG,EAAE,CAAC,GAAM,EAAW,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;QAC9C,MAAM,EAAE,KAAK,IAAmB,EAAE;YACjC,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,WAAW,EAAE,CAAC;QACrB,CAAC;QACD,KAAK,EAAE,GAAS,EAAE;YACjB,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,WAAW,GAAG,MAAM,EAAE,CAAC;QACxB,CAAC;QACD,KAAK,EAAE,GAAkB,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE;KAC9D,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hrtime.browser.d.ts","sourceRoot":"","sources":["../../src/hrtime.browser.ts"],"names":[],"mappings":"AA2BA,QAAA,MAAM,MAAM;yBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"hrtime.browser.d.ts","sourceRoot":"","sources":["../../src/hrtime.browser.ts"],"names":[],"mappings":"AA2BA,QAAA,MAAM,MAAM;yBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;kBAmB/C,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;CAJhD,CAAC;AASF,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hrtime.browser.js","sourceRoot":"","sources":["../../src/hrtime.browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;EAyBE;AAEF,MAAM,MAAM,GAAG,CAAC,iBAAoC,EAAoB,EAAE;IACzE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAC3C,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IAC9C,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAEpD,IAAI,iBAAiB,EAAE,CAAC;QACvB,OAAO,GAAG,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACzC,WAAW,GAAG,WAAW,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;YACV,WAAW,IAAI,GAAG,CAAC;QACpB,CAAC;IACF,CAAC;IACD,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAC/B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"hrtime.browser.js","sourceRoot":"","sources":["../../src/hrtime.browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;EAyBE;AAEF,MAAM,MAAM,GAAG,CAAC,iBAAoC,EAAoB,EAAE;IACzE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAC3C,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IAC9C,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAEpD,IAAI,iBAAiB,EAAE,CAAC;QACvB,OAAO,GAAG,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACzC,WAAW,GAAG,WAAW,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;YACV,WAAW,IAAI,GAAG,CAAC;QACpB,CAAC;IACF,CAAC;IACD,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,MAAM,CAAC,MAAM,GAAG,CAAC,IAAuB,EAAU,EAAE;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/src/hrtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hrtime.d.ts","sourceRoot":"","sources":["../../src/hrtime.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,MAAM,eAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"hrtime.d.ts","sourceRoot":"","sources":["../../src/hrtime.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,MAAM,eAAiB,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/src/hrtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hrtime.js","sourceRoot":"","sources":["../../src/hrtime.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"hrtime.js","sourceRoot":"","sources":["../../src/hrtime.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"AAEA,qBAAa,oBAAoB;IAKpB,QAAQ,CAAC,GAAG;IAJxB,OAAO,CAAC,MAAM,CAAS;IAEvB,KAAK,SAAK;gBAEW,GAAG,SAAK;IAI7B,GAAG,CAAC,MAAM,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"AAEA,qBAAa,oBAAoB;IAKpB,QAAQ,CAAC,GAAG;IAJxB,OAAO,CAAC,MAAM,CAAS;IAEvB,KAAK,SAAK;gBAEW,GAAG,SAAK;IAI7B,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAWzB"}
|
package/dist/src/wait.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/wait.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAE1C,qBAAa,UAAW,SAAQ,KAAK;CAAG;
|
|
1
|
+
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/wait.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAE1C,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAExC,eAAO,MAAM,KAAK,GACjB,IAAI,MAAM,EACV,UAAU;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAChC,OAAO,CAAC,IAAI,CAYd,CAAC;AAWF,eAAO,MAAM,OAAO,GAAU,CAAC,EAC9B,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACxB,UAAS;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACqB,KAC5C,OAAO,CAAC,CAAC,GAAG,SAAS,CAgCvB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,CAAC,EACtC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACxB,UAAS;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACoB,KAC3C,OAAO,CAAC,CAAC,CAwCX,CAAC"}
|
package/dist/src/wait.js
CHANGED
|
@@ -4,10 +4,10 @@ export class AbortError extends Error {
|
|
|
4
4
|
}
|
|
5
5
|
export const delay = async (ms, options) => {
|
|
6
6
|
return new Promise((resolve, reject) => {
|
|
7
|
-
|
|
7
|
+
const handleAbort = () => {
|
|
8
8
|
clearTimeout(timer);
|
|
9
9
|
reject(new AbortError());
|
|
10
|
-
}
|
|
10
|
+
};
|
|
11
11
|
options?.signal?.addEventListener("abort", handleAbort);
|
|
12
12
|
const timer = setTimeout(() => {
|
|
13
13
|
options?.signal?.removeEventListener("abort", handleAbort);
|
|
@@ -16,12 +16,12 @@ export const delay = async (ms, options) => {
|
|
|
16
16
|
});
|
|
17
17
|
};
|
|
18
18
|
const createTimeoutError = (options) => new TimeoutError(options?.timeoutMessage
|
|
19
|
-
? "Timed out: " + options
|
|
19
|
+
? "Timed out: " + options.timeoutMessage
|
|
20
20
|
: "Timed out");
|
|
21
21
|
export const waitFor = async (fn, options = { timeout: 10 * 1000, delayInterval: 100 }) => {
|
|
22
|
-
const delayInterval = options.delayInterval
|
|
23
|
-
const timeout = options.timeout
|
|
24
|
-
const startTime =
|
|
22
|
+
const delayInterval = options.delayInterval ?? 100;
|
|
23
|
+
const timeout = options.timeout ?? 10 * 1000;
|
|
24
|
+
const startTime = Date.now();
|
|
25
25
|
let stop = false;
|
|
26
26
|
let aborted = false;
|
|
27
27
|
const handleAbort = () => {
|
|
@@ -34,7 +34,7 @@ export const waitFor = async (fn, options = { timeout: 10 * 1000, delayInterval:
|
|
|
34
34
|
handleAbort();
|
|
35
35
|
}
|
|
36
36
|
// eslint-disable-next-line no-unmodified-loop-condition
|
|
37
|
-
while (!stop &&
|
|
37
|
+
while (!stop && Date.now() - startTime < timeout) {
|
|
38
38
|
const result = await fn();
|
|
39
39
|
if (result) {
|
|
40
40
|
options.signal?.removeEventListener("abort", handleAbort);
|
|
@@ -45,14 +45,12 @@ export const waitFor = async (fn, options = { timeout: 10 * 1000, delayInterval:
|
|
|
45
45
|
if (aborted) {
|
|
46
46
|
throw new AbortError();
|
|
47
47
|
}
|
|
48
|
-
|
|
49
|
-
throw createTimeoutError(options);
|
|
50
|
-
}
|
|
48
|
+
throw createTimeoutError(options);
|
|
51
49
|
};
|
|
52
50
|
export const waitForResolved = async (fn, options = { timeout: 10 * 1000, delayInterval: 50 }) => {
|
|
53
|
-
const delayInterval = options.delayInterval
|
|
54
|
-
const timeout = options.timeout
|
|
55
|
-
const startTime =
|
|
51
|
+
const delayInterval = options.delayInterval ?? 50;
|
|
52
|
+
const timeout = options.timeout ?? 10 * 1000;
|
|
53
|
+
const startTime = Date.now();
|
|
56
54
|
let stop = false;
|
|
57
55
|
let lastError;
|
|
58
56
|
let aborted = false;
|
|
@@ -66,25 +64,23 @@ export const waitForResolved = async (fn, options = { timeout: 10 * 1000, delayI
|
|
|
66
64
|
handleAbort();
|
|
67
65
|
}
|
|
68
66
|
// eslint-disable-next-line no-unmodified-loop-condition
|
|
69
|
-
while (!stop &&
|
|
67
|
+
while (!stop && Date.now() - startTime < timeout) {
|
|
70
68
|
try {
|
|
71
69
|
const result = await fn();
|
|
72
70
|
options.signal?.removeEventListener("abort", handleAbort);
|
|
73
71
|
return result;
|
|
74
72
|
}
|
|
75
73
|
catch (error) {
|
|
76
|
-
if (
|
|
77
|
-
lastError = error;
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
74
|
+
if (error instanceof AbortError) {
|
|
80
75
|
throw error;
|
|
81
76
|
}
|
|
77
|
+
lastError = error;
|
|
82
78
|
}
|
|
83
79
|
await delay(delayInterval, options);
|
|
84
80
|
}
|
|
85
81
|
if (aborted) {
|
|
86
82
|
throw new AbortError();
|
|
87
83
|
}
|
|
88
|
-
throw lastError
|
|
84
|
+
throw lastError ?? createTimeoutError(options);
|
|
89
85
|
};
|
|
90
86
|
//# sourceMappingURL=wait.js.map
|
package/dist/src/wait.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/wait.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG;AAE1C,MAAM,OAAO,UAAW,SAAQ,KAAK;CAAG;
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/wait.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,62 +1,63 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
2
|
+
"name": "@peerbit/time",
|
|
3
|
+
"version": "2.3.0-e209d2e",
|
|
4
|
+
"description": "Utility functions for time",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"types": "./dist/src/index.d.ts",
|
|
8
|
+
"typesVersions": {
|
|
9
|
+
"*": {
|
|
10
|
+
"*": [
|
|
11
|
+
"*",
|
|
12
|
+
"dist/*",
|
|
13
|
+
"dist/src/*",
|
|
14
|
+
"dist/src/*/index"
|
|
15
|
+
],
|
|
16
|
+
"src/*": [
|
|
17
|
+
"*",
|
|
18
|
+
"dist/*",
|
|
19
|
+
"dist/src/*",
|
|
20
|
+
"dist/src/*/index"
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"src",
|
|
26
|
+
"dist",
|
|
27
|
+
"!dist/test",
|
|
28
|
+
"!**/*.tsbuildinfo"
|
|
29
|
+
],
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./dist/src/index.d.ts",
|
|
33
|
+
"import": "./dist/src/index.js"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"eslintConfig": {
|
|
37
|
+
"extends": "peerbit",
|
|
38
|
+
"parserOptions": {
|
|
39
|
+
"project": true,
|
|
40
|
+
"sourceType": "module"
|
|
41
|
+
},
|
|
42
|
+
"ignorePatterns": [
|
|
43
|
+
"!.aegir.js",
|
|
44
|
+
"test/ts-use",
|
|
45
|
+
"test/**",
|
|
46
|
+
"*.d.ts"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"browser": {
|
|
50
|
+
"./dist/src/hrtime.js": "./dist/src/hrtime.browser.js"
|
|
51
|
+
},
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public"
|
|
54
|
+
},
|
|
55
|
+
"author": "dao.xyz",
|
|
56
|
+
"license": "MIT",
|
|
57
|
+
"scripts": {
|
|
58
|
+
"clean": "aegir clean",
|
|
59
|
+
"build": "aegir build --no-bundle",
|
|
60
|
+
"test": "aegir test",
|
|
61
|
+
"lint": "aegir lint"
|
|
62
|
+
}
|
|
63
|
+
}
|
package/src/aggregators.ts
CHANGED
|
@@ -3,16 +3,16 @@ export const debounceFixedInterval = <
|
|
|
3
3
|
>(
|
|
4
4
|
fn: T,
|
|
5
5
|
delay: number | (() => number),
|
|
6
|
-
options?: { onError
|
|
6
|
+
options?: { onError?(error: Error): void; leading?: boolean },
|
|
7
7
|
): {
|
|
8
|
-
call
|
|
9
|
-
close
|
|
10
|
-
flush
|
|
8
|
+
call(...args: Parameters<T>): Promise<void>;
|
|
9
|
+
close(): void;
|
|
10
|
+
flush(): Promise<void>;
|
|
11
11
|
} => {
|
|
12
12
|
const delayFn: () => number = typeof delay === "number" ? () => delay : delay;
|
|
13
13
|
const onError =
|
|
14
14
|
options?.onError ??
|
|
15
|
-
((e: Error) => {
|
|
15
|
+
((e: Error): void => {
|
|
16
16
|
throw e;
|
|
17
17
|
});
|
|
18
18
|
const leading = options?.leading ?? true;
|
|
@@ -20,19 +20,20 @@ export const debounceFixedInterval = <
|
|
|
20
20
|
let timeout: ReturnType<typeof setTimeout> | null = null;
|
|
21
21
|
let lastArgs: any[] | null = null;
|
|
22
22
|
let lastThis: any;
|
|
23
|
-
let pendingCall = false;
|
|
24
|
-
let isRunning = false;
|
|
25
|
-
let waitingResolvers: Array<() => void> = [];
|
|
23
|
+
let pendingCall = false;
|
|
24
|
+
let isRunning = false;
|
|
25
|
+
let waitingResolvers: Array<() => void> = [];
|
|
26
26
|
let lastInvokeTime: number | null = null;
|
|
27
27
|
let forceNextImmediate = false;
|
|
28
28
|
|
|
29
|
-
// Completed run counter + precise run waiters
|
|
30
29
|
let completedRuns = 0;
|
|
31
|
-
type RunWaiter = { target: number; resolve
|
|
30
|
+
type RunWaiter = { target: number; resolve(): void };
|
|
32
31
|
let runWaiters: RunWaiter[] = [];
|
|
33
32
|
|
|
34
|
-
const resolveRunWaiters = () => {
|
|
35
|
-
if (runWaiters.length === 0)
|
|
33
|
+
const resolveRunWaiters = (): void => {
|
|
34
|
+
if (runWaiters.length === 0) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
36
37
|
const remaining: RunWaiter[] = [];
|
|
37
38
|
for (const w of runWaiters) {
|
|
38
39
|
if (completedRuns >= w.target) {
|
|
@@ -44,20 +45,25 @@ export const debounceFixedInterval = <
|
|
|
44
45
|
runWaiters = remaining;
|
|
45
46
|
};
|
|
46
47
|
|
|
47
|
-
const waitForRun = (target: number) =>
|
|
48
|
+
const waitForRun = (target: number): Promise<void> =>
|
|
48
49
|
new Promise<void>((resolve) => {
|
|
49
|
-
if (completedRuns >= target)
|
|
50
|
+
if (completedRuns >= target) {
|
|
51
|
+
resolve();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
50
54
|
runWaiters.push({ target, resolve });
|
|
51
55
|
});
|
|
52
56
|
|
|
53
|
-
const invoke = async () => {
|
|
57
|
+
const invoke = async (): Promise<void> => {
|
|
54
58
|
timeout = null;
|
|
55
|
-
if (!lastArgs)
|
|
59
|
+
if (!lastArgs) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
56
62
|
|
|
57
63
|
const args = lastArgs;
|
|
58
64
|
const ctx = lastThis;
|
|
59
|
-
lastArgs = null;
|
|
60
|
-
pendingCall = false;
|
|
65
|
+
lastArgs = null;
|
|
66
|
+
pendingCall = false;
|
|
61
67
|
isRunning = true;
|
|
62
68
|
|
|
63
69
|
try {
|
|
@@ -68,16 +74,15 @@ export const debounceFixedInterval = <
|
|
|
68
74
|
isRunning = false;
|
|
69
75
|
lastInvokeTime = Date.now();
|
|
70
76
|
|
|
71
|
-
// Resolve all call() promises queued for this completed run
|
|
72
77
|
const resolvers = waitingResolvers;
|
|
73
78
|
waitingResolvers = [];
|
|
74
|
-
for (const r of resolvers)
|
|
79
|
+
for (const r of resolvers) {
|
|
80
|
+
r();
|
|
81
|
+
}
|
|
75
82
|
|
|
76
|
-
// Mark completion and resolve any run-target waiters that are due
|
|
77
83
|
completedRuns++;
|
|
78
84
|
resolveRunWaiters();
|
|
79
85
|
|
|
80
|
-
// If new calls arrived during this run, schedule the next one
|
|
81
86
|
if (pendingCall) {
|
|
82
87
|
if (forceNextImmediate) {
|
|
83
88
|
forceNextImmediate = false;
|
|
@@ -91,13 +96,11 @@ export const debounceFixedInterval = <
|
|
|
91
96
|
}
|
|
92
97
|
};
|
|
93
98
|
|
|
94
|
-
// Use a normal function to preserve `this` from the call site
|
|
95
99
|
function debounced(this: any, ...args: Parameters<T>): Promise<void> {
|
|
96
100
|
lastArgs = args;
|
|
97
101
|
lastThis = this;
|
|
98
102
|
pendingCall = true;
|
|
99
103
|
|
|
100
|
-
// Resolve after the next completed run
|
|
101
104
|
const p = new Promise<void>((resolve) => {
|
|
102
105
|
waitingResolvers.push(resolve);
|
|
103
106
|
});
|
|
@@ -106,7 +109,7 @@ export const debounceFixedInterval = <
|
|
|
106
109
|
if (!isRunning && !timeout) {
|
|
107
110
|
if (leading) {
|
|
108
111
|
if (lastInvokeTime === null || now - lastInvokeTime >= delayFn()) {
|
|
109
|
-
invoke();
|
|
112
|
+
void invoke();
|
|
110
113
|
} else {
|
|
111
114
|
const remaining = delayFn() - (now - lastInvokeTime);
|
|
112
115
|
timeout = setTimeout(invoke, remaining);
|
|
@@ -120,41 +123,36 @@ export const debounceFixedInterval = <
|
|
|
120
123
|
|
|
121
124
|
const flush = (): Promise<void> => {
|
|
122
125
|
if (isRunning) {
|
|
123
|
-
|
|
124
|
-
const hadPendingArgs = !!lastArgs;
|
|
126
|
+
const hadPendingArgs = Boolean(lastArgs);
|
|
125
127
|
if (hadPendingArgs) {
|
|
126
128
|
pendingCall = true;
|
|
127
129
|
forceNextImmediate = true;
|
|
128
130
|
}
|
|
129
|
-
// Wait for the current run (+1) and, if needed, the immediate trailing run (+1)
|
|
130
131
|
const target = completedRuns + 1 + (hadPendingArgs ? 1 : 0);
|
|
131
132
|
return waitForRun(target);
|
|
132
133
|
}
|
|
133
134
|
|
|
134
|
-
// Not running
|
|
135
135
|
if (timeout) {
|
|
136
136
|
clearTimeout(timeout);
|
|
137
137
|
timeout = null;
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
if (lastArgs) {
|
|
141
|
-
const target = completedRuns + 1;
|
|
142
|
-
invoke();
|
|
141
|
+
const target = completedRuns + 1;
|
|
142
|
+
void invoke();
|
|
143
143
|
return waitForRun(target);
|
|
144
|
-
} else {
|
|
145
|
-
// nothing to flush
|
|
146
|
-
return Promise.resolve();
|
|
147
144
|
}
|
|
145
|
+
|
|
146
|
+
return Promise.resolve();
|
|
148
147
|
};
|
|
149
148
|
|
|
150
|
-
const close = () => {
|
|
149
|
+
const close = (): void => {
|
|
151
150
|
if (timeout !== null) {
|
|
152
151
|
clearTimeout(timeout);
|
|
153
152
|
timeout = null;
|
|
154
153
|
}
|
|
155
154
|
isRunning = false;
|
|
156
155
|
forceNextImmediate = false;
|
|
157
|
-
// no auto-resolving of pending promises on close()
|
|
158
156
|
};
|
|
159
157
|
|
|
160
158
|
return { call: debounced, close, flush };
|
|
@@ -163,18 +161,26 @@ export const debounceFixedInterval = <
|
|
|
163
161
|
export const debounceAccumulator = <K, T, V>(
|
|
164
162
|
fn: (args: V) => any,
|
|
165
163
|
create: () => {
|
|
166
|
-
delete
|
|
167
|
-
add
|
|
168
|
-
size
|
|
164
|
+
delete(key: K): void;
|
|
165
|
+
add(value: T): void;
|
|
166
|
+
size(): number;
|
|
169
167
|
value: V;
|
|
170
|
-
has
|
|
168
|
+
has(key: K): boolean;
|
|
171
169
|
},
|
|
172
170
|
delay: number | (() => number),
|
|
173
171
|
options?: { leading?: boolean },
|
|
174
|
-
)
|
|
172
|
+
): {
|
|
173
|
+
add(value: T): Promise<void>;
|
|
174
|
+
delete(key: K): void;
|
|
175
|
+
size(): number;
|
|
176
|
+
has(key: K): boolean;
|
|
177
|
+
invoke(): Promise<void>;
|
|
178
|
+
close(): void;
|
|
179
|
+
flush(): Promise<void>;
|
|
180
|
+
} => {
|
|
175
181
|
let accumulator = create();
|
|
176
182
|
|
|
177
|
-
const innerInvoke = async () => {
|
|
183
|
+
const innerInvoke = async (): Promise<void> => {
|
|
178
184
|
const toSend = accumulator.value;
|
|
179
185
|
accumulator = create();
|
|
180
186
|
await fn(toSend);
|
|
@@ -185,28 +191,21 @@ export const debounceAccumulator = <K, T, V>(
|
|
|
185
191
|
return {
|
|
186
192
|
add: (value: T): Promise<void> => {
|
|
187
193
|
accumulator.add(value);
|
|
188
|
-
// resolves when the batch (which includes this value) runs
|
|
189
194
|
return deb.call();
|
|
190
195
|
},
|
|
191
|
-
delete: (key: K) => {
|
|
196
|
+
delete: (key: K): void => {
|
|
192
197
|
accumulator.delete(key);
|
|
193
198
|
},
|
|
194
|
-
size: () => accumulator.size(),
|
|
195
|
-
has: (key: K) => accumulator.has(key),
|
|
196
|
-
|
|
197
|
-
// Run immediately, and **cancel** any pending scheduled run to avoid a trailing empty run.
|
|
199
|
+
size: (): number => accumulator.size(),
|
|
200
|
+
has: (key: K): boolean => accumulator.has(key),
|
|
198
201
|
invoke: async (): Promise<void> => {
|
|
199
|
-
deb.close();
|
|
202
|
+
deb.close();
|
|
200
203
|
await innerInvoke();
|
|
201
204
|
},
|
|
202
|
-
|
|
203
|
-
// Cancel pending schedule AND reset accumulator so size() === 0 afterward.
|
|
204
205
|
close: (): void => {
|
|
205
206
|
deb.close();
|
|
206
207
|
accumulator = create();
|
|
207
208
|
},
|
|
208
|
-
|
|
209
|
-
// If you exposed flush() before, keep passing it through:
|
|
210
209
|
flush: (): Promise<void> => deb.flush?.() ?? Promise.resolve(),
|
|
211
210
|
};
|
|
212
211
|
};
|
package/src/hrtime.browser.ts
CHANGED
|
@@ -41,7 +41,9 @@ const hrtime = (previousTimestamp?: [number, number]): [number, number] => {
|
|
|
41
41
|
}
|
|
42
42
|
return [seconds, nanoseconds];
|
|
43
43
|
};
|
|
44
|
+
|
|
44
45
|
const NS_PER_SEC = 1e9;
|
|
46
|
+
|
|
45
47
|
hrtime.bigint = (time?: [number, number]): bigint => {
|
|
46
48
|
const diff = hrtime(time);
|
|
47
49
|
return BigInt(diff[0] * NS_PER_SEC + diff[1]);
|
package/src/hrtime.ts
CHANGED
package/src/metrics.ts
CHANGED
package/src/wait.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
export class TimeoutError extends Error {}
|
|
2
2
|
|
|
3
3
|
export class AbortError extends Error {}
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
export const delay = async (
|
|
6
|
+
ms: number,
|
|
7
|
+
options?: { signal?: AbortSignal },
|
|
8
|
+
): Promise<void> => {
|
|
5
9
|
return new Promise<void>((resolve, reject) => {
|
|
6
|
-
|
|
10
|
+
const handleAbort = (): void => {
|
|
7
11
|
clearTimeout(timer);
|
|
8
12
|
reject(new AbortError());
|
|
9
|
-
}
|
|
13
|
+
};
|
|
10
14
|
options?.signal?.addEventListener("abort", handleAbort);
|
|
11
15
|
const timer = setTimeout(() => {
|
|
12
16
|
options?.signal?.removeEventListener("abort", handleAbort);
|
|
@@ -15,10 +19,12 @@ export const delay = async (ms: number, options?: { signal?: AbortSignal }) => {
|
|
|
15
19
|
});
|
|
16
20
|
};
|
|
17
21
|
|
|
18
|
-
const createTimeoutError = (options: {
|
|
22
|
+
const createTimeoutError = (options: {
|
|
23
|
+
timeoutMessage?: string;
|
|
24
|
+
}): TimeoutError =>
|
|
19
25
|
new TimeoutError(
|
|
20
26
|
options?.timeoutMessage
|
|
21
|
-
? "Timed out: " + options
|
|
27
|
+
? "Timed out: " + options.timeoutMessage
|
|
22
28
|
: "Timed out",
|
|
23
29
|
);
|
|
24
30
|
|
|
@@ -31,13 +37,13 @@ export const waitFor = async <T>(
|
|
|
31
37
|
timeoutMessage?: string;
|
|
32
38
|
} = { timeout: 10 * 1000, delayInterval: 100 },
|
|
33
39
|
): Promise<T | undefined> => {
|
|
34
|
-
const delayInterval = options.delayInterval
|
|
35
|
-
const timeout = options.timeout
|
|
36
|
-
const startTime =
|
|
40
|
+
const delayInterval = options.delayInterval ?? 100;
|
|
41
|
+
const timeout = options.timeout ?? 10 * 1000;
|
|
42
|
+
const startTime = Date.now();
|
|
37
43
|
let stop = false;
|
|
38
44
|
|
|
39
45
|
let aborted = false;
|
|
40
|
-
const handleAbort = () => {
|
|
46
|
+
const handleAbort = (): void => {
|
|
41
47
|
stop = true;
|
|
42
48
|
aborted = true;
|
|
43
49
|
options.signal?.removeEventListener("abort", handleAbort);
|
|
@@ -49,7 +55,7 @@ export const waitFor = async <T>(
|
|
|
49
55
|
}
|
|
50
56
|
|
|
51
57
|
// eslint-disable-next-line no-unmodified-loop-condition
|
|
52
|
-
while (!stop &&
|
|
58
|
+
while (!stop && Date.now() - startTime < timeout) {
|
|
53
59
|
const result = await fn();
|
|
54
60
|
if (result) {
|
|
55
61
|
options.signal?.removeEventListener("abort", handleAbort);
|
|
@@ -60,9 +66,8 @@ export const waitFor = async <T>(
|
|
|
60
66
|
}
|
|
61
67
|
if (aborted) {
|
|
62
68
|
throw new AbortError();
|
|
63
|
-
} else {
|
|
64
|
-
throw createTimeoutError(options);
|
|
65
69
|
}
|
|
70
|
+
throw createTimeoutError(options);
|
|
66
71
|
};
|
|
67
72
|
|
|
68
73
|
export const waitForResolved = async <T>(
|
|
@@ -74,15 +79,15 @@ export const waitForResolved = async <T>(
|
|
|
74
79
|
timeoutMessage?: string;
|
|
75
80
|
} = { timeout: 10 * 1000, delayInterval: 50 },
|
|
76
81
|
): Promise<T> => {
|
|
77
|
-
const delayInterval = options.delayInterval
|
|
78
|
-
const timeout = options.timeout
|
|
82
|
+
const delayInterval = options.delayInterval ?? 50;
|
|
83
|
+
const timeout = options.timeout ?? 10 * 1000;
|
|
79
84
|
|
|
80
|
-
const startTime =
|
|
85
|
+
const startTime = Date.now();
|
|
81
86
|
let stop = false;
|
|
82
87
|
let lastError: Error | undefined;
|
|
83
88
|
|
|
84
89
|
let aborted = false;
|
|
85
|
-
const handleAbort = () => {
|
|
90
|
+
const handleAbort = (): void => {
|
|
86
91
|
stop = true;
|
|
87
92
|
aborted = true;
|
|
88
93
|
options.signal?.removeEventListener("abort", handleAbort);
|
|
@@ -94,17 +99,16 @@ export const waitForResolved = async <T>(
|
|
|
94
99
|
}
|
|
95
100
|
|
|
96
101
|
// eslint-disable-next-line no-unmodified-loop-condition
|
|
97
|
-
while (!stop &&
|
|
102
|
+
while (!stop && Date.now() - startTime < timeout) {
|
|
98
103
|
try {
|
|
99
104
|
const result = await fn();
|
|
100
105
|
options.signal?.removeEventListener("abort", handleAbort);
|
|
101
106
|
return result;
|
|
102
107
|
} catch (error: any) {
|
|
103
|
-
if (
|
|
104
|
-
lastError = error;
|
|
105
|
-
} else {
|
|
108
|
+
if (error instanceof AbortError) {
|
|
106
109
|
throw error;
|
|
107
110
|
}
|
|
111
|
+
lastError = error;
|
|
108
112
|
}
|
|
109
113
|
await delay(delayInterval, options);
|
|
110
114
|
}
|
|
@@ -113,5 +117,5 @@ export const waitForResolved = async <T>(
|
|
|
113
117
|
throw new AbortError();
|
|
114
118
|
}
|
|
115
119
|
|
|
116
|
-
throw lastError
|
|
120
|
+
throw lastError ?? createTimeoutError(options);
|
|
117
121
|
};
|