From 6960a402f5eaec36096b0cabc8b7fdfeadaf41e2 Mon Sep 17 00:00:00 2001 From: fern-api <115122769+fern-api[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 18:45:49 +0000 Subject: [PATCH 1/3] SDK regeneration --- package.json | 43 +---- src/api/errors/TooManyRequestsError.ts | 18 ++ src/api/errors/index.ts | 1 + src/api/index.ts | 1 + src/api/resources/accounts/client/Client.ts | 89 +++++++--- src/api/resources/actions/client/Client.ts | 89 +++++++--- .../resources/appCategories/client/Client.ts | 4 +- src/api/resources/apps/client/Client.ts | 4 +- src/api/resources/components/client/Client.ts | 72 +++++--- .../deployedTriggers/client/Client.ts | 157 ++++++++++++------ .../resources/oauthTokens/client/Client.ts | 4 +- src/api/resources/projects/client/Client.ts | 21 ++- src/api/resources/tokens/client/Client.ts | 38 +++-- src/api/resources/triggers/client/Client.ts | 89 +++++++--- src/api/resources/users/client/Client.ts | 21 ++- src/api/types/TooManyRequestsErrorBody.ts | 7 + src/core/fetcher/Fetcher.ts | 2 +- src/core/fetcher/requestWithRetries.ts | 40 ++++- src/core/headers.ts | 20 ++- .../types/TooManyRequestsErrorBody.ts | 20 +++ src/serialization/types/index.ts | 1 + src/version.ts | 2 +- tests/unit/fetcher/requestWithRetries.test.ts | 103 ++++++++++++ yarn.lock | 131 ++++++++------- 24 files changed, 692 insertions(+), 285 deletions(-) create mode 100644 src/api/errors/TooManyRequestsError.ts create mode 100644 src/api/errors/index.ts create mode 100644 src/api/types/TooManyRequestsErrorBody.ts create mode 100644 src/serialization/types/TooManyRequestsErrorBody.ts diff --git a/package.json b/package.json index 7b4cd3a..19ad67a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/sdk", - "version": "2.0.4", + "version": "2.0.5", "private": false, "repository": "github:PipedreamHQ/pipedream-sdk-typescript", "type": "commonjs", @@ -10,11 +10,6 @@ "exports": { ".": { "types": "./dist/cjs/index.d.ts", - "browser": { - "types": "./dist/esm/browser/index.d.mts", - "import": "./dist/esm/browser/index.mjs", - "default": "./dist/esm/browser/index.mjs" - }, "import": { "types": "./dist/esm/index.d.mts", "default": "./dist/esm/index.mjs" @@ -25,18 +20,6 @@ }, "default": "./dist/cjs/index.js" }, - "./browser": { - "types": "./dist/esm/browser/index.d.mts", - "import": { - "types": "./dist/esm/browser/index.d.mts", - "default": "./dist/esm/browser/index.mjs" - }, - "require": { - "types": "./dist/cjs/browser/index.d.ts", - "default": "./dist/cjs/browser/index.js" - }, - "default": "./dist/esm/browser/index.mjs" - }, "./serialization": { "types": "./dist/cjs/serialization/index.d.ts", "import": { @@ -49,18 +32,6 @@ }, "default": "./dist/cjs/serialization/index.js" }, - "./server": { - "types": "./dist/cjs/index.d.ts", - "import": { - "types": "./dist/esm/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/index.d.ts", - "default": "./dist/cjs/index.js" - }, - "default": "./dist/cjs/index.js" - }, "./package.json": "./package.json" }, "files": [ @@ -80,17 +51,17 @@ "test:wire": "jest --selectProjects wire" }, "devDependencies": { + "webpack": "^5.97.1", + "ts-loader": "^9.5.1", + "jest": "^29.7.0", "@jest/globals": "^29.7.0", "@types/jest": "^29.5.14", - "@types/node": "^18.19.70", - "jest": "^29.7.0", + "ts-jest": "^29.3.4", "jest-environment-jsdom": "^29.7.0", "msw": "^2.8.4", + "@types/node": "^18.19.70", "prettier": "^3.4.2", - "ts-jest": "^29.3.4", - "ts-loader": "^9.5.1", - "typescript": "~5.7.2", - "webpack": "^5.97.1" + "typescript": "~5.7.2" }, "browser": { "fs": false, diff --git a/src/api/errors/TooManyRequestsError.ts b/src/api/errors/TooManyRequestsError.ts new file mode 100644 index 0000000..31c51a9 --- /dev/null +++ b/src/api/errors/TooManyRequestsError.ts @@ -0,0 +1,18 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as errors from "../../errors/index.js"; +import * as core from "../../core/index.js"; + +export class TooManyRequestsError extends errors.PipedreamError { + constructor(body?: unknown, rawResponse?: core.RawResponse) { + super({ + message: "TooManyRequestsError", + statusCode: 429, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, TooManyRequestsError.prototype); + } +} diff --git a/src/api/errors/index.ts b/src/api/errors/index.ts new file mode 100644 index 0000000..06b0452 --- /dev/null +++ b/src/api/errors/index.ts @@ -0,0 +1 @@ +export * from "./TooManyRequestsError.js"; diff --git a/src/api/index.ts b/src/api/index.ts index ba75aa0..72cddbe 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,2 +1,3 @@ export * from "./resources/index.js"; export * from "./types/index.js"; +export * from "./errors/index.js"; diff --git a/src/api/resources/accounts/client/Client.ts b/src/api/resources/accounts/client/Client.ts index cd66db3..4ddd49d 100644 --- a/src/api/resources/accounts/client/Client.ts +++ b/src/api/resources/accounts/client/Client.ts @@ -19,7 +19,7 @@ export declare namespace Accounts { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -34,7 +34,7 @@ export declare namespace Accounts { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } @@ -51,6 +51,8 @@ export class Accounts { * @param {Pipedream.AccountsListRequest} request * @param {Accounts.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.accounts.list() */ @@ -121,11 +123,16 @@ export class Accounts { }; } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { case "non-json": @@ -166,6 +173,8 @@ export class Accounts { * @param {Pipedream.CreateAccountOpts} request * @param {Accounts.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.accounts.create({ * appSlug: "app_slug", @@ -240,11 +249,16 @@ export class Accounts { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -273,6 +287,8 @@ export class Accounts { * @param {Pipedream.AccountsRetrieveRequest} request * @param {Accounts.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.accounts.retrieve("account_id") */ @@ -331,11 +347,16 @@ export class Accounts { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -363,6 +384,8 @@ export class Accounts { * @param {string} accountId * @param {Accounts.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.accounts.delete("account_id") */ @@ -401,11 +424,16 @@ export class Accounts { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -433,6 +461,8 @@ export class Accounts { * @param {string} appId * @param {Accounts.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.accounts.deleteByApp("app_id") */ @@ -471,11 +501,16 @@ export class Accounts { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { diff --git a/src/api/resources/actions/client/Client.ts b/src/api/resources/actions/client/Client.ts index e94555d..9525952 100644 --- a/src/api/resources/actions/client/Client.ts +++ b/src/api/resources/actions/client/Client.ts @@ -19,7 +19,7 @@ export declare namespace Actions { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -34,7 +34,7 @@ export declare namespace Actions { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } @@ -51,6 +51,8 @@ export class Actions { * @param {Pipedream.ActionsListRequest} request * @param {Actions.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.actions.list() */ @@ -115,11 +117,16 @@ export class Actions { }; } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { case "non-json": @@ -160,6 +167,8 @@ export class Actions { * @param {string} componentId - The key that uniquely identifies the component (e.g., 'slack-send-message') * @param {Actions.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.actions.retrieve("component_id") */ @@ -210,11 +219,16 @@ export class Actions { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -242,6 +256,8 @@ export class Actions { * @param {Pipedream.ConfigurePropOpts} request * @param {Actions.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.actions.configureProp({ * id: "id", @@ -302,11 +318,16 @@ export class Actions { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -334,6 +355,8 @@ export class Actions { * @param {Pipedream.ReloadPropsOpts} request * @param {Actions.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.actions.reloadProps({ * id: "id", @@ -393,11 +416,16 @@ export class Actions { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -425,6 +453,8 @@ export class Actions { * @param {Pipedream.RunActionOpts} request * @param {Actions.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.actions.run({ * id: "id", @@ -484,11 +514,16 @@ export class Actions { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { diff --git a/src/api/resources/appCategories/client/Client.ts b/src/api/resources/appCategories/client/Client.ts index 684f727..127f44c 100644 --- a/src/api/resources/appCategories/client/Client.ts +++ b/src/api/resources/appCategories/client/Client.ts @@ -19,7 +19,7 @@ export declare namespace AppCategories { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -34,7 +34,7 @@ export declare namespace AppCategories { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } diff --git a/src/api/resources/apps/client/Client.ts b/src/api/resources/apps/client/Client.ts index 0643630..e04648c 100644 --- a/src/api/resources/apps/client/Client.ts +++ b/src/api/resources/apps/client/Client.ts @@ -19,7 +19,7 @@ export declare namespace Apps { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -34,7 +34,7 @@ export declare namespace Apps { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } diff --git a/src/api/resources/components/client/Client.ts b/src/api/resources/components/client/Client.ts index 835cad6..3c66665 100644 --- a/src/api/resources/components/client/Client.ts +++ b/src/api/resources/components/client/Client.ts @@ -19,7 +19,7 @@ export declare namespace Components { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -34,7 +34,7 @@ export declare namespace Components { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } @@ -51,6 +51,8 @@ export class Components { * @param {Pipedream.ComponentsListRequest} request * @param {Components.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.components.list() */ @@ -121,11 +123,16 @@ export class Components { }; } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { case "non-json": @@ -166,6 +173,8 @@ export class Components { * @param {string} componentId - The key that uniquely identifies the component (e.g., 'slack-send-message') * @param {Components.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.components.retrieve("component_id") */ @@ -216,11 +225,16 @@ export class Components { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -248,6 +262,8 @@ export class Components { * @param {Pipedream.ConfigurePropOpts} request * @param {Components.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.components.configureProp({ * id: "id", @@ -308,11 +324,16 @@ export class Components { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -340,6 +361,8 @@ export class Components { * @param {Pipedream.ReloadPropsOpts} request * @param {Components.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.components.reloadProps({ * id: "id", @@ -399,11 +422,16 @@ export class Components { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { diff --git a/src/api/resources/deployedTriggers/client/Client.ts b/src/api/resources/deployedTriggers/client/Client.ts index 7cce789..438212b 100644 --- a/src/api/resources/deployedTriggers/client/Client.ts +++ b/src/api/resources/deployedTriggers/client/Client.ts @@ -19,7 +19,7 @@ export declare namespace DeployedTriggers { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -34,7 +34,7 @@ export declare namespace DeployedTriggers { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } @@ -51,6 +51,8 @@ export class DeployedTriggers { * @param {Pipedream.DeployedTriggersListRequest} request * @param {DeployedTriggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.deployedTriggers.list({ * externalUserId: "external_user_id" @@ -112,11 +114,16 @@ export class DeployedTriggers { }; } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { case "non-json": @@ -158,6 +165,8 @@ export class DeployedTriggers { * @param {Pipedream.DeployedTriggersRetrieveRequest} request * @param {DeployedTriggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.deployedTriggers.retrieve("trigger_id", { * externalUserId: "external_user_id" @@ -215,11 +224,16 @@ export class DeployedTriggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -248,6 +262,8 @@ export class DeployedTriggers { * @param {Pipedream.UpdateTriggerOpts} request * @param {DeployedTriggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.deployedTriggers.update("trigger_id", { * externalUserId: "external_user_id" @@ -311,11 +327,16 @@ export class DeployedTriggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -344,6 +365,8 @@ export class DeployedTriggers { * @param {Pipedream.DeployedTriggersDeleteRequest} request * @param {DeployedTriggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.deployedTriggers.delete("trigger_id", { * externalUserId: "external_user_id" @@ -396,11 +419,16 @@ export class DeployedTriggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -429,6 +457,8 @@ export class DeployedTriggers { * @param {Pipedream.DeployedTriggersListEventsRequest} request * @param {DeployedTriggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.deployedTriggers.listEvents("trigger_id", { * externalUserId: "external_user_id" @@ -490,11 +520,16 @@ export class DeployedTriggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -523,6 +558,8 @@ export class DeployedTriggers { * @param {Pipedream.DeployedTriggersListWorkflowsRequest} request * @param {DeployedTriggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.deployedTriggers.listWorkflows("trigger_id", { * externalUserId: "external_user_id" @@ -580,11 +617,16 @@ export class DeployedTriggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -613,6 +655,8 @@ export class DeployedTriggers { * @param {Pipedream.UpdateTriggerWorkflowsOpts} request * @param {DeployedTriggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.deployedTriggers.updateWorkflows("trigger_id", { * externalUserId: "external_user_id", @@ -677,11 +721,16 @@ export class DeployedTriggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -710,6 +759,8 @@ export class DeployedTriggers { * @param {Pipedream.DeployedTriggersListWebhooksRequest} request * @param {DeployedTriggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.deployedTriggers.listWebhooks("trigger_id", { * externalUserId: "external_user_id" @@ -767,11 +818,16 @@ export class DeployedTriggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -800,6 +856,8 @@ export class DeployedTriggers { * @param {Pipedream.UpdateTriggerWebhooksOpts} request * @param {DeployedTriggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.deployedTriggers.updateWebhooks("trigger_id", { * externalUserId: "external_user_id", @@ -864,11 +922,16 @@ export class DeployedTriggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { diff --git a/src/api/resources/oauthTokens/client/Client.ts b/src/api/resources/oauthTokens/client/Client.ts index a2ebfb7..e75a9d8 100644 --- a/src/api/resources/oauthTokens/client/Client.ts +++ b/src/api/resources/oauthTokens/client/Client.ts @@ -19,7 +19,7 @@ export declare namespace OauthTokens { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -34,7 +34,7 @@ export declare namespace OauthTokens { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } diff --git a/src/api/resources/projects/client/Client.ts b/src/api/resources/projects/client/Client.ts index 622a3b5..03f09ea 100644 --- a/src/api/resources/projects/client/Client.ts +++ b/src/api/resources/projects/client/Client.ts @@ -19,7 +19,7 @@ export declare namespace Projects { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -34,7 +34,7 @@ export declare namespace Projects { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } @@ -50,6 +50,8 @@ export class Projects { * * @param {Projects.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.projects.retrieveInfo() */ @@ -98,11 +100,16 @@ export class Projects { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { diff --git a/src/api/resources/tokens/client/Client.ts b/src/api/resources/tokens/client/Client.ts index f20603c..b745382 100644 --- a/src/api/resources/tokens/client/Client.ts +++ b/src/api/resources/tokens/client/Client.ts @@ -19,7 +19,7 @@ export declare namespace Tokens { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -34,7 +34,7 @@ export declare namespace Tokens { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } @@ -51,6 +51,8 @@ export class Tokens { * @param {Pipedream.CreateTokenOpts} request * @param {Tokens.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.tokens.create({ * externalUserId: "external_user_id" @@ -109,11 +111,16 @@ export class Tokens { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -142,6 +149,8 @@ export class Tokens { * @param {Pipedream.TokensValidateRequest} request * @param {Tokens.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.tokens.validate("ctok", { * appId: "app_id" @@ -203,11 +212,16 @@ export class Tokens { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { diff --git a/src/api/resources/triggers/client/Client.ts b/src/api/resources/triggers/client/Client.ts index 56b693d..c1c8386 100644 --- a/src/api/resources/triggers/client/Client.ts +++ b/src/api/resources/triggers/client/Client.ts @@ -19,7 +19,7 @@ export declare namespace Triggers { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -34,7 +34,7 @@ export declare namespace Triggers { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } @@ -51,6 +51,8 @@ export class Triggers { * @param {Pipedream.TriggersListRequest} request * @param {Triggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.triggers.list() */ @@ -115,11 +117,16 @@ export class Triggers { }; } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { case "non-json": @@ -160,6 +167,8 @@ export class Triggers { * @param {string} componentId - The key that uniquely identifies the component (e.g., 'slack-send-message') * @param {Triggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.triggers.retrieve("component_id") */ @@ -210,11 +219,16 @@ export class Triggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -242,6 +256,8 @@ export class Triggers { * @param {Pipedream.ConfigurePropOpts} request * @param {Triggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.triggers.configureProp({ * id: "id", @@ -302,11 +318,16 @@ export class Triggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -334,6 +355,8 @@ export class Triggers { * @param {Pipedream.ReloadPropsOpts} request * @param {Triggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.triggers.reloadProps({ * id: "id", @@ -393,11 +416,16 @@ export class Triggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { @@ -425,6 +453,8 @@ export class Triggers { * @param {Pipedream.DeployTriggerOpts} request * @param {Triggers.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.triggers.deploy({ * id: "id", @@ -484,11 +514,16 @@ export class Triggers { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { diff --git a/src/api/resources/users/client/Client.ts b/src/api/resources/users/client/Client.ts index e1c824e..f7d0a10 100644 --- a/src/api/resources/users/client/Client.ts +++ b/src/api/resources/users/client/Client.ts @@ -18,7 +18,7 @@ export declare namespace Users { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -33,7 +33,7 @@ export declare namespace Users { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } @@ -50,6 +50,8 @@ export class Users { * @param {string} externalUserId * @param {Users.RequestOptions} requestOptions - Request-specific configuration. * + * @throws {@link Pipedream.TooManyRequestsError} + * * @example * await client.users.deleteExternalUser("external_user_id") */ @@ -91,11 +93,16 @@ export class Users { } if (_response.error.reason === "status-code") { - throw new errors.PipedreamError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); + switch (_response.error.statusCode) { + case 429: + throw new Pipedream.TooManyRequestsError(_response.error.body, _response.rawResponse); + default: + throw new errors.PipedreamError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } } switch (_response.error.reason) { diff --git a/src/api/types/TooManyRequestsErrorBody.ts b/src/api/types/TooManyRequestsErrorBody.ts new file mode 100644 index 0000000..9106e80 --- /dev/null +++ b/src/api/types/TooManyRequestsErrorBody.ts @@ -0,0 +1,7 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface TooManyRequestsErrorBody { + error?: string; +} diff --git a/src/core/fetcher/Fetcher.ts b/src/core/fetcher/Fetcher.ts index 9e58ba7..39e6914 100644 --- a/src/core/fetcher/Fetcher.ts +++ b/src/core/fetcher/Fetcher.ts @@ -17,7 +17,7 @@ export declare namespace Fetcher { url: string; method: string; contentType?: string; - headers?: Record | undefined>; + headers?: Record | null | undefined>; queryParameters?: Record; body?: unknown; timeoutMs?: number; diff --git a/src/core/fetcher/requestWithRetries.ts b/src/core/fetcher/requestWithRetries.ts index add3cce..6728d33 100644 --- a/src/core/fetcher/requestWithRetries.ts +++ b/src/core/fetcher/requestWithRetries.ts @@ -9,6 +9,42 @@ function addJitter(delay: number): number { return delay * jitterMultiplier; } +function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { + // Check for Retry-After header first (RFC 7231) + const retryAfter = response.headers.get("Retry-After"); + if (retryAfter) { + // Parse as number of seconds... + const retryAfterSeconds = parseInt(retryAfter, 10); + if (!isNaN(retryAfterSeconds)) { + // Convert seconds to milliseconds and cap at MAX_RETRY_DELAY + return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); + } + + // ...or as an HTTP date; both are valid + const retryAfterDate = new Date(retryAfter); + if (!isNaN(retryAfterDate.getTime())) { + const delay = retryAfterDate.getTime() - Date.now(); + return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); + } + } + + // Then check for industry-standard X-RateLimit-Reset header + const rateLimitReset = response.headers.get("X-RateLimit-Reset"); + if (rateLimitReset) { + const resetTime = parseInt(rateLimitReset, 10); + if (!isNaN(resetTime)) { + // Assume Unix timestamp in epoch seconds + const delay = resetTime * 1000 - Date.now(); + if (delay > 0) { + return Math.min(delay, MAX_RETRY_DELAY); + } + } + } + + // Fall back to exponential backoff + return Math.min(INITIAL_RETRY_DELAY * Math.pow(2, retryAttempt), MAX_RETRY_DELAY); +} + export async function requestWithRetries( requestFn: () => Promise, maxRetries: number = DEFAULT_MAX_RETRIES, @@ -17,8 +53,8 @@ export async function requestWithRetries( for (let i = 0; i < maxRetries; ++i) { if ([408, 429].includes(response.status) || response.status >= 500) { - // Calculate base delay using exponential backoff (in milliseconds) - const baseDelay = Math.min(INITIAL_RETRY_DELAY * Math.pow(2, i), MAX_RETRY_DELAY); + // Get delay from headers or fall back to exponential backoff + const baseDelay = getRetryDelayFromHeaders(response, i); // Add jitter to the delay const delayWithJitter = addJitter(baseDelay); diff --git a/src/core/headers.ts b/src/core/headers.ts index 561314d..8583614 100644 --- a/src/core/headers.ts +++ b/src/core/headers.ts @@ -1,9 +1,13 @@ import * as core from "./index.js"; export function mergeHeaders( - ...headersArray: (Record | undefined> | undefined)[] -): Record> { - const result: Record> = {}; + ...headersArray: ( + | Record | null | undefined> + | null + | undefined + )[] +): Record> { + const result: Record> = {}; for (const [key, value] of headersArray .filter((headers) => headers != null) @@ -19,9 +23,13 @@ export function mergeHeaders( } export function mergeOnlyDefinedHeaders( - ...headersArray: (Record | undefined> | undefined)[] -): Record> { - const result: Record> = {}; + ...headersArray: ( + | Record | null | undefined> + | null + | undefined + )[] +): Record> { + const result: Record> = {}; for (const [key, value] of headersArray .filter((headers) => headers != null) diff --git a/src/serialization/types/TooManyRequestsErrorBody.ts b/src/serialization/types/TooManyRequestsErrorBody.ts new file mode 100644 index 0000000..a4b13a3 --- /dev/null +++ b/src/serialization/types/TooManyRequestsErrorBody.ts @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from "../index.js"; +import * as Pipedream from "../../api/index.js"; +import * as core from "../../core/index.js"; + +export const TooManyRequestsErrorBody: core.serialization.ObjectSchema< + serializers.TooManyRequestsErrorBody.Raw, + Pipedream.TooManyRequestsErrorBody +> = core.serialization.object({ + error: core.serialization.string().optional(), +}); + +export declare namespace TooManyRequestsErrorBody { + export interface Raw { + error?: string | null; + } +} diff --git a/src/serialization/types/index.ts b/src/serialization/types/index.ts index 6644b52..03a2afd 100644 --- a/src/serialization/types/index.ts +++ b/src/serialization/types/index.ts @@ -1,3 +1,4 @@ +export * from "./TooManyRequestsErrorBody.js"; export * from "./AccountId.js"; export * from "./Account.js"; export * from "./App.js"; diff --git a/src/version.ts b/src/version.ts index 478f50d..2412826 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const SDK_VERSION = "2.0.0"; +export const SDK_VERSION = "2.0.5"; diff --git a/tests/unit/fetcher/requestWithRetries.test.ts b/tests/unit/fetcher/requestWithRetries.test.ts index 3cdaa40..779f4fb 100644 --- a/tests/unit/fetcher/requestWithRetries.test.ts +++ b/tests/unit/fetcher/requestWithRetries.test.ts @@ -129,4 +129,107 @@ describe("requestWithRetries", () => { expect(response1.status).toBe(200); expect(response2.status).toBe(200); }); + + it("should respect retry-after header with seconds value", async () => { + setTimeoutSpy = jest.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": "5" }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await jest.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 5000); // 5 seconds = 5000ms + expect(response.status).toBe(200); + }); + + it("should respect retry-after header with HTTP date value", async () => { + setTimeoutSpy = jest.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const futureDate = new Date(Date.now() + 3000); // 3 seconds from now + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": futureDate.toUTCString() }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await jest.runAllTimersAsync(); + const response = await responsePromise; + + // Should use the date-based delay (approximately 3000ms, but with jitter) + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); + const actualDelay = setTimeoutSpy.mock.calls[0][1]; + expect(actualDelay).toBeGreaterThan(2000); + expect(actualDelay).toBeLessThan(4000); + expect(response.status).toBe(200); + }); + + it("should respect x-ratelimit-reset header", async () => { + setTimeoutSpy = jest.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const resetTime = Math.floor((Date.now() + 4000) / 1000); // 4 seconds from now in Unix timestamp + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "x-ratelimit-reset": resetTime.toString() }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await jest.runAllTimersAsync(); + const response = await responsePromise; + + // Should use the x-ratelimit-reset delay (approximately 4000ms, but with jitter) + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); + const actualDelay = setTimeoutSpy.mock.calls[0][1]; + expect(actualDelay).toBeGreaterThan(3000); + expect(actualDelay).toBeLessThan(5000); + expect(response.status).toBe(200); + }); + + it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { + setTimeoutSpy = jest.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await jest.runAllTimersAsync(); + const response = await responsePromise; + + // Should be capped at MAX_RETRY_DELAY (60000ms) with jitter applied + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); // Exactly MAX_RETRY_DELAY since jitter with 0.5 random keeps it at 60000 + expect(response.status).toBe(200); + }); }); diff --git a/yarn.lock b/yarn.lock index a29d76f..24884a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -284,22 +284,27 @@ dependencies: statuses "^2.0.1" +"@inquirer/ansi@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.0.tgz#29525c673caf36c12e719712830705b9c31f0462" + integrity sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA== + "@inquirer/confirm@^5.0.0": - version "5.1.16" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.16.tgz#4f99603e5c8a1b471b819343f708c75e8abd2b88" - integrity sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag== + version "5.1.18" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.18.tgz#0b76e5082d834c0e3528023705b867fc1222d535" + integrity sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw== dependencies: - "@inquirer/core" "^10.2.0" + "@inquirer/core" "^10.2.2" "@inquirer/type" "^3.0.8" -"@inquirer/core@^10.2.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.2.0.tgz#19ff527dbe0956891d825e320ecbc890bd6a1550" - integrity sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA== +"@inquirer/core@^10.2.2": + version "10.2.2" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.2.2.tgz#d31eb50ba0c76b26e7703c2c0d1d0518144c23ab" + integrity sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA== dependencies: + "@inquirer/ansi" "^1.0.0" "@inquirer/figures" "^1.0.13" "@inquirer/type" "^3.0.8" - ansi-escapes "^4.3.2" cli-width "^4.1.0" mute-stream "^2.0.0" signal-exit "^4.1.0" @@ -559,9 +564,9 @@ integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": - version "0.3.30" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz#4a76c4daeee5df09f5d3940e087442fb36ce2b99" - integrity sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q== + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -728,11 +733,11 @@ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/node@*": - version "24.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.3.1.tgz#b0a3fb2afed0ef98e8d7f06d46ef6349047709f3" - integrity sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g== + version "24.4.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.4.0.tgz#4ca9168c016a55ab15b7765ad1674ab807489600" + integrity sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ== dependencies: - undici-types "~7.10.0" + undici-types "~7.11.0" "@types/node@^18.19.70": version "18.19.124" @@ -960,7 +965,7 @@ ajv@^8.0.0, ajv@^8.9.0: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" -ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: +ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -1072,6 +1077,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +baseline-browser-mapping@^2.8.2: + version "2.8.4" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.4.tgz#e553e12272c4965682743705efd8b4b4cf0d709b" + integrity sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw== + brace-expansion@^1.1.7: version "1.1.12" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" @@ -1088,13 +1098,14 @@ braces@^3.0.3: fill-range "^7.1.1" browserslist@^4.24.0: - version "4.25.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.4.tgz#ebdd0e1d1cf3911834bab3a6cd7b917d9babf5af" - integrity sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg== - dependencies: - caniuse-lite "^1.0.30001737" - electron-to-chromium "^1.5.211" - node-releases "^2.0.19" + version "4.26.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.26.0.tgz#035ca84b4ff312a3c6a7014a77beb83456a882dd" + integrity sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A== + dependencies: + baseline-browser-mapping "^2.8.2" + caniuse-lite "^1.0.30001741" + electron-to-chromium "^1.5.218" + node-releases "^2.0.21" update-browserslist-db "^1.1.3" bs-logger@^0.2.6: @@ -1139,7 +1150,7 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001737: +caniuse-lite@^1.0.30001741: version "1.0.30001741" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz#67fb92953edc536442f3c9da74320774aa523143" integrity sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw== @@ -1284,9 +1295,9 @@ data-urls@^3.0.2: whatwg-url "^11.0.0" debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" @@ -1336,10 +1347,10 @@ dunder-proto@^1.0.1: es-errors "^1.3.0" gopd "^1.2.0" -electron-to-chromium@^1.5.211: - version "1.5.214" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.214.tgz#f7bbdc0796124292d4b8a34a49e968c5e6430763" - integrity sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q== +electron-to-chromium@^1.5.218: + version "1.5.218" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.218.tgz#921042a011a98a4620853c9d391ab62bcc124400" + integrity sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg== emittery@^0.13.1: version "0.13.1" @@ -1365,9 +1376,9 @@ entities@^6.0.0: integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + version "1.3.4" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" + integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== dependencies: is-arrayish "^0.2.1" @@ -2399,9 +2410,9 @@ ms@^2.1.3: integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== msw@^2.8.4: - version "2.11.1" - resolved "https://registry.yarnpkg.com/msw/-/msw-2.11.1.tgz#77f7c5c60ffd08e4bc351cca4608418db15e5ac2" - integrity sha512-dGSRx0AJmQVQfpGXTsAAq4JFdwdhOBdJ6sJS/jnN0ac3s0NZB6daacHF1z5Pefx+IejmvuiLWw260RlyQOf3sQ== + version "2.11.2" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.11.2.tgz#622d83855f456a5f93b1528f6eb6f4c0114623c3" + integrity sha512-MI54hLCsrMwiflkcqlgYYNJJddY5/+S0SnONvhv1owOplvqohKSQyGejpNdUGyCwgs4IH7PqaNbPw/sKOEze9Q== dependencies: "@bundled-es-modules/cookie" "^2.0.1" "@bundled-es-modules/statuses" "^1.0.1" @@ -2417,6 +2428,7 @@ msw@^2.8.4: outvariant "^1.4.3" path-to-regexp "^6.3.0" picocolors "^1.1.1" + rettime "^0.7.0" strict-event-emitter "^0.5.1" tough-cookie "^6.0.0" type-fest "^4.26.1" @@ -2442,10 +2454,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.19: - version "2.0.20" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.20.tgz#e26bb79dbdd1e64a146df389c699014c611cbc27" - integrity sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA== +node-releases@^2.0.21: + version "2.0.21" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.21.tgz#f59b018bc0048044be2d4c4c04e4c8b18160894c" + integrity sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw== normalize-path@^3.0.0: version "3.0.0" @@ -2670,6 +2682,11 @@ resolve@^1.20.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +rettime@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rettime/-/rettime-0.7.0.tgz#c040f1a65e396eaa4b8346dd96ed937edc79d96f" + integrity sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw== + safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -2892,17 +2909,17 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -tldts-core@^7.0.12: - version "7.0.12" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.12.tgz#b471e773dc23ff881a9d187ec145e36edde57c27" - integrity sha512-3K76aXywJFduGRsOYoY5JzINLs/WMlOkeDwPL+8OCPq2Rh39gkSDtWAxdJQlWjpun/xF/LHf29yqCi6VC/rHDA== +tldts-core@^7.0.14: + version "7.0.14" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.14.tgz#eb49edf8a39a37a2372ffc22f82d6ac725ace6cd" + integrity sha512-viZGNK6+NdluOJWwTO9olaugx0bkKhscIdriQQ+lNNhwitIKvb+SvhbYgnCz6j9p7dX3cJntt4agQAKMXLjJ5g== tldts@^7.0.5: - version "7.0.12" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.12.tgz#e11008e9a3f27448e7aecb8d0fa51f929ec9549d" - integrity sha512-M9ZQBPp6FyqhMcl233vHYyYRkxXOA1SKGlnq13S0mJdUhRSwr2w6I8rlchPL73wBwRlyIZpFvpu2VcdSMWLYXw== + version "7.0.14" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.14.tgz#5dc352e087c12978b7d1d36d8a346496e04dca72" + integrity sha512-lMNHE4aSI3LlkMUMicTmAG3tkkitjOQGDTFboPJwAg2kJXKP1ryWEyqujktg5qhrFZOkk5YFzgkxg3jErE+i5w== dependencies: - tldts-core "^7.0.12" + tldts-core "^7.0.14" tmpl@1.0.5: version "1.0.5" @@ -2941,9 +2958,9 @@ tr46@^3.0.0: punycode "^2.1.1" ts-jest@^29.3.4: - version "29.4.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.4.1.tgz#42d33beb74657751d315efb9a871fe99e3b9b519" - integrity sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw== + version "29.4.2" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.4.2.tgz#095fe8770df81f2e39f2c34a6bcafac58b834423" + integrity sha512-pBNOkn4HtuLpNrXTMVRC9b642CBaDnKqWXny4OzuoULT9S7Kf8MMlaRe2veKax12rjf5WcpMBhVPbQurlWGNxA== dependencies: bs-logger "^0.2.6" fast-json-stable-stringify "^2.1.0" @@ -2996,10 +3013,10 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici-types@~7.10.0: - version "7.10.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.10.0.tgz#4ac2e058ce56b462b056e629cc6a02393d3ff350" - integrity sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag== +undici-types@~7.11.0: + version "7.11.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.11.0.tgz#075798115d0bbc4e4fc7c173f38727ca66bfb592" + integrity sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA== universalify@^0.2.0: version "0.2.0" From c25151a59f3c9703c35fdab40868b7e4c4ec00ab Mon Sep 17 00:00:00 2001 From: Jay Vercellone Date: Mon, 15 Sep 2025 16:18:01 -0300 Subject: [PATCH 2/3] Fix build issues --- package.json | 43 ++++++++++++++++---- src/Client.ts | 4 +- src/api/resources/proxy/client/Client.ts | 10 ++--- src/api/resources/workflows/client/Client.ts | 4 +- src/api/types/index.ts | 1 + 5 files changed, 46 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 19ad67a..7b4cd3a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/sdk", - "version": "2.0.5", + "version": "2.0.4", "private": false, "repository": "github:PipedreamHQ/pipedream-sdk-typescript", "type": "commonjs", @@ -10,6 +10,11 @@ "exports": { ".": { "types": "./dist/cjs/index.d.ts", + "browser": { + "types": "./dist/esm/browser/index.d.mts", + "import": "./dist/esm/browser/index.mjs", + "default": "./dist/esm/browser/index.mjs" + }, "import": { "types": "./dist/esm/index.d.mts", "default": "./dist/esm/index.mjs" @@ -20,6 +25,18 @@ }, "default": "./dist/cjs/index.js" }, + "./browser": { + "types": "./dist/esm/browser/index.d.mts", + "import": { + "types": "./dist/esm/browser/index.d.mts", + "default": "./dist/esm/browser/index.mjs" + }, + "require": { + "types": "./dist/cjs/browser/index.d.ts", + "default": "./dist/cjs/browser/index.js" + }, + "default": "./dist/esm/browser/index.mjs" + }, "./serialization": { "types": "./dist/cjs/serialization/index.d.ts", "import": { @@ -32,6 +49,18 @@ }, "default": "./dist/cjs/serialization/index.js" }, + "./server": { + "types": "./dist/cjs/index.d.ts", + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "default": "./dist/cjs/index.js" + }, "./package.json": "./package.json" }, "files": [ @@ -51,17 +80,17 @@ "test:wire": "jest --selectProjects wire" }, "devDependencies": { - "webpack": "^5.97.1", - "ts-loader": "^9.5.1", - "jest": "^29.7.0", "@jest/globals": "^29.7.0", "@types/jest": "^29.5.14", - "ts-jest": "^29.3.4", + "@types/node": "^18.19.70", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "msw": "^2.8.4", - "@types/node": "^18.19.70", "prettier": "^3.4.2", - "typescript": "~5.7.2" + "ts-jest": "^29.3.4", + "ts-loader": "^9.5.1", + "typescript": "~5.7.2", + "webpack": "^5.97.1" }, "browser": { "fs": false, diff --git a/src/Client.ts b/src/Client.ts index 2e60cf5..42ccf5b 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -32,7 +32,7 @@ export declare namespace PipedreamClient { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -47,7 +47,7 @@ export declare namespace PipedreamClient { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } diff --git a/src/api/resources/proxy/client/Client.ts b/src/api/resources/proxy/client/Client.ts index 7bb4b38..b5f71bc 100644 --- a/src/api/resources/proxy/client/Client.ts +++ b/src/api/resources/proxy/client/Client.ts @@ -19,7 +19,7 @@ export declare namespace Proxy { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } export interface RequestOptions { @@ -32,7 +32,7 @@ export declare namespace Proxy { /** Override the x-pd-environment header */ projectEnvironment?: Pipedream.ProjectEnvironment | undefined; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } @@ -47,11 +47,11 @@ export class Proxy { * Transform headers by prefixing each key with 'x-pd-proxy-' */ private transformProxyHeaders( - headers?: Record | undefined>, - ): Record | undefined> | undefined { + headers?: Record | null | undefined>, + ): Record | null | undefined> | undefined { if (!headers) return undefined; - const transformed: Record | undefined> = {}; + const transformed: Record | null | undefined> = {}; for (const [key, value] of Object.entries(headers)) { transformed[`x-pd-proxy-${key}`] = value; } diff --git a/src/api/resources/workflows/client/Client.ts b/src/api/resources/workflows/client/Client.ts index 824a90b..5cc8bf1 100644 --- a/src/api/resources/workflows/client/Client.ts +++ b/src/api/resources/workflows/client/Client.ts @@ -18,7 +18,7 @@ export declare namespace Workflows { /** Override the x-pd-environment header */ projectEnvironment?: core.Supplier; /** Additional headers to include in requests. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; /** Base domain for workflows. Used for custom domains. */ workflowDomain?: string; } @@ -35,7 +35,7 @@ export declare namespace Workflows { /** Additional query string parameters to include in the request. */ queryParams?: Record; /** Additional headers to include in the request. */ - headers?: Record | undefined>; + headers?: Record | null | undefined>; } } diff --git a/src/api/types/index.ts b/src/api/types/index.ts index 6c170aa..53ae0a9 100644 --- a/src/api/types/index.ts +++ b/src/api/types/index.ts @@ -91,4 +91,5 @@ export * from "./StartConnectOpts.js"; export * from "./StashId.js"; export * from "./TimerCron.js"; export * from "./TimerInterval.js"; +export * from "./TooManyRequestsErrorBody.js"; export * from "./ValidateTokenResponse.js"; From 10989036124737ca055590a5c323953ccfb1bd46 Mon Sep 17 00:00:00 2001 From: Jay Vercellone Date: Mon, 15 Sep 2025 16:18:12 -0300 Subject: [PATCH 3/3] Revert package.json changes --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7b4cd3a..cf931b9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/sdk", - "version": "2.0.4", + "version": "2.0.5", "private": false, "repository": "github:PipedreamHQ/pipedream-sdk-typescript", "type": "commonjs",