nesquirk
Version:
Ties Nes + minimongo together for gloryful reactive apps.
165 lines (127 loc) • 5.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Server = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _ejson = require('ejson');
var _ejson2 = _interopRequireDefault(_ejson);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var filterYes = function filterYes(path, message, options, next) {
return next(true);
};
var Server = exports.Server = function () {
function Server(server) {
_classCallCheck(this, Server);
this._server = server;
}
_createClass(Server, [{
key: 'subscription',
value: function subscription(path, opts, onSubscribe) {
var _this = this;
if (!onSubscribe) {
onSubscribe = opts;
opts = {};
}
opts = opts || {};
var _onSubscribe = opts.onSubscribe || function (socket, path, params, next) {
return next();
};
opts.onSubscribe = function (socket, path, params, next) {
// console.log('onSubscribe', path, params)
_onSubscribe(socket, path, params, function (err) {
if (err) return next(err);
var onReady = function onReady(err, data) {
if (err && err instanceof Error) return next(err);
data = _ejson2.default.stringify(_this._stringifyObjectIds(err || data || []));
socket.publish(path, { msg: 'ready', data: data }, next);
};
if (onSubscribe) {
onSubscribe(socket, path, params, onReady);
} else {
onReady();
}
});
};
opts.filter = this._createFilter(opts.filter);
this._server.subscription(path, opts);
return this;
}
}, {
key: '_createFilter',
value: function _createFilter(filter) {
var _this2 = this;
if (typeof filter === 'function') return filter;
filter = ['ready', 'added', 'updated', 'removed'].reduce(function (f, type) {
f[type] = filter && filter[type] || filterYes;
return f;
}, {});
return function (path, message, options, next) {
filter[message.msg](path, options.internal.__data, options, function (isMatch, override) {
if (!isMatch) return next(false, override);
if (override === undefined) return next(true);
// Otherwise we have to clone the message and stringify the overridden data
var msg = _extends({}, message);
if (message.msg === 'removed') {
override = Array.isArray(override) ? override.map(function (id) {
return id.toString();
}) : override.toString();
} else {
override = _this2._stringifyObjectIds(override);
}
msg.data = _ejson2.default.stringify(override);
next(true, msg);
});
};
}
}, {
key: '_stringifyObjectIds',
value: function _stringifyObjectIds(data) {
return Array.isArray(data) ? data.map(function (d) {
return d && d._id ? _extends({}, d, { _id: d._id.toString() }) : d;
}) : data && data._id ? _extends({}, data, { _id: data._id.toString() }) : data;
}
}, {
key: 'add',
value: function add(path) {
var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var opts = arguments[2];
opts = opts || {};
opts.internal = opts.internal || {};
opts.internal.__data = data;
data = _ejson2.default.stringify(this._stringifyObjectIds(data));
this._server.publish(path, { msg: 'added', data: data }, opts);
return this;
}
}, {
key: 'update',
value: function update(path) {
var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var opts = arguments[2];
opts = opts || {};
opts.internal = opts.internal || {};
opts.internal.__data = data;
data = _ejson2.default.stringify(this._stringifyObjectIds(data));
this._server.publish(path, { msg: 'updated', data: data }, opts);
return this;
}
}, {
key: 'remove',
value: function remove(path) {
var ids = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var opts = arguments[2];
opts = opts || {};
opts.internal = opts.internal || {};
opts.internal.__data = ids;
ids = Array.isArray(ids) ? ids.map(function (id) {
return id.toString();
}) : ids.toString();
var data = _ejson2.default.stringify(ids);
this._server.publish(path, { msg: 'removed', data: data }, opts);
return this;
}
}]);
return Server;
}();