From ffdc7b508bb6e9b8ec8ffd6fc1885f68877d28c1 Mon Sep 17 00:00:00 2001 From: Raashish Aggarwal <94279692+raashish1601@users.noreply.github.com> Date: Fri, 15 May 2026 23:18:09 +0530 Subject: [PATCH] feat(sentinel): emit lifecycle events --- packages/client/lib/sentinel/index.ts | 17 +++++++++--- .../lib/sentinel/lifecycle-events.spec.ts | 26 +++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 packages/client/lib/sentinel/lifecycle-events.spec.ts diff --git a/packages/client/lib/sentinel/index.ts b/packages/client/lib/sentinel/index.ts index ccb16cc0f8..34638d3ab6 100644 --- a/packages/client/lib/sentinel/index.ts +++ b/packages/client/lib/sentinel/index.ts @@ -446,6 +446,9 @@ export default class RedisSentinel< this._self.#reservedClientInfo = await this._self.#internal.getClientLease(); } + this.emit('connect'); + this.emit('ready'); + return this as unknown as RedisSentinelType; } @@ -537,11 +540,19 @@ export default class RedisSentinel< multi = this.MULTI; async close() { - return this._self.#internal.close(); + const wasOpen = this._self.isOpen; + await this._self.#internal.close(); + if (wasOpen) { + this.emit('end'); + } } - destroy() { - return this._self.#internal.destroy(); + async destroy() { + const wasOpen = this._self.isOpen; + await this._self.#internal.destroy(); + if (wasOpen) { + this.emit('end'); + } } async SUBSCRIBE( diff --git a/packages/client/lib/sentinel/lifecycle-events.spec.ts b/packages/client/lib/sentinel/lifecycle-events.spec.ts new file mode 100644 index 0000000000..6b0ac75bea --- /dev/null +++ b/packages/client/lib/sentinel/lifecycle-events.spec.ts @@ -0,0 +1,26 @@ +import { strict as assert } from 'node:assert'; +import { once } from 'node:events'; +import testUtils, { GLOBAL } from '../test-utils'; + +describe('RedisSentinel lifecycle events', () => { + testUtils.testWithClientSentinel('should emit connect, ready and end events', async sentinel => { + const events: string[] = []; + + sentinel + .on('connect', () => events.push('connect')) + .on('ready', () => events.push('ready')) + .on('end', () => events.push('end')); + + await sentinel.connect(); + assert.deepEqual(events, ['connect', 'ready']); + + const endPromise = once(sentinel, 'end'); + await sentinel.close(); + await endPromise; + + assert.deepEqual(events, ['connect', 'ready', 'end']); + }, { + ...GLOBAL.SENTINEL.OPEN, + disableClientSetup: true + }); +});