@commercelayer/sdk-utils
Version:
Commerce Layer Javascript SDK Utils library
1 lines • 13.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/jobs.ts"],"names":["groupUID","config","init_default","headerRateLimits","computeRateLimits","sleep"],"mappings":"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","file":"chunk-6SETOGPD.cjs","sourcesContent":["import CommerceLayerUtils from \"./init\"\nimport { config } from \"./config\"\nimport { type Task, type TemplateTask } from \"./batch\"\nimport type { QueryFilter, Cleanup, CleanupCreate, Export, ExportCreate, Import, ImportCreate, ResourceTypeLock } from \"@commercelayer/sdk\"\nimport { groupUID, sleep } from \"./common\"\nimport { computeRateLimits, headerRateLimits } from \"./rate_limit\"\n\n\nexport type JobOptions = {\n\tsize?: number\t\t\t// The output size of the jobs\n\tdelay?: number\t\t\t// Delay to use between requests if made in conjunction with other external calls\n\tqueueLength?: number\t// Max length of remote queue of jobs\n\tnoGroupId?: boolean\t\t// groupId won't be added to generated resources\n\tnoMetadata?: boolean\t// Job metadata won't be added to generated resources\n}\n\n\nexport type JobOutputType = 'exports' | 'cleanups'\nexport type JobInputType = 'imports'\nexport type JobType = JobOutputType | JobInputType\n\nexport type ResourceJob = ResourceJobOutput | ResourceJobInput\nexport type ResourceJobOutput = ExportCreate | CleanupCreate\nexport type ResourceJobInput = ImportCreate\n\nexport type ResourceJobResult = ResourceJobOutputResult | ResourceJobInputResult\nexport type ResourceJobOutputResult = Export | Cleanup\nexport type ResourceJobInputResult = Import\n\n\n\nexport const splitInputJob = <JI extends ResourceJobInput>(job: JI, jobType: JobInputType, options?: JobOptions): JI[] => {\n\n\tconst jobs: JI[] = []\n\tif (!job?.inputs || (job.inputs.length === 0)) return jobs\n\tconst groupId = options?.noGroupId? undefined : groupUID()\n\n\tconst jobSize = options?.size\n\tconst jobMaxSize = jobSize ? Math.min(Math.max(1, jobSize), config[jobType].max_size) : config[jobType].max_size\n\n\tconst allInputs = job.inputs\n\tconst totJobs = Math.ceil(allInputs.length / jobMaxSize)\n\n\tlet jobNum = 0\n\twhile (allInputs.length > 0) {\n\n\t\tjobNum++\n\n\t\tconst jobCreate: JI = {\n\t\t\t...job,\n\t\t\tinputs: allInputs.splice(0, jobMaxSize),\n\t\t\tmetadata: { ...job.metadata }\n\t\t}\n\t\tif (groupId) jobCreate.reference = `${groupId}-${jobNum}`\n\t\t// Job metadata\n\t\tif (!options?.noMetadata) {\n\t\t\tif (!jobCreate.metadata) jobCreate.metadata = {}\n\t\t\tjobCreate.metadata.progress_number = `${jobNum}/${totJobs}`\n\t\t\tif (groupId) jobCreate.metadata.group_id = groupId\n\t\t}\n\n\t\tjobs.push(jobCreate)\n\n\t}\n\n\treturn jobs\n\n}\n\n\nexport const splitOutputJob = async <JO extends ResourceJobOutput>(job: JO, jobType: JobOutputType, options?: JobOptions): Promise<JO[]> => {\n\n\tconst cl = CommerceLayerUtils().sdk\n\tconst rrr = cl.addRawResponseReader({ headers: true })\n\t// const resSdk = cl[job.resource_type as ListableResourceType] as unknown as ApiResource<ListableResource>\n\tconst resSdk = CommerceLayerUtils().api(job.resource_type as ResourceTypeLock)\n\tconst jobSize = options?.size\n\tconst jobMaxSize = jobSize ? Math.min(Math.max(1, jobSize), config[jobType].max_size) : config[jobType].max_size\n\tlet delay = options?.delay\n\n\tconst totRecords = await resSdk.count({ filters: job.filters as QueryFilter, pageSize: 1, pageNumber: 1 })\n\n\t// Rate limit\n\tif (!delay) {\n\t\tconst rateLimits = headerRateLimits(rrr.headers)\n\t\tconst rateLimit = computeRateLimits(rateLimits, jobType)\n\t\tdelay = rateLimit.delay\n\t}\n\t\n\tcl.removeRawResponseReader()\n\n\tconst totJobs = Math.ceil(totRecords / jobMaxSize)\n\n\n\tconst jobs: JO[] = []\n\tconst groupId = options?.noGroupId? undefined : groupUID()\n\n\tlet startId = null\n\tlet stopId = null\n\tlet jobPage = 0\n\n\n\tfor (let curJob = 0; curJob < totJobs; curJob++) {\n\n\t\tconst jobNum = curJob +1 \n\n\t\tconst jobCreate: JO = {\n\t\t\t...job,\n\t\t\tfilters: { ...job.filters },\n\t\t\tmetadata: { ...job.metadata }\n\t\t}\n\t\tif (groupId) jobCreate.reference = `${groupId}-${jobNum}`\n\t\tif (!jobCreate.filters) jobCreate.filters = {}\n\t\t// Job metadata\n\t\tif (!options?.noMetadata) {\n\t\t\tif (!jobCreate.metadata) jobCreate.metadata = {}\n\t\t\tjobCreate.metadata.progress_number = `${jobNum}/${totJobs}`\n\t\t\tif (groupId) jobCreate.metadata.group_id = groupId\n\t\t}\n\n\t\tconst pageSize = 1\n\t\tconst curJobRecords = Math.min(jobMaxSize, totRecords - (jobMaxSize * curJob))\n\t\tconst curJobPages = Math.ceil(curJobRecords / pageSize)\n\t\tjobPage += curJobPages\n\n\t\tawait sleep(delay)\n\t\tconst curJobLastPage = await resSdk.list({ filters: job.filters as QueryFilter, pageSize, pageNumber: jobPage, sort: { id: 'asc' } })\n\n\t\tstopId = curJobLastPage.last()?.id\n\t\t\n\t\tif (startId) jobCreate.filters.id_gt = startId\n\t\tif ((jobNum < totJobs)) jobCreate.filters.id_lteq = stopId\n\n\t\tjobs.push(jobCreate)\n\n\t\tstartId = stopId\n\n\t}\n\n\treturn jobs\n\n}\n\n\nexport const jobsToBatchTasks = (jobs: ResourceJob[], jobType: JobType, baseTask?: TemplateTask): Array<Task & { operation: 'create' }> => {\n\n\treturn jobs.map(job => {\n\n\t\tconst task: Task = {\n\t\t\toperation: 'create',\n\t\t\tresourceType: jobType,\n\t\t\tresource: { ...job }\n\t\t}\n\n\t\tif (baseTask) {\n\t\t\ttask.onFailure = baseTask.onFailure\n\t\t\ttask.onSuccess = baseTask.onSuccess\n\t\t\ttask.params = baseTask.params\n\t\t\ttask.options = baseTask.options\n\t\t}\n\n\t\treturn task\n\n\t})\n\n}\n\n\nconst isRunning = (job: ResourceJobResult): boolean => {\n\treturn (!job.status || ['pending', 'in_progress'].includes(job.status))\n}\n\nconst countRunning = (jobs: ResourceJobResult[]): number => {\n\treturn jobs.filter(j => isRunning(j)).length\n}\n\nconst isCompleted = (job: ResourceJobResult): boolean => {\n\treturn ['completed', 'interrupted'].includes(job.status)\n}\n\nconst countCompleted = (jobs: ResourceJobResult[]): number => {\n\treturn jobs.filter(j => isCompleted(j)).length\n}\n\n\nexport const executeJobs = async <J extends ResourceJobResult>(jobs: ResourceJob[], jobType: JobType, options?: JobOptions): Promise<J[]> => {\n\n\tconst checkInterval = 1000\t// ms\n\n\tconst cl = CommerceLayerUtils().sdk\n\tconst rrr = cl.addRawResponseReader({ headers: true })\n\t// const resSdk = cl(jobType]\n\tconst resSdk = CommerceLayerUtils().api(jobType)\n\tconst results: J[] = []\n\n\tconst queueMax = options?.queueLength || config[jobType].queue_size || jobs.length\n\tlet delay = -1\n\n\tdo {\n\n\t\t// Create job if there are slots available\n\t\twhile ((countRunning(results) < queueMax) && (results.length < jobs.length)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tconst job = await (resSdk as any).create(jobs[results.length] as any)\n\t\t\tresults.push(job as J)\n\t\t\tif (delay < 0) {\n\t\t\t\tconst rateLimits = headerRateLimits(rrr.headers)\n\t\t\t\tconst rateLimit = computeRateLimits(rateLimits, jobType)\n\t\t\t\tdelay = rateLimit.delay\n\t\t\t\tcl.removeRawResponseReader()\n\t\t\t} else await sleep(delay)\n\t\t}\n\n\t\t// Check job status\n\t\tfor (const job of results) {\n\t\t\tif (isCompleted(job)) continue\n\t\t\tawait sleep(delay)\n\t\t\tconst j = await resSdk.retrieve(job)\n\t\t\tObject.assign(job, j)\n\t\t}\n\n\t\tawait sleep(checkInterval)\n\n\t} while (countCompleted(results) < jobs.length)\n\n\treturn results\n\n}\n"]}