Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using JWM/mock-socket in Jest with partysocket causes error: TypeError: ports is not iterable #390

Open
vaughnkoch opened this issue Jan 30, 2024 · 1 comment

Comments

@vaughnkoch
Copy link

Hi, I opened an issue in jest-websocket-mock; the maintainer said I should reopen the issue in mock-socket. See romgain/jest-websocket-mock#169 (comment).

Original issue text (slightly edited, and with added mock-socket version):


I'm trying to use jest-websocket-mock and mock-socket in conjunction with partysocket, which seems like the most updated browser WebSocket library right now: https://docs.partykit.io/reference/partysocket-api/.

When I run my tests and I use jest-websocket-mock / mock-socket to send a message, I get this error: this error: TypeError: ports is not iterable.

Here's what I do in my tests:

server.send({ type: 'system' })

Then, mock-socket creates the message from this function:

function createMessageEvent(config) {
  var type = config.type;
  var origin = config.origin;
  var data = config.data;
  var target = config.target;
  var messageEvent = new MessageEvent(type, {
    data: data,
    origin: origin
  });

  if (target) {
    messageEvent.target = target;
    messageEvent.srcElement = target;
    messageEvent.currentTarget = target;
  }

  return messageEvent;
}

Then partysocket clones the event with this code (it actually uses cloneEventNode because Jest is running in the node environment).

function cloneEventBrowser(e) {
  return new e.constructor(e.type, e);
}

function cloneEventNode(e) {
  if ("data" in e) {
    const evt2 = new MessageEvent(e.type, e);
    return evt2;
  }
  if ("code" in e || "reason" in e) {
    const evt2 = new CloseEvent(
      // @ts-expect-error we need to fix event/listener types
      e.code || 1999,
      // @ts-expect-error we need to fix event/listener types
      e.reason || "unknown reason",
      e
    );
    return evt2;
  }
  if ("error" in e) {
    const evt2 = new ErrorEvent(e.error, e);
    return evt2;
  }
  const evt = new Event(e.type, e);
  return evt;
}

The above code fails on this line:

const evt2 = new MessageEvent(e.type, e);

I looked at the e parameter and e.ports, is null which explains the error. This may be because of a different environment, but do you have any suggestions on how to fix this?

Note: I also tried to force the environment to Node (instead of the browser), but got this cryptic error:

TypeError: The "event" argument must be an instance of Event. Received an instance of Event

  at WebSocket._handleOpen (node_modules/partysocket/dist/index.js:444:10)
  at node_modules/mock-socket/dist/mock-socket.js:859:16
      at Array.forEach (<anonymous>)
  at WebSocket.dispatchEvent (node_modules/mock-socket/dist/mock-socket.js:855:13)
  at WebSocket.delayCallback (node_modules/mock-socket/dist/mock-socket.js:1522:16)
  at Timeout._onTimeout (node_modules/mock-socket/dist/mock-socket.js:757:58)

Versions:

 "partysocket": "0.0.25",
 "jest-websocket-mock": "2.4.0",
  mock-socket@9.2.1
@Atrue
Copy link
Collaborator

Atrue commented Feb 1, 2024

Hi, @vaughnkoch. According to the details, you are using 3 libraries and one of them has a conflict with the api. So right now it’s hard to say what’s the real reason of it.

Can you please create a minimal repo or share a snippet of how to reproduce it?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants