UNPKG

@soketi/soketi-js

Version:

Laravel Echo extension that works with Soketi, a Laravel-ready WebSockets service.

80 lines (79 loc) 2.48 kB
"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;