@juit/pgproxy-client 1.2.1 → 1.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.
@@ -1,5 +1,5 @@
1
1
  /** Describes the result of a query from a {@link PGProvider} */
2
- export interface PGConnectionResult {
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 PGConnection {
13
- query(text: string, params?: (string | null)[]): Promise<PGConnectionResult>;
12
+ export interface PGProviderConnection {
13
+ query(text: string, params?: (string | null)[]): Promise<PGProviderResult>;
14
14
  }
15
- export interface PGProviderConstructor<Connection extends PGConnection> {
15
+ export interface PGProviderConstructor<Connection extends PGProviderConnection = PGProviderConnection> {
16
16
  new (url: URL): PGProvider<Connection>;
17
17
  }
18
- export interface PGProvider<Connection extends PGConnection> extends PGConnection {
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 PGConnection> implements PGProvider<Connection> {
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: PGConnection): Promise<void>;
26
- query(text: string, params?: (string | null)[]): Promise<PGConnectionResult>;
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<PGConnection>): void;
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<PGConnection>;
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 {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/provider.ts"],
4
- "mappings": ";AAAA,SAAS,cAAc;AAqChB,IAAe,qBAAf,MAC2B;AAAA,EAIhC,MAAM,MAAM,MAAc,SAA4B,CAAC,GAAgC;AACrF,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;AAOA,IAAM,YAAY,oBAAI,IAAiD;AAGhE,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,KAAoC;AACjE,QAAM,WAAW,UAAU,IAAI,IAAI,QAAQ;AAC3C,SAAO,UAAU,0CAA0C,IAAI,QAAQ,MAAM;AAC7E,SAAO,IAAI,SAAS,GAAG;AACzB;",
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
  }
@@ -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,QAA4B,UAAoB;AAC1D,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;",
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 { PGConnectionResult } from './provider';
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: PGConnectionResult, registry: Registry): PGResult<Row, Tuple>;
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;
@@ -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,QAA4B,UAAoB;AAC1D,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;",
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
  }
@@ -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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/websocket.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -1,4 +1,5 @@
1
- import type { PGConnection, PGConnectionResult, PGProvider } from './provider';
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 PGConnection {
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<PGConnectionResult>;
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
  /**
@@ -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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/websocket.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juit/pgproxy-client",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
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.2.1"
38
+ "@juit/pgproxy-types": "1.3.0"
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 { PGConnection, PGProvider } from './provider'
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<PGConnection>): PGClient
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 registry: Registry = new Registry()
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<PGConnection>)
146
- constructor(urlOrProvider?: string | URL | PGProvider<PGConnection>) {
147
- urlOrProvider = urlOrProvider || ((globalThis as any)?.process?.env?.PGURL as string | undefined)
148
- assert(urlOrProvider, 'No URL to connect to (PGURL environment variable missing?)')
149
- if (typeof urlOrProvider === 'string') urlOrProvider = new URL(urlOrProvider, 'psql:///')
150
- assert(urlOrProvider, 'Missing URL or provider for client')
151
-
152
- if (urlOrProvider instanceof URL) {
153
- if (!(urlOrProvider.username || urlOrProvider.password)) {
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
- urlOrProvider.username = encodeURIComponent(username)
157
- urlOrProvider.password = encodeURIComponent(password)
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
- this._provider = urlOrProvider instanceof URL ?
162
- createProvider(urlOrProvider) :
163
- urlOrProvider
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.registry)
261
+ return new PGResult<Row, Tuple>(result, this._registry)
187
262
  }
188
263
 
189
- async connect<T>(consumer: PGConsumer<T>): Promise<T> {
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
- return await consumer(consumable)
223
- } finally {
224
- if (transaction) await connection.query('ROLLBACK')
225
- await this._provider.release(connection)
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
  }