wsmini
Version:
Minimalist WebSocket client and server for real-time applications with RPC, PubSub, Rooms and Game state synchronization.
61 lines (51 loc) • 1.54 kB
JavaScript
export default {
mixinEvent() {
this.listeners = new Map();
},
on(event, callback) {
return this.addListener(event, callback);
},
once(event, callback) {
const callbackOnce = data => {
this.removeListener(event, callbackOnce);
callback(data);
}
this.addListener(event, callbackOnce);
return () => this.removeListener(event, callbackOnce);
},
hasListener(event) {
return this.listeners.has(event) && this.listeners.get(event).size > 0;
},
addListener(event, callback) {
let callbackSet = this.listeners.get(event);
if (!callbackSet) {
callbackSet = new Set();
this.listeners.set(event, callbackSet);
}
callbackSet.add(callback);
// Return a removeListener function for conveniance
return () => this.removeListener(event, callback);
},
off(event, callback) {
this.removeListener(event, callback);
},
clear(event) {
this.listeners.delete(event);
},
removeListener(event, callback) {
const callbackSet = this.listeners.get(event);
if (!callbackSet) return false;
callbackSet.delete(callback);
return true;
},
emit(event, data = {}) {
const callbackSet = this.listeners.get(event);
if (!callbackSet) return;
// we need to copy the set to avoid concurrency issues
// because callback might add or remove listeners
const toCalls = [...callbackSet];
for (const callback of toCalls) {
callback(data);
}
}
};