Files
node/test/parallel/test-net-allow-half-open-async-iter-destroy.js
Matteo Collina 795585e87e stream: destroy half-open sockets after iteration
Async iteration left the writable side of `allowHalfOpen` duplexes open
after clean EOF. For `net.Socket` instances, this retained a live handle
after the peer disconnected.

Restore default iterator destruction. Callers that need to continue
writing can use `iterator({ destroyOnReturn: false })`.

Assisted-by: Codex
Signed-off-by: Matteo Collina <hello@matteocollina.com>
PR-URL: https://github.com/nodejs/node/pull/65986
Fixes: https://github.com/nodejs/node/issues/65110
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
2026-09-18 05:37:18 +00:00

54 lines
1.2 KiB
JavaScript

'use strict';
const common = require('../common');
const assert = require('assert');
const net = require('net');
(async function() {
let resolveServerSocket;
const serverSocketPromise = new Promise((resolve) => {
resolveServerSocket = resolve;
});
const server = net.createServer({
allowHalfOpen: true,
}, common.mustCall((socket) => {
resolveServerSocket(socket);
}));
server.on('error', common.mustNotCall());
server.on('close', common.mustCall());
await new Promise((resolve) => {
server.listen(0, common.localhostIPv4, resolve);
});
const clientSocket = net.createConnection({
port: server.address().port,
host: server.address().address,
});
clientSocket.on('error', common.mustNotCall());
await new Promise((resolve) => {
clientSocket.end('data', resolve);
});
const serverSocket = await serverSocketPromise;
let serverRead = '';
for await (const chunk of serverSocket) {
serverRead += chunk;
}
const destroyed = serverSocket.destroyed;
serverSocket.destroy();
clientSocket.destroy();
await new Promise((resolve) => {
server.close(resolve);
});
assert.strictEqual(serverRead, 'data');
assert.strictEqual(destroyed, true);
})().then(common.mustCall());