@xyo-network/chain-api 1.19.7 → 1.19.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/node/index.mjs
CHANGED
|
@@ -3,7 +3,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
3
3
|
|
|
4
4
|
// src/ApiActor.ts
|
|
5
5
|
import { assertEx as assertEx3, creatable } from "@xylabs/sdk-js";
|
|
6
|
-
import { Account
|
|
6
|
+
import { Account } from "@xyo-network/account";
|
|
7
7
|
import { Actor } from "@xyo-network/xl1-sdk";
|
|
8
8
|
|
|
9
9
|
// src/server/app.ts
|
|
@@ -306,16 +306,13 @@ var getApp = /* @__PURE__ */ __name(async (context) => {
|
|
|
306
306
|
|
|
307
307
|
// src/server/initApiParams.ts
|
|
308
308
|
import { assertEx as assertEx2 } from "@xylabs/sdk-js";
|
|
309
|
-
import {
|
|
310
|
-
import { buildTelemetryConfig, initApiWallet, initBalanceSummaryMap, initEvmProvidersIfAvailable, initHealthEndpoints, initServerNode, initStatusReporter, initTransferSummaryMap, MempoolActor, ValidatorActor } from "@xyo-network/chain-orchestration";
|
|
311
|
-
import { createBootstrapHead } from "@xyo-network/chain-services";
|
|
309
|
+
import { buildTelemetryConfig, initApiWallet, initBalanceSummaryMap, initEvmProvidersIfAvailable, initFinalizationArchivistIfNeeded, initHealthEndpoints, initServerNode, initStatusReporter, initTransferSummaryMap, MempoolActor, ValidatorActor } from "@xyo-network/chain-orchestration";
|
|
312
310
|
import { initTelemetry } from "@xyo-network/chain-telemetry";
|
|
313
311
|
import { startupSpanAsync } from "@xyo-network/chain-utils";
|
|
314
312
|
import { validateHydratedBlock, validateHydratedBlockState } from "@xyo-network/chain-validation";
|
|
315
|
-
import { AccountBalanceViewerMoniker,
|
|
313
|
+
import { AccountBalanceViewerMoniker, BlockViewerMoniker, buildLocalProviderLocator, DefaultMetricsScrapePorts, MempoolRunnerMoniker, MempoolViewerMoniker, SimpleBlockValidationViewer, SimpleXyoConnection, XyoViewerMoniker } from "@xyo-network/xl1-sdk";
|
|
316
314
|
async function initApiParams(params) {
|
|
317
315
|
const { config, node: providedNode } = params;
|
|
318
|
-
const { id: configuredChainId } = config.chain;
|
|
319
316
|
const logger = assertEx2(params.logger, () => "Logger is required to init server");
|
|
320
317
|
const statusReporter = initStatusReporter({
|
|
321
318
|
logger
|
|
@@ -352,19 +349,7 @@ async function initApiParams(params) {
|
|
|
352
349
|
await readonlyChainArchivist.start();
|
|
353
350
|
await pendingTransactionsArchivist.start();
|
|
354
351
|
await pendingBlocksArchivist.start();
|
|
355
|
-
const
|
|
356
|
-
if (configuredChainId && possibleHead && possibleHead.chain !== configuredChainId) {
|
|
357
|
-
throw new Error(`Configured chain ID (${configuredChainId}) does not match the existing chain ID (${possibleHead.chain})`);
|
|
358
|
-
}
|
|
359
|
-
let possibleChainId = configuredChainId;
|
|
360
|
-
if (!possibleHead) {
|
|
361
|
-
possibleChainId = possibleChainId ?? (await Account.random()).address;
|
|
362
|
-
const chain = await createBootstrapHead(wallet, possibleChainId, asAttoXL1(20000000000000000000000n), config.chain.genesisRewardAddress ?? wallet.address);
|
|
363
|
-
const payloads = chain.flatMap((block) => flattenHydratedBlock(block));
|
|
364
|
-
await writableChainArchivist.insert(payloads);
|
|
365
|
-
}
|
|
366
|
-
const head = possibleHead ?? assertEx2(await findMostRecentBlock(readonlyChainArchivist), () => "No blocks found in chain archivist");
|
|
367
|
-
const chainId = assertEx2(possibleChainId, () => "Chain ID could not be determined");
|
|
352
|
+
const [head, chainId] = await initFinalizationArchivistIfNeeded(writableChainArchivist, config, wallet);
|
|
368
353
|
assertEx2(head.chain === chainId, () => `Chain ID does not match head block chain ID [init] [${head.chain} !== ${chainId}]`);
|
|
369
354
|
const mods = await node.resolve("*");
|
|
370
355
|
await Promise.all(mods.map((mod) => {
|
|
@@ -377,8 +362,7 @@ async function initApiParams(params) {
|
|
|
377
362
|
pendingBlocksArchivist,
|
|
378
363
|
balancesSummaryMap,
|
|
379
364
|
transfersSummaryMap,
|
|
380
|
-
node
|
|
381
|
-
chainId
|
|
365
|
+
node
|
|
382
366
|
});
|
|
383
367
|
await initEvmProvidersIfAvailable(locator);
|
|
384
368
|
locator.register(SimpleBlockValidationViewer.factory(SimpleBlockValidationViewer.dependencies, {
|
|
@@ -405,7 +389,7 @@ async function initApiParams(params) {
|
|
|
405
389
|
const mempoolRunner = await locator.getInstance(MempoolRunnerMoniker);
|
|
406
390
|
assertEx2(await mempoolRunner.start(), () => "Failed to start MempoolRunner");
|
|
407
391
|
console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
|
|
408
|
-
const validatorActor = config.mempool.enabled ? void 0 : await ValidatorActor.create({
|
|
392
|
+
const validatorActor = config.actors.mempool.enabled ? void 0 : await ValidatorActor.create({
|
|
409
393
|
id: "validator-mempool-server",
|
|
410
394
|
account: wallet,
|
|
411
395
|
context: locator.context,
|
|
@@ -414,7 +398,7 @@ async function initApiParams(params) {
|
|
|
414
398
|
blockViewer
|
|
415
399
|
});
|
|
416
400
|
await validatorActor?.start();
|
|
417
|
-
const mempoolActor = config.mempool.enabled ? void 0 : await MempoolActor.create({
|
|
401
|
+
const mempoolActor = config.actors.mempool.enabled ? void 0 : await MempoolActor.create({
|
|
418
402
|
id: "mempool-mempool-server",
|
|
419
403
|
account: wallet,
|
|
420
404
|
context: locator.context,
|
|
@@ -437,7 +421,7 @@ __name(initApiParams, "initApiParams");
|
|
|
437
421
|
var hostname = "::";
|
|
438
422
|
async function getServer(context) {
|
|
439
423
|
const { logger } = context;
|
|
440
|
-
const { port } = context.config.api;
|
|
424
|
+
const { port } = context.config.actors.api;
|
|
441
425
|
const app = await getApp(context);
|
|
442
426
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
|
|
443
427
|
server.setTimeout(2e4);
|
|
@@ -470,7 +454,7 @@ var ApiActor = class extends Actor {
|
|
|
470
454
|
const logger = params?.context?.logger;
|
|
471
455
|
let account = params?.account;
|
|
472
456
|
if (account === void 0) {
|
|
473
|
-
const newAccount = await
|
|
457
|
+
const newAccount = await Account.random();
|
|
474
458
|
logger?.warn(`No account provided to ApiActor, generating random account ${newAccount.address}`);
|
|
475
459
|
account = newAccount;
|
|
476
460
|
}
|
|
@@ -507,10 +491,10 @@ ApiActor = _ts_decorate([
|
|
|
507
491
|
|
|
508
492
|
// src/runApi.ts
|
|
509
493
|
import { exists, IdLogger } from "@xylabs/sdk-js";
|
|
510
|
-
import { Account as
|
|
494
|
+
import { Account as Account2 } from "@xyo-network/account";
|
|
511
495
|
var runApi = /* @__PURE__ */ __name(async ({ config, orchestrator, ...params }) => {
|
|
512
496
|
const logger = new IdLogger(params.logger ?? console, () => "API");
|
|
513
|
-
const account = await
|
|
497
|
+
const account = await Account2.random();
|
|
514
498
|
logger.info(`Running api for account ${account.address} [random]`);
|
|
515
499
|
const actorParams = await initApiParams({
|
|
516
500
|
config,
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ApiActor.ts","../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/initApiParams.ts","../../src/server/server.ts","../../src/runApi.ts"],"sourcesContent":["import { Server } from 'node:http'\n\nimport { assertEx, creatable } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n Actor, ActorParams, BalancesStepSummary, CreatableProviderFactory,\n MapType,\n TransfersStepSummary,\n} from '@xyo-network/xl1-sdk'\n\nimport { ApiContext } from './ApiContext.ts'\nimport { getServer } from './server/index.ts'\n\nexport type ApiActorParams = ActorParams<{\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>\n context: ApiContext\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>\n}>\n\n@creatable()\nexport class ApiActor extends Actor<ApiActorParams> {\n private server?: Server\n\n protected override get context() {\n return this.params.context!\n }\n\n static override defaultFactories(): CreatableProviderFactory[] {\n return [\n ...super.defaultFactories(),\n ]\n }\n\n static override async paramsHandler<T extends ApiActor>(params: T['params']) {\n const logger = params?.context?.logger\n\n let account = params?.account\n if (account === undefined) {\n const newAccount = await Account.random()\n logger?.warn(`No account provided to ApiActor, generating random account ${newAccount.address}`)\n account = newAccount\n }\n logger?.info(`Running api for account ${account.address}`)\n\n return {\n ...await super.paramsHandler(params),\n context: params.context,\n account: assertEx(account, () => 'ApiActor requires an account to run'),\n }\n }\n\n override async createHandler() {\n await super.createHandler()\n }\n\n override async startHandler() {\n await super.startHandler()\n this.stopServer()\n await this.startServer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopServer()\n }\n\n private async startServer() {\n this.server = await getServer(this.context)\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { ApiContext } from '../ApiContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (context: ApiContext): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.context = context\n await addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.context.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app.context\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app.context\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app.context\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport type { XyoConnection } from '@xyo-network/xl1-sdk'\nimport { rpcEngineFromConnection, XyoConnectionMoniker } from '@xyo-network/xl1-sdk'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = async (\n app: Express,\n) => {\n const { context } = app\n const { locator } = context\n\n const connection = await locator.getInstance<XyoConnection>(XyoConnectionMoniker)\n const engine = rpcEngineFromConnection(connection)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n) => {\n await addRpcRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","/* eslint-disable max-statements */\nimport type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport type { MempoolActorParams, ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig, initApiWallet, initBalanceSummaryMap, initEvmProvidersIfAvailable, initHealthEndpoints, initServerNode,\n initStatusReporter, initTransferSummaryMap, MempoolActor, ValidatorActor,\n} from '@xyo-network/chain-orchestration'\nimport { createBootstrapHead } from '@xyo-network/chain-services'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\nimport { validateHydratedBlock, validateHydratedBlockState } from '@xyo-network/chain-validation'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type {\n AccountBalanceViewer, BlockViewer, ChainId, Config,\n MempoolRunner,\n MempoolViewer,\n XyoViewer,\n} from '@xyo-network/xl1-sdk'\nimport {\n AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator, DefaultMetricsScrapePorts, findMostRecentBlock, flattenHydratedBlock,\n MempoolRunnerMoniker, MempoolViewerMoniker, SimpleBlockValidationViewer, SimpleXyoConnection,\n XyoViewerMoniker,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ApiActorParams } from '../ApiActor.ts'\nimport type { ApiContext } from '../ApiContext.ts'\n\ninterface InitServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport async function initApiParams(params: InitServerContext): Promise<ApiActorParams> {\n const { config, node: providedNode } = params\n const { id: configuredChainId } = config.chain\n\n const logger = assertEx(params.logger, () => 'Logger is required to init server')\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0', DefaultMetricsScrapePorts.api)\n\n const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n const initContext = {\n _id: 'init-context',\n config,\n logger,\n statusReporter,\n timeBudgetLimit: 1000,\n meterProvider,\n traceProvider,\n singletons: {},\n caches: {},\n }\n\n const wallet = await initApiWallet(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n await writableChainArchivist.start()\n await readonlyChainArchivist.start()\n await pendingTransactionsArchivist.start()\n await pendingBlocksArchivist.start()\n\n const possibleHead = await findMostRecentBlock(readonlyChainArchivist)\n if (configuredChainId && possibleHead && possibleHead.chain !== configuredChainId) {\n throw new Error(`Configured chain ID (${configuredChainId}) does not match the existing chain ID (${possibleHead.chain})`)\n }\n\n let possibleChainId: ChainId | undefined = configuredChainId\n\n // if there is no configured chain ID and no head, create a new chain\n if (!possibleHead) {\n possibleChainId = possibleChainId ?? (await Account.random()).address\n // If there is no head, create one\n const chain = await createBootstrapHead(\n wallet,\n possibleChainId,\n asAttoXL1(20_000_000_000_000_000_000_000n),\n config.chain.genesisRewardAddress ?? wallet.address,\n )\n const payloads = chain.flatMap(block => flattenHydratedBlock(block))\n await writableChainArchivist.insert(payloads)\n }\n\n const head = possibleHead ?? assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')\n const chainId = assertEx(possibleChainId, () => 'Chain ID could not be determined')\n assertEx(head.chain === chainId, () => `Chain ID does not match head block chain ID [init] [${head.chain} !== ${chainId}]`)\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const locator = buildLocalProviderLocator({\n context: initContext,\n finalizedArchivist: writableChainArchivist,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n balancesSummaryMap,\n transfersSummaryMap,\n node,\n chainId,\n })\n\n await initEvmProvidersIfAvailable(locator)\n\n locator.register(SimpleBlockValidationViewer.factory<SimpleBlockValidationViewer>(\n SimpleBlockValidationViewer.dependencies,\n { state: validateHydratedBlockState, protocol: validateHydratedBlock },\n ))\n\n locator.register(SimpleXyoConnection.factory<SimpleXyoConnection>(SimpleXyoConnection.dependencies, {}))\n\n const apiContext = {\n ...initContext,\n ...locator.context,\n _id: 'api-context',\n node,\n } satisfies ApiContext\n\n const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n const accountBalanceViewer = (await locator.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker))\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start AccountBalanceViewer')\n\n const xyoViewer = (await locator.getInstance<XyoViewer>(XyoViewerMoniker))\n assertEx(await xyoViewer.start(), () => 'Failed to start XyoViewer')\n\n const mempoolViewer = (await locator.getInstance<MempoolViewer>(MempoolViewerMoniker))\n assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')\n\n const mempoolRunner = (await locator.getInstance<MempoolRunner>(MempoolRunnerMoniker))\n assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')\n\n console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const validatorActor = config.mempool.enabled\n ? undefined\n : await ValidatorActor.create({\n id: 'validator-mempool-server',\n account: wallet,\n context: locator.context,\n finalizedArchivist: writableChainArchivist,\n mempoolViewer,\n blockViewer,\n } satisfies ValidatorActorParams)\n\n await validatorActor?.start()\n\n const mempoolActor = config.mempool.enabled\n ? undefined\n : await MempoolActor.create({\n id: 'mempool-mempool-server',\n account: wallet,\n context: locator.context,\n mempoolRunner,\n pendingBlocksArchivist,\n pendingTransactionsArchivist,\n } satisfies MempoolActorParams)\n\n await mempoolActor?.start()\n\n return {\n id: 'api-actor',\n account: wallet,\n context: apiContext,\n transfersSummaryMap,\n balancesSummaryMap,\n }\n}\n","import type { ApiContext } from '../ApiContext.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n\nexport async function getServer(context: ApiContext) {\n const { logger } = context\n const { port } = context.config.api\n\n const app = await getApp(context)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n","import { exists, IdLogger } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { type OrchestratorInstance } from '@xyo-network/chain-orchestration'\nimport { type BaseContext, type Config } from '@xyo-network/xl1-sdk'\n\nimport { ApiActor } from './ApiActor.ts'\nimport { initApiParams } from './server/index.ts'\n\nexport interface RunApiContext extends BaseContext {\n config: Config\n orchestrator: OrchestratorInstance\n}\n\nexport const runApi = async ({\n config, orchestrator, ...params\n}: RunApiContext) => {\n const logger = new IdLogger(params.logger ?? console, () => 'API')\n const account = await Account.random()\n logger.info(`Running api for account ${account.address} [random]`)\n\n const actorParams = await initApiParams({ config, logger })\n\n // Create actors\n const api = await ApiActor.create(actorParams)\n const actors = [api].filter(exists)\n\n for (const actor of actors) {\n // Register the actor with the orchestrator\n await orchestrator.registerActor(actor)\n }\n // Start the orchestrator => automatically activates the actor\n await orchestrator.start()\n}\n"],"mappings":"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","names":["assertEx","creatable","Account","Actor","customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","context","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","context","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","context","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","context","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","rpcEngineFromConnection","XyoConnectionMoniker","addRpcRoutes","app","context","locator","connection","getInstance","XyoConnectionMoniker","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","Account","buildTelemetryConfig","initApiWallet","initBalanceSummaryMap","initEvmProvidersIfAvailable","initHealthEndpoints","initServerNode","initStatusReporter","initTransferSummaryMap","MempoolActor","ValidatorActor","createBootstrapHead","initTelemetry","startupSpanAsync","validateHydratedBlock","validateHydratedBlockState","AccountBalanceViewerMoniker","asAttoXL1","BlockViewerMoniker","buildLocalProviderLocator","DefaultMetricsScrapePorts","findMostRecentBlock","flattenHydratedBlock","MempoolRunnerMoniker","MempoolViewerMoniker","SimpleBlockValidationViewer","SimpleXyoConnection","XyoViewerMoniker","initApiParams","params","config","node","providedNode","id","configuredChainId","chain","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","DefaultMetricsScrapePorts","api","traceProvider","meterProvider","initTelemetry","initContext","_id","timeBudgetLimit","singletons","caches","wallet","initApiWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","start","possibleHead","findMostRecentBlock","Error","possibleChainId","Account","random","address","createBootstrapHead","asAttoXL1","genesisRewardAddress","payloads","flatMap","block","flattenHydratedBlock","insert","head","chainId","mods","resolve","Promise","all","map","mod","locator","buildLocalProviderLocator","context","finalizedArchivist","initEvmProvidersIfAvailable","register","SimpleBlockValidationViewer","factory","dependencies","state","validateHydratedBlockState","protocol","validateHydratedBlock","SimpleXyoConnection","apiContext","blockViewer","getInstance","BlockViewerMoniker","blk","currentBlock","accountBalanceViewer","AccountBalanceViewerMoniker","xyoViewer","XyoViewerMoniker","mempoolViewer","MempoolViewerMoniker","mempoolRunner","MempoolRunnerMoniker","console","info","_hash","validatorActor","mempool","enabled","undefined","ValidatorActor","create","account","mempoolActor","MempoolActor","hostname","getServer","context","logger","port","config","api","app","getApp","server","listen","log","setTimeout","ApiActor","Actor","server","context","params","defaultFactories","paramsHandler","logger","account","undefined","newAccount","Account","random","warn","address","info","assertEx","createHandler","startHandler","stopServer","startServer","stopHandler","getServer","close","exists","IdLogger","Account","runApi","config","orchestrator","params","logger","IdLogger","console","account","Account","random","info","address","actorParams","initApiParams","api","ApiActor","create","actors","filter","exists","actor","registerActor","start"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ApiActor.ts","../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/initApiParams.ts","../../src/server/server.ts","../../src/runApi.ts"],"sourcesContent":["import { Server } from 'node:http'\n\nimport { assertEx, creatable } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n Actor, ActorParams, BalancesStepSummary, CreatableProviderFactory,\n MapType,\n TransfersStepSummary,\n} from '@xyo-network/xl1-sdk'\n\nimport { ApiContext } from './ApiContext.ts'\nimport { getServer } from './server/index.ts'\n\nexport type ApiActorParams = ActorParams<{\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>\n context: ApiContext\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>\n}>\n\n@creatable()\nexport class ApiActor extends Actor<ApiActorParams> {\n private server?: Server\n\n protected override get context() {\n return this.params.context!\n }\n\n static override defaultFactories(): CreatableProviderFactory[] {\n return [\n ...super.defaultFactories(),\n ]\n }\n\n static override async paramsHandler<T extends ApiActor>(params: T['params']) {\n const logger = params?.context?.logger\n\n let account = params?.account\n if (account === undefined) {\n const newAccount = await Account.random()\n logger?.warn(`No account provided to ApiActor, generating random account ${newAccount.address}`)\n account = newAccount\n }\n logger?.info(`Running api for account ${account.address}`)\n\n return {\n ...await super.paramsHandler(params),\n context: params.context,\n account: assertEx(account, () => 'ApiActor requires an account to run'),\n }\n }\n\n override async createHandler() {\n await super.createHandler()\n }\n\n override async startHandler() {\n await super.startHandler()\n this.stopServer()\n await this.startServer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopServer()\n }\n\n private async startServer() {\n this.server = await getServer(this.context)\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { ApiContext } from '../ApiContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (context: ApiContext): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.context = context\n await addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.context.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app.context\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app.context\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app.context\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport type { XyoConnection } from '@xyo-network/xl1-sdk'\nimport { rpcEngineFromConnection, XyoConnectionMoniker } from '@xyo-network/xl1-sdk'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = async (\n app: Express,\n) => {\n const { context } = app\n const { locator } = context\n\n const connection = await locator.getInstance<XyoConnection>(XyoConnectionMoniker)\n const engine = rpcEngineFromConnection(connection)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n) => {\n await addRpcRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","/* eslint-disable max-statements */\nimport type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { MempoolActorParams, ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig, initApiWallet, initBalanceSummaryMap, initEvmProvidersIfAvailable,\n initFinalizationArchivistIfNeeded, initHealthEndpoints, initServerNode,\n initStatusReporter, initTransferSummaryMap, MempoolActor, ValidatorActor,\n} from '@xyo-network/chain-orchestration'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\nimport { validateHydratedBlock, validateHydratedBlockState } from '@xyo-network/chain-validation'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type {\n AccountBalanceViewer, BlockViewer, Config,\n MempoolRunner,\n MempoolViewer,\n XyoViewer,\n} from '@xyo-network/xl1-sdk'\nimport {\n AccountBalanceViewerMoniker, BlockViewerMoniker, buildLocalProviderLocator, DefaultMetricsScrapePorts,\n MempoolRunnerMoniker, MempoolViewerMoniker, SimpleBlockValidationViewer, SimpleXyoConnection,\n XyoViewerMoniker,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ApiActorParams } from '../ApiActor.ts'\nimport type { ApiContext } from '../ApiContext.ts'\n\ninterface InitServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport async function initApiParams(params: InitServerContext): Promise<ApiActorParams> {\n const { config, node: providedNode } = params\n\n const logger = assertEx(params.logger, () => 'Logger is required to init server')\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0', DefaultMetricsScrapePorts.api)\n\n const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n const initContext = {\n _id: 'init-context',\n config,\n logger,\n statusReporter,\n timeBudgetLimit: 1000,\n meterProvider,\n traceProvider,\n singletons: {},\n caches: {},\n }\n\n const wallet = await initApiWallet(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n await writableChainArchivist.start()\n await readonlyChainArchivist.start()\n await pendingTransactionsArchivist.start()\n await pendingBlocksArchivist.start()\n\n const [head, chainId] = await initFinalizationArchivistIfNeeded(writableChainArchivist, config, wallet)\n\n assertEx(head.chain === chainId, () => `Chain ID does not match head block chain ID [init] [${head.chain} !== ${chainId}]`)\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const locator = buildLocalProviderLocator({\n context: initContext,\n finalizedArchivist: writableChainArchivist,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n balancesSummaryMap,\n transfersSummaryMap,\n node,\n })\n\n await initEvmProvidersIfAvailable(locator)\n\n locator.register(SimpleBlockValidationViewer.factory<SimpleBlockValidationViewer>(\n SimpleBlockValidationViewer.dependencies,\n { state: validateHydratedBlockState, protocol: validateHydratedBlock },\n ))\n\n locator.register(SimpleXyoConnection.factory<SimpleXyoConnection>(SimpleXyoConnection.dependencies, {}))\n\n const apiContext = {\n ...initContext,\n ...locator.context,\n _id: 'api-context',\n node,\n } satisfies ApiContext\n\n const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n const accountBalanceViewer = (await locator.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker))\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start AccountBalanceViewer')\n\n const xyoViewer = (await locator.getInstance<XyoViewer>(XyoViewerMoniker))\n assertEx(await xyoViewer.start(), () => 'Failed to start XyoViewer')\n\n const mempoolViewer = (await locator.getInstance<MempoolViewer>(MempoolViewerMoniker))\n assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')\n\n const mempoolRunner = (await locator.getInstance<MempoolRunner>(MempoolRunnerMoniker))\n assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')\n\n console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const validatorActor = config.actors.mempool.enabled\n ? undefined\n : await ValidatorActor.create({\n id: 'validator-mempool-server',\n account: wallet,\n context: locator.context,\n finalizedArchivist: writableChainArchivist,\n mempoolViewer,\n blockViewer,\n } satisfies ValidatorActorParams)\n\n await validatorActor?.start()\n\n const mempoolActor = config.actors.mempool.enabled\n ? undefined\n : await MempoolActor.create({\n id: 'mempool-mempool-server',\n account: wallet,\n context: locator.context,\n mempoolRunner,\n pendingBlocksArchivist,\n pendingTransactionsArchivist,\n } satisfies MempoolActorParams)\n\n await mempoolActor?.start()\n\n return {\n id: 'api-actor',\n account: wallet,\n context: apiContext,\n transfersSummaryMap,\n balancesSummaryMap,\n }\n}\n","import type { ApiContext } from '../ApiContext.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n\nexport async function getServer(context: ApiContext) {\n const { logger } = context\n const { port } = context.config.actors.api\n\n const app = await getApp(context)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n","import { exists, IdLogger } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { type OrchestratorInstance } from '@xyo-network/chain-orchestration'\nimport { type BaseContext, type Config } from '@xyo-network/xl1-sdk'\n\nimport { ApiActor } from './ApiActor.ts'\nimport { initApiParams } from './server/index.ts'\n\nexport interface RunApiContext extends BaseContext {\n config: Config\n orchestrator: OrchestratorInstance\n}\n\nexport const runApi = async ({\n config, orchestrator, ...params\n}: RunApiContext) => {\n const logger = new IdLogger(params.logger ?? console, () => 'API')\n const account = await Account.random()\n logger.info(`Running api for account ${account.address} [random]`)\n\n const actorParams = await initApiParams({ config, logger })\n\n // Create actors\n const api = await ApiActor.create(actorParams)\n const actors = [api].filter(exists)\n\n for (const actor of actors) {\n // Register the actor with the orchestrator\n await orchestrator.registerActor(actor)\n }\n // Start the orchestrator => automatically activates the actor\n await orchestrator.start()\n}\n"],"mappings":"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","names":["assertEx","creatable","Account","Actor","customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","context","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","context","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","context","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","context","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","rpcEngineFromConnection","XyoConnectionMoniker","addRpcRoutes","app","context","locator","connection","getInstance","XyoConnectionMoniker","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","buildTelemetryConfig","initApiWallet","initBalanceSummaryMap","initEvmProvidersIfAvailable","initFinalizationArchivistIfNeeded","initHealthEndpoints","initServerNode","initStatusReporter","initTransferSummaryMap","MempoolActor","ValidatorActor","initTelemetry","startupSpanAsync","validateHydratedBlock","validateHydratedBlockState","AccountBalanceViewerMoniker","BlockViewerMoniker","buildLocalProviderLocator","DefaultMetricsScrapePorts","MempoolRunnerMoniker","MempoolViewerMoniker","SimpleBlockValidationViewer","SimpleXyoConnection","XyoViewerMoniker","initApiParams","params","config","node","providedNode","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","DefaultMetricsScrapePorts","api","traceProvider","meterProvider","initTelemetry","initContext","_id","timeBudgetLimit","singletons","caches","wallet","initApiWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","start","head","chainId","initFinalizationArchivistIfNeeded","chain","mods","resolve","Promise","all","map","mod","locator","buildLocalProviderLocator","context","finalizedArchivist","initEvmProvidersIfAvailable","register","SimpleBlockValidationViewer","factory","dependencies","state","validateHydratedBlockState","protocol","validateHydratedBlock","SimpleXyoConnection","apiContext","blockViewer","getInstance","BlockViewerMoniker","blk","currentBlock","accountBalanceViewer","AccountBalanceViewerMoniker","xyoViewer","XyoViewerMoniker","mempoolViewer","MempoolViewerMoniker","mempoolRunner","MempoolRunnerMoniker","console","info","block","_hash","validatorActor","actors","mempool","enabled","undefined","ValidatorActor","create","id","account","mempoolActor","MempoolActor","hostname","getServer","context","logger","port","config","actors","api","app","getApp","server","listen","log","setTimeout","ApiActor","Actor","server","context","params","defaultFactories","paramsHandler","logger","account","undefined","newAccount","Account","random","warn","address","info","assertEx","createHandler","startHandler","stopServer","startServer","stopHandler","getServer","close","exists","IdLogger","Account","runApi","config","orchestrator","params","logger","IdLogger","console","account","Account","random","info","address","actorParams","initApiParams","api","ApiActor","create","actors","filter","exists","actor","registerActor","start"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initApiParams.d.ts","sourceRoot":"","sources":["../../../src/server/initApiParams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"initApiParams.d.ts","sourceRoot":"","sources":["../../../src/server/initApiParams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAW5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EACyB,MAAM,EAI1C,MAAM,sBAAsB,CAAA;AAO7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGpD,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAuItF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-api",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.8",
|
|
4
4
|
"description": "XYO Layer One API",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -52,22 +52,22 @@
|
|
|
52
52
|
"@opentelemetry/instrumentation": "~0.211.0",
|
|
53
53
|
"@opentelemetry/instrumentation-express": "~0.59.0",
|
|
54
54
|
"@opentelemetry/instrumentation-http": "~0.211.0",
|
|
55
|
-
"@xylabs/express": "~5.0.
|
|
56
|
-
"@xylabs/sdk-js": "~5.0.
|
|
55
|
+
"@xylabs/express": "~5.0.78",
|
|
56
|
+
"@xylabs/sdk-js": "~5.0.78",
|
|
57
57
|
"@xyo-network/account": "~5.3.2",
|
|
58
58
|
"@xyo-network/archivist-model": "~5.3.2",
|
|
59
59
|
"@xyo-network/boundwitness-model": "~5.3.2",
|
|
60
|
-
"@xyo-network/chain-orchestration": "~1.19.
|
|
61
|
-
"@xyo-network/chain-services": "~1.19.
|
|
62
|
-
"@xyo-network/chain-telemetry": "~1.19.
|
|
63
|
-
"@xyo-network/chain-utils": "~1.19.
|
|
64
|
-
"@xyo-network/chain-validation": "~1.19.
|
|
60
|
+
"@xyo-network/chain-orchestration": "~1.19.8",
|
|
61
|
+
"@xyo-network/chain-services": "~1.19.8",
|
|
62
|
+
"@xyo-network/chain-telemetry": "~1.19.8",
|
|
63
|
+
"@xyo-network/chain-utils": "~1.19.8",
|
|
64
|
+
"@xyo-network/chain-validation": "~1.19.8",
|
|
65
65
|
"@xyo-network/module-abstract": "~5.3.2",
|
|
66
66
|
"@xyo-network/module-model": "~5.3.2",
|
|
67
67
|
"@xyo-network/node-model": "~5.3.2",
|
|
68
68
|
"@xyo-network/payload-builder": "~5.3.2",
|
|
69
69
|
"@xyo-network/payload-model": "~5.3.2",
|
|
70
|
-
"@xyo-network/xl1-sdk": "~1.
|
|
70
|
+
"@xyo-network/xl1-sdk": "~1.23.6",
|
|
71
71
|
"compression": "~1.8.1",
|
|
72
72
|
"cors": "~2.8.6",
|
|
73
73
|
"ethers": "^6.16.0",
|
|
@@ -79,8 +79,8 @@
|
|
|
79
79
|
"@types/cors": "~2.8.19",
|
|
80
80
|
"@types/express": "5.0.6",
|
|
81
81
|
"@types/express-serve-static-core": "~5.1.1",
|
|
82
|
-
"@types/node": "~25.2.
|
|
83
|
-
"@xylabs/sdk-js": "~5.0.
|
|
82
|
+
"@types/node": "~25.2.3",
|
|
83
|
+
"@xylabs/sdk-js": "~5.0.78",
|
|
84
84
|
"@xylabs/ts-scripts-yarn3": "~7.3.2",
|
|
85
85
|
"@xylabs/tsconfig": "~7.3.2",
|
|
86
86
|
"@xyo-network/account": "~5.3.2",
|
|
@@ -88,11 +88,11 @@
|
|
|
88
88
|
"@xyo-network/archivist-abstract": "~5.3.2",
|
|
89
89
|
"@xyo-network/bios-model": "~7.2.1",
|
|
90
90
|
"@xyo-network/boundwitness-builder": "~5.3.2",
|
|
91
|
-
"@xyo-network/chain-services": "~1.19.
|
|
91
|
+
"@xyo-network/chain-services": "~1.19.8",
|
|
92
92
|
"@xyo-network/module-abstract-mongodb": "~5.3.2",
|
|
93
93
|
"@xyo-network/module-model-mongodb": "~5.3.2",
|
|
94
94
|
"@xyo-network/node-memory": "~5.3.2",
|
|
95
|
-
"@xyo-network/xl1-sdk": "~1.
|
|
95
|
+
"@xyo-network/xl1-sdk": "~1.23.6",
|
|
96
96
|
"dotenv": "~17.2.4",
|
|
97
97
|
"eslint": "^9.39.2",
|
|
98
98
|
"nodemon": "~3.1.11",
|
|
@@ -1,25 +1,24 @@
|
|
|
1
1
|
/* eslint-disable max-statements */
|
|
2
2
|
import type { Logger } from '@xylabs/sdk-js'
|
|
3
3
|
import { assertEx } from '@xylabs/sdk-js'
|
|
4
|
-
import { Account } from '@xyo-network/account'
|
|
5
4
|
import type { MempoolActorParams, ValidatorActorParams } from '@xyo-network/chain-orchestration'
|
|
6
5
|
import {
|
|
7
|
-
buildTelemetryConfig, initApiWallet, initBalanceSummaryMap, initEvmProvidersIfAvailable,
|
|
6
|
+
buildTelemetryConfig, initApiWallet, initBalanceSummaryMap, initEvmProvidersIfAvailable,
|
|
7
|
+
initFinalizationArchivistIfNeeded, initHealthEndpoints, initServerNode,
|
|
8
8
|
initStatusReporter, initTransferSummaryMap, MempoolActor, ValidatorActor,
|
|
9
9
|
} from '@xyo-network/chain-orchestration'
|
|
10
|
-
import { createBootstrapHead } from '@xyo-network/chain-services'
|
|
11
10
|
import { initTelemetry } from '@xyo-network/chain-telemetry'
|
|
12
11
|
import { startupSpanAsync } from '@xyo-network/chain-utils'
|
|
13
12
|
import { validateHydratedBlock, validateHydratedBlockState } from '@xyo-network/chain-validation'
|
|
14
13
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
15
14
|
import type {
|
|
16
|
-
AccountBalanceViewer, BlockViewer,
|
|
15
|
+
AccountBalanceViewer, BlockViewer, Config,
|
|
17
16
|
MempoolRunner,
|
|
18
17
|
MempoolViewer,
|
|
19
18
|
XyoViewer,
|
|
20
19
|
} from '@xyo-network/xl1-sdk'
|
|
21
20
|
import {
|
|
22
|
-
AccountBalanceViewerMoniker,
|
|
21
|
+
AccountBalanceViewerMoniker, BlockViewerMoniker, buildLocalProviderLocator, DefaultMetricsScrapePorts,
|
|
23
22
|
MempoolRunnerMoniker, MempoolViewerMoniker, SimpleBlockValidationViewer, SimpleXyoConnection,
|
|
24
23
|
XyoViewerMoniker,
|
|
25
24
|
} from '@xyo-network/xl1-sdk'
|
|
@@ -35,7 +34,6 @@ interface InitServerContext {
|
|
|
35
34
|
|
|
36
35
|
export async function initApiParams(params: InitServerContext): Promise<ApiActorParams> {
|
|
37
36
|
const { config, node: providedNode } = params
|
|
38
|
-
const { id: configuredChainId } = config.chain
|
|
39
37
|
|
|
40
38
|
const logger = assertEx(params.logger, () => 'Logger is required to init server')
|
|
41
39
|
|
|
@@ -81,29 +79,8 @@ export async function initApiParams(params: InitServerContext): Promise<ApiActor
|
|
|
81
79
|
await pendingTransactionsArchivist.start()
|
|
82
80
|
await pendingBlocksArchivist.start()
|
|
83
81
|
|
|
84
|
-
const
|
|
85
|
-
if (configuredChainId && possibleHead && possibleHead.chain !== configuredChainId) {
|
|
86
|
-
throw new Error(`Configured chain ID (${configuredChainId}) does not match the existing chain ID (${possibleHead.chain})`)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
let possibleChainId: ChainId | undefined = configuredChainId
|
|
90
|
-
|
|
91
|
-
// if there is no configured chain ID and no head, create a new chain
|
|
92
|
-
if (!possibleHead) {
|
|
93
|
-
possibleChainId = possibleChainId ?? (await Account.random()).address
|
|
94
|
-
// If there is no head, create one
|
|
95
|
-
const chain = await createBootstrapHead(
|
|
96
|
-
wallet,
|
|
97
|
-
possibleChainId,
|
|
98
|
-
asAttoXL1(20_000_000_000_000_000_000_000n),
|
|
99
|
-
config.chain.genesisRewardAddress ?? wallet.address,
|
|
100
|
-
)
|
|
101
|
-
const payloads = chain.flatMap(block => flattenHydratedBlock(block))
|
|
102
|
-
await writableChainArchivist.insert(payloads)
|
|
103
|
-
}
|
|
82
|
+
const [head, chainId] = await initFinalizationArchivistIfNeeded(writableChainArchivist, config, wallet)
|
|
104
83
|
|
|
105
|
-
const head = possibleHead ?? assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')
|
|
106
|
-
const chainId = assertEx(possibleChainId, () => 'Chain ID could not be determined')
|
|
107
84
|
assertEx(head.chain === chainId, () => `Chain ID does not match head block chain ID [init] [${head.chain} !== ${chainId}]`)
|
|
108
85
|
|
|
109
86
|
const mods = await node.resolve('*')
|
|
@@ -119,7 +96,6 @@ export async function initApiParams(params: InitServerContext): Promise<ApiActor
|
|
|
119
96
|
balancesSummaryMap,
|
|
120
97
|
transfersSummaryMap,
|
|
121
98
|
node,
|
|
122
|
-
chainId,
|
|
123
99
|
})
|
|
124
100
|
|
|
125
101
|
await initEvmProvidersIfAvailable(locator)
|
|
@@ -158,7 +134,7 @@ export async function initApiParams(params: InitServerContext): Promise<ApiActor
|
|
|
158
134
|
|
|
159
135
|
console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)
|
|
160
136
|
|
|
161
|
-
const validatorActor = config.mempool.enabled
|
|
137
|
+
const validatorActor = config.actors.mempool.enabled
|
|
162
138
|
? undefined
|
|
163
139
|
: await ValidatorActor.create({
|
|
164
140
|
id: 'validator-mempool-server',
|
|
@@ -171,7 +147,7 @@ export async function initApiParams(params: InitServerContext): Promise<ApiActor
|
|
|
171
147
|
|
|
172
148
|
await validatorActor?.start()
|
|
173
149
|
|
|
174
|
-
const mempoolActor = config.mempool.enabled
|
|
150
|
+
const mempoolActor = config.actors.mempool.enabled
|
|
175
151
|
? undefined
|
|
176
152
|
: await MempoolActor.create({
|
|
177
153
|
id: 'mempool-mempool-server',
|
package/src/server/server.ts
CHANGED
|
@@ -5,7 +5,7 @@ const hostname = '::'
|
|
|
5
5
|
|
|
6
6
|
export async function getServer(context: ApiContext) {
|
|
7
7
|
const { logger } = context
|
|
8
|
-
const { port } = context.config.api
|
|
8
|
+
const { port } = context.config.actors.api
|
|
9
9
|
|
|
10
10
|
const app = await getApp(context)
|
|
11
11
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))
|