From 60040c3914d194cfbe5e4a4b9628b70b12669759 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 4 Apr 2024 12:57:54 +0900 Subject: [PATCH 1/3] [accelerator] proxy acceleration api to prod --- .../api/acceleration/acceleration.routes.ts | 63 +++++++++++++++++++ .../api/{ => acceleration}/acceleration.ts | 6 +- backend/src/index.ts | 4 ++ .../repositories/AccelerationRepository.ts | 4 +- 4 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 backend/src/api/acceleration/acceleration.routes.ts rename backend/src/api/{ => acceleration}/acceleration.ts (99%) diff --git a/backend/src/api/acceleration/acceleration.routes.ts b/backend/src/api/acceleration/acceleration.routes.ts new file mode 100644 index 000000000..d5c3844ec --- /dev/null +++ b/backend/src/api/acceleration/acceleration.routes.ts @@ -0,0 +1,63 @@ +import { Application, Request, Response } from "express"; +import config from "../../config"; +import axios from "axios"; +import logger from "../../logger"; + +class AccelerationRoutes { + private tag = 'Accelerator'; + + public initRoutes(app: Application) { + app + .get(config.MEMPOOL.API_URL_PREFIX + 'services/accelerator/accelerations', this.$getAcceleratorAccelerations.bind(this)) + .get(config.MEMPOOL.API_URL_PREFIX + 'services/accelerator/accelerations/history', this.$getAcceleratorAccelerationsHistory.bind(this)) + .get(config.MEMPOOL.API_URL_PREFIX + 'services/accelerator/accelerations/history/aggregated', this.$getAcceleratorAccelerationsHistoryAggregated.bind(this)) + .get(config.MEMPOOL.API_URL_PREFIX + 'services/accelerator/accelerations/stats', this.$getAcceleratorAccelerationsStats.bind(this)) + ; + } + + private async $getAcceleratorAccelerations(req: Request, res: Response) { + const url = `https://mempool.space${req.originalUrl}`; + try { + const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); + response.data.pipe(res); + } catch (e) { + logger.err(`Unable to get current accelerations from ${url} in $getAcceleratorAccelerations(), ${e}`, this.tag); + res.status(500).end(); + } + } + + private async $getAcceleratorAccelerationsHistory(req: Request, res: Response) { + const url = `https://mempool.space${req.originalUrl}`; + try { + const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); + response.data.pipe(res); + } catch (e) { + logger.err(`Unable to get acceleration history from ${url} in $getAcceleratorAccelerationsHistory(), ${e}`, this.tag); + res.status(500).end(); + } + } + + private async $getAcceleratorAccelerationsHistoryAggregated(req: Request, res: Response) { + const url = `https://mempool.space${req.originalUrl}`; + try { + const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); + response.data.pipe(res); + } catch (e) { + logger.err(`Unable to get aggregated acceleration history from ${url} in $getAcceleratorAccelerationsHistoryAggregated(), ${e}`, this.tag); + res.status(500).end(); + } + } + + private async $getAcceleratorAccelerationsStats(req: Request, res: Response) { + const url = `https://mempool.space${req.originalUrl}`; + try { + const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); + response.data.pipe(res); + } catch (e) { + logger.err(`Unable to get acceleration stats from ${url} in $getAcceleratorAccelerationsStats(), ${e}`, this.tag); + res.status(500).end(); + } + } +} + +export default new AccelerationRoutes(); \ No newline at end of file diff --git a/backend/src/api/acceleration.ts b/backend/src/api/acceleration/acceleration.ts similarity index 99% rename from backend/src/api/acceleration.ts rename to backend/src/api/acceleration/acceleration.ts index 412d65231..2dbaa8b07 100644 --- a/backend/src/api/acceleration.ts +++ b/backend/src/api/acceleration/acceleration.ts @@ -1,6 +1,6 @@ -import logger from '../logger'; -import { MempoolTransactionExtended } from '../mempool.interfaces'; -import { IEsploraApi } from './bitcoin/esplora-api.interface'; +import logger from '../../logger'; +import { MempoolTransactionExtended } from '../../mempool.interfaces'; +import { IEsploraApi } from '../bitcoin/esplora-api.interface'; const BLOCK_WEIGHT_UNITS = 4_000_000; const BLOCK_SIGOPS = 80_000; diff --git a/backend/src/index.ts b/backend/src/index.ts index b28e9ccbf..78583451c 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -43,6 +43,7 @@ import redisCache from './api/redis-cache'; import accelerationApi from './api/services/acceleration'; import bitcoinCoreRoutes from './api/bitcoin/bitcoin-core.routes'; import bitcoinSecondClient from './api/bitcoin/bitcoin-second-client'; +import accelerationRoutes from './api/acceleration/acceleration.routes'; class Server { private wss: WebSocket.Server | undefined; @@ -305,6 +306,9 @@ class Server { nodesRoutes.initRoutes(this.app); channelsRoutes.initRoutes(this.app); } + if (config.MEMPOOL_SERVICES.ACCELERATIONS) { + accelerationRoutes.initRoutes(this.app); + } } healthCheck(): void { diff --git a/backend/src/repositories/AccelerationRepository.ts b/backend/src/repositories/AccelerationRepository.ts index 1c91df050..4969013c4 100644 --- a/backend/src/repositories/AccelerationRepository.ts +++ b/backend/src/repositories/AccelerationRepository.ts @@ -1,4 +1,4 @@ -import { AccelerationInfo, makeBlockTemplate } from '../api/acceleration'; +import { AccelerationInfo, makeBlockTemplate } from '../api/acceleration/acceleration'; import { RowDataPacket } from 'mysql2'; import DB from '../database'; import logger from '../logger'; @@ -7,7 +7,7 @@ import { Common } from '../api/common'; import config from '../config'; import blocks from '../api/blocks'; import accelerationApi, { Acceleration } from '../api/services/acceleration'; -import accelerationCosts from '../api/acceleration'; +import accelerationCosts from '../api/acceleration/acceleration'; import bitcoinApi from '../api/bitcoin/bitcoin-api-factory'; import transactionUtils from '../api/transaction-utils'; import { BlockExtended, MempoolTransactionExtended } from '../mempool.interfaces'; From 404079ef4ecf386e227d6af22363cea8e8b594e6 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 4 Apr 2024 13:10:32 +0900 Subject: [PATCH 2/3] [accelerator] use config.MEMPOOL_SERVICES.API url --- backend/src/api/acceleration/acceleration.routes.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/api/acceleration/acceleration.routes.ts b/backend/src/api/acceleration/acceleration.routes.ts index d5c3844ec..ed53ec5e5 100644 --- a/backend/src/api/acceleration/acceleration.routes.ts +++ b/backend/src/api/acceleration/acceleration.routes.ts @@ -16,7 +16,7 @@ class AccelerationRoutes { } private async $getAcceleratorAccelerations(req: Request, res: Response) { - const url = `https://mempool.space${req.originalUrl}`; + const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; try { const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); response.data.pipe(res); @@ -27,7 +27,7 @@ class AccelerationRoutes { } private async $getAcceleratorAccelerationsHistory(req: Request, res: Response) { - const url = `https://mempool.space${req.originalUrl}`; + const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; try { const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); response.data.pipe(res); @@ -38,7 +38,7 @@ class AccelerationRoutes { } private async $getAcceleratorAccelerationsHistoryAggregated(req: Request, res: Response) { - const url = `https://mempool.space${req.originalUrl}`; + const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; try { const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); response.data.pipe(res); @@ -49,7 +49,7 @@ class AccelerationRoutes { } private async $getAcceleratorAccelerationsStats(req: Request, res: Response) { - const url = `https://mempool.space${req.originalUrl}`; + const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; try { const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); response.data.pipe(res); From b421be33155d41beb1431ad4b21ac8e1a92f71fd Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 4 Apr 2024 14:04:12 +0900 Subject: [PATCH 3/3] [accelerator] also forward headers --- backend/src/api/acceleration/acceleration.routes.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/backend/src/api/acceleration/acceleration.routes.ts b/backend/src/api/acceleration/acceleration.routes.ts index ed53ec5e5..69b320171 100644 --- a/backend/src/api/acceleration/acceleration.routes.ts +++ b/backend/src/api/acceleration/acceleration.routes.ts @@ -19,6 +19,9 @@ class AccelerationRoutes { const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; try { const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); + for (const key in response.headers) { + res.setHeader(key, response.headers[key]); + } response.data.pipe(res); } catch (e) { logger.err(`Unable to get current accelerations from ${url} in $getAcceleratorAccelerations(), ${e}`, this.tag); @@ -30,6 +33,9 @@ class AccelerationRoutes { const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; try { const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); + for (const key in response.headers) { + res.setHeader(key, response.headers[key]); + } response.data.pipe(res); } catch (e) { logger.err(`Unable to get acceleration history from ${url} in $getAcceleratorAccelerationsHistory(), ${e}`, this.tag); @@ -41,6 +47,9 @@ class AccelerationRoutes { const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; try { const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); + for (const key in response.headers) { + res.setHeader(key, response.headers[key]); + } response.data.pipe(res); } catch (e) { logger.err(`Unable to get aggregated acceleration history from ${url} in $getAcceleratorAccelerationsHistoryAggregated(), ${e}`, this.tag); @@ -52,6 +61,9 @@ class AccelerationRoutes { const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; try { const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); + for (const key in response.headers) { + res.setHeader(key, response.headers[key]); + } response.data.pipe(res); } catch (e) { logger.err(`Unable to get acceleration stats from ${url} in $getAcceleratorAccelerationsStats(), ${e}`, this.tag);