UNPKG

envio

Version:

A latency and sync speed optimized, developer friendly blockchain data indexer.

69 lines (61 loc) 2.01 kB
// 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 */