@aotter/mantle 0.2.0-alpha.5 → 0.2.0-alpha.6
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 +2 -2
- package/dist/admin/createAdminSurface.d.ts +3 -0
- package/dist/admin/createAdminSurface.d.ts.map +1 -1
- package/dist/admin/createAdminSurface.js +51 -8
- package/dist/admin/createAdminSurface.js.map +1 -1
- package/dist/admin/extensions.d.ts +290 -0
- package/dist/admin/extensions.d.ts.map +1 -0
- package/dist/admin/extensions.js +532 -0
- package/dist/admin/extensions.js.map +1 -0
- package/dist/admin/index.d.ts +1 -0
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/auth/buildAuth.d.ts +3 -1
- package/dist/auth/buildAuth.d.ts.map +1 -1
- package/dist/auth/buildAuth.js +3 -2
- package/dist/auth/buildAuth.js.map +1 -1
- package/dist/auth/callerResolver.d.ts +4 -0
- package/dist/auth/callerResolver.d.ts.map +1 -1
- package/dist/auth/callerResolver.js +4 -1
- package/dist/auth/callerResolver.js.map +1 -1
- package/dist/auth/createMantleAuth.d.ts.map +1 -1
- package/dist/auth/createMantleAuth.js +3 -2
- package/dist/auth/createMantleAuth.js.map +1 -1
- package/dist/auth/db.d.ts +1 -0
- package/dist/auth/db.d.ts.map +1 -1
- package/dist/auth/db.js +6 -3
- package/dist/auth/db.js.map +1 -1
- package/dist/bun/index.d.ts +0 -44
- package/dist/bun/index.d.ts.map +1 -1
- package/dist/bun/index.js +0 -84
- package/dist/bun/index.js.map +1 -1
- package/dist/cli/generate.js +3 -3
- package/dist/cli/generate.js.map +1 -1
- package/dist/cli/preset.d.ts.map +1 -1
- package/dist/cli/preset.js +80 -28
- package/dist/cli/preset.js.map +1 -1
- package/dist/cloudflare/index.d.ts +4 -0
- package/dist/cloudflare/index.d.ts.map +1 -1
- package/dist/cloudflare/index.js +2 -0
- package/dist/cloudflare/index.js.map +1 -1
- package/dist/core/dialect.d.ts +13 -1
- package/dist/core/dialect.d.ts.map +1 -1
- package/dist/core/driver.d.ts +7 -0
- package/dist/core/driver.d.ts.map +1 -1
- package/dist/core/runtime/createRuntime.js +1 -1
- package/dist/core/runtime/createRuntime.js.map +1 -1
- package/dist/core/sessionUser.d.ts +14 -0
- package/dist/core/sessionUser.d.ts.map +1 -0
- package/dist/core/sessionUser.js +4 -0
- package/dist/core/sessionUser.js.map +1 -0
- package/dist/core/sql/allowlist.d.ts +2 -0
- package/dist/core/sql/allowlist.d.ts.map +1 -1
- package/dist/core/sql/allowlist.js +43 -11
- package/dist/core/sql/allowlist.js.map +1 -1
- package/dist/core/sql/ast.js +1 -1
- package/dist/core/sql/ast.js.map +1 -1
- package/dist/core/sql/compile.js +1 -1
- package/dist/core/sql/compile.js.map +1 -1
- package/dist/core/sql/policy.d.ts +2 -0
- package/dist/core/sql/policy.d.ts.map +1 -1
- package/dist/core/sql/policy.js +25 -6
- package/dist/core/sql/policy.js.map +1 -1
- package/dist/core/sql/run.d.ts +0 -8
- package/dist/core/sql/run.d.ts.map +1 -1
- package/dist/core/sql/run.js +152 -35
- package/dist/core/sql/run.js.map +1 -1
- package/dist/d1/executor.d.ts +2 -0
- package/dist/d1/executor.d.ts.map +1 -1
- package/dist/d1/executor.js +6 -1
- package/dist/d1/executor.js.map +1 -1
- package/dist/postgres/adapter.d.ts +5 -2
- package/dist/postgres/adapter.d.ts.map +1 -1
- package/dist/postgres/adapter.js +7 -1
- package/dist/postgres/adapter.js.map +1 -1
- package/dist/postgres/compile/index.d.ts +1 -1
- package/dist/postgres/compile/index.js +1 -1
- package/dist/postgres/driver.d.ts +38 -21
- package/dist/postgres/driver.d.ts.map +1 -1
- package/dist/postgres/driver.js +100 -24
- package/dist/postgres/driver.js.map +1 -1
- package/dist/postgres/executor.d.ts +8 -0
- package/dist/postgres/executor.d.ts.map +1 -1
- package/dist/postgres/executor.js +40 -13
- package/dist/postgres/executor.js.map +1 -1
- package/dist/postgres/index.d.ts +2 -1
- package/dist/postgres/index.d.ts.map +1 -1
- package/dist/postgres/index.js +1 -0
- package/dist/postgres/index.js.map +1 -1
- package/dist/postgres/lower.d.ts.map +1 -1
- package/dist/postgres/lower.js +3 -8
- package/dist/postgres/lower.js.map +1 -1
- package/dist/postgres/print.d.ts.map +1 -1
- package/dist/postgres/print.js +2 -15
- package/dist/postgres/print.js.map +1 -1
- package/dist/postgres/session.d.ts +9 -0
- package/dist/postgres/session.d.ts.map +1 -0
- package/dist/postgres/session.js +111 -0
- package/dist/postgres/session.js.map +1 -0
- package/dist/postgres/storage.d.ts +14 -1
- package/dist/postgres/storage.d.ts.map +1 -1
- package/dist/postgres/storage.js +136 -54
- package/dist/postgres/storage.js.map +1 -1
- package/dist/postgres/validator.d.ts +4 -3
- package/dist/postgres/validator.d.ts.map +1 -1
- package/dist/postgres/validator.js +13 -6
- package/dist/postgres/validator.js.map +1 -1
- package/dist/spec/domain/model/ManifestGrammar.d.ts +4 -0
- package/dist/spec/domain/model/ManifestGrammar.d.ts.map +1 -1
- package/dist/spec/domain/model/ManifestGrammar.js +4 -0
- package/dist/spec/domain/model/ManifestGrammar.js.map +1 -1
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +2 -0
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +1 -1
- package/dist/spec/domain/service/SchemaAdminUiChecker.js +50 -6
- package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +1 -1
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +1 -1
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +1 -1
- package/dist/spec/domain/service/ViewAdminUiChecker.js +7 -2
- package/dist/spec/domain/service/ViewAdminUiChecker.js.map +1 -1
- package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +1 -1
- package/dist/spec/infrastructure/sql/compilePlan.js +5 -0
- package/dist/spec/infrastructure/sql/compilePlan.js.map +1 -1
- package/dist/spec/kernel/diagnostic.d.ts +1 -1
- package/dist/spec/kernel/diagnostic.d.ts.map +1 -1
- package/dist/spec/kernel/diagnostic.js +5 -0
- package/dist/spec/kernel/diagnostic.js.map +1 -1
- package/dist/testing/cases/corpus.d.ts +2 -0
- package/dist/testing/cases/corpus.d.ts.map +1 -1
- package/dist/testing/cases/corpus.js +7 -5
- package/dist/testing/cases/corpus.js.map +1 -1
- package/dist/testing/cases/policy.d.ts +14 -1
- package/dist/testing/cases/policy.d.ts.map +1 -1
- package/dist/testing/cases/policy.js +3 -2
- package/dist/testing/cases/policy.js.map +1 -1
- package/dist/testing/cases/printer.d.ts.map +1 -1
- package/dist/testing/cases/printer.js +3 -1
- package/dist/testing/cases/printer.js.map +1 -1
- package/dist/testing/cases/report-view.d.ts.map +1 -1
- package/dist/testing/cases/report-view.js +18 -0
- package/dist/testing/cases/report-view.js.map +1 -1
- package/docs/adr/0037-postgresql-is-the-reference-dialect.md +2 -1
- package/docs/adr/0039-postgresql-is-native.md +130 -0
- package/docs/adr/README.md +2 -0
- package/docs/adr/adr-lite-1376-admin-extensions.md +330 -0
- package/docs/examples/commerce-inventory.md +18 -1
- package/docs/examples/reference-service/package.json +2 -2
- package/docs/handbook/cloudflare/authentication.md +3 -3
- package/docs/handbook/cloudflare/deploy-and-operate.md +4 -1
- package/docs/handbook/concepts/runtime-and-adapters.md +74 -33
- package/docs/handbook/concepts/views.md +1 -1
- package/docs/handbook/guides/admin-extensions.md +191 -0
- package/docs/handbook/guides/admin-ui.md +2 -1
- package/docs/handbook/navigation.json +2 -1
- package/docs/handbook/reference/diagnostics.md +1 -0
- package/docs/handbook/reference/procedure.md +2 -1
- package/docs/handbook/reference/schema.md +6 -3
- package/docs/handbook/reference/surface.md +6 -2
- package/docs/handbook/reference/view.md +7 -5
- package/docs/handbook/releases/index.md +78 -4
- package/docs/handbook/start/project-and-cli.md +20 -12
- package/docs/skills/develop/SKILL.md +8 -2
- package/docs/skills/provision/SKILL.md +4 -1
- package/docs/skills/update/SKILL.md +3 -0
- package/docs/upgrade-0.1-to-0.2.md +1 -1
- package/package.json +6 -5
- package/dist/postgres/textRows.d.ts +0 -10
- package/dist/postgres/textRows.d.ts.map +0 -1
- package/dist/postgres/textRows.js +0 -44
- package/dist/postgres/textRows.js.map +0 -1
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { type MantleDialect, type RestrictSql } from "../core/dialect.js";
|
|
2
2
|
import type { MantleStorageAdapter } from "../core/service.js";
|
|
3
|
-
import type
|
|
3
|
+
import { type PgConnect } from "./driver.js";
|
|
4
4
|
export interface PostgresStorageOptions {
|
|
5
5
|
/** Opens one connected client: `async () => { const c = new pg.Client(env.HYPERDRIVE.connectionString); await c.connect(); return c; }`. */
|
|
6
6
|
readonly connect: PgConnect;
|
|
7
7
|
/** The site time zone `date_trunc` and `extract` compute in (IANA name). Default UTC. */
|
|
8
8
|
readonly timeZone?: string;
|
|
9
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* Each statement's limit, in milliseconds. Default 10 000; 0 is no limit (ADR-0037 decision 5). A write batch sets it on its
|
|
11
|
+
* transaction; a read runs under the role's `statement_timeout`, which boot requires to be set and no larger (#1379).
|
|
12
|
+
*/
|
|
10
13
|
readonly statementTimeoutMs?: number;
|
|
11
14
|
/**
|
|
12
15
|
* Refusals of its own, run after the dialect's on every program at runtime (ADR-0037 decision 4). It can only narrow what
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/postgres/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/postgres/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAOvD,MAAM,WAAW,sBAAsB;IACrC,4IAA4I;IAC5I,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;CACjC;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,QAAQ,SAAQ,GAAG,aAAa,CAe/D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,oBAAoB,CAiBrF"}
|
package/dist/postgres/adapter.js
CHANGED
|
@@ -3,6 +3,7 @@ import { DiagnosticError, makeDiagnostic } from "../spec/kernel/index.js";
|
|
|
3
3
|
import { restricted } from "../core/dialect.js";
|
|
4
4
|
import { decodeOutput, encodeInput } from "./codec.js";
|
|
5
5
|
import { name, version } from "./compile/index.js";
|
|
6
|
+
import { bootRead } from "./driver.js";
|
|
6
7
|
import { PgStoreExecutor } from "./executor.js";
|
|
7
8
|
import { pgLowering } from "./lower.js";
|
|
8
9
|
import { bindBox } from "../d1/lower.js";
|
|
@@ -20,6 +21,8 @@ export function postgresDialect(timeZone = "UTC") {
|
|
|
20
21
|
codec: { encode: encodeInput, decode: decodeOutput },
|
|
21
22
|
check: validateIr,
|
|
22
23
|
lowering: pgLowering(timeZone),
|
|
24
|
+
nativeOrder: true,
|
|
25
|
+
nativeSql: true,
|
|
23
26
|
// the one bind the dialect adds, a corner of a near() box, is D1's (including its refusal of a box across a pole)
|
|
24
27
|
bind: bindBox,
|
|
25
28
|
};
|
|
@@ -31,7 +34,10 @@ export function postgresStorage(options) {
|
|
|
31
34
|
return {
|
|
32
35
|
dialect: restricted(postgresDialect(options.timeZone), options.restrict),
|
|
33
36
|
async prepare(plan) {
|
|
34
|
-
const
|
|
37
|
+
const { problems: settings, booted } = await bootRead(options.connect, ms);
|
|
38
|
+
if (settings.length)
|
|
39
|
+
throw new DiagnosticError(settings.map((message) => makeDiagnostic({ code: "STORAGE_CHANGE_BLOCKED", phase: "boot", severity: "error", path: "storage:settings", message })));
|
|
40
|
+
const report = await convergeStorage(options.connect, plan.schemas, { fingerprint: plan.fingerprint, booted });
|
|
35
41
|
if (report.blocked.length)
|
|
36
42
|
throw new DiagnosticError(report.blocked.map((b) => makeDiagnostic({ code: b.code === "STORAGE_TABLE_NOT_OWNED" ? "STORAGE_TABLE_NOT_OWNED" : "STORAGE_CHANGE_BLOCKED", phase: "boot", severity: "error", path: `storage:${b.schema}`, message: b.message })));
|
|
37
43
|
for (const u of report.undeclared)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/postgres/adapter.ts"],"names":[],"mappings":"AAAA,2HAA2H;AAC3H,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAwC,MAAM,oBAAoB,CAAC;AAEtF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/postgres/adapter.ts"],"names":[],"mappings":"AAAA,2HAA2H;AAC3H,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAwC,MAAM,oBAAoB,CAAC;AAEtF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAmB5C,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAAC,QAAQ,GAAG,KAAK;IAC9C,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,kDAAkD;IAClG,4HAA4H;IAC5H,IAAI,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,qEAAqE,QAAQ,EAAE,CAAC,CAAC;IAClJ,OAAO;QACL,IAAI;QACJ,OAAO;QACP,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE;QACpD,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC;QAC9B,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI;QACf,kHAAkH;QAClH,IAAI,EAAE,OAAO;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC7D,MAAM,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IACtC,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,kFAAkF,EAAE,EAAE,CAAC,CAAC;IACzK,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC;QACxE,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC3E,IAAI,QAAQ,CAAC,MAAM;gBACjB,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAChL,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/G,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM;gBACvB,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,yBAAyB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACjQ,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU;gBAAE,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5F,yHAAyH;YACzH,OAAO,EAAE,QAAQ,EAAE,IAAI,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACnI,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/** The PostgreSQL dialect as a plan records it (ADR-0035 decision 5). `version` changes when what a PostgreSQL plan means changes. */
|
|
6
6
|
export declare const name = "@aotter/mantle/postgres";
|
|
7
|
-
export declare const version = "
|
|
7
|
+
export declare const version = "2";
|
|
8
8
|
export { validateProgram as accepts } from "../validator.js";
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/** The PostgreSQL dialect as a plan records it (ADR-0035 decision 5). `version` changes when what a PostgreSQL plan means changes. */
|
|
6
6
|
export const name = "@aotter/mantle/postgres";
|
|
7
|
-
export const version = "
|
|
7
|
+
export const version = "2";
|
|
8
8
|
export { validateProgram as accepts } from "../validator.js";
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The PostgreSQL connection port. Structural types of node-postgres (`pg`), so Mantle depends on no driver: the host passes
|
|
3
3
|
* `connect`, which opens one client (`new Client(env.HYPERDRIVE.connectionString)` on Workers, where Hyperdrive pools the
|
|
4
|
-
* connections and a socket must not outlive its request). Every operation opens a client and ends it
|
|
4
|
+
* connections and a socket must not outlive its request). Every operation opens a client and ends it; `requestScoped`
|
|
5
|
+
* (session.ts) makes that one client per request.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
7
|
+
* A transaction only where atomicity needs one (#1379): a read is one bare statement, one round trip. A write batch is
|
|
8
|
+
* BEGIN … COMMIT; a client that pipelines (node-postgres `new Client({ pipeline: true })`) gets all of it written before the
|
|
9
|
+
* first answer is read, one round trip, and one that does not takes N + 2. Nothing depends on per-transaction session state:
|
|
10
|
+
* what decoding needs is the role's or the database's configuration, checked once at boot (`bootRead`).
|
|
8
11
|
*/
|
|
9
12
|
import type { DatabaseDriver } from "../core/driver.js";
|
|
10
13
|
export interface PgField {
|
|
@@ -18,8 +21,8 @@ export interface PgResult {
|
|
|
18
21
|
readonly fields: readonly PgField[];
|
|
19
22
|
}
|
|
20
23
|
export interface PgClient {
|
|
21
|
-
/**
|
|
22
|
-
readonly
|
|
24
|
+
/** node-postgres pipeline mode: queries issued without awaiting share the wire. */
|
|
25
|
+
readonly pipeline?: boolean;
|
|
23
26
|
execute?(statement: PgStatement): Promise<PgOutcome>;
|
|
24
27
|
query(config: {
|
|
25
28
|
text: string;
|
|
@@ -33,6 +36,8 @@ export interface PgClient {
|
|
|
33
36
|
command: string;
|
|
34
37
|
}>;
|
|
35
38
|
end(): Promise<void>;
|
|
39
|
+
/** node-postgres: the last ReadyForQuery's state, `I` idle, `T` in a transaction, `E` in a failed one. */
|
|
40
|
+
getTransactionStatus?(): string | null;
|
|
36
41
|
}
|
|
37
42
|
/** Opens one connected client. */
|
|
38
43
|
export type PgConnect = () => Promise<PgClient>;
|
|
@@ -46,12 +51,6 @@ export declare const sqlState: (e: unknown) => string | undefined;
|
|
|
46
51
|
export interface PgStatement {
|
|
47
52
|
readonly text: string;
|
|
48
53
|
readonly values?: readonly unknown[];
|
|
49
|
-
readonly describeResult?: () => {
|
|
50
|
-
query: string;
|
|
51
|
-
names: string[] | undefined;
|
|
52
|
-
} | undefined;
|
|
53
|
-
/** The statement is a read: a client that had to begin read-write (to describe it) makes the transaction read-only first. */
|
|
54
|
-
readonly readOnly?: boolean;
|
|
55
54
|
}
|
|
56
55
|
/** One statement's rows (decoded) and the rows it wrote or returned. */
|
|
57
56
|
export interface PgOutcome {
|
|
@@ -63,30 +62,48 @@ export declare const STATEMENT_TIMEOUT_MS = 10000;
|
|
|
63
62
|
/**
|
|
64
63
|
* Statements in one SERIALIZABLE transaction, all or nothing. SERIALIZABLE keeps what SQLite's one writer gave every guard
|
|
65
64
|
* (`WHERE NOT EXISTS`, a first sign-up becoming owner): a concurrent write that would break one fails with 40001 and the
|
|
66
|
-
* whole batch is retried. `
|
|
65
|
+
* whole batch is retried. A write's `expect` is checked inside its own statement (executor.ts), so nothing waits between them.
|
|
67
66
|
*/
|
|
68
|
-
export declare function transaction(connect: PgConnect, statements: readonly PgStatement[],
|
|
67
|
+
export declare function transaction(connect: PgConnect, statements: readonly PgStatement[], timeoutMs?: number): Promise<PgOutcome[]>;
|
|
69
68
|
/**
|
|
70
|
-
* One read
|
|
71
|
-
*
|
|
72
|
-
*
|
|
69
|
+
* One read: one statement in autocommit, which is a transaction of its own, one round trip. It runs under the session's
|
|
70
|
+
* settings and statement_timeout, which boot checked; a read sees the write before it because the Hyperdrive config has
|
|
71
|
+
* caching disabled (the generated preset creates it so, since Better Auth's reads were never in a transaction either).
|
|
73
72
|
*/
|
|
74
|
-
export declare function query(connect: PgConnect, s: PgStatement
|
|
73
|
+
export declare function query(connect: PgConnect, s: PgStatement): Promise<PgOutcome>;
|
|
74
|
+
/**
|
|
75
|
+
* What decoding and the statement limit need from the server, and the converged fingerprint, read once at boot in one statement: anything returned is a
|
|
76
|
+
* problem with the fix an operator runs. Role or database configuration, never `SET` per transaction: Hyperdrive resets a
|
|
77
|
+
* pooled session to exactly that configuration, and a bare read has no transaction to pin anything in.
|
|
78
|
+
* - DateStyle ISO and IntervalStyle postgres: the text `decodeField` parses. extra_float_digits >= 1: shortest exact floats.
|
|
79
|
+
* - standard_conforming_strings on: a backslash in a printed literal is a backslash, never an escape.
|
|
80
|
+
* - TimeZone UTC: not for decoding (`decodeField` reads any offset PostgreSQL prints) but for meaning, since a cast between date
|
|
81
|
+
* and timestamptz, explicit or implicit, is taken in the session's zone, and an author's SQL cannot be checked for those casts.
|
|
82
|
+
* - statement_timeout: a read is bounded by the role's limit, so it must be set and at most Mantle's (0 asks for none).
|
|
83
|
+
*/
|
|
84
|
+
export declare function bootRead(connect: PgConnect, timeoutMs?: number): Promise<{
|
|
85
|
+
problems: string[];
|
|
86
|
+
booted: string | null;
|
|
87
|
+
}>;
|
|
75
88
|
/** `?1` binds (Mantle's portable SQL) as PostgreSQL's `$1`, outside quoted strings and names. */
|
|
76
89
|
export declare const numbered: (sql: string) => string;
|
|
77
90
|
/**
|
|
78
|
-
* The `DatabaseDriver` over PostgreSQL, for auth's portable SQL and the conformance fixtures: every batch is one transaction.
|
|
91
|
+
* The `DatabaseDriver` over PostgreSQL, for auth's portable SQL and the conformance fixtures: every batch is one transaction, a single read is not.
|
|
79
92
|
*/
|
|
80
93
|
export declare function pgDatabaseDriver(connect: PgConnect): DatabaseDriver;
|
|
81
94
|
/**
|
|
82
95
|
* What Better Auth takes as a PostgreSQL pool (`database: pgPool(connect)`): Kysely's `PostgresDialect` asks it for a client per
|
|
83
96
|
* query or transaction and releases it, so each gets its own connection, as the Workers rule above asks.
|
|
84
97
|
*/
|
|
85
|
-
export declare function pgPool(connect: PgConnect):
|
|
98
|
+
export declare function pgPool(connect: PgConnect): PgAuthPool;
|
|
99
|
+
/** Kysely's PostgresPool, structurally (no auth import here). Kysely also declares a cursor form of `query`, which Better Auth never calls and the driver does not offer. */
|
|
100
|
+
export interface PgAuthPool {
|
|
86
101
|
readonly options: Readonly<Record<string, never>>;
|
|
87
|
-
connect(): Promise<
|
|
102
|
+
connect(): Promise<{
|
|
103
|
+
query(sql: string, parameters: readonly unknown[]): Promise<any>;
|
|
104
|
+
query(cursor: unknown): any;
|
|
88
105
|
release(): void;
|
|
89
106
|
}>;
|
|
90
107
|
end(): Promise<void>;
|
|
91
|
-
}
|
|
108
|
+
}
|
|
92
109
|
//# sourceMappingURL=driver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/postgres/driver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/postgres/driver.ts"],"names":[],"mappings":"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"}
|
package/dist/postgres/driver.js
CHANGED
|
@@ -13,35 +13,48 @@ async function run(client, s) {
|
|
|
13
13
|
return { rows, count: r.rowCount ?? rows.length };
|
|
14
14
|
}
|
|
15
15
|
const SERIALIZATION = new Set(["40001", "40P01"]);
|
|
16
|
-
/**
|
|
17
|
-
* What every wire value is decoded under, whatever the server's defaults: ISO dates, PostgreSQL interval text, shortest exact
|
|
18
|
-
* floats, UTC. `SET LOCAL` inside the transaction, because Hyperdrive pools connections per transaction.
|
|
19
|
-
*/
|
|
20
|
-
const PINNED = "SET LOCAL DateStyle = 'ISO, YMD'; SET LOCAL IntervalStyle = 'postgres'; SET LOCAL extra_float_digits = 1; SET LOCAL TimeZone = 'UTC'; " +
|
|
21
|
-
// pg_temp named last: a temporary table on a pooled session never stands in for a Schema table of the same name
|
|
22
|
-
"SELECT set_config('search_path', concat_ws(', ', nullif(current_setting('search_path'), ''), 'pg_temp'), true)";
|
|
23
16
|
/** ADR-0037 decision 5: a statement that runs away (a recursive CTE, a regular expression) ends here. 0 is no limit. */
|
|
24
17
|
export const STATEMENT_TIMEOUT_MS = 10_000;
|
|
25
|
-
|
|
18
|
+
/**
|
|
19
|
+
* A transaction's first message, still one round trip. A write's own limit is `SET LOCAL` (convergence lifts it to build
|
|
20
|
+
* indexes); a read has the role's, which boot checked.
|
|
21
|
+
*/
|
|
22
|
+
const begin = (head, timeoutMs) => `${head}; SET LOCAL statement_timeout = ${Math.max(0, Math.floor(timeoutMs))}`;
|
|
26
23
|
const ATTEMPTS = 5;
|
|
27
24
|
/**
|
|
28
25
|
* Statements in one SERIALIZABLE transaction, all or nothing. SERIALIZABLE keeps what SQLite's one writer gave every guard
|
|
29
26
|
* (`WHERE NOT EXISTS`, a first sign-up becoming owner): a concurrent write that would break one fails with 40001 and the
|
|
30
|
-
* whole batch is retried. `
|
|
27
|
+
* whole batch is retried. A write's `expect` is checked inside its own statement (executor.ts), so nothing waits between them.
|
|
31
28
|
*/
|
|
32
|
-
export async function transaction(connect, statements,
|
|
29
|
+
export async function transaction(connect, statements, timeoutMs = STATEMENT_TIMEOUT_MS) {
|
|
33
30
|
for (let attempt = 1;; attempt++) {
|
|
31
|
+
// a retry waits a random while first: writers that failed together, retried at once, collide again (a pipelined batch,
|
|
32
|
+
// one round trip long, does so every time) and run out of attempts
|
|
33
|
+
if (attempt > 1)
|
|
34
|
+
await new Promise((resolve) => setTimeout(resolve, Math.random() * 10 * 2 ** attempt));
|
|
34
35
|
const client = await connect();
|
|
36
|
+
if (client.pipeline && statements.every((s) => (s.values ?? []).every(wire))) {
|
|
37
|
+
try {
|
|
38
|
+
return await pipelined(client, begin("BEGIN ISOLATION LEVEL SERIALIZABLE", timeoutMs), statements);
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
if (SERIALIZATION.has(sqlState(e) ?? "") && attempt < ATTEMPTS)
|
|
42
|
+
continue;
|
|
43
|
+
throw e;
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
await client.end().catch(() => undefined);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
35
49
|
let failedAt = -1;
|
|
36
50
|
let committing = false;
|
|
37
51
|
try {
|
|
38
|
-
await client.query({ text:
|
|
52
|
+
await client.query({ text: begin("BEGIN ISOLATION LEVEL SERIALIZABLE", timeoutMs) });
|
|
39
53
|
const out = [];
|
|
40
54
|
for (const [i, s] of statements.entries()) {
|
|
41
55
|
failedAt = i;
|
|
42
56
|
out.push(await run(client, s));
|
|
43
57
|
failedAt = -1;
|
|
44
|
-
check?.(i, out[i]);
|
|
45
58
|
}
|
|
46
59
|
committing = true;
|
|
47
60
|
await client.query({ text: "COMMIT" });
|
|
@@ -60,36 +73,99 @@ export async function transaction(connect, statements, check, timeoutMs = STATEM
|
|
|
60
73
|
}
|
|
61
74
|
}
|
|
62
75
|
/**
|
|
63
|
-
* One read
|
|
64
|
-
*
|
|
65
|
-
*
|
|
76
|
+
* One read: one statement in autocommit, which is a transaction of its own, one round trip. It runs under the session's
|
|
77
|
+
* settings and statement_timeout, which boot checked; a read sees the write before it because the Hyperdrive config has
|
|
78
|
+
* caching disabled (the generated preset creates it so, since Better Auth's reads were never in a transaction either).
|
|
66
79
|
*/
|
|
67
|
-
export async function query(connect, s
|
|
80
|
+
export async function query(connect, s) {
|
|
68
81
|
const client = await connect();
|
|
69
82
|
try {
|
|
70
|
-
await
|
|
71
|
-
const out = await run(client, { ...s, readOnly: true });
|
|
72
|
-
await client.query({ text: "COMMIT" });
|
|
73
|
-
return out;
|
|
83
|
+
return await run(client, s);
|
|
74
84
|
}
|
|
75
|
-
|
|
76
|
-
await client.
|
|
77
|
-
|
|
85
|
+
finally {
|
|
86
|
+
await client.end().catch(() => undefined);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* What decoding and the statement limit need from the server, and the converged fingerprint, read once at boot in one statement: anything returned is a
|
|
91
|
+
* problem with the fix an operator runs. Role or database configuration, never `SET` per transaction: Hyperdrive resets a
|
|
92
|
+
* pooled session to exactly that configuration, and a bare read has no transaction to pin anything in.
|
|
93
|
+
* - DateStyle ISO and IntervalStyle postgres: the text `decodeField` parses. extra_float_digits >= 1: shortest exact floats.
|
|
94
|
+
* - standard_conforming_strings on: a backslash in a printed literal is a backslash, never an escape.
|
|
95
|
+
* - TimeZone UTC: not for decoding (`decodeField` reads any offset PostgreSQL prints) but for meaning, since a cast between date
|
|
96
|
+
* and timestamptz, explicit or implicit, is taken in the session's zone, and an author's SQL cannot be checked for those casts.
|
|
97
|
+
* - statement_timeout: a read is bounded by the role's limit, so it must be set and at most Mantle's (0 asks for none).
|
|
98
|
+
*/
|
|
99
|
+
export async function bootRead(connect, timeoutMs = STATEMENT_TIMEOUT_MS) {
|
|
100
|
+
const client = await connect();
|
|
101
|
+
try {
|
|
102
|
+
// the driver's own types, int4 and bool only
|
|
103
|
+
const settings = `SELECT quote_ident(current_user) AS role, quote_ident(current_database()) AS db,
|
|
104
|
+
current_setting('DateStyle') AS datestyle, current_setting('IntervalStyle') AS intervalstyle,
|
|
105
|
+
current_setting('extra_float_digits')::int4 AS float_digits, current_setting('standard_conforming_strings') AS scs,
|
|
106
|
+
(SELECT setting::int4 FROM pg_settings WHERE name = 'statement_timeout') AS timeout_ms, current_setting('TimeZone') AS tz,
|
|
107
|
+
(SELECT bool_and(extract(timezone FROM t) = 0) FROM unnest('{1900-01-01 00:00+00, 1970-01-01 00:00+00, 2000-01-01 00:00+00, 2000-07-01 00:00+00}'::timestamptz[]) t) AS utc`;
|
|
108
|
+
// the converged state rides along in the same statement; a database never booted has no table, which fails the statement
|
|
109
|
+
// (42P01) and costs the first boot one more round trip, once
|
|
110
|
+
const booted = ", (SELECT value FROM _mantle_boot_state WHERE key = 'fingerprint') AS booted";
|
|
111
|
+
const [r] = (await client.query({ text: settings + booted }).catch((e) => {
|
|
112
|
+
if (sqlState(e) !== "42P01")
|
|
113
|
+
throw e;
|
|
114
|
+
return client.query({ text: settings });
|
|
115
|
+
})).rows;
|
|
116
|
+
const fix = (name, value) => `ALTER ROLE ${r.role} SET ${name} = '${value}' (or ALTER DATABASE ${r.db} SET …); new connections read it`;
|
|
117
|
+
const ms = Math.max(0, Math.floor(timeoutMs));
|
|
118
|
+
const problems = [
|
|
119
|
+
...(/^ISO\b/i.test(r.datestyle) ? [] : [`DateStyle is '${r.datestyle}'; Mantle reads dates as ISO text: ${fix("DateStyle", "ISO, YMD")}`]),
|
|
120
|
+
...(r.intervalstyle === "postgres" ? [] : [`IntervalStyle is '${r.intervalstyle}'; Mantle reads intervals as PostgreSQL text: ${fix("IntervalStyle", "postgres")}`]),
|
|
121
|
+
...(r.float_digits >= 1 ? [] : [`extra_float_digits is ${r.float_digits}, which rounds float8 values: ${fix("extra_float_digits", "1")}`]),
|
|
122
|
+
...(r.utc ? [] : [`TimeZone is '${r.tz}'; Mantle casts between dates and instants in UTC: ${fix("TimeZone", "UTC")}`]),
|
|
123
|
+
...(r.scs === "on" ? [] : [`standard_conforming_strings is off: ${fix("standard_conforming_strings", "on")}`]),
|
|
124
|
+
...(!ms || (r.timeout_ms > 0 && r.timeout_ms <= ms) ? [] :
|
|
125
|
+
[`statement_timeout is ${r.timeout_ms ? `${r.timeout_ms} ms` : "unset"}; a read runs outside a transaction under the role's limit, which must be at most ${ms} ms (statementTimeoutMs): ${fix("statement_timeout", `${ms}ms`)}`]),
|
|
126
|
+
];
|
|
127
|
+
return { problems, booted: typeof r.booted === "string" ? r.booted : null };
|
|
78
128
|
}
|
|
79
129
|
finally {
|
|
80
130
|
await client.end().catch(() => undefined);
|
|
81
131
|
}
|
|
82
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* A bind node-postgres encodes without throwing. One it throws on fails on the client after Parse: it sends Close and Sync, the
|
|
135
|
+
* server never sees an error, and a pipelined COMMIT would commit the statements around it. Such a batch goes one at a time.
|
|
136
|
+
*/
|
|
137
|
+
const wire = (v) => v == null || ["string", "number", "boolean", "bigint"].includes(typeof v) || v instanceof Date || ArrayBuffer.isView(v);
|
|
138
|
+
/**
|
|
139
|
+
* BEGIN, every statement and COMMIT written at once. Each is its own Sync, so a failure the server answers leaves the
|
|
140
|
+
* transaction aborted: the statements after it fail with 25P02 and COMMIT answers ROLLBACK, which ends it, so no ROLLBACK
|
|
141
|
+
* follows. The first failure is the one reported, with its statement. A failure without a SQLSTATE is the socket's, and COMMIT
|
|
142
|
+
* was already written: whether it ran is unknown (`committing`), wherever the first rejection landed.
|
|
143
|
+
*/
|
|
144
|
+
async function pipelined(client, begin, statements) {
|
|
145
|
+
const settled = await Promise.allSettled([
|
|
146
|
+
client.query({ text: begin }),
|
|
147
|
+
...statements.map((s) => run(client, s)),
|
|
148
|
+
client.query({ text: "COMMIT" }),
|
|
149
|
+
]);
|
|
150
|
+
const failed = settled.findIndex((r) => r.status === "rejected");
|
|
151
|
+
if (failed === -1)
|
|
152
|
+
return settled.slice(1, -1).map((r) => r.value);
|
|
153
|
+
const e = settled[failed].reason;
|
|
154
|
+
throw Object.assign(e, { statement: failed >= 1 && failed <= statements.length ? failed - 1 : -1, committing: failed === statements.length + 1 || !sqlState(e) });
|
|
155
|
+
}
|
|
83
156
|
/** `?1` binds (Mantle's portable SQL) as PostgreSQL's `$1`, outside quoted strings and names. */
|
|
84
157
|
export const numbered = (sql) => sql.replace(/'(?:[^']|'')*'|"(?:[^"]|"")*"|\?(\d+)/g, (m, n) => (n ? `$${n}` : m));
|
|
85
158
|
/**
|
|
86
|
-
* The `DatabaseDriver` over PostgreSQL, for auth's portable SQL and the conformance fixtures: every batch is one transaction.
|
|
159
|
+
* The `DatabaseDriver` over PostgreSQL, for auth's portable SQL and the conformance fixtures: every batch is one transaction, a single read is not.
|
|
87
160
|
*/
|
|
88
161
|
export function pgDatabaseDriver(connect) {
|
|
89
162
|
return {
|
|
90
163
|
async batch(statements) {
|
|
91
164
|
return (await transaction(connect, statements.map((s) => ({ text: numbered(s.sql), values: s.binds })))).map((o) => ({ rows: o.rows }));
|
|
92
165
|
},
|
|
166
|
+
// a read is one statement in autocommit (`query`): no BEGIN, no COMMIT, no isolation retry loop
|
|
167
|
+
async all(s) { return (await query(connect, { text: numbered(s.sql), values: s.binds })).rows; },
|
|
168
|
+
async first(s) { return (await query(connect, { text: numbered(s.sql), values: s.binds })).rows[0] ?? null; },
|
|
93
169
|
};
|
|
94
170
|
}
|
|
95
171
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/postgres/driver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/postgres/driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,14 @@ export declare class PgStoreExecutor implements StoreExecutor {
|
|
|
12
12
|
constructor(connect: PgConnect, schemas: Readonly<Record<string, StorageSchema>>,
|
|
13
13
|
/** Check constraint name -> "<schema>: <expression>", the message D1 gives for the same check. */
|
|
14
14
|
checks: ReadonlyMap<string, string>, timeoutMs?: number | undefined);
|
|
15
|
+
/**
|
|
16
|
+
* The printed form of an IR, once. A sealed plan's compiled statements (and the paged forms Core caches) are the same objects on
|
|
17
|
+
* every request, and `typed` + `print` is a pure function of the IR and this executor's schemas, so the WeakMap lives as long as the plan.
|
|
18
|
+
*/
|
|
19
|
+
private readonly printed;
|
|
20
|
+
/** ASTs already checked to hold no write; Core allowlists a View to one SELECT, this guards the executor on its own. */
|
|
21
|
+
private readonly readChecked;
|
|
22
|
+
private print;
|
|
15
23
|
private prepared;
|
|
16
24
|
select(statement: StoreStatement): Promise<readonly StoreRow[]>;
|
|
17
25
|
apply(batch: readonly StoreStatement[]): Promise<readonly StoreApplied[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/postgres/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAgC,KAAK,SAAS,EAAkC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/postgres/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAgC,KAAK,SAAS,EAAkC,MAAM,aAAa,CAAC;AAW3G,qBAAa,eAAgB,YAAW,aAAa;IAIjD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,kGAAkG;IAClG,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAP7B,iEAAiE;IACjE,QAAQ,CAAC,WAAW,SAAU;gBAEX,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjE,kGAAkG;IACjF,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,SAAS,CAAC,EAAE,MAAM,YAAA;IAGrC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6D;IACrF,wHAAwH;IACxH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IAErD,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,QAAQ;IAYV,MAAM,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC;IAU/D,KAAK,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAM/E,OAAO,CAAC,MAAM;CAsBf"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/** PgStoreExecutor: the PostgreSQL dialect's StoreExecutor. Prints IR (`typed`, then the deparser) and runs it over `PgConnect`. */
|
|
2
2
|
import { DiagnosticError, runtimeDiagnostic } from "../spec/kernel/index.js";
|
|
3
3
|
import { query, sqlState, transaction } from "./driver.js";
|
|
4
|
-
import {
|
|
4
|
+
import { EXPECT_STATE } from "./storage.js";
|
|
5
5
|
import { print, typed } from "./print.js";
|
|
6
6
|
const fail = (code, message, conflict) => new DiagnosticError(runtimeDiagnostic({ code, severity: "error", path: "store", message, ...(conflict ? { conflict } : {}) }));
|
|
7
|
+
const WRITES = new Set(["InsertStmt", "UpdateStmt", "DeleteStmt", "MergeStmt"]);
|
|
8
|
+
const writes = (v) => Array.isArray(v) ? v.some(writes) : !!v && typeof v === "object" && Object.entries(v).some(([k, x]) => WRITES.has(k) || writes(x));
|
|
7
9
|
export class PgStoreExecutor {
|
|
8
10
|
connect;
|
|
9
11
|
schemas;
|
|
@@ -19,25 +21,49 @@ export class PgStoreExecutor {
|
|
|
19
21
|
this.checks = checks;
|
|
20
22
|
this.timeoutMs = timeoutMs;
|
|
21
23
|
}
|
|
22
|
-
|
|
24
|
+
/**
|
|
25
|
+
* The printed form of an IR, once. A sealed plan's compiled statements (and the paged forms Core caches) are the same objects on
|
|
26
|
+
* every request, and `typed` + `print` is a pure function of the IR and this executor's schemas, so the WeakMap lives as long as the plan.
|
|
27
|
+
*/
|
|
28
|
+
printed = new WeakMap();
|
|
29
|
+
/** ASTs already checked to hold no write; Core allowlists a View to one SELECT, this guards the executor on its own. */
|
|
30
|
+
readChecked = new WeakSet();
|
|
31
|
+
print(ir) {
|
|
32
|
+
let hit = this.printed.get(ir);
|
|
33
|
+
if (!hit) {
|
|
34
|
+
const ast = typed(ir, this.schemas);
|
|
35
|
+
this.printed.set(ir, (hit = { text: print(ast), returns: Boolean(ast[Object.keys(ast)[0]]?.returningClause) }));
|
|
36
|
+
}
|
|
37
|
+
return hit;
|
|
38
|
+
}
|
|
39
|
+
prepared(s, i = -1) {
|
|
23
40
|
if (s.binds.length > this.maxBindings)
|
|
24
41
|
throw fail("INPUT_VALIDATION_FAILED", `a statement binds ${s.binds.length} values; the limit is ${this.maxBindings}`);
|
|
25
|
-
|
|
26
|
-
|
|
42
|
+
if (s.expect === undefined)
|
|
43
|
+
return { text: this.print(s.ir).text, values: s.binds };
|
|
44
|
+
// printed into the SQL, so only a whole number; any other never matched a count, so it fails as a mismatch always did
|
|
45
|
+
if (!Number.isSafeInteger(s.expect))
|
|
46
|
+
throw fail("CONFLICT", `CONFLICT op=${i}: the write matched a different number of rows than it expected`, { opIndex: i, reason: "expect" });
|
|
47
|
+
// the count is checked by the statement itself, so nothing waits on it between statements: a data-modifying CTE always
|
|
48
|
+
// runs to completion, and an aggregate without GROUP BY is one group even over no rows, so the guard always runs
|
|
49
|
+
const { text: inner, returns } = this.print(s.ir);
|
|
50
|
+
const text = `WITH _mantle_w AS (${inner}${returns ? "" : " RETURNING 1"}), _mantle_x AS (INSERT INTO _mantle_assert (ok) SELECT true FROM _mantle_w HAVING NOT _mantle_expect(count(*), ${s.expect})) SELECT * FROM _mantle_w`;
|
|
51
|
+
return { text, values: s.binds, ...(returns ? {} : { discardRows: true }) };
|
|
27
52
|
}
|
|
28
53
|
async select(statement) {
|
|
54
|
+
// a read is a bare statement now, no READ ONLY transaction behind the allowlist: one that writes is refused here too
|
|
55
|
+
if (!this.readChecked.has(statement.ir)) {
|
|
56
|
+
if (writes(statement.ir))
|
|
57
|
+
throw fail("INPUT_VALIDATION_FAILED", "SQL_WRITE: a read cannot write");
|
|
58
|
+
this.readChecked.add(statement.ir);
|
|
59
|
+
}
|
|
29
60
|
const s = this.prepared(statement);
|
|
30
|
-
return (await query(this.connect, s
|
|
61
|
+
return (await query(this.connect, s).catch((e) => this.mapped(e, "select"))).rows;
|
|
31
62
|
}
|
|
32
63
|
async apply(batch) {
|
|
33
|
-
const statements = batch.map((s) => this.prepared(s));
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const expect = batch[i].expect;
|
|
37
|
-
if (expect !== undefined && o.count !== expect)
|
|
38
|
-
throw fail("CONFLICT", `CONFLICT op=${i}: the write matched a different number of rows than it expected`, { opIndex: i, reason: "expect" });
|
|
39
|
-
}, this.timeoutMs).catch((e) => this.mapped(e, "apply"));
|
|
40
|
-
return out.map((o) => ({ affected: o.count, rows: o.rows }));
|
|
64
|
+
const statements = batch.map((s, i) => this.prepared(s, i));
|
|
65
|
+
const out = await transaction(this.connect, statements, this.timeoutMs).catch((e) => this.mapped(e, "apply"));
|
|
66
|
+
return out.map((o, i) => ({ affected: o.count, rows: statements[i].discardRows ? [] : o.rows }));
|
|
41
67
|
}
|
|
42
68
|
mapped(e, kind) {
|
|
43
69
|
if (e instanceof DiagnosticError)
|
|
@@ -51,6 +77,7 @@ export class PgStoreExecutor {
|
|
|
51
77
|
case "23514": throw fail("INPUT_VALIDATION_FAILED", `CHECK ${this.checks.get(e.constraint ?? "") ?? "a check of the Schema failed"}`);
|
|
52
78
|
case "23502": throw fail("INPUT_VALIDATION_FAILED", "A required column has no value; a scoped Schema needs a caller identity.");
|
|
53
79
|
case "42P10": throw fail("INPUT_VALIDATION_FAILED", "onConflict.columns must match a unique index of the Schema.");
|
|
80
|
+
case EXPECT_STATE: throw fail("CONFLICT", `CONFLICT op=${at}: the write matched a different number of rows than it expected`, { opIndex: at ?? -1, reason: "expect" });
|
|
54
81
|
case "40001":
|
|
55
82
|
case "40P01": throw fail("RESOURCE_UNAVAILABLE", "The database stayed too busy to apply the write; nothing was written.");
|
|
56
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/postgres/executor.ts"],"names":[],"mappings":"AAAA,oIAAoI;AACpI,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAmB,MAAM,yBAAyB,CAAC;AAG9F,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAkD,MAAM,aAAa,CAAC;AAC3G,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/postgres/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/postgres/index.d.ts
CHANGED
|
@@ -3,5 +3,6 @@
|
|
|
3
3
|
* over any node-postgres-shaped client: `pg` with Cloudflare Hyperdrive on Workers, or `pg` on Bun and Node.
|
|
4
4
|
*/
|
|
5
5
|
export { postgresStorage, postgresDialect, type PostgresStorageOptions } from "./adapter.js";
|
|
6
|
-
export { pgDatabaseDriver, pgPool, type PgClient, type PgConnect } from "./driver.js";
|
|
6
|
+
export { pgDatabaseDriver, pgPool, type PgAuthPool, type PgClient, type PgConnect } from "./driver.js";
|
|
7
|
+
export { requestScoped, type PgSession } from "./session.js";
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/postgres/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/postgres/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACvG,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/postgres/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/postgres/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,eAAe,EAA+B,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/postgres/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,eAAe,EAA+B,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAkD,MAAM,aAAa,CAAC;AACvG,OAAO,EAAE,aAAa,EAAkB,MAAM,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lower.d.ts","sourceRoot":"","sources":["../../src/postgres/lower.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,OAAO,IAAI,CAAC,EAAE,MAAM,yBAAyB,CAAC;AAEnF,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAS3E,uEAAuE;AACvE,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAI1C;AAqCD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"lower.d.ts","sourceRoot":"","sources":["../../src/postgres/lower.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,OAAO,IAAI,CAAC,EAAE,MAAM,yBAAyB,CAAC;AAEnF,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAS3E,uEAAuE;AACvE,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAI1C;AAqCD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAgF3D"}
|