rx-synchronizer
Version:
Commonly-used synchronizer bases that can be composed into more specific purposes.
68 lines • 4.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var javascriptutilities_1 = require("javascriptutilities");
var rx_utilities_js_1 = require("rx-utilities-js");
var rxjs_1 = require("rxjs");
var operators_1 = require("rxjs/operators");
var ProgressSync = require("./progress");
var sync_util_1 = require("./sync-util");
var deepEqual = require("deep-equal");
var Impl = /** @class */ (function () {
function Impl(progressSync) {
this.progressSync = progressSync || new ProgressSync.Impl();
this.subscription = new rxjs_1.Subscription();
}
Impl.prototype.synchronize = function (dependency) {
var subscription = this.subscription;
var validateStartedStream = dependency.paramStream.pipe((function () {
if (dependency.allowDuplicateParams) {
return function (v) { return v; };
}
return function (v) {
return v.pipe(operators_1.distinctUntilChanged(function (v1, v2) {
return deepEqual(v1.value, v2.value);
}));
};
})(), operators_1.map(function (v) {
return v.map(function (v1) {
var validated = dependency.validateParam(v1);
if (validated instanceof rxjs_1.Observable) {
return validated.pipe(operators_1.map(function (errors) { return [v1, errors]; }));
}
return rxjs_1.of([v1, validated]);
});
}), operators_1.observeOn(dependency.resultReceiptScheduler || rxjs_1.asapScheduler), operators_1.share());
var validateCompletedStream = validateStartedStream.pipe(operators_1.switchMap(function (v) {
try {
return v.getOrThrow().pipe(operators_1.map(function (v1) { return javascriptutilities_1.Try.success(v1); }), rx_utilities_js_1.catchJustReturn(function (e) { return javascriptutilities_1.Try.failure(e); }));
}
catch (e) {
return rxjs_1.of(javascriptutilities_1.Try.failure(e));
}
}), operators_1.share());
var argumentFailStream = validateCompletedStream.pipe(rx_utilities_js_1.mapNonNilOrEmpty(function (v) { return v.error; }), operators_1.share());
var validateFailStream = validateCompletedStream.pipe(rx_utilities_js_1.mapNonNilOrEmpty(function (_a) {
var value = _a.value;
return value;
}), operators_1.filter(function (v) { return v[1].length > 0; }), operators_1.map(function (v) { return v[1]; }), operators_1.share());
var modifyStream = validateCompletedStream.pipe(rx_utilities_js_1.mapNonNilOrEmpty(function (v) { return v.value; }), operators_1.filter(function (v) { return v[1].length === 0; }), operators_1.map(function (v) { return v[0]; }), operators_1.map(function (v) {
return sync_util_1.createObservable(dependency.modifyWithParam(v)).pipe(operators_1.map(function (v2) { return javascriptutilities_1.Try.success(v2); }), rx_utilities_js_1.catchJustReturn(function (e) { return javascriptutilities_1.Try.failure(e); }));
}), operators_1.share());
var modifyCompletedStream = modifyStream.pipe(operators_1.switchMap(function (v) { return v; }), operators_1.share());
this.progressSync.synchronize({
progressReceiver: dependency.progressReceiver,
progressStartStream: validateStartedStream.pipe(operators_1.map(function () { return true; })),
progressEndStream: rxjs_1.merge(argumentFailStream, validateFailStream, modifyCompletedStream).pipe(operators_1.map(function () { return false; })),
stopStream: dependency.stopStream
});
subscription.add(modifyCompletedStream
.pipe(rx_utilities_js_1.mapNonNilOrEmpty(function (v) { return v.value; }), operators_1.takeUntil(dependency.stopStream))
.subscribe(dependency.resultReceiver));
subscription.add(rxjs_1.merge(argumentFailStream, validateFailStream.pipe(rx_utilities_js_1.flatMapIterable(function (v) { return v; })), modifyCompletedStream.pipe(rx_utilities_js_1.mapNonNilOrEmpty(function (v) { return v.error; })))
.pipe(operators_1.takeUntil(dependency.stopStream))
.subscribe(dependency.errorReceiver));
};
return Impl;
}());
exports.Impl = Impl;
//# sourceMappingURL=modify.js.map