{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import { _getAbortReason, _isAbortSignal } from \"../_abort/index.ts\";\n\nexport type TAbortSignalControls = {\n  abort: (reason?: unknown) => void;\n  dispose: () => void;\n  signal: AbortSignal;\n};\n\nexport type TGetAbortSignalOptions = {\n  signals?: readonly (AbortSignal | null | undefined)[];\n  timeout?: number;\n};\n\nexport type TGetAbortSignalArgs = Parameters<typeof getAbortSignal>;\n\nexport type TGetAbortSignalReturn = ReturnType<typeof getAbortSignal>;\n\n/**\n * Creates a disposable abort signal that can combine external signals with a timeout.\n * The returned controller can also abort the operation manually.\n * @param {TGetAbortSignalOptions} [options={}] External signals and optional timeout\n * @returns {TAbortSignalControls} Abort signal and lifecycle controls\n * @throws {TypeError} getAbortSignal: options are invalid\n * @example\n * const request = getAbortSignal({ timeout: 5_000 });\n * await fetch(\"/api/products\", { signal: request.signal }).finally(request.dispose);\n * @example\n * // Combine component cleanup with a request timeout\n * const component = new AbortController();\n * const request = getAbortSignal({ signals: [ component.signal ], timeout: 2_000 });\n * component.abort();\n */\nexport const getAbortSignal = (\n  options: TGetAbortSignalOptions = {}\n): TAbortSignalControls => {\n  if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n    throw new TypeError(\"getAbortSignal: options must be a plain object\");\n  }\n  const { signals = [], timeout } = options;\n  if (!Array.isArray(signals)) {\n    throw new TypeError(\"getAbortSignal: signals must be an array\");\n  }\n  if (signals.some((signal) => signal !== null && signal !== undefined && !_isAbortSignal(signal))) {\n    throw new TypeError(\"getAbortSignal: signals must contain AbortSignal values\");\n  }\n  if (timeout !== undefined && (\n    typeof timeout !== \"number\"\n    || !Number.isFinite(timeout)\n    || timeout < 0\n  )) {\n    throw new TypeError(\"getAbortSignal: timeout must be a non-negative finite number\");\n  }\n\n  const controller = new AbortController();\n  const listeners: Array<{\n    handler: () => void;\n    signal: AbortSignal;\n  }> = [];\n  let timer: ReturnType<typeof setTimeout> | null = null;\n\n  const dispose = (): void => {\n    if (timer !== null) {\n      clearTimeout(timer);\n      timer = null;\n    }\n    listeners.splice(0).forEach(({ handler, signal }) => {\n      signal.removeEventListener(\"abort\", handler);\n    });\n  };\n  const abort = (reason?: unknown): void => {\n    if (!controller.signal.aborted) {\n      if (reason === undefined) {\n        controller.abort();\n      } else {\n        controller.abort(reason);\n      }\n    }\n    dispose();\n  };\n\n  for (const signal of signals) {\n    if (signal === null || signal === undefined) {\n      continue;\n    }\n    if (signal.aborted) {\n      abort(_getAbortReason(signal));\n      break;\n    }\n    const handler = (): void => abort(_getAbortReason(signal));\n    listeners.push({ handler, signal });\n    signal.addEventListener(\"abort\", handler, { once: true });\n  }\n\n  if (!controller.signal.aborted && timeout !== undefined) {\n    timer = setTimeout(() => {\n      abort(new DOMException(\"The operation timed out\", \"TimeoutError\"));\n    }, timeout);\n  }\n\n  return { abort, dispose, signal: controller.signal };\n};\n"],"names":["getAbortSignal","options","Array","isArray","TypeError","signals","timeout","some","signal","undefined","_isAbortSignal","Number","isFinite","controller","AbortController","listeners","timer","dispose","clearTimeout","splice","forEach","handler","removeEventListener","abort","reason","aborted","_getAbortReason","push","addEventListener","once","setTimeout","DOMException"],"mappings":"gEAgCO,MAAMA,eAAiB,CAC5BC,QAAkC,MAElC,IAAKA,gBAAkBA,UAAY,UAAYC,MAAMC,QAAQF,SAC3D,MAAM,IAAIG,UAAU,kDAEtB,MAAMC,QAAEA,QAAU,GAAEC,QAAEA,SAAYL,QAClC,IAAKC,MAAMC,QAAQE,SACjB,MAAM,IAAID,UAAU,4CAEtB,GAAIC,QAAQE,KAAMC,QAAWA,SAAW,MAAQA,cAAWC,IAAcC,eAAeF,SACtF,MAAM,IAAIJ,UAAU,2DAEtB,GAAIE,eAAYG,WACPH,UAAY,WACfK,OAAOC,SAASN,UACjBA,QAAU,GAEb,MAAM,IAAIF,UAAU,gEAGtB,MAAMS,WAAa,IAAIC,gBACvB,MAAMC,UAGD,GACL,IAAIC,MAA8C,KAElD,MAAMC,QAAU,KACd,GAAID,QAAU,KAAM,CAClBE,aAAaF,OACbA,MAAQ,IACV,CACAD,UAAUI,OAAO,GAAGC,QAAQ,EAAGC,gBAASb,kBACtCA,OAAOc,oBAAoB,QAASD,YAGxC,MAAME,MAASC,SACb,IAAKX,WAAWL,OAAOiB,QACrB,GAAID,cAAWf,EACbI,WAAWU,aAEXV,WAAWU,MAAMC,QAGrBP,WAGF,IAAK,MAAMT,UAAUH,QAAS,CAC5B,GAAIG,SAAW,MAAQA,cAAWC,EAChC,SAEF,GAAID,OAAOiB,QAAS,CAClBF,MAAMG,gBAAgBlB,SACtB,KACF,CACA,MAAMa,QAAU,IAAYE,MAAMG,gBAAgBlB,SAClDO,UAAUY,KAAK,CAAEN,gBAASb,gBAC1BA,OAAOoB,iBAAiB,QAASP,QAAS,CAAEQ,KAAM,MACpD,CAEA,IAAKhB,WAAWL,OAAOiB,SAAWnB,eAAYG,EAC5CO,MAAQc,WAAW,KACjBP,MAAM,IAAIQ,aAAa,0BAA2B,kBACjDzB,SAGL,MAAO,CAAEiB,YAAON,gBAAST,OAAQK,WAAWL"}