From ad6b146aa0fa1c2230d2aea5673fac230c9fa6bf Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn Date: Fri, 28 Jun 2024 00:48:57 -0700 Subject: [PATCH] Add example nested network config --- .../__fixtures__/mempool-config.template.json | 10 ++++ backend/src/__tests__/config.test.ts | 56 +++++++++++++++++++ backend/src/config.ts | 22 ++++++++ docker/backend/mempool-config.json | 10 ++++ docker/backend/start.sh | 12 ++++ 5 files changed, 110 insertions(+) diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 7880f686c..a78eac968 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -1,4 +1,14 @@ { + "NETWORKS": { + "TESTNET": { + "ENABLED": true, + "WEIGHT": "__NETWORKS_TESTNET_WEIGHT__" + }, + "MAINNET": { + "ENABLED": true, + "WEIGHT": "__NETWORKS_MAINNET_WEIGHT__" + } + }, "MEMPOOL": { "ENABLED": true, "OFFICIAL": false, diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index 367816da8..89997114b 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -157,6 +157,17 @@ describe('Mempool Backend Config', () => { PAID: false, API_KEY: '', }); + + expect(config.NETWORKS).toStrictEqual({ + MAINNET: { + ENABLED: true, + WEIGHT: 'foo' + }, + TESTNET: { + ENABLED: false, + WEIGHT: 'bar' + } + }) }); }); @@ -190,6 +201,8 @@ describe('Mempool Backend Config', () => { expect(config.MEMPOOL_SERVICES).toStrictEqual(fixture.MEMPOOL_SERVICES); expect(config.REDIS).toStrictEqual(fixture.REDIS); + + expect(config.NETWORKS).toStrictEqual(fixture.NETWORKS); }); }); @@ -197,6 +210,22 @@ describe('Mempool Backend Config', () => { jest.isolateModules(() => { const startSh = fs.readFileSync(`${__dirname}/../../../docker/backend/start.sh`, 'utf-8'); const fixture = JSON.parse(fs.readFileSync(`${__dirname}/../__fixtures__/mempool-config.template.json`, 'utf8')); + + function generateKeys(obj, prefix = '') { + let keys: string[] = []; + + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + const newPrefix = prefix ? `${prefix}_${key}` : key; + if (typeof obj[key] === 'object' && obj[key] !== null) { + keys = keys.concat(generateKeys(obj[key], newPrefix)); + } else { + keys.push(`${newPrefix}`); + } + } + } + return keys; + } function parseJson(jsonObj, root?) { for (const [key, value] of Object.entries(jsonObj)) { @@ -208,6 +237,31 @@ describe('Mempool Backend Config', () => { continue; } + if (root === 'NETWORKS') { + const keys = generateKeys(value); + keys.forEach(item => { + const replaceStr = `__${root}_${key}_${item}__`; + const envVarStr = `${root}_${key}_${item}`; + + let defaultEntry = replaceStr + '=' + '\\${' + envVarStr + ':=(.*)' + '}'; + if (process.env.CI) { + console.log(`looking for ${defaultEntry} in the start.sh script`); + } + + const re = new RegExp(defaultEntry); + expect(startSh).toMatch(re); + + const sedStr = 'sed -i "s!' + replaceStr + '!${' + replaceStr + '}!g" mempool-config.json'; + if (process.env.CI) { + console.log(`looking for ${sedStr} in the start.sh script`); + } + expect(startSh).toContain(sedStr); + + + }); + continue; + } + if (root) { //The flattened string, i.e, __MEMPOOL_ENABLED__ const replaceStr = `${root ? '__' + root + '_' : '__'}${key}__`; @@ -264,6 +318,8 @@ describe('Mempool Backend Config', () => { const replaceStr = `${root ? '__' + root + '_' : '__'}${key}__`; expect(dockerJson).toContain(`"${key}": ${replaceStr}`); break; + } else if (typeof value === 'object') { + break; } else { //Check for top level config keys expect(dockerJson).toContain(`"${key}"`); diff --git a/backend/src/config.ts b/backend/src/config.ts index 65dca3560..f5b26e461 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -160,6 +160,16 @@ interface IConfig { PAID: boolean; API_KEY: string; }, + NETWORKS: { + MAINNET: { + ENABLED: boolean; + WEIGHT: 'foo'; + }, + TESTNET: { + ENABLED: boolean; + WEIGHT: 'bar' + } + }; } const defaults: IConfig = { @@ -320,6 +330,16 @@ const defaults: IConfig = { 'PAID': false, 'API_KEY': '', }, + 'NETWORKS': { + 'MAINNET': { + 'ENABLED': true, + 'WEIGHT': 'foo', + }, + 'TESTNET': { + 'ENABLED': false, + 'WEIGHT': 'bar' + } + } }; class Config implements IConfig { @@ -341,6 +361,7 @@ class Config implements IConfig { MEMPOOL_SERVICES: IConfig['MEMPOOL_SERVICES']; REDIS: IConfig['REDIS']; FIAT_PRICE: IConfig['FIAT_PRICE']; + NETWORKS: IConfig['NETWORKS']; constructor() { const configs = this.merge(configFromFile, defaults); @@ -362,6 +383,7 @@ class Config implements IConfig { this.MEMPOOL_SERVICES = configs.MEMPOOL_SERVICES; this.REDIS = configs.REDIS; this.FIAT_PRICE = configs.FIAT_PRICE; + this.NETWORKS = configs.NETWORKS; } merge = (...objects: object[]): IConfig => { diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 7a4b9e46a..e0d871eff 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -155,5 +155,15 @@ "ENABLED": __FIAT_PRICE_ENABLED__, "PAID": __FIAT_PRICE_PAID__, "API_KEY": "__FIAT_PRICE_API_KEY__" + }, + "NETWORKS": { + "MAINNET": { + "ENABLED": __NETWORKS_MAINNET_ENABLED__, + "WEIGHT": "__NETWORKS_MAINNET_WEIGHT__," + }, + "TESTNET": { + "ENABLED": __NETWORKS_TESTNET_ENABLED__, + "WEIGHT": "__NETWORKS_TESTNET_WEIGHT__" + } } } diff --git a/docker/backend/start.sh b/docker/backend/start.sh index 847eae63a..94e79675a 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -157,6 +157,12 @@ __FIAT_PRICE_ENABLED__=${FIAT_PRICE_ENABLED:=true} __FIAT_PRICE_PAID__=${FIAT_PRICE_PAID:=false} __FIAT_PRICE_API_KEY__=${FIAT_PRICE_API_KEY:=""} +# NETWORKS +__NETWORKS_TESTNET_ENABLED__=${NETWORKS_TESTNET_ENABLED:=true} +__NETWORKS_TESTNET_WEIGHT__=${NETWORKS_TESTNET_WEIGHT:="0.1"} +__NETWORKS_MAINNET_ENABLED__=${NETWORKS_MAINNET_ENABLED:=true} +__NETWORKS_MAINNET_WEIGHT__=${NETWORKS_MAINNET_WEIGHT:="0.2"} + mkdir -p "${__MEMPOOL_CACHE_DIR__}" sed -i "s!__MEMPOOL_NETWORK__!${__MEMPOOL_NETWORK__}!g" mempool-config.json @@ -306,4 +312,10 @@ sed -i "s!__FIAT_PRICE_ENABLED__!${__FIAT_PRICE_ENABLED__}!g" mempool-config.jso sed -i "s!__FIAT_PRICE_PAID__!${__FIAT_PRICE_PAID__}!g" mempool-config.json sed -i "s!__FIAT_PRICE_API_KEY__!${__FIAT_PRICE_API_KEY__}!g" mempool-config.json +# NETWORKS +sed -i "s!__NETWORKS_TESTNET_ENABLED__!${__NETWORKS_TESTNET_ENABLED__}!g" mempool-config.json +sed -i "s!__NETWORKS_TESTNET_WEIGHT__!${__NETWORKS_TESTNET_WEIGHT__}!g" mempool-config.json +sed -i "s!__NETWORKS_MAINNET_ENABLED__!${__NETWORKS_MAINNET_ENABLED__}!g" mempool-config.json +sed -i "s!__NETWORKS_MAINNET_WEIGHT__!${__NETWORKS_MAINNET_WEIGHT__}!g" mempool-config.json + node /backend/package/index.js