caminho
Version:
Tool for creating efficient data pipelines in a JavaScript environment
146 lines • 6.48 kB
JavaScript
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