UNPKG

@noggin/elastic-noggin-sdk

Version:
77 lines (76 loc) 4.11 kB
"use strict"; 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"); }