envio
Version:
A latency and sync speed optimized, developer friendly blockchain data indexer.
69 lines (61 loc) • 2.01 kB
JavaScript
// Generated by ReScript, PLEASE EDIT WITH CARE
import * as Logging from "./Logging.res.mjs";
import * as Process from "process";
import * as GlobalState from "./GlobalState.res.mjs";
import * as ErrorHandling from "./ErrorHandling.res.mjs";
import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
function make(state, reducers, onErrorOpt) {
let onError = onErrorOpt !== undefined ? onErrorOpt : e => {
ErrorHandling.log(ErrorHandling.make(e, undefined, "Indexer has failed with an unexpected error"));
Process.exit(1);
};
return {
state: state,
onError: onError,
reducers: reducers
};
}
function dispatchAction(stateIdOpt, self, action) {
let stateId = stateIdOpt !== undefined ? stateIdOpt : 0;
try {
let reducer = stateId === GlobalState.getId(self.state) ? self.reducers.actionReducer : self.reducers.invalidatedActionReducer;
let match = reducer(self.state, action);
self.state = match[0];
match[1].forEach(task => dispatchTask(self, task));
return;
} catch (raw_e) {
return self.onError(Primitive_exceptions.internalToException(raw_e));
}
}
function dispatchTask(self, task) {
let stateId = GlobalState.getId(self.state);
setImmediate(() => {
if (stateId !== GlobalState.getId(self.state)) {
return Logging.info("Invalidated task discarded");
}
try {
Stdlib_Promise.$$catch(self.reducers.taskReducer(self.state, task, action => dispatchAction(stateId, self, action)), e => {
self.onError(e);
return Promise.resolve();
});
return;
} catch (raw_e) {
return self.onError(Primitive_exceptions.internalToException(raw_e));
}
});
}
function getState(self) {
return self.state;
}
function setState(self, state) {
self.state = state;
}
export {
make,
dispatchAction,
dispatchTask,
getState,
setState,
}
/* Logging Not a pure module */