pusher-js
Version:
Pusher JavaScript library for browser, React Native, NodeJS and web workers
65 lines (54 loc) • 1.71 kB
text/typescript
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;
}