diff --git a/src/classes/queue-getters.ts b/src/classes/queue-getters.ts index 98548bcc2b..f3ac230876 100644 --- a/src/classes/queue-getters.ts +++ b/src/classes/queue-getters.ts @@ -105,6 +105,17 @@ export class QueueGetters< return count; } + /** + * Returns the time to live for a rate limited key in milliseconds. + * @returns -2 if the key does not exist. + * @returns -1 if the key exists but has no associated expire. + * @see {@link https://redis.io/commands/pttl/} + */ + async getRateLimitTtl(): Promise { + const client = await this.client; + return client.pttl(this.keys.limiter); + } + /** * Job counts by type * diff --git a/tests/test_rate_limiter.ts b/tests/test_rate_limiter.ts index 23afc09665..700097f5d3 100644 --- a/tests/test_rate_limiter.ts +++ b/tests/test_rate_limiter.ts @@ -330,11 +330,17 @@ describe('Rate Limiter', function () { const duration = 100; const margin = 0.95; // 5% margin for CI + const ttl = await queue.getRateLimitTtl(); + expect(ttl).to.be.equal(-2); + const worker = new Worker( queueName, async job => { if (job.attemptsMade === 1) { await worker.rateLimit(dynamicLimit); + const currentTtl = await queue.getRateLimitTtl(); + expect(currentTtl).to.be.lessThanOrEqual(250); + expect(currentTtl).to.be.greaterThan(100); throw Worker.RateLimitError(); } },