@xyo-network/chain-bridge 1.15.2
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/LICENSE +165 -0
- package/README.md +96 -0
- package/dist/node/driver/index.d.ts +2 -0
- package/dist/node/driver/index.d.ts.map +1 -0
- package/dist/node/driver/indexer/ChainBlockIteration/ChainHashIterationService.d.ts +24 -0
- package/dist/node/driver/indexer/ChainBlockIteration/ChainHashIterationService.d.ts.map +1 -0
- package/dist/node/driver/indexer/ChainBlockIteration/index.d.ts +2 -0
- package/dist/node/driver/indexer/ChainBlockIteration/index.d.ts.map +1 -0
- package/dist/node/driver/indexer/ChainBlocksObservable.d.ts +5 -0
- package/dist/node/driver/indexer/ChainBlocksObservable.d.ts.map +1 -0
- package/dist/node/driver/indexer/ChainHydratedBlocksObservable.d.ts +11 -0
- package/dist/node/driver/indexer/ChainHydratedBlocksObservable.d.ts.map +1 -0
- package/dist/node/driver/indexer/index.d.ts +2 -0
- package/dist/node/driver/indexer/index.d.ts.map +1 -0
- package/dist/node/driver/indexer/spec/ChainBlocksObservable.spec.d.ts +2 -0
- package/dist/node/driver/indexer/spec/ChainBlocksObservable.spec.d.ts.map +1 -0
- package/dist/node/driver/indexer/spec/ChainHydratedBlocksObservable.spec.d.ts +2 -0
- package/dist/node/driver/indexer/spec/ChainHydratedBlocksObservable.spec.d.ts.map +1 -0
- package/dist/node/driver/mongo/MongoMap.d.ts +17 -0
- package/dist/node/driver/mongo/MongoMap.d.ts.map +1 -0
- package/dist/node/driver/mongo/index.d.ts +2 -0
- package/dist/node/driver/mongo/index.d.ts.map +1 -0
- package/dist/node/driver/mongo/spec/MongoMap.spec.d.ts +2 -0
- package/dist/node/driver/mongo/spec/MongoMap.spec.d.ts.map +1 -0
- package/dist/node/index.d.ts +2 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.mjs +751 -0
- package/dist/node/index.mjs.map +1 -0
- package/dist/node/interface/index.d.ts +5 -0
- package/dist/node/interface/index.d.ts.map +1 -0
- package/dist/node/interface/interface/ChainBridgeRelayInterface.d.ts +9 -0
- package/dist/node/interface/interface/ChainBridgeRelayInterface.d.ts.map +1 -0
- package/dist/node/interface/interface/IntentIndexerInterface.d.ts +6 -0
- package/dist/node/interface/interface/IntentIndexerInterface.d.ts.map +1 -0
- package/dist/node/interface/interface/LockingProcessorInterface.d.ts +9 -0
- package/dist/node/interface/interface/LockingProcessorInterface.d.ts.map +1 -0
- package/dist/node/interface/interface/ObservationIndexerInterface.d.ts +7 -0
- package/dist/node/interface/interface/ObservationIndexerInterface.d.ts.map +1 -0
- package/dist/node/interface/interface/Params.d.ts +26 -0
- package/dist/node/interface/interface/Params.d.ts.map +1 -0
- package/dist/node/interface/interface/RelayInterface.d.ts +8 -0
- package/dist/node/interface/interface/RelayInterface.d.ts.map +1 -0
- package/dist/node/interface/interface/index.d.ts +7 -0
- package/dist/node/interface/interface/index.d.ts.map +1 -0
- package/dist/node/interface/repository/RepositoryInterface.d.ts +22 -0
- package/dist/node/interface/repository/RepositoryInterface.d.ts.map +1 -0
- package/dist/node/interface/repository/index.d.ts +2 -0
- package/dist/node/interface/repository/index.d.ts.map +1 -0
- package/dist/node/interface/service/ChainBridgeRelay/ChainBridgeRelayInterface.d.ts +9 -0
- package/dist/node/interface/service/ChainBridgeRelay/ChainBridgeRelayInterface.d.ts.map +1 -0
- package/dist/node/interface/service/ChainBridgeRelay/ChainBridgeRelayService.d.ts +31 -0
- package/dist/node/interface/service/ChainBridgeRelay/ChainBridgeRelayService.d.ts.map +1 -0
- package/dist/node/interface/service/ChainBridgeRelay/index.d.ts +2 -0
- package/dist/node/interface/service/ChainBridgeRelay/index.d.ts.map +1 -0
- package/dist/node/interface/service/ChainBridgeRelay/spec/ChainBridgeRelayService.spec.d.ts +2 -0
- package/dist/node/interface/service/ChainBridgeRelay/spec/ChainBridgeRelayService.spec.d.ts.map +1 -0
- package/dist/node/interface/service/Observer/Observer.d.ts +15 -0
- package/dist/node/interface/service/Observer/Observer.d.ts.map +1 -0
- package/dist/node/interface/service/Observer/index.d.ts +2 -0
- package/dist/node/interface/service/Observer/index.d.ts.map +1 -0
- package/dist/node/interface/service/index.d.ts +3 -0
- package/dist/node/interface/service/index.d.ts.map +1 -0
- package/dist/node/interface/util/getBridgeIntentIdentifier.d.ts +5 -0
- package/dist/node/interface/util/getBridgeIntentIdentifier.d.ts.map +1 -0
- package/dist/node/interface/util/index.d.ts +2 -0
- package/dist/node/interface/util/index.d.ts.map +1 -0
- package/dist/node/manifest/getLocator.d.ts +14 -0
- package/dist/node/manifest/getLocator.d.ts.map +1 -0
- package/dist/node/manifest/getNode.d.ts +15 -0
- package/dist/node/manifest/getNode.d.ts.map +1 -0
- package/dist/node/manifest/index.d.ts +6 -0
- package/dist/node/manifest/index.d.ts.map +1 -0
- package/dist/node/manifest/nodeManifest.d.ts +6 -0
- package/dist/node/manifest/nodeManifest.d.ts.map +1 -0
- package/dist/node/manifest/private/index.d.ts +5 -0
- package/dist/node/manifest/private/index.d.ts.map +1 -0
- package/dist/node/manifest/public/index.d.ts +14 -0
- package/dist/node/manifest/public/index.d.ts.map +1 -0
- package/dist/node/manifest/public/spec/Node.spec.d.ts +2 -0
- package/dist/node/manifest/public/spec/Node.spec.d.ts.map +1 -0
- package/dist/node/server/app.d.ts +4 -0
- package/dist/node/server/app.d.ts.map +1 -0
- package/dist/node/server/index.d.ts +11 -0
- package/dist/node/server/index.d.ts.map +1 -0
- package/dist/node/server/instrumentation.d.ts +9 -0
- package/dist/node/server/instrumentation.d.ts.map +1 -0
- package/dist/node/server/routes/addRoutes.d.ts +3 -0
- package/dist/node/server/routes/addRoutes.d.ts.map +1 -0
- package/dist/node/server/routes/address/AddressPathParams.d.ts +4 -0
- package/dist/node/server/routes/address/AddressPathParams.d.ts.map +1 -0
- package/dist/node/server/routes/address/addNodeRoutes.d.ts +3 -0
- package/dist/node/server/routes/address/addNodeRoutes.d.ts.map +1 -0
- package/dist/node/server/routes/address/get/get.d.ts +4 -0
- package/dist/node/server/routes/address/get/get.d.ts.map +1 -0
- package/dist/node/server/routes/address/get/index.d.ts +2 -0
- package/dist/node/server/routes/address/get/index.d.ts.map +1 -0
- package/dist/node/server/routes/address/index.d.ts +2 -0
- package/dist/node/server/routes/address/index.d.ts.map +1 -0
- package/dist/node/server/routes/address/post/getQueryConfig.d.ts +6 -0
- package/dist/node/server/routes/address/post/getQueryConfig.d.ts.map +1 -0
- package/dist/node/server/routes/address/post/index.d.ts +2 -0
- package/dist/node/server/routes/address/post/index.d.ts.map +1 -0
- package/dist/node/server/routes/address/post/post.d.ts +8 -0
- package/dist/node/server/routes/address/post/post.d.ts.map +1 -0
- package/dist/node/server/routes/dataLake/addDataLakeRoutes.d.ts +3 -0
- package/dist/node/server/routes/dataLake/addDataLakeRoutes.d.ts.map +1 -0
- package/dist/node/server/routes/dataLake/archivistMiddleware.d.ts +10 -0
- package/dist/node/server/routes/dataLake/archivistMiddleware.d.ts.map +1 -0
- package/dist/node/server/routes/dataLake/index.d.ts +2 -0
- package/dist/node/server/routes/dataLake/index.d.ts.map +1 -0
- package/dist/node/server/routes/healthz/get.d.ts +3 -0
- package/dist/node/server/routes/healthz/get.d.ts.map +1 -0
- package/dist/node/server/routes/healthz/index.d.ts +2 -0
- package/dist/node/server/routes/healthz/index.d.ts.map +1 -0
- package/dist/node/server/routes/index.d.ts +5 -0
- package/dist/node/server/routes/index.d.ts.map +1 -0
- package/dist/node/server/routes/rpc/index.d.ts +2 -0
- package/dist/node/server/routes/rpc/index.d.ts.map +1 -0
- package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts +3 -0
- package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts.map +1 -0
- package/dist/node/server/routes/rpc/routes/index.d.ts +2 -0
- package/dist/node/server/routes/rpc/routes/index.d.ts.map +1 -0
- package/dist/node/server/server.d.ts +11 -0
- package/dist/node/server/server.d.ts.map +1 -0
- package/package.json +125 -0
- package/src/driver/index.ts +1 -0
- package/src/driver/indexer/ChainBlockIteration/ChainHashIterationService.ts +87 -0
- package/src/driver/indexer/ChainBlockIteration/index.ts +1 -0
- package/src/driver/indexer/ChainBlocksObservable.ts +47 -0
- package/src/driver/indexer/ChainHydratedBlocksObservable.ts +23 -0
- package/src/driver/indexer/index.ts +1 -0
- package/src/driver/indexer/spec/ChainBlocksObservable.spec.ts +58 -0
- package/src/driver/indexer/spec/ChainHydratedBlocksObservable.spec.ts +58 -0
- package/src/driver/mongo/MongoMap.ts +62 -0
- package/src/driver/mongo/index.ts +1 -0
- package/src/driver/mongo/spec/MongoMap.spec.ts +67 -0
- package/src/index.ts +1 -0
- package/src/interface/index.ts +4 -0
- package/src/interface/interface/ChainBridgeRelayInterface.ts +9 -0
- package/src/interface/interface/IntentIndexerInterface.ts +7 -0
- package/src/interface/interface/LockingProcessorInterface.ts +10 -0
- package/src/interface/interface/ObservationIndexerInterface.ts +12 -0
- package/src/interface/interface/Params.ts +26 -0
- package/src/interface/interface/RelayInterface.ts +8 -0
- package/src/interface/interface/index.ts +6 -0
- package/src/interface/repository/RepositoryInterface.ts +28 -0
- package/src/interface/repository/index.ts +1 -0
- package/src/interface/service/ChainBridgeRelay/ChainBridgeRelayInterface.ts +11 -0
- package/src/interface/service/ChainBridgeRelay/ChainBridgeRelayService.ts +116 -0
- package/src/interface/service/ChainBridgeRelay/index.ts +1 -0
- package/src/interface/service/ChainBridgeRelay/spec/ChainBridgeRelayService.spec.ts +264 -0
- package/src/interface/service/Observer/Observer.ts +48 -0
- package/src/interface/service/Observer/index.ts +1 -0
- package/src/interface/service/index.ts +2 -0
- package/src/interface/util/getBridgeIntentIdentifier.ts +18 -0
- package/src/interface/util/index.ts +1 -0
- package/src/manifest/getLocator.ts +105 -0
- package/src/manifest/getNode.ts +32 -0
- package/src/manifest/index.ts +5 -0
- package/src/manifest/node.json +17 -0
- package/src/manifest/nodeManifest.ts +8 -0
- package/src/manifest/private/index.ts +4 -0
- package/src/manifest/public/Chain.json +138 -0
- package/src/manifest/public/Pending.json +35 -0
- package/src/manifest/public/index.ts +20 -0
- package/src/manifest/public/spec/Node.spec.ts +32 -0
- package/src/server/app.ts +37 -0
- package/src/server/index.ts +13 -0
- package/src/server/instrumentation.ts +15 -0
- package/src/server/routes/addRoutes.ts +11 -0
- package/src/server/routes/address/AddressPathParams.ts +3 -0
- package/src/server/routes/address/addNodeRoutes.ts +21 -0
- package/src/server/routes/address/get/get.ts +33 -0
- package/src/server/routes/address/get/index.ts +1 -0
- package/src/server/routes/address/index.ts +1 -0
- package/src/server/routes/address/post/getQueryConfig.ts +23 -0
- package/src/server/routes/address/post/index.ts +1 -0
- package/src/server/routes/address/post/post.ts +77 -0
- package/src/server/routes/dataLake/addDataLakeRoutes.ts +9 -0
- package/src/server/routes/dataLake/archivistMiddleware.ts +86 -0
- package/src/server/routes/dataLake/index.ts +1 -0
- package/src/server/routes/healthz/get.ts +20 -0
- package/src/server/routes/healthz/index.ts +1 -0
- package/src/server/routes/index.ts +5 -0
- package/src/server/routes/rpc/index.ts +1 -0
- package/src/server/routes/rpc/routes/addRpcRoutes.ts +22 -0
- package/src/server/routes/rpc/routes/index.ts +1 -0
- package/src/server/server.ts +59 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import { asyncHandler } from '@xylabs/express'
|
|
3
|
+
import {
|
|
4
|
+
asAddress, isAddress,
|
|
5
|
+
toAddress,
|
|
6
|
+
} from '@xylabs/hex'
|
|
7
|
+
import type { JsonObject } from '@xylabs/object'
|
|
8
|
+
import { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'
|
|
9
|
+
import { ModuleErrorBuilder } from '@xyo-network/module-abstract'
|
|
10
|
+
import type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'
|
|
11
|
+
import type { ModuleError, Payload } from '@xyo-network/payload-model'
|
|
12
|
+
import type { RequestHandler } from 'express'
|
|
13
|
+
import { StatusCodes } from 'http-status-codes'
|
|
14
|
+
|
|
15
|
+
import type { AddressPathParams } from '../AddressPathParams.ts'
|
|
16
|
+
import { getQueryConfig } from './getQueryConfig.ts'
|
|
17
|
+
|
|
18
|
+
type PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]
|
|
19
|
+
|
|
20
|
+
const handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {
|
|
21
|
+
const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {
|
|
22
|
+
const error = new ModuleErrorBuilder().message(message).details(details).build()
|
|
23
|
+
res.locals.rawResponse = false
|
|
24
|
+
res.status(code).json(error)
|
|
25
|
+
next()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const { address } = req.params
|
|
29
|
+
const { node } = req.app
|
|
30
|
+
const [bw, payloads] = Array.isArray(req.body) ? req.body : []
|
|
31
|
+
if (!isAddress(address)) {
|
|
32
|
+
return returnError(StatusCodes.BAD_REQUEST, 'Missing address')
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (!bw) {
|
|
36
|
+
return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (!isQueryBoundWitness(bw)) {
|
|
40
|
+
return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
let modules: ModuleInstance[] = []
|
|
44
|
+
const normalizedAddress = toAddress(address)
|
|
45
|
+
if (node.address === normalizedAddress) modules = [node]
|
|
46
|
+
else {
|
|
47
|
+
const typedAddress = asAddress(address)
|
|
48
|
+
const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })
|
|
49
|
+
|
|
50
|
+
if (byAddress) modules = [byAddress]
|
|
51
|
+
else {
|
|
52
|
+
const byName = await node.resolve(address, { direction: 'down' })
|
|
53
|
+
if (byName) {
|
|
54
|
+
const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')
|
|
55
|
+
res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)
|
|
56
|
+
return
|
|
57
|
+
} else {
|
|
58
|
+
return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (modules.length > 0) {
|
|
64
|
+
const mod = modules[0]
|
|
65
|
+
const queryConfig = getQueryConfig(mod, req, bw, payloads)
|
|
66
|
+
try {
|
|
67
|
+
const queryResult = await mod.query(bw, payloads, queryConfig)
|
|
68
|
+
res.json(queryResult)
|
|
69
|
+
} catch (ex) {
|
|
70
|
+
return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export const postAddress = asyncHandler(handler)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Express } from 'express'
|
|
2
|
+
|
|
3
|
+
import { archivistMiddleware } from './archivistMiddleware.ts'
|
|
4
|
+
|
|
5
|
+
export const addDataLakeRoutes = (app: Express) => {
|
|
6
|
+
const { node } = app
|
|
7
|
+
const archivistModuleIdentifier = 'Chain:Finalized'
|
|
8
|
+
app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))
|
|
9
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { setRawResponseFormat } from '@xylabs/express'
|
|
2
|
+
import { asHash } from '@xylabs/hex'
|
|
3
|
+
import { isDefined } from '@xylabs/typeof'
|
|
4
|
+
import type {
|
|
5
|
+
ArchivistInstance,
|
|
6
|
+
ArchivistNextOptions, NextOptions,
|
|
7
|
+
} from '@xyo-network/archivist-model'
|
|
8
|
+
import { asArchivistInstance } from '@xyo-network/archivist-model'
|
|
9
|
+
import type { ModuleIdentifier } from '@xyo-network/module-model'
|
|
10
|
+
import type { NodeInstance } from '@xyo-network/node-model'
|
|
11
|
+
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
12
|
+
import type { Payload } from '@xyo-network/payload-model'
|
|
13
|
+
import { isAnyPayload, isSequence } from '@xyo-network/payload-model'
|
|
14
|
+
import type { Router } from 'express'
|
|
15
|
+
import express from 'express'
|
|
16
|
+
import type { Request } from 'express-serve-static-core'
|
|
17
|
+
|
|
18
|
+
const resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {
|
|
19
|
+
const mod = await node.resolve(archivistModuleIdentifier)
|
|
20
|
+
return asArchivistInstance(mod, { required: true })
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let archivistInstance: ArchivistInstance | undefined
|
|
24
|
+
|
|
25
|
+
const getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {
|
|
26
|
+
if (isDefined(archivistInstance)) return archivistInstance
|
|
27
|
+
archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)
|
|
28
|
+
return archivistInstance
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type ArchivistMiddlewareOptions = {
|
|
32
|
+
archivistModuleIdentifier: ModuleIdentifier
|
|
33
|
+
node: NodeInstance
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {
|
|
37
|
+
const { node, archivistModuleIdentifier } = options
|
|
38
|
+
const router = express.Router({ mergeParams: true })
|
|
39
|
+
|
|
40
|
+
router.post('/insert', async (req, res) => {
|
|
41
|
+
setRawResponseFormat(res)
|
|
42
|
+
const body = Array.isArray(req.body) ? req.body : [req.body]
|
|
43
|
+
const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])
|
|
44
|
+
const archivist = await getArchivist(node, archivistModuleIdentifier)
|
|
45
|
+
const result = await archivist.insert(payloads)
|
|
46
|
+
res.status(200).json(result)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {
|
|
50
|
+
setRawResponseFormat(res)
|
|
51
|
+
const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined
|
|
52
|
+
const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined
|
|
53
|
+
const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined
|
|
54
|
+
const order = req.query.order === 'asc' ? 'asc' : 'desc'
|
|
55
|
+
const options: ArchivistNextOptions = {
|
|
56
|
+
limit, open, order, cursor,
|
|
57
|
+
}
|
|
58
|
+
const archivist = await getArchivist(node, archivistModuleIdentifier)
|
|
59
|
+
const result = await archivist.next(options)
|
|
60
|
+
res.status(200).json(result)
|
|
61
|
+
})
|
|
62
|
+
router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {
|
|
63
|
+
setRawResponseFormat(res)
|
|
64
|
+
const options = req.body
|
|
65
|
+
const archivist = await getArchivist(node, archivistModuleIdentifier)
|
|
66
|
+
const result = await (isDefined(options) ? archivist.next(options) : archivist.next())
|
|
67
|
+
res.status(200).json(result)
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
router.get('/get/:hash', async (req, res) => {
|
|
71
|
+
setRawResponseFormat(res)
|
|
72
|
+
const { hash: rawHash } = req.params
|
|
73
|
+
const hash = asHash(rawHash)
|
|
74
|
+
if (isDefined(hash)) {
|
|
75
|
+
const archivist = await getArchivist(node, archivistModuleIdentifier)
|
|
76
|
+
const [payload] = await archivist.get([hash])
|
|
77
|
+
if (isAnyPayload(payload)) {
|
|
78
|
+
res.json(payload)
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
res.status(400).send()
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
return router
|
|
86
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './addDataLakeRoutes.ts'
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NoReqParams } from '@xylabs/express'
|
|
2
|
+
import { setRawResponseFormat } from '@xylabs/express'
|
|
3
|
+
import type { RequestHandler } from 'express'
|
|
4
|
+
import { ReasonPhrases } from 'http-status-codes'
|
|
5
|
+
|
|
6
|
+
const message = ReasonPhrases.OK
|
|
7
|
+
|
|
8
|
+
const handler: RequestHandler<NoReqParams> = (_req, res) => {
|
|
9
|
+
setRawResponseFormat(res)
|
|
10
|
+
const date = new Date()
|
|
11
|
+
const {
|
|
12
|
+
cpuUsage, memoryUsage, uptime,
|
|
13
|
+
} = process
|
|
14
|
+
const data = {
|
|
15
|
+
cpuUsage: cpuUsage(), date, memoryUsage: memoryUsage(), message, uptime: uptime(),
|
|
16
|
+
}
|
|
17
|
+
res.status(200).send(data)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const getHealthz = handler
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './get.ts'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './routes/index.ts'
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { setRawResponseFormat } from '@xylabs/express'
|
|
2
|
+
import { NodeXyoViewer } from '@xyo-network/chain-rpc'
|
|
3
|
+
import {
|
|
4
|
+
NodeXyoRunner, rpcEngineFromConnection,
|
|
5
|
+
XyoBaseConnection,
|
|
6
|
+
} from '@xyo-network/xl1-rpc'
|
|
7
|
+
import type { Express } from 'express'
|
|
8
|
+
|
|
9
|
+
export const addRpcRoutes = (app: Express) => {
|
|
10
|
+
const { node } = app
|
|
11
|
+
const runner = new NodeXyoRunner(node)
|
|
12
|
+
const viewer = new NodeXyoViewer(node)
|
|
13
|
+
const connection = new XyoBaseConnection({ runner, viewer })
|
|
14
|
+
const engine = rpcEngineFromConnection(connection)
|
|
15
|
+
|
|
16
|
+
app.post('/rpc', (req, res) => {
|
|
17
|
+
setRawResponseFormat(res)
|
|
18
|
+
engine.handle(req.body, (_, rpcResponse) => {
|
|
19
|
+
res.json(rpcResponse)
|
|
20
|
+
})
|
|
21
|
+
})
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './addRpcRoutes.ts'
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import type { Logger } from '@xylabs/logger'
|
|
3
|
+
import { isDefined, isString } from '@xylabs/typeof'
|
|
4
|
+
import { boot } from '@xyo-network/bios'
|
|
5
|
+
import type { BiosExternalInterface } from '@xyo-network/bios-model'
|
|
6
|
+
import type { NodeInstance } from '@xyo-network/node-model'
|
|
7
|
+
import { HDWallet } from '@xyo-network/wallet'
|
|
8
|
+
import { type Config } from '@xyo-network/xl1-protocol-sdk'
|
|
9
|
+
|
|
10
|
+
import { getNode } from '../manifest/index.ts'
|
|
11
|
+
import { getApp } from './app.ts'
|
|
12
|
+
|
|
13
|
+
const hostname = '::'
|
|
14
|
+
// const hostname = '0.0.0.0'
|
|
15
|
+
|
|
16
|
+
// TODO: Make nodejs version of bios support round tripping mnemonic between boots
|
|
17
|
+
const getSeedPhrase = async (bios: BiosExternalInterface, config: Config, logger?: Logger): Promise<string> => {
|
|
18
|
+
const storedSeedPhrase = await bios.seedPhraseStore.get('os')
|
|
19
|
+
logger?.debug(`[Bridge] Stored mnemonic: ${storedSeedPhrase}`)
|
|
20
|
+
const { mnemonic } = config.api
|
|
21
|
+
if (isString(storedSeedPhrase) && isString(mnemonic)) {
|
|
22
|
+
logger?.warn('[Bridge] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.')
|
|
23
|
+
await bios.seedPhraseStore.set('os', mnemonic)
|
|
24
|
+
} else {
|
|
25
|
+
let seedPhrase: string
|
|
26
|
+
if (isString(mnemonic)) {
|
|
27
|
+
seedPhrase = mnemonic
|
|
28
|
+
} else {
|
|
29
|
+
seedPhrase = HDWallet.generateMnemonic()
|
|
30
|
+
logger?.log('[Bridge] No mnemonic provided, using random mnemonic. This is not recommended for production use.')
|
|
31
|
+
logger?.log(`[Bridge] Mnemonic: ${seedPhrase}`)
|
|
32
|
+
}
|
|
33
|
+
await bios.seedPhraseStore.set('os', seedPhrase)
|
|
34
|
+
}
|
|
35
|
+
return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire mnemonic from bios')
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface GetServerContext {
|
|
39
|
+
config: Config
|
|
40
|
+
logger?: Logger
|
|
41
|
+
node?: NodeInstance
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const getServer = async (context: GetServerContext) => {
|
|
45
|
+
const {
|
|
46
|
+
config, logger, node,
|
|
47
|
+
} = context
|
|
48
|
+
const { mnemonic, port } = context.config.api
|
|
49
|
+
const bios = await boot()
|
|
50
|
+
const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)
|
|
51
|
+
const wallet = await HDWallet.fromPhrase(seedPhrase)
|
|
52
|
+
const nodeContext = {
|
|
53
|
+
wallet, logger, config,
|
|
54
|
+
}
|
|
55
|
+
const app = getApp(node ?? await getNode(nodeContext))
|
|
56
|
+
const server = app.listen(port, hostname, () => logger?.log(`[Bridge] Server listening at http://${hostname}:${port}`))
|
|
57
|
+
server.setTimeout(20_000)
|
|
58
|
+
return server
|
|
59
|
+
}
|