UNPKG

co-share

Version:

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

158 lines 7.16 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.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