UNPKG

@kamil.michalak/laravel-echo-server

Version:
122 lines (121 loc) 5.06 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PresenceChannel = void 0; var database_1 = require("./../database"); var log_1 = require("./../log"); var os_1 = require("os"); 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.getMembersAll = function (channel) { return this.db.getAll(channel + ":members"); }; PresenceChannel.prototype.isMember = function (channel, member) { var _this = this; return new Promise(function (resolve, reject) { _this.getMembersAll(channel).then(function (members) { _this.removeInactive(channel, members, member).then(function (members) { resolve(members.find(function (m) { return m.user_id == member.user_id; })); }); }, 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) .clients(function (error, clients) { members = members || []; members = members.filter(function (member) { return clients.indexOf(member.socketId) >= 0; }); _this.db.set(channel + ":members", members); resolve(members); }); }); }; PresenceChannel.prototype.join = function (socket, channel, member) { var _this = this; if (!member) { if (this.options.devMode) { log_1.Log.error("Unable to join channel. Member data for presence channel missing"); } return; } var hostName = os_1.hostname(); this.isMember(channel, member).then(function (is_member) { _this.getMembersAll(channel).then(function (members) { members = members || []; member.socketId = socket.id; member.hostName = hostName; members.push(member); _this.db.set(channel + ":members", members.filter(function (i) { return i.hostName === hostName; })); 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) { if (this.options.databaseConfig.publishPresence === true) { this.db.publish(channel, JSON.stringify({ event: "presence:joining", socket: socket.id, data: member })); this.db.publish('PresenceChannelUpdated', JSON.stringify({ "channel": channel, "members": member })); } else { this.io.sockets.connected[socket.id].broadcast .to(channel) .emit("presence:joining", channel, member); } }; PresenceChannel.prototype.onLeave = function (channel, member) { if (this.options.databaseConfig.publishPresence === true) { this.db.publish(channel, JSON.stringify({ event: "presence:leaving", data: member })); } else { this.io.to(channel).emit("presence:leaving", channel, member); } }; PresenceChannel.prototype.onSubscribed = function (socket, channel, members) { this.io.to(socket.id).emit("presence:subscribed", channel, members); }; return PresenceChannel; }()); exports.PresenceChannel = PresenceChannel;