From 9a9131585186e4469b528ef9a08d307f2d30e4b7 Mon Sep 17 00:00:00 2001 From: danielailie Date: Mon, 26 Aug 2024 17:48:25 +0300 Subject: [PATCH 1/7] Add user agent info --- src/apiNetworkProvider.ts | 19 +++++++++++++++++-- src/proxyNetworkProvider.ts | 18 ++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/apiNetworkProvider.ts b/src/apiNetworkProvider.ts index 086980c..42c5a7f 100644 --- a/src/apiNetworkProvider.ts +++ b/src/apiNetworkProvider.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { AxiosHeaders, AxiosRequestConfig } from "axios"; import { AccountOnNetwork, GuardianData } from "./accounts"; import { defaultAxiosConfig, defaultPagination } from "./config"; import { ContractQueryRequest } from "./contractQueryRequest"; @@ -22,11 +22,26 @@ export class ApiNetworkProvider implements INetworkProvider { private url: string; private config: AxiosRequestConfig; private backingProxyNetworkProvider; + private userAgentPrefix = 'sdk-network-providers/api' - constructor(url: string, config?: AxiosRequestConfig) { + constructor(url: string, config?: AxiosRequestConfig, clientName?: string) { this.url = url; this.config = { ...defaultAxiosConfig, ...config }; this.backingProxyNetworkProvider = new ProxyNetworkProvider(url, config); + this.setUserAgent(config, clientName); + + } + + private setUserAgent(config: AxiosRequestConfig | undefined, clientName: string | undefined) { + if (!config?.headers) return; + + const headers = AxiosHeaders.from(config.headers as AxiosHeaders).normalize(true); + const resolvedClientName = clientName || 'unknown'; + + const currentUserAgent = headers.hasUserAgent() ? headers.getUserAgent() : ''; + const newUserAgent = `${currentUserAgent} ${this.userAgentPrefix}${resolvedClientName}`.trim(); + + headers.setUserAgent(newUserAgent, true); } async getNetworkConfig(): Promise { diff --git a/src/proxyNetworkProvider.ts b/src/proxyNetworkProvider.ts index a3d8d2d..68d1745 100644 --- a/src/proxyNetworkProvider.ts +++ b/src/proxyNetworkProvider.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { AxiosHeaders, AxiosRequestConfig } from "axios"; import { AccountOnNetwork, GuardianData } from "./accounts"; import { defaultAxiosConfig } from "./config"; import { EsdtContractAddress } from "./constants"; @@ -19,10 +19,24 @@ import { TransactionStatus } from "./transactionStatus"; export class ProxyNetworkProvider implements INetworkProvider { private url: string; private config: AxiosRequestConfig; + private userAgentPrefix = 'sdk-network-providers/proxy' - constructor(url: string, config?: AxiosRequestConfig) { + constructor(url: string, config?: AxiosRequestConfig, clientName?: string) { this.url = url; this.config = { ...defaultAxiosConfig, ...config }; + this.setUserAgent(config, clientName); + } + + private setUserAgent(config: AxiosRequestConfig | undefined, clientName: string | undefined) { + if (!config?.headers) return; + + const headers = AxiosHeaders.from(config.headers as AxiosHeaders).normalize(true); + const resolvedClientName = clientName || 'unknown'; + + const currentUserAgent = headers.hasUserAgent() ? headers.getUserAgent() : ''; + const newUserAgent = `${currentUserAgent} ${this.userAgentPrefix}${resolvedClientName}`.trim(); + + headers.setUserAgent(newUserAgent, true); } async getNetworkConfig(): Promise { From b014180f93cd5a33b75111cafa402f9ef8a5db84 Mon Sep 17 00:00:00 2001 From: danielailie Date: Mon, 26 Aug 2024 17:49:22 +0300 Subject: [PATCH 2/7] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31c0ab6..a279c2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@multiversx/sdk-network-providers", - "version": "2.6.0", + "version": "2.7.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@multiversx/sdk-network-providers", - "version": "2.6.0", + "version": "2.7.0", "license": "MIT", "dependencies": { "bech32": "1.1.4", diff --git a/package.json b/package.json index c9337a1..74f9f07 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@multiversx/sdk-network-providers", - "version": "2.6.0", + "version": "2.7.0", "lockfileVersion": 2, "requires": true, "author": "MultiversX", From 691a1a94276cb8c8969093da7a8e8cfd1f37a441 Mon Sep 17 00:00:00 2001 From: danielailie Date: Tue, 27 Aug 2024 12:24:44 +0300 Subject: [PATCH 3/7] Extract duplicated code and extend config --- src/NetworkProviderConfig.ts | 5 +++++ src/apiNetworkProvider.ts | 23 ++++++----------------- src/proxyNetworkProvider.ts | 22 ++++++---------------- src/userAgent.ts | 22 ++++++++++++++++++++++ 4 files changed, 39 insertions(+), 33 deletions(-) create mode 100644 src/NetworkProviderConfig.ts create mode 100644 src/userAgent.ts diff --git a/src/NetworkProviderConfig.ts b/src/NetworkProviderConfig.ts new file mode 100644 index 0000000..ea68c23 --- /dev/null +++ b/src/NetworkProviderConfig.ts @@ -0,0 +1,5 @@ +import { AxiosRequestConfig } from 'axios'; + +export interface ExtendedAxiosRequestConfig extends AxiosRequestConfig { + clientName?: string; +} diff --git a/src/apiNetworkProvider.ts b/src/apiNetworkProvider.ts index 42c5a7f..6bdfb13 100644 --- a/src/apiNetworkProvider.ts +++ b/src/apiNetworkProvider.ts @@ -1,4 +1,4 @@ -import axios, { AxiosHeaders, AxiosRequestConfig } from "axios"; +import axios from "axios"; import { AccountOnNetwork, GuardianData } from "./accounts"; import { defaultAxiosConfig, defaultPagination } from "./config"; import { ContractQueryRequest } from "./contractQueryRequest"; @@ -16,32 +16,21 @@ import { DefinitionOfFungibleTokenOnNetwork, DefinitionOfTokenCollectionOnNetwor import { FungibleTokenOfAccountOnNetwork, NonFungibleTokenOfAccountOnNetwork } from "./tokens"; import { TransactionOnNetwork, prepareTransactionForBroadcasting } from "./transactions"; import { TransactionStatus } from "./transactionStatus"; +import { setUserAgent } from "./userAgent"; +import { ExtendedAxiosRequestConfig } from "./NetworkProviderConfig"; // TODO: Find & remove duplicate code between "ProxyNetworkProvider" and "ApiNetworkProvider". export class ApiNetworkProvider implements INetworkProvider { private url: string; - private config: AxiosRequestConfig; + private config: ExtendedAxiosRequestConfig; private backingProxyNetworkProvider; private userAgentPrefix = 'sdk-network-providers/api' - constructor(url: string, config?: AxiosRequestConfig, clientName?: string) { + constructor(url: string, config?: ExtendedAxiosRequestConfig) { this.url = url; this.config = { ...defaultAxiosConfig, ...config }; this.backingProxyNetworkProvider = new ProxyNetworkProvider(url, config); - this.setUserAgent(config, clientName); - - } - - private setUserAgent(config: AxiosRequestConfig | undefined, clientName: string | undefined) { - if (!config?.headers) return; - - const headers = AxiosHeaders.from(config.headers as AxiosHeaders).normalize(true); - const resolvedClientName = clientName || 'unknown'; - - const currentUserAgent = headers.hasUserAgent() ? headers.getUserAgent() : ''; - const newUserAgent = `${currentUserAgent} ${this.userAgentPrefix}${resolvedClientName}`.trim(); - - headers.setUserAgent(newUserAgent, true); + setUserAgent(this.userAgentPrefix, this.config); } async getNetworkConfig(): Promise { diff --git a/src/proxyNetworkProvider.ts b/src/proxyNetworkProvider.ts index 68d1745..3b960f1 100644 --- a/src/proxyNetworkProvider.ts +++ b/src/proxyNetworkProvider.ts @@ -1,4 +1,4 @@ -import axios, { AxiosHeaders, AxiosRequestConfig } from "axios"; +import axios from "axios"; import { AccountOnNetwork, GuardianData } from "./accounts"; import { defaultAxiosConfig } from "./config"; import { EsdtContractAddress } from "./constants"; @@ -14,29 +14,19 @@ import { DefinitionOfFungibleTokenOnNetwork, DefinitionOfTokenCollectionOnNetwor import { FungibleTokenOfAccountOnNetwork, NonFungibleTokenOfAccountOnNetwork } from "./tokens"; import { TransactionOnNetwork, prepareTransactionForBroadcasting } from "./transactions"; import { TransactionStatus } from "./transactionStatus"; +import { setUserAgent } from "./userAgent"; +import { ExtendedAxiosRequestConfig } from "./NetworkProviderConfig"; // TODO: Find & remove duplicate code between "ProxyNetworkProvider" and "ApiNetworkProvider". export class ProxyNetworkProvider implements INetworkProvider { private url: string; - private config: AxiosRequestConfig; + private config: ExtendedAxiosRequestConfig; private userAgentPrefix = 'sdk-network-providers/proxy' - constructor(url: string, config?: AxiosRequestConfig, clientName?: string) { + constructor(url: string, config?: ExtendedAxiosRequestConfig) { this.url = url; this.config = { ...defaultAxiosConfig, ...config }; - this.setUserAgent(config, clientName); - } - - private setUserAgent(config: AxiosRequestConfig | undefined, clientName: string | undefined) { - if (!config?.headers) return; - - const headers = AxiosHeaders.from(config.headers as AxiosHeaders).normalize(true); - const resolvedClientName = clientName || 'unknown'; - - const currentUserAgent = headers.hasUserAgent() ? headers.getUserAgent() : ''; - const newUserAgent = `${currentUserAgent} ${this.userAgentPrefix}${resolvedClientName}`.trim(); - - headers.setUserAgent(newUserAgent, true); + setUserAgent(this.userAgentPrefix, this.config); } async getNetworkConfig(): Promise { diff --git a/src/userAgent.ts b/src/userAgent.ts new file mode 100644 index 0000000..7272265 --- /dev/null +++ b/src/userAgent.ts @@ -0,0 +1,22 @@ +import { AxiosHeaders } from "axios"; +import { ExtendedAxiosRequestConfig } from "./NetworkProviderConfig"; + +export function setUserAgent(userAgentPrefix: string, config: ExtendedAxiosRequestConfig | undefined) { + if (!config) { + config = { headers: new AxiosHeaders({}) } + } + if (!config.headers) { + config.headers = new AxiosHeaders({}) + }; + + const headers = AxiosHeaders.from(config.headers as AxiosHeaders).normalize(true); + if (!config.clientName) { + console.log("Can you please provide the client name of the aplication that uses the sdk?") + } + const resolvedClientName = config.clientName || 'unknown'; + + const currentUserAgent = headers.hasUserAgent() ? headers.getUserAgent() : ''; + const newUserAgent = `${currentUserAgent} ${userAgentPrefix}${resolvedClientName}`.trim(); + + headers.setUserAgent(newUserAgent, true); +} From e6a66096397a7b1862310efe23e8e24a0a08c778 Mon Sep 17 00:00:00 2001 From: danielailie Date: Tue, 27 Aug 2024 14:49:54 +0300 Subject: [PATCH 4/7] refactoring, fix typos, remaning --- src/NetworkProviderConfig.ts | 5 ----- src/apiNetworkProvider.ts | 13 +++++++------ src/constants.ts | 2 ++ src/networkProviderConfig.ts | 5 +++++ src/proxyNetworkProvider.ts | 14 +++++++------- src/userAgent.ts | 18 ++++++++---------- 6 files changed, 29 insertions(+), 28 deletions(-) delete mode 100644 src/NetworkProviderConfig.ts create mode 100644 src/networkProviderConfig.ts diff --git a/src/NetworkProviderConfig.ts b/src/NetworkProviderConfig.ts deleted file mode 100644 index ea68c23..0000000 --- a/src/NetworkProviderConfig.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { AxiosRequestConfig } from 'axios'; - -export interface ExtendedAxiosRequestConfig extends AxiosRequestConfig { - clientName?: string; -} diff --git a/src/apiNetworkProvider.ts b/src/apiNetworkProvider.ts index 6bdfb13..069d576 100644 --- a/src/apiNetworkProvider.ts +++ b/src/apiNetworkProvider.ts @@ -16,21 +16,22 @@ import { DefinitionOfFungibleTokenOnNetwork, DefinitionOfTokenCollectionOnNetwor import { FungibleTokenOfAccountOnNetwork, NonFungibleTokenOfAccountOnNetwork } from "./tokens"; import { TransactionOnNetwork, prepareTransactionForBroadcasting } from "./transactions"; import { TransactionStatus } from "./transactionStatus"; -import { setUserAgent } from "./userAgent"; -import { ExtendedAxiosRequestConfig } from "./NetworkProviderConfig"; +import { extendUserAgent } from "./userAgent"; +import { NetworkProviderConfig } from "./networkProviderConfig"; +import { MetricsPrefix } from "./constants"; // TODO: Find & remove duplicate code between "ProxyNetworkProvider" and "ApiNetworkProvider". export class ApiNetworkProvider implements INetworkProvider { private url: string; - private config: ExtendedAxiosRequestConfig; + private config: NetworkProviderConfig; private backingProxyNetworkProvider; - private userAgentPrefix = 'sdk-network-providers/api' + private userAgentPrefix = `${MetricsPrefix}/api` - constructor(url: string, config?: ExtendedAxiosRequestConfig) { + constructor(url: string, config?: NetworkProviderConfig) { this.url = url; this.config = { ...defaultAxiosConfig, ...config }; this.backingProxyNetworkProvider = new ProxyNetworkProvider(url, config); - setUserAgent(this.userAgentPrefix, this.config); + extendUserAgent(this.userAgentPrefix, this.config); } async getNetworkConfig(): Promise { diff --git a/src/constants.ts b/src/constants.ts index 932f959..5218a90 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -3,3 +3,5 @@ import { Address } from "./primitives"; export const MaxUint64AsBigNumber = new BigNumber("18446744073709551615"); export const EsdtContractAddress = new Address("erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u"); +export const MetricsPrefix = "multiversx-sdk" +export const UnknownClientName = "unknown" diff --git a/src/networkProviderConfig.ts b/src/networkProviderConfig.ts new file mode 100644 index 0000000..b66bffb --- /dev/null +++ b/src/networkProviderConfig.ts @@ -0,0 +1,5 @@ +import { AxiosRequestConfig } from 'axios'; + +export interface NetworkProviderConfig extends AxiosRequestConfig { + clientName?: string; +} diff --git a/src/proxyNetworkProvider.ts b/src/proxyNetworkProvider.ts index 3b960f1..6bc2e2b 100644 --- a/src/proxyNetworkProvider.ts +++ b/src/proxyNetworkProvider.ts @@ -1,7 +1,7 @@ import axios from "axios"; import { AccountOnNetwork, GuardianData } from "./accounts"; import { defaultAxiosConfig } from "./config"; -import { EsdtContractAddress } from "./constants"; +import { EsdtContractAddress, MetricsPrefix } from "./constants"; import { ContractQueryRequest } from "./contractQueryRequest"; import { ContractQueryResponse } from "./contractQueryResponse"; import { ErrContractQuery, ErrNetworkProvider } from "./errors"; @@ -14,19 +14,19 @@ import { DefinitionOfFungibleTokenOnNetwork, DefinitionOfTokenCollectionOnNetwor import { FungibleTokenOfAccountOnNetwork, NonFungibleTokenOfAccountOnNetwork } from "./tokens"; import { TransactionOnNetwork, prepareTransactionForBroadcasting } from "./transactions"; import { TransactionStatus } from "./transactionStatus"; -import { setUserAgent } from "./userAgent"; -import { ExtendedAxiosRequestConfig } from "./NetworkProviderConfig"; +import { extendUserAgent } from "./userAgent"; +import { NetworkProviderConfig } from "./networkProviderConfig"; // TODO: Find & remove duplicate code between "ProxyNetworkProvider" and "ApiNetworkProvider". export class ProxyNetworkProvider implements INetworkProvider { private url: string; - private config: ExtendedAxiosRequestConfig; - private userAgentPrefix = 'sdk-network-providers/proxy' + private config: NetworkProviderConfig; + private userAgentPrefix = `${MetricsPrefix}/proxy` - constructor(url: string, config?: ExtendedAxiosRequestConfig) { + constructor(url: string, config?: NetworkProviderConfig) { this.url = url; this.config = { ...defaultAxiosConfig, ...config }; - setUserAgent(this.userAgentPrefix, this.config); + extendUserAgent(this.userAgentPrefix, this.config); } async getNetworkConfig(): Promise { diff --git a/src/userAgent.ts b/src/userAgent.ts index 7272265..726ee23 100644 --- a/src/userAgent.ts +++ b/src/userAgent.ts @@ -1,22 +1,20 @@ import { AxiosHeaders } from "axios"; -import { ExtendedAxiosRequestConfig } from "./NetworkProviderConfig"; +import { NetworkProviderConfig } from "./networkProviderConfig"; +import { UnknownClientName } from "./constants"; -export function setUserAgent(userAgentPrefix: string, config: ExtendedAxiosRequestConfig | undefined) { - if (!config) { - config = { headers: new AxiosHeaders({}) } - } +export function extendUserAgent(userAgentPrefix: string, config: NetworkProviderConfig) { if (!config.headers) { config.headers = new AxiosHeaders({}) }; - - const headers = AxiosHeaders.from(config.headers as AxiosHeaders).normalize(true); if (!config.clientName) { - console.log("Can you please provide the client name of the aplication that uses the sdk?") + console.log("Can you please provide the client name of the application that uses the SDK? It will be used for metrics.") } - const resolvedClientName = config.clientName || 'unknown'; + + const headers = AxiosHeaders.from(config.headers as AxiosHeaders).normalize(true); + const resolvedClientName = config.clientName || UnknownClientName; const currentUserAgent = headers.hasUserAgent() ? headers.getUserAgent() : ''; - const newUserAgent = `${currentUserAgent} ${userAgentPrefix}${resolvedClientName}`.trim(); + const newUserAgent = `${currentUserAgent} ${userAgentPrefix}/${resolvedClientName}`; headers.setUserAgent(newUserAgent, true); } From 8089c7e82fd5a8586ae0bc2232f36ae789db0b9a Mon Sep 17 00:00:00 2001 From: danielailie Date: Tue, 27 Aug 2024 16:08:47 +0300 Subject: [PATCH 5/7] Add tests --- src/apiNetworkProvider.ts | 3 ++- src/providers.dev.net.spec.ts | 40 ++++++++++++++++++++++++++++++++--- src/userAgent.ts | 3 +-- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/apiNetworkProvider.ts b/src/apiNetworkProvider.ts index 069d576..53ea6b0 100644 --- a/src/apiNetworkProvider.ts +++ b/src/apiNetworkProvider.ts @@ -30,7 +30,8 @@ export class ApiNetworkProvider implements INetworkProvider { constructor(url: string, config?: NetworkProviderConfig) { this.url = url; this.config = { ...defaultAxiosConfig, ...config }; - this.backingProxyNetworkProvider = new ProxyNetworkProvider(url, config); + const proxyConfig = JSON.parse(JSON.stringify(this.config)); + this.backingProxyNetworkProvider = new ProxyNetworkProvider(url, proxyConfig); extendUserAgent(this.userAgentPrefix, this.config); } diff --git a/src/providers.dev.net.spec.ts b/src/providers.dev.net.spec.ts index f4f4399..890c0e5 100644 --- a/src/providers.dev.net.spec.ts +++ b/src/providers.dev.net.spec.ts @@ -1,4 +1,4 @@ -import { assert } from "chai"; +import { assert, expect } from "chai"; import { ApiNetworkProvider } from "./apiNetworkProvider"; import { INetworkProvider, ITransactionNext } from "./interface"; import { Address } from "./primitives"; @@ -7,6 +7,7 @@ import { MockQuery } from "./testscommon/dummyQuery"; import { NonFungibleTokenOfAccountOnNetwork } from "./tokens"; import { TransactionEventData } from "./transactionEvents"; import { TransactionOnNetwork } from "./transactions"; +import { AxiosHeaders } from "axios"; describe("test network providers on devnet: Proxy and API", function () { let alice = new Address("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); @@ -14,8 +15,8 @@ describe("test network providers on devnet: Proxy and API", function () { let dan = new Address("erd1kyaqzaprcdnv4luvanah0gfxzzsnpaygsy6pytrexll2urtd05ts9vegu7"); const MAX_NUMBER_OF_ITEMS_BY_DEFAULT = 20; - let apiProvider: INetworkProvider = new ApiNetworkProvider("https://devnet-api.multiversx.com", { timeout: 10000 }); - let proxyProvider: INetworkProvider = new ProxyNetworkProvider("https://devnet-gateway.multiversx.com", { timeout: 10000 }); + let apiProvider: INetworkProvider = new ApiNetworkProvider("https://devnet-api.multiversx.com", { timeout: 10000, clientName: 'test' }); + let proxyProvider: INetworkProvider = new ProxyNetworkProvider("https://devnet-gateway.multiversx.com", { timeout: 10000, clientName: 'test' }); it("should have same response for getNetworkConfig()", async function () { let apiResponse = await apiProvider.getNetworkConfig(); @@ -24,6 +25,39 @@ describe("test network providers on devnet: Proxy and API", function () { assert.deepEqual(apiResponse, proxyResponse); }); + it("should add userAgent unknown for clientName when no clientName passed", async function () { + const expectedApiUserAgent = "multiversx-sdk/api/unknown" + const expectedProxyUserAgent = "multiversx-sdk/proxy/unknown" + + let localApiProvider: any = new ApiNetworkProvider("https://devnet-api.multiversx.com", { timeout: 10000 }); + let localProxyProvider: any = new ProxyNetworkProvider("https://devnet-gateway.multiversx.com", { timeout: 10000 }); + + assert.equal(localApiProvider.config.headers.getUserAgent(), expectedApiUserAgent); + assert.equal(localProxyProvider.config.headers.getUserAgent(), expectedProxyUserAgent); + }); + + it("should set userAgent with specified clientName ", async function () { + const expectedApiUserAgent = "multiversx-sdk/api/test" + const expectedProxyUserAgent = "multiversx-sdk/proxy/test" + + let localApiProvider: any = new ApiNetworkProvider("https://devnet-api.multiversx.com", { timeout: 10000, clientName: 'test' }); + let localProxyProvider: any = new ProxyNetworkProvider("https://devnet-gateway.multiversx.com", { timeout: 10000, clientName: 'test' }); + + assert.equal(localApiProvider.config.headers.getUserAgent(), expectedApiUserAgent); + assert.equal(localProxyProvider.config.headers.getUserAgent(), expectedProxyUserAgent); + }); + + it("should keep the set userAgent and add the sdk to it", async function () { + const expectedApiUserAgent = "Client-info multiversx-sdk/api/test" + const expectedProxyUserAgent = "Client-info multiversx-sdk/proxy/test" + + let localApiProvider: any = new ApiNetworkProvider("https://devnet-api.multiversx.com", { timeout: 10000, headers: new AxiosHeaders({ "User-Agent": "Client-info" }), clientName: 'test' }); + let localProxyProvider: any = new ProxyNetworkProvider("https://devnet-gateway.multiversx.com", { timeout: 10000, headers: new AxiosHeaders({ "User-Agent": "Client-info" }), clientName: 'test' }); + + assert.equal(localApiProvider.config.headers.getUserAgent(), expectedApiUserAgent); + assert.equal(localProxyProvider.config.headers.getUserAgent(), expectedProxyUserAgent); + }); + it("should have same response for getNetworkStatus()", async function () { let apiResponse = await apiProvider.getNetworkStatus(); let proxyResponse = await proxyProvider.getNetworkStatus(); diff --git a/src/userAgent.ts b/src/userAgent.ts index 726ee23..e102f11 100644 --- a/src/userAgent.ts +++ b/src/userAgent.ts @@ -9,12 +9,11 @@ export function extendUserAgent(userAgentPrefix: string, config: NetworkProvider if (!config.clientName) { console.log("Can you please provide the client name of the application that uses the SDK? It will be used for metrics.") } - const headers = AxiosHeaders.from(config.headers as AxiosHeaders).normalize(true); const resolvedClientName = config.clientName || UnknownClientName; const currentUserAgent = headers.hasUserAgent() ? headers.getUserAgent() : ''; - const newUserAgent = `${currentUserAgent} ${userAgentPrefix}/${resolvedClientName}`; + const newUserAgent = currentUserAgent ? `${currentUserAgent} ${userAgentPrefix}/${resolvedClientName}` : `${userAgentPrefix}/${resolvedClientName}`; headers.setUserAgent(newUserAgent, true); } From fc2503a58c850dba0f61bc19d957868e619937b4 Mon Sep 17 00:00:00 2001 From: danielailie Date: Tue, 27 Aug 2024 16:36:43 +0300 Subject: [PATCH 6/7] Small renaming --- src/apiNetworkProvider.ts | 4 ++-- src/constants.ts | 2 +- src/proxyNetworkProvider.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/apiNetworkProvider.ts b/src/apiNetworkProvider.ts index 53ea6b0..5a3bb53 100644 --- a/src/apiNetworkProvider.ts +++ b/src/apiNetworkProvider.ts @@ -18,14 +18,14 @@ import { TransactionOnNetwork, prepareTransactionForBroadcasting } from "./trans import { TransactionStatus } from "./transactionStatus"; import { extendUserAgent } from "./userAgent"; import { NetworkProviderConfig } from "./networkProviderConfig"; -import { MetricsPrefix } from "./constants"; +import { BaseUserAgent } from "./constants"; // TODO: Find & remove duplicate code between "ProxyNetworkProvider" and "ApiNetworkProvider". export class ApiNetworkProvider implements INetworkProvider { private url: string; private config: NetworkProviderConfig; private backingProxyNetworkProvider; - private userAgentPrefix = `${MetricsPrefix}/api` + private userAgentPrefix = `${BaseUserAgent}/api` constructor(url: string, config?: NetworkProviderConfig) { this.url = url; diff --git a/src/constants.ts b/src/constants.ts index 5218a90..ea134f2 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -3,5 +3,5 @@ import { Address } from "./primitives"; export const MaxUint64AsBigNumber = new BigNumber("18446744073709551615"); export const EsdtContractAddress = new Address("erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u"); -export const MetricsPrefix = "multiversx-sdk" +export const BaseUserAgent = "multiversx-sdk" export const UnknownClientName = "unknown" diff --git a/src/proxyNetworkProvider.ts b/src/proxyNetworkProvider.ts index 6bc2e2b..c58e4bf 100644 --- a/src/proxyNetworkProvider.ts +++ b/src/proxyNetworkProvider.ts @@ -1,7 +1,7 @@ import axios from "axios"; import { AccountOnNetwork, GuardianData } from "./accounts"; import { defaultAxiosConfig } from "./config"; -import { EsdtContractAddress, MetricsPrefix } from "./constants"; +import { EsdtContractAddress, BaseUserAgent } from "./constants"; import { ContractQueryRequest } from "./contractQueryRequest"; import { ContractQueryResponse } from "./contractQueryResponse"; import { ErrContractQuery, ErrNetworkProvider } from "./errors"; @@ -21,7 +21,7 @@ import { NetworkProviderConfig } from "./networkProviderConfig"; export class ProxyNetworkProvider implements INetworkProvider { private url: string; private config: NetworkProviderConfig; - private userAgentPrefix = `${MetricsPrefix}/proxy` + private userAgentPrefix = `${BaseUserAgent}/proxy` constructor(url: string, config?: NetworkProviderConfig) { this.url = url; From 9f9e675be6f507db09b344c61bf4c25c55d0b448 Mon Sep 17 00:00:00 2001 From: danielailie Date: Wed, 28 Aug 2024 11:47:19 +0300 Subject: [PATCH 7/7] Fix tests --- src/apiNetworkProvider.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/apiNetworkProvider.ts b/src/apiNetworkProvider.ts index 5a3bb53..170b2fb 100644 --- a/src/apiNetworkProvider.ts +++ b/src/apiNetworkProvider.ts @@ -29,12 +29,18 @@ export class ApiNetworkProvider implements INetworkProvider { constructor(url: string, config?: NetworkProviderConfig) { this.url = url; + let proxyConfig = this.getProxyConfig(config); this.config = { ...defaultAxiosConfig, ...config }; - const proxyConfig = JSON.parse(JSON.stringify(this.config)); this.backingProxyNetworkProvider = new ProxyNetworkProvider(url, proxyConfig); extendUserAgent(this.userAgentPrefix, this.config); } + private getProxyConfig(config: NetworkProviderConfig | undefined) { + let proxyConfig = JSON.parse(JSON.stringify(config)); + proxyConfig = { ...defaultAxiosConfig, ...proxyConfig }; + return proxyConfig; + } + async getNetworkConfig(): Promise { return await this.backingProxyNetworkProvider.getNetworkConfig(); }