Skip to content

socket connect event is not emitted when sending multiple requests concurrently with a http agent keepAlive: true #2259

@mizozobu

Description

@mizozobu

Prerequisites

Environment check

  • I'm using the latest msw version
  • I'm using Node.js version 18 or higher

Node.js version

v22.7.0

Reproduction repository

https://github.com/mizozobu/msw-socket-mre

Snapshot of the repo for future reference. (I'll delete it once this issue gets resolved).
import http from 'node:http';
import { http as mswHttp, HttpResponse } from 'msw';
import { setupServer } from 'msw/node';

const handlers = [
    mswHttp.get('http://exmaple.com/*', async({ request }) => {
        console.log('received', request.url);
        return HttpResponse.json({});
    }),
];

const server = setupServer(...handlers);
server.listen();

const agent = new http.Agent({
    keepAlive: true,
});

const sockets = new Set();
const sendRequest = async(id) => {
    console.log(`create request for id=${id}`);

    const res = await new Promise(resolve => {
        const req = http.request(`http://exmaple.com/${id}`, { agent },  (res) => {
            resolve(res.body);
        });
        req.on('error', (e) => {
            console.error(`problem with request: ${e.message}`);
        });
        req.once('socket', (socket) => {
            sockets.add(socket);
            console.log(sockets.size, 'unique sockets used');
            
            if (socket.connecting) {
                socket.once('connect', () => {
                    console.log(`socket for id=${id} connected`);
                    req.end();
                });
            }
            else {
                req.end();
            }
        });
    });
    return res;
}

const list = await Promise.all([
    sendRequest('1'),
    sendRequest('2'),
    sendRequest('3'),
]);

console.log(list);

Reproduction steps

  1. npm i
  2. node index.mjs

Current behavior

3 sockets are created, but only 1 socket emits connect event.

I encountered this when I was using msw with stripe. Some reproduction code was taken from the repo.

Expected behavior

All sockets emit connect event.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingscope:nodeRelated to MSW running in Node

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions