mysql-live
Version:
Brings the server.publish and client.subscribe for live updates on mysql database. The only one Live Collections.
162 lines (161 loc) • 7.38 kB
JavaScript
var node_mysql_wrapper_1 = require("node-mysql-wrapper");
var _ = require("lodash");
var LiveStore = (function () {
function LiveStore(handler) {
this.handler = handler;
this.publications = {};
this.subscriptions = {};
}
LiveStore.prototype.isFindCursor = function (cursor) {
return '__find__' in cursor;
};
LiveStore.prototype.isProcedureCursor = function (cursor) {
return '__procedure__' in cursor;
};
LiveStore.prototype.registerPublication = function (publicationName, subscriptionCb) {
this.publications[publicationName] = subscriptionCb;
};
LiveStore.prototype.registerSubscriptions = function (socketId, subscriptionName) {
var _this = this;
var clientArgs = [];
for (var _i = 2; _i < arguments.length; _i++) {
clientArgs[_i - 2] = arguments[_i];
}
var subs = [];
if (this.publications[subscriptionName] === undefined) {
console.log(subscriptionName + ' has not found into publications!!');
return undefined;
}
var _publication = this.publications[subscriptionName];
var cursors;
if (_.isFunction(_publication)) {
var foundCursorOrMany = (_a = _publication).call.apply(_a, [this.handler.getSocket(socketId)].concat(clientArgs));
if (!_.isArray(foundCursorOrMany)) {
cursors = [foundCursorOrMany];
}
else {
cursors = foundCursorOrMany;
}
}
else if (_.isArray(_publication) && _publication[0]["collectionName"] !== undefined) {
cursors = _publication;
}
else if (_publication["collectionName"] !== undefined && _publication["criteria"] !== undefined) {
cursors = [_publication];
}
else if (_.isArray(_publication) && _publication[0]["table"] !== undefined && _publication[0]["name"] !== undefined) {
cursors = [];
_publication.forEach(function (col) {
cursors.push(col.find());
});
}
else if (_publication["table"] !== undefined && _publication["name"] !== undefined) {
cursors = [_publication.find()];
}
else if (this.isProcedureCursor(_publication)) {
cursors = [_publication];
}
else if (_.isArray(_publication) && this.isProcedureCursor(_publication[0])) {
cursors = _publication;
}
if (cursors.length > 0) {
this.subscriptions[subscriptionName] = [];
}
cursors.forEach(function (cursor, index) {
if (_this.isFindCursor(cursor)) {
if (cursor.criteria === undefined) {
subs.push({ name: subscriptionName, subscriber: socketId, cursor: cursor });
}
else {
var subscription = { name: subscriptionName, subscriber: socketId, cursor: cursor };
if (_this.subscriptions[subscriptionName] === undefined)
_this.subscriptions[subscriptionName] = [];
var alreadyExistsSub = _.find(_this.subscriptions[subscriptionName], function (sub) {
if (sub.cursor !== undefined) {
if (_this.isFindCursor(sub.cursor)) {
return sub.cursor.collectionName === subscription.cursor.collectionName && sub.subscriber === socketId;
}
else {
}
}
return false;
});
if (alreadyExistsSub !== undefined) {
subscription.cursor.criteria = alreadyExistsSub.cursor.criteria;
}
else {
_this.subscriptions[subscriptionName].push(subscription);
}
subs.push(subscription);
}
}
else if (_this.isProcedureCursor(cursor)) {
var subscription = { name: subscriptionName, subscriber: socketId, cursor: cursor };
var alreadyExistsSub = _.find(_this.subscriptions[subscriptionName], function (sub) {
if (sub.cursor !== undefined) {
if (_this.isProcedureCursor(sub.cursor)) {
return sub.cursor.name === subscription.cursor.name && sub.subscriber === socketId;
}
else {
}
}
return false;
});
if (alreadyExistsSub === undefined) {
_this.subscriptions[subscriptionName].push(subscription);
}
subs.push(subscription);
}
});
return subs;
var _a;
};
LiveStore.prototype.getSubscriptionsByCollection = function (collectionName) {
var _this = this;
var subs = [];
node_mysql_wrapper_1.Helper.forEachKey(this.subscriptions, function (subscriptionName) {
_this.subscriptions[subscriptionName].forEach(function (sub) {
if (_this.isFindCursor(sub.cursor)) {
if (sub.cursor.collectionName === collectionName) {
subs.push(sub);
}
}
});
});
return subs;
};
LiveStore.prototype.getSubscriptionsByProcedure = function (procedureName) {
var _this = this;
var subs = [];
node_mysql_wrapper_1.Helper.forEachKey(this.subscriptions, function (subscriptionName) {
_this.subscriptions[subscriptionName].forEach(function (sub) {
if (_this.isProcedureCursor(sub.cursor)) {
if (sub.cursor.name === procedureName) {
subs.push(sub);
}
}
});
});
return subs;
};
LiveStore.prototype.getSubscriptionByCollectionAndSubscriber = function (socketId, collectionName) {
return _.find(this.getSubscriptionsByCollection(collectionName), function (sub) { return sub.subscriber === socketId; });
};
LiveStore.prototype.removeAllSubscriptionsBySubscriber = function (socketId) {
var _this = this;
node_mysql_wrapper_1.Helper.forEachKey(this.subscriptions, function (subscriptionName) {
_.remove(_this.subscriptions[subscriptionName], function (sub) { return sub.subscriber === socketId; });
});
};
LiveStore.prototype.removeSubscriptionByNameAndSubscriber = function (socketId, subscriptionName) {
_.remove(this.subscriptions[subscriptionName], function (sub) { return sub.subscriber === socketId; });
};
LiveStore.prototype.isSubscribedToCollection = function (socketId, collectionName) {
return this.getSubscriptionByCollectionAndSubscriber(socketId, collectionName) !== undefined;
};
LiveStore.prototype.isSubscribedTo = function (socketId, subscriptionName) {
return _.find(this.subscriptions[subscriptionName], function (sub) { return sub.subscriber === socketId; }) !== undefined;
};
return LiveStore;
})();
exports.LiveStore = LiveStore;