{"version":3,"sources":["../../src/polling.ts"],"sourcesContent":["import { TransportError } from \"./errors.js\";\n\nexport interface PollingOptions {\n  delayMs: number;\n  maxIterations: number;\n  requestTimeoutMs: number;\n  backgroundVisibilityCheckIntervalMs: number;\n  backgroundVisibilityCheckTimeoutMs: number;\n  requestCallTimeoutMs: number;\n}\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\nconst waitUntilVisible = async (checkIntervalMs: number, timeoutMs: number): Promise<void> => {\n  if (typeof document === \"undefined\") return;\n  if (!document.hidden) return;\n\n  const start = Date.now();\n  while (document.hidden) {\n    if (Date.now() - start >= timeoutMs) {\n      throw new TransportError(\"VISIBILITY_TIMEOUT\", \"Browser tab stayed hidden for too long while polling\");\n    }\n    await sleep(checkIntervalMs);\n  }\n};\n\nconst withTimeout = async <T>(promise: Promise<T>, timeoutMs: number, timeoutCode: string): Promise<T> => {\n  let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n  try {\n    return await Promise.race([\n      promise,\n      new Promise<T>((_, reject) => {\n        timeoutId = setTimeout(() => {\n          reject(new TransportError(timeoutCode, `Operation timed out after ${timeoutMs}ms`));\n        }, timeoutMs);\n      }),\n    ]);\n  } finally {\n    if (timeoutId != null) clearTimeout(timeoutId);\n  }\n};\n\nexport const visibilityAwarePoll = async <T>(\n  fn: () => Promise<T>,\n  isPending: (value: T) => boolean,\n  options: PollingOptions,\n): Promise<T> => {\n  const start = Date.now();\n  let iteration = 0;\n  let delay = options.delayMs;\n\n  while (true) {\n    if (Date.now() - start > options.requestTimeoutMs) {\n      throw new TransportError(\"POLLING_TIMEOUT\", \"Polling timed out\");\n    }\n\n    await waitUntilVisible(options.backgroundVisibilityCheckIntervalMs, options.backgroundVisibilityCheckTimeoutMs);\n\n    const value = await withTimeout(fn(), options.requestCallTimeoutMs, \"POLLING_REQUEST_TIMEOUT\");\n    if (!isPending(value)) return value;\n\n    if (iteration >= options.maxIterations) {\n      throw new TransportError(\"POLLING_MAX_ITERATIONS\", \"Polling reached the maximum number of iterations\");\n    }\n\n    await sleep(delay);\n    delay = Math.min(5_000, Math.ceil(delay * 1.15));\n    iteration += 1;\n  }\n};\n\nexport const defaultPollingOptions: PollingOptions = {\n  delayMs: 1000,\n  maxIterations: 1000,\n  requestTimeoutMs: 10 * 60 * 1000,\n  backgroundVisibilityCheckIntervalMs: 1000,\n  backgroundVisibilityCheckTimeoutMs: 10 * 60 * 1000,\n  requestCallTimeoutMs: 30_000,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+B;AAW/B,MAAM,QAAQ,wBAAC,OAAe,IAAI,QAAc,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC,GAAtE;AAEd,MAAM,mBAAmB,8BAAO,iBAAyB,cAAqC;AAC5F,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,CAAC,SAAS,OAAQ;AAEtB,QAAM,QAAQ,KAAK,IAAI;AACvB,SAAO,SAAS,QAAQ;AACtB,QAAI,KAAK,IAAI,IAAI,SAAS,WAAW;AACnC,YAAM,IAAI,6BAAe,sBAAsB,sDAAsD;AAAA,IACvG;AACA,UAAM,MAAM,eAAe;AAAA,EAC7B;AACF,GAXyB;AAazB,MAAM,cAAc,8BAAU,SAAqB,WAAmB,gBAAoC;AACxG,MAAI;AAEJ,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK;AAAA,MACxB;AAAA,MACA,IAAI,QAAW,CAAC,GAAG,WAAW;AAC5B,oBAAY,WAAW,MAAM;AAC3B,iBAAO,IAAI,6BAAe,aAAa,6BAA6B,SAAS,IAAI,CAAC;AAAA,QACpF,GAAG,SAAS;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH,UAAE;AACA,QAAI,aAAa,KAAM,cAAa,SAAS;AAAA,EAC/C;AACF,GAfoB;AAiBb,MAAM,sBAAsB,8BACjC,IACA,WACA,YACe;AACf,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,YAAY;AAChB,MAAI,QAAQ,QAAQ;AAEpB,SAAO,MAAM;AACX,QAAI,KAAK,IAAI,IAAI,QAAQ,QAAQ,kBAAkB;AACjD,YAAM,IAAI,6BAAe,mBAAmB,mBAAmB;AAAA,IACjE;AAEA,UAAM,iBAAiB,QAAQ,qCAAqC,QAAQ,kCAAkC;AAE9G,UAAM,QAAQ,MAAM,YAAY,GAAG,GAAG,QAAQ,sBAAsB,yBAAyB;AAC7F,QAAI,CAAC,UAAU,KAAK,EAAG,QAAO;AAE9B,QAAI,aAAa,QAAQ,eAAe;AACtC,YAAM,IAAI,6BAAe,0BAA0B,kDAAkD;AAAA,IACvG;AAEA,UAAM,MAAM,KAAK;AACjB,YAAQ,KAAK,IAAI,KAAO,KAAK,KAAK,QAAQ,IAAI,CAAC;AAC/C,iBAAa;AAAA,EACf;AACF,GA3BmC;AA6B5B,MAAM,wBAAwC;AAAA,EACnD,SAAS;AAAA,EACT,eAAe;AAAA,EACf,kBAAkB,KAAK,KAAK;AAAA,EAC5B,qCAAqC;AAAA,EACrC,oCAAoC,KAAK,KAAK;AAAA,EAC9C,sBAAsB;AACxB;","names":[]}