@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.
Files changed (188) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +96 -0
  3. package/dist/node/driver/index.d.ts +2 -0
  4. package/dist/node/driver/index.d.ts.map +1 -0
  5. package/dist/node/driver/indexer/ChainBlockIteration/ChainHashIterationService.d.ts +24 -0
  6. package/dist/node/driver/indexer/ChainBlockIteration/ChainHashIterationService.d.ts.map +1 -0
  7. package/dist/node/driver/indexer/ChainBlockIteration/index.d.ts +2 -0
  8. package/dist/node/driver/indexer/ChainBlockIteration/index.d.ts.map +1 -0
  9. package/dist/node/driver/indexer/ChainBlocksObservable.d.ts +5 -0
  10. package/dist/node/driver/indexer/ChainBlocksObservable.d.ts.map +1 -0
  11. package/dist/node/driver/indexer/ChainHydratedBlocksObservable.d.ts +11 -0
  12. package/dist/node/driver/indexer/ChainHydratedBlocksObservable.d.ts.map +1 -0
  13. package/dist/node/driver/indexer/index.d.ts +2 -0
  14. package/dist/node/driver/indexer/index.d.ts.map +1 -0
  15. package/dist/node/driver/indexer/spec/ChainBlocksObservable.spec.d.ts +2 -0
  16. package/dist/node/driver/indexer/spec/ChainBlocksObservable.spec.d.ts.map +1 -0
  17. package/dist/node/driver/indexer/spec/ChainHydratedBlocksObservable.spec.d.ts +2 -0
  18. package/dist/node/driver/indexer/spec/ChainHydratedBlocksObservable.spec.d.ts.map +1 -0
  19. package/dist/node/driver/mongo/MongoMap.d.ts +17 -0
  20. package/dist/node/driver/mongo/MongoMap.d.ts.map +1 -0
  21. package/dist/node/driver/mongo/index.d.ts +2 -0
  22. package/dist/node/driver/mongo/index.d.ts.map +1 -0
  23. package/dist/node/driver/mongo/spec/MongoMap.spec.d.ts +2 -0
  24. package/dist/node/driver/mongo/spec/MongoMap.spec.d.ts.map +1 -0
  25. package/dist/node/index.d.ts +2 -0
  26. package/dist/node/index.d.ts.map +1 -0
  27. package/dist/node/index.mjs +751 -0
  28. package/dist/node/index.mjs.map +1 -0
  29. package/dist/node/interface/index.d.ts +5 -0
  30. package/dist/node/interface/index.d.ts.map +1 -0
  31. package/dist/node/interface/interface/ChainBridgeRelayInterface.d.ts +9 -0
  32. package/dist/node/interface/interface/ChainBridgeRelayInterface.d.ts.map +1 -0
  33. package/dist/node/interface/interface/IntentIndexerInterface.d.ts +6 -0
  34. package/dist/node/interface/interface/IntentIndexerInterface.d.ts.map +1 -0
  35. package/dist/node/interface/interface/LockingProcessorInterface.d.ts +9 -0
  36. package/dist/node/interface/interface/LockingProcessorInterface.d.ts.map +1 -0
  37. package/dist/node/interface/interface/ObservationIndexerInterface.d.ts +7 -0
  38. package/dist/node/interface/interface/ObservationIndexerInterface.d.ts.map +1 -0
  39. package/dist/node/interface/interface/Params.d.ts +26 -0
  40. package/dist/node/interface/interface/Params.d.ts.map +1 -0
  41. package/dist/node/interface/interface/RelayInterface.d.ts +8 -0
  42. package/dist/node/interface/interface/RelayInterface.d.ts.map +1 -0
  43. package/dist/node/interface/interface/index.d.ts +7 -0
  44. package/dist/node/interface/interface/index.d.ts.map +1 -0
  45. package/dist/node/interface/repository/RepositoryInterface.d.ts +22 -0
  46. package/dist/node/interface/repository/RepositoryInterface.d.ts.map +1 -0
  47. package/dist/node/interface/repository/index.d.ts +2 -0
  48. package/dist/node/interface/repository/index.d.ts.map +1 -0
  49. package/dist/node/interface/service/ChainBridgeRelay/ChainBridgeRelayInterface.d.ts +9 -0
  50. package/dist/node/interface/service/ChainBridgeRelay/ChainBridgeRelayInterface.d.ts.map +1 -0
  51. package/dist/node/interface/service/ChainBridgeRelay/ChainBridgeRelayService.d.ts +31 -0
  52. package/dist/node/interface/service/ChainBridgeRelay/ChainBridgeRelayService.d.ts.map +1 -0
  53. package/dist/node/interface/service/ChainBridgeRelay/index.d.ts +2 -0
  54. package/dist/node/interface/service/ChainBridgeRelay/index.d.ts.map +1 -0
  55. package/dist/node/interface/service/ChainBridgeRelay/spec/ChainBridgeRelayService.spec.d.ts +2 -0
  56. package/dist/node/interface/service/ChainBridgeRelay/spec/ChainBridgeRelayService.spec.d.ts.map +1 -0
  57. package/dist/node/interface/service/Observer/Observer.d.ts +15 -0
  58. package/dist/node/interface/service/Observer/Observer.d.ts.map +1 -0
  59. package/dist/node/interface/service/Observer/index.d.ts +2 -0
  60. package/dist/node/interface/service/Observer/index.d.ts.map +1 -0
  61. package/dist/node/interface/service/index.d.ts +3 -0
  62. package/dist/node/interface/service/index.d.ts.map +1 -0
  63. package/dist/node/interface/util/getBridgeIntentIdentifier.d.ts +5 -0
  64. package/dist/node/interface/util/getBridgeIntentIdentifier.d.ts.map +1 -0
  65. package/dist/node/interface/util/index.d.ts +2 -0
  66. package/dist/node/interface/util/index.d.ts.map +1 -0
  67. package/dist/node/manifest/getLocator.d.ts +14 -0
  68. package/dist/node/manifest/getLocator.d.ts.map +1 -0
  69. package/dist/node/manifest/getNode.d.ts +15 -0
  70. package/dist/node/manifest/getNode.d.ts.map +1 -0
  71. package/dist/node/manifest/index.d.ts +6 -0
  72. package/dist/node/manifest/index.d.ts.map +1 -0
  73. package/dist/node/manifest/nodeManifest.d.ts +6 -0
  74. package/dist/node/manifest/nodeManifest.d.ts.map +1 -0
  75. package/dist/node/manifest/private/index.d.ts +5 -0
  76. package/dist/node/manifest/private/index.d.ts.map +1 -0
  77. package/dist/node/manifest/public/index.d.ts +14 -0
  78. package/dist/node/manifest/public/index.d.ts.map +1 -0
  79. package/dist/node/manifest/public/spec/Node.spec.d.ts +2 -0
  80. package/dist/node/manifest/public/spec/Node.spec.d.ts.map +1 -0
  81. package/dist/node/server/app.d.ts +4 -0
  82. package/dist/node/server/app.d.ts.map +1 -0
  83. package/dist/node/server/index.d.ts +11 -0
  84. package/dist/node/server/index.d.ts.map +1 -0
  85. package/dist/node/server/instrumentation.d.ts +9 -0
  86. package/dist/node/server/instrumentation.d.ts.map +1 -0
  87. package/dist/node/server/routes/addRoutes.d.ts +3 -0
  88. package/dist/node/server/routes/addRoutes.d.ts.map +1 -0
  89. package/dist/node/server/routes/address/AddressPathParams.d.ts +4 -0
  90. package/dist/node/server/routes/address/AddressPathParams.d.ts.map +1 -0
  91. package/dist/node/server/routes/address/addNodeRoutes.d.ts +3 -0
  92. package/dist/node/server/routes/address/addNodeRoutes.d.ts.map +1 -0
  93. package/dist/node/server/routes/address/get/get.d.ts +4 -0
  94. package/dist/node/server/routes/address/get/get.d.ts.map +1 -0
  95. package/dist/node/server/routes/address/get/index.d.ts +2 -0
  96. package/dist/node/server/routes/address/get/index.d.ts.map +1 -0
  97. package/dist/node/server/routes/address/index.d.ts +2 -0
  98. package/dist/node/server/routes/address/index.d.ts.map +1 -0
  99. package/dist/node/server/routes/address/post/getQueryConfig.d.ts +6 -0
  100. package/dist/node/server/routes/address/post/getQueryConfig.d.ts.map +1 -0
  101. package/dist/node/server/routes/address/post/index.d.ts +2 -0
  102. package/dist/node/server/routes/address/post/index.d.ts.map +1 -0
  103. package/dist/node/server/routes/address/post/post.d.ts +8 -0
  104. package/dist/node/server/routes/address/post/post.d.ts.map +1 -0
  105. package/dist/node/server/routes/dataLake/addDataLakeRoutes.d.ts +3 -0
  106. package/dist/node/server/routes/dataLake/addDataLakeRoutes.d.ts.map +1 -0
  107. package/dist/node/server/routes/dataLake/archivistMiddleware.d.ts +10 -0
  108. package/dist/node/server/routes/dataLake/archivistMiddleware.d.ts.map +1 -0
  109. package/dist/node/server/routes/dataLake/index.d.ts +2 -0
  110. package/dist/node/server/routes/dataLake/index.d.ts.map +1 -0
  111. package/dist/node/server/routes/healthz/get.d.ts +3 -0
  112. package/dist/node/server/routes/healthz/get.d.ts.map +1 -0
  113. package/dist/node/server/routes/healthz/index.d.ts +2 -0
  114. package/dist/node/server/routes/healthz/index.d.ts.map +1 -0
  115. package/dist/node/server/routes/index.d.ts +5 -0
  116. package/dist/node/server/routes/index.d.ts.map +1 -0
  117. package/dist/node/server/routes/rpc/index.d.ts +2 -0
  118. package/dist/node/server/routes/rpc/index.d.ts.map +1 -0
  119. package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts +3 -0
  120. package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts.map +1 -0
  121. package/dist/node/server/routes/rpc/routes/index.d.ts +2 -0
  122. package/dist/node/server/routes/rpc/routes/index.d.ts.map +1 -0
  123. package/dist/node/server/server.d.ts +11 -0
  124. package/dist/node/server/server.d.ts.map +1 -0
  125. package/package.json +125 -0
  126. package/src/driver/index.ts +1 -0
  127. package/src/driver/indexer/ChainBlockIteration/ChainHashIterationService.ts +87 -0
  128. package/src/driver/indexer/ChainBlockIteration/index.ts +1 -0
  129. package/src/driver/indexer/ChainBlocksObservable.ts +47 -0
  130. package/src/driver/indexer/ChainHydratedBlocksObservable.ts +23 -0
  131. package/src/driver/indexer/index.ts +1 -0
  132. package/src/driver/indexer/spec/ChainBlocksObservable.spec.ts +58 -0
  133. package/src/driver/indexer/spec/ChainHydratedBlocksObservable.spec.ts +58 -0
  134. package/src/driver/mongo/MongoMap.ts +62 -0
  135. package/src/driver/mongo/index.ts +1 -0
  136. package/src/driver/mongo/spec/MongoMap.spec.ts +67 -0
  137. package/src/index.ts +1 -0
  138. package/src/interface/index.ts +4 -0
  139. package/src/interface/interface/ChainBridgeRelayInterface.ts +9 -0
  140. package/src/interface/interface/IntentIndexerInterface.ts +7 -0
  141. package/src/interface/interface/LockingProcessorInterface.ts +10 -0
  142. package/src/interface/interface/ObservationIndexerInterface.ts +12 -0
  143. package/src/interface/interface/Params.ts +26 -0
  144. package/src/interface/interface/RelayInterface.ts +8 -0
  145. package/src/interface/interface/index.ts +6 -0
  146. package/src/interface/repository/RepositoryInterface.ts +28 -0
  147. package/src/interface/repository/index.ts +1 -0
  148. package/src/interface/service/ChainBridgeRelay/ChainBridgeRelayInterface.ts +11 -0
  149. package/src/interface/service/ChainBridgeRelay/ChainBridgeRelayService.ts +116 -0
  150. package/src/interface/service/ChainBridgeRelay/index.ts +1 -0
  151. package/src/interface/service/ChainBridgeRelay/spec/ChainBridgeRelayService.spec.ts +264 -0
  152. package/src/interface/service/Observer/Observer.ts +48 -0
  153. package/src/interface/service/Observer/index.ts +1 -0
  154. package/src/interface/service/index.ts +2 -0
  155. package/src/interface/util/getBridgeIntentIdentifier.ts +18 -0
  156. package/src/interface/util/index.ts +1 -0
  157. package/src/manifest/getLocator.ts +105 -0
  158. package/src/manifest/getNode.ts +32 -0
  159. package/src/manifest/index.ts +5 -0
  160. package/src/manifest/node.json +17 -0
  161. package/src/manifest/nodeManifest.ts +8 -0
  162. package/src/manifest/private/index.ts +4 -0
  163. package/src/manifest/public/Chain.json +138 -0
  164. package/src/manifest/public/Pending.json +35 -0
  165. package/src/manifest/public/index.ts +20 -0
  166. package/src/manifest/public/spec/Node.spec.ts +32 -0
  167. package/src/server/app.ts +37 -0
  168. package/src/server/index.ts +13 -0
  169. package/src/server/instrumentation.ts +15 -0
  170. package/src/server/routes/addRoutes.ts +11 -0
  171. package/src/server/routes/address/AddressPathParams.ts +3 -0
  172. package/src/server/routes/address/addNodeRoutes.ts +21 -0
  173. package/src/server/routes/address/get/get.ts +33 -0
  174. package/src/server/routes/address/get/index.ts +1 -0
  175. package/src/server/routes/address/index.ts +1 -0
  176. package/src/server/routes/address/post/getQueryConfig.ts +23 -0
  177. package/src/server/routes/address/post/index.ts +1 -0
  178. package/src/server/routes/address/post/post.ts +77 -0
  179. package/src/server/routes/dataLake/addDataLakeRoutes.ts +9 -0
  180. package/src/server/routes/dataLake/archivistMiddleware.ts +86 -0
  181. package/src/server/routes/dataLake/index.ts +1 -0
  182. package/src/server/routes/healthz/get.ts +20 -0
  183. package/src/server/routes/healthz/index.ts +1 -0
  184. package/src/server/routes/index.ts +5 -0
  185. package/src/server/routes/rpc/index.ts +1 -0
  186. package/src/server/routes/rpc/routes/addRpcRoutes.ts +22 -0
  187. package/src/server/routes/rpc/routes/index.ts +1 -0
  188. 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,5 @@
1
+ export * from './address/index.ts'
2
+ // export * from './hash.ts'
3
+ export * from './addRoutes.ts'
4
+ export * from './healthz/index.ts'
5
+ export * from './rpc/index.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
+ }