Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/web/websocket/connection.js
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,8 @@ function failWebsocketConnection (handler, code, reason, cause) {

handler.controller.abort()

handler.closeReason = reason

if (isConnecting(handler.readyState)) {
// If the connection was not established, we must still emit an 'error' and 'close' events
handler.onSocketClose()
Expand Down
7 changes: 5 additions & 2 deletions lib/web/websocket/websocket.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ function getSocketAddress (socket) {
* @property {number} readyState
* @property {import('stream').Duplex} socket
* @property {Set<number>} closeState
* @property {string} [closeReason]
* @property {import('../fetch/index').Fetch} controller
* @property {boolean} [wasEverConnected=false]
*/
Expand Down Expand Up @@ -113,6 +114,7 @@ class WebSocket extends EventTarget {
readyState: states.CONNECTING,
socket: null,
closeState: new Set(),
closeReason: '',
controller: null,
wasEverConnected: false
}
Expand Down Expand Up @@ -579,7 +581,7 @@ class WebSocket extends EventTarget {
this.#handler.closeState.has(sentCloseFrameState.RECEIVED)

let code = 1005
let reason = ''
let reason = this.#handler.closeReason ?? ''

const result = this.#parser?.closingInfo

Expand All @@ -604,7 +606,8 @@ class WebSocket extends EventTarget {
code = 1006

fireEvent('error', this, (type, init) => new ErrorEvent(type, init), {
error: new TypeError(reason)
error: new TypeError(reason),
message: reason
})
}

Expand Down
18 changes: 18 additions & 0 deletions test/websocket/issue-4735.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
'use strict'

const { test } = require('node:test')
const { WebSocket } = require('../..')
const { once } = require('node:events')

test('WebSocket emits error with message when connection cannot be opened', async (t) => {
t.plan(2)

const ws = new WebSocket('ws://localhost:1')

ws.addEventListener('error', ({ error, message }) => {
t.assert.strictEqual(error.message, 'Received network error or non-101 status code.')
t.assert.strictEqual(message, 'Received network error or non-101 status code.')
})

await once(ws, 'close')
})