@soketi/soketi-js
Version:
Laravel Echo extension that works with Soketi, a Laravel-ready WebSockets service.
80 lines (79 loc) • 2.48 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SocketIoChannel = void 0;
const util_1 = require("../util");
const channel_1 = require("./channel");
class SocketIoChannel extends channel_1.Channel {
constructor(socket, name, options) {
super();
this.events = {};
this.listeners = {};
this.name = name;
this.socket = socket;
this.options = options;
this.eventFormatter = new util_1.EventFormatter(this.options.namespace);
this.subscribe();
}
subscribe() {
this.socket.emit('subscribe', {
channel: this.name,
auth: this.options.auth || {},
});
}
unsubscribe() {
this.unbind();
this.socket.emit('unsubscribe', {
channel: this.name,
auth: this.options.auth || {},
});
}
listen(event, callback) {
this.on(this.eventFormatter.format(event), callback);
return this;
}
stopListening(event, callback) {
this.unbindEvent(this.eventFormatter.format(event), callback);
return this;
}
subscribed(callback) {
this.on('connect', (socket) => {
callback(socket);
});
return this;
}
error(callback) {
return this;
}
on(event, callback) {
this.listeners[event] = this.listeners[event] || [];
if (!this.events[event]) {
this.events[event] = (channel, data) => {
if (this.name === channel && this.listeners[event]) {
this.listeners[event].forEach((cb) => cb(data));
}
};
this.socket.on(event, this.events[event]);
}
this.listeners[event].push(callback);
return this;
}
unbind() {
Object.keys(this.events).forEach((event) => {
this.unbindEvent(event);
});
}
unbindEvent(event, callback) {
this.listeners[event] = this.listeners[event] || [];
if (callback) {
this.listeners[event] = this.listeners[event].filter((cb) => cb !== callback);
}
if (!callback || this.listeners[event].length === 0) {
if (this.events[event]) {
this.socket.removeListener(event, this.events[event]);
delete this.events[event];
}
delete this.listeners[event];
}
}
}
exports.SocketIoChannel = SocketIoChannel;