abort-controller-multiplexer
Version:
Combine multiple AbortControllers or AbortSignals into a single instance
40 lines (39 loc) • 1.22 kB
JavaScript
export function combineSignals(...signals) {
let sharedOnAbort = null;
return {
get aborted() {
return signals.some(signal => signal.aborted);
},
get reason() {
return signals.find(signal => !!signal.reason)?.reason;
},
get onabort() {
return sharedOnAbort;
},
set onabort(onAbort) {
sharedOnAbort = onAbort;
for (const signal of signals) {
signal.onabort = sharedOnAbort;
}
},
// Methods:
addEventListener: (type, callback, options) => {
for (const signal of signals) {
signal.addEventListener(type, callback, options);
}
},
dispatchEvent: (event) => {
return signals.some(signal => signal.dispatchEvent(event));
},
removeEventListener: (type, callback, options) => {
for (const signal of signals) {
signal.removeEventListener(type, callback, options);
}
},
throwIfAborted: () => {
for (const signal of signals) {
signal.throwIfAborted();
}
}
};
}