Skip to content

create-websocket-stream.test.js fails if the domain module is loaded #2124

@mvduin

Description

@mvduin

Is there an existing issue for this?

  • I've searched for any related issues and avoided creating a duplicate issue.

Description

If the domain module is loaded whentest/create-websocket-stream.test.js executes, it has some bizarre failures (see below). Other tests do not have this porblem.

I ran into this problem because I have NODE_OPTIONS="-r /home/matthijs/.node_defaults.js" in my environment to load a script that tweaks some REPL behaviour, for which I have to require repl which then requires domain.

While an argument could be made that it's impolite to have an environment that causes domain to be loaded into every node script, it's concerning for it to be causing test failures since that may imply actual bugs when ws is used in an environment that has domain loaded (e.g. whenever you're testing something from the REPL).

ws version

8.12.1

Node.js Version

14.21.3, 16.19.1, 18.14.2

System

No response

Expected result

No response

Actual result

No response

Attachments

Test output:

  createWebSocketStream
    ✓ is exposed as a property of the `WebSocket` class
    ✓ returns a `Duplex` stream
    ✓ passes the options object to the `Duplex` constructor
    The returned stream
      ✓ buffers writes if `readyState` is `CONNECTING`
      ✓ errors if a write occurs when `readyState` is `CLOSING`
      ✓ errors if a write occurs when `readyState` is `CLOSED`
      ✓ does not error if `_final()` is called while connecting
      ✓ makes `_final()` a noop if no socket is assigned
      ✓ reemits errors
      ✓ does not swallow errors that may occur while destroying
      1) does not suppress the throwing behavior of 'error' events
      2) is destroyed after 'end' and 'finish' are emitted (1/2)
      3) is destroyed after 'end' and 'finish' are emitted (1/2)
      ✓ is destroyed after 'end' and 'finish' are emitted (2/2)
      ✓ handles backpressure (1/3)
      ✓ handles backpressure (2/3)
      ✓ handles backpressure (3/3)
      ✓ can be destroyed (1/2)
      ✓ can be destroyed (2/2)
      ✓ converts text messages to strings in readable object mode
      ✓ resumes the socket if `readyState` is `CLOSING`


  18 passing (119ms)
  3 failing

  1) createWebSocketStream
       The returned stream
         does not suppress the throwing behavior of 'error' events:

      AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:

2 !== 1

      + expected - actual

      -2
      +1
      
      at Context.<anonymous> (test/create-websocket-stream.test.js:298:14)
      at process.processImmediate (node:internal/timers:476:21)

  2) createWebSocketStream
       The returned stream
         is destroyed after 'end' and 'finish' are emitted (1/2):
     Uncaught RangeError: Invalid WebSocket frame: invalid opcode 5
      at Receiver.getInfo (lib/receiver.js:287:14)
      at Receiver.startLoop (lib/receiver.js:146:22)
      at Receiver._write (lib/receiver.js:84:10)
      at writeOrBuffer (node:internal/streams/writable:392:12)
      at _write (node:internal/streams/writable:333:10)
      at Writable.write (node:internal/streams/writable:337:10)
      at Socket.socketOnData (lib/websocket.js:1274:35)
      at Socket.emit (node:events:513:28)
      at Socket.emit (node:domain:489:12)
      at Readable.read (node:internal/streams/readable:539:10)
      at Socket.read (node:net:749:39)
      at flow (node:internal/streams/readable:1023:34)
      at emitReadable_ (node:internal/streams/readable:604:3)
      at process.processTicksAndRejections (node:internal/process/task_queues:81:21)

  3) createWebSocketStream
       The returned stream
         is destroyed after 'end' and 'finish' are emitted (1/2):
     Error: done() called multiple times in test <createWebSocketStream The returned stream is destroyed after 'end' and 'finish' are emitted (1/2)> of file /home/matthijs/dd/js/ws.tmp/test/create-websocket-stream.test.js
      at Object.onceWrapper (node:events:627:28)
      at WebSocketServer.emit (node:events:513:28)
      at WebSocketServer.emit (node:domain:489:12)
      at emitClose (lib/websocket-server.js:465:10)
      at Server.<anonymous> (lib/websocket-server.js:197:9)
      at Object.onceWrapper (node:events:627:28)
      at Server.emit (node:events:513:28)
      at Server.emit (node:domain:489:12)
      at emitCloseNT (node:net:2135:8)
      at process.processTicksAndRejections (node:internal/process/task_queues:81:21)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions