Skip to main content

Copy Streams

Two Node.js stream classes returned by Connection.copyTo() and Connection.copyFrom(). Neither is constructed directly by user code.

CopyToStream​

A COPY ... TO STDOUT in progress, as a Readable of the raw bytes the server sends — text, CSV or binary, whichever the statement's FORMAT asked for. Nothing is decoded; the payload is forwarded exactly as it arrived.

Extends: stream.Readable

The stream must be consumed or destroyed: until the copy finishes the connection is still mid-statement, and an unread stream pauses the socket rather than buffering the whole export in memory.

Properties​

KeyTypeReadonlyDescription
overallFormatDataFormatfalseFormat of the copy as a whole, from the server's CopyOutResponse
columnFormatsDataFormat[]falsePer-column formats, from the server's CopyOutResponse
rowCountnumberfalseRows the server reported for the copy. Set before 'end' is emitted

Methods​

waitStarted()​

Resolves once the server has accepted the copy (i.e. sent CopyOutResponse); rejects if it never starts one.

waitStarted(): Promise<void>

import { Connection } from 'postgrejs';
import { pipeline } from 'node:stream/promises';
import fs from 'node:fs';

const connection = new Connection('postgres://localhost');
await connection.connect();
const out = await connection.copyTo('COPY users TO STDOUT (FORMAT csv)');
await pipeline(out, fs.createWriteStream('users.csv'));
console.log(out.rowCount);
await connection.close();

CopyFromStream​

A COPY ... FROM STDIN in progress, as a Writable. Whatever is written is forwarded as CopyData without being copied or reinterpreted, so the caller's data must already match the statement's FORMAT.

Extends: stream.Writable

'finish' means the server accepted the whole copy — the stream waits for CommandComplete rather than for the last byte to leave, so rowCount is set by the time a pipeline() over it resolves. Destroying the stream (which pipeline() does when the source fails) sends CopyFail, so the connection stays usable instead of stuck waiting for data.

Properties​

KeyTypeReadonlyDescription
rowCountnumberfalseRows the server accepted. Set before 'finish' is emitted

Methods​

waitStarted()​

Resolves once the server is ready for data (i.e. sent CopyInResponse); rejects if it never asks for any.

waitStarted(): Promise<void>

import { Connection } from 'postgrejs';
import { pipeline } from 'node:stream/promises';
import fs from 'node:fs';

const connection = new Connection('postgres://localhost');
await connection.connect();
const inp = await connection.copyFrom('COPY users FROM STDIN (FORMAT csv)');
await pipeline(fs.createReadStream('users.csv'), inp);
console.log(inp.rowCount);
await connection.close();