diff --git a/CHANGELOG.md b/CHANGELOG.md index 13e1c417..cd7b92d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ # Changelog + +## [v1.21.6](https://github.com/contentstack/contentstack-management-javascript/tree/v1.21.6) (2025-06-11) + - Fix + - Revert Retry Logic modification on x-ratelimit-remaining Header + ## [v1.21.5](https://github.com/contentstack/contentstack-management-javascript/tree/v1.21.5) (2025-06-09) - Enhancement - Preview token support added diff --git a/lib/core/concurrency-queue.js b/lib/core/concurrency-queue.js index 247184bd..8c6ee14e 100644 --- a/lib/core/concurrency-queue.js +++ b/lib/core/concurrency-queue.js @@ -245,26 +245,19 @@ export function ConcurrencyQueue ({ axios, config }) { } else { return Promise.reject(responseHandler(error)) } - } else { - const rateLimitRemaining = response.headers['x-ratelimit-remaining'] - if (rateLimitRemaining !== undefined && parseInt(rateLimitRemaining) <= 0) { - return Promise.reject(responseHandler(error)) - } - - if ((response.status === 401 && this.config.refreshToken)) { - retryErrorType = `Error with status: ${response.status}` - networkError++ + } else if ((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)) + 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)) } if (this.config.retryCondition && this.config.retryCondition(error)) { retryErrorType = error.response ? `Error with status: ${response.status}` : `Error Code:${error.code}` diff --git a/package-lock.json b/package-lock.json index 15c34fe4..dca00a45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@contentstack/management", - "version": "1.21.5", + "version": "1.21.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@contentstack/management", - "version": "1.21.5", + "version": "1.21.6", "license": "MIT", "dependencies": { "assert": "^2.1.0", diff --git a/package.json b/package.json index 2d302a11..a5fe22ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/management", - "version": "1.21.5", + "version": "1.21.6", "description": "The Content Management API is used to manage the content of your Contentstack account", "main": "./dist/node/contentstack-management.js", "browser": "./dist/web/contentstack-management.js", diff --git a/test/unit/concurrency-Queue-test.js b/test/unit/concurrency-Queue-test.js index f90e85c2..de3e2197 100644 --- a/test/unit/concurrency-Queue-test.js +++ b/test/unit/concurrency-Queue-test.js @@ -506,76 +506,6 @@ describe('Concurrency queue test', () => { }) .catch(done) }) - - it('should not retry when rate limit remaining is 0', done => { - const mock = new MockAdapter(api) - mock.onGet('/ratelimit').reply(429, { errorCode: 429 }, { - 'x-ratelimit-remaining': '0' - }) - - reconfigureQueue({ - retryOnError: true, - retryLimit: 3, - retryDelay: 300 - }) - - api.get('/ratelimit') - .catch(error => { - expect(error.response.status).to.equal(429) - expect(error.config.retryCount).to.equal(0) // Should not have retried - expect(logHandlerStub.callCount).to.equal(0) // No retry logs - mock.restore() - done() - }) - }) - - it('should retry when rate limit remaining is greater than 0', done => { - const mock = new MockAdapter(api) - mock.onGet('/ratelimit').reply(429, { errorCode: 429 }, { - 'x-ratelimit-remaining': '5' - }) - mock.onGet('/ratelimit').reply(200, { success: true }) - - reconfigureQueue({ - retryOnError: true, - retryLimit: 3, - retryDelay: 300 - }) - - api.get('/ratelimit') - .then(response => { - /* eslint-disable no-unused-expressions */ - expect(response.status).to.equal(200) - expect(response.data.success).to.be.true - /* eslint-enable no-unused-expressions */ - mock.restore() - done() - }) - .catch(done) - }) - - it('should retry when rate limit remaining header is not present', done => { - const mock = new MockAdapter(api) - mock.onGet('/ratelimit').reply(429, { errorCode: 429 }) - mock.onGet('/ratelimit').reply(200, { success: true }) - - reconfigureQueue({ - retryOnError: true, - retryLimit: 3, - retryDelay: 300 - }) - - api.get('/ratelimit') - .then(response => { - /* eslint-disable no-unused-expressions */ - expect(response.status).to.equal(200) - expect(response.data.success).to.be.true - /* eslint-enable no-unused-expressions */ - mock.restore() - done() - }) - .catch(done) - }) }) function makeConcurrencyQueue (config) {