diff --git a/.changeset/poor-tips-appear.md b/.changeset/poor-tips-appear.md new file mode 100644 index 0000000000..7d69dfb4c3 --- /dev/null +++ b/.changeset/poor-tips-appear.md @@ -0,0 +1,5 @@ +--- +"@vue-storefront/middleware": patch +--- + +Adjusted handling timeouts and aborting TCP connection diff --git a/packages/middleware/__tests__/unit/helpers/getAgnosticStatusCode.spec.ts b/packages/middleware/__tests__/unit/helpers/getAgnosticStatusCode.spec.ts index 9dd312e95f..c606bead0b 100644 --- a/packages/middleware/__tests__/unit/helpers/getAgnosticStatusCode.spec.ts +++ b/packages/middleware/__tests__/unit/helpers/getAgnosticStatusCode.spec.ts @@ -109,6 +109,28 @@ describe("[middleware-helpers] getAgnosticStatusCode", () => { expect(statusCode).toBe(defaultCode); }); + it("retrieves status code for axios even when status code is missing and it's timeout", () => { + const testData = { + isAxiosError: true, + code: "ECONNABORTED", + }; + + const statusCode = getAgnosticStatusCode(testData); + + expect(statusCode).toBe(408); + }); + + it("retrieves status code for axios even when status code is missing and recipient closed TCP connection", () => { + const testData = { + isAxiosError: true, + code: "ECONNRESET", + }; + + const statusCode = getAgnosticStatusCode(testData); + + expect(statusCode).toBe(500); + }); + it("retrieves status code for apollo when code is a string", () => { const testData = { code: "someString", diff --git a/packages/middleware/src/helpers/getAgnosticStatusCode.ts b/packages/middleware/src/helpers/getAgnosticStatusCode.ts index 34a7d8dd62..23dd27e2d7 100644 --- a/packages/middleware/src/helpers/getAgnosticStatusCode.ts +++ b/packages/middleware/src/helpers/getAgnosticStatusCode.ts @@ -8,6 +8,15 @@ import { } from "../types"; const STATUS_FIELDS = ["status", "statusCode"] as const; +/** + * @key is constant string identifier of connection error + * @value is desired HTTP code that we are going to + * send back when we encounter specified connection error + */ +const CONNECTION_ERRORS = { + ECONNABORTED: 408, + ECONNRESET: 500, +}; export type Status = (typeof STATUS_FIELDS)[number]; @@ -58,7 +67,11 @@ function obtainStatusCode( } function getAxiosStatusCode(error: AxiosError) { - return error.response?.status ?? 500; + if (error?.code && CONNECTION_ERRORS[error.code]) { + return CONNECTION_ERRORS[error.code]; + } + + return error.response?.status; } function getApolloStatusCode(error: ApolloError) { diff --git a/packages/middleware/src/types/base.ts b/packages/middleware/src/types/base.ts index 1eadbe084c..2b1ed1f2b6 100644 --- a/packages/middleware/src/types/base.ts +++ b/packages/middleware/src/types/base.ts @@ -41,7 +41,8 @@ export type ApiClientMethods = { export type AxiosError = { isAxiosError: boolean; - response: { + code: string; + response?: { status: number; }; };