abortable-iterator

Make any iterator or iterable abortable via an AbortSignal
The AbortController is used in the fetch API to abort in flight requests from, for example, a timeout or user action. The same concept is used here to halt iteration of an async iterator.
Install
npm install abortable-iterator
Usage
import { abortableSource } from 'abortable-iterator'
const asyncCounter = async function * (start, delay) {
let i = start
while (true) {
yield new Promise(resolve => setTimeout(() => resolve(i++), delay))
}
}
const everySecond = asyncCounter(0, 1000)
const controller = new AbortController()
const abortableEverySecond = abortableSource(everySecond, controller.signal)
setTimeout(() => controller.abort(), 5000)
try {
for await (const n of abortableEverySecond) {
console.log(n)
}
} catch (err) {
if (err.code === 'ERR_ABORTED') {
} else {
throw err
}
}
API
import {
abortableSource,
abortableSink,
abortableTransform,
abortableDuplex
} from 'abortable-iterator'
abortableSource(source, signal, [options])
(alias for abortable.source(source, signal, [options]))
Make any iterator or iterable abortable via an AbortSignal.
Parameters
| source | Iterable|Iterator | The iterator or iterable object to make abortable |
| signal | AbortSignal | Signal obtained from AbortController.signal which is used to abort the iterator. |
| options | Object | (optional) options |
| options.onAbort | Function | An (async) function called when the iterator is being aborted, before the abort error is thrown. Default null |
| options.abortMessage | String | The message that the error will have if the iterator is aborted. Default "The operation was aborted" |
| options.abortCode | String|Number | The value assigned to the code property of the error that is thrown if the iterator is aborted. Default "ABORT_ERR" |
| options.returnOnAbort | Boolean | Instead of throwing the abort error, just return from iterating over the source stream. |
| options.onReturnError | Function | When a generator is aborted, we call .return on it - if this function errors the error value will be passed to the .onReturnError callback if passed. Default null |
Returns
Iterable | An iterator that wraps the passed source parameter that makes it abortable via the passed signal parameter. |
The returned iterator will throw an AbortError when it is aborted that has a type with the value aborted and code property with the value ABORT_ERR by default.
abortableSink(sink, signal, [options])
The same as abortable.source except this makes the passed sink abortable. Returns a new sink that wraps the passed sink and makes it abortable via the passed signal parameter.
abortableTransform(transform, signal, [options])
The same as abortable.source except this makes the passed transform abortable. Returns a new transform that wraps the passed transform and makes it abortable via the passed signal parameter.
abortableDuplex(duplex, signal, [options])
The same as abortable.source except this makes the passed duplex abortable. Returns a new duplex that wraps the passed duplex and makes it abortable via the passed signal parameter.
Note that this will abort both sides of the duplex. Use duplex.sink = abortable.sink(duplex.sink) or duplex.source = abortable.source(duplex.source) to abort just the sink or the source.
Related
it-pipe Utility to "pipe" async iterables together
Contribute
Feel free to dive in! Open an issue or submit PRs.
License
MIT © Alan Shaw