co-share
Version:
A Javascript framework for easily building shared applications such as chats and games
88 lines • 3.51 kB
JavaScript
;
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