tinbase 0.9.0 → 0.10.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 +10 -9
- package/dist/admin/api.d.ts +62 -1
- package/dist/admin/api.js +209 -10
- package/dist/admin/api.js.map +1 -1
- package/dist/admin/ui.d.ts +1 -1
- package/dist/admin/ui.js +1548 -16
- package/dist/admin/ui.js.map +1 -1
- package/dist/auth/handler.d.ts +52 -5
- package/dist/auth/handler.js +147 -36
- package/dist/auth/handler.js.map +1 -1
- package/dist/auth/inbox.d.ts +4 -2
- package/dist/auth/inbox.js +1 -0
- package/dist/auth/inbox.js.map +1 -1
- package/dist/auth/oauth.d.ts +30 -4
- package/dist/auth/oauth.js +22 -6
- package/dist/auth/oauth.js.map +1 -1
- package/dist/auth/password.d.ts +5 -0
- package/dist/auth/password.js +7 -0
- package/dist/auth/password.js.map +1 -1
- package/dist/auth/qr.d.ts +1 -1
- package/dist/auth/qr.js +1 -1
- package/dist/auth/rate-limit.d.ts +33 -0
- package/dist/auth/rate-limit.js +63 -0
- package/dist/auth/rate-limit.js.map +1 -0
- package/dist/auth/redirect.d.ts +20 -0
- package/dist/auth/redirect.js +79 -0
- package/dist/auth/redirect.js.map +1 -0
- package/dist/auth/settings.d.ts +55 -0
- package/dist/auth/settings.js +116 -0
- package/dist/auth/settings.js.map +1 -0
- package/dist/auth/totp.js +1 -1
- package/dist/cli.js +66 -30
- package/dist/cli.js.map +1 -1
- package/dist/cron/service.d.ts +15 -2
- package/dist/cron/service.js +19 -2
- package/dist/cron/service.js.map +1 -1
- package/dist/db/bootstrap.d.ts +13 -6
- package/dist/db/bootstrap.js +26 -5
- package/dist/db/bootstrap.js.map +1 -1
- package/dist/db/database.d.ts +61 -3
- package/dist/db/database.js +72 -9
- package/dist/db/database.js.map +1 -1
- package/dist/db/emulated.d.ts +39 -2
- package/dist/db/emulated.js +39 -23
- package/dist/db/emulated.js.map +1 -1
- package/dist/db/engine.d.ts +19 -5
- package/dist/db/engine.js +4 -2
- package/dist/db/engine.js.map +1 -1
- package/dist/db/inspect.d.ts +6 -1
- package/dist/db/inspect.js +2 -1
- package/dist/db/inspect.js.map +1 -1
- package/dist/db/pglite-engine.d.ts +7 -1
- package/dist/db/pglite-engine.js +7 -1
- package/dist/db/pglite-engine.js.map +1 -1
- package/dist/db/pgmem-engine.d.ts +9 -3
- package/dist/db/pgmem-engine.js +13 -7
- package/dist/db/pgmem-engine.js.map +1 -1
- package/dist/db/schema-diff.d.ts +9 -1
- package/dist/db/schema-diff.js +19 -5
- package/dist/db/schema-diff.js.map +1 -1
- package/dist/db/sql-compat.d.ts +2 -2
- package/dist/db/sql-compat.js +2 -2
- package/dist/functions/deno-shim.d.ts +6 -17
- package/dist/functions/deno-shim.js +42 -10
- package/dist/functions/deno-shim.js.map +1 -1
- package/dist/functions/handler.d.ts +9 -4
- package/dist/functions/handler.js +9 -1
- package/dist/functions/handler.js.map +1 -1
- package/dist/gen-types.d.ts +6 -1
- package/dist/gen-types.js +53 -41
- package/dist/gen-types.js.map +1 -1
- package/dist/index.d.ts +33 -3
- package/dist/index.js +170 -30
- package/dist/index.js.map +1 -1
- package/dist/jwt.d.ts +4 -1
- package/dist/jwt.js +4 -2
- package/dist/jwt.js.map +1 -1
- package/dist/log-buffer.d.ts +7 -1
- package/dist/log-buffer.js +3 -0
- package/dist/log-buffer.js.map +1 -1
- package/dist/net/service.d.ts +35 -6
- package/dist/net/service.js +72 -17
- package/dist/net/service.js.map +1 -1
- package/dist/node/bun-server.d.ts +2 -1
- package/dist/node/bun-server.js +11 -1
- package/dist/node/bun-server.js.map +1 -1
- package/dist/node/bundle-function.d.ts +1 -1
- package/dist/node/bundle-function.js +1 -1
- package/dist/node/config-toml.d.ts +31 -0
- package/dist/node/config-toml.js +186 -0
- package/dist/node/config-toml.js.map +1 -0
- package/dist/node/db-diff.d.ts +13 -1
- package/dist/node/db-diff.js +3 -1
- package/dist/node/db-diff.js.map +1 -1
- package/dist/node/fs-driver.d.ts +16 -1
- package/dist/node/fs-driver.js +20 -1
- package/dist/node/fs-driver.js.map +1 -1
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +1 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/load-config.d.ts +80 -0
- package/dist/node/load-config.js +230 -0
- package/dist/node/load-config.js.map +1 -0
- package/dist/node/load-functions.d.ts +17 -2
- package/dist/node/load-functions.js +17 -4
- package/dist/node/load-functions.js.map +1 -1
- package/dist/node/native/database-url.d.ts +25 -0
- package/dist/node/native/database-url.js +38 -0
- package/dist/node/native/database-url.js.map +1 -0
- package/dist/node/native/engine.d.ts +7 -0
- package/dist/node/native/engine.js +63 -85
- package/dist/node/native/engine.js.map +1 -1
- package/dist/node/native/wire-engine.d.ts +16 -0
- package/dist/node/native/wire-engine.js +83 -0
- package/dist/node/native/wire-engine.js.map +1 -0
- package/dist/node/native/wire.d.ts +25 -8
- package/dist/node/native/wire.js +130 -15
- package/dist/node/native/wire.js.map +1 -1
- package/dist/node/project.d.ts +15 -1
- package/dist/node/project.js +19 -7
- package/dist/node/project.js.map +1 -1
- package/dist/node/server-shared.d.ts +4 -1
- package/dist/node/server.d.ts +11 -0
- package/dist/node/server.js +11 -0
- package/dist/node/server.js.map +1 -1
- package/dist/node/ws.d.ts +26 -1
- package/dist/node/ws.js +26 -3
- package/dist/node/ws.js.map +1 -1
- package/dist/realtime/engine.d.ts +6 -0
- package/dist/realtime/engine.js +45 -34
- package/dist/realtime/engine.js.map +1 -1
- package/dist/rest/build.d.ts +44 -1
- package/dist/rest/build.js +96 -10
- package/dist/rest/build.js.map +1 -1
- package/dist/rest/errors.d.ts +8 -0
- package/dist/rest/errors.js +12 -1
- package/dist/rest/errors.js.map +1 -1
- package/dist/rest/handler.d.ts +17 -1
- package/dist/rest/handler.js +125 -10
- package/dist/rest/handler.js.map +1 -1
- package/dist/rest/parse.d.ts +26 -1
- package/dist/rest/parse.js +29 -2
- package/dist/rest/parse.js.map +1 -1
- package/dist/retention/service.d.ts +3 -0
- package/dist/retention/service.js +3 -1
- package/dist/retention/service.js.map +1 -1
- package/dist/security.d.ts +22 -0
- package/dist/security.js +47 -0
- package/dist/security.js.map +1 -0
- package/dist/storage/driver.d.ts +8 -1
- package/dist/storage/driver.js +4 -1
- package/dist/storage/driver.js.map +1 -1
- package/dist/storage/handler.d.ts +20 -1
- package/dist/storage/handler.js +272 -16
- package/dist/storage/handler.js.map +1 -1
- package/dist/types.d.ts +84 -1
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -1
- package/dist/webhooks/service.d.ts +25 -2
- package/dist/webhooks/service.js +21 -3
- package/dist/webhooks/service.js.map +1 -1
- package/package.json +5 -3
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Native embedded Postgres engine
|
|
2
|
+
* Native embedded Postgres engine - PocketBase-class footprint with real
|
|
3
3
|
* Postgres semantics. Downloads platform binaries once (~12 MB from
|
|
4
4
|
* theseus-rs/postgresql-binaries), runs initdb with memory-lean settings,
|
|
5
5
|
* and manages the postgres child process. Trust auth over a private unix
|
|
6
6
|
* socket directory (0700), never TCP.
|
|
7
7
|
*/
|
|
8
8
|
import { execFileSync, spawn } from 'node:child_process';
|
|
9
|
-
import { randomBytes } from 'node:crypto';
|
|
9
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
10
10
|
import { chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync, appendFileSync } from 'node:fs';
|
|
11
11
|
import { writeFile } from 'node:fs/promises';
|
|
12
12
|
import { homedir, tmpdir } from 'node:os';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
|
-
import { Mutex } from '../../db/engine.js';
|
|
15
14
|
import { PgWireClient } from './wire.js';
|
|
15
|
+
import { buildWireEngine } from './wire-engine.js';
|
|
16
16
|
const DEFAULT_PG_VERSION = '17.7.0';
|
|
17
17
|
function target() {
|
|
18
18
|
const arch = process.arch === 'arm64' ? 'aarch64' : process.arch === 'x64' ? 'x86_64' : null;
|
|
@@ -28,6 +28,42 @@ function target() {
|
|
|
28
28
|
function isCompleteInstall(dir) {
|
|
29
29
|
return existsSync(join(dir, 'bin', 'postgres')) && existsSync(join(dir, 'share', 'postgres.bki'));
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Pinned SHA-256 digests for the tarballs we download, keyed by
|
|
33
|
+
* `postgresql-<version>-<target>`. A pinned entry is enforced offline (strongest
|
|
34
|
+
* integrity). For versions/targets not listed here we fall back to the checksum
|
|
35
|
+
* the release publishes alongside the tarball, which still defends against
|
|
36
|
+
* truncated downloads and mismatched redirects.
|
|
37
|
+
*/
|
|
38
|
+
const PINNED_SHA256 = {
|
|
39
|
+
// theseus-rs/postgresql-binaries 17.7.0 (the DEFAULT_PG_VERSION). Refresh
|
|
40
|
+
// these from the release *.sha256 files whenever DEFAULT_PG_VERSION changes.
|
|
41
|
+
'postgresql-17.7.0-x86_64-unknown-linux-gnu': '66ad03281a43624f955c8e16ac975cb0ab751e7edf8ba35308e3b08dd7d065c3',
|
|
42
|
+
'postgresql-17.7.0-aarch64-unknown-linux-gnu': '89cc2f089880cc8e5e6b7a29387829ec4e4779427855bc0b9fa187c8fce33c8b',
|
|
43
|
+
'postgresql-17.7.0-x86_64-apple-darwin': '0dd8c25173524bad4ae8ef6b970da1ac40f4c1f231150c416ccb8cd06feff8f2',
|
|
44
|
+
'postgresql-17.7.0-aarch64-apple-darwin': '727ac08d20a704014a0d51eb3300aa0c8e292c1cf0a1c99d4f4b1002e1420220',
|
|
45
|
+
};
|
|
46
|
+
/** Verify `tarball` against a pinned digest, else the release's published .sha256. */
|
|
47
|
+
async function verifyTarball(tarball, key, url) {
|
|
48
|
+
const actual = createHash('sha256').update(readFileSync(tarball)).digest('hex');
|
|
49
|
+
const pinned = PINNED_SHA256[key];
|
|
50
|
+
if (pinned) {
|
|
51
|
+
if (actual !== pinned) {
|
|
52
|
+
throw new Error(`postgres binary checksum mismatch for ${key}: expected ${pinned}, got ${actual}`);
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// No local pin - verify against the checksum the release publishes.
|
|
57
|
+
const res = await fetch(`${url}.sha256`);
|
|
58
|
+
if (!res.ok)
|
|
59
|
+
throw new Error(`could not fetch checksum for ${key}: HTTP ${res.status}`);
|
|
60
|
+
const expected = (await res.text()).trim().split(/\s+/)[0].toLowerCase();
|
|
61
|
+
if (!/^[0-9a-f]{64}$/.test(expected))
|
|
62
|
+
throw new Error(`malformed published checksum for ${key}`);
|
|
63
|
+
if (actual !== expected) {
|
|
64
|
+
throw new Error(`postgres binary checksum mismatch for ${key}: expected ${expected}, got ${actual}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
31
67
|
/** Download + unpack Postgres binaries if not already cached (concurrency-safe). Returns the install dir. */
|
|
32
68
|
export async function ensurePostgres(version = DEFAULT_PG_VERSION, cacheDir, log) {
|
|
33
69
|
const t = target();
|
|
@@ -37,7 +73,7 @@ export async function ensurePostgres(version = DEFAULT_PG_VERSION, cacheDir, log
|
|
|
37
73
|
return dir;
|
|
38
74
|
// Concurrency-safe: multiple test workers / processes may call this at once on
|
|
39
75
|
// a cold cache. Each downloads + extracts to unique temp paths, then atomically
|
|
40
|
-
// renames into place
|
|
76
|
+
// renames into place - so no worker ever sees a half-written tarball or a
|
|
41
77
|
// partially-extracted install dir.
|
|
42
78
|
const url = `https://github.com/theseus-rs/postgresql-binaries/releases/download/${version}/postgresql-${version}-${t}.tar.gz`;
|
|
43
79
|
mkdirSync(root, { recursive: true });
|
|
@@ -52,6 +88,8 @@ export async function ensurePostgres(version = DEFAULT_PG_VERSION, cacheDir, log
|
|
|
52
88
|
if (!res.ok)
|
|
53
89
|
throw new Error(`failed to download ${url}: HTTP ${res.status}`);
|
|
54
90
|
await writeFile(tarball, Buffer.from(await res.arrayBuffer()));
|
|
91
|
+
// Integrity-check the tarball before executing anything it contains.
|
|
92
|
+
await verifyTarball(tarball, `postgresql-${version}-${t}`, url);
|
|
55
93
|
mkdirSync(tmpDir, { recursive: true });
|
|
56
94
|
execFileSync('tar', ['xzf', tarball, '-C', tmpDir, '--strip-components=1']);
|
|
57
95
|
if (!isCompleteInstall(tmpDir))
|
|
@@ -85,6 +123,11 @@ max_wal_senders = 0
|
|
|
85
123
|
synchronous_commit = off
|
|
86
124
|
logging_collector = off
|
|
87
125
|
`;
|
|
126
|
+
/**
|
|
127
|
+
* Boot the embedded Postgres child (initdb on first run) and return a {@link DbEngine}
|
|
128
|
+
* backed by two wire connections: one for queries/transactions (serialized by a mutex),
|
|
129
|
+
* one dedicated to LISTEN/NOTIFY.
|
|
130
|
+
*/
|
|
88
131
|
export async function createNativeEngine(opts) {
|
|
89
132
|
const installDir = await ensurePostgres(opts.version, opts.cacheDir, opts.log);
|
|
90
133
|
const bin = (name) => join(installDir, 'bin', name);
|
|
@@ -105,7 +148,7 @@ export async function createNativeEngine(opts) {
|
|
|
105
148
|
// A stale postmaster.pid (from a crashed run) makes postgres refuse to start.
|
|
106
149
|
// Remove it if the process it names is no longer alive.
|
|
107
150
|
removeStalePidFile(join(opts.dataDir, 'postmaster.pid'));
|
|
108
|
-
// private socket dir
|
|
151
|
+
// private socket dir - trust auth is safe because only this user can reach it.
|
|
109
152
|
// Keep the path short: macOS caps unix socket paths at ~104 chars.
|
|
110
153
|
const sockDir = mkdtempSync(join(tmpdir(), 'tb-'));
|
|
111
154
|
chmodSync(sockDir, 0o700);
|
|
@@ -119,6 +162,14 @@ export async function createNativeEngine(opts) {
|
|
|
119
162
|
stderr = (stderr + d.toString()).slice(-4000);
|
|
120
163
|
});
|
|
121
164
|
child.on('exit', () => (childExited = true));
|
|
165
|
+
// Best-effort: if this Node process exits without a clean close() (crash,
|
|
166
|
+
// uncaught signal), take the postgres child down with it so it doesn't
|
|
167
|
+
// orphan and hold the data dir. Removed in close().
|
|
168
|
+
const killChild = () => {
|
|
169
|
+
if (!childExited)
|
|
170
|
+
child.kill('SIGTERM');
|
|
171
|
+
};
|
|
172
|
+
process.once('exit', killChild);
|
|
122
173
|
const socketPath = join(sockDir, '.s.PGSQL.5432');
|
|
123
174
|
const connect = async () => {
|
|
124
175
|
const deadline = Date.now() + 20_000;
|
|
@@ -139,55 +190,9 @@ export async function createNativeEngine(opts) {
|
|
|
139
190
|
}
|
|
140
191
|
}
|
|
141
192
|
};
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
const listeners = new Map();
|
|
146
|
-
listener.onNotification = (channel, payload) => {
|
|
147
|
-
for (const cb of listeners.get(channel) ?? [])
|
|
148
|
-
cb(payload);
|
|
149
|
-
};
|
|
150
|
-
const tx = {
|
|
151
|
-
async query(sql, params) {
|
|
152
|
-
const res = await main.query(sql, normalizeParams(params));
|
|
153
|
-
return { rows: res.rows, affectedRows: res.affectedRows };
|
|
154
|
-
},
|
|
155
|
-
async exec(sql) {
|
|
156
|
-
await main.exec(sql);
|
|
157
|
-
},
|
|
158
|
-
};
|
|
159
|
-
return {
|
|
160
|
-
query(sql, params) {
|
|
161
|
-
return mutex.run(() => tx.query(sql, params));
|
|
162
|
-
},
|
|
163
|
-
exec(sql) {
|
|
164
|
-
return mutex.run(() => tx.exec(sql));
|
|
165
|
-
},
|
|
166
|
-
transaction(fn) {
|
|
167
|
-
return mutex.run(async () => {
|
|
168
|
-
await main.exec('begin');
|
|
169
|
-
try {
|
|
170
|
-
const result = await fn(tx);
|
|
171
|
-
await main.exec('commit');
|
|
172
|
-
return result;
|
|
173
|
-
}
|
|
174
|
-
catch (e) {
|
|
175
|
-
await main.exec('rollback').catch(() => { });
|
|
176
|
-
throw e;
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
},
|
|
180
|
-
async listen(channel, cb) {
|
|
181
|
-
if (!listeners.has(channel)) {
|
|
182
|
-
listeners.set(channel, new Set());
|
|
183
|
-
await listener.exec(`listen "${channel.replaceAll('"', '""')}"`);
|
|
184
|
-
}
|
|
185
|
-
listeners.get(channel).add(cb);
|
|
186
|
-
return () => listeners.get(channel)?.delete(cb);
|
|
187
|
-
},
|
|
188
|
-
async close() {
|
|
189
|
-
await main.close().catch(() => { });
|
|
190
|
-
await listener.close().catch(() => { });
|
|
193
|
+
return buildWireEngine({
|
|
194
|
+
connect,
|
|
195
|
+
onClose: async () => {
|
|
191
196
|
if (!childExited) {
|
|
192
197
|
child.kill('SIGINT'); // fast shutdown
|
|
193
198
|
await new Promise((resolve) => {
|
|
@@ -203,12 +208,12 @@ export async function createNativeEngine(opts) {
|
|
|
203
208
|
}
|
|
204
209
|
rmSync(sockDir, { recursive: true, force: true });
|
|
205
210
|
},
|
|
206
|
-
};
|
|
211
|
+
});
|
|
207
212
|
}
|
|
208
213
|
/**
|
|
209
214
|
* Postgres refuses to boot if a postmaster.pid names a live process. When the
|
|
210
215
|
* previous run crashed the pid is stale; postgres usually clears it, but if the
|
|
211
|
-
* data dir moved or the boot ID differs it may not
|
|
216
|
+
* data dir moved or the boot ID differs it may not - remove it when the named
|
|
212
217
|
* pid is dead so a fresh start succeeds.
|
|
213
218
|
*/
|
|
214
219
|
function removeStalePidFile(pidPath) {
|
|
@@ -222,41 +227,14 @@ function removeStalePidFile(pidPath) {
|
|
|
222
227
|
}
|
|
223
228
|
try {
|
|
224
229
|
process.kill(pid, 0); // throws if the process does not exist
|
|
225
|
-
// process is alive
|
|
230
|
+
// process is alive - leave the pid file; postgres will report the conflict
|
|
226
231
|
}
|
|
227
232
|
catch {
|
|
228
233
|
rmSync(pidPath, { force: true });
|
|
229
234
|
}
|
|
230
235
|
}
|
|
231
236
|
catch {
|
|
232
|
-
// unreadable pid file
|
|
237
|
+
// unreadable pid file - let postgres decide
|
|
233
238
|
}
|
|
234
239
|
}
|
|
235
|
-
/** Match PGlite's param serialization: arrays → pg literals, objects → JSON. */
|
|
236
|
-
function normalizeParams(params) {
|
|
237
|
-
return params?.map((p) => {
|
|
238
|
-
if (p === null || p === undefined)
|
|
239
|
-
return null;
|
|
240
|
-
if (Array.isArray(p))
|
|
241
|
-
return toPgArrayLiteral(p);
|
|
242
|
-
if (p instanceof Date)
|
|
243
|
-
return p.toISOString();
|
|
244
|
-
if (typeof p === 'object')
|
|
245
|
-
return JSON.stringify(p);
|
|
246
|
-
return p;
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
function toPgArrayLiteral(arr) {
|
|
250
|
-
const items = arr.map((el) => {
|
|
251
|
-
if (el === null || el === undefined)
|
|
252
|
-
return 'NULL';
|
|
253
|
-
if (Array.isArray(el))
|
|
254
|
-
return toPgArrayLiteral(el);
|
|
255
|
-
if (typeof el === 'number' || typeof el === 'boolean')
|
|
256
|
-
return String(el);
|
|
257
|
-
const s = typeof el === 'object' ? JSON.stringify(el) : String(el);
|
|
258
|
-
return `"${s.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`;
|
|
259
|
-
});
|
|
260
|
-
return `{${items.join(',')}}`;
|
|
261
|
-
}
|
|
262
240
|
//# sourceMappingURL=engine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/node/native/engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/node/native/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds a DbEngine on top of PgWireClient connections. Shared by the embedded
|
|
3
|
+
* native engine (unix socket, trust auth) and the external `--database-url`
|
|
4
|
+
* engine (TCP, password/SCRAM auth) — only the `connect` function differs.
|
|
5
|
+
*/
|
|
6
|
+
import type { DbEngine } from '../../db/engine.js';
|
|
7
|
+
import type { PgWireClient } from './wire.js';
|
|
8
|
+
export interface WireEngineOptions {
|
|
9
|
+
/** Open a fresh connection to the target (socket or TCP). */
|
|
10
|
+
connect: () => Promise<PgWireClient>;
|
|
11
|
+
/** Engine-specific teardown after the connections are closed. */
|
|
12
|
+
onClose?: () => Promise<void> | void;
|
|
13
|
+
}
|
|
14
|
+
export declare function buildWireEngine(opts: WireEngineOptions): Promise<DbEngine>;
|
|
15
|
+
/** Match PGlite's param serialization: arrays → pg literals, objects → JSON. */
|
|
16
|
+
export declare function normalizeParams(params?: unknown[]): unknown[] | undefined;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Mutex } from '../../db/engine.js';
|
|
2
|
+
export async function buildWireEngine(opts) {
|
|
3
|
+
const main = await opts.connect();
|
|
4
|
+
const listener = await opts.connect();
|
|
5
|
+
const mutex = new Mutex();
|
|
6
|
+
const listeners = new Map();
|
|
7
|
+
listener.onNotification = (channel, payload) => {
|
|
8
|
+
for (const cb of listeners.get(channel) ?? [])
|
|
9
|
+
cb(payload);
|
|
10
|
+
};
|
|
11
|
+
const tx = {
|
|
12
|
+
async query(sql, params) {
|
|
13
|
+
const res = await main.query(sql, normalizeParams(params));
|
|
14
|
+
return { rows: res.rows, affectedRows: res.affectedRows };
|
|
15
|
+
},
|
|
16
|
+
async exec(sql) {
|
|
17
|
+
await main.exec(sql);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
query(sql, params) {
|
|
22
|
+
return mutex.run(() => tx.query(sql, params));
|
|
23
|
+
},
|
|
24
|
+
exec(sql) {
|
|
25
|
+
return mutex.run(() => tx.exec(sql));
|
|
26
|
+
},
|
|
27
|
+
transaction(fn) {
|
|
28
|
+
return mutex.run(async () => {
|
|
29
|
+
await main.exec('begin');
|
|
30
|
+
try {
|
|
31
|
+
const result = await fn(tx);
|
|
32
|
+
await main.exec('commit');
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
await main.exec('rollback').catch(() => { });
|
|
37
|
+
throw e;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
async listen(channel, cb) {
|
|
42
|
+
if (!listeners.has(channel)) {
|
|
43
|
+
listeners.set(channel, new Set());
|
|
44
|
+
await listener.exec(`listen "${channel.replaceAll('"', '""')}"`);
|
|
45
|
+
}
|
|
46
|
+
listeners.get(channel).add(cb);
|
|
47
|
+
return () => listeners.get(channel)?.delete(cb);
|
|
48
|
+
},
|
|
49
|
+
async close() {
|
|
50
|
+
await main.close().catch(() => { });
|
|
51
|
+
await listener.close().catch(() => { });
|
|
52
|
+
await opts.onClose?.();
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Match PGlite's param serialization: arrays → pg literals, objects → JSON. */
|
|
57
|
+
export function normalizeParams(params) {
|
|
58
|
+
return params?.map((p) => {
|
|
59
|
+
if (p === null || p === undefined)
|
|
60
|
+
return null;
|
|
61
|
+
if (Array.isArray(p))
|
|
62
|
+
return toPgArrayLiteral(p);
|
|
63
|
+
if (p instanceof Date)
|
|
64
|
+
return p.toISOString();
|
|
65
|
+
if (typeof p === 'object')
|
|
66
|
+
return JSON.stringify(p);
|
|
67
|
+
return p;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function toPgArrayLiteral(arr) {
|
|
71
|
+
const items = arr.map((el) => {
|
|
72
|
+
if (el === null || el === undefined)
|
|
73
|
+
return 'NULL';
|
|
74
|
+
if (Array.isArray(el))
|
|
75
|
+
return toPgArrayLiteral(el);
|
|
76
|
+
if (typeof el === 'number' || typeof el === 'boolean')
|
|
77
|
+
return String(el);
|
|
78
|
+
const s = typeof el === 'object' ? JSON.stringify(el) : String(el);
|
|
79
|
+
return `"${s.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`;
|
|
80
|
+
});
|
|
81
|
+
return `{${items.join(',')}}`;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=wire-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire-engine.js","sourceRoot":"","sources":["../../../src/node/native/wire-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +1,55 @@
|
|
|
1
|
+
interface ConnectOpts {
|
|
2
|
+
socketPath?: string;
|
|
3
|
+
host?: string;
|
|
4
|
+
port?: number;
|
|
5
|
+
user: string;
|
|
6
|
+
database: string;
|
|
7
|
+
password?: string;
|
|
8
|
+
}
|
|
9
|
+
/** Result of one wire query: returned rows plus, for writes, the affected row count. */
|
|
1
10
|
export interface WireResults<T = any> {
|
|
11
|
+
/** result rows, typed as `T` */
|
|
2
12
|
rows: T[];
|
|
13
|
+
/** rows touched by an INSERT/UPDATE/DELETE; undefined for plain SELECTs */
|
|
3
14
|
affectedRows?: number;
|
|
4
15
|
}
|
|
16
|
+
/** Error raised from a Postgres ErrorResponse, carrying its structured fields. */
|
|
5
17
|
export declare class PgWireError extends Error {
|
|
18
|
+
/** SQLSTATE code (ErrorResponse field 'C') */
|
|
6
19
|
code?: string;
|
|
20
|
+
/** human-readable detail line (field 'D') */
|
|
7
21
|
detail?: string;
|
|
22
|
+
/** suggested fix, if the server sent one (field 'H') */
|
|
8
23
|
hint?: string;
|
|
24
|
+
/** severity level, e.g. ERROR / FATAL (field 'S') */
|
|
9
25
|
severity?: string;
|
|
10
26
|
constructor(fields: Map<string, string>);
|
|
11
27
|
}
|
|
28
|
+
/** A single Postgres connection speaking the v3 wire protocol; one op at a time, queued. */
|
|
12
29
|
export declare class PgWireClient {
|
|
13
30
|
private socket;
|
|
14
31
|
private buffer;
|
|
15
32
|
private pending;
|
|
16
33
|
private queue;
|
|
17
34
|
private closed;
|
|
35
|
+
/** invoked for each NOTIFY on a LISTENed channel; set by the caller before listening */
|
|
18
36
|
onNotification: ((channel: string, payload: string) => void) | null;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
host?: string;
|
|
22
|
-
port?: number;
|
|
23
|
-
user: string;
|
|
24
|
-
database: string;
|
|
25
|
-
}): Promise<PgWireClient>;
|
|
37
|
+
/** Open a connection and complete the auth + startup handshake before resolving. */
|
|
38
|
+
static connect(opts: ConnectOpts): Promise<PgWireClient>;
|
|
26
39
|
private open;
|
|
27
40
|
/** One protocol op at a time; queued to be safe under concurrency. */
|
|
28
41
|
private run;
|
|
29
|
-
/** Simple query protocol
|
|
42
|
+
/** Simple query protocol - supports multiple statements. */
|
|
30
43
|
exec(sql: string): Promise<WireResults[]>;
|
|
31
44
|
/** Extended query protocol with text-format params. */
|
|
32
45
|
query<T = any>(sql: string, params?: unknown[]): Promise<WireResults<T>>;
|
|
46
|
+
/** Send Terminate and end the socket; a no-op once already closed. */
|
|
33
47
|
close(): Promise<void>;
|
|
34
48
|
private nextMessage;
|
|
35
49
|
private processMessages;
|
|
36
50
|
}
|
|
51
|
+
/** Decode a text-format value by type OID to match PGlite's JS types. */
|
|
52
|
+
export declare function decodeValue(text: string, oid: number): unknown;
|
|
37
53
|
/** Parse a one-dimensional Postgres array literal: {a,"b c",NULL} */
|
|
38
54
|
export declare function parsePgArray(text: string): (string | null)[];
|
|
55
|
+
export {};
|