diff --git a/backend/src/api/fiat-conversion.ts b/backend/src/api/fiat-conversion.ts index 89916c91d..8de9f10bb 100644 --- a/backend/src/api/fiat-conversion.ts +++ b/backend/src/api/fiat-conversion.ts @@ -1,13 +1,19 @@ import logger from '../logger'; import axios from 'axios'; +import { IConversionRates } from '../mempool.interfaces'; class FiatConversion { - private conversionRates = { + private conversionRates: IConversionRates = { 'USD': 0 }; + private ratesChangedCallback: ((rates: IConversionRates) => void) | undefined; constructor() { } + public setProgressChangedCallback(fn: (rates: IConversionRates) => void) { + this.ratesChangedCallback = fn; + } + public startService() { logger.info('Starting currency rates service'); setInterval(this.updateCurrency.bind(this), 1000 * 60 * 60); @@ -25,6 +31,9 @@ class FiatConversion { this.conversionRates = { 'USD': usd.price, }; + if (this.ratesChangedCallback) { + this.ratesChangedCallback(this.conversionRates); + } } catch (e) { logger.err('Error updating fiat conversion rates: ' + e); } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 2d4e75d6f..af46968bc 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -1,6 +1,6 @@ import logger from '../logger'; import * as WebSocket from 'ws'; -import { BlockExtended, TransactionExtended, WebsocketResponse, MempoolBlock, OptimizedStatistic, ILoadingIndicators } from '../mempool.interfaces'; +import { BlockExtended, TransactionExtended, WebsocketResponse, MempoolBlock, OptimizedStatistic, ILoadingIndicators, IConversionRates } from '../mempool.interfaces'; import blocks from './blocks'; import memPool from './mempool'; import backendInfo from './backend-info'; @@ -131,6 +131,19 @@ class WebsocketHandler { }); } + handleNewConversionRates(conversionRates: IConversionRates) { + if (!this.wss) { + throw new Error('WebSocket.Server is not set'); + } + + this.wss.clients.forEach((client: WebSocket) => { + if (client.readyState !== WebSocket.OPEN) { + return; + } + client.send(JSON.stringify({ conversions: conversionRates })); + }); + } + getInitData(_blocks?: BlockExtended[]) { if (!_blocks) { _blocks = blocks.getBlocks().slice(-8); diff --git a/backend/src/index.ts b/backend/src/index.ts index 9d88453fb..d9e8722d1 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -136,6 +136,7 @@ class Server { blocks.setNewBlockCallback(websocketHandler.handleNewBlock.bind(websocketHandler)); memPool.setMempoolChangedCallback(websocketHandler.handleMempoolChange.bind(websocketHandler)); donations.setNotfyDonationStatusCallback(websocketHandler.handleNewDonation.bind(websocketHandler)); + fiatConversion.setProgressChangedCallback(websocketHandler.handleNewConversionRates.bind(websocketHandler)); loadingIndicators.setProgressChangedCallback(websocketHandler.handleLoadingChanged.bind(websocketHandler)); } diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 34d1bf6b6..30227ba08 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -137,3 +137,4 @@ interface RequiredParams { } export interface ILoadingIndicators { [name: string]: number; } +export interface IConversionRates { [currency: string]: number; }