From 717e2c0fbb85070903545ce5b62ca556b8ba7744 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 30 Dec 2025 13:57:11 +0100 Subject: [PATCH 1/4] Remove isomorphic-ws dependency Use native WebSocket instead --- .pnp.cjs | 54 +------------------ ...hic-ws-npm-4.0.1-aa39192848-7cb90dc2f0.zip | 3 -- .../ws-npm-7.5.10-878ccb886b-bd7d5f4aaf.zip | 3 -- CHANGELOG.md | 3 ++ packages/socket/package.json | 2 - packages/socket/src/socketwrapper.ts | 48 +++++------------ yarn.lock | 26 --------- 7 files changed, 17 insertions(+), 122 deletions(-) delete mode 100644 .yarn/cache/isomorphic-ws-npm-4.0.1-aa39192848-7cb90dc2f0.zip delete mode 100644 .yarn/cache/ws-npm-7.5.10-878ccb886b-bd7d5f4aaf.zip diff --git a/.pnp.cjs b/.pnp.cjs index 7aed996e68..07856bba3a 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -1914,10 +1914,6 @@ const RAW_RUNTIME_STATE = "isobject",\ "npm:3.0.1"\ ],\ - [\ - "isomorphic-ws",\ - "virtual:992e8a49329af27dec1603ba7ec6f83173fb73e1d5752e95d78d0bec9ff8e148a218f65e20742125a49b958677fd4d6119ec35f9c56f9b4ea72f0e32f53b591b#npm:4.0.1"\ - ],\ [\ "istanbul-lib-coverage",\ "npm:3.2.2"\ @@ -3001,7 +2997,7 @@ const RAW_RUNTIME_STATE = ],\ [\ "ws",\ - "virtual:992e8a49329af27dec1603ba7ec6f83173fb73e1d5752e95d78d0bec9ff8e148a218f65e20742125a49b958677fd4d6119ec35f9c56f9b4ea72f0e32f53b591b#npm:7.5.10"\ + "virtual:1d61fc58e3bfe6abc91b3453689f077c31362697bd0dc94bc6dc09bf7c6a0b9c4d4d14474fc7aada28132044c44f3822836470d62594826815ec3c32a8ff4838#npm:8.17.1"\ ],\ [\ "xstream",\ @@ -3649,7 +3645,6 @@ const RAW_RUNTIME_STATE = ["@types/karma-jasmine-html-reporter", "npm:1.5.1"],\ ["@types/ws", "npm:6.0.4"],\ ["glob", "npm:13.0.0"],\ - ["isomorphic-ws", "virtual:992e8a49329af27dec1603ba7ec6f83173fb73e1d5752e95d78d0bec9ff8e148a218f65e20742125a49b958677fd4d6119ec35f9c56f9b4ea72f0e32f53b591b#npm:4.0.1"],\ ["jasmine", "npm:4.6.0"],\ ["jasmine-spec-reporter", "npm:6.0.0"],\ ["karma", "npm:6.3.16"],\ @@ -3665,7 +3660,6 @@ const RAW_RUNTIME_STATE = ["typescript", "patch:typescript@npm%3A5.9.2#optional!builtin::version=5.9.2&hash=5786d5"],\ ["webpack", "virtual:992e8a49329af27dec1603ba7ec6f83173fb73e1d5752e95d78d0bec9ff8e148a218f65e20742125a49b958677fd4d6119ec35f9c56f9b4ea72f0e32f53b591b#npm:5.102.1"],\ ["webpack-cli", "virtual:992e8a49329af27dec1603ba7ec6f83173fb73e1d5752e95d78d0bec9ff8e148a218f65e20742125a49b958677fd4d6119ec35f9c56f9b4ea72f0e32f53b591b#npm:4.7.0"],\ - ["ws", "virtual:992e8a49329af27dec1603ba7ec6f83173fb73e1d5752e95d78d0bec9ff8e148a218f65e20742125a49b958677fd4d6119ec35f9c56f9b4ea72f0e32f53b591b#npm:7.5.10"],\ ["xstream", "npm:11.14.0"]\ ],\ "linkType": "SOFT"\ @@ -9758,28 +9752,6 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ - ["isomorphic-ws", [\ - ["npm:4.0.1", {\ - "packageLocation": "./.yarn/cache/isomorphic-ws-npm-4.0.1-aa39192848-7cb90dc2f0.zip/node_modules/isomorphic-ws/",\ - "packageDependencies": [\ - ["isomorphic-ws", "npm:4.0.1"]\ - ],\ - "linkType": "SOFT"\ - }],\ - ["virtual:992e8a49329af27dec1603ba7ec6f83173fb73e1d5752e95d78d0bec9ff8e148a218f65e20742125a49b958677fd4d6119ec35f9c56f9b4ea72f0e32f53b591b#npm:4.0.1", {\ - "packageLocation": "./.yarn/__virtual__/isomorphic-ws-virtual-493f91fda7/0/cache/isomorphic-ws-npm-4.0.1-aa39192848-7cb90dc2f0.zip/node_modules/isomorphic-ws/",\ - "packageDependencies": [\ - ["@types/ws", "npm:6.0.4"],\ - ["isomorphic-ws", "virtual:992e8a49329af27dec1603ba7ec6f83173fb73e1d5752e95d78d0bec9ff8e148a218f65e20742125a49b958677fd4d6119ec35f9c56f9b4ea72f0e32f53b591b#npm:4.0.1"],\ - ["ws", "virtual:992e8a49329af27dec1603ba7ec6f83173fb73e1d5752e95d78d0bec9ff8e148a218f65e20742125a49b958677fd4d6119ec35f9c56f9b4ea72f0e32f53b591b#npm:7.5.10"]\ - ],\ - "packagePeers": [\ - "@types/ws",\ - "ws"\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["istanbul-lib-coverage", [\ ["npm:3.2.2", {\ "packageLocation": "./.yarn/cache/istanbul-lib-coverage-npm-3.2.2-5c0526e059-6c7ff21067.zip/node_modules/istanbul-lib-coverage/",\ @@ -14716,13 +14688,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["ws", [\ - ["npm:7.5.10", {\ - "packageLocation": "./.yarn/cache/ws-npm-7.5.10-878ccb886b-bd7d5f4aaf.zip/node_modules/ws/",\ - "packageDependencies": [\ - ["ws", "npm:7.5.10"]\ - ],\ - "linkType": "SOFT"\ - }],\ ["npm:8.17.1", {\ "packageLocation": "./.yarn/cache/ws-npm-8.17.1-f57fb24a2c-f4a49064af.zip/node_modules/ws/",\ "packageDependencies": [\ @@ -14746,23 +14711,6 @@ const RAW_RUNTIME_STATE = "utf-8-validate"\ ],\ "linkType": "HARD"\ - }],\ - ["virtual:992e8a49329af27dec1603ba7ec6f83173fb73e1d5752e95d78d0bec9ff8e148a218f65e20742125a49b958677fd4d6119ec35f9c56f9b4ea72f0e32f53b591b#npm:7.5.10", {\ - "packageLocation": "./.yarn/__virtual__/ws-virtual-7051cf986b/0/cache/ws-npm-7.5.10-878ccb886b-bd7d5f4aaf.zip/node_modules/ws/",\ - "packageDependencies": [\ - ["@types/bufferutil", null],\ - ["@types/utf-8-validate", null],\ - ["bufferutil", null],\ - ["utf-8-validate", null],\ - ["ws", "virtual:992e8a49329af27dec1603ba7ec6f83173fb73e1d5752e95d78d0bec9ff8e148a218f65e20742125a49b958677fd4d6119ec35f9c56f9b4ea72f0e32f53b591b#npm:7.5.10"]\ - ],\ - "packagePeers": [\ - "@types/bufferutil",\ - "@types/utf-8-validate",\ - "bufferutil",\ - "utf-8-validate"\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["xstream", [\ diff --git a/.yarn/cache/isomorphic-ws-npm-4.0.1-aa39192848-7cb90dc2f0.zip b/.yarn/cache/isomorphic-ws-npm-4.0.1-aa39192848-7cb90dc2f0.zip deleted file mode 100644 index 087e5da9af..0000000000 --- a/.yarn/cache/isomorphic-ws-npm-4.0.1-aa39192848-7cb90dc2f0.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83882aaa82137c6473fab24cdaa6d866e1348853984161d75b7ce6a6714f08ed -size 5035 diff --git a/.yarn/cache/ws-npm-7.5.10-878ccb886b-bd7d5f4aaf.zip b/.yarn/cache/ws-npm-7.5.10-878ccb886b-bd7d5f4aaf.zip deleted file mode 100644 index 485f6a3227..0000000000 --- a/.yarn/cache/ws-npm-7.5.10-878ccb886b-bd7d5f4aaf.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b821064cb6641c59f6a7c3662a5fb12bf055391c32112345400c44604f56be1 -size 124993 diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f44220d1d..2f5a6fa9ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to ### Changed - all: Drop support for Node.js < 22. +- @cosmjs/socket: Remove isomorphic-ws dependency ([#1810]) + +[#1810]: https://github.com/cosmos/cosmjs/issues/1810 ## [0.38.0] - 2025-12-30 diff --git a/packages/socket/package.json b/packages/socket/package.json index 18034e947e..3e66b1da81 100644 --- a/packages/socket/package.json +++ b/packages/socket/package.json @@ -43,8 +43,6 @@ }, "dependencies": { "@cosmjs/stream": "workspace:^", - "isomorphic-ws": "^4.0.1", - "ws": "^7", "xstream": "^11.14.0" }, "devDependencies": { diff --git a/packages/socket/src/socketwrapper.ts b/packages/socket/src/socketwrapper.ts index fbd33c056a..eacd4bc706 100644 --- a/packages/socket/src/socketwrapper.ts +++ b/packages/socket/src/socketwrapper.ts @@ -1,14 +1,3 @@ -// eslint-disable-next-line @typescript-eslint/naming-convention -import WebSocket from "isomorphic-ws"; - -function environmentIsNodeJs(): boolean { - return ( - typeof process !== "undefined" && - typeof process.versions !== "undefined" && - typeof process.versions.node !== "undefined" - ); -} - export interface SocketWrapperCloseEvent { readonly wasClean: boolean; readonly code: number; @@ -29,7 +18,7 @@ export interface SocketWrapperMessageEvent { } /** - * A thin wrapper around isomorphic-ws' WebSocket class that adds + * A thin wrapper around WebSocket that adds * - constant message/error/open/close handlers * - explicit connection via a connect() method * - type support for events @@ -159,32 +148,21 @@ export class SocketWrapper { } public async send(data: string): Promise { - return new Promise((resolve, reject) => { - if (!this.socket) { - throw new Error("Socket undefined. This must be called after connecting."); - } + if (!this.socket) { + throw new Error("Socket undefined. This must be called after connecting."); + } - if (this.closed) { - throw new Error("Socket was closed, so no data can be sent anymore."); - } + if (this.closed) { + throw new Error("Socket was closed, so no data can be sent anymore."); + } - // this exception should be thrown by send() automatically according to - // https://developer.mozilla.org/de/docs/Web/API/WebSocket#send() but it does not work in browsers - if (this.socket.readyState !== WebSocket.OPEN) { - throw new Error("Websocket is not open"); - } + // this exception should be thrown by send() automatically according to + // https://developer.mozilla.org/de/docs/Web/API/WebSocket#send() but it does not work in browsers + if (this.socket.readyState !== WebSocket.OPEN) { + throw new Error("Websocket is not open"); + } - if (environmentIsNodeJs()) { - this.socket.send(data, (err) => { - if (err) reject(err); - else resolve(); - }); - } else { - // Browser websocket send method does not accept a callback - this.socket.send(data); - resolve(); - } - }); + this.socket.send(data); } /** diff --git a/yarn.lock b/yarn.lock index d6b274089e..e70c6bded5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -541,7 +541,6 @@ __metadata: "@types/karma-jasmine-html-reporter": "npm:^1" "@types/ws": "npm:^6.0.1" glob: "npm:^13.0.0" - isomorphic-ws: "npm:^4.0.1" jasmine: "npm:^4" jasmine-spec-reporter: "npm:^6" karma: "npm:^6.3.14" @@ -557,7 +556,6 @@ __metadata: typescript: "npm:~5.9" webpack: "npm:^5.76.0" webpack-cli: "npm:^4.6.0" - ws: "npm:^7" xstream: "npm:^11.14.0" languageName: unknown linkType: soft @@ -4999,15 +4997,6 @@ __metadata: languageName: node linkType: hard -"isomorphic-ws@npm:^4.0.1": - version: 4.0.1 - resolution: "isomorphic-ws@npm:4.0.1" - peerDependencies: - ws: "*" - checksum: 10c0/7cb90dc2f0eb409825558982fb15d7c1d757a88595efbab879592f9d2b63820d6bbfb5571ab8abe36c715946e165a413a99f6aafd9f40ab1f514d73487bc9996 - languageName: node - linkType: hard - "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.0.0-alpha.1, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -8083,21 +8072,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7": - version: 7.5.10 - resolution: "ws@npm:7.5.10" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d - languageName: node - linkType: hard - "ws@npm:~8.17.1": version: 8.17.1 resolution: "ws@npm:8.17.1" From 267449c98be0f4a2b8a799eee5c2740e0751ce51 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 30 Dec 2025 13:59:35 +0100 Subject: [PATCH 2/4] Remove unused @types/ws --- .pnp.cjs | 15 --------------- .../@types-ws-npm-6.0.4-4b7cc6a57b-fa958e6459.zip | 3 --- packages/socket/package.json | 1 - yarn.lock | 10 ---------- 4 files changed, 29 deletions(-) delete mode 100644 .yarn/cache/@types-ws-npm-6.0.4-4b7cc6a57b-fa958e6459.zip diff --git a/.pnp.cjs b/.pnp.cjs index 07856bba3a..9d7e9a3dea 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -670,10 +670,6 @@ const RAW_RUNTIME_STATE = "@types/w3c-web-usb",\ "npm:1.0.10"\ ],\ - [\ - "@types/ws",\ - "npm:6.0.4"\ - ],\ [\ "@typescript-eslint/eslint-plugin",\ "virtual:5e84e7553054e678344c9584f8c875c24d817f4c617606b54c4b4cc7ac3f929af81710850c40f70a573fe1c4c8107e4e9bf2f796bbaaed428c1211083577d86f#npm:8.46.2"\ @@ -3643,7 +3639,6 @@ const RAW_RUNTIME_STATE = ["@types/karma-firefox-launcher", "npm:2.1.0"],\ ["@types/karma-jasmine", "npm:4.0.2"],\ ["@types/karma-jasmine-html-reporter", "npm:1.5.1"],\ - ["@types/ws", "npm:6.0.4"],\ ["glob", "npm:13.0.0"],\ ["jasmine", "npm:4.6.0"],\ ["jasmine-spec-reporter", "npm:6.0.0"],\ @@ -5017,16 +5012,6 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ - ["@types/ws", [\ - ["npm:6.0.4", {\ - "packageLocation": "./.yarn/cache/@types-ws-npm-6.0.4-4b7cc6a57b-fa958e6459.zip/node_modules/@types/ws/",\ - "packageDependencies": [\ - ["@types/node", "npm:22.10.6"],\ - ["@types/ws", "npm:6.0.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@typescript-eslint/eslint-plugin", [\ ["npm:8.46.2", {\ "packageLocation": "./.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.46.2-596a5e990a-24d1257bd0.zip/node_modules/@typescript-eslint/eslint-plugin/",\ diff --git a/.yarn/cache/@types-ws-npm-6.0.4-4b7cc6a57b-fa958e6459.zip b/.yarn/cache/@types-ws-npm-6.0.4-4b7cc6a57b-fa958e6459.zip deleted file mode 100644 index ca38b10966..0000000000 --- a/.yarn/cache/@types-ws-npm-6.0.4-4b7cc6a57b-fa958e6459.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45e9eabbbea6f73a13e7a52e824b06b04a13a6dc9eb5f13a4cf962b356de538b -size 14470 diff --git a/packages/socket/package.json b/packages/socket/package.json index 3e66b1da81..3980a9ba79 100644 --- a/packages/socket/package.json +++ b/packages/socket/package.json @@ -52,7 +52,6 @@ "@types/karma-firefox-launcher": "^2", "@types/karma-jasmine": "^4", "@types/karma-jasmine-html-reporter": "^1", - "@types/ws": "^6.0.1", "glob": "^13.0.0", "jasmine": "^4", "jasmine-spec-reporter": "^6", diff --git a/yarn.lock b/yarn.lock index e70c6bded5..bc70b4ff5c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -539,7 +539,6 @@ __metadata: "@types/karma-firefox-launcher": "npm:^2" "@types/karma-jasmine": "npm:^4" "@types/karma-jasmine-html-reporter": "npm:^1" - "@types/ws": "npm:^6.0.1" glob: "npm:^13.0.0" jasmine: "npm:^4" jasmine-spec-reporter: "npm:^6" @@ -1697,15 +1696,6 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^6.0.1": - version: 6.0.4 - resolution: "@types/ws@npm:6.0.4" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/fa958e64596ca9487c3ed6012834de70b47f25d971f1950cfb8e6a99cb77ff340ae82ac7627744e01b58010674ef8ede07d5a2ac29ca9ad0d67a430fcc69ae14 - languageName: node - linkType: hard - "@typescript-eslint/eslint-plugin@npm:^8.46.0": version: 8.46.2 resolution: "@typescript-eslint/eslint-plugin@npm:8.46.2" From efc79e06b8a3c88f1da19d4ba9e6efd4b9b3bb75 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 30 Dec 2025 14:08:40 +0100 Subject: [PATCH 3/4] Update friendly error message from WebSocket in node.js --- packages/socket/src/socketwrapper.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/socket/src/socketwrapper.spec.ts b/packages/socket/src/socketwrapper.spec.ts index cf0f1e34ed..0868522c85 100644 --- a/packages/socket/src/socketwrapper.spec.ts +++ b/packages/socket/src/socketwrapper.spec.ts @@ -59,7 +59,7 @@ const enabled = !!globalThis.process?.env.SOCKETSERVER_ENABLED; (error) => { if (error.message) { // error message only available in nodejs - expect(error.message).toMatch(/ECONNREFUSED/i); + expect(error.message).toMatch(/network error or non-101 status code/i); } done(); }, From 3e086385d6d3f07926b9d7183ece4657df27a479 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 30 Dec 2025 14:39:05 +0100 Subject: [PATCH 4/4] What happens when events stream errors? --- packages/socket/src/streamingsocket.spec.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/socket/src/streamingsocket.spec.ts b/packages/socket/src/streamingsocket.spec.ts index 4e55413009..f6a0c2d344 100644 --- a/packages/socket/src/streamingsocket.spec.ts +++ b/packages/socket/src/streamingsocket.spec.ts @@ -68,6 +68,13 @@ const enabled = !!globalThis.process?.env.SOCKETSERVER_ENABLED; subscription.unsubscribe(); done(); }, + error: (err) => { + // err is an ErrorEvent but we don't get types for that + const error = err.error; + done.fail( + `Unexpected error in events stream: "${error.message}" / "${error.message}" / "${error.stack}" / JSON=${JSON.stringify(err)} (${err})`, + ); + }, }); (async () => {