diff --git a/web3.js/rollup.config.js b/web3.js/rollup.config.js index decb284720..ab72cd0141 100644 --- a/web3.js/rollup.config.js +++ b/web3.js/rollup.config.js @@ -98,6 +98,8 @@ function generateConfig(configType) { 'bs58', 'buffer-layout', 'crypto-hash', + 'http', + 'https', 'jayson/lib/client/browser', 'node-fetch', 'rpc-websockets', diff --git a/web3.js/src/agent-manager.js b/web3.js/src/agent-manager.js index 2b1f91fc06..970c7649d1 100644 --- a/web3.js/src/agent-manager.js +++ b/web3.js/src/agent-manager.js @@ -1,19 +1,31 @@ // @flow -import {Agent} from 'http'; +import http from 'http'; +import https from 'https'; export const DESTROY_TIMEOUT_MS = 5000; export class AgentManager { - _agent: Agent = AgentManager._newAgent(); + _agent: http.Agent | https.Agent; _activeRequests = 0; _destroyTimeout: TimeoutID | null = null; + _useHttps: boolean; - static _newAgent(): Agent { - return new Agent({keepAlive: true, maxSockets: 25}); + static _newAgent(useHttps: boolean): http.Agent | https.Agent { + const options = {keepAlive: true, maxSockets: 25}; + if (useHttps) { + return new https.Agent(options); + } else { + return new http.Agent(options); + } } - requestStart(): Agent { + constructor(useHttps?: boolean) { + this._useHttps = useHttps === true; + this._agent = AgentManager._newAgent(this._useHttps); + } + + requestStart(): http.Agent | https.Agent { // $FlowExpectedError - Don't manage agents in the browser if (process.browser) return; @@ -31,7 +43,7 @@ export class AgentManager { if (this._activeRequests === 0 && this._destroyTimeout === null) { this._destroyTimeout = setTimeout(() => { this._agent.destroy(); - this._agent = AgentManager._newAgent(); + this._agent = AgentManager._newAgent(this._useHttps); }, DESTROY_TIMEOUT_MS); } } diff --git a/web3.js/src/connection.js b/web3.js/src/connection.js index 8d9a378010..4412333329 100644 --- a/web3.js/src/connection.js +++ b/web3.js/src/connection.js @@ -505,8 +505,8 @@ type ConfirmedBlock = { }>, }; -function createRpcRequest(url): RpcRequest { - const agentManager = new AgentManager(); +function createRpcRequest(url: string, useHttps: boolean): RpcRequest { + const agentManager = new AgentManager(useHttps); const server = jayson(async (request, callback) => { const agent = agentManager.requestStart(); const options = { @@ -1453,8 +1453,9 @@ export class Connection { */ constructor(endpoint: string, commitment: ?Commitment) { let url = urlParse(endpoint); + const useHttps = url.protocol === 'https:'; - this._rpcRequest = createRpcRequest(url.href); + this._rpcRequest = createRpcRequest(url.href, useHttps); this._commitment = commitment; this._blockhashInfo = { recentBlockhash: null, @@ -1463,7 +1464,7 @@ export class Connection { simulatedSignatures: [], }; - url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'; + url.protocol = useHttps ? 'wss:' : 'ws:'; url.host = ''; // Only shift the port by +1 as a convention for ws(s) only if given endpoint // is explictly specifying the endpoint port (HTTP-based RPC), assuming diff --git a/web3.js/test/connection.test.js b/web3.js/test/connection.test.js index 6081024f42..62bc6bad0d 100644 --- a/web3.js/test/connection.test.js +++ b/web3.js/test/connection.test.js @@ -2515,3 +2515,14 @@ test('root notification', async () => { expect(roots[1]).toBeGreaterThan(roots[0]); await connection.removeRootChangeListener(subscriptionId); }); + +test('https request', async () => { + if (mockRpcEnabled) { + console.log('non-live test skipped'); + return; + } + + const connection = new Connection('https://devnet.solana.com'); + const version = await connection.getVersion(); + expect(version['solana-core']).toBeTruthy(); +});