UNPKG

stream-chat

Version:

JS SDK for the Stream Chat API

66 lines (57 loc) 1.75 kB
import type { Unsubscribe } from '../store'; /** * @private * Class to use as a template for subscribable entities. */ export abstract class WithSubscriptions { private unsubscribeFunctions: Set<Unsubscribe> = new Set(); /** * Workaround for the missing TS keyword - ensures that inheritants * overriding `unregisterSubscriptions` call the base method and return * its unique symbol value. */ protected static symbol = Symbol(WithSubscriptions.name); private refCount = 0; public abstract registerSubscriptions(): void; /** * Returns a boolean, provides information of whether `registerSubscriptions` * method has already been called for this instance. */ public get hasSubscriptions() { return this.unsubscribeFunctions.size > 0; } protected addUnsubscribeFunction(unsubscribeFunction: Unsubscribe) { this.unsubscribeFunctions.add(unsubscribeFunction); } /** * Increments `refCount` by one and returns new value. */ protected incrementRefCount() { return ++this.refCount; } /** * If you re-declare `unregisterSubscriptions` method within your class * make sure to run the original too. * * @example * ```ts * class T extends WithSubscriptions { * ... * public unregisterSubscriptions = () => { * this.customThing(); * return super.unregisterSubscriptions(); * } * } * ``` */ public unregisterSubscriptions(): typeof WithSubscriptions.symbol { if (this.refCount > 1) { this.refCount--; return WithSubscriptions.symbol; } this.unsubscribeFunctions.forEach((unsubscribe) => unsubscribe()); this.unsubscribeFunctions.clear(); this.refCount = 0; return WithSubscriptions.symbol; } }