@kamil.michalak/laravel-echo-server
Version:
Laravel Echo Node JS Server for Socket.io
122 lines (121 loc) • 5.06 kB
JavaScript
;
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;