Skip to content

Commit d900406

Browse files
committed
feat(interval): option to unref sleep interval
1 parent 7221be2 commit d900406

File tree

4 files changed

+15
-8
lines changed

4 files changed

+15
-8
lines changed

src/asynciterable/_sleep.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { AbortError } from '../aborterror.js';
22

3-
export function sleep(dueTime: number, signal?: AbortSignal) {
4-
return new Promise<void>((resolve, reject) => {
3+
export function sleep(dueTime: number, signal?: AbortSignal, unref = false): Promise<void> {
4+
return new Promise((resolve, reject) => {
55
if (signal && signal.aborted) {
66
reject(new AbortError());
77
}
@@ -18,6 +18,10 @@ export function sleep(dueTime: number, signal?: AbortSignal) {
1818
resolve();
1919
}, dueTime);
2020

21+
if (unref && typeof id['unref'] === 'function') {
22+
id['unref']();
23+
}
24+
2125
if (signal) {
2226
signal.addEventListener('abort', onAbort, { once: true });
2327
}

src/asynciterable/interval.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@ import { throwIfAborted } from '../aborterror.js';
44

55
class IntervalAsyncIterable extends AsyncIterableX<number> {
66
private _dueTime: number;
7+
private _unref: boolean;
78

8-
constructor(dueTime: number) {
9+
constructor(dueTime: number, unref: boolean) {
910
super();
1011
this._dueTime = dueTime;
12+
this._unref = unref;
1113
}
1214

1315
async *[Symbol.asyncIterator](signal?: AbortSignal) {
1416
throwIfAborted(signal);
1517
let i = 0;
1618
while (1) {
17-
await sleep(this._dueTime, signal);
19+
await sleep(this._dueTime, signal, this._unref);
1820
yield i++;
1921
}
2022
}
@@ -24,8 +26,9 @@ class IntervalAsyncIterable extends AsyncIterableX<number> {
2426
* Produces a new item in an async-iterable at the given interval cycle time.
2527
*
2628
* @param {number} dueTime The due time in milliseconds to spawn a new item.
29+
* @param {boolean} [unref=false] Whether to unref the interval timer.
2730
* @returns {AsyncIterableX<number>} An async-iterable producing values at the specified interval.
2831
*/
29-
export function interval(dueTime: number): AsyncIterableX<number> {
30-
return new IntervalAsyncIterable(dueTime);
32+
export function interval(dueTime: number, unref = false): AsyncIterableX<number> {
33+
return new IntervalAsyncIterable(dueTime, unref);
3134
}

src/asynciterable/operators/buffercountortime.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class BufferCountOrTime<TSource> extends AsyncIterableX<TSource[]> {
1818

1919
async *[Symbol.asyncIterator](signal?: AbortSignal) {
2020
const buffer: TSource[] = [];
21-
const timer = interval(this.maxWaitTime).pipe(map(() => timerEvent));
21+
const timer = interval(this.maxWaitTime, true).pipe(map(() => timerEvent));
2222
const source = concat(this.source, of(ended));
2323
const merged = merge(source, timer);
2424

src/asynciterable/operators/timeout.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export class TimeoutAsyncIterable<TSource> extends AsyncIterableX<TSource> {
6060
it.next().then((val) => {
6161
return { type: VALUE_TYPE, value: val };
6262
}),
63-
sleep(this._dueTime, signal).then(() => {
63+
sleep(this._dueTime, signal, true).then(() => {
6464
return { type: ERROR_TYPE };
6565
}),
6666
]);

0 commit comments

Comments
 (0)