diff --git a/packages/pg-query-stream/src/index.ts b/packages/pg-query-stream/src/index.ts index c942b0441..8eb275b41 100644 --- a/packages/pg-query-stream/src/index.ts +++ b/packages/pg-query-stream/src/index.ts @@ -45,7 +45,8 @@ class QueryStream extends Readable implements Submittable { } public _destroy(_err: Error, cb: Function) { - this.cursor.close((err?: Error) => { + this.cursor.close(async (err?: Error) => { + if(process.env.WAIT_AFTER_CLOSE === '2') await new Promise(resolve => setTimeout(resolve, 100)); cb(err || _err) }) } diff --git a/packages/pg-query-stream/test/close.ts b/packages/pg-query-stream/test/close.ts index 97e4627d9..8a81a7c71 100644 --- a/packages/pg-query-stream/test/close.ts +++ b/packages/pg-query-stream/test/close.ts @@ -1,5 +1,6 @@ import assert from 'assert' import concat from 'concat-stream' +import pg from 'pg' import QueryStream from '../src' import helper from './helper' @@ -90,4 +91,33 @@ if (process.version.startsWith('v8.')) { stream.on('close', done) }) }) + + describe('use after error', () => { + it.only('should work if used after error', async () => { + const pool = new pg.Pool({ max: 1, connectionTimeoutMillis: 400, statement_timeout: 400 }); + + const res1 = await pool.query('SELECT TRUE'); + assert.deepStrictEqual(res1.rows, [ { bool:true } ]); + + const query = new QueryStream('SELECT TRUE'); + const client = await pool.connect(); + const stream = await client.query(query); + + await assert.rejects(() => pool.query('SELECT TRUE'), { message: 'timeout exceeded when trying to connect' }); + + await stream.destroy(); + if(process.env.WAIT_AFTER_CLOSE === '1') await new Promise(resolve => setTimeout(resolve, 100)); + + if(process.env.WAIT_AFTER_CLOSE === '2') { + await new Promise(resolve => stream.once('close', resolve)); + } + + await client.release(); + + const res2 = await pool.query('SELECT TRUE'); + assert.deepStrictEqual(res2.rows, [ { bool:true } ]); + + await pool.end(); + }) + }) }