@m2k-5f/pgtx 2.6.0 → 2.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/batch.d.ts CHANGED
@@ -5,10 +5,11 @@ export declare class Batch {
5
5
  private _queryQueue;
6
6
  private _buffer;
7
7
  constructor(buffer: ConnectionRequestWriter);
8
- registerQuery(query: PostgresQuery, timeout: number): void;
8
+ registerParse(query: PostgresQuery): void;
9
+ registerQuery(query: PostgresQuery): void;
9
10
  end(): ConnectionRequestWriter;
10
11
  get current(): PostgresQuery;
11
12
  next(): void;
12
- reject(cause: PostgresError): void;
13
+ reject(cause: PostgresError): number;
13
14
  }
14
15
  //# sourceMappingURL=batch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAc,aAAa,EAAsB,MAAM,SAAS,CAAC;AAGxE,qBAAa,KAAK;IACd,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,OAAO,CAAyB;gBAE5B,MAAM,EAAE,uBAAuB;IAK3C,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM;IAgBnD,GAAG;IAIH,IAAI,OAAO,kBAEV;IAED,IAAI;IAIJ,MAAM,CAAC,KAAK,EAAE,aAAa;CAK9B"}
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC,qBAAa,KAAK;IACd,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,OAAO,CAAyB;gBAE5B,MAAM,EAAE,uBAAuB;IAM3C,aAAa,CAAC,KAAK,EAAE,aAAa;IAOlC,aAAa,CAAC,KAAK,EAAE,aAAa;IAQlC,GAAG;IAIH,IAAI,OAAO,kBAEV;IAED,IAAI;IAIJ,MAAM,CAAC,KAAK,EAAE,aAAa;CAS9B"}
package/dist/batch.js CHANGED
@@ -1,19 +1,16 @@
1
- import { ParseQuery } from "./query";
2
1
  import { Queue } from "./queue";
