From 3a4f83db2c14831267fb4fa60fd286ed1e0e9dec Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 17 Jun 2025 11:43:59 +0530 Subject: [PATCH 1/4] Enhancement: Retry logic to make use of x-ratelimit-remaining header --- CHANGELOG.md | 3 +++ lib/core/concurrency-queue.js | 34 +++++++++++++++++++++++----------- package.json | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49d8b37..7364165 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ # Changelog +## [v1.3.0](https://github.com/contentstack/contentstack-marketplace-sdk/tree/v1.2.6) (2025-06-30) + - Enhancement: Retry logic to make use of x-ratelimit-remaining header + ## [v1.2.8](https://github.com/contentstack/contentstack-marketplace-sdk/tree/v1.2.6) (2024-05-26) - Fix: Added params support to getInstalledApps method for enhanced flexibility diff --git a/lib/core/concurrency-queue.js b/lib/core/concurrency-queue.js index 44be851..ecb58d1 100644 --- a/lib/core/concurrency-queue.js +++ b/lib/core/concurrency-queue.js @@ -202,19 +202,31 @@ export function ConcurrencyQueue ({ axios, config }) { } else { return Promise.reject(responseHandler(error)) } - } else if (response.status === 429 || (response.status === 401 && this.config.refreshToken)) { - retryErrorType = `Error with status: ${response.status}` - networkError++ + } else { + const rateLimitRemaining = response.headers['x-ratelimit-remaining'] + if (rateLimitRemaining !== undefined && parseInt(rateLimitRemaining) <= 0) { + // return Promise.reject(responseHandler(error)) - if (networkError > this.config.retryLimit) { - return Promise.reject(responseHandler(error)) + this.running.shift() + return delay(wait).then(() => { + error.config.retryCount = networkError++ + return axios(updateRequestConfig(error, 'Rate Limit Hit', wait)) + }) + } + if (response.status === 429 || (response.status === 401 && this.config.refreshToken)) { + retryErrorType = `Error with status: ${response.status}` + networkError++ + + if (networkError > this.config.retryLimit) { + return Promise.reject(responseHandler(error)) + } + this.running.shift() + // Cool down the running requests + delay(wait, response.status === 401) + error.config.retryCount = networkError + // deepcode ignore Ssrf: URL is dynamic + return axios(updateRequestConfig(error, retryErrorType, wait)) } - this.running.shift() - // Cool down the running requests - delay(wait, response.status === 401) - error.config.retryCount = networkError - // deepcode ignore Ssrf: URL is dynamic - return axios(updateRequestConfig(error, retryErrorType, wait)) } if (this.config.retryCondition && this.config.retryCondition(error)) { retryErrorType = error.response ? `Error with status: ${response.status}` : `Error Code:${error.code}` diff --git a/package.json b/package.json index 47412e7..71e7996 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/marketplace-sdk", - "version": "1.2.8", + "version": "1.3.0", "description": "The Contentstack Marketplace SDK is used to manage the content of your Contentstack marketplace apps", "main": "./dist/node/contentstack-marketplace.js", "browser": "./dist/web/contentstack-marketplace.js", From ab44c6678f828f6191505122c37d21f820478dd9 Mon Sep 17 00:00:00 2001 From: "harshitha.d" Date: Mon, 25 Aug 2025 12:39:06 +0530 Subject: [PATCH 2/4] Add SSRF protection comment for rate limit retry logic --- lib/core/concurrency-queue.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/core/concurrency-queue.js b/lib/core/concurrency-queue.js index ecb58d1..3601a4b 100644 --- a/lib/core/concurrency-queue.js +++ b/lib/core/concurrency-queue.js @@ -210,6 +210,7 @@ export function ConcurrencyQueue ({ axios, config }) { this.running.shift() return delay(wait).then(() => { error.config.retryCount = networkError++ + // deepcode ignore Ssrf: URL is dynamic return axios(updateRequestConfig(error, 'Rate Limit Hit', wait)) }) } From 2f9f2d2a66503658b21ca1a9d204d1fddf455363 Mon Sep 17 00:00:00 2001 From: "harshitha.d" Date: Mon, 25 Aug 2025 12:50:23 +0530 Subject: [PATCH 3/4] Bump version to 1.4.0 and update changelog for new features --- CHANGELOG.md | 5 ++++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9334a6a..69afe8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,12 @@ # Changelog -## [v1.3.0](https://github.com/contentstack/contentstack-marketplace-sdk/tree/v1.3.0) (2024-08-11) +## [v1.4.0](https://github.com/contentstack/contentstack-marketplace-sdk/tree/v1.3.0) (2024-08-25) - Enh: Add search function to query apps by names - Enhancement: Retry logic to make use of x-ratelimit-remaining header +## [v1.3.0](https://github.com/contentstack/contentstack-marketplace-sdk/tree/v1.3.0) (2024-08-11) + - Enhancement: Retry logic to make use of x-ratelimit-remaining header + ## [v1.2.9](https://github.com/contentstack/contentstack-marketplace-sdk/tree/v1.2.9) (2024-08-04) - Fix: Fixed the Linting issues - Updated all the dependency to the latest version diff --git a/package-lock.json b/package-lock.json index ac6c774..c8f3942 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@contentstack/marketplace-sdk", - "version": "1.3.0", + "version": "1.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@contentstack/marketplace-sdk", - "version": "1.3.0", + "version": "1.4.0", "license": "MIT", "dependencies": { "axios": "^1.11.0" diff --git a/package.json b/package.json index 7752afc..297c631 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/marketplace-sdk", - "version": "1.3.0", + "version": "1.4.0", "description": "The Contentstack Marketplace SDK is used to manage the content of your Contentstack marketplace apps", "main": "./dist/node/contentstack-marketplace.js", "browser": "./dist/web/contentstack-marketplace.js", From 498883c1cb2d9befc33e5bfff571da84fd0f8957 Mon Sep 17 00:00:00 2001 From: "harshitha.d" Date: Mon, 25 Aug 2025 15:29:00 +0530 Subject: [PATCH 4/4] update changeLog --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69afe8d..3ed6fc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,10 @@ # Changelog ## [v1.4.0](https://github.com/contentstack/contentstack-marketplace-sdk/tree/v1.3.0) (2024-08-25) - - Enh: Add search function to query apps by names - Enhancement: Retry logic to make use of x-ratelimit-remaining header ## [v1.3.0](https://github.com/contentstack/contentstack-marketplace-sdk/tree/v1.3.0) (2024-08-11) - - Enhancement: Retry logic to make use of x-ratelimit-remaining header + - Enh: Add search function to query apps by names ## [v1.2.9](https://github.com/contentstack/contentstack-marketplace-sdk/tree/v1.2.9) (2024-08-04) - Fix: Fixed the Linting issues