diff --git a/UNIQUE_SETUPS.md b/UNIQUE_SETUPS.md index 1af850e799..b03a720c01 100644 --- a/UNIQUE_SETUPS.md +++ b/UNIQUE_SETUPS.md @@ -37,11 +37,6 @@ To use `xrpl.js` with React, you need to install shims for core NodeJS modules. const webpack = require("webpack"); module.exports = function override(config) { - const fallback = config.resolve.fallback || {}; - Object.assign(fallback, { - ws: require.resolve("xrpl/dist/npm/client/WSWrapper"), - }); - config.resolve.fallback = fallback; config.plugins = (config.plugins || []).concat([ new webpack.ProvidePlugin({ process: "process/browser", @@ -127,30 +122,25 @@ export default defineConfig({ }, optimizeDeps: { esbuildOptions: { - define: { - global: 'globalThis', - }, - plugins: [ - NodeGlobalsPolyfillPlugin({ - process: true, - buffer: true, - }), - ], + define: { + global: 'globalThis', + }, + plugins: [ + NodeGlobalsPolyfillPlugin({ + process: true, + buffer: true, + }), + ], }, -}, -build: { - rollupOptions: { + }, + build: { + rollupOptions: { plugins: [ - polyfillNode(), + polyfillNode(), ] - } -}, -resolve: { - alias: { - events: 'events', - ws: 'xrpl/dist/npm/client/WSWrapper', + } }, -}}) +}) ``` 3. Install the config dependencies and xrpl (e.g. using this command) @@ -158,9 +148,7 @@ resolve: { ```shell npm install --save-dev @esbuild-plugins/node-globals-polyfill \ rollup-plugin-polyfill-node \ - && npm install - events \ - xrpl + && npm install xrpl ``` ### Using xrpl.js with Deno diff --git a/package-lock.json b/package-lock.json index 97ab9dccd1..e1f7595854 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,6 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-tsdoc": "^0.2.16", - "eventemitter2": "^6.0.0", "expect": "^29.3.1", "jest": "^29.3.1", "jest-mock": "^29.3.1", @@ -6719,17 +6718,10 @@ "node": ">=0.10.0" } }, - "node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", - "dev": true - }, "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/events": { "version": "3.3.0", @@ -7830,6 +7822,12 @@ "node": ">= 6" } }, + "node_modules/http-proxy/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -11679,6 +11677,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "node_modules/p-reduce": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", @@ -14928,6 +14932,27 @@ "node": ">= 10" } }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/webpack-cli": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", @@ -15336,26 +15361,6 @@ "node": ">=6" } }, - "node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/xrpl": { "resolved": "packages/xrpl", "link": true @@ -15446,15 +15451,38 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@noble/hashes": "^1.0.0" + "@noble/hashes": "^1.0.0", + "eventemitter3": "5.0.1", + "ws": "^8.13.0" }, "devDependencies": { - "@types/node": "^16.18.38" + "@types/node": "^16.18.38", + "@types/ws": "^8.5.6" }, "engines": { "node": ">=16.0.0" } }, + "packages/isomorphic/node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "packages/ripple-address-codec": { "version": "4.3.1", "license": "ISC", @@ -15513,13 +15541,14 @@ "@xrplf/secret-numbers": "^1.0.0", "bignumber.js": "^9.0.0", "cross-fetch": "^4.0.0", + "eventemitter3": "^5.0.1", "ripple-address-codec": "^4.3.1", "ripple-binary-codec": "^1.10.0", - "ripple-keypairs": "^1.3.1", - "ws": "^8.2.2" + "ripple-keypairs": "^1.3.1" }, "devDependencies": { "@types/node": "^16.18.38", + "eventemitter3": "^5.0.1", "https-proxy-agent": "^7.0.1", "karma": "^6.4.1", "karma-chrome-launcher": "^3.1.1", @@ -15528,7 +15557,8 @@ "lodash": "^4.17.4", "react": "^18.2.0", "run-s": "^0.0.0", - "typedoc": "0.25.0" + "typedoc": "0.25.0", + "ws": "^8.14.2" }, "engines": { "node": ">=16.0.0" @@ -15558,9 +15588,10 @@ } }, "packages/xrpl/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "dev": true, "engines": { "node": ">=10.0.0" }, @@ -18429,7 +18460,18 @@ "version": "file:packages/isomorphic", "requires": { "@noble/hashes": "^1.0.0", - "@types/node": "^16.18.38" + "@types/node": "^16.18.38", + "@types/ws": "^8.5.6", + "eventemitter3": "5.0.1", + "ws": "^8.13.0" + }, + "dependencies": { + "ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "requires": {} + } } }, "@xrplf/prettier-config": { @@ -20834,17 +20876,10 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", - "dev": true - }, "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "events": { "version": "3.3.0", @@ -21670,6 +21705,14 @@ "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + } } }, "http-proxy-agent": { @@ -24676,6 +24719,14 @@ "requires": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + } } }, "p-reduce": { @@ -25628,6 +25679,7 @@ "requires": { "@xrplf/isomorphic": "1.0.0", "assert": "^2.0.0", + "bignumber.js": "^9.0.0", "buffer": "6.0.3", "ripple-address-codec": "^4.3.1" } @@ -27117,6 +27169,13 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} } } }, @@ -27423,12 +27482,6 @@ } } }, - "ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "requires": {} - }, "xrpl": { "version": "file:packages/xrpl", "requires": { @@ -27439,6 +27492,7 @@ "@xrplf/secret-numbers": "^1.0.0", "bignumber.js": "^9.0.0", "cross-fetch": "^4.0.0", + "eventemitter3": "^5.0.1", "https-proxy-agent": "^7.0.1", "karma": "^6.4.1", "karma-chrome-launcher": "^3.1.1", @@ -27451,7 +27505,7 @@ "ripple-keypairs": "^1.3.1", "run-s": "^0.0.0", "typedoc": "0.25.0", - "ws": "^8.2.2" + "ws": "^8.14.2" }, "dependencies": { "agent-base": { @@ -27470,9 +27524,10 @@ } }, "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "dev": true, "requires": {} } } diff --git a/package.json b/package.json index cd2f084299..dbd3c42101 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-tsdoc": "^0.2.16", - "eventemitter2": "^6.0.0", "expect": "^29.3.1", "jest": "^29.3.1", "jest-mock": "^29.3.1", diff --git a/packages/isomorphic/HISTORY.md b/packages/isomorphic/HISTORY.md index 4f3f4a2331..e56f2b417c 100644 --- a/packages/isomorphic/HISTORY.md +++ b/packages/isomorphic/HISTORY.md @@ -10,3 +10,4 @@ Initial release providing isomorphic and tree-shakable implementations of: - bytesToHash - hashToBytes - randomBytes +- ws diff --git a/packages/isomorphic/README.md b/packages/isomorphic/README.md index 880d8268ad..3b30525206 100644 --- a/packages/isomorphic/README.md +++ b/packages/isomorphic/README.md @@ -97,4 +97,8 @@ console.log(hexToBytes('DEADBEEF')) // [222, 173, 190, 239] ### `@xrplf/isomorphic/ws` -// TODO: Websocket Wrapper and `ws` +```typescript +import WebSocket from '@xrplf/isomorphic/ws' + +const socket = new WebSocket('wss://localhost:8080') +``` diff --git a/packages/isomorphic/package.json b/packages/isomorphic/package.json index 18fa019fe3..208d88041c 100644 --- a/packages/isomorphic/package.json +++ b/packages/isomorphic/package.json @@ -21,16 +21,20 @@ "sha512/*", "ripemd160/*", "src/*", - "utils/*" + "utils/*", + "ws/*" ], "directories": { "test": "test" }, "dependencies": { - "@noble/hashes": "^1.0.0" + "@noble/hashes": "^1.0.0", + "eventemitter3": "5.0.1", + "ws": "^8.13.0" }, "devDependencies": { - "@types/node": "^16.18.38" + "@types/node": "^16.18.38", + "@types/ws": "^8.5.6" }, "repository": { "type": "git", diff --git a/packages/xrpl/src/client/WSWrapper.ts b/packages/isomorphic/src/ws/browser.ts similarity index 93% rename from packages/xrpl/src/client/WSWrapper.ts rename to packages/isomorphic/src/ws/browser.ts index 6fca23022e..4375e93849 100644 --- a/packages/xrpl/src/client/WSWrapper.ts +++ b/packages/isomorphic/src/ws/browser.ts @@ -1,5 +1,5 @@ /* eslint-disable max-classes-per-file -- Needs to be a wrapper for ws */ -import { EventEmitter } from 'events' +import { EventEmitter } from 'eventemitter3' // Define the global WebSocket class found on the native browser declare class WebSocket { @@ -31,7 +31,7 @@ export default class WSWrapper extends EventEmitter { public static CONNECTING = 0 public static OPEN = 1 public static CLOSING = 2 - // eslint-disable-next-line @typescript-eslint/no-magic-numbers -- magic number is being defined here + public static CLOSED = 3 private readonly ws: WebSocket @@ -48,7 +48,6 @@ export default class WSWrapper extends EventEmitter { _websocketOptions: WSWrapperOptions, ) { super() - this.setMaxListeners(Infinity) this.ws = new WebSocket(url) diff --git a/packages/isomorphic/src/ws/index.ts b/packages/isomorphic/src/ws/index.ts new file mode 100644 index 0000000000..ea5a3e5ef5 --- /dev/null +++ b/packages/isomorphic/src/ws/index.ts @@ -0,0 +1,10 @@ +import WebSocket from 'ws' + +export default class Socket extends WebSocket { + constructor(...args) { + super(args[0], args[1], args[2]) + this.setMaxListeners(Infinity) + } +} + +export type ClientOptions = WebSocket.ClientOptions diff --git a/packages/isomorphic/ws/package.json b/packages/isomorphic/ws/package.json new file mode 100644 index 0000000000..a8271b5fcf --- /dev/null +++ b/packages/isomorphic/ws/package.json @@ -0,0 +1,11 @@ +{ + "name": "@xrplf/isomorphic/ws", + "private": true, + "main": "../dist/ws", + "types": "../dist/ws", + "browser": "../dist/ws/browser.js", + "dependencies": { + "ws": "^8.13.0", + "eventemitter3": "^5.0.1" + } +} diff --git a/packages/xrpl/HISTORY.md b/packages/xrpl/HISTORY.md index a4bf0b3e5e..e35463c6db 100644 --- a/packages/xrpl/HISTORY.md +++ b/packages/xrpl/HISTORY.md @@ -17,20 +17,23 @@ Subscribe to [the **xrpl-announce** mailing list](https://groups.google.com/g/xr * Uses `@xrplf/secret-numbers` instead of `xrpl-secret-numbers` * Improve key algorithm detection. It will now throw Errors with helpful messages * Move `authorizeChannel` from `wallet/signer` to `wallet/authorizeChannel` to solve a circular dependency issue. +* When using a bundler you must remove the mapping of `ws` to `WSWrapper`. ex. `ws: 'xrpl/dist/npm/client/WSWrapper'`. See [../UNIQUE_STEPS](Unique Steps) for the new, much smaller, configs. ### Bundling Changes -* Bundler configurations are much more simplified. - * removed the following polyfills: - * `assert` - * `crypto-browserify` - * `https-browserify` - * `os-browserify` - * `stream-browserify` - * `stream-http` - * `url` - * `util` - previously added automatically by `webpack` - * Removed mappings for: - * Excluding `https-proxy-agent` +Bundler configurations are much more simplified. See [../UNIQUE_STEPS](Unique Steps) for the new, much smaller, configs. +* removed the following polyfills: + * `assert` + * `crypto-browserify` + * `https-browserify` + * `os-browserify` + * `stream-browserify` + * `stream-http` + * `url` + * `util` - previously added automatically by `webpack` + * `events` - previously added automatically by `webpack` but manual for `vite` +* Removed mappings for: + * `ws` to `WsWrapper` + * Excluding `https-proxy-agent` ### Changed * Remove `lodash` as a dependency diff --git a/packages/xrpl/package.json b/packages/xrpl/package.json index 38ac1032ff..20fcfc0882 100644 --- a/packages/xrpl/package.json +++ b/packages/xrpl/package.json @@ -28,13 +28,14 @@ "@xrplf/secret-numbers": "^1.0.0", "bignumber.js": "^9.0.0", "cross-fetch": "^4.0.0", + "eventemitter3": "^5.0.1", "ripple-address-codec": "^4.3.1", "ripple-binary-codec": "^1.10.0", - "ripple-keypairs": "^1.3.1", - "ws": "^8.2.2" + "ripple-keypairs": "^1.3.1" }, "devDependencies": { "@types/node": "^16.18.38", + "eventemitter3": "^5.0.1", "https-proxy-agent": "^7.0.1", "karma": "^6.4.1", "karma-chrome-launcher": "^3.1.1", @@ -43,7 +44,8 @@ "lodash": "^4.17.4", "run-s": "^0.0.0", "react": "^18.2.0", - "typedoc": "0.25.0" + "typedoc": "0.25.0", + "ws": "^8.14.2" }, "resolutions": { "elliptic": "^6.5.4" diff --git a/packages/xrpl/src/client/connection.ts b/packages/xrpl/src/client/connection.ts index 6eba4bb222..84bea8dd8a 100644 --- a/packages/xrpl/src/client/connection.ts +++ b/packages/xrpl/src/client/connection.ts @@ -1,8 +1,8 @@ /* eslint-disable max-lines -- Connection is a large file w/ lots of imports/exports */ -import { EventEmitter } from 'events' import type { Agent } from 'http' -import WebSocket from 'ws' +import WebSocket, { ClientOptions } from '@xrplf/isomorphic/ws' +import { EventEmitter } from 'eventemitter3' import { DisconnectedError, @@ -61,7 +61,7 @@ function createWebSocket( url: string, config: ConnectionOptions, ): WebSocket | null { - const options: WebSocket.ClientOptions = { + const options: ClientOptions = { agent: config.agent, } if (config.headers) { @@ -75,15 +75,7 @@ function createWebSocket( } } const websocketOptions = { ...options } - const websocket = new WebSocket(url, websocketOptions) - /* - * we will have a listener for each outstanding request, - * so we have to raise the limit (the default is 10) - */ - if (typeof websocket.setMaxListeners === 'function') { - websocket.setMaxListeners(Infinity) - } - return websocket + return new WebSocket(url, websocketOptions) } /** @@ -136,7 +128,6 @@ export class Connection extends EventEmitter { */ public constructor(url?: string, options: ConnectionUserOptions = {}) { super() - this.setMaxListeners(Infinity) this.url = url this.config = { timeout: TIMEOUT * 1000, diff --git a/packages/xrpl/src/client/index.ts b/packages/xrpl/src/client/index.ts index 73c994b14e..3537714d0c 100644 --- a/packages/xrpl/src/client/index.ts +++ b/packages/xrpl/src/client/index.ts @@ -1,7 +1,7 @@ /* eslint-disable jsdoc/require-jsdoc -- Request has many aliases, but they don't need unique docs */ /* eslint-disable max-lines -- Client is a large file w/ lots of imports/exports */ -import { EventEmitter } from 'events' +import { EventEmitter } from 'eventemitter3' import { RippledError, @@ -37,7 +37,10 @@ import type { SubmitResponse, } from '../models/methods' import type { BookOffer, BookOfferCurrency } from '../models/methods/bookOffers' -import type { OnEventToListenerMap } from '../models/methods/subscribe' +import type { + EventTypes, + OnEventToListenerMap, +} from '../models/methods/subscribe' import type { Transaction } from '../models/transactions' import { setTransactionFlagsToNumber } from '../models/utils/flags' import { @@ -161,7 +164,7 @@ const NORMAL_DISCONNECT_CODE = 1000 * * @category Clients */ -class Client extends EventEmitter { +class Client extends EventEmitter { /* * Underlying connection to rippled. */ @@ -381,12 +384,12 @@ class Client extends EventEmitter { * }) * ``` */ - public on>( - eventName: T, - listener: U, - ): this { - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any -- Compatible - return super.on(eventName, listener as (...args: any[]) => void) + public on< + T extends EventTypes, + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- needs to be any for overload + U extends (...args: any[]) => void = OnEventToListenerMap, + >(eventName: T, listener: U): this { + return super.on(eventName, listener) } /** diff --git a/packages/xrpl/src/models/methods/subscribe.ts b/packages/xrpl/src/models/methods/subscribe.ts index 2ffbbb0067..24ec3b57b5 100644 --- a/packages/xrpl/src/models/methods/subscribe.ts +++ b/packages/xrpl/src/models/methods/subscribe.ts @@ -435,7 +435,19 @@ export type Stream = | OrderBookStream | ConsensusStream -export type OnEventToListenerMap = T extends 'connected' +export type EventTypes = + | 'connected' + | 'disconnected' + | 'ledgerClosed' + | 'validationReceived' + | 'transaction' + | 'peerStatusChange' + | 'consensusPhase' + | 'manifestReceived' + | 'path_find' + | 'error' + +export type OnEventToListenerMap = T extends 'connected' ? () => void : T extends 'disconnected' ? (code: number) => void @@ -456,7 +468,4 @@ export type OnEventToListenerMap = T extends 'connected' : T extends 'error' ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- needs to be any for overload (...err: any[]) => void - : T extends string - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- needs to be any for overload - (...args: any[]) => void - : never + : (...args: never[]) => void diff --git a/packages/xrpl/test/createMockRippled.ts b/packages/xrpl/test/createMockRippled.ts index 48ef5253ed..954bcc2b1a 100644 --- a/packages/xrpl/test/createMockRippled.ts +++ b/packages/xrpl/test/createMockRippled.ts @@ -1,4 +1,4 @@ -import { EventEmitter2 } from 'eventemitter2' +import { EventEmitter } from 'eventemitter3' import { Server as WebSocketServer, type WebSocket } from 'ws' import type { Request } from '../src' @@ -48,7 +48,7 @@ export interface PortResponse extends BaseResponse { */ export type MockedWebSocketServer = WebSocketServer & - EventEmitter2 & { + EventEmitter & { responses: Record suppressOutput: boolean socket: WebSocket @@ -83,8 +83,8 @@ export function destroyMockRippled(server: MockedWebSocketServer): void { } export default function createMockRippled(port: number): MockedWebSocketServer { + Object.assign(WebSocketServer.prototype, EventEmitter.prototype) const mock = new WebSocketServer({ port }) as MockedWebSocketServer - Object.assign(mock, EventEmitter2.prototype) mock.responses = {} mock.suppressOutput = false diff --git a/packages/xrpl/webpack.base.config.js b/packages/xrpl/webpack.base.config.js index 25f65ccec3..2eb0c11dea 100644 --- a/packages/xrpl/webpack.base.config.js +++ b/packages/xrpl/webpack.base.config.js @@ -10,11 +10,5 @@ module.exports = merge(getDefaultConfiguration(), { library: 'xrpl', path: path.join(__dirname, 'build/'), filename: `xrpl.default.js`, - }, - plugins: [new webpack.NormalModuleReplacementPlugin(/^ws$/, './WSWrapper')], - resolve: { - alias: { - ws: './dist/npm/client/WSWrapper.js', - }, - }, + } })