UNPKG

co-share

Version:

A Javascript framework for easily building shared applications such as chats and games

88 lines 3.51 kB
"use strict"; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Store = exports.UnsubscribeAction = exports.LogAction = void 0; var rxjs_1 = require("rxjs"); var operators_1 = require("rxjs/operators"); var action_1 = require("./action"); exports.LogAction = action_1.Action.createUnbound("log", function (origin, log) { console.log(this, origin, log); }); exports.UnsubscribeAction = action_1.Action.createUnbound("unsubscribe", function (origin) { if (origin == null) { throw "can't execute unsubscribe locally"; } origin.close(); }); var Store = /** @class */ (function () { function Store() { this.actionMap = new Map(); this.log = exports.LogAction.bindTo(this); this.unsubscribe = exports.UnsubscribeAction.bindTo(this); this.linkSet = new Set(); } Object.defineProperty(Store.prototype, "mainLink", { get: function () { if (this.linkSet.size === 1) { return this.linkSet.values().next().value; } throw "unable to find exact one store link in the root store. If you have mutliple connections simulatenously, there is no 'main' link"; }, enumerable: false, configurable: true }); Store.prototype.link = function (id, connection) { var _this = this; var onDisconnect = new rxjs_1.Subject(); var storeLink = { id: id, connection: connection, close: function () { return onDisconnect.next(); }, publish: function (actionName) { var params = []; for (var _i = 1; _i < arguments.length; _i++) { params[_i - 1] = arguments[_i]; } return connection.publish.apply(connection, __spreadArray([id, actionName], params, false)); }, }; this.linkSet.add(storeLink); this.onLink(storeLink); connection .receive() .pipe((0, operators_1.takeUntil)(onDisconnect), (0, operators_1.filter)(function (_a) { var _id = _a[0]; return id === _id; }), (0, operators_1.tap)(function (_a) { var actionName = _a[1], params = _a.slice(2); var action = _this.actionMap.get(actionName); if (action != null) { try { action.forwardFrom.apply(action, __spreadArray([storeLink], params, false)); } catch (error) { _this.log.publishTo({ to: "one", one: storeLink }, "error occured when executing ".concat(actionName, ": ").concat(error)); } } else { _this.log.publishTo({ to: "one", one: storeLink }, "unkown action ".concat(actionName)); } }), (0, operators_1.finalize)(function () { _this.linkSet.delete(storeLink); _this.onUnlink(storeLink); })) .subscribe(); return storeLink; }; return Store; }()); exports.Store = Store; //# sourceMappingURL=store.js.map