'use strict';
const common = require('../common');
const assert = require('assert');
const net = require('net');
const { once } = require('events');
(async () => {
// `for await...of` yields each incoming connection as a net.Socket.
{
const server = net.createServer().listen(0);
await once(server, 'listening');
const { port } = server.address();
const total = 3;
const clients = [];
for (let i = 0; i < total; i++) {
clients.push(net.connect(port));
}
let count = 0;
for await (const socket of server) {
assert.ok(socket instanceof net.Socket);
socket.end();
if (++count === total) break;
}
assert.strictEqual(count, total);
// Breaking out of the loop stops iterating but does not close the server.
assert.strictEqual(server.listening, true);
server.close();
for (const client of clients) {
client.destroy();
}
}
// Iteration ends cleanly when the server closes.
{
const server = net.createServer().listen(0);
await once(server, 'listening');
process.nextTick(() => server.close());
let count = 0;
for await (const socket of server) {
count++;
socket.end();
}
assert.strictEqual(count, 0);
}
})().then(common.mustCall());