diff --git a/src/libs/Pusher/pusher.ts b/src/libs/Pusher/pusher.ts index 48c5e5c1409f..11aa2b9000d9 100644 --- a/src/libs/Pusher/pusher.ts +++ b/src/libs/Pusher/pusher.ts @@ -72,6 +72,8 @@ let pusherSocketID = ''; const socketEventCallbacks: SocketEventCallback[] = []; let customAuthorizer: ChannelAuthorizerGenerator; +const eventsBoundToChannels = new Map>(); + /** * Trigger each of the socket event callbacks with the event information */ @@ -153,7 +155,7 @@ function getChannel(channelName: string): Channel | undefined { * Binds an event callback to a channel + eventName */ function bindEventToChannel(channel: Channel | undefined, eventName: EventName, eventCallback: (data: EventData) => void = () => {}) { - if (!eventName) { + if (!eventName || !channel) { return; } @@ -213,7 +215,11 @@ function bindEventToChannel(channel: Channel } }; - channel?.bind(eventName, callback); + channel.bind(eventName, callback); + if (!eventsBoundToChannels.has(channel)) { + eventsBoundToChannels.set(channel, new Set()); + } + eventsBoundToChannels.get(channel)?.add(eventName); } /** @@ -288,6 +294,12 @@ function unsubscribe(channelName: string, eventName: PusherEventName = '') { if (eventName) { Log.info('[Pusher] Unbinding event', false, {eventName, channelName}); channel.unbind(eventName); + eventsBoundToChannels.get(channel)?.delete(eventName); + if (eventsBoundToChannels.get(channel)?.size === 0) { + Log.info(`[Pusher] After unbinding ${eventName} from channel ${channelName}, no other events were bound to that channel. Unsubscribing...`, false); + eventsBoundToChannels.delete(channel); + socket?.unsubscribe(channelName); + } } else { if (!channel.subscribed) { Log.info('Pusher] Attempted to unsubscribe from channel, but we are not subscribed to begin with', false, {channelName});