From daba0768ca71bd507aae9371ee578ed4c6b605d2 Mon Sep 17 00:00:00 2001 From: Alan Johnson Date: Tue, 7 Jan 2025 16:15:56 -0500 Subject: [PATCH] add option to skip punsubscribe call --- src/redis-pubsub.ts | 8 +++++++- src/test/tests.ts | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/redis-pubsub.ts b/src/redis-pubsub.ts index 6e25e4f..716ec10 100644 --- a/src/redis-pubsub.ts +++ b/src/redis-pubsub.ts @@ -17,6 +17,7 @@ export interface PubSubRedisOptions { deserializer?: Deserializer; messageEventName?: string; pmessageEventName?: string; + skipPunsubscribe?: boolean; } export class RedisPubSub implements PubSubEngine { @@ -33,6 +34,7 @@ export class RedisPubSub implements PubSubEngine { deserializer, messageEventName = 'message', pmessageEventName = 'pmessage', + skipPunsubscribe = false, } = options; this.triggerTransform = triggerTransform || (trigger => trigger as string); @@ -44,6 +46,7 @@ export class RedisPubSub implements PubSubEngine { this.reviver = reviver; this.serializer = serializer; this.deserializer = deserializer; + this.skipPunsubscribe = skipPunsubscribe; if (subscriber && publisher) { this.redisPublisher = publisher; @@ -159,7 +162,9 @@ export class RedisPubSub implements PubSubEngine { if (refs.size === 1) { // unsubscribe from specific channel and pattern match this.redisSubscriber.unsubscribe(triggerName); - this.redisSubscriber.punsubscribe(triggerName); + if (!this.skipPunsubscribe) { + this.redisSubscriber.punsubscribe(triggerName); + } this.subsRefsMap.delete(triggerName); } else { @@ -197,6 +202,7 @@ export class RedisPubSub implements PubSubEngine { private readonly redisSubscriber: RedisClient; private readonly redisPublisher: RedisClient; private readonly reviver: Reviver; + private readonly skipPunsubscribe: boolean; private readonly subscriptionMap: { [subId: number]: [string, OnMessage] }; private readonly subsRefsMap: Map>; diff --git a/src/test/tests.ts b/src/test/tests.ts index 759b6b0..ba28ce7 100644 --- a/src/test/tests.ts +++ b/src/test/tests.ts @@ -117,6 +117,26 @@ describe('RedisPubSub', () => { }); }); + it('skips punsubscribe when skipPunsubscribe is set to true', done => { + const pubSub = new RedisPubSub({...mockOptions, skipPunsubscribe: true}); + pubSub.subscribe('Posts', () => null).then(subId => { + pubSub.unsubscribe(subId); + + try { + + expect(unsubscribeSpy.callCount).to.equals(1); + expect(unsubscribeSpy.lastCall.args).to.have.members(['Posts']); + + expect(punsubscribeSpy.callCount).to.equals(0); + + done(); + + } catch (e) { + done(e); + } + }); + }); + it('cleans up correctly the memory when unsubscribing', done => { const pubSub = new RedisPubSub(mockOptions); Promise.all([