@ 261107.5
current
'use strict'

const assert = require('node:assert')
const diagnosticsChannel = require('node:diagnostics_channel')
const { once } = require('node:events')
const { createServer } = require('node:http')
const { test } = require('node:test')

const { Agent, Pool, fetch } = require('..')

// https://github.com/nodejs/undici/issues/5845
test('aborting a streaming response does not reconnect for the aborted request', async (t) => {
  const sockets = new Set()
  const server = createServer((req, res) => {
    req.resume()
    req.on('end', () => {
      res.writeHead(200, { 'content-type': 'text/event-stream' })
      res.write('event: ping\ndata: {}\n\n')
    })
  })
  server.on('connection', (socket) => {
    sockets.add(socket)
    socket.on('close', () => sockets.delete(socket))
  })

  server.listen(0, '127.0.0.1')
  await once(server, 'listening')

  let pool
  const dispatcher = new Agent({
    keepAliveTimeout: 1000,
    factory (origin, options) {
      pool = new Pool(origin, options)
      return pool
    }
  })

  const port = String(server.address().port)
  const beforeConnect = diagnosticsChannel.channel('undici:client:beforeConnect')
  let connections = 0
  const onBeforeConnect = ({ connectParams }) => {
    if (connectParams.hostname === '127.0.0.1' && connectParams.port === port) {
      connections++
    }
  }
  beforeConnect.subscribe(onBeforeConnect)

  t.after(async () => {
    beforeConnect.unsubscribe(onBeforeConnect)
    await dispatcher.close()
    for (const socket of sockets) {
      socket.destroy()
    }
    await new Promise((resolve, reject) => {
      server.close((error) => error ? reject(error) : resolve())
    })
  })

  const controller = new AbortController()
  const response = await fetch(`http://127.0.0.1:${port}/`, {
    method: 'POST',
    body: '{}',
    signal: controller.signal,
    dispatcher
  })
  const reader = response.body.getReader()
  await reader.read()

  const disconnected = once(pool, 'disconnect')
  controller.abort()
  await disconnected

  assert.strictEqual(connections, 1)
})