From 2ef2b6daa05a7cff057e9d3ef95134cee3e4045d Mon Sep 17 00:00:00 2001 From: Justin Starry Date: Fri, 9 Jul 2021 00:33:41 -0500 Subject: [PATCH] fix: remove buggy node polyfill plugin (#18531) * fix: remove buggy node polyfill plugin * fix websocket test * remove assert dependency --- web3.js/package-lock.json | 1 + web3.js/rollup.config.js | 4 +--- web3.js/src/connection.ts | 7 +++---- web3.js/src/secp256k1-program.ts | 2 +- web3.js/src/transaction.ts | 2 +- web3.js/src/util/assert.ts | 8 ++++++++ web3.js/src/util/url.ts | 8 +++----- web3.js/test/connection.test.ts | 2 +- web3.js/test/mocks/rpc-http.ts | 4 ++-- web3.js/test/transaction-payer.test.ts | 2 +- web3.js/test/transaction.test.ts | 2 +- web3.js/test/websocket.test.ts | 2 +- 12 files changed, 24 insertions(+), 20 deletions(-) create mode 100644 web3.js/src/util/assert.ts diff --git a/web3.js/package-lock.json b/web3.js/package-lock.json index 15832b97d..117f9bce9 100644 --- a/web3.js/package-lock.json +++ b/web3.js/package-lock.json @@ -17562,6 +17562,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", "dev": true, "dependencies": { "estree-walker": "^0.6.1", diff --git a/web3.js/rollup.config.js b/web3.js/rollup.config.js index d701ded4a..ba5beb9cc 100644 --- a/web3.js/rollup.config.js +++ b/web3.js/rollup.config.js @@ -2,7 +2,6 @@ import babel from '@rollup/plugin-babel'; import commonjs from '@rollup/plugin-commonjs'; import json from '@rollup/plugin-json'; import nodeResolve from '@rollup/plugin-node-resolve'; -import nodePolyfills from 'rollup-plugin-node-polyfills'; import replace from '@rollup/plugin-replace'; import {terser} from 'rollup-plugin-terser'; @@ -90,7 +89,7 @@ function generateConfig(configType, format) { 'crypto-hash', 'jayson/lib/client/browser', 'js-sha3', - 'node-fetch', + // 'node-fetch', will resolve to whatwg-fetch 'rpc-websockets', 'secp256k1', 'superstruct', @@ -125,7 +124,6 @@ function generateConfig(configType, format) { // TODO: Find a workaround to avoid resolving the following JSON file: // `node_modules/secp256k1/node_modules/elliptic/package.json` config.plugins.push(json()); - config.plugins.push(nodePolyfills()); break; case 'node': diff --git a/web3.js/src/connection.ts b/web3.js/src/connection.ts index 5e0577378..865dd4d1e 100644 --- a/web3.js/src/connection.ts +++ b/web3.js/src/connection.ts @@ -1,7 +1,5 @@ -import assert from 'assert'; import bs58 from 'bs58'; import {Buffer} from 'buffer'; -import {parse as urlParse} from 'url'; import fetch, {Response} from 'node-fetch'; import { type as pick, @@ -34,6 +32,7 @@ import {Signer} from './keypair'; import {MS_PER_SLOT} from './timing'; import {Transaction} from './transaction'; import {Message} from './message'; +import assert from './util/assert'; import {sleep} from './util/sleep'; import {promiseTimeout} from './util/promise-timeout'; import {toBuffer} from './util/to-buffer'; @@ -2025,7 +2024,7 @@ export class Connection { endpoint: string, commitmentOrConfig?: Commitment | ConnectionConfig, ) { - let url = urlParse(endpoint); + let url = new URL(endpoint); const useHttps = url.protocol === 'https:'; let wsEndpoint; @@ -2046,7 +2045,7 @@ export class Connection { this._rpcWsEndpoint = wsEndpoint || makeWebsocketUrl(endpoint); this._rpcClient = createRpcClient( - url.href, + url.toString(), useHttps, httpHeaders, fetchMiddleware, diff --git a/web3.js/src/secp256k1-program.ts b/web3.js/src/secp256k1-program.ts index 8819e3a6a..2c070a8f4 100644 --- a/web3.js/src/secp256k1-program.ts +++ b/web3.js/src/secp256k1-program.ts @@ -1,11 +1,11 @@ import {Buffer} from 'buffer'; import * as BufferLayout from '@solana/buffer-layout'; import secp256k1 from 'secp256k1'; -import assert from 'assert'; import {keccak_256} from 'js-sha3'; import {PublicKey} from './publickey'; import {TransactionInstruction} from './transaction'; +import assert from './util/assert'; import {toBuffer} from './util/to-buffer'; const {publicKeyCreate, ecdsaSign} = secp256k1; diff --git a/web3.js/src/transaction.ts b/web3.js/src/transaction.ts index 1a91cb5bc..118f922aa 100644 --- a/web3.js/src/transaction.ts +++ b/web3.js/src/transaction.ts @@ -1,4 +1,3 @@ -import invariant from 'assert'; import nacl from 'tweetnacl'; import bs58 from 'bs58'; import {Buffer} from 'buffer'; @@ -7,6 +6,7 @@ import {Message} from './message'; import {PublicKey} from './publickey'; import * as shortvec from './util/shortvec-encoding'; import {toBuffer} from './util/to-buffer'; +import invariant from './util/assert'; import type {Signer} from './keypair'; import type {Blockhash} from './blockhash'; import type {CompiledInstruction} from './message'; diff --git a/web3.js/src/util/assert.ts b/web3.js/src/util/assert.ts new file mode 100644 index 000000000..ba9e96c7f --- /dev/null +++ b/web3.js/src/util/assert.ts @@ -0,0 +1,8 @@ +export default function ( + condition: unknown, + message?: string, +): asserts condition { + if (!condition) { + throw new Error(message || 'Assertion failed'); + } +} diff --git a/web3.js/src/util/url.ts b/web3.js/src/util/url.ts index 0d9ad259b..a9f050e26 100644 --- a/web3.js/src/util/url.ts +++ b/web3.js/src/util/url.ts @@ -1,7 +1,5 @@ -import {format as urlFormat, parse as urlParse} from 'url'; - export function makeWebsocketUrl(endpoint: string) { - let url = urlParse(endpoint); + let url = new URL(endpoint); const useHttps = url.protocol === 'https:'; url.protocol = useHttps ? 'wss:' : 'ws:'; @@ -13,8 +11,8 @@ export function makeWebsocketUrl(endpoint: string) { // When the endpoint omits the port, we're connecting to the protocol // default ports: http(80) or https(443) and it's assumed we're behind a reverse // proxy which manages WebSocket upgrade and backend port redirection. - if (url.port !== null) { + if (url.port !== '') { url.port = String(Number(url.port) + 1); } - return urlFormat(url); + return url.toString(); } diff --git a/web3.js/test/connection.test.ts b/web3.js/test/connection.test.ts index 957e33cdd..fb0097f01 100644 --- a/web3.js/test/connection.test.ts +++ b/web3.js/test/connection.test.ts @@ -1,5 +1,4 @@ import bs58 from 'bs58'; -import invariant from 'assert'; import {Buffer} from 'buffer'; import {Token, u64} from '@solana/spl-token'; import {expect, use} from 'chai'; @@ -19,6 +18,7 @@ import { sendAndConfirmTransaction, Keypair, } from '../src'; +import invariant from '../src/util/assert'; import {DEFAULT_TICKS_PER_SLOT, NUM_TICKS_PER_SECOND} from '../src/timing'; import {MOCK_PORT, url} from './url'; import { diff --git a/web3.js/test/mocks/rpc-http.ts b/web3.js/test/mocks/rpc-http.ts index 7a96e31cb..b4bb8de72 100644 --- a/web3.js/test/mocks/rpc-http.ts +++ b/web3.js/test/mocks/rpc-http.ts @@ -1,10 +1,10 @@ import bs58 from 'bs58'; import BN from 'bn.js'; -import invariant from 'assert'; import * as mockttp from 'mockttp'; import {mockRpcMessage} from './rpc-websockets'; import {Connection, PublicKey, Transaction, Signer} from '../../src'; +import invariant from '../../src/util/assert'; import type {Commitment, HttpHeaders, RpcParams} from '../../src/connection'; export const mockServer: mockttp.Mockttp | undefined = @@ -150,7 +150,7 @@ const processTransaction = async ({ transaction.sign(...signers); const encoded = transaction.serialize().toString('base64'); - invariant(transaction.signature !== null); + invariant(transaction.signature); const signature = bs58.encode(transaction.signature); await mockRpcResponse({ method: 'sendTransaction', diff --git a/web3.js/test/transaction-payer.test.ts b/web3.js/test/transaction-payer.test.ts index 566e37efc..6a4e4bd0b 100644 --- a/web3.js/test/transaction-payer.test.ts +++ b/web3.js/test/transaction-payer.test.ts @@ -1,5 +1,4 @@ import base58 from 'bs58'; -import invariant from 'assert'; import {expect} from 'chai'; import { @@ -9,6 +8,7 @@ import { SystemProgram, LAMPORTS_PER_SOL, } from '../src'; +import invariant from '../src/util/assert'; import {MOCK_PORT, url} from './url'; import {helpers, mockRpcResponse, mockServer} from './mocks/rpc-http'; import {stubRpcWebSocket, restoreRpcWebSocket} from './mocks/rpc-websockets'; diff --git a/web3.js/test/transaction.test.ts b/web3.js/test/transaction.test.ts index 35f484eff..77d78805b 100644 --- a/web3.js/test/transaction.test.ts +++ b/web3.js/test/transaction.test.ts @@ -1,5 +1,4 @@ import bs58 from 'bs58'; -import invariant from 'assert'; import {Buffer} from 'buffer'; import nacl from 'tweetnacl'; import {expect} from 'chai'; @@ -10,6 +9,7 @@ import {Transaction} from '../src/transaction'; import {StakeProgram} from '../src/stake-program'; import {SystemProgram} from '../src/system-program'; import {Message} from '../src/message'; +import invariant from '../src/util/assert'; import {toBuffer} from '../src/util/to-buffer'; describe('Transaction', () => { diff --git a/web3.js/test/websocket.test.ts b/web3.js/test/websocket.test.ts index a78b43031..668d990ff 100644 --- a/web3.js/test/websocket.test.ts +++ b/web3.js/test/websocket.test.ts @@ -65,7 +65,7 @@ if (process.env.TEST_LIVE) { }); it('connect by websocket endpoint from options', async () => { - let connection = new Connection('', { + let connection = new Connection('http://localhost', { wsEndpoint: wsUrl, });