diff --git a/.gitignore b/.gitignore index 3c3629e..f852b73 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ node_modules +.env +.git-info +tmp/ diff --git a/.vscode/launch.json b/.vscode/launch.json index 7c911c1..7d0b508 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,6 +1,26 @@ { "version": "0.2.0", "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Run: writeonly", + "runtimeArgs": [ + "-r", + "ts-node/register" + ], + "args": [ + "${workspaceFolder}/src/index.ts" + ], + "outputCapture": "std", + "internalConsoleOptions": "openOnSessionStart", + "env": { + "NODE_ENV": "development", + "TS_NODE_SKIP_IGNORE": "true", + "RUN_MODE": "writeonly" + }, + "killBehavior": "polite", + }, { "name": "Launch Program", "type": "node", diff --git a/package-lock.json b/package-lock.json index 5b5cf23..93d2503 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@fastify/swagger": "^7.6.1", "@fastify/type-provider-typebox": "^3.2.0", "@hirosystems/api-toolkit": "^1.7.1", - "@hirosystems/chainhook-client": "^2.0.0", + "@hirosystems/chainhook-client": "^2.1.0", "@sinclair/typebox": "^0.28.17", "@stacks/transactions": "^6.1.0", "@types/node": "^20.16.1", @@ -1233,10 +1233,9 @@ } }, "node_modules/@hirosystems/chainhook-client": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hirosystems/chainhook-client/-/chainhook-client-2.0.0.tgz", - "integrity": "sha512-CZrByDwTr4Re5PBSlr7spHCRcdZLVf4D/wmuPmMdmJjreOohcwOBmSxKQG6kwMHbnBtcVXoI9rn1c96GoaNf6Q==", - "license": "Apache 2.0", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hirosystems/chainhook-client/-/chainhook-client-2.1.0.tgz", + "integrity": "sha512-yYbdh4/kR3ivvvEfu4lyc2FgYQ+iE9aupJb0utYziOmSDTrHD7/uTE67/WB2t34n7QDud+bRP2KtOuxupHOW3g==", "dependencies": { "@fastify/type-provider-typebox": "^3.2.0", "fastify": "^4.15.0", diff --git a/package.json b/package.json index ec7d529..079a8bb 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@fastify/swagger": "^7.6.1", "@fastify/type-provider-typebox": "^3.2.0", "@hirosystems/api-toolkit": "^1.7.1", - "@hirosystems/chainhook-client": "^2.0.0", + "@hirosystems/chainhook-client": "^2.1.0", "@sinclair/typebox": "^0.28.17", "@stacks/transactions": "^6.1.0", "@types/node": "^20.16.1", diff --git a/src/chainhook/server.ts b/src/chainhook/server.ts index 9a8ad58..701a3be 100644 --- a/src/chainhook/server.ts +++ b/src/chainhook/server.ts @@ -14,43 +14,37 @@ export async function startChainhookServer(args: { db: PgStore }): Promise { - await jobQueue.stop(); - }, - }); - if (ENV.JOB_QUEUE_AUTO_START) jobQueue.start(); - const server = await startChainhookServer({ db }); registerShutdownConfig({ name: 'Chainhook Server', @@ -33,16 +18,6 @@ async function initBackgroundServices(db: PgStore) { await closeChainhookServer(server); }, }); - - const adminRpcServer = await buildAdminRpcServer({ db, jobQueue }); - registerShutdownConfig({ - name: 'Admin RPC Server', - forceKillable: false, - handler: async () => { - await adminRpcServer.close(); - }, - }); - await adminRpcServer.listen({ host: ENV.API_HOST, port: ENV.ADMIN_RPC_PORT }); } /** @@ -50,30 +25,30 @@ async function initBackgroundServices(db: PgStore) { * @param db - PgStore */ async function initApiService(db: PgStore) { - logger.info('Initializing API service...'); - const apiServer = await buildApiServer({ db }); - registerShutdownConfig({ - name: 'API Server', - forceKillable: false, - handler: async () => { - await apiServer.close(); - }, - }); + // logger.info('Initializing API service...'); + // const apiServer = await buildApiServer({ db }); + // registerShutdownConfig({ + // name: 'API Server', + // forceKillable: false, + // handler: async () => { + // await apiServer.close(); + // }, + // }); - await apiServer.listen({ host: ENV.API_HOST, port: ENV.API_PORT }); + // await apiServer.listen({ host: ENV.API_HOST, port: ENV.API_PORT }); if (isProdEnv) { - const promServer = await buildPromServer({ metrics: apiServer.metrics }); - registerShutdownConfig({ - name: 'Prometheus Server', - forceKillable: false, - handler: async () => { - await promServer.close(); - }, - }); + // const promServer = await buildPromServer({ metrics: apiServer.metrics }); + // registerShutdownConfig({ + // name: 'Prometheus Server', + // forceKillable: false, + // handler: async () => { + // await promServer.close(); + // }, + // }); - TokenProcessorMetrics.configure(db); - await promServer.listen({ host: ENV.API_HOST, port: ENV.PROMETHEUS_PORT }); + // TokenProcessorMetrics.configure(db); + // await promServer.listen({ host: ENV.API_HOST, port: ENV.PROMETHEUS_PORT }); } } @@ -88,15 +63,15 @@ async function initApp() { await initApiService(db); } - const profilerServer = await buildProfilerServer(); - registerShutdownConfig({ - name: 'Profiler Server', - forceKillable: false, - handler: async () => { - await profilerServer.close(); - }, - }); - await profilerServer.listen({ host: ENV.API_HOST, port: ENV.PROFILER_PORT }); + // const profilerServer = await buildProfilerServer(); + // registerShutdownConfig({ + // name: 'Profiler Server', + // forceKillable: false, + // handler: async () => { + // await profilerServer.close(); + // }, + // }); + // await profilerServer.listen({ host: ENV.API_HOST, port: ENV.PROFILER_PORT }); registerShutdownConfig({ name: 'DB', diff --git a/src/pg/chainhook/chainhook-pg-store.ts b/src/pg/chainhook/chainhook-pg-store.ts index 3869122..7d296a5 100644 --- a/src/pg/chainhook/chainhook-pg-store.ts +++ b/src/pg/chainhook/chainhook-pg-store.ts @@ -29,37 +29,38 @@ type TodoStacksEvent = StacksEvent & { export class ChainhookPgStore extends BasePgStoreModule { async processPayload(payload: StacksPayload): Promise { await this.sqlWriteTransaction(async sql => { - for (const block of payload.rollback) { - logger.info(`ChainhookPgStore rollback block ${block.block_identifier.index}`); - const time = stopwatch(); - await this.updateStacksBlock(sql, block, 'rollback'); - logger.info( - `ChainhookPgStore rollback block ${ - block.block_identifier.index - } finished in ${time.getElapsedSeconds()}s` - ); - } - if (payload.rollback.length) { - const earliestRolledBack = Math.min(...payload.rollback.map(r => r.block_identifier.index)); - await this.updateChainTipBlockHeight(earliestRolledBack - 1); - } - for (const block of payload.apply) { - if (block.block_identifier.index <= (await this.getLastIngestedBlockHeight())) { - logger.info( - `ChainhookPgStore skipping previously ingested block ${block.block_identifier.index}` - ); - continue; - } - logger.info(`ChainhookPgStore apply block ${block.block_identifier.index}`); - const time = stopwatch(); - await this.updateStacksBlock(sql, block, 'apply'); - await this.updateChainTipBlockHeight(block.block_identifier.index); - logger.info( - `ChainhookPgStore apply block ${ - block.block_identifier.index - } finished in ${time.getElapsedSeconds()}s` - ); - } + logger.info({payload: payload}, 'Received payload'); + // for (const block of payload.rollback) { + // logger.info(`ChainhookPgStore rollback block ${block.block_identifier.index}`); + // const time = stopwatch(); + // await this.updateStacksBlock(sql, block, 'rollback'); + // logger.info( + // `ChainhookPgStore rollback block ${ + // block.block_identifier.index + // } finished in ${time.getElapsedSeconds()}s` + // ); + // } + // if (payload.rollback.length) { + // const earliestRolledBack = Math.min(...payload.rollback.map(r => r.block_identifier.index)); + // await this.updateChainTipBlockHeight(earliestRolledBack - 1); + // } + // for (const block of payload.apply) { + // if (block.block_identifier.index <= (await this.getLastIngestedBlockHeight())) { + // logger.info( + // `ChainhookPgStore skipping previously ingested block ${block.block_identifier.index}` + // ); + // continue; + // } + // logger.info(`ChainhookPgStore apply block ${block.block_identifier.index}`); + // const time = stopwatch(); + // await this.updateStacksBlock(sql, block, 'apply'); + // await this.updateChainTipBlockHeight(block.block_identifier.index); + // logger.info( + // `ChainhookPgStore apply block ${ + // block.block_identifier.index + // } finished in ${time.getElapsedSeconds()}s` + // ); + // } }); }