From 99c84c31971f78410645ca04766a861fc3b2cf91 Mon Sep 17 00:00:00 2001 From: Vincent Germain Date: Tue, 21 Mar 2023 10:08:01 +0100 Subject: [PATCH 1/3] fix(fetch): check response is of proper type without using instanceof --- packages/clients/src/helpers/is-response.ts | 17 +++++++++++++++++ .../clients/src/scw/fetch/response-parser.ts | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 packages/clients/src/helpers/is-response.ts diff --git a/packages/clients/src/helpers/is-response.ts b/packages/clients/src/helpers/is-response.ts new file mode 100644 index 000000000..b0bf31fa6 --- /dev/null +++ b/packages/clients/src/helpers/is-response.ts @@ -0,0 +1,17 @@ +/** + * Validates an object is of type Response without using `instanceof`. + * + * @internal + */ +export const isResponse = (value: unknown): value is Response => + value !== null && + value !== undefined && + typeof value === 'object' && + 'status' in value && + typeof value.status === 'number' && + 'statusText' in value && + typeof value.statusText === 'string' && + 'headers' in value && + typeof value.headers === 'object' && + 'body' in value && + typeof value.body !== 'undefined' diff --git a/packages/clients/src/scw/fetch/response-parser.ts b/packages/clients/src/scw/fetch/response-parser.ts index 80535f565..bdcbeedc9 100644 --- a/packages/clients/src/scw/fetch/response-parser.ts +++ b/packages/clients/src/scw/fetch/response-parser.ts @@ -1,3 +1,4 @@ +import { isResponse } from '../../helpers/is-response' import { isJSONObject } from '../../helpers/json' import { parseScalewayError } from '../errors/error-parser' import { ScalewayError } from '../errors/scw-error' @@ -50,7 +51,7 @@ export const responseParser = responseType: 'json' | 'text' | 'blob', ) => async (response: Response): Promise => { - if (!(response instanceof Response)) { + if (!isResponse(response)) { throw new TypeError('Invalid response object') } From afd124e2f5ebe94c0357f46c0da3c3664daaa236 Mon Sep 17 00:00:00 2001 From: Vincent Germain Date: Tue, 21 Mar 2023 10:16:50 +0100 Subject: [PATCH 2/3] refactor: rename --- packages/clients/src/helpers/is-response.ts | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/clients/src/helpers/is-response.ts b/packages/clients/src/helpers/is-response.ts index b0bf31fa6..2d7241566 100644 --- a/packages/clients/src/helpers/is-response.ts +++ b/packages/clients/src/helpers/is-response.ts @@ -3,15 +3,15 @@ * * @internal */ -export const isResponse = (value: unknown): value is Response => - value !== null && - value !== undefined && - typeof value === 'object' && - 'status' in value && - typeof value.status === 'number' && - 'statusText' in value && - typeof value.statusText === 'string' && - 'headers' in value && - typeof value.headers === 'object' && - 'body' in value && - typeof value.body !== 'undefined' +export const isResponse = (obj: unknown): obj is Response => + obj !== null && + obj !== undefined && + typeof obj === 'object' && + 'status' in obj && + typeof obj.status === 'number' && + 'statusText' in obj && + typeof obj.statusText === 'string' && + 'headers' in obj && + typeof obj.headers === 'object' && + 'body' in obj && + typeof obj.body !== 'undefined' From bbb0da279b82437b1a1f3b8c344046034ad9a9bf Mon Sep 17 00:00:00 2001 From: Vincent Germain Date: Mon, 27 Mar 2023 10:43:48 +0200 Subject: [PATCH 3/3] docs: add remark --- packages/clients/src/helpers/is-response.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/clients/src/helpers/is-response.ts b/packages/clients/src/helpers/is-response.ts index 2d7241566..abdeed273 100644 --- a/packages/clients/src/helpers/is-response.ts +++ b/packages/clients/src/helpers/is-response.ts @@ -1,6 +1,8 @@ /** * Validates an object is of type Response without using `instanceof`. * + * @remarks Check issue #509 for more context. + * * @internal */ export const isResponse = (obj: unknown): obj is Response =>