@m2k-5f/pgtx 2.1.0 → 2.3.0
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/README.md +66 -13
- package/dist/clauses/abstract.clause.js +1 -5
- package/dist/clauses/array.clause.js +3 -7
- package/dist/clauses/empty.clause.js +3 -7
- package/dist/clauses/exclude.clause.js +2 -6
- package/dist/clauses/fragment.clause.js +4 -8
- package/dist/clauses/iden.caluse.js +2 -6
- package/dist/clauses/index.js +9 -25
- package/dist/clauses/insert.clause.js +2 -6
- package/dist/clauses/literal.clause.js +2 -6
- package/dist/clauses/update.clause.js +2 -6
- package/dist/clauses/where.clause.js +2 -6
- package/dist/connection.d.ts +56 -10
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +220 -117
- package/dist/error.d.ts +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +2 -6
- package/dist/index.js +24 -37
- package/dist/pool.d.ts +20 -6
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +40 -41
- package/dist/protocol/connection-request-writer.js +13 -18
- package/dist/protocol/connection-response-reader.d.ts +5 -0
- package/dist/protocol/connection-response-reader.d.ts.map +1 -1
- package/dist/protocol/connection-response-reader.js +11 -9
- package/dist/protocol/constants.d.ts +1 -0
- package/dist/protocol/constants.d.ts.map +1 -1
- package/dist/protocol/constants.js +6 -8
- package/dist/protocol/socket-authorization.d.ts +5 -1
- package/dist/protocol/socket-authorization.d.ts.map +1 -1
- package/dist/protocol/socket-authorization.js +38 -34
- package/dist/protocol/socket-connector.d.ts.map +1 -1
- package/dist/protocol/socket-connector.js +4 -7
- package/dist/query.js +2 -6
- package/dist/queue.js +1 -5
- package/dist/security/md5.js +4 -8
- package/dist/security/sasl.js +7 -11
- package/dist/transaction.d.ts +7 -5
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +18 -26
- package/dist/types.js +0 -2
- package/dist/utils/template-compiler.js +3 -6
- package/dist/utils/value-parser.js +2 -7
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -97,6 +97,25 @@ await pool.begin(async (tx) => {
|
|
|
97
97
|
|
|
98
98
|
---
|
|
99
99
|
|
|
100
|
+
|
|
101
|
+
## 🎯 Typed Error Handling
|
|
102
|
+
|
|
103
|
+
Pgtx queries return `Future<T, PostgresError>` from [fluent-future](https://www.npmjs.com/package/fluent-future) instead of raw `Promise<T>`. This gives you:
|
|
104
|
+
|
|
105
|
+
- **Typed errors** — `PostgresError` with `code`, `severity`, `detail`
|
|
106
|
+
- **Declarative recovery** — `.recover()`, `.recoverIf()` instead of try/catch
|
|
107
|
+
- **Chain composition** — `.andThen()`, `.orElse()`, `.tap()`, `.tapErr()`
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
const users = await pool.query<User>`SELECT * FROM users WHERE id = ${1}`
|
|
111
|
+
.recoverIf(err => err.code === '42P01', []) // undefined_table → []
|
|
112
|
+
.recoverIf(err => err.code === '23505', []) // unique_violation → []
|
|
113
|
+
.tapErr(err => logger.error(err)) // log remaining errors
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
|
|
100
119
|
## 📖 Features
|
|
101
120
|
|
|
102
121
|
### Transactions & Savepoints
|
|
@@ -105,14 +124,44 @@ await pool.begin(async (tx) => {
|
|
|
105
124
|
await pool.begin(async (tx) => {
|
|
106
125
|
await tx.query`INSERT INTO orders (user_id) VALUES (${userId})`
|
|
107
126
|
|
|
108
|
-
|
|
109
|
-
const err = await tx.savepoint('update_stock', async (stx) => {
|
|
127
|
+
await tx.savepoint('update_stock', async (stx) => {
|
|
110
128
|
await stx.query`UPDATE stock SET count = count - 1 WHERE product_id = ${productId}`
|
|
111
|
-
if (outOfStock) throw new Error() // Only savepoint rolls back
|
|
129
|
+
if (outOfStock) throw new Error('out of stock') // Only savepoint rolls back
|
|
112
130
|
})
|
|
131
|
+
.tapErr(console.log) // Error: out of stock
|
|
113
132
|
})
|
|
114
133
|
```
|
|
115
134
|
|
|
135
|
+
|
|
136
|
+
### Async Notifications (LISTEN / NOTIFY)
|
|
137
|
+
|
|
138
|
+
Pgtx natively handles PostgreSQL `LISTEN/NOTIFY` protocol messages asynchronously without interrupting multiplexed query pipeline.
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
// 1. Sending a notification
|
|
142
|
+
await pool.notify('user_events', JSON.stringify({ id: 42, action: 'signup' }))
|
|
143
|
+
|
|
144
|
+
// 2. Receiving notifications (Requires a dedicated connection from the pool)
|
|
145
|
+
const conn = await pool.acquire()
|
|
146
|
+
|
|
147
|
+
const onEvent = (payload: string) => {
|
|
148
|
+
console.log(`Received payload: ${payload}`)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Multiplexes multiple callbacks onto a single LISTEN command seamlessly
|
|
152
|
+
await conn.listen('user_events', onEvent)
|
|
153
|
+
await conn.listen('user_events', (data) => logToFile(data))
|
|
154
|
+
|
|
155
|
+
// Clean up callbacks (Sends UNLISTEN only when the channel has zero callbacks left)
|
|
156
|
+
await conn.unlisten('user_events', onEvent)
|
|
157
|
+
|
|
158
|
+
// Keep the connection active as long as you need notifications!
|
|
159
|
+
// Do NOT release it back to the pool prematurely.
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
> ⚠️ **Architecture Note:** While `notify` is atomic and can be triggered directly from the `Pool` on any random socket, `listen` and `unlisten` are stateful commands tied to a specific PostgreSQL backend process. Therefore, subscription methods are **strictly available only on explicit `Connection` instances** fetched via `pool.acquire()`.
|
|
163
|
+
|
|
164
|
+
|
|
116
165
|
### Bulk Inserts
|
|
117
166
|
|
|
118
167
|
```typescript
|
|
@@ -250,8 +299,11 @@ await pool.query`
|
|
|
250
299
|
class Connection {
|
|
251
300
|
static new(params: ConnectionParams): Promise<Connection>
|
|
252
301
|
|
|
253
|
-
query<T>(strings: TemplateStringsArray, ...values: any[]): Promise<T[]>
|
|
254
|
-
begin<T>(callback: (tx: Transaction) => Promise<T>):
|
|
302
|
+
query<T>(strings: TemplateStringsArray, ...values: any[]): Promise<T[], PostgresError>
|
|
303
|
+
begin<T>(callback: (tx: Transaction) => Promise<T>): Future<T, Error>
|
|
304
|
+
notify(channelName: string, payload?: string): Future<[], PostgresError>
|
|
305
|
+
listen(channelName: string, callback: (payload: string) => void): Future<[], PostgresError>
|
|
306
|
+
unlisten(channelName: string, callback: (payload: string) => void): Future<[], PostgresError>
|
|
255
307
|
|
|
256
308
|
get isAlive(): boolean
|
|
257
309
|
close(): void
|
|
@@ -273,11 +325,12 @@ interface ConnectionParams {
|
|
|
273
325
|
class Pool {
|
|
274
326
|
constructor(config: PoolConfig)
|
|
275
327
|
|
|
276
|
-
query<T>(strings: TemplateStringsArray, ...values: any[]):
|
|
277
|
-
begin<T>(callback: (tx: Transaction) => Promise<T>):
|
|
278
|
-
|
|
328
|
+
query<T>(strings: TemplateStringsArray, ...values: any[]): Future<T[], Error>
|
|
329
|
+
begin<T>(callback: (tx: Transaction) => Promise<T>): Future<T, Error>
|
|
330
|
+
notify(channelName: string, payload?: string): Future<[], PostgresError>
|
|
331
|
+
acquire(): Future<Connection, Error>
|
|
279
332
|
release(conn: Connection): void
|
|
280
|
-
close():
|
|
333
|
+
close(): void
|
|
281
334
|
|
|
282
335
|
get size(): number
|
|
283
336
|
get total(): number
|
|
@@ -292,10 +345,10 @@ interface PoolConfig extends ConnectionParams {
|
|
|
292
345
|
|
|
293
346
|
```typescript
|
|
294
347
|
class Transaction {
|
|
295
|
-
query<T>(strings: TemplateStringsArray, ...values: any[]):
|
|
296
|
-
commit():
|
|
297
|
-
rollback():
|
|
298
|
-
savepoint<T>(name: string, callback: (tx: Transaction) => Promise<T>):
|
|
348
|
+
query<T>(strings: TemplateStringsArray, ...values: any[]): Future<T[], PostgresError>
|
|
349
|
+
commit(): Future<[], PostgresError>
|
|
350
|
+
rollback(): Future<[], PostgresError>
|
|
351
|
+
savepoint<T>(name: string, callback: (tx: Transaction) => Promise<T>): Future<T, Error>
|
|
299
352
|
|
|
300
353
|
get isActive(): boolean
|
|
301
354
|
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.ArrayClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class ArrayClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class ArrayClause extends Clause {
|
|
6
3
|
constructor(array, separator = ", ") {
|
|
7
4
|
super();
|
|
8
5
|
this.array = array;
|
|
@@ -20,7 +17,7 @@ class ArrayClause extends abstract_clause_1.Clause {
|
|
|
20
17
|
}
|
|
21
18
|
if (index)
|
|
22
19
|
params.text.push(this.separator);
|
|
23
|
-
if (value instanceof
|
|
20
|
+
if (value instanceof Clause) {
|
|
24
21
|
value.mapIntoQuery(params);
|
|
25
22
|
}
|
|
26
23
|
else {
|
|
@@ -30,4 +27,3 @@ class ArrayClause extends abstract_clause_1.Clause {
|
|
|
30
27
|
});
|
|
31
28
|
}
|
|
32
29
|
}
|
|
33
|
-
exports.ArrayClause = ArrayClause;
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.emptyClause = exports.EmptyClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class EmptyClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class EmptyClause extends Clause {
|
|
6
3
|
static create() {
|
|
7
4
|
return new EmptyClause();
|
|
8
5
|
}
|
|
9
6
|
mapIntoQuery(params) { }
|
|
10
7
|
}
|
|
11
|
-
|
|
12
|
-
exports.emptyClause = EmptyClause.create();
|
|
8
|
+
export const emptyClause = EmptyClause.create();
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.ExcludeUpdateClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class ExcludeUpdateClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class ExcludeUpdateClause extends Clause {
|
|
6
3
|
constructor(fields) {
|
|
7
4
|
super();
|
|
8
5
|
this.fields = fields;
|
|
@@ -15,4 +12,3 @@ class ExcludeUpdateClause extends abstract_clause_1.Clause {
|
|
|
15
12
|
.join(', '));
|
|
16
13
|
}
|
|
17
14
|
}
|
|
18
|
-
exports.ExcludeUpdateClause = ExcludeUpdateClause;
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
const template_compiler_1 = require("../utils/template-compiler");
|
|
6
|
-
class FragmentClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause, } from "./abstract.clause";
|
|
2
|
+
import { compileSqlTemplate } from "../utils/template-compiler";
|
|
3
|
+
export class FragmentClause extends Clause {
|
|
7
4
|
constructor(templates, args) {
|
|
8
5
|
super();
|
|
9
6
|
this.templates = templates;
|
|
@@ -13,7 +10,7 @@ class FragmentClause extends abstract_clause_1.Clause {
|
|
|
13
10
|
return new FragmentClause(strings, values);
|
|
14
11
|
}
|
|
15
12
|
mapIntoQuery(params) {
|
|
16
|
-
const compiled =
|
|
13
|
+
const compiled = compileSqlTemplate({
|
|
17
14
|
args: this.args,
|
|
18
15
|
templates: this.templates
|
|
19
16
|
}, params.args.length);
|
|
@@ -21,4 +18,3 @@ class FragmentClause extends abstract_clause_1.Clause {
|
|
|
21
18
|
params.text.push(compiled.text);
|
|
22
19
|
}
|
|
23
20
|
}
|
|
24
|
-
exports.FragmentClause = FragmentClause;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.IdentifierClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class IdentifierClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class IdentifierClause extends Clause {
|
|
6
3
|
constructor(value) {
|
|
7
4
|
super();
|
|
8
5
|
this.value = value;
|
|
@@ -16,4 +13,3 @@ class IdentifierClause extends abstract_clause_1.Clause {
|
|
|
16
13
|
params.text.push(`"${this.value}"`);
|
|
17
14
|
}
|
|
18
15
|
}
|
|
19
|
-
exports.IdentifierClause = IdentifierClause;
|
package/dist/clauses/index.js
CHANGED
|
@@ -1,25 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./array.clause"), exports);
|
|
18
|
-
__exportStar(require("./empty.clause"), exports);
|
|
19
|
-
__exportStar(require("./exclude.clause"), exports);
|
|
20
|
-
__exportStar(require("./fragment.clause"), exports);
|
|
21
|
-
__exportStar(require("./iden.caluse"), exports);
|
|
22
|
-
__exportStar(require("./insert.clause"), exports);
|
|
23
|
-
__exportStar(require("./literal.clause"), exports);
|
|
24
|
-
__exportStar(require("./update.clause"), exports);
|
|
25
|
-
__exportStar(require("./where.clause"), exports);
|
|
1
|
+
export * from './array.clause';
|
|
2
|
+
export * from './empty.clause';
|
|
3
|
+
export * from './exclude.clause';
|
|
4
|
+
export * from './fragment.clause';
|
|
5
|
+
export * from './iden.caluse';
|
|
6
|
+
export * from './insert.clause';
|
|
7
|
+
export * from './literal.clause';
|
|
8
|
+
export * from './update.clause';
|
|
9
|
+
export * from './where.clause';
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.InsertClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class InsertClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class InsertClause extends Clause {
|
|
6
3
|
constructor(inserts) {
|
|
7
4
|
super();
|
|
8
5
|
this.inserts = inserts;
|
|
@@ -33,4 +30,3 @@ class InsertClause extends abstract_clause_1.Clause {
|
|
|
33
30
|
});
|
|
34
31
|
}
|
|
35
32
|
}
|
|
36
|
-
exports.InsertClause = InsertClause;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.LiteralClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class LiteralClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class LiteralClause extends Clause {
|
|
6
3
|
constructor(value) {
|
|
7
4
|
super();
|
|
8
5
|
this.value = value;
|
|
@@ -17,4 +14,3 @@ class LiteralClause extends abstract_clause_1.Clause {
|
|
|
17
14
|
params.text.push(this.value);
|
|
18
15
|
}
|
|
19
16
|
}
|
|
20
|
-
exports.LiteralClause = LiteralClause;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.UpdateClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class UpdateClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class UpdateClause extends Clause {
|
|
6
3
|
constructor(updateMap) {
|
|
7
4
|
super();
|
|
8
5
|
this.updateMap = updateMap;
|
|
@@ -22,4 +19,3 @@ class UpdateClause extends abstract_clause_1.Clause {
|
|
|
22
19
|
});
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
|
-
exports.UpdateClause = UpdateClause;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.WhereClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class WhereClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class WhereClause extends Clause {
|
|
6
3
|
constructor(_value) {
|
|
7
4
|
super();
|
|
8
5
|
this._value = _value;
|
|
@@ -22,4 +19,3 @@ class WhereClause extends abstract_clause_1.Clause {
|
|
|
22
19
|
});
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
|
-
exports.WhereClause = WhereClause;
|
package/dist/connection.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Branded, ColumnDescription } from "./types";
|
|
2
2
|
import { Transaction } from "./transaction";
|
|
3
|
+
import { Future } from 'fluent-future';
|
|
4
|
+
import { PostgresError } from "./error";
|
|
3
5
|
type LogLevel = "none" | "error" | "notice" | "query";
|
|
4
6
|
export type ConnectionParams = {
|
|
5
7
|
user: string;
|
|
@@ -26,8 +28,9 @@ export type DescribeQueueUnit = {
|
|
|
26
28
|
reject: (error: Error) => void;
|
|
27
29
|
statementName: StatementName;
|
|
28
30
|
};
|
|
29
|
-
export type StatementName = Branded<string, '
|
|
30
|
-
export type QueryText = Branded<string, '
|
|
31
|
+
export type StatementName = Branded<string, 'StatementName'>;
|
|
32
|
+
export type QueryText = Branded<string, 'QueryText'>;
|
|
33
|
+
export type ChannelName = Branded<string, "ChannelName">;
|
|
31
34
|
/**
|
|
32
35
|
* Represents a single dedicated connection to the PostgreSQL database.
|
|
33
36
|
*
|
|
@@ -59,8 +62,10 @@ export type QueryText = Branded<string, 'queryText'>;
|
|
|
59
62
|
* ```
|
|
60
63
|
*/
|
|
61
64
|
export declare class Connection {
|
|
65
|
+
private readonly params;
|
|
62
66
|
private _isFlushing;
|
|
63
|
-
private
|
|
67
|
+
private _isOpened;
|
|
68
|
+
private _isReconnecting;
|
|
64
69
|
private _socket;
|
|
65
70
|
private _writer;
|
|
66
71
|
private _pipelinesQueue;
|
|
@@ -68,9 +73,11 @@ export declare class Connection {
|
|
|
68
73
|
private _describingPending;
|
|
69
74
|
private _parsed;
|
|
70
75
|
private _parsingPending;
|
|
76
|
+
private _listeningCallbacks;
|
|
71
77
|
private _stmtCounter;
|
|
72
78
|
private _logLevel;
|
|
73
79
|
private _nextStatement;
|
|
80
|
+
private _checkOpened;
|
|
74
81
|
private constructor();
|
|
75
82
|
/**
|
|
76
83
|
* Creates a new database connection.
|
|
@@ -90,7 +97,7 @@ export declare class Connection {
|
|
|
90
97
|
* })
|
|
91
98
|
* ```
|
|
92
99
|
*/
|
|
93
|
-
static new(params: ConnectionParams):
|
|
100
|
+
static new(params: ConnectionParams): Future<Connection, PostgresError>;
|
|
94
101
|
/**
|
|
95
102
|
* Executes a query using tagged template literals.
|
|
96
103
|
*
|
|
@@ -115,9 +122,7 @@ export declare class Connection {
|
|
|
115
122
|
* const users = await conn.query<User>`SELECT * FROM users`
|
|
116
123
|
* ```
|
|
117
124
|
*/
|
|
118
|
-
query<T extends Record<string, any>>(templates: TemplateStringsArray, ...params: any[]):
|
|
119
|
-
private _createQuery;
|
|
120
|
-
private _writeQuery;
|
|
125
|
+
query<T extends Record<string, any>>(templates: TemplateStringsArray, ...params: any[]): Future<T[], PostgresError>;
|
|
121
126
|
/**
|
|
122
127
|
* Starts a managed transaction on this connection.
|
|
123
128
|
*
|
|
@@ -139,9 +144,51 @@ export declare class Connection {
|
|
|
139
144
|
* })
|
|
140
145
|
* ```
|
|
141
146
|
*/
|
|
142
|
-
begin<T>(txCallback: (transaction: Transaction) => Promise<T>):
|
|
147
|
+
begin<T>(txCallback: (transaction: Transaction) => Promise<T>): Future<T, Error>;
|
|
148
|
+
/**
|
|
149
|
+
* Sends an asynchronous notification to a channel via `pg_notify`.
|
|
150
|
+
*
|
|
151
|
+
* @param channelName - The channel identifier
|
|
152
|
+
* @param payload - Optional string data (max 8000 bytes)
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```ts
|
|
156
|
+
* await conn.notify('events', 'hello')
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
notify(channelName: string, payload?: string): Future<Record<string, any>[], PostgresError>;
|
|
160
|
+
/**
|
|
161
|
+
* Subscribes a callback to a channel. Sends `LISTEN` on the first subscription.
|
|
162
|
+
*
|
|
163
|
+
* @param channelName - The channel identifier
|
|
164
|
+
* @param callback - Function invoked when a notification arrives
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```ts
|
|
168
|
+
* await conn.listen('events', data => console.log(data))
|
|
169
|
+
* ```
|
|
170
|
+
*/
|
|
171
|
+
listen(channelName: string, callback: (payload: string) => void): Future<Record<string, any>[], PostgresError>;
|
|
172
|
+
/**
|
|
173
|
+
* Unsubscribes a callback. Sends `UNLISTEN` if no callbacks remain for the channel.
|
|
174
|
+
*
|
|
175
|
+
* @param channelName - The channel identifier
|
|
176
|
+
* @param callback - The registered callback to remove
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```ts
|
|
180
|
+
* await conn.unlisten('events', callback)
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
unlisten(channelName: string, callback: (payload: string) => void): Future<[], PostgresError>;
|
|
184
|
+
private _createQuery;
|
|
185
|
+
private _writeQuery;
|
|
143
186
|
private _registerFlush;
|
|
144
187
|
private _flush;
|
|
188
|
+
private _registerReconnect;
|
|
189
|
+
private _resetConnectionState;
|
|
190
|
+
private _reconnect;
|
|
191
|
+
private _restoreSubscriptions;
|
|
145
192
|
private _getCurrentQuery;
|
|
146
193
|
private _rejectPipeline;
|
|
147
194
|
private _handlePacket;
|
|
@@ -149,8 +196,7 @@ export declare class Connection {
|
|
|
149
196
|
* Checks if the connection is still alive and usable.
|
|
150
197
|
* Returns `false` if the socket is destroyed or connection is dead.
|
|
151
198
|
*/
|
|
152
|
-
get
|
|
153
|
-
private _destroyConnection;
|
|
199
|
+
get isOpened(): boolean;
|
|
154
200
|
/**
|
|
155
201
|
* Closes the connection immediately.
|
|
156
202
|
* All pending queries will be rejected with an error.
|
package/dist/connection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|