Cody Greene 5703791640
fix: double client.end() hang (#2717)
* fix: double client.end() hang

fixes https://github.com/brianc/node-postgres/issues/2716

`client.end()` will resolve early if the connection is already dead,
rather than waiting for an "end" event that will never arrive.

* fix: client.end() resolves when socket is fully closed
2023-03-06 12:10:07 -06:00

39 lines
1.3 KiB
JavaScript

'use strict'
const helper = require('../test-helper')
const suite = new helper.Suite()
// https://github.com/brianc/node-postgres/issues/2716
suite.testAsync('client.end() should resolve if already ended', async () => {
const client = new helper.pg.Client()
await client.connect()
// this should resolve only when the underlying socket is fully closed, both
// the readable part ("end" event) & writable part ("close" event).
// https://nodejs.org/docs/latest-v16.x/api/net.html#event-end
// > Emitted when the other end of the socket signals the end of
// > transmission, thus ending the readable side of the socket.
// https://nodejs.org/docs/latest-v16.x/api/net.html#event-close_1
// > Emitted once the socket is fully closed.
// here: stream = socket
await client.end()
// connection.end()
// stream.end()
// ...
// stream emits "end"
// not listening to this event anymore so the promise doesn't resolve yet
// stream emits "close"; no more events will be emitted from the stream
// connection emits "end"
// promise resolved
// This should now resolve immediately, rather than wait for connection.on('end')
await client.end()
// this should resolve immediately, rather than waiting forever
await client.end()
})