@rxx/worker
Version:
React MVI micro framework.
178 lines (177 loc) • 7.93 kB
JavaScript
"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;