@juit/pgproxy-pool 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 +8 -0
- package/dist/connection.cjs +309 -0
- package/dist/connection.cjs.map +6 -0
- package/dist/connection.d.ts +112 -0
- package/dist/connection.mjs +273 -0
- package/dist/connection.mjs.map +6 -0
- package/dist/events.cjs +56 -0
- package/dist/events.cjs.map +6 -0
- package/dist/events.d.ts +16 -0
- package/dist/events.mjs +31 -0
- package/dist/events.mjs.map +6 -0
- package/dist/index.cjs +34 -0
- package/dist/index.cjs.map +6 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.mjs +8 -0
- package/dist/index.mjs.map +6 -0
- package/dist/libpq.cjs +32 -0
- package/dist/libpq.cjs.map +6 -0
- package/dist/libpq.d.ts +6 -0
- package/dist/libpq.mjs +7 -0
- package/dist/libpq.mjs.map +6 -0
- package/dist/pool.cjs +486 -0
- package/dist/pool.cjs.map +6 -0
- package/dist/pool.d.ts +159 -0
- package/dist/pool.mjs +451 -0
- package/dist/pool.mjs.map +6 -0
- package/dist/queue.cjs +70 -0
- package/dist/queue.cjs.map +6 -0
- package/dist/queue.d.ts +7 -0
- package/dist/queue.mjs +45 -0
- package/dist/queue.mjs.map +6 -0
- package/package.json +47 -0
- package/src/connection.ts +494 -0
- package/src/events.ts +42 -0
- package/src/index.ts +17 -0
- package/src/libpq.ts +10 -0
- package/src/pool.ts +683 -0
- package/src/queue.ts +47 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
// connection.ts
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { Emitter } from "./events.mjs";
|
|
5
|
+
import { LibPQ } from "./libpq.mjs";
|
|
6
|
+
import { Queue } from "./queue.mjs";
|
|
7
|
+
var optionKeys = {
|
|
8
|
+
address: "hostaddr",
|
|
9
|
+
applicationName: "application_name",
|
|
10
|
+
connectTimeout: "connect_timeout",
|
|
11
|
+
database: "dbname",
|
|
12
|
+
gssLibrary: "gsslib",
|
|
13
|
+
host: "host",
|
|
14
|
+
keepalives: "keepalives",
|
|
15
|
+
keepalivesCount: "keepalives_count",
|
|
16
|
+
keepalivesIdle: "keepalives_idle",
|
|
17
|
+
keepalivesInterval: "keepalives_interval",
|
|
18
|
+
kerberosServiceName: "krbsrvname",
|
|
19
|
+
password: "password",
|
|
20
|
+
port: "port",
|
|
21
|
+
sslCertFile: "sslcert",
|
|
22
|
+
sslCompression: "sslcompression",
|
|
23
|
+
sslCrlFile: "sslcrl",
|
|
24
|
+
sslKeyFile: "sslkey",
|
|
25
|
+
sslMode: "sslmode",
|
|
26
|
+
sslRootCertFile: "sslrootcert",
|
|
27
|
+
user: "user"
|
|
28
|
+
};
|
|
29
|
+
function quoteParamValue(value) {
|
|
30
|
+
value = value.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
|
|
31
|
+
return `'${value}'`;
|
|
32
|
+
}
|
|
33
|
+
var finalizer = new FinalizationRegistry(
|
|
34
|
+
/* coverage ignore next */
|
|
35
|
+
(pq) => {
|
|
36
|
+
pq.finish();
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
function convertOptions(options) {
|
|
40
|
+
const params = [];
|
|
41
|
+
for (const [option, value] of Object.entries(options)) {
|
|
42
|
+
if (value == null)
|
|
43
|
+
continue;
|
|
44
|
+
const key = optionKeys[option];
|
|
45
|
+
if (!key)
|
|
46
|
+
continue;
|
|
47
|
+
const string = typeof value === "boolean" ? value ? "1" : "0" : typeof value === "number" ? value.toString() : typeof value === "string" ? value : (
|
|
48
|
+
/* coverage ignore next */
|
|
49
|
+
assert.fail(`Invalid type for option ${option}`)
|
|
50
|
+
);
|
|
51
|
+
if (string.length === 0)
|
|
52
|
+
continue;
|
|
53
|
+
params.push(`${key}=${quoteParamValue(string)}`);
|
|
54
|
+
}
|
|
55
|
+
return params.join(" ");
|
|
56
|
+
}
|
|
57
|
+
var Connection = class extends Emitter {
|
|
58
|
+
/** The unique ID of this connection */
|
|
59
|
+
id;
|
|
60
|
+
/** Queue for serializing queries to the database */
|
|
61
|
+
_queue = new Queue();
|
|
62
|
+
/** Option string to use when calling `connect` */
|
|
63
|
+
_options;
|
|
64
|
+
/** Current instance of `libpq` */
|
|
65
|
+
_pq;
|
|
66
|
+
/** A flag indicating that `destroy()` has been invoked... */
|
|
67
|
+
_destroyed = false;
|
|
68
|
+
/* Overloaded constructor */
|
|
69
|
+
constructor(logger, options = {}) {
|
|
70
|
+
super(logger);
|
|
71
|
+
this.id = randomUUID();
|
|
72
|
+
this._logger = logger;
|
|
73
|
+
const params = typeof options === "string" ? options : convertOptions(options);
|
|
74
|
+
this._options = `fallback_application_name='pool:${this.id}' ${params}`;
|
|
75
|
+
this._pq = new LibPQ();
|
|
76
|
+
finalizer.register(this, this._pq, this._pq);
|
|
77
|
+
this.on("error", () => {
|
|
78
|
+
finalizer.unregister(this._pq);
|
|
79
|
+
this._pq.finish();
|
|
80
|
+
this._destroyed = true;
|
|
81
|
+
});
|
|
82
|
+
logger.debug(`Connection "${this.id}" created`);
|
|
83
|
+
}
|
|
84
|
+
/* ===== GETTERS ========================================================== */
|
|
85
|
+
/** Check whether this {@link Connection} is connected or not */
|
|
86
|
+
get connected() {
|
|
87
|
+
return !!this._pq.connected;
|
|
88
|
+
}
|
|
89
|
+
/** Check whether this {@link Connection} is destroyed or not */
|
|
90
|
+
get destroyed() {
|
|
91
|
+
return this._destroyed;
|
|
92
|
+
}
|
|
93
|
+
/** Return the version of the server we're connected to */
|
|
94
|
+
get serverVersion() {
|
|
95
|
+
assert(this._pq.connected, "Not connected");
|
|
96
|
+
const version = this._pq.serverVersion();
|
|
97
|
+
return `${Math.floor(version / 1e4)}.${version % 1e4}`;
|
|
98
|
+
}
|
|
99
|
+
/* ===== PUBLIC =========================================================== */
|
|
100
|
+
/** Connect this {@link Connection} (fails if connected already) */
|
|
101
|
+
async connect() {
|
|
102
|
+
assert(!this._pq.connected, `Connection "${this.id}" already connected`);
|
|
103
|
+
assert(!this._destroyed, `Connection "${this.id}" already destroyed`);
|
|
104
|
+
this._logger.debug(`Connection "${this.id}" connecting`);
|
|
105
|
+
const promise = new Promise((resolve, reject) => {
|
|
106
|
+
this._pq.connect(this._options, (error) => {
|
|
107
|
+
if (error) {
|
|
108
|
+
return reject(new Error(error.message.trim() || "Unknown connection error"));
|
|
109
|
+
}
|
|
110
|
+
if (!this._pq.setNonBlocking(true)) {
|
|
111
|
+
return reject(new Error(`Unable to set connection "${this.id}" as non-blocking`));
|
|
112
|
+
}
|
|
113
|
+
return resolve(this._pq.connected);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
try {
|
|
117
|
+
const connected = await promise;
|
|
118
|
+
if (this._destroyed)
|
|
119
|
+
throw new Error(`Connection "${this.id}" aborted`);
|
|
120
|
+
if (!connected)
|
|
121
|
+
throw new Error(`Connection "${this.id}" not connected`);
|
|
122
|
+
this._logger.info(`Connection "${this.id}" connected (server version ${this.serverVersion})`);
|
|
123
|
+
this._emit("connected");
|
|
124
|
+
return this;
|
|
125
|
+
} catch (error) {
|
|
126
|
+
if (error instanceof Error)
|
|
127
|
+
Error.captureStackTrace(error);
|
|
128
|
+
finalizer.unregister(this._pq);
|
|
129
|
+
this._pq.finish();
|
|
130
|
+
this._destroyed = true;
|
|
131
|
+
this._emit("error", error);
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Destroy this {@link Connection} releasing all related resources */
|
|
136
|
+
destroy() {
|
|
137
|
+
if (this._destroyed)
|
|
138
|
+
return;
|
|
139
|
+
finalizer.unregister(this._pq);
|
|
140
|
+
this._pq.finish();
|
|
141
|
+
this._destroyed = true;
|
|
142
|
+
this._emit("destroyed");
|
|
143
|
+
}
|
|
144
|
+
/** ===== QUERY INTERFACE ================================================= */
|
|
145
|
+
/** Execute a (possibly parameterised) query with this {@link Connection} */
|
|
146
|
+
async query(text, params) {
|
|
147
|
+
const promise = this._queue.enqueue(() => {
|
|
148
|
+
assert(this._pq.connected, `Connection "${this.id}" not connected`);
|
|
149
|
+
return new Query(this._pq, this._logger).on("error", (error) => this._emit("error", error)).run(text, params);
|
|
150
|
+
});
|
|
151
|
+
try {
|
|
152
|
+
return await promise;
|
|
153
|
+
} catch (error) {
|
|
154
|
+
if (error instanceof Error)
|
|
155
|
+
Error.captureStackTrace(error);
|
|
156
|
+
throw error;
|
|
157
|
+
} finally {
|
|
158
|
+
if (!this._pq.connected)
|
|
159
|
+
this.destroy();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** Cancel (if possible) the currently running query */
|
|
163
|
+
cancel() {
|
|
164
|
+
assert(this._pq.connected, `Connection "${this.id}" not connected`);
|
|
165
|
+
const cancel = this._pq.cancel();
|
|
166
|
+
if (cancel === true)
|
|
167
|
+
return;
|
|
168
|
+
throw new Error(cancel || "Unknown error canceling");
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
var Query = class extends Emitter {
|
|
172
|
+
constructor(_pq, logger) {
|
|
173
|
+
super(logger);
|
|
174
|
+
this._pq = _pq;
|
|
175
|
+
}
|
|
176
|
+
/** Run a query, sending it and flushing it, then reading results */
|
|
177
|
+
run(text, params = []) {
|
|
178
|
+
return new Promise((resolve, reject) => {
|
|
179
|
+
const sent = params.length > 0 ? this._pq.sendQueryParams(text, params) : this._pq.sendQuery(text);
|
|
180
|
+
if (!sent)
|
|
181
|
+
throw this._fail("sendQuery", "Unable to send query");
|
|
182
|
+
this._flushQuery((error) => {
|
|
183
|
+
if (error)
|
|
184
|
+
return reject(error);
|
|
185
|
+
const readableCallback = () => this._read(onResult);
|
|
186
|
+
const onResult = (error2) => {
|
|
187
|
+
this._pq.stopReader();
|
|
188
|
+
this._pq.off("readable", readableCallback);
|
|
189
|
+
if (error2) {
|
|
190
|
+
this._pq.clear();
|
|
191
|
+
return reject(error2);
|
|
192
|
+
}
|
|
193
|
+
const result = this._createResult();
|
|
194
|
+
this._pq.clear();
|
|
195
|
+
resolve(result);
|
|
196
|
+
};
|
|
197
|
+
this._pq.on("readable", readableCallback);
|
|
198
|
+
this._pq.startReader();
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/* === ERRORS ============================================================= */
|
|
203
|
+
_fail(syscall, message) {
|
|
204
|
+
const text = (this._pq.errorMessage() || "").trim() || message;
|
|
205
|
+
const error = Object.assign(new Error(`${text} (${syscall})`), { syscall });
|
|
206
|
+
this._pq.finish();
|
|
207
|
+
this._emit("error", error);
|
|
208
|
+
return error;
|
|
209
|
+
}
|
|
210
|
+
/* === INTERNALS ========================================================== */
|
|
211
|
+
_error;
|
|
212
|
+
_flushQuery(cb) {
|
|
213
|
+
const result = this._pq.flush();
|
|
214
|
+
if (result === 0)
|
|
215
|
+
return cb();
|
|
216
|
+
if (result === -1)
|
|
217
|
+
cb(this._fail("flush", "Unable to flush query"));
|
|
218
|
+
this._pq.writable(
|
|
219
|
+
/* coverage ignore next */
|
|
220
|
+
() => this._flushQuery(cb)
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
_read(onResult) {
|
|
224
|
+
if (!this._pq.consumeInput()) {
|
|
225
|
+
return onResult(this._fail("consumeInput", "Unable to consume input"));
|
|
226
|
+
}
|
|
227
|
+
if (this._pq.isBusy())
|
|
228
|
+
return;
|
|
229
|
+
while (this._pq.getResult()) {
|
|
230
|
+
const status = this._pq.resultStatus();
|
|
231
|
+
switch (status) {
|
|
232
|
+
case "PGRES_FATAL_ERROR":
|
|
233
|
+
this._error = new Error(`SQL Fatal Error: ${this._pq.resultErrorMessage().trim()}`);
|
|
234
|
+
break;
|
|
235
|
+
case "PGRES_TUPLES_OK":
|
|
236
|
+
case "PGRES_COMMAND_OK":
|
|
237
|
+
case "PGRES_EMPTY_QUERY":
|
|
238
|
+
break;
|
|
239
|
+
default:
|
|
240
|
+
return onResult(this._fail("resultStatus", `Unrecognized status ${status}`));
|
|
241
|
+
}
|
|
242
|
+
if (this._pq.isBusy())
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
onResult(this._error);
|
|
246
|
+
}
|
|
247
|
+
/* === RESULT ============================================================= */
|
|
248
|
+
/** Create a {@link ConnectionQueryResult} from the data currently held by `libpq` */
|
|
249
|
+
_createResult() {
|
|
250
|
+
const command = this._pq.cmdStatus().split(" ")[0];
|
|
251
|
+
const rowCount = parseInt(this._pq.cmdTuples() || "0");
|
|
252
|
+
const nfields = this._pq.nfields();
|
|
253
|
+
const ntuples = this._pq.ntuples();
|
|
254
|
+
const fields = new Array(nfields);
|
|
255
|
+
const rows = new Array(ntuples);
|
|
256
|
+
for (let i = 0; i < nfields; i++) {
|
|
257
|
+
fields[i] = [this._pq.fname(i), this._pq.ftype(i)];
|
|
258
|
+
}
|
|
259
|
+
for (let i = 0; i < ntuples; i++) {
|
|
260
|
+
const row = rows[i] = new Array(nfields);
|
|
261
|
+
for (let j = 0; j < nfields; j++) {
|
|
262
|
+
const value = this._pq.getvalue(i, j);
|
|
263
|
+
row[j] = value === "" && this._pq.getisnull(i, j) ? null : value;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return { command, rowCount, fields, rows };
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
export {
|
|
270
|
+
Connection,
|
|
271
|
+
convertOptions
|
|
272
|
+
};
|
|
273
|
+
//# sourceMappingURL=connection.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/connection.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["error"]
|
|
6
|
+
}
|
package/dist/events.cjs
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
// events.ts
|
|
21
|
+
var events_exports = {};
|
|
22
|
+
__export(events_exports, {
|
|
23
|
+
Emitter: () => Emitter
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(events_exports);
|
|
26
|
+
var import_node_events = require("node:events");
|
|
27
|
+
var Emitter = class {
|
|
28
|
+
constructor(_logger) {
|
|
29
|
+
this._logger = _logger;
|
|
30
|
+
}
|
|
31
|
+
_emitter = new import_node_events.EventEmitter();
|
|
32
|
+
_emit(event, ...args) {
|
|
33
|
+
try {
|
|
34
|
+
this._emitter.emit(event, ...args);
|
|
35
|
+
} catch (error) {
|
|
36
|
+
this._logger.error(`Error in "${event}" handler`, error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
on(event, callback) {
|
|
40
|
+
this._emitter.on(event, callback);
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
once(event, callback) {
|
|
44
|
+
this._emitter.once(event, callback);
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
off(event, callback) {
|
|
48
|
+
this._emitter.off(event, callback);
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
53
|
+
0 && (module.exports = {
|
|
54
|
+
Emitter
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=events.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/events.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA6B;AActB,IAAM,UAAN,MAA0B;AAAA,EAG/B,YAAsB,SAAiB;AAAjB;AAAA,EAAkB;AAAA,EAFhC,WAAW,IAAI,gCAAa;AAAA,EAI1B,MAAyB,UAAsB,MAA+B;AACtF,QAAI;AACF,WAAK,SAAS,KAAK,OAAO,GAAG,IAAI;AAAA,IACnC,SAAS,OAAO;AACd,WAAK,QAAQ,MAAM,aAAa,KAAK,aAAa,KAAK;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,GAAsB,OAAmB,UAAqC;AAC5E,SAAK,SAAS,GAAG,OAAO,QAAQ;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,KAAwB,OAAmB,UAAqC;AAC9E,SAAK,SAAS,KAAK,OAAO,QAAQ;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,IAAuB,OAAmB,UAAqC;AAC7E,SAAK,SAAS,IAAI,OAAO,QAAQ;AACjC,WAAO;AAAA,EACT;AACF;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Logger } from './index';
|
|
2
|
+
interface Events {
|
|
3
|
+
error: (error: Error) => unknown;
|
|
4
|
+
}
|
|
5
|
+
type EventParams<E, K extends keyof E> = E[K] extends ((...args: any[]) => unknown) ? Parameters<E[K]> : never;
|
|
6
|
+
type EventCallback<E, K extends keyof E> = E[K] extends ((...args: any[]) => unknown) ? E[K] : never;
|
|
7
|
+
export declare class Emitter<E = Events> {
|
|
8
|
+
protected _logger: Logger;
|
|
9
|
+
private _emitter;
|
|
10
|
+
constructor(_logger: Logger);
|
|
11
|
+
protected _emit<K extends keyof E>(event: K & string, ...args: EventParams<E, K>): void;
|
|
12
|
+
on<K extends keyof E>(event: K & string, callback: EventCallback<E, K>): this;
|
|
13
|
+
once<K extends keyof E>(event: K & string, callback: EventCallback<E, K>): this;
|
|
14
|
+
off<K extends keyof E>(event: K & string, callback: EventCallback<E, K>): this;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
package/dist/events.mjs
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// events.ts
|
|
2
|
+
import { EventEmitter } from "node:events";
|
|
3
|
+
var Emitter = class {
|
|
4
|
+
constructor(_logger) {
|
|
5
|
+
this._logger = _logger;
|
|
6
|
+
}
|
|
7
|
+
_emitter = new EventEmitter();
|
|
8
|
+
_emit(event, ...args) {
|
|
9
|
+
try {
|
|
10
|
+
this._emitter.emit(event, ...args);
|
|
11
|
+
} catch (error) {
|
|
12
|
+
this._logger.error(`Error in "${event}" handler`, error);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
on(event, callback) {
|
|
16
|
+
this._emitter.on(event, callback);
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
once(event, callback) {
|
|
20
|
+
this._emitter.once(event, callback);
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
off(event, callback) {
|
|
24
|
+
this._emitter.off(event, callback);
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
export {
|
|
29
|
+
Emitter
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=events.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/events.ts"],
|
|
4
|
+
"mappings": ";AAAA,SAAS,oBAAoB;AActB,IAAM,UAAN,MAA0B;AAAA,EAG/B,YAAsB,SAAiB;AAAjB;AAAA,EAAkB;AAAA,EAFhC,WAAW,IAAI,aAAa;AAAA,EAI1B,MAAyB,UAAsB,MAA+B;AACtF,QAAI;AACF,WAAK,SAAS,KAAK,OAAO,GAAG,IAAI;AAAA,IACnC,SAAS,OAAO;AACd,WAAK,QAAQ,MAAM,aAAa,KAAK,aAAa,KAAK;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,GAAsB,OAAmB,UAAqC;AAC5E,SAAK,SAAS,GAAG,OAAO,QAAQ;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,KAAwB,OAAmB,UAAqC;AAC9E,SAAK,SAAS,KAAK,OAAO,QAAQ;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,IAAuB,OAAmB,UAAqC;AAC7E,SAAK,SAAS,IAAI,OAAO,QAAQ;AACjC,WAAO;AAAA,EACT;AACF;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
// index.ts
|
|
21
|
+
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
Connection: () => import_connection.Connection,
|
|
24
|
+
ConnectionPool: () => import_pool.ConnectionPool
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(src_exports);
|
|
27
|
+
var import_connection = require("./connection.cjs");
|
|
28
|
+
var import_pool = require("./pool.cjs");
|
|
29
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
30
|
+
0 && (module.exports = {
|
|
31
|
+
Connection,
|
|
32
|
+
ConnectionPool
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=index.cjs.map
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { Connection } from './connection';
|
|
2
|
+
export { ConnectionPool } from './pool';
|
|
3
|
+
export type { ConnectionOptions, ConnectionQueryResult as ConnectionQueryResult } from './connection';
|
|
4
|
+
export type { ConnectionPoolOptions, ConnectionPoolStats } from './pool';
|
|
5
|
+
/** A base Logger class that can be used to inject */
|
|
6
|
+
export interface Logger {
|
|
7
|
+
/** Log a message at `DEBUG` level */
|
|
8
|
+
readonly debug: (...args: any[]) => void;
|
|
9
|
+
/** Log a message at `INFO` level */
|
|
10
|
+
readonly info: (...args: any[]) => void;
|
|
11
|
+
/** Log a message at `WARN` level */
|
|
12
|
+
readonly warn: (...args: any[]) => void;
|
|
13
|
+
/** Log a message at `ERROR` level */
|
|
14
|
+
readonly error: (...args: any[]) => void;
|
|
15
|
+
}
|
package/dist/index.mjs
ADDED
package/dist/libpq.cjs
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
// libpq.ts
|
|
21
|
+
var libpq_exports = {};
|
|
22
|
+
__export(libpq_exports, {
|
|
23
|
+
LibPQ: () => LibPQ
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(libpq_exports);
|
|
26
|
+
var import_node_module = require("node:module");
|
|
27
|
+
var LibPQ = (0, import_node_module.createRequire)(__filename)("libpq");
|
|
28
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
29
|
+
0 && (module.exports = {
|
|
30
|
+
LibPQ
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=libpq.cjs.map
|
package/dist/libpq.d.ts
ADDED
package/dist/libpq.mjs
ADDED