UNPKG

@abdopr/fixed-laravel-echo-server

Version:

Fixed version of laravel-echo-server (update socket.io version, with other features)

102 lines (101 loc) 4.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PresenceChannel = void 0; var database_1 = require("./../database"); var log_1 = require("./../log"); var _ = require("lodash"); var PresenceChannel = (function () { function PresenceChannel(io, options) { this.io = io; this.options = options; this.db = new database_1.Database(options); } PresenceChannel.prototype.getMembers = function (channel) { return this.db.get(channel + ":members"); }; PresenceChannel.prototype.isMember = function (channel, member) { var _this = this; return new Promise(function (resolve, reject) { _this.getMembers(channel).then(function (members) { _this.removeInactive(channel, members, member).then(function (members) { var search = members.filter(function (m) { return m.user_id == member.user_i; }); if (search && search.length) resolve(true); resolve(false); }); }, function (error) { return log_1.Log.error(error); }); }); }; PresenceChannel.prototype.removeInactive = function (channel, members, member) { var _this = this; return new Promise(function (resolve, reject) { _this.io.of("/").in(channel).fetchSockets().then(function (clients) { members = members || []; members = members.filter(function (member) { return clients.find(function (client) { return client.id == member.socketId; }) != null; }); _this.db.set(channel + ":members", members); resolve(members); }); }); }; PresenceChannel.prototype.join = function (socket, channel, member) { var _this = this; log_1.Log.info("".concat(socket.id, " - ").concat(member, " - Joining to presence channel ").concat(channel), true); if (!member) { if (this.options.devMode) log_1.Log.error("Unable to join channel. Member data for presence channel missing"); return; } this.isMember(channel, member).then(function (is_member) { _this.getMembers(channel).then(function (members) { members = members || []; member.socketId = socket.id; members.push(member); _this.db.set(channel + ":members", members); members = _.uniqBy(members.reverse(), "user_id"); _this.onSubscribed(socket, channel, members); if (!is_member) { _this.onJoin(socket, channel, member); } }, function (error) { return log_1.Log.error(error); }); }, function () { log_1.Log.error("Error retrieving pressence channel members."); }); }; PresenceChannel.prototype.leave = function (socket, channel) { var _this = this; this.getMembers(channel).then(function (members) { members = members || []; var member = members.find(function (member) { return member.socketId == socket.id; }); members = members.filter(function (m) { return m.socketId != member.socketId; }); _this.db.set(channel + ":members", members); _this.isMember(channel, member).then(function (is_member) { if (!is_member) { delete member.socketId; _this.onLeave(channel, member); } }); }, function (error) { return log_1.Log.error(error); }); }; PresenceChannel.prototype.onJoin = function (socket, channel, member) { this.options.echoServer.broadcast(channel, { socket: socket.id, event: "presence:joining", data: member, }); }; PresenceChannel.prototype.onLeave = function (channel, member) { this.options.echoServer.broadcast(channel, { event: "presence:leaving", data: member, }); }; PresenceChannel.prototype.onSubscribed = function (socket, channel, members) { this.options.echoServer.broadcast(channel, { socket: socket.id, event: "presence:subscribed", data: members, }); }; return PresenceChannel; }()); exports.PresenceChannel = PresenceChannel;