@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
JavaScript
;
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;