UNPKG

@fromjs/backend

Version:
63 lines (62 loc) 2.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const core_1 = require("@fromjs/core"); const fixOffByOneTraversalError_1 = require("./fixOffByOneTraversalError"); async function traverse(step, steps = [], server, options) { const { optimistic } = options; return new Promise(async (resolve, reject) => { let nextStep = null; let { operationLog, charIndex } = step; try { operationLog = await server.loadLogAwaitable(operationLog, 2); } catch (err) { reject(err); } const alreadyHasOptimisticStep = steps.some((st) => !!st.isOptimistic); const stepIsOptimisitc = step.isOptimistic || alreadyHasOptimisticStep; steps.push(Object.assign(Object.assign({}, step), { isOptimistic: stepIsOptimisitc, operationLog })); if (steps.length > 2000) { throw Error("Too many steps"); } const operation = core_1.operations[operationLog.operation]; if (operation && operation.traverse) { try { nextStep = operation.traverse(operationLog, charIndex, options); } catch (err) { console.log(JSON.stringify(operationLog)); console.log("traverse err", operationLog.operation, err); } } if (nextStep && typeof nextStep.operationLog === "number") { try { nextStep.operationLog = await server.loadLogAwaitable(nextStep.operationLog, 2); } catch (err) { reject(err); } } const hasEmptyStepResult = nextStep && nextStep.operationLog && nextStep.operationLog.result.primitive === ""; if (nextStep && nextStep.operationLog && !hasEmptyStepResult) { fixOffByOneTraversalError_1.fixOffByOneTraversalError(step, nextStep); traverse(nextStep, steps, server, options) .then(() => { resolve(steps); }) .catch((err) => { console.log(err); resolve(steps); }); } else { if (hasEmptyStepResult) { console.log("hmm need to look into this... still traversing but step result is empty"); } resolve(steps); } }); } exports.traverse = traverse;