@juit/pgproxy-client 1.2.1 → 1.3.1
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 +23 -2
- package/dist/client.cjs +137 -39
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.ts +42 -6
- package/dist/client.mjs +138 -39
- package/dist/client.mjs.map +1 -1
- package/dist/provider.cjs +12 -0
- package/dist/provider.cjs.map +1 -1
- package/dist/provider.d.ts +14 -10
- package/dist/provider.mjs +12 -0
- package/dist/provider.mjs.map +1 -1
- package/dist/result.cjs.map +1 -1
- package/dist/result.d.ts +2 -2
- package/dist/result.mjs.map +1 -1
- package/dist/sql.cjs +7 -2
- package/dist/sql.cjs.map +1 -1
- package/dist/sql.d.ts +2 -0
- package/dist/sql.mjs +5 -1
- package/dist/sql.mjs.map +1 -1
- package/dist/websocket.cjs +2 -1
- package/dist/websocket.cjs.map +1 -1
- package/dist/websocket.d.ts +5 -4
- package/dist/websocket.mjs +2 -1
- package/dist/websocket.mjs.map +1 -1
- package/package.json +2 -2
- package/src/client.ts +165 -61
- package/src/provider.ts +31 -11
- package/src/result.ts +3 -3
- package/src/sql.ts +5 -0
- package/src/websocket.ts +9 -8
package/dist/provider.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Describes the result of a query from a {@link PGProvider} */
|
|
2
|
-
export interface
|
|
2
|
+
export interface PGProviderResult {
|
|
3
3
|
/** The SQL command that generated this result (`SELECT`, `INSERT`, ...) */
|
|
4
4
|
command: string;
|
|
5
5
|
/** Number of rows affected by this query (e.g. added rows in `INSERT`) */
|
|
@@ -9,24 +9,28 @@ export interface PGConnectionResult {
|
|
|
9
9
|
/** Result rows, as an array of unparsed `string` results from `libpq` */
|
|
10
10
|
rows: (string | null)[][];
|
|
11
11
|
}
|
|
12
|
-
export interface
|
|
13
|
-
query(text: string, params?: (string | null)[]): Promise<
|
|
12
|
+
export interface PGProviderConnection {
|
|
13
|
+
query(text: string, params?: (string | null)[]): Promise<PGProviderResult>;
|
|
14
14
|
}
|
|
15
|
-
export interface PGProviderConstructor<Connection extends
|
|
15
|
+
export interface PGProviderConstructor<Connection extends PGProviderConnection = PGProviderConnection> {
|
|
16
16
|
new (url: URL): PGProvider<Connection>;
|
|
17
17
|
}
|
|
18
|
-
export interface PGProvider<Connection extends
|
|
18
|
+
export interface PGProvider<Connection extends PGProviderConnection = PGProviderConnection> extends PGProviderConnection {
|
|
19
|
+
/** The URL used to create this provider, devoid of any credentials */
|
|
20
|
+
readonly url: Readonly<URL>;
|
|
19
21
|
acquire(): Promise<Connection>;
|
|
20
22
|
release(connection: Connection): Promise<void>;
|
|
21
23
|
destroy(): Promise<void>;
|
|
22
24
|
}
|
|
23
|
-
export declare abstract class AbstractPGProvider<Connection extends
|
|
25
|
+
export declare abstract class AbstractPGProvider<Connection extends PGProviderConnection = PGProviderConnection> implements PGProvider<Connection> {
|
|
26
|
+
constructor(url: URL | string);
|
|
27
|
+
get url(): Readonly<URL>;
|
|
24
28
|
abstract acquire(): Promise<Connection>;
|
|
25
|
-
abstract release(connection:
|
|
26
|
-
query(text: string, params?: (string | null)[]): Promise<
|
|
29
|
+
abstract release(connection: PGProviderConnection): Promise<void>;
|
|
30
|
+
query(text: string, params?: (string | null)[]): Promise<PGProviderResult>;
|
|
27
31
|
destroy(): Promise<void>;
|
|
28
32
|
}
|
|
29
33
|
/** Register a provider, associating it with the specified protocol */
|
|
30
|
-
export declare function registerProvider(protocol: string, constructor: PGProviderConstructor
|
|
34
|
+
export declare function registerProvider(protocol: string, constructor: PGProviderConstructor): void;
|
|
31
35
|
/** Create a new {@link PGProvider} instance for the specified URL */
|
|
32
|
-
export declare function createProvider(url: URL): PGProvider
|
|
36
|
+
export declare function createProvider(url: URL): PGProvider;
|
package/dist/provider.mjs
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
// provider.ts
|
|
2
2
|
import { assert } from "./assert.mjs";
|
|
3
|
+
var providerUrls = /* @__PURE__ */ new WeakMap();
|
|
3
4
|
var AbstractPGProvider = class {
|
|
5
|
+
constructor(url) {
|
|
6
|
+
providerUrls.set(this, new URL(url));
|
|
7
|
+
}
|
|
8
|
+
get url() {
|
|
9
|
+
const url = providerUrls.get(this);
|
|
10
|
+
assert(url, "Internal error: missing provider URL");
|
|
11
|
+
const sanitizedUrl = new URL(url);
|
|
12
|
+
sanitizedUrl.username = "";
|
|
13
|
+
sanitizedUrl.password = "";
|
|
14
|
+
return sanitizedUrl;
|
|
15
|
+
}
|
|
4
16
|
async query(text, params = []) {
|
|
5
17
|
const connection = await this.acquire();
|
|
6
18
|
try {
|
package/dist/provider.mjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/provider.ts"],
|
|
4
|
-
"mappings": ";AAAA,SAAS,cAAc;
|
|
4
|
+
"mappings": ";AAAA,SAAS,cAAc;AAyCvB,IAAM,eAAe,oBAAI,QAAiC;AAEnD,IAAe,qBAAf,MAC2B;AAAA,EAChC,YAAY,KAAmB;AAC7B,iBAAa,IAAI,MAAM,IAAI,IAAI,GAAG,CAAC;AAAA,EACrC;AAAA,EAEA,IAAI,MAAqB;AACvB,UAAM,MAAM,aAAa,IAAI,IAAI;AACjC,WAAO,KAAK,sCAAsC;AAClD,UAAM,eAAe,IAAI,IAAI,GAAG;AAChC,iBAAa,WAAW;AACxB,iBAAa,WAAW;AACxB,WAAO;AAAA,EACT;AAAA,EAKA,MAAM,MAAM,MAAc,SAA4B,CAAC,GAA8B;AACnF,UAAM,aAAa,MAAM,KAAK,QAAQ;AACtC,QAAI;AACF,aAAO,MAAM,WAAW,MAAM,MAAM,MAAM;AAAA,IAC5C,UAAE;AACA,YAAM,KAAK,QAAQ,UAAU;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,UAAyB;AAAA,EAE/B;AACF;AAQA,IAAM,YAAY,oBAAI,IAAmC;AAGlD,SAAS,iBACZ,UACA,aACI;AACN,aAAW,GAAG,QAAQ;AACtB,SAAO,CAAE,UAAU,IAAI,QAAQ,GAAG,4BAA4B,QAAQ,yBAAyB;AAC/F,YAAU,IAAI,UAAU,WAAW;AACnC,YAAU,IAAI,UAAU,WAAW;AACrC;AAGO,SAAS,eAAe,KAAsB;AACnD,QAAM,WAAW,UAAU,IAAI,IAAI,QAAQ;AAC3C,SAAO,UAAU,0CAA0C,IAAI,QAAQ,MAAM;AAC7E,SAAO,IAAI,SAAS,GAAG;AACzB;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/result.cjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/result.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CO,IAAM,WAAgC,MAAM,aAGjB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CO,IAAM,WAAgC,MAAM,aAGjB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAA0B,UAAoB;AACxD,SAAK,WAAW,OAAO;AACvB,SAAK,UAAU,OAAO;AACtB,SAAK,SAAS,OAAO,OAAO,IAAI,CAAC,CAAE,MAAM,GAAI,OAAO,EAAE,MAAM,IAAI,EAAE;AAElE,UAAM,WAAW,OAAO,KAAK;AAC7B,UAAM,WAAW,OAAO,OAAO;AAE/B,UAAM,UAAU,OAAO,OAAO,IAAI,CAAC,CAAE,MAAM,GAAI,MAAO;AAAA,MACpD;AAAA,MAAM,SAAS,UAAU,GAAG;AAAA,IAC9B,CAAW;AAEX,UAAM,OAAO,KAAK,OAAO,IAAI,MAAM,QAAQ;AAC3C,UAAM,SAAS,KAAK,SAAS,IAAI,MAAM,QAAQ;AAE/C,aAAS,MAAM,GAAG,MAAM,UAAU,OAAQ;AACxC,YAAM,YAAY,OAAO,GAAG,IAAI,IAAI,MAAM,QAAQ;AAClD,YAAM,UAAU,KAAK,GAAG,IAAI,CAAC;AAE7B,eAAS,MAAM,GAAG,MAAM,UAAU,OAAQ;AACxC,cAAM,CAAE,MAAM,MAAO,IAAI,QAAQ,GAAG;AACpC,cAAM,QAAQ,OAAO,KAAK,GAAG,EAAG,GAAG;AACnC,kBAAU,GAAG,IAAI,QAAQ,IAAI,IAC3B,UAAU,OAAO,OACjB,UAAU,SAAY,OACtB,OAAO,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/result.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Registry } from '@juit/pgproxy-types';
|
|
2
|
-
import type {
|
|
2
|
+
import type { PGProviderResult } from './provider';
|
|
3
3
|
/** The result of a database query */
|
|
4
4
|
export interface PGResult<Row extends Record<string, any> = Record<string, any>, Tuple extends readonly any[] = readonly any[]> {
|
|
5
5
|
/** The SQL command that generated this result (`SELECT`, `INSERT`, ...) */
|
|
@@ -24,7 +24,7 @@ export interface PGResult<Row extends Record<string, any> = Record<string, any>,
|
|
|
24
24
|
}
|
|
25
25
|
/** Constructor for {@link (PGResult:interface)} instances */
|
|
26
26
|
export interface PGResultConstructor {
|
|
27
|
-
new <Row extends Record<string, any> = Record<string, any>, Tuple extends readonly any[] = readonly any[]>(result:
|
|
27
|
+
new <Row extends Record<string, any> = Record<string, any>, Tuple extends readonly any[] = readonly any[]>(result: PGProviderResult, registry: Registry): PGResult<Row, Tuple>;
|
|
28
28
|
}
|
|
29
29
|
/** The result of a database query */
|
|
30
30
|
export declare const PGResult: PGResultConstructor;
|
package/dist/result.mjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/result.ts"],
|
|
4
|
-
"mappings": ";AA2CO,IAAM,WAAgC,MAAM,aAGjB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,
|
|
4
|
+
"mappings": ";AA2CO,IAAM,WAAgC,MAAM,aAGjB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAA0B,UAAoB;AACxD,SAAK,WAAW,OAAO;AACvB,SAAK,UAAU,OAAO;AACtB,SAAK,SAAS,OAAO,OAAO,IAAI,CAAC,CAAE,MAAM,GAAI,OAAO,EAAE,MAAM,IAAI,EAAE;AAElE,UAAM,WAAW,OAAO,KAAK;AAC7B,UAAM,WAAW,OAAO,OAAO;AAE/B,UAAM,UAAU,OAAO,OAAO,IAAI,CAAC,CAAE,MAAM,GAAI,MAAO;AAAA,MACpD;AAAA,MAAM,SAAS,UAAU,GAAG;AAAA,IAC9B,CAAW;AAEX,UAAM,OAAO,KAAK,OAAO,IAAI,MAAM,QAAQ;AAC3C,UAAM,SAAS,KAAK,SAAS,IAAI,MAAM,QAAQ;AAE/C,aAAS,MAAM,GAAG,MAAM,UAAU,OAAQ;AACxC,YAAM,YAAY,OAAO,GAAG,IAAI,IAAI,MAAM,QAAQ;AAClD,YAAM,UAAU,KAAK,GAAG,IAAI,CAAC;AAE7B,eAAS,MAAM,GAAG,MAAM,UAAU,OAAQ;AACxC,cAAM,CAAE,MAAM,MAAO,IAAI,QAAQ,GAAG;AACpC,cAAM,QAAQ,OAAO,KAAK,GAAG,EAAG,GAAG;AACnC,kBAAU,GAAG,IAAI,QAAQ,IAAI,IAC3B,UAAU,OAAO,OACjB,UAAU,SAAY,OACtB,OAAO,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/sql.cjs
CHANGED
|
@@ -20,7 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// sql.ts
|
|
21
21
|
var sql_exports = {};
|
|
22
22
|
__export(sql_exports, {
|
|
23
|
-
SQL: () => SQL
|
|
23
|
+
SQL: () => SQL,
|
|
24
|
+
escape: () => escape
|
|
24
25
|
});
|
|
25
26
|
module.exports = __toCommonJS(sql_exports);
|
|
26
27
|
function makeSQL(parts, params, query = "", start = 0) {
|
|
@@ -42,8 +43,12 @@ function makeSQL(parts, params, query = "", start = 0) {
|
|
|
42
43
|
function SQL(strings, ...args) {
|
|
43
44
|
return makeSQL(strings, args);
|
|
44
45
|
}
|
|
46
|
+
function escape(str) {
|
|
47
|
+
return `"${str.replaceAll('"', '""').trim()}"`;
|
|
48
|
+
}
|
|
45
49
|
// Annotate the CommonJS export names for ESM import in node:
|
|
46
50
|
0 && (module.exports = {
|
|
47
|
-
SQL
|
|
51
|
+
SQL,
|
|
52
|
+
escape
|
|
48
53
|
});
|
|
49
54
|
//# sourceMappingURL=sql.cjs.map
|
package/dist/sql.cjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/sql.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CA,SAAS,QACL,OACA,QACA,QAAgB,IAChB,QAAgB,GACb;AACL,QAAM,CAAE,QAAQ,IAAI,GAAG,IAAK,IAAI;AAEhC,MAAI,MAAO,UAAS;AACpB,WAAS,KAAK,OAAO,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK;AAEpE,QAAM,MAAM,CAAC,YAA+B,SAA8B;AACxE,WAAO,QAAQ,SAAS,CAAE,GAAG,QAAQ,GAAG,IAAK,GAAG,OAAO,OAAO,MAAM;AAAA,EACtE;AAEA,SAAO,OAAO,OAAO,KAAK;AAAA,IACxB,IAAI,QAAgB;AAClB,aAAO;AAAA,IACT;AAAA,IACA,IAAI,SAAyB;AAC3B,aAAO,CAAE,GAAG,MAAO;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAuCO,SAAS,IAAI,YAA+B,MAA2B;AAC5E,SAAO,QAAQ,SAAS,IAAI;AAC9B;",
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CA,SAAS,QACL,OACA,QACA,QAAgB,IAChB,QAAgB,GACb;AACL,QAAM,CAAE,QAAQ,IAAI,GAAG,IAAK,IAAI;AAEhC,MAAI,MAAO,UAAS;AACpB,WAAS,KAAK,OAAO,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK;AAEpE,QAAM,MAAM,CAAC,YAA+B,SAA8B;AACxE,WAAO,QAAQ,SAAS,CAAE,GAAG,QAAQ,GAAG,IAAK,GAAG,OAAO,OAAO,MAAM;AAAA,EACtE;AAEA,SAAO,OAAO,OAAO,KAAK;AAAA,IACxB,IAAI,QAAgB;AAClB,aAAO;AAAA,IACT;AAAA,IACA,IAAI,SAAyB;AAC3B,aAAO,CAAE,GAAG,MAAO;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAuCO,SAAS,IAAI,YAA+B,MAA2B;AAC5E,SAAO,QAAQ,SAAS,IAAI;AAC9B;AAGO,SAAS,OAAO,KAAqB;AAC1C,SAAO,IAAI,IAAI,WAAW,KAAK,IAAI,EAAE,KAAK,CAAC;AAC7C;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/sql.d.ts
CHANGED
|
@@ -77,3 +77,5 @@ export interface SQL extends Required<PGQuery> {
|
|
|
77
77
|
* space character.
|
|
78
78
|
*/
|
|
79
79
|
export declare function SQL(strings: readonly string[], ...args: readonly any[]): SQL;
|
|
80
|
+
/** Escape a PostgreSQL identifier (table, column, ... names) */
|
|
81
|
+
export declare function escape(str: string): string;
|
package/dist/sql.mjs
CHANGED
|
@@ -18,7 +18,11 @@ function makeSQL(parts, params, query = "", start = 0) {
|
|
|
18
18
|
function SQL(strings, ...args) {
|
|
19
19
|
return makeSQL(strings, args);
|
|
20
20
|
}
|
|
21
|
+
function escape(str) {
|
|
22
|
+
return `"${str.replaceAll('"', '""').trim()}"`;
|
|
23
|
+
}
|
|
21
24
|
export {
|
|
22
|
-
SQL
|
|
25
|
+
SQL,
|
|
26
|
+
escape
|
|
23
27
|
};
|
|
24
28
|
//# sourceMappingURL=sql.mjs.map
|
package/dist/sql.mjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/sql.ts"],
|
|
4
|
-
"mappings": ";AA+CA,SAAS,QACL,OACA,QACA,QAAgB,IAChB,QAAgB,GACb;AACL,QAAM,CAAE,QAAQ,IAAI,GAAG,IAAK,IAAI;AAEhC,MAAI,MAAO,UAAS;AACpB,WAAS,KAAK,OAAO,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK;AAEpE,QAAM,MAAM,CAAC,YAA+B,SAA8B;AACxE,WAAO,QAAQ,SAAS,CAAE,GAAG,QAAQ,GAAG,IAAK,GAAG,OAAO,OAAO,MAAM;AAAA,EACtE;AAEA,SAAO,OAAO,OAAO,KAAK;AAAA,IACxB,IAAI,QAAgB;AAClB,aAAO;AAAA,IACT;AAAA,IACA,IAAI,SAAyB;AAC3B,aAAO,CAAE,GAAG,MAAO;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAuCO,SAAS,IAAI,YAA+B,MAA2B;AAC5E,SAAO,QAAQ,SAAS,IAAI;AAC9B;",
|
|
4
|
+
"mappings": ";AA+CA,SAAS,QACL,OACA,QACA,QAAgB,IAChB,QAAgB,GACb;AACL,QAAM,CAAE,QAAQ,IAAI,GAAG,IAAK,IAAI;AAEhC,MAAI,MAAO,UAAS;AACpB,WAAS,KAAK,OAAO,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK;AAEpE,QAAM,MAAM,CAAC,YAA+B,SAA8B;AACxE,WAAO,QAAQ,SAAS,CAAE,GAAG,QAAQ,GAAG,IAAK,GAAG,OAAO,OAAO,MAAM;AAAA,EACtE;AAEA,SAAO,OAAO,OAAO,KAAK;AAAA,IACxB,IAAI,QAAgB;AAClB,aAAO;AAAA,IACT;AAAA,IACA,IAAI,SAAyB;AAC3B,aAAO,CAAE,GAAG,MAAO;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAuCO,SAAS,IAAI,YAA+B,MAA2B;AAC5E,SAAO,QAAQ,SAAS,IAAI;AAC9B;AAGO,SAAS,OAAO,KAAqB;AAC1C,SAAO,IAAI,IAAI,WAAW,KAAK,IAAI,EAAE,KAAK,CAAC;AAC7C;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/websocket.cjs
CHANGED
|
@@ -24,6 +24,7 @@ __export(websocket_exports, {
|
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(websocket_exports);
|
|
26
26
|
var import_assert = require("./assert.cjs");
|
|
27
|
+
var import_provider = require("./provider.cjs");
|
|
27
28
|
var pgWebSocketReadyState = {
|
|
28
29
|
CONNECTING: 0,
|
|
29
30
|
OPEN: 1,
|
|
@@ -116,7 +117,7 @@ var WebSocketConnectionImpl = class {
|
|
|
116
117
|
});
|
|
117
118
|
}
|
|
118
119
|
};
|
|
119
|
-
var WebSocketProvider = class {
|
|
120
|
+
var WebSocketProvider = class extends import_provider.AbstractPGProvider {
|
|
120
121
|
_connections = /* @__PURE__ */ new Set();
|
|
121
122
|
/**
|
|
122
123
|
* Handle the initial connection of a WebSocket.
|
package/dist/websocket.cjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/websocket.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AACvB,sBAAmC;AAWnC,IAAM,wBAAwB;AAAA,EAC5B,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AACV;AAoCA,SAAS,IAAI,SAAoC,gBAAgC;AAC/E,SAAO,WAAW;AACpB;AAGA,IAAM,mBAAN,MAAuB;AAAA,EAKrB,YAAmB,IAAY;AAAZ;AACjB,SAAK,UAAU,IAAI,QAAQ,CAAC,SAAS,WAAW,OAAO,iBAAiB,MAAM;AAAA,MAC5E,SAAS,EAAE,OAAO,QAAQ;AAAA,MAC1B,QAAQ,EAAE,OAAO,OAAO;AAAA,IAC1B,CAAC,CAAC;AAAA,EACJ;AAAA,EATS;AAAA,EACA;AAAA,EACA;AAQX;AAGA,IAAM,0BAAN,MAA6D;AAAA,EAM3D,YAAoB,SAA8B,eAA6B;AAA3D;AAA8B;AAEhD,YAAQ,iBAAiB,SAAS,CAAC,UAAU;AAE3C,UAAI,CAAE,KAAK,QAAQ;AACjB,cAAM,SAAS,IAAI,MAAM,QAAQ,gBAAgB;AACjD,cAAM,UAAU,qBAAqB,MAAM,IAAI,MAAM,MAAM;AAC3D,aAAK,SAAS,IAAI,MAAM,OAAO;AAAA,MACjC;AAGA,iBAAW,OAAO,KAAK,UAAU,OAAO,EAAG,KAAI,OAAO,KAAK,MAAM;AACjE,WAAK,UAAU,MAAM;AAAA,IACvB,CAAC;AAGD,YAAQ,iBAAiB,SAAS,CAAC,UAAU;AAC3C,UAAI,MAAM,MAAO,MAAK,SAAS,MAAM;AAAA,UAChC,MAAK,SAAS,IAAI,MAAM,yBAAyB;AAGtD,iBAAW,OAAO,KAAK,UAAU,OAAO,EAAG,KAAI,OAAO,KAAK,MAAM;AACjE,WAAK,UAAU,MAAM;AAGrB,WAAK,MAAM;AAAA,IACb,CAAC;AAGD,YAAQ,iBAAiB,WAAW,CAAC,UAAU;AAC7C,UAAI;AAEF,cAAM,OAAO,MAAM;AACnB,kCAAO,OAAO,SAAS,UAAU,qBAAqB;AAGtD,YAAI;AACJ,YAAI;AACF,oBAAU,KAAK,MAAM,IAAI;AAAA,QAC3B,QAAQ;AACN,gBAAM,IAAI,MAAM,8BAA8B;AAAA,QAChD;AAGA,kCAAO,WAAY,OAAO,YAAY,UAAW,+BAA+B;AAGhF,cAAM,UAAU,KAAK,UAAU,IAAI,QAAQ,EAAE;AAC7C,kCAAO,SAAS,wBAAwB,QAAQ,EAAE,GAAG;AAGrD,YAAI,QAAQ,eAAe,KAAK;AAC9B,eAAK,UAAU,OAAO,QAAQ,EAAE;AAChC,iBAAO,QAAQ,QAAQ,OAAO;AAAA,QAChC,WAAW,QAAQ,eAAe,KAAK;AACrC,eAAK,UAAU,OAAO,QAAQ,EAAE;AAChC,iBAAO,QAAQ,OAAO,IAAI,MAAM,GAAG,IAAI,QAAQ,OAAO,eAAe,CAAC,KAAK,QAAQ,UAAU,GAAG,CAAC;AAAA,QACnG,OAAO;AACL,gBAAM,IAAI,MAAM,GAAG,IAAI,QAAQ,OAAO,eAAe,CAAC,KAAK,QAAQ,UAAU,GAAG;AAAA,QAClF;AAAA,MACF,SAAS,OAAY;AACnB,gBAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,cAAc,CAAC;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EApEQ,YAAY,oBAAI,IAA8B;AAAA;AAAA,EAE9C;AAAA,EAoER,QAAc;AACZ,QAAI,KAAK,QAAQ,eAAe,sBAAsB,OAAQ;AAE9D,QAAI,KAAK,QAAQ,eAAe,sBAAsB,QAAS;AAC/D,SAAK,QAAQ,MAAM,KAAM,oBAAoB;AAAA,EAC/C;AAAA,EAEA,MAAM,OAAe,SAA4B,CAAC,GAA8B;AAE9E,QAAI,KAAK,OAAQ,QAAO,QAAQ,OAAO,KAAK,MAAM;AAGlD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAEtC,YAAM,KAAK,KAAK,cAAc;AAC9B,YAAM,UAAU,IAAI,iBAAiB,EAAE;AACvC,WAAK,UAAU,IAAI,IAAI,OAAO;AAG9B,cAAQ,QAAQ,KAAK,SAAS,MAAM;AAGpC,UAAI;AACF,aAAK,QAAQ,KAAK,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,CAAmB,CAAC;AAAA,MAC3E,SAAS,OAAO;AACd,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAaO,IAAe,oBAAf,cAAyC,mCAA8D;AAAA,EAC3F,eAAe,oBAAI,IAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BnD,kBAAyC,QAAuB;AACxE,WAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AAGzC,UAAI,OAAO,eAAe,sBAAsB,KAAM,QAAO,QAAQ,MAAM;AAC3E,UAAI,OAAO,eAAe,sBAAsB,YAAY;AAC1D,eAAO,OAAO,IAAI,MAAM,iCAAiC,OAAO,UAAU,EAAE,CAAC;AAAA,MAC/E;AAEA,YAAM,SAAS,MAAY;AACzB,6BAAqB;AACrB,gBAAQ,MAAM;AAAA,MAChB;AAEA,YAAM,UAAU,CAAC,UAAuC;AACtD,6BAAqB;AACrB,YAAI,WAAW,MAAO,QAAO,OAAO,MAAM,KAAK;AAC/C,eAAO,IAAI,MAAM,gCAAgC,CAAC;AAAA,MACpD;AAEA,YAAM,UAAU,CAAC,UAAuC;AACtD,6BAAqB;AACrB,eAAO,IAAI,MAAM,+BAA+B,MAAM,IAAI,KAAK,MAAM,MAAM,EAAE,CAAC;AAAA,MAChF;AAEA,YAAM,uBAAuB,MAAY;AACvC,eAAO,oBAAoB,QAAQ,MAAM;AACzC,eAAO,oBAAoB,SAAS,OAAO;AAC3C,eAAO,oBAAoB,SAAS,OAAO;AAAA,MAC7C;AAEA,aAAO,iBAAiB,QAAQ,MAAM;AACtC,aAAO,iBAAiB,SAAS,OAAO;AACxC,aAAO,iBAAiB,SAAS,OAAO;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAwC;AAC5C,UAAM,SAAS,MAAM,KAAK,cAAc;AAGxC,UAAM,aAAa,IAAI,wBAAwB,QAAQ,MAAM,KAAK,oBAAoB,CAAC;AACvF,SAAK,aAAa,IAAI,UAAU;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,YAAgD;AAC5D,SAAK,aAAa,OAAO,UAAU;AACnC,eAAW,MAAM;AAAA,EACnB;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,aAAa,QAAQ,CAAC,eAAe,WAAW,MAAM,CAAC;AAC5D,SAAK,aAAa,MAAM;AAAA,EAC1B;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/websocket.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { AbstractPGProvider } from './provider';
|
|
2
|
+
import type { PGProvider, PGProviderConnection, PGProviderResult } from './provider';
|
|
2
3
|
interface PGWebSocketCloseEvent {
|
|
3
4
|
readonly code: number;
|
|
4
5
|
readonly reason: string;
|
|
@@ -23,14 +24,14 @@ export interface PGWebSocket {
|
|
|
23
24
|
close(code?: number, reason?: string): void;
|
|
24
25
|
}
|
|
25
26
|
/** A connection to the database backed by a `WebSocket` */
|
|
26
|
-
export interface WebSocketConnection extends
|
|
27
|
+
export interface WebSocketConnection extends PGProviderConnection {
|
|
27
28
|
/** Close this connection and the underlying `WebSocket` */
|
|
28
29
|
close(): void;
|
|
29
30
|
}
|
|
30
31
|
/** An abstract provider implementing `connect(...)` via WHATWG WebSockets */
|
|
31
|
-
export declare abstract class WebSocketProvider implements PGProvider<WebSocketConnection> {
|
|
32
|
+
export declare abstract class WebSocketProvider extends AbstractPGProvider implements PGProvider<WebSocketConnection> {
|
|
32
33
|
private readonly _connections;
|
|
33
|
-
abstract query(text: string, params?: (string | null)[]): Promise<
|
|
34
|
+
abstract query(text: string, params?: (string | null)[]): Promise<PGProviderResult>;
|
|
34
35
|
/** Return a unique request identifier to correlate responses */
|
|
35
36
|
protected abstract _getUniqueRequestId(): string;
|
|
36
37
|
/**
|
package/dist/websocket.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// websocket.ts
|
|
2
2
|
import { assert } from "./assert.mjs";
|
|
3
|
+
import { AbstractPGProvider } from "./provider.mjs";
|
|
3
4
|
var pgWebSocketReadyState = {
|
|
4
5
|
CONNECTING: 0,
|
|
5
6
|
OPEN: 1,
|
|
@@ -92,7 +93,7 @@ var WebSocketConnectionImpl = class {
|
|
|
92
93
|
});
|
|
93
94
|
}
|
|
94
95
|
};
|
|
95
|
-
var WebSocketProvider = class {
|
|
96
|
+
var WebSocketProvider = class extends AbstractPGProvider {
|
|
96
97
|
_connections = /* @__PURE__ */ new Set();
|
|
97
98
|
/**
|
|
98
99
|
* Handle the initial connection of a WebSocket.
|
package/dist/websocket.mjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/websocket.ts"],
|
|
4
|
-
"mappings": ";AAAA,SAAS,cAAc;
|
|
4
|
+
"mappings": ";AAAA,SAAS,cAAc;AACvB,SAAS,0BAA0B;AAWnC,IAAM,wBAAwB;AAAA,EAC5B,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AACV;AAoCA,SAAS,IAAI,SAAoC,gBAAgC;AAC/E,SAAO,WAAW;AACpB;AAGA,IAAM,mBAAN,MAAuB;AAAA,EAKrB,YAAmB,IAAY;AAAZ;AACjB,SAAK,UAAU,IAAI,QAAQ,CAAC,SAAS,WAAW,OAAO,iBAAiB,MAAM;AAAA,MAC5E,SAAS,EAAE,OAAO,QAAQ;AAAA,MAC1B,QAAQ,EAAE,OAAO,OAAO;AAAA,IAC1B,CAAC,CAAC;AAAA,EACJ;AAAA,EATS;AAAA,EACA;AAAA,EACA;AAQX;AAGA,IAAM,0BAAN,MAA6D;AAAA,EAM3D,YAAoB,SAA8B,eAA6B;AAA3D;AAA8B;AAEhD,YAAQ,iBAAiB,SAAS,CAAC,UAAU;AAE3C,UAAI,CAAE,KAAK,QAAQ;AACjB,cAAM,SAAS,IAAI,MAAM,QAAQ,gBAAgB;AACjD,cAAM,UAAU,qBAAqB,MAAM,IAAI,MAAM,MAAM;AAC3D,aAAK,SAAS,IAAI,MAAM,OAAO;AAAA,MACjC;AAGA,iBAAW,OAAO,KAAK,UAAU,OAAO,EAAG,KAAI,OAAO,KAAK,MAAM;AACjE,WAAK,UAAU,MAAM;AAAA,IACvB,CAAC;AAGD,YAAQ,iBAAiB,SAAS,CAAC,UAAU;AAC3C,UAAI,MAAM,MAAO,MAAK,SAAS,MAAM;AAAA,UAChC,MAAK,SAAS,IAAI,MAAM,yBAAyB;AAGtD,iBAAW,OAAO,KAAK,UAAU,OAAO,EAAG,KAAI,OAAO,KAAK,MAAM;AACjE,WAAK,UAAU,MAAM;AAGrB,WAAK,MAAM;AAAA,IACb,CAAC;AAGD,YAAQ,iBAAiB,WAAW,CAAC,UAAU;AAC7C,UAAI;AAEF,cAAM,OAAO,MAAM;AACnB,eAAO,OAAO,SAAS,UAAU,qBAAqB;AAGtD,YAAI;AACJ,YAAI;AACF,oBAAU,KAAK,MAAM,IAAI;AAAA,QAC3B,QAAQ;AACN,gBAAM,IAAI,MAAM,8BAA8B;AAAA,QAChD;AAGA,eAAO,WAAY,OAAO,YAAY,UAAW,+BAA+B;AAGhF,cAAM,UAAU,KAAK,UAAU,IAAI,QAAQ,EAAE;AAC7C,eAAO,SAAS,wBAAwB,QAAQ,EAAE,GAAG;AAGrD,YAAI,QAAQ,eAAe,KAAK;AAC9B,eAAK,UAAU,OAAO,QAAQ,EAAE;AAChC,iBAAO,QAAQ,QAAQ,OAAO;AAAA,QAChC,WAAW,QAAQ,eAAe,KAAK;AACrC,eAAK,UAAU,OAAO,QAAQ,EAAE;AAChC,iBAAO,QAAQ,OAAO,IAAI,MAAM,GAAG,IAAI,QAAQ,OAAO,eAAe,CAAC,KAAK,QAAQ,UAAU,GAAG,CAAC;AAAA,QACnG,OAAO;AACL,gBAAM,IAAI,MAAM,GAAG,IAAI,QAAQ,OAAO,eAAe,CAAC,KAAK,QAAQ,UAAU,GAAG;AAAA,QAClF;AAAA,MACF,SAAS,OAAY;AACnB,gBAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,cAAc,CAAC;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EApEQ,YAAY,oBAAI,IAA8B;AAAA;AAAA,EAE9C;AAAA,EAoER,QAAc;AACZ,QAAI,KAAK,QAAQ,eAAe,sBAAsB,OAAQ;AAE9D,QAAI,KAAK,QAAQ,eAAe,sBAAsB,QAAS;AAC/D,SAAK,QAAQ,MAAM,KAAM,oBAAoB;AAAA,EAC/C;AAAA,EAEA,MAAM,OAAe,SAA4B,CAAC,GAA8B;AAE9E,QAAI,KAAK,OAAQ,QAAO,QAAQ,OAAO,KAAK,MAAM;AAGlD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAEtC,YAAM,KAAK,KAAK,cAAc;AAC9B,YAAM,UAAU,IAAI,iBAAiB,EAAE;AACvC,WAAK,UAAU,IAAI,IAAI,OAAO;AAG9B,cAAQ,QAAQ,KAAK,SAAS,MAAM;AAGpC,UAAI;AACF,aAAK,QAAQ,KAAK,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,CAAmB,CAAC;AAAA,MAC3E,SAAS,OAAO;AACd,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAaO,IAAe,oBAAf,cAAyC,mBAA8D;AAAA,EAC3F,eAAe,oBAAI,IAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BnD,kBAAyC,QAAuB;AACxE,WAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AAGzC,UAAI,OAAO,eAAe,sBAAsB,KAAM,QAAO,QAAQ,MAAM;AAC3E,UAAI,OAAO,eAAe,sBAAsB,YAAY;AAC1D,eAAO,OAAO,IAAI,MAAM,iCAAiC,OAAO,UAAU,EAAE,CAAC;AAAA,MAC/E;AAEA,YAAM,SAAS,MAAY;AACzB,6BAAqB;AACrB,gBAAQ,MAAM;AAAA,MAChB;AAEA,YAAM,UAAU,CAAC,UAAuC;AACtD,6BAAqB;AACrB,YAAI,WAAW,MAAO,QAAO,OAAO,MAAM,KAAK;AAC/C,eAAO,IAAI,MAAM,gCAAgC,CAAC;AAAA,MACpD;AAEA,YAAM,UAAU,CAAC,UAAuC;AACtD,6BAAqB;AACrB,eAAO,IAAI,MAAM,+BAA+B,MAAM,IAAI,KAAK,MAAM,MAAM,EAAE,CAAC;AAAA,MAChF;AAEA,YAAM,uBAAuB,MAAY;AACvC,eAAO,oBAAoB,QAAQ,MAAM;AACzC,eAAO,oBAAoB,SAAS,OAAO;AAC3C,eAAO,oBAAoB,SAAS,OAAO;AAAA,MAC7C;AAEA,aAAO,iBAAiB,QAAQ,MAAM;AACtC,aAAO,iBAAiB,SAAS,OAAO;AACxC,aAAO,iBAAiB,SAAS,OAAO;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAwC;AAC5C,UAAM,SAAS,MAAM,KAAK,cAAc;AAGxC,UAAM,aAAa,IAAI,wBAAwB,QAAQ,MAAM,KAAK,oBAAoB,CAAC;AACvF,SAAK,aAAa,IAAI,UAAU;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,YAAgD;AAC5D,SAAK,aAAa,OAAO,UAAU;AACnC,eAAW,MAAM;AAAA,EACnB;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,aAAa,QAAQ,CAAC,eAAe,WAAW,MAAM,CAAC;AAC5D,SAAK,aAAa,MAAM;AAAA,EAC1B;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juit/pgproxy-client",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"main": "./dist/index.cjs",
|
|
5
5
|
"module": "./dist/index.mjs",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
"homepage": "https://github.com/juitnow/juit-pgproxy#readme",
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@juit/pgproxy-types": "1.
|
|
38
|
+
"@juit/pgproxy-types": "1.3.1"
|
|
39
39
|
},
|
|
40
40
|
"directories": {
|
|
41
41
|
"test": "test"
|
package/src/client.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { assert } from './assert'
|
|
|
4
4
|
import { createProvider } from './provider'
|
|
5
5
|
import { PGResult } from './result'
|
|
6
6
|
|
|
7
|
-
import type {
|
|
7
|
+
import type { PGProvider, PGProviderConnection } from './provider'
|
|
8
8
|
|
|
9
9
|
function serializeParams(params: readonly any[]): (string | null)[] {
|
|
10
10
|
if (params.length == 0) return []
|
|
@@ -20,6 +20,29 @@ function serializeParams(params: readonly any[]): (string | null)[] {
|
|
|
20
20
|
return result
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Options to create a `PGClient`
|
|
25
|
+
*
|
|
26
|
+
* As an alternative to using URLs, a `PGClient` can be instantiated with
|
|
27
|
+
* options passed in this object.
|
|
28
|
+
*/
|
|
29
|
+
export interface PGClientOptions {
|
|
30
|
+
/** The protocol used to connect to the database (defaults to "psql") */
|
|
31
|
+
readonly protocol?: string
|
|
32
|
+
/** The PostgreSQL database to connect to */
|
|
33
|
+
readonly database?: string
|
|
34
|
+
/** The user to authenticate as */
|
|
35
|
+
readonly username?: string
|
|
36
|
+
/** The password to use for authentication */
|
|
37
|
+
readonly password?: string
|
|
38
|
+
/** The host to connect to */
|
|
39
|
+
readonly host?: string
|
|
40
|
+
/** The port to connect to */
|
|
41
|
+
readonly port?: number
|
|
42
|
+
/** Any additional options to pass to the provider */
|
|
43
|
+
readonly parameters?: Record<string, string | number | boolean>
|
|
44
|
+
}
|
|
45
|
+
|
|
23
46
|
/** An interface representing a SQL query to a database */
|
|
24
47
|
export interface PGQuery {
|
|
25
48
|
/** The SQL query to execute optionally containing placeholders. */
|
|
@@ -55,7 +78,8 @@ export interface PGQueryable {
|
|
|
55
78
|
|
|
56
79
|
/**
|
|
57
80
|
* An interface for an object that can execute queries _and transactions_
|
|
58
|
-
* on a database
|
|
81
|
+
* on a database
|
|
82
|
+
*/
|
|
59
83
|
export interface PGTransactionable extends PGQueryable {
|
|
60
84
|
/**
|
|
61
85
|
* Start a transaction by issuing a `BEGIN` statement
|
|
@@ -70,14 +94,23 @@ export interface PGTransactionable extends PGQueryable {
|
|
|
70
94
|
rollback(): Promise<void>
|
|
71
95
|
}
|
|
72
96
|
|
|
97
|
+
/**
|
|
98
|
+
* A connection to a database that can be asynchronously disposed of.
|
|
99
|
+
*/
|
|
100
|
+
export interface PGConnection extends PGTransactionable, AsyncDisposable {
|
|
101
|
+
/** Forcedly close the underlying connection to the database */
|
|
102
|
+
close(): Promise<void>
|
|
103
|
+
}
|
|
73
104
|
|
|
74
105
|
/** A consumer for a {@link PGTransactionable} connection */
|
|
75
106
|
export type PGConsumer<T> = (connection: PGTransactionable) => T | PromiseLike<T>
|
|
76
107
|
|
|
77
108
|
/** The PostgreSQL client */
|
|
78
|
-
export interface PGClient extends PGQueryable {
|
|
109
|
+
export interface PGClient extends PGQueryable, AsyncDisposable {
|
|
79
110
|
/** The {@link @juit/pgproxy-types#Registry} used to parse results from PostgreSQL */
|
|
80
111
|
readonly registry: Registry
|
|
112
|
+
/** The URL used to create this provider, devoid of any credentials */
|
|
113
|
+
readonly url: Readonly<URL>
|
|
81
114
|
|
|
82
115
|
/**
|
|
83
116
|
* Execute a _single_ query on the database.
|
|
@@ -109,6 +142,12 @@ export interface PGClient extends PGQueryable {
|
|
|
109
142
|
Tuple extends readonly any[] = readonly any [],
|
|
110
143
|
>(query: PGQuery): Promise<PGResult<Row, Tuple>>
|
|
111
144
|
|
|
145
|
+
/**
|
|
146
|
+
* Connect to the database and return an _async disposable_
|
|
147
|
+
* {@link PGConnection}.
|
|
148
|
+
*/
|
|
149
|
+
connect(): Promise<PGConnection>
|
|
150
|
+
|
|
112
151
|
/**
|
|
113
152
|
* Connect to the database to execute a number of different queries.
|
|
114
153
|
*
|
|
@@ -128,39 +167,77 @@ export interface PGClient extends PGQueryable {
|
|
|
128
167
|
/** A constructor for {@link (PGClient:interface)} instances */
|
|
129
168
|
export interface PGClientConstructor {
|
|
130
169
|
new (url?: string | URL): PGClient
|
|
131
|
-
new (provider: PGProvider
|
|
170
|
+
new (provider: PGProvider): PGClient
|
|
171
|
+
new (options: PGClientOptions): PGClient
|
|
132
172
|
}
|
|
133
173
|
|
|
134
174
|
/**
|
|
135
175
|
* The PostgreSQL client
|
|
136
|
-
*
|
|
137
|
-
* @constructor
|
|
138
176
|
*/
|
|
139
177
|
export const PGClient: PGClientConstructor = class PGClientImpl implements PGClient {
|
|
140
|
-
readonly
|
|
141
|
-
|
|
142
|
-
private _provider: PGProvider<PGConnection>
|
|
178
|
+
private readonly _registry: Registry = new Registry()
|
|
179
|
+
private readonly _provider: PGProvider
|
|
143
180
|
|
|
144
181
|
constructor(url?: string | URL)
|
|
145
|
-
constructor(provider: PGProvider
|
|
146
|
-
constructor(
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
assert(
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
182
|
+
constructor(provider: PGProvider)
|
|
183
|
+
constructor(options: PGClientOptions)
|
|
184
|
+
constructor(arg?: string | URL | PGClientOptions | PGProvider) {
|
|
185
|
+
// If `arg` is falsy (empty strong or nullish), use the `PGURL` environment
|
|
186
|
+
arg = arg || ((globalThis as any)?.process?.env?.PGURL as string | undefined)
|
|
187
|
+
assert(arg, 'No URL to connect to (PGURL environment variable missing?)')
|
|
188
|
+
|
|
189
|
+
// If `arg` is a string, convert it to a URL (relative to `psql:///`)
|
|
190
|
+
if (typeof arg === 'string') arg = new URL(arg, 'psql:///')
|
|
191
|
+
assert(arg, 'Missing URL or provider for client')
|
|
192
|
+
|
|
193
|
+
// If `arg` is an URL, fill in username and password from environment
|
|
194
|
+
// variables (unless specified) and create a provider from it
|
|
195
|
+
if ('href' in arg) {
|
|
196
|
+
if (!(arg.username || arg.password)) {
|
|
154
197
|
const username = ((globalThis as any)?.process?.env?.PGUSER as string | undefined) || ''
|
|
155
198
|
const password = ((globalThis as any)?.process?.env?.PGPASSWORD as string | undefined) || ''
|
|
156
|
-
|
|
157
|
-
|
|
199
|
+
arg.username = encodeURIComponent(username)
|
|
200
|
+
arg.password = encodeURIComponent(password)
|
|
201
|
+
}
|
|
202
|
+
this._provider = createProvider(arg)
|
|
203
|
+
|
|
204
|
+
// If `arg` is a PGProvider _already_, then use it directly
|
|
205
|
+
} else if (('query' in arg) && ('acquire' in arg) && ('release' in arg)) {
|
|
206
|
+
this._provider = arg
|
|
207
|
+
|
|
208
|
+
// If `arg` is an object, convert it to a URL and create a provider from it
|
|
209
|
+
} else {
|
|
210
|
+
const {
|
|
211
|
+
protocol = 'psql',
|
|
212
|
+
database = '',
|
|
213
|
+
username = ((globalThis as any)?.process?.env?.PGUSER as string | undefined),
|
|
214
|
+
password = ((globalThis as any)?.process?.env?.PGPASSWORD as string | undefined),
|
|
215
|
+
host = 'localhost',
|
|
216
|
+
port,
|
|
217
|
+
parameters = {},
|
|
218
|
+
} = arg
|
|
219
|
+
|
|
220
|
+
const url = new URL(`${protocol}://`)
|
|
221
|
+
if (host) url.hostname = host
|
|
222
|
+
if (port) url.port = String(port)
|
|
223
|
+
if (username) url.username = encodeURIComponent(username)
|
|
224
|
+
if (password) url.password = encodeURIComponent(password)
|
|
225
|
+
url.pathname = `/${database}`
|
|
226
|
+
|
|
227
|
+
for (const [ key, value ] of Object.entries(parameters)) {
|
|
228
|
+
url.searchParams.set(key, String(value))
|
|
158
229
|
}
|
|
230
|
+
|
|
231
|
+
this._provider = createProvider(url)
|
|
159
232
|
}
|
|
233
|
+
}
|
|
160
234
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
235
|
+
get registry(): Registry {
|
|
236
|
+
return this._registry
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
get url(): Readonly<URL> {
|
|
240
|
+
return this._provider.url
|
|
164
241
|
}
|
|
165
242
|
|
|
166
243
|
async query<
|
|
@@ -173,7 +250,6 @@ export const PGClient: PGClientConstructor = class PGClientImpl implements PGCli
|
|
|
173
250
|
Tuple extends readonly any[] = readonly any [],
|
|
174
251
|
>(query: PGQuery): Promise<PGResult<Row, Tuple>>
|
|
175
252
|
|
|
176
|
-
|
|
177
253
|
async query<
|
|
178
254
|
Row extends Record<string, any> = Record<string, any>,
|
|
179
255
|
Tuple extends readonly any[] = readonly any [],
|
|
@@ -181,52 +257,80 @@ export const PGClient: PGClientConstructor = class PGClientImpl implements PGCli
|
|
|
181
257
|
const [ text, params = [] ] = typeof textOrQuery === 'string' ?
|
|
182
258
|
[ textOrQuery, maybeParams ] : [ textOrQuery.query, textOrQuery.params ]
|
|
183
259
|
|
|
184
|
-
|
|
185
260
|
const result = await this._provider.query(text, serializeParams(params))
|
|
186
|
-
return new PGResult<Row, Tuple>(result, this.
|
|
261
|
+
return new PGResult<Row, Tuple>(result, this._registry)
|
|
187
262
|
}
|
|
188
263
|
|
|
189
|
-
async connect<T>(consumer
|
|
264
|
+
async connect<T>(consumer?: PGConsumer<T>): Promise<T | PGConnection> {
|
|
190
265
|
const connection = await this._provider.acquire()
|
|
191
|
-
let transaction = false
|
|
192
|
-
|
|
193
|
-
try {
|
|
194
|
-
const registry = this.registry
|
|
195
|
-
|
|
196
|
-
const consumable: PGTransactionable = {
|
|
197
|
-
async query<
|
|
198
|
-
Row extends Record<string, any> = Record<string, any>,
|
|
199
|
-
Tuple extends readonly any[] = readonly any [],
|
|
200
|
-
>(textOrQuery: string | PGQuery, maybeParams: readonly any[] = []): Promise<PGResult<Row, Tuple>> {
|
|
201
|
-
const [ text, params = [] ] = typeof textOrQuery === 'string' ?
|
|
202
|
-
[ textOrQuery, maybeParams ] : [ textOrQuery.query, textOrQuery.params ]
|
|
203
|
-
|
|
204
|
-
const result = await connection.query(text, serializeParams(params))
|
|
205
|
-
return new PGResult(result, registry)
|
|
206
|
-
},
|
|
207
|
-
async begin(): Promise<boolean> {
|
|
208
|
-
if (transaction) return false
|
|
209
|
-
await connection.query('BEGIN')
|
|
210
|
-
return transaction = true
|
|
211
|
-
},
|
|
212
|
-
async commit(): Promise<void> {
|
|
213
|
-
await connection.query('COMMIT')
|
|
214
|
-
transaction = false
|
|
215
|
-
},
|
|
216
|
-
async rollback(): Promise<void> {
|
|
217
|
-
await connection.query('ROLLBACK')
|
|
218
|
-
transaction = false
|
|
219
|
-
},
|
|
220
|
-
}
|
|
221
266
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
await this._provider.
|
|
267
|
+
if (! consumer) {
|
|
268
|
+
return new PGConnectionImpl(connection, this._provider, this._registry)
|
|
269
|
+
} else {
|
|
270
|
+
await using conn = new PGConnectionImpl(connection, this._provider, this._registry)
|
|
271
|
+
return await consumer(conn)
|
|
226
272
|
}
|
|
227
273
|
}
|
|
228
274
|
|
|
229
275
|
async destroy(): Promise<void> {
|
|
230
276
|
return await this._provider.destroy()
|
|
231
277
|
}
|
|
278
|
+
|
|
279
|
+
async [Symbol.asyncDispose](): Promise<void> {
|
|
280
|
+
await this.destroy()
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/* ===== INTERNAL IMPLEMENTATIONS =========================================== */
|
|
285
|
+
|
|
286
|
+
class PGConnectionImpl implements PGConnection {
|
|
287
|
+
private _transaction: boolean = false
|
|
288
|
+
private readonly _connection: PGProviderConnection
|
|
289
|
+
private readonly _provider: PGProvider
|
|
290
|
+
private readonly _registry: Registry
|
|
291
|
+
|
|
292
|
+
constructor(
|
|
293
|
+
connection: PGProviderConnection,
|
|
294
|
+
provider: PGProvider,
|
|
295
|
+
registry: Registry) {
|
|
296
|
+
this._connection = connection
|
|
297
|
+
this._provider = provider
|
|
298
|
+
this._registry = registry
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
async query<
|
|
302
|
+
Row extends Record<string, any> = Record<string, any>,
|
|
303
|
+
Tuple extends readonly any[] = readonly any [],
|
|
304
|
+
>(textOrQuery: string | PGQuery, maybeParams: readonly any[] = []): Promise<PGResult<Row, Tuple>> {
|
|
305
|
+
const [ text, params = [] ] = typeof textOrQuery === 'string' ?
|
|
306
|
+
[ textOrQuery, maybeParams ] : [ textOrQuery.query, textOrQuery.params ]
|
|
307
|
+
|
|
308
|
+
const result = await this._connection.query(text, serializeParams(params))
|
|
309
|
+
return new PGResult(result, this._registry)
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
async begin(): Promise<boolean> {
|
|
313
|
+
if (this._transaction) return false
|
|
314
|
+
await this._connection.query('BEGIN')
|
|
315
|
+
return this._transaction = true
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
async commit(): Promise<void> {
|
|
319
|
+
await this._connection.query('COMMIT')
|
|
320
|
+
this._transaction = false
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
async rollback(): Promise<void> {
|
|
324
|
+
await this._connection.query('ROLLBACK')
|
|
325
|
+
this._transaction = false
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
async close(): Promise<void> {
|
|
329
|
+
if (this._transaction) await this._connection.query('ROLLBACK')
|
|
330
|
+
await this._provider.release(this._connection)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
[Symbol.asyncDispose](): Promise<void> {
|
|
334
|
+
return this.close()
|
|
335
|
+
}
|
|
232
336
|
}
|