@commercelayer/sdk-utils
Version:
Commerce Layer Javascript SDK Utils library
1 lines • 3.87 kB
Source Map (JSON)
{"version":3,"sources":["../src/rate_limit.ts"],"names":[],"mappings":";;;AAwBO,IAAM,gBAAA,GAAmB,CAAC,OAAA,KAA0C;AAC1E,EAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAC7E,EAAA,OAAO;AAAA,IACN,QAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,sBAAsB,CAAC,CAAA;AAAA,IAChD,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,mBAAmB,CAAC,CAAA;AAAA,IAC1C,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,uBAAuB,CAAC;AAAA,GACnD;AACD;AAcO,IAAM,iBAAA,GAAoB,CAAC,SAAA,EAA4B,YAAA,EAA6B,aAA+B,GAAA,KAAgC;AAEzJ,EAAA,MAAM,SAAS,GAAA,IAAO,MAAA;AAEtB,EAAA,MAAM,iBAAiB,EAAA,GAAK,GAAA;AAC5B,EAAA,MAAM,kBAAA,GAAsB,MAAA,KAAW,MAAA,GAAS,EAAA,GAAK,EAAA;AAErD,EAAA,MAAM,OAAA,GAAW,OAAO,YAAA,KAAiB,QAAA,GAAY,eAAe,YAAA,CAAa,YAAA;AAGjF,EAAA,MAAM,GAAA,GAAqB;AAAA,IAC1B,OAAO,SAAA,CAAU,KAAA;AAAA,IACjB,UAAU,SAAA,CAAU,QAAA;AAAA,IACpB,KAAA,EAAO;AAAA,GACR;AAEA,EAAA,MAAM,YAAA,GAAe,WAAA,IAAgB,SAAA,EAAW,KAAA,GAAQ,CAAA,IAAM,CAAA;AAE9D,EAAA,IAAI,SAAA,EAAW;AACd,IAAA,MAAM,aAAA,GAAiB,OAAO,YAAA,KAAiB,QAAA,GAAY,eAAe,YAAA,CAAa,MAAA;AACvF,IAAA,GAAA,CAAI,QAAA,GAAW,aAAA;AACf,IAAA,IAAI,aAAA,IAAiB,SAAA,CAAU,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAM,SAAA,CAAU,QAAA,GAAW,GAAA,GAAQ,SAAA,CAAU,KAAK,CAAA;AAAA,SACpG;AACJ,MAAA,MAAM,gBAAA,GAAoB,OAAO,YAAA,KAAiB,QAAA,GAAY,aAAA,GAAgB,YAAA,CAAa,MAAA,CAAO,CAAA,CAAA,KAAM,CAAA,CAAE,YAAA,KAAiB,OAAQ,CAAA,CAAE,MAAA;AACrI,MAAA,IAAI,oBAAoB,kBAAA,EAAoB,GAAA,CAAI,QAAQ,IAAA,CAAK,IAAA,CAAK,iBAAiB,kBAAkB,CAAA;AAAA,IACtG;AAAA,EACD;AAEA,EAAA,OAAO,GAAA;AAER","file":"chunk-WSJGLDZH.cjs","sourcesContent":["import type { HeadersObj } from \"@commercelayer/sdk\"\nimport type { Task } from \"./batch\"\n\n\ntype ApiEnv = 'live' | 'test'\n\n\nexport type RateLimitHeader = {\n\tcount?: number,\n\tperiod?: number,\n\tinterval: number,\n\tlimit: number,\n\tremaining: number\n}\n\n\nexport type RateLimitInfo = {\n\tlimit: number\n\tinterval: number\n\tdelay: number,\n\trequests?: number\n}\n\n\nexport const headerRateLimits = (headers?: HeadersObj): RateLimitHeader => {\n\tif (!headers) throw new Error('Unable to find rate limit headers in response')\n\treturn {\n\t\tinterval: Number(headers[\"x-ratelimit-interval\"]),\n\t\tlimit: Number(headers[\"x-ratelimit-limit\"]),\n\t\tremaining: Number(headers[\"x-ratelimit-remaining\"])\n\t}\n}\n\n\n/*\n\t\"erl_oauth_limit_live\" : 30,\n\t\"erl_burst_limit_uncachable_live\" : 50,\n\t\"erl_burst_limit_uncachable_test\" : 25,\n\t\"erl_burst_limit_cachable_live\" : 250,\n\t\"erl_burst_limit_cachable_test\" : 125,\n\t\"erl_average_limit_uncachable_live\" : 200,\n\t\"erl_average_limit_uncachable_test\" : 100,\n\t\"erl_average_limit_cachable_live\" : 1000,\n\t\"erl_average_limit_cachable_test\" : 500\n */\nexport const computeRateLimits = (rateLimit: RateLimitHeader, resourceType: string | Task, allRequests?: number | Task[], env?: ApiEnv): RateLimitInfo => {\n\n\tconst apiEnv = env || 'test'\n\n\tconst BURST_INTERVAL = 10 * 1000 // 10 seconds\n\tconst BURST_MAX_REQUESTS = (apiEnv === 'live')? 50 : 25\n\n\tconst resType = (typeof resourceType === 'string') ? resourceType : resourceType.resourceType\n\t// const task = (typeof currentTask === 'number')? allTasks[currentTask] : currentTask\n\n\tconst rli: RateLimitInfo = {\n\t\tlimit: rateLimit.limit,\n\t\tinterval: rateLimit.interval,\n\t\tdelay: 0\n\t}\n\n\tconst allRequests_ = allRequests || (rateLimit?.limit * 2) || 0\t// A number over the limit\n\n\tif (rateLimit) {\n\t\tconst totalRequests = (typeof allRequests_ === 'number') ? allRequests_ : allRequests_.length\n\t\trli.requests = totalRequests\n\t\tif (totalRequests >= rateLimit.limit) rli.delay = Math.ceil((rateLimit.interval * 1000) / rateLimit.limit)\n\t\telse {\n\t\t\tconst resourceRequests = (typeof allRequests_ === 'number') ? totalRequests : allRequests_.filter(t => (t.resourceType === resType)).length\n\t\t\tif (resourceRequests >= BURST_MAX_REQUESTS) rli.delay = Math.ceil(BURST_INTERVAL / BURST_MAX_REQUESTS)\n\t\t}\n\t}\n\n\treturn rli\n\n}\n"]}