UNPKG

@sprucelabs/spruce-event-utils

Version:

Some helpful utilities to speed up working with Mercury! 🚅

114 lines (113 loc) • 4.18 kB
import { EVENT_VERSION_DIVIDER } from '../constants.js'; import SpruceError from '../errors/SpruceError.js'; import eventNameUtil from './eventName.utility.js'; const eventContractUtil = { getEventNames(contract, namespace) { const names = getEventNames(contract, namespace); return names; }, getNamedEventSignatures(contract) { return getNamedEventSignatures(contract); }, unifyContracts(contracts, options) { if (!contracts || contracts.length === 0) { return undefined; } const { shouldUpsert = false } = options !== null && options !== void 0 ? options : {}; const unifiedContract = { eventSignatures: {}, }; let existingNames = []; for (const contract of contracts !== null && contracts !== void 0 ? contracts : []) { if (!shouldUpsert) { const names = Object.keys(contract.eventSignatures); for (const name of names) { if (existingNames.indexOf(name) > -1) { throw new SpruceError({ code: 'DUPLICATE_EVENT', fullyQualifiedEventName: name, }); } } existingNames.push(...names); } unifiedContract.eventSignatures = Object.assign(Object.assign({}, unifiedContract.eventSignatures), contract.eventSignatures); } return unifiedContract; }, resolveToLatestEventName(contract, fullyQualifiedEventName) { let match = getNamedSignature(fullyQualifiedEventName, contract); if (match) { return fullyQualifiedEventName; } const search = fullyQualifiedEventName + EVENT_VERSION_DIVIDER; const matchesOnVersion = Object.keys(contract.eventSignatures).filter((name) => { if (name.search(search) === 0) { return true; } return false; }); matchesOnVersion.sort((a, b) => { var _a, _b; const v1 = (_a = a.split('::').pop()) !== null && _a !== void 0 ? _a : 0; const v2 = (_b = b.split('::').pop()) !== null && _b !== void 0 ? _b : 0; if (v1 > v2) { return 1; } else if (v1 < v2) { return -1; } return 0; }); const latestVersion = matchesOnVersion.pop(); match = getNamedSignature(latestVersion, contract); if (match) { return latestVersion; } throw new SpruceError({ code: 'INVALID_EVENT_NAME', fullyQualifiedEventName, validNames: this.getEventNames(contract), }); }, getSignatureByName(contract, fullyQualifiedEventName) { const resolvedName = this.resolveToLatestEventName(contract, fullyQualifiedEventName); let match = getNamedSignature(resolvedName, contract); if (!match) { throw new SpruceError({ code: 'INVALID_EVENT_NAME', fullyQualifiedEventName, validNames: this.getEventNames(contract), }); } return match.signature; }, }; export default eventContractUtil; function getEventNames(contract, namespace) { let names = Object.keys(contract.eventSignatures); if (namespace) { names = names.filter((n) => eventNameUtil.split(n).eventNamespace === namespace); } return names; } const getNamedEventSignatures = (contract) => { const names = getEventNames(contract); const sigs = names.map((name) => { return getNamedSignature(name, contract); }); return sigs; }; function getNamedSignature(name, contract) { if (!contract.eventSignatures[name]) { return undefined; } const nameParts = eventNameUtil.split(name); return { fullyQualifiedEventName: name, eventName: nameParts.eventName, eventNamespace: nameParts.eventNamespace, signature: contract.eventSignatures[name], version: nameParts.version, }; }