diff --git a/package-lock.json b/package-lock.json index 362f5ff..0f90189 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@octocloud/backend", - "version": "1.0.18", + "version": "1.0.20", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@octocloud/backend", - "version": "1.0.18", + "version": "1.0.20", "license": "ISC", "dependencies": { - "@octocloud/core": "^1.0.50", + "@octocloud/core": "^1.0.51", "@octocloud/types": "^1.5.24", "date-fns": "^2.29.3", "date-fns-tz": "^1.3.7", @@ -1245,9 +1245,9 @@ } }, "node_modules/@octocloud/core": { - "version": "1.0.50", - "resolved": "https://registry.npmjs.org/@octocloud/core/-/core-1.0.50.tgz", - "integrity": "sha512-eZNttBsSkoFpl3BhoP/+sftYP/YO2IZn4x9xumyuaM33kQ8iFJAUm7tCp52r+u9316JCTBueAkTLas1r5/B/fg==", + "version": "1.0.51", + "resolved": "https://registry.npmjs.org/@octocloud/core/-/core-1.0.51.tgz", + "integrity": "sha512-COEAE2FEtTKF4x3PRDOnlv91w3g5+Dt6E/UuPIgCcWmrbNLmLYSfSOnSg9sqOPbh3ttOCMIZsygvKf1kwNuLKQ==", "dependencies": { "@dinero.js/currencies": "2.0.0-alpha.8", "date-fns": "^2.30.0", @@ -1535,9 +1535,9 @@ "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==" }, "node_modules/@types/node": { - "version": "20.12.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.6.tgz", - "integrity": "sha512-3KurE8taB8GCvZBPngVbp0lk5CKi8M9f9k1rsADh0Evdz5SzJ+Q+Hx9uHoFGsLnLnd1xmkDQr2hVhlA0Mn0lKQ==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2295,9 +2295,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001607", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001607.tgz", - "integrity": "sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==", + "version": "1.0.30001612", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", + "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", "dev": true, "funding": [ { @@ -2477,6 +2477,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -2496,9 +2502,9 @@ "dev": true }, "node_modules/core-js-pure": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.1.tgz", - "integrity": "sha512-NXCvHvSVYSrewP0L5OhltzXeWFJLo2AL2TYnj6iLV3Bw8mM62wAQMNgUCRI6EBu6hVVpbCxmOPlxh1Ikw2PfUA==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.0.tgz", + "integrity": "sha512-d3BrpyFr5eD4KcbRvQ3FTUx/KWmaDesr7+a3+1+P46IUnNoEt+oiLijPINZMEon7w9oGkIINWxrBAU9DEciwFQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -2765,9 +2771,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.730", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.730.tgz", - "integrity": "sha512-oJRPo82XEqtQAobHpJIR3zW5YO3sSRRkPz2an4yxi1UvqhsGm54vR/wzTFV74a3soDOJ8CKW7ajOOX5ESzddwg==", + "version": "1.4.747", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.747.tgz", + "integrity": "sha512-+FnSWZIAvFHbsNVmUxhEqWiaOiPMcfum1GQzlWCg/wLigVtshOsjXHyEFfmt6cFK6+HkS3QOJBv6/3OPumbBfw==", "dev": true }, "node_modules/emoji-regex": { @@ -5010,9 +5016,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.60", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.60.tgz", - "integrity": "sha512-Ctgq2lXUpEJo5j1762NOzl2xo7z7pqmVWYai0p07LvAkQ32tbPv3wb+tcUeHEiXhKU5buM4H9MXsXo6OlM6C2g==" + "version": "1.10.61", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.61.tgz", + "integrity": "sha512-TsQsyzDttDvvzWNkbp/i0fVbzTGJIG0mUu/uNalIaRQEYeJxVQ/FPg+EJgSqfSXezREjM0V3RZ8cLVsKYhhw0Q==" }, "node_modules/lilconfig": { "version": "3.0.0", @@ -5254,15 +5260,12 @@ } }, "node_modules/magic-string": { - "version": "0.30.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", - "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" } }, "node_modules/make-dir": { @@ -5800,14 +5803,14 @@ "dev": true }, "node_modules/mlly/node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", + "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", "dev": true, "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" + "confbox": "^0.1.7", + "mlly": "^1.6.1", + "pathe": "^1.1.2" } }, "node_modules/mri": { @@ -7321,9 +7324,9 @@ } }, "node_modules/tinybench": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", - "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", + "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", "dev": true }, "node_modules/tinypool": { @@ -7515,9 +7518,9 @@ } }, "node_modules/tsup/node_modules/bundle-require": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.2.tgz", - "integrity": "sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.3.tgz", + "integrity": "sha512-2iscZ3fcthP2vka4Y7j277YJevwmsby/FpFDwjgw34Nl7dtCpt7zz/4TexmHMzY6KZEih7En9ImlbbgUNNQGtA==", "dev": true, "dependencies": { "load-tsconfig": "^0.2.3" @@ -8139,14 +8142,14 @@ "dev": true }, "node_modules/vite-node/node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", + "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", "dev": true, "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" + "confbox": "^0.1.7", + "mlly": "^1.6.1", + "pathe": "^1.1.2" } }, "node_modules/vite/node_modules/@esbuild/android-arm": { diff --git a/package.json b/package.json index 5e0395a..04cdfbc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@octocloud/backend", - "version": "1.0.19", + "version": "1.0.20", "license": "ISC", "author": "", "exports": { @@ -31,7 +31,7 @@ }, "types": "./dist/index.d.ts", "dependencies": { - "@octocloud/core": "^1.0.50", + "@octocloud/core": "^1.0.51", "@octocloud/types": "^1.5.24", "date-fns": "^2.29.3", "date-fns-tz": "^1.3.7", diff --git a/src/api/Client.ts b/src/api/Client.ts index 940f62f..7eaabfa 100644 --- a/src/api/Client.ts +++ b/src/api/Client.ts @@ -1,5 +1,5 @@ import { v5 } from 'uuid'; -import { OctoBackend, BaseConfig, SubRequestContext, BackendParams, Logger, fetchRetry } from '@octocloud/core'; +import { BaseConfig, SubRequestContext, BackendParams, Logger, fetchRetry } from '@octocloud/core'; import { BeforeRequest } from './../index'; import { OctoApiErrorHandler } from './ErrorHandler'; @@ -48,12 +48,10 @@ export abstract class APIClient { }; public readonly fetch = async (url: string, method: RequestMethod, params: ApiClientParams): Promise => { - this.logger.log(`${new Date().toISOString()} ${method} ${url}`); - const request = await this.createRequest(url, method, params); const req = await this.beforeRequest({ request }); const subRequestContext = new SubRequestContext({ - request: req.clone(), + request: req, requestId: params.ctx.getRequestId(), accountId: params.ctx.getAccountId(), }); @@ -66,7 +64,7 @@ export abstract class APIClient { await this.errorHandler.handleError(res, subRequestData, params.ctx); } - return res.clone(); + return res; }; private readonly createRequest = async ( diff --git a/src/api/ErrorHandler.ts b/src/api/ErrorHandler.ts index 2614a76..779f081 100644 --- a/src/api/ErrorHandler.ts +++ b/src/api/ErrorHandler.ts @@ -46,7 +46,7 @@ export class OctoApiErrorHandler { body, error: body?.error ?? null, requestId: requestContext.getRequestId(), - subRequestId: subRequestData.id, + subRequestId: subRequestData.getId(), }; const error = this.errorMapper(body, errorParams, status); diff --git a/src/api/__tests__/Api.test.ts b/src/api/__tests__/Api.test.ts index 40a8319..9f14e0d 100644 --- a/src/api/__tests__/Api.test.ts +++ b/src/api/__tests__/Api.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { API } from '../Api'; import { BaseConfig, Environment, Logger, NullLogger, RequestContext, RequestMethod } from '@octocloud/core'; import { BeforeRequest } from '../..'; @@ -8,6 +8,8 @@ describe('API', () => { let beforeRequest: BeforeRequest; let baseConfig: BaseConfig; let logger: Logger; + let request: Request; + let response: Response; let requestContext: RequestContext; beforeEach(() => { @@ -18,6 +20,7 @@ describe('API', () => { beforeRequest = async ({ request }) => { return await Promise.resolve(request); }; + baseConfig = new BaseConfig({ environment: Environment.TEST, productionURL: '', @@ -25,12 +28,14 @@ describe('API', () => { }); logger = new NullLogger(); api = new API(beforeRequest, baseConfig, logger); + request = new Request('https://octo.ventrata.com', { + headers: { + 'Content-Type': 'application/json', + }, + }); + response = new Response('{}', { status: 200 }); requestContext = new RequestContext({ - request: new Request('https://octo.ventrata.com', { - headers: { - 'Content-Type': 'application/json', - }, - }), + request, }); requestContext.setConnection({ @@ -41,6 +46,29 @@ describe('API', () => { accountId: '2635034e-3094-428b-b8f0-9d0cc0960c0c', name: 'testConnection', }); + requestContext.setAccountId('124aef9e-bd6e-4f4f-9537-c41969889d86'); + requestContext.setResponse(response); + }); + + afterEach(async () => { + // request and response should be properly consumed + const requestData = requestContext.getRequestData(); + + await request.text(); + await response.text(); + + await requestData.getRequest().text(); + await requestData.getResponse().text(); + + for (const subRequestData of requestData.getSubRequests()) { + await subRequestData.getRequest().text(); + await subRequestData.getResponse().text(); + + for (const subRequestRetryData of subRequestData.getRetries()) { + await subRequestRetryData.getRequest().text(); + await subRequestRetryData.getResponse().text(); + } + } }); describe('fetch', () => { @@ -49,9 +77,9 @@ describe('API', () => { await api.fetch('https://octo.ventrata.com', RequestMethod.Get, { ctx: requestContext, }); - const subrequest = requestContext.getSubrequests()[0]; - expect(subrequest.response.status).toBe(200); - expect(subrequest.retries.length).toBe(0); + const subrequest = requestContext.getSubRequests()[0]; + expect(subrequest.getResponse().status).toBe(200); + expect(subrequest.getRetries().length).toBe(0); }); it('should succeed at second retry', async () => { @@ -62,10 +90,10 @@ describe('API', () => { await api.fetch('https://octo.ventrata.com', RequestMethod.Get, { ctx: requestContext, }); - const subrequest = requestContext.getSubrequests()[0]; - expect(subrequest.response.status).toBe(503); - expect(subrequest.retries[0].response.status).toBe(200); - expect(subrequest.retries.length).toBe(1); + const subrequest = requestContext.getSubRequests()[0]; + expect(subrequest.getResponse().status).toBe(503); + expect(subrequest.getRetries().length).toBe(1); + expect(subrequest.getRetries()[0].getResponse().status).toBe(200); }); it('should succeed at third retry', async () => { @@ -77,11 +105,11 @@ describe('API', () => { await api.fetch('https://octo.ventrata.com', RequestMethod.Get, { ctx: requestContext, }); - const subrequest = requestContext.getSubrequests()[0]; - expect(subrequest.response.status).toBe(503); - expect(subrequest.retries[0].response.status).toBe(502); - expect(subrequest.retries[1].response.status).toBe(200); - expect(subrequest.retries.length).toBe(2); + const subrequest = requestContext.getSubRequests()[0]; + expect(subrequest.getResponse().status).toBe(503); + expect(subrequest.getRetries().length).toBe(2); + expect(subrequest.getRetries()[0].getResponse().status).toBe(502); + expect(subrequest.getRetries()[1].getResponse().status).toBe(200); }); it('should fail after three retries', async () => { @@ -93,11 +121,11 @@ describe('API', () => { await api.fetch('https://octo.ventrata.com', RequestMethod.Get, { ctx: requestContext, }); - const subrequest = requestContext.getSubrequests()[0]; - expect(subrequest.response.status).toBe(503); - expect(subrequest.retries[0].response.status).toBe(502); - expect(subrequest.retries[1].response.status).toBe(500); - expect(subrequest.retries.length).toBe(2); + const subrequest = requestContext.getSubRequests()[0]; + expect(subrequest.getResponse().status).toBe(503); + expect(subrequest.getRetries().length).toBe(2); + expect(subrequest.getRetries()[0].getResponse().status).toBe(502); + expect(subrequest.getRetries()[1].getResponse().status).toBe(500); }); }); });