UNPKG

@soketi/soketi-js

Version:

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

83 lines (82 loc) 2.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SoketiChannel = void 0; const _1 = require("./"); const util_1 = require("../../echo/src/util"); class SoketiChannel extends _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); if (this.socket.connected) { this.subscribe(); } this.socket.on('connect', socket => 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.SoketiChannel = SoketiChannel;