UNPKG

@modern-kit/utils

Version:
1 lines 5.98 kB
{"version":3,"file":"index.mjs","sources":["../../../src/common/retry/index.ts"],"sourcesContent":["import { isNumber } from '../../validator/isNumber';\nimport { delay as delayFn } from '../delay';\n\ninterface RetryOptions {\n count?: number;\n delay?: number;\n signal?: AbortSignal;\n}\n\nconst DEFAULT_RETRY = 3;\nconst DEFAULT_DELAY = 0;\n\nconst getRetryOptions = (options?: number | RetryOptions) => {\n if (isNumber(options)) {\n return { count: options, delay: DEFAULT_DELAY, signal: undefined };\n }\n\n return {\n count: options?.count ?? DEFAULT_RETRY,\n delay: options?.delay ?? DEFAULT_DELAY,\n signal: options?.signal,\n };\n};\n\n/**\n * @description Promise를 반환하는 함수가 실패 시 성공 할 때까지 최대 3회 재시도합니다.\n *\n * @template T - Promise가 반환하는 값의 타입입니다.\n * @param {() => Promise<T>} func - Promise를 반환하는 함수입니다.\n * @returns {Promise<T>} - Promise를 반환하는 함수의 결과를 반환합니다.\n *\n * @example\n * const data = await retry(fetchData);\n * // fetchData 함수가 실패할 경우 최대 3회 재시도합니다.\n */\nexport async function retry<T>(func: () => Promise<T>): Promise<T>;\n\n/**\n * @description Promise를 반환하는 함수가 실패 시 성공 할 때까지 주어진 횟수만큼 재시도합니다.\n *\n * @template T - Promise가 반환하는 값의 타입입니다.\n * @param {() => Promise<T>} func - Promise를 반환하는 함수입니다.\n * @param {number} count - 재시도 횟수입니다.\n * @returns {Promise<T>} - Promise를 반환하는 함수의 결과를 반환합니다.\n *\n * @example\n * const data = await retry(fetchData, 5);\n * // fetchData 함수가 실패할 경우 최대 5회 재시도합니다.\n */\nexport async function retry<T>(\n func: () => Promise<T>,\n count: number\n): Promise<T>;\n\n/**\n * @description Promise를 반환하는 함수가 실패 시 성공 할 때까지 주어진 횟수만큼 재시도합니다.\n *\n * 재시도 횟수와 재시도 사이 간격을 설정할 수 있습니다. AbortSignal을 전달하여 재시도 작업을 중단할 수 있습니다.\n *\n * @template T - Promise가 반환하는 값의 타입입니다.\n * @param {() => Promise<T>} func - Promise를 반환하는 함수입니다.\n * @param {RetryOptions} options - 재시도 횟수와 재시도 사이 간격을 설정하는 옵션 객체입니다.\n * @param {number} [options.delay=0] - 재시도 사이 간격을 설정합니다.\n * @param {number} [options.count=3] - 재시도 횟수를 설정합니다.\n * @param {AbortSignal} [options.signal] - 재시도 작업을 중단할 수 있는 AbortSignal을 설정합니다.\n * @returns {Promise<T>} - Promise를 반환하는 함수의 결과를 반환합니다.\n *\n * @example\n * const data = await retry(fetchData, { count: 5, delay: 1000 });\n * // fetchData 함수가 실패할 경우 1초 간격으로 최대 5회 재시도합니다.\n *\n * @example\n * const controller = new AbortController();\n *\n * const data = await retry(fetchData, { count: 5, controller.signal });\n * // controller.abort()가 호출되면 재시도 작업이 중단됩니다.\n */\nexport async function retry<T>(\n func: () => Promise<T>,\n options: RetryOptions\n): Promise<T>;\n\n/**\n * @description Promise를 반환하는 함수가 실패 시 성공 할 때까지 주어진 횟수만큼 재시도합니다.\n *\n * 재시도 횟수와 재시도 사이 간격을 설정할 수 있습니다. AbortSignal을 전달하여 재시도 작업을 중단할 수 있습니다.\n *\n * @template T - Promise가 반환하는 값의 타입입니다.\n * @param {() => Promise<T>} func - Promise를 반환하는 함수입니다.\n * @param {number | RetryOptions} options - 재시도 횟수와 재시도 사이 간격을 설정하는 옵션 객체입니다.\n * @returns {Promise<T>} - Promise를 반환하는 함수의 결과를 반환합니다.\n *\n * @example\n * const data = await retry(fetchData);\n * // fetchData 함수가 실패할 경우 최대 3회 재시도합니다.\n *\n * @example\n * const data = await retry(fetchData, 5);\n * // fetchData 함수가 실패할 경우 최대 5회 재시도합니다.\n *\n * @example\n * const data = await retry(fetchData, { count: 5, delay: 1000 });\n * // fetchData 함수가 실패할 경우 1초 간격으로 최대 5회 재시도합니다.\n *\n * @example\n * const data = await retry(fetchData, { count: 5, controller.signal });\n * // controller.abort()가 호출되면 재시도 작업이 중단됩니다.\n */\nexport async function retry<T>(\n func: () => Promise<T>,\n options?: number | RetryOptions\n): Promise<T> {\n const { count, delay, signal } = getRetryOptions(options);\n\n let error;\n\n for (let i = 0; i < count; i++) {\n if (signal?.aborted) {\n throw new Error('aborted로 인해 재시도 작업이 중단되었습니다.');\n }\n\n try {\n return await func();\n } catch (err) {\n error = err;\n await delayFn(delay);\n }\n }\n\n throw error;\n}\n"],"names":["delay","delayFn"],"mappings":";;;AASA,MAAM,aAAA,GAAgB,CAAA;AACtB,MAAM,aAAA,GAAgB,CAAA;AAEtB,MAAM,eAAA,GAAkB,CAAC,OAAA,KAAoC;AAC3D,EAAA,IAAI,QAAA,CAAS,OAAO,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,aAAA,EAAe,QAAQ,MAAA,EAAU;AAAA,EACnE;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,SAAS,KAAA,IAAS,aAAA;AAAA,IACzB,KAAA,EAAO,SAAS,KAAA,IAAS,aAAA;AAAA,IACzB,QAAQ,OAAA,EAAS;AAAA,GACnB;AACF,CAAA;AAsFA,eAAsB,KAAA,CACpB,MACA,OAAA,EACY;AACZ,EAAA,MAAM,EAAE,KAAA,SAAOA,OAAA,EAAO,MAAA,EAAO,GAAI,gBAAgB,OAAO,CAAA;AAExD,EAAA,IAAI,KAAA;AAEJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,IAAI,MAAM,8GAA8B,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,EAAK;AAAA,IACpB,SAAS,GAAA,EAAK;AACZ,MAAA,KAAA,GAAQ,GAAA;AACR,MAAA,MAAMC,MAAQD,OAAK,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,MAAM,KAAA;AACR;;;;"}