@juit/pgproxy-client 1.0.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 +136 -0
- package/dist/assert.cjs +34 -0
- package/dist/assert.cjs.map +6 -0
- package/dist/assert.d.ts +2 -0
- package/dist/assert.mjs +9 -0
- package/dist/assert.mjs.map +6 -0
- package/dist/client.cjs +97 -0
- package/dist/client.cjs.map +6 -0
- package/dist/client.d.ts +67 -0
- package/dist/client.mjs +72 -0
- package/dist/client.mjs.map +6 -0
- package/dist/index.cjs +33 -0
- package/dist/index.cjs.map +6 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.mjs +7 -0
- package/dist/index.mjs.map +6 -0
- package/dist/provider.cjs +59 -0
- package/dist/provider.cjs.map +6 -0
- package/dist/provider.d.ts +33 -0
- package/dist/provider.mjs +32 -0
- package/dist/provider.mjs.map +6 -0
- package/dist/result.cjs +59 -0
- package/dist/result.cjs.map +6 -0
- package/dist/result.d.ts +30 -0
- package/dist/result.mjs +34 -0
- package/dist/result.mjs.map +6 -0
- package/dist/websocket.cjs +184 -0
- package/dist/websocket.cjs.map +6 -0
- package/dist/websocket.d.ts +60 -0
- package/dist/websocket.mjs +159 -0
- package/dist/websocket.mjs.map +6 -0
- package/package.json +47 -0
- package/src/assert.ts +4 -0
- package/src/client.ts +172 -0
- package/src/index.ts +5 -0
- package/src/provider.ts +80 -0
- package/src/result.ts +83 -0
- package/src/websocket.ts +269 -0
package/dist/result.cjs
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// result.ts
|
|
21
|
+
var result_exports = {};
|
|
22
|
+
__export(result_exports, {
|
|
23
|
+
PGResult: () => PGResult
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(result_exports);
|
|
26
|
+
var PGResult = class PGResultImpl {
|
|
27
|
+
command;
|
|
28
|
+
fields;
|
|
29
|
+
rowCount;
|
|
30
|
+
rows;
|
|
31
|
+
tuples;
|
|
32
|
+
constructor(result, registry) {
|
|
33
|
+
this.rowCount = result.rowCount;
|
|
34
|
+
this.command = result.command;
|
|
35
|
+
this.fields = result.fields.map(([name, oid]) => ({ name, oid }));
|
|
36
|
+
const rowCount = result.rows.length;
|
|
37
|
+
const colCount = result.fields.length;
|
|
38
|
+
const mappers = result.fields.map(([name, oid]) => [
|
|
39
|
+
name,
|
|
40
|
+
registry.getParser(oid)
|
|
41
|
+
]);
|
|
42
|
+
const rows = this.rows = new Array(rowCount);
|
|
43
|
+
const tuples = this.tuples = new Array(rowCount);
|
|
44
|
+
for (let row = 0; row < rowCount; row++) {
|
|
45
|
+
const tupleData = tuples[row] = new Array(colCount);
|
|
46
|
+
const rowData = rows[row] = {};
|
|
47
|
+
for (let col = 0; col < colCount; col++) {
|
|
48
|
+
const [name, parser] = mappers[col];
|
|
49
|
+
const value = result.rows[row][col];
|
|
50
|
+
tupleData[col] = rowData[name] = value === null ? null : value === void 0 ? null : parser(value);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
56
|
+
0 && (module.exports = {
|
|
57
|
+
PGResult
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=result.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 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;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
package/dist/result.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Registry } from '@juit/pgproxy-types';
|
|
2
|
+
import type { PGConnectionResult } from './provider';
|
|
3
|
+
/** The result of a database query */
|
|
4
|
+
export interface PGResult<Row extends Record<string, any> = Record<string, any>, Tuple extends readonly any[] = readonly any[]> {
|
|
5
|
+
/** The SQL command that generated this result (`SELECT`, `INSERT`, ...) */
|
|
6
|
+
command: string;
|
|
7
|
+
/** Result description describing column names and relative OIDs */
|
|
8
|
+
fields: {
|
|
9
|
+
name: string;
|
|
10
|
+
oid: number;
|
|
11
|
+
}[];
|
|
12
|
+
/**
|
|
13
|
+
* The number of rows affected by the query.
|
|
14
|
+
*
|
|
15
|
+
* This can be the number of lines returned in `rows` (for `SELECT`
|
|
16
|
+
* statements, for example) or the number of lines _affected_ by the query
|
|
17
|
+
* (the number of records inserted by an `INSERT` query).
|
|
18
|
+
*/
|
|
19
|
+
rowCount: number;
|
|
20
|
+
/** The rows returned by the database query, keyed by the column name. */
|
|
21
|
+
rows: Row[];
|
|
22
|
+
/** The tuples returned by the database query, keyed by the column index. */
|
|
23
|
+
tuples: Tuple[];
|
|
24
|
+
}
|
|
25
|
+
/** Constructor for {@link (PGResult:interface)} instances */
|
|
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>;
|
|
28
|
+
}
|
|
29
|
+
/** The result of a database query */
|
|
30
|
+
export declare const PGResult: PGResultConstructor;
|
package/dist/result.mjs
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// result.ts
|
|
2
|
+
var PGResult = class PGResultImpl {
|
|
3
|
+
command;
|
|
4
|
+
fields;
|
|
5
|
+
rowCount;
|
|
6
|
+
rows;
|
|
7
|
+
tuples;
|
|
8
|
+
constructor(result, registry) {
|
|
9
|
+
this.rowCount = result.rowCount;
|
|
10
|
+
this.command = result.command;
|
|
11
|
+
this.fields = result.fields.map(([name, oid]) => ({ name, oid }));
|
|
12
|
+
const rowCount = result.rows.length;
|
|
13
|
+
const colCount = result.fields.length;
|
|
14
|
+
const mappers = result.fields.map(([name, oid]) => [
|
|
15
|
+
name,
|
|
16
|
+
registry.getParser(oid)
|
|
17
|
+
]);
|
|
18
|
+
const rows = this.rows = new Array(rowCount);
|
|
19
|
+
const tuples = this.tuples = new Array(rowCount);
|
|
20
|
+
for (let row = 0; row < rowCount; row++) {
|
|
21
|
+
const tupleData = tuples[row] = new Array(colCount);
|
|
22
|
+
const rowData = rows[row] = {};
|
|
23
|
+
for (let col = 0; col < colCount; col++) {
|
|
24
|
+
const [name, parser] = mappers[col];
|
|
25
|
+
const value = result.rows[row][col];
|
|
26
|
+
tupleData[col] = rowData[name] = value === null ? null : value === void 0 ? null : parser(value);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
export {
|
|
32
|
+
PGResult
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=result.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 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;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// websocket.ts
|
|
21
|
+
var websocket_exports = {};
|
|
22
|
+
__export(websocket_exports, {
|
|
23
|
+
WebSocketProvider: () => WebSocketProvider
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(websocket_exports);
|
|
26
|
+
var import_assert = require("./assert.cjs");
|
|
27
|
+
var pgWebSocketReadyState = {
|
|
28
|
+
CONNECTING: 0,
|
|
29
|
+
OPEN: 1,
|
|
30
|
+
CLOSING: 2,
|
|
31
|
+
CLOSED: 3
|
|
32
|
+
};
|
|
33
|
+
function msg(message, defaultMessage) {
|
|
34
|
+
return message || defaultMessage;
|
|
35
|
+
}
|
|
36
|
+
var WebSocketRequest = class {
|
|
37
|
+
constructor(id) {
|
|
38
|
+
this.id = id;
|
|
39
|
+
this.promise = new Promise((resolve, reject) => Object.defineProperties(this, {
|
|
40
|
+
resolve: { value: resolve },
|
|
41
|
+
reject: { value: reject }
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
promise;
|
|
45
|
+
resolve;
|
|
46
|
+
reject;
|
|
47
|
+
};
|
|
48
|
+
var WebSocketConnectionImpl = class {
|
|
49
|
+
constructor(_socket, _getRequestId) {
|
|
50
|
+
this._socket = _socket;
|
|
51
|
+
this._getRequestId = _getRequestId;
|
|
52
|
+
_socket.addEventListener("close", (event) => {
|
|
53
|
+
if (!this._error) {
|
|
54
|
+
const reason = msg(event.reason, "Unknown Reason");
|
|
55
|
+
const message = `WebSocket Closed (${event.code}): ${reason}`;
|
|
56
|
+
this._error = new Error(message);
|
|
57
|
+
}
|
|
58
|
+
for (const req of this._requests.values())
|
|
59
|
+
req.reject(this._error);
|
|
60
|
+
this._requests.clear();
|
|
61
|
+
});
|
|
62
|
+
_socket.addEventListener("error", (event) => {
|
|
63
|
+
if (event.error)
|
|
64
|
+
this._error = event.error;
|
|
65
|
+
else
|
|
66
|
+
this._error = new Error("Unknown WebSocket Error");
|
|
67
|
+
for (const req of this._requests.values())
|
|
68
|
+
req.reject(this._error);
|
|
69
|
+
this._requests.clear();
|
|
70
|
+
this.close();
|
|
71
|
+
});
|
|
72
|
+
_socket.addEventListener("message", (event) => {
|
|
73
|
+
try {
|
|
74
|
+
const data = event.data;
|
|
75
|
+
(0, import_assert.assert)(typeof data === "string", 'Data not a "string"');
|
|
76
|
+
let payload;
|
|
77
|
+
try {
|
|
78
|
+
payload = JSON.parse(data);
|
|
79
|
+
} catch (error) {
|
|
80
|
+
throw new Error("Unable to parse JSON payload");
|
|
81
|
+
}
|
|
82
|
+
(0, import_assert.assert)(payload && typeof payload === "object", "JSON payload is not an object");
|
|
83
|
+
const request = this._requests.get(payload.id);
|
|
84
|
+
(0, import_assert.assert)(request, `Invalid response ID "${payload.id}"`);
|
|
85
|
+
if (payload.statusCode === 200) {
|
|
86
|
+
this._requests.delete(payload.id);
|
|
87
|
+
return request.resolve(payload);
|
|
88
|
+
} else if (payload.statusCode === 400) {
|
|
89
|
+
this._requests.delete(payload.id);
|
|
90
|
+
return request.reject(new Error(`${msg(payload.error, "Unknown error")} (${payload.statusCode})`));
|
|
91
|
+
} else {
|
|
92
|
+
throw new Error(`${msg(payload.error, "Unknown error")} (${payload.statusCode})`);
|
|
93
|
+
}
|
|
94
|
+
} catch (error) {
|
|
95
|
+
_socket.close(1003, msg(error.message, "Uknown error"));
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/** Open requests to correlate, keyed by their unique request id */
|
|
100
|
+
_requests = /* @__PURE__ */ new Map();
|
|
101
|
+
/** Our error, set also when the websocket is closed */
|
|
102
|
+
_error;
|
|
103
|
+
close() {
|
|
104
|
+
if (this._socket.readyState === pgWebSocketReadyState.CLOSED)
|
|
105
|
+
return;
|
|
106
|
+
if (this._socket.readyState === pgWebSocketReadyState.CLOSING)
|
|
107
|
+
return;
|
|
108
|
+
this._socket.close(1e3, "Normal termination");
|
|
109
|
+
}
|
|
110
|
+
query(query, params) {
|
|
111
|
+
if (this._error)
|
|
112
|
+
return Promise.reject(this._error);
|
|
113
|
+
return new Promise((resolve, reject) => {
|
|
114
|
+
const id = this._getRequestId();
|
|
115
|
+
const request = new WebSocketRequest(id);
|
|
116
|
+
this._requests.set(id, request);
|
|
117
|
+
request.promise.then(resolve, reject);
|
|
118
|
+
try {
|
|
119
|
+
this._socket.send(JSON.stringify({ id, query, params }));
|
|
120
|
+
} catch (error) {
|
|
121
|
+
reject(error);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
var WebSocketProvider = class {
|
|
127
|
+
_connections = /* @__PURE__ */ new Set();
|
|
128
|
+
/**
|
|
129
|
+
* Handle the initial connection of a WebSocket.
|
|
130
|
+
*
|
|
131
|
+
* This method should be called _synchronously_ by {@link WebSocketProvider._getWebSocket} as
|
|
132
|
+
* soon as the WebSocket instance is created.
|
|
133
|
+
*/
|
|
134
|
+
_connectWebSocket(socket) {
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
if (socket.readyState === pgWebSocketReadyState.OPEN)
|
|
137
|
+
return resolve(socket);
|
|
138
|
+
if (socket.readyState !== pgWebSocketReadyState.CONNECTING) {
|
|
139
|
+
return reject(new Error(`Invalid WebSocket ready state ${socket.readyState}`));
|
|
140
|
+
}
|
|
141
|
+
const onopen = () => {
|
|
142
|
+
removeEventListeners();
|
|
143
|
+
resolve(socket);
|
|
144
|
+
};
|
|
145
|
+
const onerror = (event) => {
|
|
146
|
+
removeEventListeners();
|
|
147
|
+
if ("error" in event)
|
|
148
|
+
return reject(event.error);
|
|
149
|
+
reject(new Error("Uknown error opening WebSocket"));
|
|
150
|
+
};
|
|
151
|
+
const onclose = (event) => {
|
|
152
|
+
removeEventListeners();
|
|
153
|
+
reject(new Error(`Connection closed with code ${event.code}: ${event.reason}`));
|
|
154
|
+
};
|
|
155
|
+
const removeEventListeners = () => {
|
|
156
|
+
socket.removeEventListener("open", onopen);
|
|
157
|
+
socket.removeEventListener("error", onerror);
|
|
158
|
+
socket.removeEventListener("close", onclose);
|
|
159
|
+
};
|
|
160
|
+
socket.addEventListener("open", onopen);
|
|
161
|
+
socket.addEventListener("error", onerror);
|
|
162
|
+
socket.addEventListener("close", onclose);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
async acquire() {
|
|
166
|
+
const socket = await this._getWebSocket();
|
|
167
|
+
const connection = new WebSocketConnectionImpl(socket, () => this._getUniqueRequestId());
|
|
168
|
+
this._connections.add(connection);
|
|
169
|
+
return connection;
|
|
170
|
+
}
|
|
171
|
+
async release(connection) {
|
|
172
|
+
this._connections.delete(connection);
|
|
173
|
+
connection.close();
|
|
174
|
+
}
|
|
175
|
+
async destroy() {
|
|
176
|
+
this._connections.forEach((connection) => connection.close());
|
|
177
|
+
this._connections.clear();
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
181
|
+
0 && (module.exports = {
|
|
182
|
+
WebSocketProvider
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=websocket.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/websocket.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { PGConnection, PGConnectionResult, PGProvider } from './provider';
|
|
2
|
+
interface PGWebSocketCloseEvent {
|
|
3
|
+
readonly code: number;
|
|
4
|
+
readonly reason: string;
|
|
5
|
+
}
|
|
6
|
+
interface PGWebSocketMessageEvent {
|
|
7
|
+
readonly data?: any;
|
|
8
|
+
}
|
|
9
|
+
interface PGWebSocketErrorEvent {
|
|
10
|
+
readonly error?: any;
|
|
11
|
+
}
|
|
12
|
+
export interface PGWebSocket {
|
|
13
|
+
addEventListener(event: 'close', handler: (event: PGWebSocketCloseEvent) => void): void;
|
|
14
|
+
addEventListener(event: 'error', handler: (event: PGWebSocketErrorEvent) => void): void;
|
|
15
|
+
addEventListener(event: 'message', handler: (event: PGWebSocketMessageEvent) => void): void;
|
|
16
|
+
addEventListener(event: 'open', handler: () => void): void;
|
|
17
|
+
removeEventListener(event: 'close', handler: (event: PGWebSocketCloseEvent) => void): void;
|
|
18
|
+
removeEventListener(event: 'error', handler: (event: PGWebSocketErrorEvent) => void): void;
|
|
19
|
+
removeEventListener(event: 'message', handler: (event: PGWebSocketMessageEvent) => void): void;
|
|
20
|
+
removeEventListener(event: 'open', handler: () => void): void;
|
|
21
|
+
readonly readyState: number;
|
|
22
|
+
send(message: string): void;
|
|
23
|
+
close(code?: number, reason?: string): void;
|
|
24
|
+
}
|
|
25
|
+
/** A connection to the database backed by a `WebSocket` */
|
|
26
|
+
export interface WebSocketConnection extends PGConnection {
|
|
27
|
+
/** Close this connection and the underlying `WebSocket` */
|
|
28
|
+
close(): void;
|
|
29
|
+
}
|
|
30
|
+
/** An abstract provider implementing `connect(...)` via WHATWG WebSockets */
|
|
31
|
+
export declare abstract class WebSocketProvider implements PGProvider<WebSocketConnection> {
|
|
32
|
+
private readonly _connections;
|
|
33
|
+
abstract query(text: string, params: (string | null)[]): Promise<PGConnectionResult>;
|
|
34
|
+
/** Return a unique request identifier to correlate responses */
|
|
35
|
+
protected abstract _getUniqueRequestId(): string;
|
|
36
|
+
/**
|
|
37
|
+
* Create a new WebSocket.
|
|
38
|
+
*
|
|
39
|
+
* This method can be asynchronous and can return a `Promise`. This is
|
|
40
|
+
* due to the fact that in order to create our authentication token with the
|
|
41
|
+
* Web Cryptography API, we need to _await_ the resolution of our token.
|
|
42
|
+
*
|
|
43
|
+
* This method should call _synchronously_ the {@link WebSocketProvider._connectWebSocket}
|
|
44
|
+
* as soon as the WebSocket instance is created, in order to handle `open`,
|
|
45
|
+
* `close`, or `error` events before the event loop has a chance to resolve
|
|
46
|
+
* the `Promise` asynchronously.
|
|
47
|
+
*/
|
|
48
|
+
protected abstract _getWebSocket(): Promise<PGWebSocket>;
|
|
49
|
+
/**
|
|
50
|
+
* Handle the initial connection of a WebSocket.
|
|
51
|
+
*
|
|
52
|
+
* This method should be called _synchronously_ by {@link WebSocketProvider._getWebSocket} as
|
|
53
|
+
* soon as the WebSocket instance is created.
|
|
54
|
+
*/
|
|
55
|
+
protected _connectWebSocket<S extends PGWebSocket>(socket: S): Promise<S>;
|
|
56
|
+
acquire(): Promise<WebSocketConnection>;
|
|
57
|
+
release(connection: WebSocketConnection): Promise<void>;
|
|
58
|
+
destroy(): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
export {};
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// websocket.ts
|
|
2
|
+
import { assert } from "./assert.mjs";
|
|
3
|
+
var pgWebSocketReadyState = {
|
|
4
|
+
CONNECTING: 0,
|
|
5
|
+
OPEN: 1,
|
|
6
|
+
CLOSING: 2,
|
|
7
|
+
CLOSED: 3
|
|
8
|
+
};
|
|
9
|
+
function msg(message, defaultMessage) {
|
|
10
|
+
return message || defaultMessage;
|
|
11
|
+
}
|
|
12
|
+
var WebSocketRequest = class {
|
|
13
|
+
constructor(id) {
|
|
14
|
+
this.id = id;
|
|
15
|
+
this.promise = new Promise((resolve, reject) => Object.defineProperties(this, {
|
|
16
|
+
resolve: { value: resolve },
|
|
17
|
+
reject: { value: reject }
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
promise;
|
|
21
|
+
resolve;
|
|
22
|
+
reject;
|
|
23
|
+
};
|
|
24
|
+
var WebSocketConnectionImpl = class {
|
|
25
|
+
constructor(_socket, _getRequestId) {
|
|
26
|
+
this._socket = _socket;
|
|
27
|
+
this._getRequestId = _getRequestId;
|
|
28
|
+
_socket.addEventListener("close", (event) => {
|
|
29
|
+
if (!this._error) {
|
|
30
|
+
const reason = msg(event.reason, "Unknown Reason");
|
|
31
|
+
const message = `WebSocket Closed (${event.code}): ${reason}`;
|
|
32
|
+
this._error = new Error(message);
|
|
33
|
+
}
|
|
34
|
+
for (const req of this._requests.values())
|
|
35
|
+
req.reject(this._error);
|
|
36
|
+
this._requests.clear();
|
|
37
|
+
});
|
|
38
|
+
_socket.addEventListener("error", (event) => {
|
|
39
|
+
if (event.error)
|
|
40
|
+
this._error = event.error;
|
|
41
|
+
else
|
|
42
|
+
this._error = new Error("Unknown WebSocket Error");
|
|
43
|
+
for (const req of this._requests.values())
|
|
44
|
+
req.reject(this._error);
|
|
45
|
+
this._requests.clear();
|
|
46
|
+
this.close();
|
|
47
|
+
});
|
|
48
|
+
_socket.addEventListener("message", (event) => {
|
|
49
|
+
try {
|
|
50
|
+
const data = event.data;
|
|
51
|
+
assert(typeof data === "string", 'Data not a "string"');
|
|
52
|
+
let payload;
|
|
53
|
+
try {
|
|
54
|
+
payload = JSON.parse(data);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
throw new Error("Unable to parse JSON payload");
|
|
57
|
+
}
|
|
58
|
+
assert(payload && typeof payload === "object", "JSON payload is not an object");
|
|
59
|
+
const request = this._requests.get(payload.id);
|
|
60
|
+
assert(request, `Invalid response ID "${payload.id}"`);
|
|
61
|
+
if (payload.statusCode === 200) {
|
|
62
|
+
this._requests.delete(payload.id);
|
|
63
|
+
return request.resolve(payload);
|
|
64
|
+
} else if (payload.statusCode === 400) {
|
|
65
|
+
this._requests.delete(payload.id);
|
|
66
|
+
return request.reject(new Error(`${msg(payload.error, "Unknown error")} (${payload.statusCode})`));
|
|
67
|
+
} else {
|
|
68
|
+
throw new Error(`${msg(payload.error, "Unknown error")} (${payload.statusCode})`);
|
|
69
|
+
}
|
|
70
|
+
} catch (error) {
|
|
71
|
+
_socket.close(1003, msg(error.message, "Uknown error"));
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** Open requests to correlate, keyed by their unique request id */
|
|
76
|
+
_requests = /* @__PURE__ */ new Map();
|
|
77
|
+
/** Our error, set also when the websocket is closed */
|
|
78
|
+
_error;
|
|
79
|
+
close() {
|
|
80
|
+
if (this._socket.readyState === pgWebSocketReadyState.CLOSED)
|
|
81
|
+
return;
|
|
82
|
+
if (this._socket.readyState === pgWebSocketReadyState.CLOSING)
|
|
83
|
+
return;
|
|
84
|
+
this._socket.close(1e3, "Normal termination");
|
|
85
|
+
}
|
|
86
|
+
query(query, params) {
|
|
87
|
+
if (this._error)
|
|
88
|
+
return Promise.reject(this._error);
|
|
89
|
+
return new Promise((resolve, reject) => {
|
|
90
|
+
const id = this._getRequestId();
|
|
91
|
+
const request = new WebSocketRequest(id);
|
|
92
|
+
this._requests.set(id, request);
|
|
93
|
+
request.promise.then(resolve, reject);
|
|
94
|
+
try {
|
|
95
|
+
this._socket.send(JSON.stringify({ id, query, params }));
|
|
96
|
+
} catch (error) {
|
|
97
|
+
reject(error);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
var WebSocketProvider = class {
|
|
103
|
+
_connections = /* @__PURE__ */ new Set();
|
|
104
|
+
/**
|
|
105
|
+
* Handle the initial connection of a WebSocket.
|
|
106
|
+
*
|
|
107
|
+
* This method should be called _synchronously_ by {@link WebSocketProvider._getWebSocket} as
|
|
108
|
+
* soon as the WebSocket instance is created.
|
|
109
|
+
*/
|
|
110
|
+
_connectWebSocket(socket) {
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
if (socket.readyState === pgWebSocketReadyState.OPEN)
|
|
113
|
+
return resolve(socket);
|
|
114
|
+
if (socket.readyState !== pgWebSocketReadyState.CONNECTING) {
|
|
115
|
+
return reject(new Error(`Invalid WebSocket ready state ${socket.readyState}`));
|
|
116
|
+
}
|
|
117
|
+
const onopen = () => {
|
|
118
|
+
removeEventListeners();
|
|
119
|
+
resolve(socket);
|
|
120
|
+
};
|
|
121
|
+
const onerror = (event) => {
|
|
122
|
+
removeEventListeners();
|
|
123
|
+
if ("error" in event)
|
|
124
|
+
return reject(event.error);
|
|
125
|
+
reject(new Error("Uknown error opening WebSocket"));
|
|
126
|
+
};
|
|
127
|
+
const onclose = (event) => {
|
|
128
|
+
removeEventListeners();
|
|
129
|
+
reject(new Error(`Connection closed with code ${event.code}: ${event.reason}`));
|
|
130
|
+
};
|
|
131
|
+
const removeEventListeners = () => {
|
|
132
|
+
socket.removeEventListener("open", onopen);
|
|
133
|
+
socket.removeEventListener("error", onerror);
|
|
134
|
+
socket.removeEventListener("close", onclose);
|
|
135
|
+
};
|
|
136
|
+
socket.addEventListener("open", onopen);
|
|
137
|
+
socket.addEventListener("error", onerror);
|
|
138
|
+
socket.addEventListener("close", onclose);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
async acquire() {
|
|
142
|
+
const socket = await this._getWebSocket();
|
|
143
|
+
const connection = new WebSocketConnectionImpl(socket, () => this._getUniqueRequestId());
|
|
144
|
+
this._connections.add(connection);
|
|
145
|
+
return connection;
|
|
146
|
+
}
|
|
147
|
+
async release(connection) {
|
|
148
|
+
this._connections.delete(connection);
|
|
149
|
+
connection.close();
|
|
150
|
+
}
|
|
151
|
+
async destroy() {
|
|
152
|
+
this._connections.forEach((connection) => connection.close());
|
|
153
|
+
this._connections.clear();
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
export {
|
|
157
|
+
WebSocketProvider
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=websocket.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/websocket.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@juit/pgproxy-client",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "./dist/index.cjs",
|
|
5
|
+
"module": "./dist/index.mjs",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"require": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.cjs"
|
|
12
|
+
},
|
|
13
|
+
"import": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.mjs"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"author": "Juit Developers <developers@juit.com>",
|
|
20
|
+
"license": "Apache-2.0",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+ssh://git@github.com/juitnow/juit-pgproxy.git"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"database",
|
|
27
|
+
"pg",
|
|
28
|
+
"pool",
|
|
29
|
+
"postgres",
|
|
30
|
+
"proxy"
|
|
31
|
+
],
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/juitnow/juit-pgproxy/issues"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/juitnow/juit-pgproxy#readme",
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@juit/pgproxy-types": "1.0.0"
|
|
38
|
+
},
|
|
39
|
+
"directories": {
|
|
40
|
+
"test": "test"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"*.md",
|
|
44
|
+
"dist/",
|
|
45
|
+
"src/"
|
|
46
|
+
]
|
|
47
|
+
}
|
package/src/assert.ts
ADDED