UNPKG

abort-utils

Version:

Utility functions to use and combine `AbortSignal` and `AbortController` with Promises

26 lines (25 loc) 982 B
function getSignal(controller) { return controller instanceof AbortController ? controller.signal : controller; } /** * Link multiple controllers so that when one aborts, they all abort with the same reason. * @param controllers The controllers to link. */ export function linkControllers(...controllers) { const alreadyAborted = controllers.find(controller => getSignal(controller).aborted); const onAbort = ({ target }) => { for (const controller of controllers) { if (controller instanceof AbortController) { controller.abort(target instanceof AbortSignal ? target.reason : undefined); } } }; for (const controller of controllers) { if (!alreadyAborted) { getSignal(controller).addEventListener('abort', onAbort, { once: true }); } else if (controller instanceof AbortController) { controller.abort(getSignal(alreadyAborted).reason); } } }