@xyo-network/chain-api 1.3.15 → 1.3.17

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.
@@ -13,6 +13,7 @@ import { asAddress } from "@xylabs/hex";
13
13
  import { MongoDBArchivistV2 } from "@xyo-network/archivist-mongodb";
14
14
  import { ViewArchivist } from "@xyo-network/archivist-view";
15
15
  import { AddressBalanceDiviner, HeadValidationDiviner } from "@xyo-network/chain-modules";
16
+ import { initTelemetry } from "@xyo-network/chain-telemetry";
16
17
  import { PayloadPointerDiviner } from "@xyo-network/diviner-payload-pointer";
17
18
  import { TemporalIndexingDiviner, TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner, TemporalIndexingDivinerIndexCandidateToIndexDiviner, TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner, TemporalIndexingDivinerStateToIndexCandidateDiviner } from "@xyo-network/diviner-temporal-indexing";
18
19
  import { hasMongoDBConfig } from "@xyo-network/module-abstract-mongodb";
@@ -20,13 +21,23 @@ import { ModuleFactoryLocator } from "@xyo-network/module-factory-locator";
20
21
  import { MemorySentinel } from "@xyo-network/sentinel-memory";
21
22
  import { TimestampWitness } from "@xyo-network/witness-timestamp";
22
23
  var getLocator = /* @__PURE__ */ __name(async () => {
23
- await Promise.resolve();
24
+ const { traceProvider } = await initTelemetry({
25
+ attributes: {
26
+ serviceName: "xl1-api",
27
+ serviceVersion: "1.0.0"
28
+ },
29
+ metricsConfig: {
30
+ endpoint: "/metrics",
31
+ port: 9465
32
+ }
33
+ });
24
34
  const locator = new ModuleFactoryLocator();
25
35
  if (hasMongoDBConfig()) {
26
36
  locator.register(MongoDBArchivistV2, void 0, true);
27
37
  }
28
38
  locator.register(AddressBalanceDiviner);
29
39
  locator.register(HeadValidationDiviner.factory({
40
+ tracer: traceProvider.getTracer("HeadValidationDiviner"),
30
41
  chainIdentification: {
31
42
  id: assertEx(asAddress(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS), () => "XYO_EVM_STAKING_CONTRACT_ADDRESS is required and must be an Address")
32
43
  }
@@ -258,10 +269,10 @@ var PublicChildManifests = [
258
269
  var getNode = /* @__PURE__ */ __name(async (locator) => {
259
270
  locator = locator ?? await getLocator();
260
271
  const mnemonic = process.env.MNEMONIC;
261
- const wallet = await (mnemonic ? HDWallet.fromPhrase(mnemonic) : HDWallet.random());
272
+ const wallet = await (mnemonic === void 0 ? HDWallet.random() : HDWallet.fromPhrase(mnemonic));
262
273
  const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests);
263
274
  const [node, ...childNodes] = await wrapper.loadNodes();
264
- if (childNodes?.length) {
275
+ if (childNodes?.length > 0) {
265
276
  await Promise.all(childNodes.map((childNode) => node.register(childNode)));
266
277
  await Promise.all(childNodes.map((childNode) => node.attach(childNode.address, true)));
267
278
  }
@@ -269,6 +280,20 @@ var getNode = /* @__PURE__ */ __name(async (locator) => {
269
280
  return node;
270
281
  }, "getNode");
271
282
 
283
+ // src/server/instrumentation.ts
284
+ import { registerInstrumentations } from "@opentelemetry/instrumentation";
285
+ import { ExpressInstrumentation } from "@opentelemetry/instrumentation-express";
286
+ import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
287
+ var addInstrumentation = /* @__PURE__ */ __name(() => {
288
+ const instrumentations = [
289
+ new HttpInstrumentation(),
290
+ new ExpressInstrumentation()
291
+ ];
292
+ registerInstrumentations({
293
+ instrumentations
294
+ });
295
+ }, "addInstrumentation");
296
+
272
297
  // src/server/routes/address/addNodeRoutes.ts
273
298
  import { StatusCodes as StatusCodes3 } from "http-status-codes";
274
299
 
@@ -283,7 +308,7 @@ var handler = /* @__PURE__ */ __name(async (req, res, next) => {
283
308
  const { address: rawAddress } = req.params;
284
309
  const { node } = req.app;
285
310
  const address = asAddress2(rawAddress);
286
- if (address) {
311
+ if (address !== void 0) {
287
312
  let mod = node.address === address ? node : await node.resolve(address, {
288
313
  direction: "down"
289
314
  });
@@ -314,6 +339,7 @@ import { asAddress as asAddress3 } from "@xylabs/hex";
314
339
  import { isQueryBoundWitness } from "@xyo-network/boundwitness-model";
315
340
  import { ModuleErrorBuilder } from "@xyo-network/module-abstract";
316
341
  import { trimAddressPrefix as trimAddressPrefix2 } from "@xyo-network/node-core-lib";
342
+ import { isAddress } from "ethers";
317
343
  import { StatusCodes as StatusCodes2 } from "http-status-codes";
318
344
 
319
345
  // src/server/routes/address/post/getQueryConfig.ts
@@ -356,7 +382,7 @@ var handler2 = /* @__PURE__ */ __name(async (req, res, next) => {
356
382
  const { address } = req.params;
357
383
  const { node } = req.app;
358
384
  const [bw, payloads] = Array.isArray(req.body) ? req.body : [];
359
- if (!address) {
385
+ if (!isAddress(address)) {
360
386
  return returnError(StatusCodes2.BAD_REQUEST, "Missing address");
361
387
  }
362
388
  if (!bw) {
@@ -372,9 +398,9 @@ var handler2 = /* @__PURE__ */ __name(async (req, res, next) => {
372
398
  ];
373
399
  else {
374
400
  const typedAddress = asAddress3(address);
375
- const byAddress = typedAddress ? await node.resolve(typedAddress, {
401
+ const byAddress = typedAddress === void 0 ? void 0 : await node.resolve(typedAddress, {
376
402
  maxDepth: 10
377
- }) : void 0;
403
+ });
378
404
  if (byAddress) modules = [
379
405
  byAddress
380
406
  ];
@@ -459,6 +485,7 @@ var addRoutes = /* @__PURE__ */ __name((app) => {
459
485
  // src/server/app.ts
460
486
  var getApp = /* @__PURE__ */ __name(async (node) => {
461
487
  node = node ?? await getNode();
488
+ addInstrumentation();
462
489
  const app = express();
463
490
  app.set("etag", false);
464
491
  app.use(cors());
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/app.ts","../../src/manifest/getLocator.ts","../../src/manifest/getNode.ts","../../src/manifest/node.json","../../src/manifest/nodeManifest.ts","../../src/manifest/private/index.ts","../../src/manifest/public/Chain.json","../../src/manifest/public/Pending.json","../../src/manifest/public/index.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/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { MemoryNode } from '@xyo-network/node-memory'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { getNode } from '../manifest/index.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (node?: MemoryNode): Promise<Express> => {\n node = node ?? (await getNode())\n const app = express()\n app.set('etag', false)\n // eslint-disable-next-line sonarjs/cors\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.node = node\n addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asAddress } from '@xylabs/hex'\nimport { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'\nimport { ViewArchivist } from '@xyo-network/archivist-view'\nimport { AddressBalanceDiviner, HeadValidationDiviner } from '@xyo-network/chain-modules'\nimport { PayloadPointerDiviner } from '@xyo-network/diviner-payload-pointer'\nimport {\n TemporalIndexingDiviner,\n TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner,\n TemporalIndexingDivinerIndexCandidateToIndexDiviner,\n TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner,\n TemporalIndexingDivinerStateToIndexCandidateDiviner,\n} from '@xyo-network/diviner-temporal-indexing'\nimport { hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { TimestampWitness } from '@xyo-network/witness-timestamp'\n\n/**\n * Used for retrieving a locator with the necessary modules registered for testing\n * operation of the node (entirely in memory)\n * @returns A locator with the necessary modules registered\n */\nexport const getLocator = async () => {\n await Promise.resolve()\n const locator = new ModuleFactoryLocator()\n // If there's a MongoDB configuration\n if (hasMongoDBConfig()) {\n // Register the MongoDB Archivist & Diviners as the defaults\n locator.register(MongoDBArchivistV2, undefined, true)\n }\n locator.register(AddressBalanceDiviner)\n locator.register(HeadValidationDiviner.factory({\n chainIdentification: {\n id: assertEx(\n asAddress(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS),\n () => 'XYO_EVM_STAKING_CONTRACT_ADDRESS is required and must be an Address',\n ),\n },\n }))\n locator.register(MemorySentinel)\n locator.register(PayloadPointerDiviner)\n locator.register(TemporalIndexingDiviner)\n locator.register(TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner)\n locator.register(TemporalIndexingDivinerIndexCandidateToIndexDiviner)\n locator.register(TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner)\n locator.register(TemporalIndexingDivinerStateToIndexCandidateDiviner)\n locator.register(TimestampWitness)\n locator.register(ViewArchivist)\n return locator\n}\n","import { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport { HDWallet } from '@xyo-network/wallet'\n\nimport { getLocator } from './getLocator.ts'\nimport { NodeManifest } from './nodeManifest.ts'\nimport { PrivateChildManifests } from './private/index.ts'\nimport { PublicChildManifests } from './public/index.ts'\n\n/**\n * Creates a node with the xyo-chain modules registered\n * @param locator The locator to use for the node\n * @returns A node with the xyo-chain modules registered\n */\nexport const getNode = async (locator?: ModuleFactoryLocator) => {\n locator = locator ?? await getLocator()\n const mnemonic = process.env.MNEMONIC\n const wallet = await (mnemonic ? HDWallet.fromPhrase(mnemonic) : HDWallet.random())\n const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)\n const [node, ...childNodes] = await wrapper.loadNodes()\n if (childNodes?.length) {\n await Promise.all(childNodes.map(childNode => node.register(childNode)))\n await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))\n }\n console.log(await node.state())\n return node\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"44'/60'/1\",\n \"name\": \"XYOChain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": []\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport node from './node.json' with { type: 'json' }\n\n/**\n * Root Node Manifest\n */\nexport const NodeManifest = node as PackageManifestPayload\n","/**\n * Private Child Manifests\n */\nexport const PrivateChildManifests = []\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"1\",\n \"name\": \"Chain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"name\": \"Validated\",\n \"payloadSdkConfig\": {\n \"collection\": \"chain_validated\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/2'\",\n \"schema\": \"network.xyo.diviner.chain.head.validation.config\",\n \"inArchivist\": \"Chain:Submissions\",\n \"outArchivist\": \"Chain:Validated\",\n \"name\": \"HeadValidationDiviner\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/3'\",\n \"automations\": [\n {\n \"frequency\": 100,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"ChainValidationSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": false,\n \"tasks\": [\n {\n \"mod\": \"HeadValidationDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"name\": \"Submissions\",\n \"payloadSdkConfig\": {\n \"collection\": \"chain_submissions\"\n },\n \"schema\": \"network.xyo.archivist.config\",\n \"sourceArchivist\": \"inArchivist\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/2\",\n \"allowedQueries\": [\n \"network.xyo.query.archivist.get\",\n \"network.xyo.query.archivist.next\"\n ],\n \"originArchivist\": \"Chain:Validated\",\n \"name\": \"Finalized\",\n \"schema\": \"network.xyo.archivist.view.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/3\",\n \"schema\": \"network.xyo.diviner.chain.address.balance.config\",\n \"archivist\": \"Chain:Validated\",\n \"name\": \"AddressBalanceDiviner\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"2\",\n \"name\": \"Pending\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"2/1'/1'\",\n \"name\": \"TimestampWitness\",\n \"schema\": \"network.xyo.witness.timestamp.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"2/1'/3'\",\n \"archiving\": {\n \"archivists\": [\n \"Pending:PendingTransactions\"\n ]\n },\n \"automations\": [\n {\n \"frequency\": 1,\n \"frequencyUnits\": \"minute\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"TimeTransactionSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": false,\n \"tasks\": [\n {\n \"input\": true,\n \"mod\": \"TimestampWitness\"\n },\n {\n \"input\": [\n \"TimestampWitness\"\n ],\n \"mod\": \"AdHocChainTransactionWitness\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"2/1/1\",\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"language\": \"javascript\",\n \"name\": \"PendingTransactions\",\n \"payloadSdkConfig\": {\n \"collection\": \"pending\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport Chain from './Chain.json' with { type: 'json' }\nimport Pending from './Pending.json' with { type: 'json' }\n\n/**\n * Chain Node Manifest\n */\nexport const ChainNodeManifest = Chain as PackageManifestPayload\n/**\n * Pending Node Manifest\n */\nexport const PendingNodeManifest = Pending as PackageManifestPayload\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = [\n ...ChainNodeManifest.nodes,\n ...PendingNodeManifest.nodes,\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.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 { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport { asAddress } from '@xylabs/hex'\nimport { isModuleIdentifierPart } from '@xyo-network/module-model'\nimport { trimAddressPrefix } from '@xyo-network/node-core-lib'\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: rawAddress } = req.params\n const { node } = req.app\n const address = asAddress(rawAddress)\n if (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 (isModuleIdentifierPart(rawAddress)) {\n const moduleIdentifier = trimAddressPrefix(rawAddress)\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n const moduleAddress = assertEx(mod?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${moduleAddress}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport { type Address, asAddress } from '@xylabs/hex'\nimport type { JsonObject } from '@xylabs/object'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { Module, ModuleQueryResult } from '@xyo-network/module-model'\nimport { trimAddressPrefix } from '@xyo-network/node-core-lib'\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\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!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: Module[] = []\n const normalizedAddress = trimAddressPrefix(address) as Address\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = typedAddress ? await node.resolve(typedAddress, { maxDepth: 10 }) : undefined\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 = await 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 { AbstractModule } from '@xyo-network/module-abstract'\nimport type { Module, ModuleConfig } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { ArchiveModuleConfig } from '@xyo-network/node-core-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 = async (mod: Module, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): Promise<ModuleConfig | undefined> => {\n const archivist = mod as unknown as AbstractModule\n const config = archivist?.config as unknown as ArchiveModuleConfig\n const archive = config?.archive\n // TODO: Filter based on query addresses?\n const requestCanAccessArchive = await Promise.resolve(true)\n if (archive && requestCanAccessArchive) {\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 const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length)\n const allowed = addresses.length > 0 ? Object.fromEntries(archivist.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n MemoryXyoProvider, NodeXyoRunner, rpcEngineFromProvider,\n} from '@xyo-network/xl1-rpc'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = (app: Express) => {\n const { node } = app\n const runner = new NodeXyoRunner(node)\n const viewer = new NodeXyoViewer(node)\n const provider = new MemoryXyoProvider({ runner, viewer })\n const engine = rpcEngineFromProvider(provider)\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 { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = (app: Express) => {\n addRpcRoutes(app)\n addNodeRoutes(app)\n}\n","import { tryParseInt } from '@xylabs/express'\nimport type { MemoryNode } from '@xyo-network/node-memory'\n\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\nexport const getServer = async (port?: number, node?: MemoryNode) => {\n const appPort = port ?? tryParseInt(process.env.APP_PORT) ?? 80\n const app = await getApp(node)\n const server = app.listen(appPort, hostname, () => console.log(`Server listening at http://${hostname}:${appPort}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","assertEx","asAddress","MongoDBArchivistV2","ViewArchivist","AddressBalanceDiviner","HeadValidationDiviner","PayloadPointerDiviner","TemporalIndexingDiviner","TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner","TemporalIndexingDivinerIndexCandidateToIndexDiviner","TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner","TemporalIndexingDivinerStateToIndexCandidateDiviner","hasMongoDBConfig","ModuleFactoryLocator","MemorySentinel","TimestampWitness","getLocator","Promise","resolve","locator","ModuleFactoryLocator","hasMongoDBConfig","register","MongoDBArchivistV2","undefined","AddressBalanceDiviner","HeadValidationDiviner","factory","chainIdentification","id","assertEx","asAddress","process","env","XYO_EVM_STAKING_CONTRACT_ADDRESS","MemorySentinel","PayloadPointerDiviner","TemporalIndexingDiviner","TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner","TemporalIndexingDivinerIndexCandidateToIndexDiviner","TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner","TemporalIndexingDivinerStateToIndexCandidateDiviner","TimestampWitness","ViewArchivist","ManifestWrapper","HDWallet","NodeManifest","node","PrivateChildManifests","ChainNodeManifest","Chain","PendingNodeManifest","Pending","PublicChildManifests","nodes","getNode","locator","getLocator","mnemonic","process","env","MNEMONIC","wallet","HDWallet","fromPhrase","random","wrapper","ManifestWrapper","NodeManifest","PublicChildManifests","PrivateChildManifests","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","console","log","state","StatusCodes","assertEx","asyncHandler","asAddress","isModuleIdentifierPart","trimAddressPrefix","StatusCodes","handler","req","res","next","address","rawAddress","params","node","app","asAddress","mod","resolve","direction","json","state","isModuleIdentifierPart","moduleIdentifier","trimAddressPrefix","moduleAddress","assertEx","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","assertEx","asyncHandler","asAddress","isQueryBoundWitness","ModuleErrorBuilder","trimAddressPrefix","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","archivist","config","archive","requestCanAccessArchive","Promise","resolve","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","bw","payloads","Array","isArray","body","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","trimAddressPrefix","typedAddress","asAddress","byAddress","resolve","maxDepth","undefined","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","NodeXyoViewer","MemoryXyoProvider","NodeXyoRunner","rpcEngineFromProvider","addRpcRoutes","app","node","runner","NodeXyoRunner","viewer","NodeXyoViewer","provider","MemoryXyoProvider","engine","rpcEngineFromProvider","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addNodeRoutes","getApp","node","getNode","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","tryParseInt","hostname","getServer","port","node","appPort","tryParseInt","process","env","APP_PORT","app","getApp","server","listen","console","log","setTimeout"]}
1
+ {"version":3,"sources":["../../src/server/app.ts","../../src/manifest/getLocator.ts","../../src/manifest/getNode.ts","../../src/manifest/node.json","../../src/manifest/nodeManifest.ts","../../src/manifest/private/index.ts","../../src/manifest/public/Chain.json","../../src/manifest/public/Pending.json","../../src/manifest/public/index.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/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { MemoryNode } from '@xyo-network/node-memory'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { getNode } from '../manifest/index.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (node?: MemoryNode): Promise<Express> => {\n node = node ?? (await getNode())\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n // eslint-disable-next-line sonarjs/cors\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.node = node\n addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asAddress } from '@xylabs/hex'\nimport { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'\nimport { ViewArchivist } from '@xyo-network/archivist-view'\nimport { AddressBalanceDiviner, HeadValidationDiviner } from '@xyo-network/chain-modules'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { PayloadPointerDiviner } from '@xyo-network/diviner-payload-pointer'\nimport {\n TemporalIndexingDiviner,\n TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner,\n TemporalIndexingDivinerIndexCandidateToIndexDiviner,\n TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner,\n TemporalIndexingDivinerStateToIndexCandidateDiviner,\n} from '@xyo-network/diviner-temporal-indexing'\nimport { hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { TimestampWitness } from '@xyo-network/witness-timestamp'\n\n/**\n * Used for retrieving a locator with the necessary modules registered for testing\n * operation of the node (entirely in memory)\n * @returns A locator with the necessary modules registered\n */\nexport const getLocator = async () => {\n const { traceProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-api',\n serviceVersion: '1.0.0',\n },\n metricsConfig: {\n endpoint: '/metrics',\n port: 9465,\n },\n })\n const locator = new ModuleFactoryLocator()\n // If there's a MongoDB configuration\n if (hasMongoDBConfig()) {\n // Register the MongoDB Archivist & Diviners as the defaults\n locator.register(MongoDBArchivistV2, undefined, true)\n }\n locator.register(AddressBalanceDiviner)\n locator.register(HeadValidationDiviner.factory({\n tracer: traceProvider.getTracer('HeadValidationDiviner'),\n chainIdentification: {\n id: assertEx(\n asAddress(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS),\n () => 'XYO_EVM_STAKING_CONTRACT_ADDRESS is required and must be an Address',\n ),\n },\n }))\n locator.register(MemorySentinel)\n locator.register(PayloadPointerDiviner)\n locator.register(TemporalIndexingDiviner)\n locator.register(TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner)\n locator.register(TemporalIndexingDivinerIndexCandidateToIndexDiviner)\n locator.register(TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner)\n locator.register(TemporalIndexingDivinerStateToIndexCandidateDiviner)\n locator.register(TimestampWitness)\n locator.register(ViewArchivist)\n return locator\n}\n","import { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport { HDWallet } from '@xyo-network/wallet'\n\nimport { getLocator } from './getLocator.ts'\nimport { NodeManifest } from './nodeManifest.ts'\nimport { PrivateChildManifests } from './private/index.ts'\nimport { PublicChildManifests } from './public/index.ts'\n\n/**\n * Creates a node with the xyo-chain modules registered\n * @param locator The locator to use for the node\n * @returns A node with the xyo-chain modules registered\n */\nexport const getNode = async (locator?: ModuleFactoryLocator) => {\n locator = locator ?? await getLocator()\n const mnemonic = process.env.MNEMONIC\n const wallet = await (mnemonic === undefined ? HDWallet.random() : HDWallet.fromPhrase(mnemonic))\n const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)\n const [node, ...childNodes] = await wrapper.loadNodes()\n if (childNodes?.length > 0) {\n await Promise.all(childNodes.map(childNode => node.register(childNode)))\n await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))\n }\n console.log(await node.state())\n return node\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"44'/60'/1\",\n \"name\": \"XYOChain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": []\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport node from './node.json' with { type: 'json' }\n\n/**\n * Root Node Manifest\n */\nexport const NodeManifest = node as PackageManifestPayload\n","/**\n * Private Child Manifests\n */\nexport const PrivateChildManifests = []\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"1\",\n \"name\": \"Chain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"name\": \"Validated\",\n \"payloadSdkConfig\": {\n \"collection\": \"chain_validated\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/2'\",\n \"schema\": \"network.xyo.diviner.chain.head.validation.config\",\n \"inArchivist\": \"Chain:Submissions\",\n \"outArchivist\": \"Chain:Validated\",\n \"name\": \"HeadValidationDiviner\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/3'\",\n \"automations\": [\n {\n \"frequency\": 100,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"ChainValidationSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": false,\n \"tasks\": [\n {\n \"mod\": \"HeadValidationDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"name\": \"Submissions\",\n \"payloadSdkConfig\": {\n \"collection\": \"chain_submissions\"\n },\n \"schema\": \"network.xyo.archivist.config\",\n \"sourceArchivist\": \"inArchivist\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/2\",\n \"allowedQueries\": [\n \"network.xyo.query.archivist.get\",\n \"network.xyo.query.archivist.next\"\n ],\n \"originArchivist\": \"Chain:Validated\",\n \"name\": \"Finalized\",\n \"schema\": \"network.xyo.archivist.view.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/3\",\n \"schema\": \"network.xyo.diviner.chain.address.balance.config\",\n \"archivist\": \"Chain:Validated\",\n \"name\": \"AddressBalanceDiviner\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"2\",\n \"name\": \"Pending\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"2/1'/1'\",\n \"name\": \"TimestampWitness\",\n \"schema\": \"network.xyo.witness.timestamp.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"2/1'/3'\",\n \"archiving\": {\n \"archivists\": [\n \"Pending:PendingTransactions\"\n ]\n },\n \"automations\": [\n {\n \"frequency\": 1,\n \"frequencyUnits\": \"minute\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"TimeTransactionSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": false,\n \"tasks\": [\n {\n \"input\": true,\n \"mod\": \"TimestampWitness\"\n },\n {\n \"input\": [\n \"TimestampWitness\"\n ],\n \"mod\": \"AdHocChainTransactionWitness\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"2/1/1\",\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"language\": \"javascript\",\n \"name\": \"PendingTransactions\",\n \"payloadSdkConfig\": {\n \"collection\": \"pending\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport Chain from './Chain.json' with { type: 'json' }\nimport Pending from './Pending.json' with { type: 'json' }\n\n/**\n * Chain Node Manifest\n */\nexport const ChainNodeManifest = Chain as PackageManifestPayload\n/**\n * Pending Node Manifest\n */\nexport const PendingNodeManifest = Pending as PackageManifestPayload\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = [\n ...ChainNodeManifest.nodes,\n ...PendingNodeManifest.nodes,\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 *\n * @returns {void}\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.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 { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport { asAddress } from '@xylabs/hex'\nimport { isModuleIdentifierPart } from '@xyo-network/module-model'\nimport { trimAddressPrefix } from '@xyo-network/node-core-lib'\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: rawAddress } = req.params\n const { node } = req.app\n const address = asAddress(rawAddress)\n if (address !== undefined) {\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 (isModuleIdentifierPart(rawAddress)) {\n const moduleIdentifier = trimAddressPrefix(rawAddress)\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n const moduleAddress = assertEx(mod?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${moduleAddress}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport { type Address, asAddress } from '@xylabs/hex'\nimport type { JsonObject } from '@xylabs/object'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { Module, ModuleQueryResult } from '@xyo-network/module-model'\nimport { trimAddressPrefix } from '@xyo-network/node-core-lib'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport { isAddress } from 'ethers'\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\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: Module[] = []\n const normalizedAddress = trimAddressPrefix(address) as 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 = await 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 { AbstractModule } from '@xyo-network/module-abstract'\nimport type { Module, ModuleConfig } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { ArchiveModuleConfig } from '@xyo-network/node-core-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 = async (mod: Module, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): Promise<ModuleConfig | undefined> => {\n const archivist = mod as unknown as AbstractModule\n const config = archivist?.config as unknown as ArchiveModuleConfig\n const archive = config?.archive\n // TODO: Filter based on query addresses?\n const requestCanAccessArchive = await Promise.resolve(true)\n if (archive && requestCanAccessArchive) {\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)\n const allowed = addresses.length > 0 ? Object.fromEntries(archivist.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n MemoryXyoProvider, NodeXyoRunner, rpcEngineFromProvider,\n} from '@xyo-network/xl1-rpc'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = (app: Express) => {\n const { node } = app\n const runner = new NodeXyoRunner(node)\n const viewer = new NodeXyoViewer(node)\n const provider = new MemoryXyoProvider({ runner, viewer })\n const engine = rpcEngineFromProvider(provider)\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 { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = (app: Express) => {\n addRpcRoutes(app)\n addNodeRoutes(app)\n}\n","import { tryParseInt } from '@xylabs/express'\nimport type { MemoryNode } from '@xyo-network/node-memory'\n\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\nexport const getServer = async (port?: number, node?: MemoryNode) => {\n const appPort = port ?? tryParseInt(process.env.APP_PORT) ?? 80\n const app = await getApp(node)\n const server = app.listen(appPort, hostname, () => console.log(`Server listening at http://${hostname}:${appPort}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","assertEx","asAddress","MongoDBArchivistV2","ViewArchivist","AddressBalanceDiviner","HeadValidationDiviner","initTelemetry","PayloadPointerDiviner","TemporalIndexingDiviner","TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner","TemporalIndexingDivinerIndexCandidateToIndexDiviner","TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner","TemporalIndexingDivinerStateToIndexCandidateDiviner","hasMongoDBConfig","ModuleFactoryLocator","MemorySentinel","TimestampWitness","getLocator","traceProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","locator","ModuleFactoryLocator","hasMongoDBConfig","register","MongoDBArchivistV2","undefined","AddressBalanceDiviner","HeadValidationDiviner","factory","tracer","getTracer","chainIdentification","id","assertEx","asAddress","process","env","XYO_EVM_STAKING_CONTRACT_ADDRESS","MemorySentinel","PayloadPointerDiviner","TemporalIndexingDiviner","TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner","TemporalIndexingDivinerIndexCandidateToIndexDiviner","TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner","TemporalIndexingDivinerStateToIndexCandidateDiviner","TimestampWitness","ViewArchivist","ManifestWrapper","HDWallet","NodeManifest","node","PrivateChildManifests","ChainNodeManifest","Chain","PendingNodeManifest","Pending","PublicChildManifests","nodes","getNode","locator","getLocator","mnemonic","process","env","MNEMONIC","wallet","undefined","HDWallet","random","fromPhrase","wrapper","ManifestWrapper","NodeManifest","PublicChildManifests","PrivateChildManifests","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","console","log","state","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","assertEx","asyncHandler","asAddress","isModuleIdentifierPart","trimAddressPrefix","StatusCodes","handler","req","res","next","address","rawAddress","params","node","app","asAddress","undefined","mod","resolve","direction","json","state","isModuleIdentifierPart","moduleIdentifier","trimAddressPrefix","moduleAddress","assertEx","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","assertEx","asyncHandler","asAddress","isQueryBoundWitness","ModuleErrorBuilder","trimAddressPrefix","isAddress","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","archivist","config","archive","requestCanAccessArchive","Promise","resolve","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","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","trimAddressPrefix","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","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","NodeXyoViewer","MemoryXyoProvider","NodeXyoRunner","rpcEngineFromProvider","addRpcRoutes","app","node","runner","NodeXyoRunner","viewer","NodeXyoViewer","provider","MemoryXyoProvider","engine","rpcEngineFromProvider","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addNodeRoutes","getApp","node","getNode","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","tryParseInt","hostname","getServer","port","node","appPort","tryParseInt","process","env","APP_PORT","app","getApp","server","listen","console","log","setTimeout"]}
@@ -1 +1 @@
1
- {"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAI1E;;;;GAIG;AACH,eAAO,MAAM,UAAU,qCA2BtB,CAAA"}
1
+ {"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAI1E;;;;GAIG;AACH,eAAO,MAAM,UAAU,qCAqCtB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAG1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,MAAM,GAAU,OAAO,UAAU,KAAG,OAAO,CAAC,OAAO,CAiB/D,CAAA"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAG1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAOtC,eAAO,MAAM,MAAM,GAAU,OAAO,UAAU,KAAG,OAAO,CAAC,OAAO,CAkB/D,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Registers OpenTelemetry instrumentations for HTTP and Express.
3
+ * This function is used to set up the necessary instrumentations for monitoring
4
+ * HTTP requests and Express applications. Since it monkey patches the Express
5
+ * router & middleware system, it should be called before any Express applications
6
+ * are defined.
7
+ *
8
+ * @returns {void}
9
+ */
10
+ export declare const addInstrumentation: () => void;
11
+ //# sourceMappingURL=instrumentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../../src/server/instrumentation.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,YAG9B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getQueryConfig.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/post/getQueryConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAGtF,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAGrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAItC,eAAO,MAAM,cAAc,GAAU,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,IAAI,iBAAiB,EAAE,WAAW,OAAO,EAAE,KAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAkB7I,CAAA"}
1
+ {"version":3,"file":"getQueryConfig.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/post/getQueryConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAGtF,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAGrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAItC,eAAO,MAAM,cAAc,GAAU,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,IAAI,iBAAiB,EAAE,WAAW,OAAO,EAAE,KAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAmB7I,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/post/post.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAE7F,OAAO,KAAK,EAAU,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAItE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAGhE,KAAK,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,SAAS,GAAG,OAAO,EAAE,CAAC,CAAA;AA2DxE,eAAO,MAAM,WAAW,wSAAwB,CAAA"}
1
+ {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/post/post.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAE7F,OAAO,KAAK,EAAU,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAKtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAGhE,KAAK,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,SAAS,GAAG,OAAO,EAAE,CAAC,CAAA;AA2DxE,eAAO,MAAM,WAAW,wSAAwB,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json.schemastore.org/package.json",
3
3
  "name": "@xyo-network/chain-api",
4
- "version": "1.3.15",
4
+ "version": "1.3.17",
5
5
  "description": "XYO Layer One API",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -41,30 +41,34 @@
41
41
  "types": "tsc --noEmit -p tsconfig.test.json"
42
42
  },
43
43
  "dependencies": {
44
- "@xylabs/assert": "^4.8.9",
45
- "@xylabs/express": "^4.8.9",
46
- "@xylabs/hex": "^4.8.9",
47
- "@xyo-network/archivist-mongodb": "^3.14.16",
48
- "@xyo-network/archivist-view": "^3.14.16",
49
- "@xyo-network/boundwitness-model": "^3.14.16",
50
- "@xyo-network/chain-modules": "^1.3.15",
51
- "@xyo-network/chain-rpc": "^1.3.15",
52
- "@xyo-network/diviner-payload-pointer": "^3.14.16",
53
- "@xyo-network/diviner-temporal-indexing": "^3.14.16",
54
- "@xyo-network/manifest-model": "^3.14.16",
55
- "@xyo-network/manifest-wrapper": "^3.14.16",
56
- "@xyo-network/module-abstract": "^3.14.16",
57
- "@xyo-network/module-abstract-mongodb": "^3.14.16",
58
- "@xyo-network/module-factory-locator": "^3.14.16",
59
- "@xyo-network/module-model": "^3.14.16",
44
+ "@opentelemetry/instrumentation": "^0.49.1",
45
+ "@opentelemetry/instrumentation-express": "^0.49.0",
46
+ "@opentelemetry/instrumentation-http": "^0.200.0",
47
+ "@xylabs/assert": "^4.9.3",
48
+ "@xylabs/express": "^4.9.3",
49
+ "@xylabs/hex": "^4.9.3",
50
+ "@xyo-network/archivist-mongodb": "^3.14.17",
51
+ "@xyo-network/archivist-view": "^3.14.17",
52
+ "@xyo-network/boundwitness-model": "^3.14.17",
53
+ "@xyo-network/chain-modules": "^1.3.17",
54
+ "@xyo-network/chain-rpc": "^1.3.17",
55
+ "@xyo-network/chain-telemetry": "^1.3.17",
56
+ "@xyo-network/diviner-payload-pointer": "^3.14.17",
57
+ "@xyo-network/diviner-temporal-indexing": "^3.14.17",
58
+ "@xyo-network/manifest-model": "^3.14.17",
59
+ "@xyo-network/manifest-wrapper": "^3.14.17",
60
+ "@xyo-network/module-abstract": "^3.14.17",
61
+ "@xyo-network/module-abstract-mongodb": "^3.14.17",
62
+ "@xyo-network/module-factory-locator": "^3.14.17",
63
+ "@xyo-network/module-model": "^3.14.17",
60
64
  "@xyo-network/node-core-lib": "^3.6.4",
61
- "@xyo-network/node-memory": "^3.14.16",
62
- "@xyo-network/node-model": "^3.14.16",
63
- "@xyo-network/payload-model": "^3.14.16",
64
- "@xyo-network/sentinel-memory": "^3.14.16",
65
- "@xyo-network/wallet": "^3.14.16",
66
- "@xyo-network/witness-timestamp": "^3.14.16",
67
- "@xyo-network/xl1-rpc": "^1.3.15",
65
+ "@xyo-network/node-memory": "^3.14.17",
66
+ "@xyo-network/node-model": "^3.14.17",
67
+ "@xyo-network/payload-model": "^3.14.17",
68
+ "@xyo-network/sentinel-memory": "^3.14.17",
69
+ "@xyo-network/wallet": "^3.14.17",
70
+ "@xyo-network/witness-timestamp": "^3.14.17",
71
+ "@xyo-network/xl1-rpc": "^1.3.17",
68
72
  "compression": "^1.8.0",
69
73
  "cors": "^2.8.5",
70
74
  "express": "^4.21.2",
@@ -74,20 +78,20 @@
74
78
  "@types/compression": "^1.7.5",
75
79
  "@types/cors": "^2.8.17",
76
80
  "@types/express": "5.0.1",
77
- "@types/node": "^22.15.3",
78
- "@xylabs/object": "^4.8.9",
81
+ "@types/node": "^22.15.14",
82
+ "@xylabs/object": "^4.9.3",
79
83
  "@xylabs/ts-scripts-yarn3": "^6.5.5",
80
84
  "@xylabs/tsconfig": "^6.5.5",
81
- "@xyo-network/account": "^3.14.16",
82
- "@xyo-network/account-model": "^3.14.16",
83
- "@xyo-network/archivist-abstract": "^3.14.16",
84
- "@xyo-network/boundwitness-builder": "^3.14.16",
85
+ "@xyo-network/account": "^3.14.17",
86
+ "@xyo-network/account-model": "^3.14.17",
87
+ "@xyo-network/archivist-abstract": "^3.14.17",
88
+ "@xyo-network/boundwitness-builder": "^3.14.17",
85
89
  "@xyo-network/node-core-model": "^3.6.4",
86
90
  "dotenv": "^16.5.0",
87
- "knip": "^5.52.0",
91
+ "knip": "^5.54.1",
88
92
  "nodemon": "^3.1.10",
89
93
  "typescript": "^5.8.3",
90
- "vitest": "^3.1.2",
94
+ "vitest": "^3.1.3",
91
95
  "vitest-mock-extended": "^3.1.0"
92
96
  },
93
97
  "engines": {
@@ -3,6 +3,7 @@ import { asAddress } from '@xylabs/hex'
3
3
  import { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'
4
4
  import { ViewArchivist } from '@xyo-network/archivist-view'
5
5
  import { AddressBalanceDiviner, HeadValidationDiviner } from '@xyo-network/chain-modules'
6
+ import { initTelemetry } from '@xyo-network/chain-telemetry'
6
7
  import { PayloadPointerDiviner } from '@xyo-network/diviner-payload-pointer'
7
8
  import {
8
9
  TemporalIndexingDiviner,
@@ -22,7 +23,16 @@ import { TimestampWitness } from '@xyo-network/witness-timestamp'
22
23
  * @returns A locator with the necessary modules registered
23
24
  */
24
25
  export const getLocator = async () => {
25
- await Promise.resolve()
26
+ const { traceProvider } = await initTelemetry({
27
+ attributes: {
28
+ serviceName: 'xl1-api',
29
+ serviceVersion: '1.0.0',
30
+ },
31
+ metricsConfig: {
32
+ endpoint: '/metrics',
33
+ port: 9465,
34
+ },
35
+ })
26
36
  const locator = new ModuleFactoryLocator()
27
37
  // If there's a MongoDB configuration
28
38
  if (hasMongoDBConfig()) {
@@ -31,6 +41,7 @@ export const getLocator = async () => {
31
41
  }
32
42
  locator.register(AddressBalanceDiviner)
33
43
  locator.register(HeadValidationDiviner.factory({
44
+ tracer: traceProvider.getTracer('HeadValidationDiviner'),
34
45
  chainIdentification: {
35
46
  id: assertEx(
36
47
  asAddress(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS),
@@ -15,10 +15,10 @@ import { PublicChildManifests } from './public/index.ts'
15
15
  export const getNode = async (locator?: ModuleFactoryLocator) => {
16
16
  locator = locator ?? await getLocator()
17
17
  const mnemonic = process.env.MNEMONIC
18
- const wallet = await (mnemonic ? HDWallet.fromPhrase(mnemonic) : HDWallet.random())
18
+ const wallet = await (mnemonic === undefined ? HDWallet.random() : HDWallet.fromPhrase(mnemonic))
19
19
  const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)
20
20
  const [node, ...childNodes] = await wrapper.loadNodes()
21
- if (childNodes?.length) {
21
+ if (childNodes?.length > 0) {
22
22
  await Promise.all(childNodes.map(childNode => node.register(childNode)))
23
23
  await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))
24
24
  }
package/src/server/app.ts CHANGED
@@ -15,10 +15,12 @@ import type { Express } from 'express'
15
15
  import express from 'express'
16
16
 
17
17
  import { getNode } from '../manifest/index.ts'
18
+ import { addInstrumentation } from './instrumentation.ts'
18
19
  import { addRoutes } from './routes/index.ts'
19
20
 
20
21
  export const getApp = async (node?: MemoryNode): Promise<Express> => {
21
22
  node = node ?? (await getNode())
23
+ addInstrumentation()
22
24
  const app = express()
23
25
  app.set('etag', false)
24
26
  // eslint-disable-next-line sonarjs/cors
@@ -0,0 +1,17 @@
1
+ import { registerInstrumentations } from '@opentelemetry/instrumentation'
2
+ import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'
3
+ import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'
4
+
5
+ /**
6
+ * Registers OpenTelemetry instrumentations for HTTP and Express.
7
+ * This function is used to set up the necessary instrumentations for monitoring
8
+ * HTTP requests and Express applications. Since it monkey patches the Express
9
+ * router & middleware system, it should be called before any Express applications
10
+ * are defined.
11
+ *
12
+ * @returns {void}
13
+ */
14
+ export const addInstrumentation = () => {
15
+ const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]
16
+ registerInstrumentations({ instrumentations })
17
+ }
@@ -13,7 +13,7 @@ const handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, n
13
13
  const { address: rawAddress } = req.params
14
14
  const { node } = req.app
15
15
  const address = asAddress(rawAddress)
16
- if (address) {
16
+ if (address !== undefined) {
17
17
  let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))
18
18
  if (mod) {
19
19
  res.json(await mod.state())
@@ -22,6 +22,7 @@ export const getQueryConfig = async (mod: Module, req: Request, bw: QueryBoundWi
22
22
  ?.flat(DEFAULT_DEPTH)
23
23
  .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)
24
24
  .map(bw => bw.addresses) || []
25
+ // TODO: Do we want to end up with a list of addresses or a list of address lists?
25
26
  const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length)
26
27
  const allowed = addresses.length > 0 ? Object.fromEntries(archivist.queries.map(schema => [schema, addresses])) : {}
27
28
  const security = { allowed }
@@ -7,6 +7,7 @@ import { ModuleErrorBuilder } from '@xyo-network/module-abstract'
7
7
  import type { Module, ModuleQueryResult } from '@xyo-network/module-model'
8
8
  import { trimAddressPrefix } from '@xyo-network/node-core-lib'
9
9
  import type { ModuleError, Payload } from '@xyo-network/payload-model'
10
+ import { isAddress } from 'ethers'
10
11
  import type { RequestHandler } from 'express'
11
12
  import { StatusCodes } from 'http-status-codes'
12
13
 
@@ -26,7 +27,7 @@ const handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError
26
27
  const { address } = req.params
27
28
  const { node } = req.app
28
29
  const [bw, payloads] = Array.isArray(req.body) ? req.body : []
29
- if (!address) {
30
+ if (!isAddress(address)) {
30
31
  return returnError(StatusCodes.BAD_REQUEST, 'Missing address')
31
32
  }
32
33
 
@@ -43,7 +44,7 @@ const handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError
43
44
  if (node.address === normalizedAddress) modules = [node]
44
45
  else {
45
46
  const typedAddress = asAddress(address)
46
- const byAddress = typedAddress ? await node.resolve(typedAddress, { maxDepth: 10 }) : undefined
47
+ const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })
47
48
 
48
49
  if (byAddress) modules = [byAddress]
49
50
  else {