UNPKG

@rxx/worker

Version:

React MVI micro framework.

178 lines (177 loc) 7.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var rxjs_1 = require("rxjs"); var utils_1 = require("../utils"); var isPromise = function (p) { return !!p && !!p.then; }; var isAggregate = function (p) { return !!p && !!p.aggregate; }; function unwrapValue(value, callback, errorBack) { return tslib_1.__awaiter(this, void 0, void 0, function () { var ret, _a, e_1; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: _b.trys.push([0, 8, , 9]); if (!(value instanceof rxjs_1.Observable)) return [3, 3]; return [4, value.toPromise()]; case 1: ret = _b.sent(); return [4, unwrapValue(ret, callback, errorBack)]; case 2: _b.sent(); return [3, 7]; case 3: if (!isPromise(value)) return [3, 6]; _a = unwrapValue; return [4, value]; case 4: return [4, _a.apply(void 0, [_b.sent(), callback, errorBack])]; case 5: _b.sent(); return [3, 7]; case 6: if (utils_1.isDefined(value)) { callback(value); } _b.label = 7; case 7: return [3, 9]; case 8: e_1 = _b.sent(); errorBack(e_1); return [3, 9]; case 9: return [2]; } }); }); } var LockableQueuedBuffer = (function () { function LockableQueuedBuffer() { this._isLocked = false; this.buffer = []; } LockableQueuedBuffer.prototype.try = function (fn) { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { if (this._isLocked) { this.buffer.push(fn); } else { this.run(fn); } return [2]; }); }); }; LockableQueuedBuffer.prototype.drain = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var next; return tslib_1.__generator(this, function (_a) { this._isLocked = false; next = this.buffer.shift(); if (next) { this.run(next); } return [2]; }); }); }; LockableQueuedBuffer.prototype.run = function (fn) { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: this._isLocked = true; return [4, fn()]; case 1: _a.sent(); return [4, this.drain()]; case 2: _a.sent(); return [2]; } }); }); }; return LockableQueuedBuffer; }()); function flatScan(handler, initial, options) { var _this = this; return function (observable) { return rxjs_1.Observable.create(function (subscriber) { var subscription; var lastValue = initial; var bufferingConfig; var isBuffering = false; var timer; var serialQueue = new LockableQueuedBuffer(); if (options) { bufferingConfig = options.bufferingConfig; } unwrapValue(initial || {}, function (initial) { subscription = observable.subscribe(function (value) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var bufferingTime, handleValue; var _this = this; return tslib_1.__generator(this, function (_a) { bufferingTime = 0; if (bufferingConfig) { bufferingTime = bufferingConfig(value); } handleValue = function (value) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var returnValue, e_2; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); returnValue = handler(lastValue, value); if (!returnValue) { return [2]; } return [4, unwrapValue(returnValue, function (unwrapedValue) { if (isAggregate(unwrapedValue)) { return handleValue(unwrapedValue); } lastValue = unwrapedValue; if (isBuffering) { return; } if (bufferingConfig) { if (bufferingTime) { isBuffering = true; timer = setTimeout(function () { isBuffering = false; subscriber.next(lastValue); }, bufferingTime); } else { clearTimeout(timer); subscriber.next(unwrapedValue); } } else { subscriber.next(unwrapedValue); } }, function (e) { return console.error(e); })]; case 1: _a.sent(); return [3, 3]; case 2: e_2 = _a.sent(); console.error(e_2); return [3, 3]; case 3: return [2]; } }); }); }; serialQueue.try(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { return [2, handleValue(value)]; }); }); }); return [2]; }); }); }, function (error) { return console.error(error); }); }, function (e) { return console.error(e); }); return function () { return subscription && subscription.unsubscribe(); }; }); }; } exports.flatScan = flatScan;