@fromjs/backend
Version:
63 lines (62 loc) • 2.43 kB
JavaScript
;
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;