UNPKG

caminho

Version:

Tool for creating efficient data pipelines in a JavaScript environment

146 lines 6.48 kB
import { __assign, __asyncGenerator, __asyncValues, __await, __awaiter, __generator } from "tslib"; import { sleep } from '../utils/sleep'; import { getNewValueBag } from '../utils/valueBag'; var SLEEP_FOR_BACKPRESSURE_MS = 10; export function wrapGenerator(generatorParams, loggers) { return function wrappedGenerator(initialBag) { return __asyncGenerator(this, arguments, function wrappedGenerator_1() { var bagArrayForLogger, isStart, startTime, _a, _b, _c, value, newValueBag, e_1_1, err_1; var _d, e_1, _e, _f; return __generator(this, function (_g) { switch (_g.label) { case 0: bagArrayForLogger = [initialBag]; loggers.onStepStarted(bagArrayForLogger); isStart = true; startTime = new Date(); _g.label = 1; case 1: _g.trys.push([1, 16, , 17]); _g.label = 2; case 2: _g.trys.push([2, 9, 10, 15]); _a = true, _b = __asyncValues(generatorParams.fn(initialBag)); _g.label = 3; case 3: return [4, __await(_b.next())]; case 4: if (!(_c = _g.sent(), _d = _c.done, !_d)) return [3, 8]; _f = _c.value; _a = false; value = _f; if (!isStart) { loggers.onStepStarted(bagArrayForLogger); } isStart = false; newValueBag = getNewValueBag(initialBag, generatorParams.provides, value); loggers.onStepFinished([newValueBag], startTime); return [4, __await(newValueBag)]; case 5: return [4, _g.sent()]; case 6: _g.sent(); startTime = new Date(); _g.label = 7; case 7: _a = true; return [3, 3]; case 8: return [3, 15]; case 9: e_1_1 = _g.sent(); e_1 = { error: e_1_1 }; return [3, 15]; case 10: _g.trys.push([10, , 13, 14]); if (!(!_a && !_d && (_e = _b.return))) return [3, 12]; return [4, __await(_e.call(_b))]; case 11: _g.sent(); _g.label = 12; case 12: return [3, 14]; case 13: if (e_1) throw e_1.error; return [7]; case 14: return [7]; case 15: return [3, 17]; case 16: err_1 = _g.sent(); loggers.onStepFinished([initialBag], startTime, err_1); throw err_1; case 17: return [2]; } }); }); }; } export function wrapGeneratorWithBackPressure(generatorParams, maxItemsFlowing, pendingDataControl, loggers) { var wrappedGenerator = wrapGenerator(generatorParams, loggers); return function wrappedGeneratorWithBackPressure(initialBag, runId) { return __asyncGenerator(this, arguments, function wrappedGeneratorWithBackPressure_1() { var _a, _b, _c, value, e_2_1; var _d, e_2, _e, _f; return __generator(this, function (_g) { switch (_g.label) { case 0: _g.trys.push([0, 8, 9, 14]); _a = true, _b = __asyncValues(wrappedGenerator(__assign({}, initialBag))); _g.label = 1; case 1: return [4, __await(_b.next())]; case 2: if (!(_c = _g.sent(), _d = _c.done, !_d)) return [3, 7]; _f = _c.value; _a = false; value = _f; pendingDataControl.increment(runId); return [4, __await(value)]; case 3: return [4, _g.sent()]; case 4: _g.sent(); if (!needsToWaitForBackpressure(pendingDataControl, maxItemsFlowing)) return [3, 6]; return [4, __await(waitOnBackpressure(maxItemsFlowing, pendingDataControl))]; case 5: _g.sent(); _g.label = 6; case 6: _a = true; return [3, 1]; case 7: return [3, 14]; case 8: e_2_1 = _g.sent(); e_2 = { error: e_2_1 }; return [3, 14]; case 9: _g.trys.push([9, , 12, 13]); if (!(!_a && !_d && (_e = _b.return))) return [3, 11]; return [4, __await(_e.call(_b))]; case 10: _g.sent(); _g.label = 11; case 11: return [3, 13]; case 12: if (e_2) throw e_2.error; return [7]; case 13: return [7]; case 14: return [2]; } }); }); }; } function needsToWaitForBackpressure(pendingDataControl, maxItemsFlowing) { return pendingDataControl.size >= maxItemsFlowing; } function waitOnBackpressure(maxItemsFlowing, pendingDataControl) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: if (!(pendingDataControl.size >= maxItemsFlowing)) return [3, 2]; return [4, sleep(SLEEP_FOR_BACKPRESSURE_MS)]; case 1: _a.sent(); return [3, 0]; case 2: return [2]; } }); }); } //# sourceMappingURL=generator.js.map