@noggin/elastic-noggin-sdk
Version:
Elastic Noggin SDK
77 lines (76 loc) • 4.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getProcessStatus = exports.startProcess = void 0;
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const EnoFactory_1 = require("./EnoFactory");
const send_1 = require("./send");
const error_1 = require("./error");
const DefaultRetryDelayMs = 5000;
const DefaultRetryAttempts = 20;
const DefaultTimeoutMs = 60000;
const OpTimeoutBufferMs = 3000;
const MinOpTimeoutMs = 1000;
const MaxOpTimeoutMs = 20000;
const SessionInitTimeoutMs = 10000;
function startProcess(tip, enSrvOptions, processOptions = {}) {
const enoFactory = new EnoFactory_1.EnoFactory("op/process", "security/policy/op");
enoFactory.setField("op/process/process", [tip]);
enoFactory.setField("op/process/inline-vars", [
JSON.stringify(processOptions.inputVars || {}),
]);
const processOp = enoFactory.makeEno();
let attemptsRemaining = processOptions.retryAttempts || DefaultRetryAttempts;
let checkResponse$;
checkResponse$ = (processResponse) => {
if (processResponse.isFinished || !processOptions.waitForFinish) {
return (0, rxjs_1.of)(processResponse);
}
if (attemptsRemaining-- > 0) {
return getProcessStatus(processOp.tip, enSrvOptions).pipe((0, operators_1.delay)(processOptions.retryDelayMs || DefaultRetryDelayMs), (0, operators_1.switchMap)(checkResponse$));
}
throw new Error("Too many attempts waiting for process to finish");
};
const timeoutMs = processOptions.timeoutMs || DefaultTimeoutMs;
const opProcessTimeoutMs = Math.min(MaxOpTimeoutMs, Math.max(MinOpTimeoutMs, timeoutMs - OpTimeoutBufferMs));
const hasExistingSession = !!enSrvOptions.sessionToken;
const originalMaintainInitialSessionToken = enSrvOptions.maintainInitialSessionToken;
enSrvOptions.maintainInitialSessionToken = true;
const createProcessObservable = () => (0, send_1.send)([processOp], enSrvOptions).pipe((0, operators_1.timeout)(opProcessTimeoutMs), (0, operators_1.map)((batch) => makeProcessResponseFromBatch(processOp.tip, batch)), (0, operators_1.catchError)(() => getProcessStatus(processOp.tip, enSrvOptions)), (0, operators_1.switchMap)(checkResponse$), (0, operators_1.timeout)(timeoutMs), (0, operators_1.finalize)(() => {
enSrvOptions.maintainInitialSessionToken = originalMaintainInitialSessionToken;
}));
if (hasExistingSession) {
return createProcessObservable();
}
return (0, send_1.send)([], enSrvOptions).pipe((0, operators_1.timeout)(SessionInitTimeoutMs), (0, operators_1.catchError)(() => {
return (0, rxjs_1.of)(null);
}), (0, operators_1.switchMap)(() => createProcessObservable()));
}
exports.startProcess = startProcess;
function getProcessStatus(processOpTip, enSrvOptions) {
const statusOptions = Object.assign({}, enSrvOptions);
if (statusOptions.initialSessionToken) {
statusOptions.sessionToken = statusOptions.initialSessionToken;
}
const enoFactory = new EnoFactory_1.EnoFactory("op/process/status", "security/policy/op");
enoFactory.setField("op/process/status:op-tip", [processOpTip]);
const statusOpEno = enoFactory.makeEno();
return (0, send_1.send)([statusOpEno], statusOptions).pipe((0, operators_1.map)((batch) => makeProcessResponseFromBatch(processOpTip, batch)));
}
exports.getProcessStatus = getProcessStatus;
function makeProcessResponseFromBatch(processOpTip, batch) {
(0, error_1.checkBatchForError)(batch);
for (let i = 0; i < batch.length; i++) {
const eno = batch[i];
if (eno.getType() === "response/process" &&
eno.getFieldStringValue("response/process/op-tip") === processOpTip) {
return {
operationTip: processOpTip,
responseTip: eno.tip,
outputVars: eno.getFieldJsonValue("response/process/inline-vars"),
isFinished: eno.getFieldBooleanValue("response/process/finished"),
};
}
}
throw new Error("error/message/server/internal");
}