{"version":3,"file":"easy-poll.cjs","sources":["../src/utils/timers.ts","../src/easy-poll/core/state.ts","../src/utils/promises.ts","../src/utils/wait.ts","../src/easy-poll/core/abortables.ts","../src/utils/asserts.ts","../src/easy-poll/core/interval.ts","../src/easy-poll/core/validateOptions.ts","../src/easy-poll/core/consts.ts","../src/easy-poll/core/createPolling.ts","../src/easy-poll/doPolling.ts","../src/utils/subscribers.ts","../src/easy-poll/subscribePolling.ts"],"sourcesContent":["export const createTimer = (start?: number) => {\n  let startTime = start || Date.now();\n\n  return {\n    duration: () => Date.now() - startTime,\n    reset: () => (startTime = Date.now()),\n  };\n};\n","import { createTimer } from '../../utils/timers';\n\nexport function createPollState<T>() {\n  const timer = createTimer();\n\n  let data: T | null = null;\n  let attempt = 0;\n  let attemptsDuration: number[] = [];\n  let error = null;\n  let errorsCount = 0;\n  let initiatedAfter = 0;\n\n  const get = {\n    attempt: () => attempt,\n    errorsCount: () => errorsCount,\n\n    common: () => ({ attempt, attemptsDuration, errorsCount, duration: timer.duration() }),\n    success: () => ({ ...get.common(), data }),\n    catch: () => ({ ...get.common(), error }),\n    all: () => ({ ...get.common(), data, error }),\n  };\n\n  const on = {\n    start: () => {\n      initiatedAfter = timer.duration();\n      timer.reset();\n    },\n    newAttempt: () => {\n      attempt += 1;\n      attemptsDuration.push(timer.duration());\n    },\n    newData: (d: T) => {\n      on.newAttempt();\n      data = d;\n      error = null;\n    },\n    newCatch: (e: any) => {\n      on.newAttempt();\n      error = e;\n      data = null;\n      errorsCount += 1;\n    },\n    intervalCatch: (e: any) => {\n      error = e;\n    },\n  };\n\n  return { get, on };\n}\nexport type State<T> = ReturnType<ReturnType<typeof createPollState<T>>['get']['all']>;\nexport type StateSuccess<T> = ReturnType<ReturnType<typeof createPollState<T>>['get']['success']>;\nexport type StateCatch<T> = ReturnType<ReturnType<typeof createPollState<T>>['get']['catch']>;\n","export const abortablePromise = <T>(promise: Promise<T>, signal: AbortSignal): Promise<T> => {\n  return new Promise((resolve, reject) => {\n    if (signal.aborted) {\n      reject(signal.reason);\n      return;\n    }\n\n    const abortRejection = () => {\n      reject(signal.reason);\n    };\n\n    promise\n      .then(resolve)\n      .catch(reject)\n      .finally(() => {\n        signal.removeEventListener('abort', abortRejection);\n      });\n\n    signal.addEventListener('abort', abortRejection);\n  });\n};\n","import { abortablePromise } from './promises';\n\nexport const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\nexport const abortableWait = (ms: number, signal: AbortSignal) => {\n  return abortablePromise(wait(ms), signal);\n};\n","import { abortablePromise } from '../../utils/promises';\nimport { abortableWait } from '../../utils/wait';\n\ntype Fetcher<T> = ({ signal }: { signal: AbortSignal }) => Promise<T>;\nexport const createAbortabes = <T>(fetcher: Fetcher<T>) => {\n  const abortController = new AbortController();\n\n  const abort = () => {\n    abortController.abort();\n  };\n\n  const isAborted = () => abortController.signal.aborted;\n\n  const abortableFetcher = () => {\n    const promisifiedFetcher = async () => await fetcher({ signal: abortController.signal });\n    return abortablePromise(promisifiedFetcher(), abortController.signal);\n  };\n\n  const wait = (ms: number) => abortableWait(ms, abortController.signal);\n\n  return { abort, isAborted, fetcher: abortableFetcher, wait };\n};\n\nexport type Abortables = ReturnType<typeof createAbortabes>;\nexport type AbortablesFetcher<T> = ReturnType<typeof createAbortabes>['fetcher'];\nexport type AbortablesWait = ReturnType<typeof createAbortabes>['wait'];\nexport type AbortablesAbort = ReturnType<typeof createAbortabes>['abort'];\nexport type AbortablesIsAborted = ReturnType<typeof createAbortabes>['isAborted'];\n","export function assertNumber(value: any): asserts value is number {\n  if (typeof value !== 'number') {\n    throw new Error('value must be a number');\n  }\n}\n\nexport function assertIsPositiveNumber(value: unknown): asserts value is number {\n  assertNumber(value);\n\n  if (value < 0) {\n    throw new Error('value must be greater than or equal to 0');\n  }\n}\n","import { assertIsPositiveNumber, assertNumber } from '../../utils/asserts';\nimport { State } from './state';\n\ntype IntervalWithError = { error: any; newInterval: null };\ntype IntervalWithSuccess = { error: null; newInterval: number };\ntype IntervalFunction<T> = (props: State<T>) => unknown;\n\nexport const createIntervalHandler = <T>(\n  interval: IntervalFunction<T> | number\n): {\n  get: (state: State<T>) => IntervalWithSuccess | IntervalWithError;\n} => {\n  if (typeof interval === 'function') {\n    return createFunctionIntervalHandler(interval);\n  }\n\n  if (typeof interval === 'number') {\n    return createNumberIntervalHandler(interval);\n  }\n};\n\nconst createNumberIntervalHandler = (interval: number) => {\n  const get = () => ({\n    error: null,\n    newInterval: interval,\n  });\n\n  return { get };\n};\n\nconst createFunctionIntervalHandler = <T>(interval: IntervalFunction<T>) => {\n  const get = (state: State<T>) => {\n    try {\n      const newInterval = interval(state);\n      assertIsPositiveNumber(newInterval);\n\n      return { error: null, newInterval };\n    } catch (error) {\n      return { error, newInterval: null };\n    }\n  };\n\n  return { get };\n};\n","import { Options } from './createPolling';\n\nexport const validateOptions = <T>(o?: Options<T>) => {\n  if (o === undefined) {\n    return {};\n  }\n\n  if (o.maxErrors !== undefined && o.maxErrors < 0) {\n    throw new Error('maxErrors must be greater than or equal to 0');\n  }\n\n  if (o.maxPolls !== undefined && o.maxPolls < 0) {\n    throw new Error('maxPolls must be greater than or equal to 0');\n  }\n\n  if (o.interval !== undefined && typeof o.interval === 'number' && o.interval < 0) {\n    throw new Error('interval must be greater than or equal to 0');\n  }\n\n  if (o.interval !== undefined && typeof o.interval !== 'number' && typeof o.interval !== 'function') {\n    throw new Error('interval must be a function or a number');\n  }\n\n  if (o.until !== undefined && typeof o.until !== 'function') {\n    throw new Error('until must be a function');\n  }\n\n  if (o.breakIf !== undefined && typeof o.breakIf !== 'function') {\n    throw new Error('breakIf must be a function');\n  }\n\n  if (o.onBreak !== undefined && typeof o.onBreak !== 'function') {\n    throw new Error('onBreak must be a function');\n  }\n\n  if (o.onStart !== undefined && typeof o.onStart !== 'function') {\n    throw new Error('onStart must be a function');\n  }\n\n  if (o.onFinish !== undefined && typeof o.onFinish !== 'function') {\n    throw new Error('onFinish must be a function');\n  }\n\n  if (o.onComplete !== undefined && typeof o.onComplete !== 'function') {\n    throw new Error('onComplete must be a function');\n  }\n\n  if (o.onNext !== undefined && typeof o.onNext !== 'function') {\n    throw new Error('onNext must be a function');\n  }\n\n  if (o.onError !== undefined && typeof o.onError !== 'function') {\n    throw new Error('onError must be a function');\n  }\n\n  if (o.onErrorBreak !== undefined && typeof o.onErrorBreak !== 'function') {\n    throw new Error('onErrorBreak must be a function');\n  }\n\n  if (o.breakIfError !== undefined && typeof o.breakIfError !== 'function') {\n    throw new Error('breakIfError must be a function');\n  }\n\n  if (o.onTooManyAttempts !== undefined && typeof o.onTooManyAttempts !== 'function') {\n    throw new Error('onTooManyAttempts must be a function');\n  }\n\n  if (o.onTooManyErrors !== undefined && typeof o.onTooManyErrors !== 'function') {\n    throw new Error('onTooManyErrors must be a function');\n  }\n\n  if (o.onIntervalError !== undefined && typeof o.onIntervalError !== 'function') {\n    throw new Error('onIntervalError must be a function');\n  }\n\n  return o;\n};\n","export const POLLING_INTERVAL = 2000;\nexport const MAX_ERRORS = 5;\nexport const MAX_POLLS = Infinity;\n","import { createPollState, State, StateCatch, StateSuccess } from './state';\nimport { AbortablesAbort, createAbortabes } from './abortables';\nimport { createIntervalHandler } from './interval';\nimport { validateOptions } from './validateOptions';\nimport { MAX_ERRORS, MAX_POLLS, POLLING_INTERVAL } from './consts';\n\nexport type PollingSuccessContext<T> = StateSuccess<T>;\nexport type PollingErrorContext<T> = StateCatch<T>;\nexport type PollingContext<T> = State<T>;\n\nexport type ReactionsProps<T> = PollingSuccessContext<T> | PollingErrorContext<T> | PollingContext<T>;\n\nexport type Reactions<T> = {\n  onStart?: () => void;\n  onFinish?: (props: PollingContext<T>) => void;\n  onComplete?: (props: PollingSuccessContext<T>) => void;\n  onBreak?: (props: PollingSuccessContext<T>) => void;\n  onNext?: (props: PollingSuccessContext<T>) => void;\n  onTooManyAttempts?: (props: PollingSuccessContext<T>) => void;\n  onError?: (props: PollingErrorContext<T>) => void;\n  onErrorBreak?: (props: PollingErrorContext<T>) => void;\n  onTooManyErrors?: (props: PollingErrorContext<T>) => void;\n  onIntervalError?: (props: PollingContext<T>) => void;\n};\n\nexport type PureOptions<T> = {\n  maxErrors?: number;\n  maxPolls?: number;\n  interval?: ((props: PollingContext<T>) => number) | number;\n  until?: (props: PollingSuccessContext<T>) => boolean;\n  breakIf?: (props: PollingSuccessContext<T>) => boolean;\n  breakIfError?: (props: PollingErrorContext<T>) => boolean;\n};\n\nexport type Options<T> = PureOptions<T> & Reactions<T>;\nexport type Fetcher<T> = ({ signal }: { signal: AbortSignal }) => Promise<T>;\n\nexport function createPolling<T>(fetcher: Fetcher<T>, options?: Options<T>) {\n  const {\n    maxErrors = MAX_ERRORS,\n    maxPolls = MAX_POLLS,\n    interval = POLLING_INTERVAL,\n    until = () => true,\n    breakIf = () => false,\n    breakIfError = () => false,\n\n    onStart = () => {},\n    onBreak = () => {},\n    onComplete = () => {},\n    onNext = () => {},\n    onError = () => {},\n    onErrorBreak = () => {},\n    onTooManyAttempts = () => {},\n    onTooManyErrors = () => {},\n    onIntervalError = () => {},\n    onFinish = () => {},\n  } = validateOptions(options);\n\n  const state = createPollState<T>();\n  const abortables = createAbortabes(fetcher);\n\n  const intervalHandler = createIntervalHandler(interval);\n\n  const isTooMany = {\n    attempts: () => state.get.attempt() >= maxPolls,\n    errors: () => state.get.errorsCount() >= maxErrors,\n  };\n\n  const poll = async () => {\n    state.on.start();\n    onStart();\n\n    while (true) {\n      if (abortables.isAborted()) {\n        return state.get.all();\n      }\n\n      try {\n        const data = await abortables.fetcher();\n\n        state.on.newData(data);\n\n        if (breakIf(state.get.success())) {\n          onBreak(state.get.success());\n          break;\n        }\n\n        if (until(state.get.success())) {\n          onComplete(state.get.success());\n          break;\n        }\n\n        if (isTooMany.attempts()) {\n          onTooManyAttempts(state.get.success());\n          break;\n        }\n\n        const { error: intervalError, newInterval } = intervalHandler.get(state.get.all());\n        if (intervalError) {\n          state.on.intervalCatch(intervalError);\n          onIntervalError(state.get.all());\n          break;\n        }\n\n        onNext(state.get.success());\n\n        await abortables.wait(newInterval);\n      } catch (e) {\n        if (e.name === 'AbortError') {\n          return state.get.all();\n        }\n\n        state.on.newCatch(e);\n\n        onError(state.get.catch());\n\n        if (breakIfError(state.get.catch())) {\n          onErrorBreak(state.get.catch());\n          break;\n        }\n\n        if (isTooMany.errors()) {\n          onTooManyErrors(state.get.catch());\n          break;\n        }\n\n        const { error: intervalError, newInterval } = intervalHandler.get(state.get.all());\n        if (intervalError) {\n          state.on.intervalCatch(intervalError);\n          onIntervalError(state.get.all());\n          break;\n        }\n\n        await abortables.wait(newInterval);\n      }\n    }\n\n    onFinish(state.get.all());\n\n    return state.get.all();\n  };\n\n  const { init, abort } = createPollingHandlers<T>(poll, abortables.abort);\n\n  return { init, abort };\n}\n\nfunction createPollingHandlers<T>(poll: () => Promise<PollingContext<T>>, abort: AbortablesAbort) {\n  // this promise is going to be resolved only once and reused when handlers are called multiple times\n  let pollPromise: Promise<PollingContext<T>> | null = null;\n\n  const initPolling = async () => {\n    if (pollPromise) return pollPromise;\n\n    pollPromise = poll();\n    return pollPromise;\n  };\n\n  const abortPolling = async () => {\n    if (pollPromise) {\n      abort();\n    }\n\n    return pollPromise;\n  };\n\n  return { init: initPolling, abort: abortPolling };\n}\n","import { Fetcher, Options } from './core/createPolling';\nimport { createPolling } from './core/createPolling';\n\n/**\n * @description\n * this function allows you to do polling with retries and errors count.\n * It is useful when you want to keep going with the request until you get the result you want or until you reach the max retries or max errors count.\n * @example\n * const { init, abort } = await doPolling(fetchStuff,\n *   {\n *     // max retries count. If maxPolls is reached, onTooManyAttempts will be called\n *     maxPolls: 10, // default is Infinity\n *     // max errors count. If maxErrors is reached, onTooManyErrors will be called\n *     maxErrors: 5, // default is 5\n *     // interval between retries. Can be a number or function that is called on every poll\n *     interval: 1000, // default is 2000\n *     // polling will be stopped if condition is true. If condition is not provided, polling will be stopped after one successful request\n *     until: ({ data }) => data.status === 'SUCCESS', // default is () => true\n *     // onStart will be called before polling\n *     onStart: () => {},\n *     // onNext will be called after each successful poll, except the last one\n *     onNext: ({ data, attempt, errorsCount }) => {},\n *     // onComplete will be called after polling is completed\n *     onComplete: ({ data, attempt, errorsCount }) => {},\n *     // onFinish will be called after polling is finished with whichever result\n *     onFinish: ({ data, attempt, errorsCount }) => {},\n *     // onError will be called after each failed poll\n *     onError: ({ retry, errorsCount, error }) => {},\n *     // onTooManyAttempts will be called if maxPolls is reached.\n *     onTooManyAttempts: () => {},\n *     // onTooManyErrors will be called if maxErrors is reached.\n *     onTooManyErrors: ({ retry, errorsCount, error }) => {},\n *     // onIntervalError will be called if the interval function throws an error\n *     onIntervalError({ data, error, attempt, attemptsDuration, errorsCount, duration }) => {}\n *     // polling will be stopped if breakIf is true. This is useful when you want to stop polling if you know that you will never get the result you want.\n *     breakIf: ({ data }) => data.received !== total,\n *     // onBreak will be called if breakIf is true\n *     onBreak: ({ data, attempt, errorsCount }) => {},\n *     // breakIfError acts the same as breakIf, but for errors. It is useful when you want to stop polling if you receive a specific error type.\n *     breakIfError: ({ error }) => error.code === 404,\n *     // onBreakError will be called if breakIfError is true\n *     onBreakError: ({ error, attempt, errorsCount }) => {},\n *   }\n * );\n *\n * // now simple call init to start polling\n * init().then(({ error, data }: {data: T}) => {\n *   // do something with the result\n * });\n *\n * // you can also abort the polling from the outside\n * addEventListener('click', abort);\n * @throws if maxErrors is less than 0\n * @throws if interval is less than 0 or not a function\n * @throws if passed callbacks are not functions\n */\nexport function doPolling<T>(fetcher: Fetcher<T>, options?: Options<T>) {\n  const { init, abort } = createPolling<T>(fetcher, options);\n  return { init: () => init(), abort: () => abort() };\n}\n","export function createSubscribers<P>() {\n  const subscribers: Record<string, (props?: P) => void> = {};\n\n  let counter = 0;\n  const subscribe = (callback: (props: P) => void, key?: string) => {\n    const resultKey = key || counter++;\n    subscribers[resultKey] = callback;\n\n    return {\n      unsubscribe: () => {\n        delete subscribers[resultKey];\n      },\n    };\n  };\n\n  const notify = (props: P) => {\n    Object.values(subscribers).forEach(cb => cb(props));\n  };\n  return { notify, subscribe };\n}\n","import { Fetcher, PureOptions, Reactions } from './core/createPolling';\nimport { createPolling } from './core/createPolling';\nimport { createSubscribers } from '../utils/subscribers';\nimport { ReactionsProps } from './core/createPolling';\nimport { validateOptions } from './core/validateOptions';\n\n/**\n * @description\n * this function allows you to subscribe to the polling with retries and errors count.\n * It is useful when you want to keep going with the request until you get the result you want or until you reach the max retries or max errors count.\n * @example\n * // someService.ts\n * import { subscribePolling } from '@ilyagershman/easy-poll';\n *\n * export const { subscribe, init, abort } = subscribePolling(fetchStuff, {\n *   // max retries count. If maxPolls is reached, onTooManyAttempts will be called\n *   maxPolls: 10,\n *   // max errors count. If maxErrors is reached, onTooManyErrors will be called\n *   maxErrors: 5,\n *   // interval between retries. Can be a number or function that is called on every poll\n *   interval: () => getRandomInt(10000),\n *   // polling will be stopped if the condition is true. If the condition is not provided,\n *   // polling will be stopped after one successful request\n *   until: ({ data }) => data.status === 'SUCCESS',\n *   // polling will be stopped if breakIf is true.\n *   // This is useful when you want to stop polling if you know that you will never get the result you want.\n *   breakIf: ({ data }) => data.received !== total,\n *   // breakIfError acts the same as breakIf, but for errors. It is useful when you want to stop polling if you receive a specific error type.\n *   breakIfError: ({ error }) => error.code === 404,\n * });\n *\n * /// somewhere.ts in your code react on the polling events.\n * import { subscribe, init } from './somewhere';\n * import { EVENTS } from '@ilyagershman/easy-poll';\n *\n * init().then({ data, error } => {\n *   // same as doPolling\n * }));\n *\n * subscribe(props => {\n *   if (props.event === EVENTS.ON_COMPLETE) onComplete(props);\n *   if (props.event === EVENTS.ON_BREAK) onBreak(props);\n *   if (props.event === EVENTS.ON_NEXT) onNext(props);\n *   if (props.event === EVENTS.ON_ERROR) onError(props);\n *   if (props.event === EVENTS.ON_FINISH) onFinish(props);\n *   if (props.event === EVENTS.ON_TOOMANYERRORS) onTooManyErrors(props);\n *   if (props.event === EVENTS.ON_TOOMANYATTEMPTS) onTooManyAttempts(props);\n *   // ...\n * });\n *\n * /// somewhereElse.ts in your code react on the polling events.\n * import { abort } from './somewhere';\n *\n * // this will abort the polling after some time\n * setTimeout(abort, 4200);\n */\nexport function subscribePolling<T>(fetcher: Fetcher<T>, pureOptions?: PureOptions<T>) {\n  const { notify, subscribe } = createSubscribers<{ event: keyof typeof EVENTS; props?: ReactionsProps<T> }>();\n\n  const subscribtionOptions: Reactions<T> = {\n    onStart: () => {\n      notify({ event: EVENTS.ON_START });\n    },\n    onFinish: props => {\n      notify({ event: EVENTS.ON_FINISH, props });\n    },\n    onComplete: props => {\n      notify({ event: EVENTS.ON_COMPLETE, props });\n    },\n    onNext: props => {\n      notify({ event: EVENTS.ON_NEXT, props });\n    },\n    onError: props => {\n      notify({ event: EVENTS.ON_ERROR, props });\n    },\n    onTooManyAttempts: props => {\n      notify({ event: EVENTS.ON_TOOMANYATTEMPTS, props });\n    },\n    onBreak: props => {\n      notify({ event: EVENTS.ON_BREAK, props });\n    },\n    onErrorBreak: props => {\n      notify({ event: EVENTS.ON_ERRORBREAK, props });\n    },\n    onTooManyErrors: props => {\n      notify({ event: EVENTS.ON_TOOMANYERRORS, props });\n    },\n    onIntervalError: props => {\n      notify({ event: EVENTS.ON_INTERVALERROR, props });\n    },\n  };\n\n  const options = validateOptions({ ...pureOptions, ...subscribtionOptions });\n\n  const { init, abort } = createPolling<T>(fetcher, options);\n\n  return { subscribe, init: () => init(), abort: () => abort() };\n}\n\nexport const EVENTS = {\n  ON_START: 'ON_START',\n  ON_BREAK: 'ON_BREAK',\n  ON_FINISH: 'ON_FINISH',\n  ON_COMPLETE: 'ON_COMPLETE',\n  ON_NEXT: 'ON_NEXT',\n  ON_TOOMANYATTEMPTS: 'ON_TOOMANYATTEMPTS',\n  ON_ERROR: 'ON_ERROR',\n  ON_ERRORBREAK: 'ON_ERRORBREAK',\n  ON_TOOMANYERRORS: 'ON_TOOMANYERRORS',\n  ON_INTERVALERROR: 'ON_INTERVALERROR',\n} as const;\n"],"names":[],"mappings":"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"}