3
2
  export class Batch {
4
3
  constructor(buffer) {
5
4
  this._queryQueue = new Queue();
6
5
  this._buffer = buffer;
7
6
  }
8
- registerQuery(query, timeout) {
7
+ registerParse(query) {
8
+ this._buffer
9
+ .writeParse(query.statement, query.text)
10
+ .writeDescribe(query.statement);
11
+ }
12
+ registerQuery(query) {
9
13
  this._queryQueue.push(query);
10
- query.startTimeout(timeout);
11
- if (query instanceof ParseQuery) {
12
- this._buffer
13
- .writeParse(query.statement, query.text)
14
- .writeDescribe(query.statement);
15
- return;
16
- }
17
14
  this._buffer
18
15
  .writeBind("", query.statement, query.args)
19
16
  .writeExecute("");
@@ -28,8 +25,11 @@ export class Batch {
28
25
  this._queryQueue.next();
29
26
  }
30
27
  reject(cause) {
28
+ let counter = 0;
31
29
  while (this._queryQueue.hasMore) {
30
+ counter++;
32
31
  this._queryQueue.shift.reject(cause);
33
32
  }
33
+ return counter;
34
34
  }
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"abstract.clause.d.ts","sourceRoot":"","sources":["../../src/clauses/abstract.clause.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAsC,MAAM,UAAU,CAAC;AAEpF,8BAAsB,MAAM;IACxB,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;CAC5D"}
1
+ {"version":3,"file":"abstract.clause.d.ts","sourceRoot":"","sources":["../../src/clauses/abstract.clause.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD,8BAAsB,MAAM;IACxB,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;CAC5D"}
@@ -1,62 +1,23 @@
1
- import { Branded, ColumnDescription } from "./types";
1
+ import { ConnectionPartialConfig, Row } from "./types";
2
2
  import { Transaction } from "./transaction";
3
3
  import { Future } from 'fluent-future';
4
4
  import { PostgresError } from "./error";
5
- type LogLevel = "none" | "error" | "notice" | "query";
6
- export type ConnectionParams = {
7
- user: string;
8
- password?: string;
9
- host: string;
10
- port: number;
11
- database: string;
12
- logLevel?: LogLevel;
13
- int8toBigint?: boolean;
14
- queryTimeout?: number;
15
- batchCapacity?: number;
16
- flushShedule?: "nextTick" | "Immediate";
17
- };
18
- export type StatementName = Branded<string, 'StatementName'>;
19
- export type QueryText = Branded<string, 'QueryText'>;
20
- export type ChannelName = Branded<string, "ChannelName">;
21
- export type QueryMeta = {
22
- statement: StatementName;
23
- columns: ColumnDescription[];
24
- };
25
5
  /**
26
- * Represents a single dedicated connection to the PostgreSQL database.
27
- *
28
- * Supports:
29
- * - Tagged template queries with automatic parameter binding
30
- * - Prepared statements with caching
31
- * - Transaction management with savepoints
32
- * - Pipeline execution for concurrent queries
6
+ * A dedicated connection to PostgreSQL: tagged-template queries, prepared
7
+ * statement caching, transactions with savepoints, and pipelined execution.
33
8
  *
34
9
  * @example
35
- * ```ts
36
- * const conn = await Connection.new({
37
- * host: 'localhost',
38
- * user: 'postgres',
39
- * password: 'postgres',
40
- * database: 'test'
41
- * })
42
- *
43
- * // Simple query
10
+ * const conn = await Connection.new({ host: 'localhost', user: 'postgres', password: 'postgres', database: 'test' })
44
11
  * const users = await conn.query`SELECT * FROM users WHERE id = ${1}`
45
- *
46
- * // Transaction
47
- * await conn.begin(async tx => {
48
- * await tx.query`INSERT INTO users ...`
49
- * })
50
- *
51
- * // Close connection
12
+ * await conn.begin(async tx => tx.query`INSERT INTO users ...`)
52
13
  * conn.close()
53
- * ```
54
14
  */
55
15
  export declare class Connection {
56
- private readonly params;
16
+ private readonly config;
57
17
  private _activeBatch;
58
- private _isOpened;
59
- private _isReconnecting;
18
+ private _closing;
19
+ private _closed;
20
+ private _reconnecting;
60
21
  private _cachedBuffer;
61
22
  private _socket;
62
23
  private _batchQueue;
@@ -64,163 +25,69 @@ export declare class Connection {
64
25
  private _parsing;
65
26
  private _listeningCallbacks;
66
27
  private _stmtCounter;
67
- private _logLevel;
68
28
  private _nextStatement;
69
29
  private constructor();
70
30
  /**
71
- * Creates a new database connection.
72
- *
73
- * @param params - Connection parameters
74
- * @returns A new Connection instance
75
- * @throws {PostgresError} If authentication fails or connection cannot be established
76
- *
77
- * @example
78
- * ```ts
79
- * const conn = await Connection.new({
80
- * host: 'localhost',
81
- * port: 5432,
82
- * user: 'postgres',
83
- * password: 'secret',
84
- * database: 'myapp'
85
- * })
86
- * ```
31
+ * Opens a new connection and authenticates.
32
+ * @throws {PostgresError} if authentication fails or the connection can't be established
87
33
  */
88
- static new(params: ConnectionParams): Future<Connection, PostgresError>;
34
+ static new(config: ConnectionPartialConfig): Future<Connection, PostgresError>;
89
35
  private _registerBatch;
90
36
  private _sync;
91
37
  /**
92
- * Executes a query using tagged template literals.
93
- *
94
- * Parameters are automatically bound to `$1, $2, ...` placeholders.
95
- * Queries with parameters use prepared statements for performance.
96
- *
97
- * @param templates - Tagged template string with SQL
98
- * @param args - Query parameters
99
- * @returns Array of rows with proper typing
100
- * @throws {Error} If connection is dead or query fails
38
+ * Runs a query, binding template values as `$1, $2, ...`.
39
+ * Parameterized queries are cached as prepared statements.
101
40
  *
102
41
  * @example
103
- * ```ts
104
- * // Simple query
105
- * const users = await conn.query`SELECT * FROM users`
106
- *
107
- * // With parameters
108
- * const user = await conn.query`SELECT * FROM users WHERE id = ${1}`
109
- *
110
- * // With typed result
111
- * type User = { id: number, name: string }
112
- * const users = await conn.query<User>`SELECT * FROM users`
113
- * ```
42
+ * const users = await conn.query<User>`SELECT * FROM users WHERE id = ${1}`
114
43
  */
115
- query<T extends Record<string, any>>(templates: TemplateStringsArray, ...params: any[]): Future<T[], PostgresError>;
44
+ query<T extends Row>(templates: TemplateStringsArray, ...params: any[]): Future<T[], PostgresError>;
45
+ private _performQuery;
116
46
  /**
117
- * Starts a managed transaction on this connection.
118
- *
119
- * Automatically handles:
120
- * - `BEGIN` before the callback
121
- * - `COMMIT` on successful completion
122
- * - `ROLLBACK` if an error is thrown
123
- *
124
- * @param txCallback - Async function that receives a `Transaction` instance
125
- * @returns The value returned from the callback
126
- * @throws {Error} If connection is dead or transaction fails
47
+ * Like {@link query}, but for statements that don't return rows (INSERT/UPDATE/DDL/etc).
127
48
  *
128
49
  * @example
129
- * ```ts
130
- * const result = await conn.begin(async tx => {
131
- * await tx.query`INSERT INTO accounts (id, balance) VALUES (1, 100)`
132
- * await tx.query`UPDATE accounts SET balance = balance - 10 WHERE id = 1`
133
- * return { success: true }
134
- * })
135
- * ```
50
+ * await conn.execute`UPDATE users SET name = ${name} WHERE id = ${id}`
136
51
  */
137
- begin<T>(txCallback: (transaction: Transaction) => Promise<T>): Future<T, unknown>;
52
+ execute(templates: TemplateStringsArray, ...params: any[]): Future<void, PostgresError>;
53
+ private _performExecute;
138
54
  /**
139
- * Sends an asynchronous notification to a channel via `pg_notify`.
140
- *
141
- * @param channelName - The channel identifier
142
- * @param payload - Optional string data (max 8000 bytes)
55
+ * Runs `txCallback` inside `BEGIN`/`COMMIT`, rolling back on error.
143
56
  *
144
57
  * @example
145
- * ```ts
146
- * await conn.notify('events', 'hello')
147
- * ```
148
- */
149
- notify(channelName: string, payload?: string): Future<Record<string, any>[], PostgresError>;
150
- /**
151
- * Subscribes a callback to a channel. Sends `LISTEN` on the first subscription.
152
- *
153
- * @param channelName - The channel identifier
154
- * @param callback - Function invoked when a notification arrives
155
- *
156
- * @example
157
- * ```ts
158
- * await conn.listen('events', data => console.log(data))
159
- * ```
58
+ * await conn.begin(async tx => {
59
+ * await tx.query`UPDATE accounts SET balance = balance - 10 WHERE id = 1`
60
+ * })
160
61
  */
62
+ begin<T>(txCallback: (transaction: Transaction) => Promise<T>): Future<T, unknown>;
63
+ /** Sends a `pg_notify` message on `channelName` (payload ≤ 8000 bytes). */
64
+ notify(channelName: string, payload?: string): Future<void, PostgresError>;
65
+ /** Subscribes `callback` to `channelName`, issuing `LISTEN` on first subscription. */
161
66
  listen(channelName: string, callback: (payload: string) => void): Future<void, PostgresError>;
162
- /**
163
- * Unsubscribes a callback. Sends `UNLISTEN` if no callbacks remain for the channel.
164
- *
165
- * @param channelName - The channel identifier
166
- * @param callback - The registered callback to remove
167
- *
168
- * @example
169
- * ```ts
170
- * await conn.unlisten('events', callback)
171
- * ```
172
- */
67
+ /** Unsubscribes `callback`, issuing `UNLISTEN` once no callbacks remain. */
173
68
  unlisten(channelName: string, callback: (payload: string) => void): Future<void, PostgresError>;
174
69
  /**
175
- * Executes an SQL query in streaming mode.
176
- *
177
- * Data is streamed directly from the PostgreSQL binary network buffer into the Web Streams API
178
- * (`ReadableStream`), bypassing any intermediate array allocation or row accumulation in the JS heap.
179
- * This pattern provides a true Zero-Memory Footprint and is ideal for exporting massive tables
180
- * or piping database payloads directly into HTTP responses (e.g., via `Bun.serve` or fetch `Response`).
181
- *
182
- * @template T The expected shape of a single row interface.
183
- * @param {TemplateStringsArray} templates The SQL string parts from the tagged template literal.
184
- * @param {...any} args The parameterized query arguments.
185
- * @returns {ReadableStream<T>} Synchronously returns a native Web ReadableStream instance.
186
- *
187
- * @example
188
- * // Streaming a giant table directly to an HTTP response (Bun.serve)
189
- * const userStream = conn.stream<User>`SELECT id, name FROM users`;
190
- * return new Response(userStream, { headers: { 'Content-Type': 'application/json' } });
70
+ * Streams query results as a `ReadableStream`, without buffering rows in memory.
71
+ * Ideal for large result sets or piping straight into an HTTP response.
191
72
  *
192
73
  * @example
193
- * // Asynchronously iterating over rows as they arrive from the wire socket
194
- * const stream = conn.stream<User>`SELECT * FROM orders WHERE status = ${'processed'}`;
195
- * for await (const row of stream) {
196
- * console.log(row.id, row.amount); // Row object is eligible for GC immediately after iteration
197
- * }
74
+ * for await (const row of conn.stream<User>`SELECT * FROM orders`) { ... }
198
75
  */
199
- stream<T extends Record<string, any>>(templates: TemplateStringsArray, ...params: any[]): ReadableStream<T>;
200
- private _streamWithController;
201
- private _registerReconnect;
202
- private _resetConnectionState;
76
+ stream<T extends Row>(templates: TemplateStringsArray, ...params: any[]): ReadableStream<T>;
77
+ private _performStream;
203
78
  private _reconnect;
79
+ private _performReconnect;
204
80
  private _restoreSubscriptions;
205
81
  private _getCurrentQuery;
206
- private _rejectAllBatches;
207
82
  private _handlePacket;
208
- /**
209
- * Checks if the connection is still alive and usable.
210
- * Returns `false` if the socket is destroyed or connection is dead.
211
- */
83
+ private get _hasQueries();
84
+ /** Whether the connection is alive and usable. */
212
85
  get isOpened(): boolean;
86
+ /** Whether the connection is closed or closing. */
87
+ get isClosed(): boolean;
213
88
  /**
214
- * Closes the connection immediately.
215
- * All pending queries will be rejected with an error.
216
- * The connection cannot be used after this call.
217
- *
218
- * @example
219
- * ```ts
220
- * conn.close()
221
- * ```
89
+ * Closes the connection, awaiting for all pending queries. Not usable afterward.
222
90
  */
223
- close(): void;
91
+ close(): Future<void, PostgresError>;
224
92
  }
225
- export {};
226
93
  //# sourceMappingURL=connection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiC,uBAAuB,EAAmC,GAAG,EAAiB,MAAM,SAAS,CAAA;AACrI,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAK3C,OAAO,EAAS,MAAM,EAAM,MAAM,eAAe,CAAA;AACjD,OAAO,EAAkD,aAAa,EAAE,MAAM,SAAS,CAAA;AAavF;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAsD;IACtE,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,aAAa,CAA2C;IAChE,OAAO,CAAC,aAAa,CAAgC;IAErD,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,WAAW,CAA4B;IAE/C,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,QAAQ,CAAsC;IAEtD,OAAO,CAAC,mBAAmB,CAAyD;IACpF,OAAO,CAAC,YAAY,CAAI;IAGxB,OAAO,CAAC,cAAc;IAKtB,OAAO;IAYP;;;OAGG;IACH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,uBAAuB;IAe1C,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,KAAK;IASb;;;;;;OAMG;IACH,KAAK,CAAC,CAAC,SAAS,GAAG,EAAE,SAAS,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE;IAStE,OAAO,CAAC,aAAa;IA4CrB;;;;;OAKG;IACH,OAAO,CAAC,SAAS,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE;IASzD,OAAO,CAAC,eAAe;IAsCvB;;;;;;;OAOG;IACH,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC;IAoB7D,2EAA2E;IAC3E,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW;IAOhD,sFAAsF;IACtF,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAe/D,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;IAoB/F;;;;;;OAMG;IACH,MAAM,CAAC,CAAC,SAAS,GAAG,EAAE,SAAS,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE;IAyBvE,OAAO,CAAC,cAAc;IA2CtB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IA2HrB,OAAO,KAAK,WAAW,GAEtB;IAGD,kDAAkD;IAClD,IAAI,QAAQ,YAEX;IAGD,mDAAmD;IACnD,IAAI,QAAQ,YAEX;IAGD;;OAEG;IACH,KAAK;CAwBR"}