UNPKG

pusher-js

Version:

Pusher Channels JavaScript library for browsers, React Native, NodeJS and web workers

76 lines (65 loc) 1.8 kB
import Callback from './callback'; import * as Collections from '../utils/collections'; import CallbackTable from './callback_table'; export default class CallbackRegistry { _callbacks: CallbackTable; constructor() { this._callbacks = {}; } get(name: string): Callback[] { return this._callbacks[prefix(name)]; } add(name: string, callback: Function, context: any) { var prefixedEventName = prefix(name); this._callbacks[prefixedEventName] = this._callbacks[prefixedEventName] || []; this._callbacks[prefixedEventName].push({ fn: callback, context: context }); } remove(name?: string, callback?: Function, context?: any) { if (!name && !callback && !context) { this._callbacks = {}; return; } var names = name ? [prefix(name)] : Collections.keys(this._callbacks); if (callback || context) { this.removeCallback(names, callback, context); } else { this.removeAllCallbacks(names); } } private removeCallback(names: string[], callback: Function, context: any) { Collections.apply( names, function(name) { this._callbacks[name] = Collections.filter( this._callbacks[name] || [], function(binding) { return ( (callback && callback !== binding.fn) || (context && context !== binding.context) ); } ); if (this._callbacks[name].length === 0) { delete this._callbacks[name]; } }, this ); } private removeAllCallbacks(names: string[]) { Collections.apply( names, function(name) { delete this._callbacks[name]; }, this ); } } function prefix(name: string): string { return '_' + name; }