@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.
Files changed (169) hide show
  1. package/README.md +2 -2
  2. package/dist/admin/createAdminSurface.d.ts +3 -0
  3. package/dist/admin/createAdminSurface.d.ts.map +1 -1
  4. package/dist/admin/createAdminSurface.js +51 -8
  5. package/dist/admin/createAdminSurface.js.map +1 -1
  6. package/dist/admin/extensions.d.ts +290 -0
  7. package/dist/admin/extensions.d.ts.map +1 -0
  8. package/dist/admin/extensions.js +532 -0
  9. package/dist/admin/extensions.js.map +1 -0
  10. package/dist/admin/index.d.ts +1 -0
  11. package/dist/admin/index.d.ts.map +1 -1
  12. package/dist/admin/index.js +1 -0
  13. package/dist/admin/index.js.map +1 -1
  14. package/dist/auth/buildAuth.d.ts +3 -1
  15. package/dist/auth/buildAuth.d.ts.map +1 -1
  16. package/dist/auth/buildAuth.js +3 -2
  17. package/dist/auth/buildAuth.js.map +1 -1
  18. package/dist/auth/callerResolver.d.ts +4 -0
  19. package/dist/auth/callerResolver.d.ts.map +1 -1
  20. package/dist/auth/callerResolver.js +4 -1
  21. package/dist/auth/callerResolver.js.map +1 -1
  22. package/dist/auth/createMantleAuth.d.ts.map +1 -1
  23. package/dist/auth/createMantleAuth.js +3 -2
  24. package/dist/auth/createMantleAuth.js.map +1 -1
  25. package/dist/auth/db.d.ts +1 -0
  26. package/dist/auth/db.d.ts.map +1 -1
  27. package/dist/auth/db.js +6 -3
  28. package/dist/auth/db.js.map +1 -1
  29. package/dist/bun/index.d.ts +0 -44
  30. package/dist/bun/index.d.ts.map +1 -1
  31. package/dist/bun/index.js +0 -84
  32. package/dist/bun/index.js.map +1 -1
  33. package/dist/cli/generate.js +3 -3
  34. package/dist/cli/generate.js.map +1 -1
  35. package/dist/cli/preset.d.ts.map +1 -1
  36. package/dist/cli/preset.js +80 -28
  37. package/dist/cli/preset.js.map +1 -1
  38. package/dist/cloudflare/index.d.ts +4 -0
  39. package/dist/cloudflare/index.d.ts.map +1 -1
  40. package/dist/cloudflare/index.js +2 -0
  41. package/dist/cloudflare/index.js.map +1 -1
  42. package/dist/core/dialect.d.ts +13 -1
  43. package/dist/core/dialect.d.ts.map +1 -1
  44. package/dist/core/driver.d.ts +7 -0
  45. package/dist/core/driver.d.ts.map +1 -1
  46. package/dist/core/runtime/createRuntime.js +1 -1
  47. package/dist/core/runtime/createRuntime.js.map +1 -1
  48. package/dist/core/sessionUser.d.ts +14 -0
  49. package/dist/core/sessionUser.d.ts.map +1 -0
  50. package/dist/core/sessionUser.js +4 -0
  51. package/dist/core/sessionUser.js.map +1 -0
  52. package/dist/core/sql/allowlist.d.ts +2 -0
  53. package/dist/core/sql/allowlist.d.ts.map +1 -1
  54. package/dist/core/sql/allowlist.js +43 -11
  55. package/dist/core/sql/allowlist.js.map +1 -1
  56. package/dist/core/sql/ast.js +1 -1
  57. package/dist/core/sql/ast.js.map +1 -1
  58. package/dist/core/sql/compile.js +1 -1
  59. package/dist/core/sql/compile.js.map +1 -1
  60. package/dist/core/sql/policy.d.ts +2 -0
  61. package/dist/core/sql/policy.d.ts.map +1 -1
  62. package/dist/core/sql/policy.js +25 -6
  63. package/dist/core/sql/policy.js.map +1 -1
  64. package/dist/core/sql/run.d.ts +0 -8
  65. package/dist/core/sql/run.d.ts.map +1 -1
  66. package/dist/core/sql/run.js +152 -35
  67. package/dist/core/sql/run.js.map +1 -1
  68. package/dist/d1/executor.d.ts +2 -0
  69. package/dist/d1/executor.d.ts.map +1 -1
  70. package/dist/d1/executor.js +6 -1
  71. package/dist/d1/executor.js.map +1 -1
  72. package/dist/postgres/adapter.d.ts +5 -2
  73. package/dist/postgres/adapter.d.ts.map +1 -1
  74. package/dist/postgres/adapter.js +7 -1
  75. package/dist/postgres/adapter.js.map +1 -1
  76. package/dist/postgres/compile/index.d.ts +1 -1
  77. package/dist/postgres/compile/index.js +1 -1
  78. package/dist/postgres/driver.d.ts +38 -21
  79. package/dist/postgres/driver.d.ts.map +1 -1
  80. package/dist/postgres/driver.js +100 -24
  81. package/dist/postgres/driver.js.map +1 -1
  82. package/dist/postgres/executor.d.ts +8 -0
  83. package/dist/postgres/executor.d.ts.map +1 -1
  84. package/dist/postgres/executor.js +40 -13
  85. package/dist/postgres/executor.js.map +1 -1
  86. package/dist/postgres/index.d.ts +2 -1
  87. package/dist/postgres/index.d.ts.map +1 -1
  88. package/dist/postgres/index.js +1 -0
  89. package/dist/postgres/index.js.map +1 -1
  90. package/dist/postgres/lower.d.ts.map +1 -1
  91. package/dist/postgres/lower.js +3 -8
  92. package/dist/postgres/lower.js.map +1 -1
  93. package/dist/postgres/print.d.ts.map +1 -1
  94. package/dist/postgres/print.js +2 -15
  95. package/dist/postgres/print.js.map +1 -1
  96. package/dist/postgres/session.d.ts +9 -0
  97. package/dist/postgres/session.d.ts.map +1 -0
  98. package/dist/postgres/session.js +111 -0
  99. package/dist/postgres/session.js.map +1 -0
  100. package/dist/postgres/storage.d.ts +14 -1
  101. package/dist/postgres/storage.d.ts.map +1 -1
  102. package/dist/postgres/storage.js +136 -54
  103. package/dist/postgres/storage.js.map +1 -1
  104. package/dist/postgres/validator.d.ts +4 -3
  105. package/dist/postgres/validator.d.ts.map +1 -1
  106. package/dist/postgres/validator.js +13 -6
  107. package/dist/postgres/validator.js.map +1 -1
  108. package/dist/spec/domain/model/ManifestGrammar.d.ts +4 -0
  109. package/dist/spec/domain/model/ManifestGrammar.d.ts.map +1 -1
  110. package/dist/spec/domain/model/ManifestGrammar.js +4 -0
  111. package/dist/spec/domain/model/ManifestGrammar.js.map +1 -1
  112. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +2 -0
  113. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +1 -1
  114. package/dist/spec/domain/service/SchemaAdminUiChecker.js +50 -6
  115. package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +1 -1
  116. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +1 -1
  117. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +1 -1
  118. package/dist/spec/domain/service/ViewAdminUiChecker.js +7 -2
  119. package/dist/spec/domain/service/ViewAdminUiChecker.js.map +1 -1
  120. package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +1 -1
  121. package/dist/spec/infrastructure/sql/compilePlan.js +5 -0
  122. package/dist/spec/infrastructure/sql/compilePlan.js.map +1 -1
  123. package/dist/spec/kernel/diagnostic.d.ts +1 -1
  124. package/dist/spec/kernel/diagnostic.d.ts.map +1 -1
  125. package/dist/spec/kernel/diagnostic.js +5 -0
  126. package/dist/spec/kernel/diagnostic.js.map +1 -1
  127. package/dist/testing/cases/corpus.d.ts +2 -0
  128. package/dist/testing/cases/corpus.d.ts.map +1 -1
  129. package/dist/testing/cases/corpus.js +7 -5
  130. package/dist/testing/cases/corpus.js.map +1 -1
  131. package/dist/testing/cases/policy.d.ts +14 -1
  132. package/dist/testing/cases/policy.d.ts.map +1 -1
  133. package/dist/testing/cases/policy.js +3 -2
  134. package/dist/testing/cases/policy.js.map +1 -1
  135. package/dist/testing/cases/printer.d.ts.map +1 -1
  136. package/dist/testing/cases/printer.js +3 -1
  137. package/dist/testing/cases/printer.js.map +1 -1
  138. package/dist/testing/cases/report-view.d.ts.map +1 -1
  139. package/dist/testing/cases/report-view.js +18 -0
  140. package/dist/testing/cases/report-view.js.map +1 -1
  141. package/docs/adr/0037-postgresql-is-the-reference-dialect.md +2 -1
  142. package/docs/adr/0039-postgresql-is-native.md +130 -0
  143. package/docs/adr/README.md +2 -0
  144. package/docs/adr/adr-lite-1376-admin-extensions.md +330 -0
  145. package/docs/examples/commerce-inventory.md +18 -1
  146. package/docs/examples/reference-service/package.json +2 -2
  147. package/docs/handbook/cloudflare/authentication.md +3 -3
  148. package/docs/handbook/cloudflare/deploy-and-operate.md +4 -1
  149. package/docs/handbook/concepts/runtime-and-adapters.md +74 -33
  150. package/docs/handbook/concepts/views.md +1 -1
  151. package/docs/handbook/guides/admin-extensions.md +191 -0
  152. package/docs/handbook/guides/admin-ui.md +2 -1
  153. package/docs/handbook/navigation.json +2 -1
  154. package/docs/handbook/reference/diagnostics.md +1 -0
  155. package/docs/handbook/reference/procedure.md +2 -1
  156. package/docs/handbook/reference/schema.md +6 -3
  157. package/docs/handbook/reference/surface.md +6 -2
  158. package/docs/handbook/reference/view.md +7 -5
  159. package/docs/handbook/releases/index.md +78 -4
  160. package/docs/handbook/start/project-and-cli.md +20 -12
  161. package/docs/skills/develop/SKILL.md +8 -2
  162. package/docs/skills/provision/SKILL.md +4 -1
  163. package/docs/skills/update/SKILL.md +3 -0
  164. package/docs/upgrade-0.1-to-0.2.md +1 -1
  165. package/package.json +6 -5
  166. package/dist/postgres/textRows.d.ts +0 -10
  167. package/dist/postgres/textRows.d.ts.map +0 -1
  168. package/dist/postgres/textRows.js +0 -44
  169. 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 { PgConnect } from "./driver.js";
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
- /** Each statement's limit (`SET LOCAL statement_timeout`), in milliseconds. Default 10 000; 0 is no limit (ADR-0037 decision 5). */
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,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C,MAAM,WAAW,sBAAsB;IACrC,4IAA4I;IAC5I,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,oIAAoI;IACpI,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,CAa/D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,oBAAoB,CAcrF"}
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"}
@@ -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 report = await convergeStorage(options.connect, plan.schemas, { fingerprint: plan.fingerprint });
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":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/postgres/adapter.ts"],"names":[],"mappings":"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"}
@@ -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 = "1";
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 = "1";
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
- * ponytail: a client per operation, statements sent one at a time (pg does not pipeline). Upgrade to one client per request,
7
- * or a pipelining driver, when a Procedure's round trips show in latency.
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
- /** A native transport without RowDescription can execute a dialect-supplied result description. */
22
- readonly temporaryResultMetadata?: boolean;
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. `check` runs after each statement and may throw to roll everything back.
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[], check?: (i: number, outcome: PgOutcome) => void, timeoutMs?: number): Promise<PgOutcome[]>;
67
+ export declare function transaction(connect: PgConnect, statements: readonly PgStatement[], timeoutMs?: number): Promise<PgOutcome[]>;
69
68
  /**
70
- * One read on its own client, in a read-only transaction: the settings are pinned, and Hyperdrive never answers a read
71
- * inside a transaction from its cache, so a read sees the write before it.
72
- * ponytail: three round trips (BEGIN, the read, COMMIT); a pipelining driver sends them as one.
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, timeoutMs?: number): Promise<PgOutcome>;
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<PgClient & {
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":"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"}
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/postgres/driver.ts"],"names":[],"mappings":"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"}
@@ -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
- const pinned = (timeoutMs) => `${PINNED}; SET LOCAL statement_timeout = ${Math.max(0, Math.floor(timeoutMs))}`;
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. `check` runs after each statement and may throw to roll everything back.
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, check, timeoutMs = STATEMENT_TIMEOUT_MS) {
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: `BEGIN ISOLATION LEVEL SERIALIZABLE; ${pinned(timeoutMs)}` });
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 on its own client, in a read-only transaction: the settings are pinned, and Hyperdrive never answers a read
64
- * inside a transaction from its cache, so a read sees the write before it.
65
- * ponytail: three round trips (BEGIN, the read, COMMIT); a pipelining driver sends them as one.
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, timeoutMs = STATEMENT_TIMEOUT_MS) {
80
+ export async function query(connect, s) {
68
81
  const client = await connect();
69
82
  try {
70
- await client.query({ text: `BEGIN${client.temporaryResultMetadata ? "" : " READ ONLY"}; ${pinned(timeoutMs)}` });
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
- catch (e) {
76
- await client.query({ text: "ROLLBACK" }).catch(() => undefined);
77
- throw e;
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":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkBzC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAsB,EAAE;IACzD,MAAM,IAAI,GAAI,CAAa,EAAE,IAAI,CAAC;IAClC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACnF,CAAC,CAAC;AAEF,4HAA4H;AAC5H,MAAM,GAAG,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AAY5D,KAAK,UAAU,GAAG,CAAC,MAAgB,EAAE,CAAc;IACjD,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAkB,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjK,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAClD;;;GAGG;AACH,MAAM,MAAM,GAAG,wIAAwI;IACrJ,gHAAgH;IAChH,gHAAgH,CAAC;AACnH,wHAAwH;AACxH,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAC3C,MAAM,MAAM,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,GAAG,MAAM,mCAAmC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;AACvH,MAAM,QAAQ,GAAG,CAAC,CAAC;AAEnB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAkB,EAAE,UAAkC,EAAE,KAA+C,EAAE,SAAS,GAAG,oBAAoB;IACzK,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;QAC/B,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,uCAAuC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;YACzF,MAAM,GAAG,GAAgB,EAAE,CAAC;YAC5B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC1C,QAAQ,GAAG,CAAC,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/B,QAAQ,GAAG,CAAC,CAAC,CAAC;gBACd,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;YACtB,CAAC;YACD,UAAU,GAAG,IAAI,CAAC;YAClB,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvC,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAChE,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,OAAO,GAAG,QAAQ;gBAAE,SAAS;YACzE,4GAA4G;YAC5G,MAAM,MAAM,CAAC,MAAM,CAAC,CAAW,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAkB,EAAE,CAAc,EAAE,SAAS,GAAG,oBAAoB;IAC9F,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QACjH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvC,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,CAAC,CAAC;IACV,CAAC;YAAS,CAAC;QAAC,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;AAC1D,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,wCAAwC,EAAE,CAAC,CAAC,EAAE,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAErI;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAkB;IACjD,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,UAAmC;YAC7C,OAAO,CAAC,MAAM,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1I,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,OAAkB;IACvC,OAAO;QACL,mGAAmG;QACnG,OAAO,EAAE,EAAE;QACX,KAAK,CAAC,OAAO;YACX,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,KAAK,CAAC,GAAG,KAAI,CAAC;KACf,CAAC;AACJ,CAAC"}
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;AAO3G,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,OAAO,CAAC,QAAQ;IAMV,MAAM,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC;IAK/D,KAAK,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAU/E,OAAO,CAAC,MAAM;CAqBf"}
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 { describeResult } from "./textRows.js";
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
- prepared(s) {
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
- const ast = typed(s.ir, this.schemas);
26
- return { text: print(ast), values: s.binds, describeResult: () => describeResult(ast) };
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, this.timeoutMs).catch((e) => this.mapped(e, "select"))).rows;
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
- // a write's count is checked where it ran, inside the transaction: a mismatch rolls the whole batch back
35
- const out = await transaction(this.connect, statements, (i, o) => {
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,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,IAAI,GAAG,CAAC,IAAwB,EAAE,OAAe,EAAE,QAAiC,EAAE,EAAE,CAC5F,IAAI,eAAe,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjI,MAAM,OAAO,eAAe;IAIP;IACA;IAEA;IACA;IAPnB,iEAAiE;IACxD,WAAW,GAAG,MAAM,CAAC;IAC9B,YACmB,OAAkB,EAClB,OAAgD;IACjE,kGAAkG;IACjF,MAAmC,EACnC,SAAkB;QAJlB,YAAO,GAAP,OAAO,CAAW;QAClB,YAAO,GAAP,OAAO,CAAyC;QAEhD,WAAM,GAAN,MAAM,CAA6B;QACnC,cAAS,GAAT,SAAS,CAAS;IAClC,CAAC;IAEI,QAAQ,CAAC,CAAiB;QAChC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAAC,KAAK,CAAC,MAAM,yBAAyB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7J,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1F,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAyB;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpG,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAgC;QAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,yGAAyG;QACzG,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;YAChC,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;gBAAE,MAAM,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,iEAAiE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9L,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,MAAM,CAAC,CAAU,EAAE,IAAwB;QACjD,IAAI,CAAC,YAAY,eAAe;YAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,CAAiD,CAAC;QACxF,MAAM,EAAE,GAAG,IAAI,KAAK,OAAO,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,QAAQ,KAAK,EAAE,CAAC;YACd,uFAAuF;YACvF,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,iDAAiD,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACrH,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,yBAAyB,EAAE,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAE,CAAa,CAAC,UAAU,IAAI,EAAE,CAAC,IAAI,8BAA8B,EAAE,CAAC,CAAC;YACnJ,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,yBAAyB,EAAE,0EAA0E,CAAC,CAAC;YAChI,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,yBAAyB,EAAE,6DAA6D,CAAC,CAAC;YACnH,KAAK,OAAO,CAAC;YAAC,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,sBAAsB,EAAE,uEAAuE,CAAC,CAAC;QAC1I,CAAC;QACD,yGAAyG;QACzG,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,IAAI,IAAI,IAAI,KAAK,OAAO,IAAI,UAAU;YAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,qFAAqF,CAAC,CAAC;QACjK,IAAI,IAAI;YAAE,MAAM,IAAI,CAAC,sBAAsB,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;QACtJ,0GAA0G;QAC1G,IAAI,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,CAAC,yBAAyB,EAAE,yCAAyC,CAAC,CAAC;QAC9G,MAAM,IAAI,CAAC,yBAAyB,EAAE,gDAAgD,KAAK,IAAI,CAAC,CAAC;IACnG,CAAC;CACF"}
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,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,IAAI,GAAG,CAAC,IAAwB,EAAE,OAAe,EAAE,QAAiC,EAAE,EAAE,CAC5F,IAAI,eAAe,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjI,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;AAChF,MAAM,MAAM,GAAG,CAAC,CAAU,EAAW,EAAE,CACrC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAErI,MAAM,OAAO,eAAe;IAIP;IACA;IAEA;IACA;IAPnB,iEAAiE;IACxD,WAAW,GAAG,MAAM,CAAC;IAC9B,YACmB,OAAkB,EAClB,OAAgD;IACjE,kGAAkG;IACjF,MAAmC,EACnC,SAAkB;QAJlB,YAAO,GAAP,OAAO,CAAW;QAClB,YAAO,GAAP,OAAO,CAAyC;QAEhD,WAAM,GAAN,MAAM,CAA6B;QACnC,cAAS,GAAT,SAAS,CAAS;IAClC,CAAC;IAEJ;;;OAGG;IACc,OAAO,GAAG,IAAI,OAAO,EAA8C,CAAC;IACrF,wHAAwH;IACvG,WAAW,GAAG,IAAI,OAAO,EAAU,CAAC;IAE7C,KAAK,CAAC,EAAwB;QACpC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;QACnH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,QAAQ,CAAC,CAAiB,EAAE,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAAC,KAAK,CAAC,MAAM,yBAAyB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7J,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACpF,sHAAsH;QACtH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,iEAAiE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjL,uHAAuH;QACvH,iHAAiH;QACjH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,sBAAsB,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,mHAAmH,CAAC,CAAC,MAAM,4BAA4B,CAAC;QAChO,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAyB;QACpC,qHAAqH;QACrH,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAAE,MAAM,IAAI,CAAC,yBAAyB,EAAE,gCAAgC,CAAC,CAAC;YAClG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAgC;QAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9G,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAG,UAAU,CAAC,CAAC,CAA+B,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClI,CAAC;IAEO,MAAM,CAAC,CAAU,EAAE,IAAwB;QACjD,IAAI,CAAC,YAAY,eAAe;YAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,CAAiD,CAAC;QACxF,MAAM,EAAE,GAAG,IAAI,KAAK,OAAO,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,QAAQ,KAAK,EAAE,CAAC;YACd,uFAAuF;YACvF,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,iDAAiD,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACrH,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,yBAAyB,EAAE,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAE,CAAa,CAAC,UAAU,IAAI,EAAE,CAAC,IAAI,8BAA8B,EAAE,CAAC,CAAC;YACnJ,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,yBAAyB,EAAE,0EAA0E,CAAC,CAAC;YAChI,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,yBAAyB,EAAE,6DAA6D,CAAC,CAAC;YACnH,KAAK,YAAY,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE,iEAAiE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvK,KAAK,OAAO,CAAC;YAAC,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,sBAAsB,EAAE,uEAAuE,CAAC,CAAC;QAC1I,CAAC;QACD,yGAAyG;QACzG,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,IAAI,IAAI,IAAI,KAAK,OAAO,IAAI,UAAU;YAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,qFAAqF,CAAC,CAAC;QACjK,IAAI,IAAI;YAAE,MAAM,IAAI,CAAC,sBAAsB,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;QACtJ,0GAA0G;QAC1G,IAAI,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,CAAC,yBAAyB,EAAE,yCAAyC,CAAC,CAAC;QAC9G,MAAM,IAAI,CAAC,yBAAyB,EAAE,gDAAgD,KAAK,IAAI,CAAC,CAAC;IACnG,CAAC;CACF"}
@@ -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"}
@@ -4,4 +4,5 @@
4
4
  */
5
5
  export { postgresStorage, postgresDialect } from "./adapter.js";
6
6
  export { pgDatabaseDriver, pgPool } from "./driver.js";
7
+ export { requestScoped } from "./session.js";
7
8
  //# sourceMappingURL=index.js.map
@@ -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,EAAiC,MAAM,aAAa,CAAC"}
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,CAoF3D"}
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"}