co-share
Version:
A Javascript framework for easily building shared applications such as chats and games
158 lines • 7.16 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.takeOneOptional = exports.catchFunction = exports.Request = void 0;
var rxjs_1 = require("rxjs");
var operators_1 = require("rxjs/operators");
var action_1 = require("./action");
function createUnboundRequest(identifier, execute, multipleResponses) {
if (multipleResponses === void 0) { multipleResponses = false; }
var responseNextSubject = new rxjs_1.Subject();
var responseCompleteSubject = new rxjs_1.Subject();
var responseErrorSubject = new rxjs_1.Subject();
var cancelSubject = new rxjs_1.Subject();
var responseNextActionName = "next_".concat(identifier);
var responseErrorActionName = "error_".concat(identifier);
var responseCompleteActionName = "complete_".concat(identifier);
var requestActionName = "request_".concat(identifier);
var cancelActionName = "cancel_".concat(identifier);
var responseNextAction = action_1.Action.createUnbound(responseNextActionName, function (origin) {
var params = [];
for (var _i = 1; _i < arguments.length; _i++) {
params[_i - 1] = arguments[_i];
}
return responseNextSubject.next(params);
});
var responseErrorAction = action_1.Action.createUnbound(responseErrorActionName, function (origin) {
var params = [];
for (var _i = 1; _i < arguments.length; _i++) {
params[_i - 1] = arguments[_i];
}
return responseErrorSubject.next(params);
});
var responseCompleteAction = action_1.Action.createUnbound(responseCompleteActionName, function (origin, id) {
return responseCompleteSubject.next(id);
});
var forwardFrom = catchFunction.bind(undefined, execute);
var requestAction = action_1.Action.createUnbound(requestActionName, function (origin, id) {
var params = [];
for (var _i = 2; _i < arguments.length; _i++) {
params[_i - 2] = arguments[_i];
}
if (origin != null) {
forwardFrom.apply(void 0, __spreadArray([this, origin], params, false)).pipe(takeOneOptional(!multipleResponses), (0, operators_1.tap)(function (next) { return responseNextAction.publishTo([origin], id, next); }, function (error) { return responseErrorAction.publishTo([origin], id, error); }, function () {
if (multipleResponses) {
responseCompleteAction.publishTo([origin], id);
}
}), (0, operators_1.catchError)(function () { return rxjs_1.EMPTY; }), (0, operators_1.takeUntil)(cancelSubject.pipe((0, operators_1.filter)(function (reqId) { return reqId === id; }))))
.subscribe();
}
});
var cancelAction = action_1.Action.createUnbound(cancelActionName, function (origin, id) { return cancelSubject.next(id); });
var publishTo = function (target) {
var params = [];
for (var _i = 1; _i < arguments.length; _i++) {
params[_i - 1] = arguments[_i];
}
return new rxjs_1.Observable(function (subscriber) {
var id = Math.round(Math.random() * Number.MAX_SAFE_INTEGER);
var filterId = (0, operators_1.filter)(function (_a) {
var observableId = _a[0];
return observableId === id;
});
var hasEnded = false;
var subscription = new rxjs_1.Subscription();
subscription.add(responseNextSubject
.pipe(filterId, (0, operators_1.tap)(function (_a) {
var observableId = _a[0], next = _a[1];
if (multipleResponses) {
subscriber.next(next);
}
else {
hasEnded = true;
subscriber.next(next);
subscriber.complete();
}
}), takeOneOptional(!multipleResponses))
.subscribe());
subscription.add(responseErrorSubject
.pipe(filterId, (0, operators_1.tap)(function (_a) {
var observableId = _a[0], error = _a[1];
hasEnded = true;
subscriber.error(error);
}))
.subscribe());
subscription.add(responseCompleteSubject
.pipe((0, operators_1.filter)(function (observableId) { return observableId === id; }), (0, operators_1.tap)(function () {
hasEnded = true;
subscriber.complete();
}))
.subscribe());
requestAction.publishTo.apply(requestAction, __spreadArray([[target], id], params, false));
return function () {
subscription.unsubscribe();
if (!hasEnded) {
cancelAction.publishTo([target], id);
}
};
});
};
return {
execute: execute,
forwardFrom: forwardFrom,
publishTo: publishTo,
bindTo: bindRequest.bind(undefined, execute, publishTo, forwardFrom, responseNextAction, responseErrorAction, responseCompleteAction, requestAction, cancelAction),
};
}
var createRequest = function (store, identifier, execute, multipleResponses, overwrite) {
if (multipleResponses === void 0) { multipleResponses = false; }
if (overwrite === void 0) { overwrite = false; }
return createUnboundRequest(identifier, execute, multipleResponses).bindTo(store, overwrite);
};
function bindRequest(execute, publishTo, forwardFrom, responseNextAction, responseErrorAction, responseCompleteAction, requestAction, cancelAction, store, overwrite) {
if (overwrite === void 0) { overwrite = false; }
responseNextAction.bindTo(store, overwrite);
responseErrorAction.bindTo(store, overwrite);
responseCompleteAction.bindTo(store, overwrite);
requestAction.bindTo(store, overwrite);
cancelAction.bindTo(store, overwrite);
return Object.assign(execute.bind(store, undefined), {
publishTo: publishTo,
forwardFrom: forwardFrom.bind(undefined, store),
});
}
exports.Request = {
create: createRequest,
createUnbound: createUnboundRequest,
};
function catchFunction(fn, store, origin) {
var params = [];
for (var _i = 3; _i < arguments.length; _i++) {
params[_i - 3] = arguments[_i];
}
try {
return fn.apply(store, __spreadArray([origin], params, true));
}
catch (error) {
return (0, rxjs_1.throwError)(error);
}
}
exports.catchFunction = catchFunction;
function takeOneOptional(takeOne) {
if (takeOne) {
return (0, operators_1.take)(1);
}
else {
return function (val) { return val; };
}
}
exports.takeOneOptional = takeOneOptional;
//# sourceMappingURL=request.js.map