UNPKG

envio

Version:

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

152 lines (142 loc) • 6.51 kB
// 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 */