mirror of
https://github.com/nodejs/node.git
synced 2026-10-28 10:15:07 +08:00
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>
54 lines
1.2 KiB
JavaScript
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());
|