UNPKG

contentful-sdk-core

Version:
1 lines 5.15 kB
{"version":3,"file":"rate-limit-throttle.js","sources":["../../src/rate-limit-throttle.ts"],"sourcesContent":["import isString from 'lodash/isString.js'\nimport pThrottle from './pThrottle.js'\n\nimport { AxiosInstance } from './types.js'\nimport { noop } from './utils.js'\n\ntype ThrottleType = 'auto' | string\n\nconst PERCENTAGE_REGEX = /(?<value>\\d+)(%)/\n\nfunction calculateLimit(type: ThrottleType, max = 7) {\n let limit = max\n\n if (PERCENTAGE_REGEX.test(type)) {\n const groups = type.match(PERCENTAGE_REGEX)?.groups\n if (groups && groups.value) {\n const percentage = parseInt(groups.value) / 100\n limit = Math.round(max * percentage)\n }\n }\n return Math.min(30, Math.max(1, limit))\n}\n\nfunction createThrottle(limit: number, logger: (...args: any[]) => void) {\n logger('info', `Throttle request to ${limit}/s`)\n return pThrottle({\n limit,\n interval: 1000,\n strict: false,\n })\n}\n\nexport default (axiosInstance: AxiosInstance, type: ThrottleType | number = 'auto') => {\n const { logHandler = noop } = axiosInstance.defaults\n let limit = isString(type) ? calculateLimit(type) : calculateLimit('auto', type)\n let throttle = createThrottle(limit, logHandler)\n let isCalculated = false\n\n let requestInterceptorId = axiosInstance.interceptors.request.use(\n (config) => {\n return throttle(() => config)()\n },\n function (error) {\n return Promise.reject(error)\n },\n )\n\n const responseInterceptorId = axiosInstance.interceptors.response.use(\n (response) => {\n if (\n !isCalculated &&\n isString(type) &&\n (type === 'auto' || PERCENTAGE_REGEX.test(type)) &&\n response.headers &&\n response.headers['x-contentful-ratelimit-second-limit']\n ) {\n const rawLimit = parseInt(response.headers['x-contentful-ratelimit-second-limit'])\n const nextLimit = calculateLimit(type, rawLimit)\n\n if (nextLimit !== limit) {\n if (requestInterceptorId) {\n axiosInstance.interceptors.request.eject(requestInterceptorId)\n }\n\n limit = nextLimit\n\n throttle = createThrottle(nextLimit, logHandler)\n requestInterceptorId = axiosInstance.interceptors.request.use(\n (config) => {\n return throttle(() => config)()\n },\n function (error) {\n return Promise.reject(error)\n },\n )\n }\n\n isCalculated = true\n }\n\n return response\n },\n function (error) {\n return Promise.reject(error)\n },\n )\n\n return () => {\n axiosInstance.interceptors.request.eject(requestInterceptorId)\n axiosInstance.interceptors.response.eject(responseInterceptorId)\n }\n}\n"],"names":[],"mappings":";;;;AAQA,MAAM,gBAAgB,GAAG,kBAAkB;AAE3C,SAAS,cAAc,CAAC,IAAkB,EAAE,GAAG,GAAG,CAAC,EAAA;IACjD,IAAI,KAAK,GAAG,GAAG;AAEf,IAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,MAAM;AACnD,QAAA,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE;YAC1B,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG;YAC/C,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC;QACtC;IACF;AACA,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACzC;AAEA,SAAS,cAAc,CAAC,KAAa,EAAE,MAAgC,EAAA;AACrE,IAAA,MAAM,CAAC,MAAM,EAAE,uBAAuB,KAAK,CAAA,EAAA,CAAI,CAAC;AAChD,IAAA,OAAO,SAAS,CAAC;QACf,KAAK;AACL,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,MAAM,EAAE,KAAK;AACd,KAAA,CAAC;AACJ;AAEA,wBAAe,CAAC,aAA4B,EAAE,IAAA,GAA8B,MAAM,KAAI;IACpF,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,aAAa,CAAC,QAAQ;IACpD,IAAI,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC;IAChF,IAAI,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC;IAChD,IAAI,YAAY,GAAG,KAAK;AAExB,IAAA,IAAI,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAC/D,CAAC,MAAM,KAAI;QACT,OAAO,QAAQ,CAAC,MAAM,MAAM,CAAC,EAAE;IACjC,CAAC,EACD,UAAU,KAAK,EAAA;AACb,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAC9B,IAAA,CAAC,CACF;AAED,IAAA,MAAM,qBAAqB,GAAG,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CACnE,CAAC,QAAQ,KAAI;AACX,QAAA,IACE,CAAC,YAAY;YACb,QAAQ,CAAC,IAAI,CAAC;aACb,IAAI,KAAK,MAAM,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChD,YAAA,QAAQ,CAAC,OAAO;AAChB,YAAA,QAAQ,CAAC,OAAO,CAAC,qCAAqC,CAAC,EACvD;YACA,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;YAClF,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC;AAEhD,YAAA,IAAI,SAAS,KAAK,KAAK,EAAE;gBACvB,IAAI,oBAAoB,EAAE;oBACxB,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC;gBAChE;gBAEA,KAAK,GAAG,SAAS;AAEjB,gBAAA,QAAQ,GAAG,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC;AAChD,gBAAA,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAC3D,CAAC,MAAM,KAAI;oBACT,OAAO,QAAQ,CAAC,MAAM,MAAM,CAAC,EAAE;gBACjC,CAAC,EACD,UAAU,KAAK,EAAA;AACb,oBAAA,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAC9B,gBAAA,CAAC,CACF;YACH;YAEA,YAAY,GAAG,IAAI;QACrB;AAEA,QAAA,OAAO,QAAQ;IACjB,CAAC,EACD,UAAU,KAAK,EAAA;AACb,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAC9B,IAAA,CAAC,CACF;AAED,IAAA,OAAO,MAAK;QACV,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC;QAC9D,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC;AAClE,IAAA,CAAC;AACH,CAAC;;;;"}