{"version":3,"file":"interruption.cjs","names":[],"sources":["../src/interruption.ts"],"sourcesContent":["import type { Fixture } from \"./types.js\";\n\nexport interface InterruptionControl {\n  signal: AbortSignal;\n  tick(): void;\n  cleanup(): void;\n  reason(): string | undefined;\n}\n\nexport function createInterruptionSignal(fixture: Fixture): InterruptionControl | null {\n  const { truncateAfterChunks, disconnectAfterMs } = fixture;\n\n  if (truncateAfterChunks === undefined && disconnectAfterMs === undefined) {\n    return null;\n  }\n\n  const controller = new AbortController();\n  let abortReason: string | undefined;\n  let chunkCount = 0;\n  let timer: ReturnType<typeof setTimeout> | undefined;\n\n  if (disconnectAfterMs !== undefined) {\n    timer = setTimeout(() => {\n      if (!controller.signal.aborted) {\n        abortReason = \"disconnectAfterMs\";\n        controller.abort();\n      }\n    }, disconnectAfterMs);\n  }\n\n  return {\n    signal: controller.signal,\n\n    tick() {\n      if (controller.signal.aborted) return;\n      chunkCount++;\n      if (truncateAfterChunks !== undefined && chunkCount >= truncateAfterChunks) {\n        abortReason = \"truncateAfterChunks\";\n        controller.abort();\n      }\n    },\n\n    cleanup() {\n      if (timer !== undefined) {\n        clearTimeout(timer);\n        timer = undefined;\n      }\n    },\n\n    reason() {\n      return abortReason;\n    },\n  };\n}\n"],"mappings":";;AASA,SAAgB,yBAAyB,SAA8C;CACrF,MAAM,EAAE,qBAAqB,sBAAsB;AAEnD,KAAI,wBAAwB,UAAa,sBAAsB,OAC7D,QAAO;CAGT,MAAM,aAAa,IAAI,iBAAiB;CACxC,IAAI;CACJ,IAAI,aAAa;CACjB,IAAI;AAEJ,KAAI,sBAAsB,OACxB,SAAQ,iBAAiB;AACvB,MAAI,CAAC,WAAW,OAAO,SAAS;AAC9B,iBAAc;AACd,cAAW,OAAO;;IAEnB,kBAAkB;AAGvB,QAAO;EACL,QAAQ,WAAW;EAEnB,OAAO;AACL,OAAI,WAAW,OAAO,QAAS;AAC/B;AACA,OAAI,wBAAwB,UAAa,cAAc,qBAAqB;AAC1E,kBAAc;AACd,eAAW,OAAO;;;EAItB,UAAU;AACR,OAAI,UAAU,QAAW;AACvB,iBAAa,MAAM;AACnB,YAAQ;;;EAIZ,SAAS;AACP,UAAO;;EAEV"}