envio
Version:
A latency and sync speed optimized, developer friendly blockchain data indexer.
152 lines (142 loc) • 6.51 kB
JavaScript
// Generated by ReScript, PLEASE EDIT WITH CARE
import * as Url from "url";
import * as Path from "path";
import * as Utils from "./Utils.res.mjs";
import * as Logging from "./Logging.res.mjs";
import * as Process from "process";
import * as ChainMap from "./ChainMap.res.mjs";
import * as Internal from "./Internal.res.mjs";
import * as Nodemodule from "node:module";
import * as LogSelection from "./LogSelection.res.mjs";
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
import * as HandlerRegister from "./HandlerRegister.res.mjs";
import * as Promises from "node:fs/promises";
import * as EventConfigBuilder from "./EventConfigBuilder.res.mjs";
import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
try {
Nodemodule.register("tsx/esm", import.meta.url);
} catch (exn) {
}
function toImportUrl(relativePath) {
let absolutePath = Path.resolve(Process.cwd(), relativePath);
return Url.pathToFileURL(absolutePath).toString();
}
async function registerContractHandlers(contractName, handler) {
if (handler === undefined) {
return;
}
try {
await import(toImportUrl(handler));
return;
} catch (raw_exn) {
let exn = Primitive_exceptions.internalToException(raw_exn);
let cause = Utils.prettifyExn(exn);
Logging.errorWithExn(exn, `Failed to load handler file for contract ` + contractName + `: ` + handler);
return Stdlib_JsError.throwWithMessage(`Failed to load handler file for contract ` + contractName + `: ` + handler + `. Cause: ` + cause);
}
}
async function autoLoadFromSrcHandlers(handlers) {
let srcPattern = `./` + handlers + `/**/*.{js,mjs,ts}`;
let handlerFiles;
try {
let iterator = Promises.glob(srcPattern);
let files = await Utils.$$Array.fromAsyncIterator(iterator);
handlerFiles = files.filter(file => !(file.includes(".test.") || file.includes(".spec.") || file.includes("_test.")));
} catch (raw_exn) {
let exn = Primitive_exceptions.internalToException(raw_exn);
handlerFiles = Stdlib_JsError.throwWithMessage(`Failed to glob src/handlers directory for auto-loading handlers. Pattern: ` + srcPattern + `. Before continuing, check that you're using Node.js >=22 version. Error: ` + Utils.prettifyExn(exn));
}
await Promise.all(handlerFiles.map(file => Stdlib_Promise.$$catch(import(toImportUrl(file)), exn => {
let cause = Utils.prettifyExn(exn);
Logging.errorWithExn(exn, `Failed to auto-load handler file: ` + file);
return Stdlib_JsError.throwWithMessage(`Failed to auto-load handler file: ` + file + `. Cause: ` + cause);
})));
}
function applyRegistrations(config) {
let newChainMap = ChainMap.map(config.chainMap, chain => {
let newContracts = chain.contracts.map(contract => {
let newEvents = contract.events.map(ev => {
let isWildcard = HandlerRegister.isWildcard(ev.contractName, ev.name);
let handler = HandlerRegister.getHandler(ev.contractName, ev.name);
let contractRegister = HandlerRegister.getContractRegister(ev.contractName, ev.name);
let match = config.ecosystem.name;
switch (match) {
case "evm" :
let eventFilters = HandlerRegister.getOnEventWhere(ev.contractName, ev.name);
let indexedParams = ev.paramsMetadata.filter(p => p.indexed);
let match$1 = LogSelection.parseEventFiltersOrThrow(eventFilters, ev.sighash, indexedParams.map(p => p.name), ev.contractName, chain.id, config.ecosystem.onEventBlockFilterSchema, Stdlib_Option.map(indexedParams[0], EventConfigBuilder.buildTopicGetter), Stdlib_Option.map(indexedParams[1], EventConfigBuilder.buildTopicGetter), Stdlib_Option.map(indexedParams[2], EventConfigBuilder.buildTopicGetter));
let filterByAddresses = match$1.filterByAddresses;
let newrecord = {...ev};
newrecord.getEventFiltersOrThrow = match$1.getEventFiltersOrThrow;
newrecord.contractRegister = contractRegister;
newrecord.handler = handler;
newrecord.clientAddressFilter = EventConfigBuilder.buildAddressFilter(match$1.addressFilterParamGroups);
newrecord.dependsOnAddresses = Internal.dependsOnAddresses(isWildcard, filterByAddresses);
newrecord.filterByAddresses = filterByAddresses;
newrecord.isWildcard = isWildcard;
return newrecord;
case "fuel" :
case "svm" :
break;
}
let newrecord$1 = {...ev};
newrecord$1.contractRegister = contractRegister;
newrecord$1.handler = handler;
newrecord$1.dependsOnAddresses = Internal.dependsOnAddresses(isWildcard, false);
newrecord$1.isWildcard = isWildcard;
return newrecord$1;
});
return {
name: contract.name,
abi: contract.abi,
addresses: contract.addresses,
events: newEvents,
startBlock: contract.startBlock
};
});
let newrecord = {...chain};
newrecord.contracts = newContracts;
return newrecord;
});
return {
name: config.name,
description: config.description,
handlers: config.handlers,
contractHandlers: config.contractHandlers,
shouldRollbackOnReorg: config.shouldRollbackOnReorg,
shouldSaveFullHistory: config.shouldSaveFullHistory,
storage: config.storage,
chainMap: newChainMap,
defaultChain: config.defaultChain,
ecosystem: config.ecosystem,
enableRawEvents: config.enableRawEvents,
maxAddrInPartition: config.maxAddrInPartition,
batchSize: config.batchSize,
lowercaseAddresses: config.lowercaseAddresses,
isDev: config.isDev,
userEntitiesByName: config.userEntitiesByName,
userEntities: config.userEntities,
allEntities: config.allEntities,
allEnums: config.allEnums
};
}
async function registerAllHandlers(config) {
HandlerRegister.startRegistration(config.ecosystem);
await autoLoadFromSrcHandlers(config.handlers);
await Promise.all(config.contractHandlers.map(param => registerContractHandlers(param.name, param.handler)));
let registrations = HandlerRegister.finishRegistration();
return [
applyRegistrations(config),
registrations
];
}
export {
toImportUrl,
registerContractHandlers,
autoLoadFromSrcHandlers,
applyRegistrations,
registerAllHandlers,
}
/* Not a pure module */