2019-02-01 16:32:34 +01:00
|
|
|
'use strict'
|
|
|
|
|
2019-12-03 10:28:52 +01:00
|
|
|
const AbortController = require('abort-controller')
|
|
|
|
|
2019-11-07 12:11:50 +01:00
|
|
|
/**
|
|
|
|
* Converts BufferList messages to Buffers
|
|
|
|
* @param {*} source
|
|
|
|
* @returns {AsyncGenerator}
|
|
|
|
*/
|
|
|
|
function toBuffer (source) {
|
|
|
|
return (async function * () {
|
|
|
|
for await (const chunk of source) {
|
|
|
|
yield Buffer.isBuffer(chunk) ? chunk : chunk.slice()
|
|
|
|
}
|
|
|
|
})()
|
|
|
|
}
|
|
|
|
|
2019-12-03 10:28:52 +01:00
|
|
|
/**
|
|
|
|
* Takes an array of AbortSignals and returns a single signal.
|
|
|
|
* If any signals are aborted, the returned signal will be aborted.
|
|
|
|
* @param {Array<AbortSignal>} signals
|
|
|
|
* @returns {AbortSignal}
|
|
|
|
*/
|
|
|
|
function anySignal (signals) {
|
|
|
|
const controller = new AbortController()
|
|
|
|
|
|
|
|
function onAbort () {
|
|
|
|
controller.abort()
|
|
|
|
|
|
|
|
// Cleanup
|
|
|
|
for (const signal of signals) {
|
|
|
|
signal.removeEventListener('abort', onAbort)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const signal of signals) {
|
|
|
|
if (signal.aborted) {
|
|
|
|
onAbort()
|
|
|
|
break
|
|
|
|
}
|
|
|
|
signal.addEventListener('abort', onAbort)
|
|
|
|
}
|
|
|
|
|
|
|
|
return controller.signal
|
|
|
|
}
|
|
|
|
|
2019-11-07 12:11:50 +01:00
|
|
|
module.exports.toBuffer = toBuffer
|
2019-12-03 10:28:52 +01:00
|
|
|
module.exports.anySignal = anySignal
|