okmodel 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/README.md +100 -1131
  2. package/dist/adapters/capabilities.d.ts +35 -0
  3. package/dist/adapters/failure.d.ts +13 -2
  4. package/dist/adapters/lazy-errors.d.ts +22 -0
  5. package/dist/adapters/pg/bun-sql.d.ts +53 -0
  6. package/dist/adapters/pg/bunsql-extra.d.ts +54 -3
  7. package/dist/adapters/pg/bunsql.d.ts +15 -2
  8. package/dist/adapters/pg/cursor.d.ts +17 -0
  9. package/dist/adapters/pg/neon-extra.d.ts +18 -0
  10. package/dist/adapters/pg/neon.d.ts +104 -0
  11. package/dist/adapters/pg/no-inflight-timeout.d.ts +11 -8
  12. package/dist/adapters/pg/nodepostgres-extra.d.ts +22 -1
  13. package/dist/adapters/pg/nodepostgres.d.ts +12 -0
  14. package/dist/adapters/pg/pglite-wire.d.ts +24 -0
  15. package/dist/adapters/pg/pglite.d.ts +10 -0
  16. package/dist/adapters/pg/postgres-extra.d.ts +27 -11
  17. package/dist/adapters/pg/reserved.d.ts +42 -0
  18. package/dist/adapters/pg/session.d.ts +0 -18
  19. package/dist/contracts/connection.d.ts +7 -6
  20. package/dist/contracts/error.d.ts +1 -1
  21. package/dist/dialects/pg/floor.d.ts +68 -0
  22. package/dist/dialects/pg/fn/index.d.ts +39 -1
  23. package/dist/dialects/pg/fn/index.js +118 -26
  24. package/dist/dialects/pg/index.d.ts +8 -1
  25. package/dist/dialects/pg/index.js +435 -170
  26. package/dist/dialects/pg/introspect.d.ts +11 -0
  27. package/dist/dialects/pg/keys.d.ts +11 -8
  28. package/dist/dialects/pg/model.d.ts +40 -0
  29. package/dist/dialects/pg/morph.d.ts +43 -0
  30. package/dist/dialects/pg/operator-fit.d.ts +2 -2
  31. package/dist/dialects/pg/operators.d.ts +14 -7
  32. package/dist/dialects/pg/ops/bucket.d.ts +65 -0
  33. package/dist/dialects/pg/ops/fragment.d.ts +119 -0
  34. package/dist/dialects/pg/ops/inc.d.ts +2 -2
  35. package/dist/dialects/pg/ops/lane.d.ts +49 -0
  36. package/dist/dialects/pg/ops/matches.d.ts +9 -12
  37. package/dist/dialects/pg/ops/relevance.d.ts +13 -0
  38. package/dist/dialects/pg/ops/search-query.d.ts +22 -0
  39. package/dist/dialects/pg/ops/window.d.ts +103 -0
  40. package/dist/dialects/pg/preset.d.ts +1 -1
  41. package/dist/dialects/pg/relations.d.ts +100 -3
  42. package/dist/dialects/pg/schema.d.ts +31 -3
  43. package/dist/dialects/pg/view/client.d.ts +14 -6
  44. package/dist/dialects/pg/view/index.d.ts +73 -1
  45. package/dist/dialects/pg/view/index.js +156 -5
  46. package/dist/dialects/pg/view/scratch.d.ts +8 -5
  47. package/dist/runtime/aggregate.d.ts +8 -2
  48. package/dist/runtime/bucket-group.d.ts +70 -0
  49. package/dist/runtime/conflict.d.ts +22 -4
  50. package/dist/runtime/include.d.ts +0 -8
  51. package/dist/runtime/inflight.d.ts +1 -1
  52. package/dist/runtime/otel.d.ts +105 -0
  53. package/dist/runtime/otel.js +97 -0
  54. package/dist/runtime/page.d.ts +4 -1
  55. package/dist/runtime/pg/bun.js +12 -6
  56. package/dist/runtime/pg/neon.d.ts +38 -0
  57. package/dist/runtime/pg/neon.js +64 -0
  58. package/dist/runtime/pg/pg.js +5 -5
  59. package/dist/runtime/pg/pglite.d.ts +1 -0
  60. package/dist/runtime/pg/pglite.js +9 -9
  61. package/dist/runtime/pg/postgresjs.js +5 -5
  62. package/dist/runtime/plan.d.ts +95 -5
  63. package/dist/runtime/read-stream.d.ts +13 -16
  64. package/dist/runtime/result-name.d.ts +17 -0
  65. package/dist/runtime/server-check.d.ts +3 -3
  66. package/dist/runtime/sort-bind.d.ts +21 -0
  67. package/dist/runtime/sort.d.ts +56 -0
  68. package/dist/runtime/sql-fragment.d.ts +43 -0
  69. package/dist/runtime/sync.d.ts +70 -0
  70. package/dist/runtime/tenancy/index.js +15 -13
  71. package/dist/runtime/text-search.d.ts +20 -0
  72. package/dist/runtime/topology.d.ts +1 -1
  73. package/dist/runtime/traits/index.d.ts +80 -0
  74. package/dist/runtime/traits/index.js +184 -21
  75. package/dist/runtime/tree.d.ts +38 -0
  76. package/dist/runtime/types.d.ts +232 -22
  77. package/dist/runtime/validate/index.js +4 -4
  78. package/dist/runtime/version.d.ts +39 -0
  79. package/dist/runtime/window.d.ts +21 -0
  80. package/dist/runtime/write.d.ts +54 -2
  81. package/dist/shared/{929h19xp.js → 0wrea3jq.js} +141 -13
  82. package/dist/shared/{qq3899ht.js → 12z7aznj.js} +243 -14
  83. package/dist/shared/{1z04fa85.js → 14x60fbf.js} +12 -57
  84. package/dist/shared/{ek2wt2dz.js → 16kvjebh.js} +4 -4
  85. package/dist/shared/{wynzeggs.js → 195pzzzz.js} +8 -8
  86. package/dist/shared/1d9q9cv2.js +312 -0
  87. package/dist/shared/2c13q96h.js +18 -0
  88. package/dist/shared/{b4v57v3x.js → 2d3xq4ps.js} +2 -2
  89. package/dist/shared/{1f0xa3cb.js → 3449rcae.js} +5 -5
  90. package/dist/shared/{wkme6tep.js → 35q0n9tz.js} +8 -16
  91. package/dist/shared/3bb7wsqt.js +99 -0
  92. package/dist/shared/3t6kw83m.js +249 -0
  93. package/dist/shared/{5j36z8dn.js → 4m6hskg8.js} +39 -70
  94. package/dist/shared/{n076ydsc.js → 4vbf83xx.js} +69 -28
  95. package/dist/shared/{vmfkhszw.js → 63f4ksbz.js} +33 -26
  96. package/dist/shared/{c58secgj.js → 63qtkrca.js} +38 -4
  97. package/dist/shared/6m78c8ss.js +6 -0
  98. package/dist/shared/{x3jc53kg.js → 760ppr76.js} +15 -7
  99. package/dist/shared/7ghwamrf.js +40 -0
  100. package/dist/shared/7kms6fvj.js +20 -0
  101. package/dist/shared/7n7ddwt4.js +6 -0
  102. package/dist/shared/9a4ae4p8.js +31 -0
  103. package/dist/shared/{hazqqecq.js → 9dr2qnx7.js} +63 -34
  104. package/dist/shared/{h15jx9bc.js → 9dvh1dr6.js} +1 -1
  105. package/dist/shared/a62rb2da.js +13 -0
  106. package/dist/shared/{cgbamx3e.js → ae4j5f42.js} +23 -4
  107. package/dist/shared/agsfb86s.js +233 -0
  108. package/dist/shared/{8x72s86k.js → b6d6p0zc.js} +13 -7
  109. package/dist/shared/{ag4c7516.js → b76b8d95.js} +2 -2
  110. package/dist/shared/{j60w0dvr.js → bah9nbg3.js} +58 -38
  111. package/dist/shared/bnby0esn.js +10 -0
  112. package/dist/shared/bsek72fg.js +225 -0
  113. package/dist/shared/{2cg3wnxc.js → bxas03mq.js} +608 -141
  114. package/dist/shared/{31vm914h.js → cm3w0ywp.js} +15 -16
  115. package/dist/shared/{gwn6v667.js → cnkky55j.js} +25 -14
  116. package/dist/shared/{dk8v79p3.js → d5nmj7vv.js} +1 -1
  117. package/dist/shared/{ttmg09vd.js → dpc2r7rb.js} +8 -8
  118. package/dist/shared/dzj09cye.js +10 -0
  119. package/dist/shared/{sbdme3vy.js → e8zyaqvj.js} +60 -10
  120. package/dist/shared/{2jd1sn0e.js → ecn8mfdq.js} +6 -6
  121. package/dist/shared/exn3sd90.js +359 -0
  122. package/dist/shared/{t3g0k88x.js → f4jy1j7x.js} +39 -22
  123. package/dist/shared/{y2t3jktd.js → fjpnhqan.js} +20 -13
  124. package/dist/shared/g5yc06ka.js +272 -0
  125. package/dist/shared/ga9j92qj.js +25 -0
  126. package/dist/shared/{3fqwmr09.js → hfqmpasr.js} +6 -6
  127. package/dist/shared/{wt5rzv1h.js → hm5f8jby.js} +7 -7
  128. package/dist/shared/{ys0xzyaj.js → hqpxf4a4.js} +224 -19
  129. package/dist/shared/jebgrkeq.js +179 -0
  130. package/dist/shared/{09p049xa.js → jp36k7dp.js} +44 -16
  131. package/dist/shared/jx2m62cs.js +96 -0
  132. package/dist/shared/{r11n8grd.js → k86n8vq3.js} +7 -4
  133. package/dist/shared/{2z7wv5tj.js → kgwp4jdd.js} +56 -35
  134. package/dist/shared/{knmes2kh.js → kj9d8maq.js} +1 -1
  135. package/dist/shared/{g90m9b0g.js → m4xff2a6.js} +6 -5
  136. package/dist/shared/{r6nwkxnt.js → m7n9h2a5.js} +4 -4
  137. package/dist/shared/mfedzr74.js +145 -0
  138. package/dist/shared/{f0f1n281.js → mkrn359n.js} +60 -11
  139. package/dist/shared/{p248q79y.js → mnvjvqyp.js} +10 -10
  140. package/dist/shared/{672t5vym.js → mss6ctgv.js} +2 -2
  141. package/dist/shared/{4az561fn.js → mtw6jz76.js} +8 -23
  142. package/dist/shared/n05z9nwz.js +313 -0
  143. package/dist/shared/{pjr6xrm5.js → n0jmpgj1.js} +20 -17
  144. package/dist/shared/{p6bjzq9q.js → n41w4fbz.js} +14 -6
  145. package/dist/shared/{b3awxn7h.js → n454kcnw.js} +1 -1
  146. package/dist/shared/n7kg8mmx.js +61 -0
  147. package/dist/shared/nbw1z4yd.js +18 -0
  148. package/dist/shared/needfe47.js +66 -0
  149. package/dist/shared/{1nw1f3vs.js → njga14v4.js} +9 -9
  150. package/dist/shared/{5yv4k6a6.js → nmnsgj7x.js} +145 -3
  151. package/dist/shared/{vjpnzwjz.js → p3xbdcvt.js} +14 -18
  152. package/dist/shared/p5nh3r8q.js +622 -0
  153. package/dist/shared/{nx9hh281.js → pan0370z.js} +13 -12
  154. package/dist/shared/q0cqt2sp.js +12 -0
  155. package/dist/shared/qd9hhd8f.js +37 -0
  156. package/dist/shared/{mb2ycs1p.js → qfw14tna.js} +15 -15
  157. package/dist/shared/{9s0ypp87.js → sjk86yrx.js} +1 -1
  158. package/dist/shared/th3be82n.js +208 -0
  159. package/dist/shared/{ed0b8k4s.js → typ3vy7t.js} +1 -1
  160. package/dist/shared/{5d8t84hg.js → v1wad97q.js} +14 -14
  161. package/dist/shared/{x72jb7ad.js → v8g1vgv8.js} +1 -1
  162. package/dist/shared/{9628a9xt.js → vk7rag46.js} +1 -1
  163. package/dist/shared/{ze4hxsmy.js → w9ejzaqf.js} +1 -1
  164. package/dist/shared/{q3j1tq7a.js → wcrheftc.js} +148 -23
  165. package/dist/shared/wvdjznah.js +213 -0
  166. package/dist/shared/wz2a78mp.js +8 -0
  167. package/dist/shared/xfhe73sb.js +436 -0
  168. package/dist/shared/{r1fdd0f6.js → z581d7ny.js} +5 -2
  169. package/dist/shared/{8etn7d8w.js → z7s6fpxv.js} +1 -1
  170. package/dist/shared/{32cnm7kn.js → zbqbmmrp.js} +76 -40
  171. package/dist/shared/{n7mcc1gk.js → zchaghkf.js} +4 -3
  172. package/dist/shared/{xq0mvhts.js → zgex00fd.js} +6 -6
  173. package/dist/shared/{nsva2a6b.js → znm0bpp5.js} +3 -0
  174. package/dist/shared/zq1he88x.js +155 -0
  175. package/dist/tooling/cli.js +26 -13
  176. package/dist/tooling/driver-run.js +4971 -0
  177. package/dist/tooling/driver-test.d.ts +36 -0
  178. package/dist/tooling/migrate/commands.d.ts +2 -2
  179. package/dist/tooling/migrate/engine.d.ts +3 -2
  180. package/dist/tooling/migrate/index.js +9 -9
  181. package/dist/tooling/migrate/project.d.ts +3 -0
  182. package/dist/tooling/shared/03k6res6.js +210 -0
  183. package/dist/tooling/shared/08kemxjd.js +10 -0
  184. package/dist/tooling/shared/2revefqt.js +209 -0
  185. package/dist/tooling/shared/2wtvc7rw.js +1425 -0
  186. package/dist/tooling/shared/345tbc2k.js +16 -0
  187. package/dist/tooling/shared/3m1hkg7z.js +344 -0
  188. package/dist/tooling/shared/3rrw5w8f.js +81 -0
  189. package/dist/tooling/shared/3tq8pnb8.js +131 -0
  190. package/dist/tooling/shared/417zdsk7.js +194 -0
  191. package/dist/tooling/shared/4d2w25vw.js +40 -0
  192. package/dist/tooling/shared/54tqkxja.js +51 -0
  193. package/dist/tooling/shared/5bvw2nev.js +12 -0
  194. package/dist/tooling/shared/6nyfyw70.js +231 -0
  195. package/dist/tooling/shared/72fyg4zv.js +160 -0
  196. package/dist/tooling/shared/733a1tq3.js +38 -0
  197. package/dist/tooling/shared/7ae7rjmn.js +20 -0
  198. package/dist/tooling/shared/7kms6fvj.js +20 -0
  199. package/dist/tooling/shared/8sqrsw3s.js +49 -0
  200. package/dist/tooling/shared/96ps4g1z.js +32 -0
  201. package/dist/tooling/shared/9kazs5p6.js +195 -0
  202. package/dist/tooling/shared/9xzm7hjg.js +38 -0
  203. package/dist/tooling/shared/a6pp9d12.js +49 -0
  204. package/dist/tooling/shared/a7q7t4n3.js +22 -0
  205. package/dist/tooling/shared/aftb2mwr.js +18 -0
  206. package/dist/tooling/shared/bz2dqhab.js +311 -0
  207. package/dist/tooling/shared/cmptmb4f.js +12 -0
  208. package/dist/tooling/shared/ddjtfgnx.js +177 -0
  209. package/dist/tooling/shared/djydjpqt.js +261 -0
  210. package/dist/tooling/shared/dw08f3m8.js +9 -0
  211. package/dist/tooling/shared/dy672fz6.js +16 -0
  212. package/dist/tooling/shared/dzx85q70.js +66 -0
  213. package/dist/tooling/shared/ec71zqgt.js +270 -0
  214. package/dist/{shared/d5azex6s.js → tooling/shared/ep8zh3bk.js} +1 -1
  215. package/dist/tooling/shared/f9mphxej.js +3789 -0
  216. package/dist/tooling/shared/fb9k2qwd.js +89 -0
  217. package/dist/tooling/shared/g9ad4n80.js +211 -0
  218. package/dist/tooling/shared/gfvtj6d0.js +94 -0
  219. package/dist/tooling/shared/gmcf9cxf.js +294 -0
  220. package/dist/tooling/shared/htnaj77v.js +17 -0
  221. package/dist/tooling/shared/j9t5s12a.js +7 -0
  222. package/dist/tooling/shared/jne7b93p.js +42 -0
  223. package/dist/tooling/shared/ma2340rx.js +118 -0
  224. package/dist/tooling/shared/mtrqn2hn.js +505 -0
  225. package/dist/tooling/shared/n4jqhpqz.js +27 -0
  226. package/dist/tooling/shared/nf7jmhfa.js +20 -0
  227. package/dist/tooling/shared/p7f08ktn.js +332 -0
  228. package/dist/tooling/shared/ppnnnvj8.js +13 -0
  229. package/dist/tooling/shared/pqy21k24.js +312 -0
  230. package/dist/tooling/shared/pw8fgahx.js +69 -0
  231. package/dist/tooling/shared/pwsytxm5.js +17 -0
  232. package/dist/tooling/shared/rf83gr2d.js +94 -0
  233. package/dist/tooling/shared/rq5kk8j6.js +401 -0
  234. package/dist/tooling/shared/rs1jb051.js +12 -0
  235. package/dist/tooling/shared/smn6kz1p.js +157 -0
  236. package/dist/tooling/shared/spk1jg3r.js +1696 -0
  237. package/dist/tooling/shared/tn8gay14.js +143 -0
  238. package/dist/tooling/shared/vraj6d74.js +42 -0
  239. package/dist/tooling/shared/vs0t6qt8.js +64 -0
  240. package/dist/tooling/shared/vx86qjv8.js +150 -0
  241. package/dist/tooling/shared/w7qe8sj1.js +140 -0
  242. package/dist/tooling/shared/wt7j7nf6.js +15 -0
  243. package/dist/tooling/shared/wwnekq5n.js +6 -0
  244. package/dist/tooling/shared/xhrnjch9.js +185 -0
  245. package/dist/tooling/shared/xjs6zqtc.js +190 -0
  246. package/dist/tooling/shared/y031jct9.js +16 -0
  247. package/dist/tooling/shared/y5656f0e.js +233 -0
  248. package/dist/tooling/shared/yfr8hzhm.js +604 -0
  249. package/dist/tooling/shared/yk9mp7vb.js +250 -0
  250. package/dist/tooling/shared/yw30vnq2.js +139 -0
  251. package/dist/tooling/shared/z8d7ptht.js +618 -0
  252. package/dist/tooling/shared/zhwnfyb2.js +9 -0
  253. package/dist/tooling/shared/zvnhh1n0.js +198 -0
  254. package/dist/tooling/testing/index.js +3 -3
  255. package/package.json +17 -3
  256. package/dist/shared/3qnhc7w5.js +0 -38
  257. package/dist/shared/7m88x3e9.js +0 -45
  258. package/dist/shared/8dqhth8c.js +0 -12
  259. package/dist/shared/j3rkk835.js +0 -99
  260. package/dist/shared/k68eedmy.js +0 -85
  261. package/dist/shared/venqrjna.js +0 -216
  262. package/dist/shared/wxr8cwns.js +0 -6
  263. package/dist/shared/y34a8714.js +0 -150
  264. package/dist/shared/zm0mafk4.js +0 -92
  265. package/dist/shared/zy8r7qvz.js +0 -116
  266. package/dist/shared/{ywr8hmey.js → 606g0nbf.js} +3 -3
  267. package/dist/shared/{rpycarcr.js → gcefca6p.js} +4 -4
@@ -2,14 +2,6 @@
2
2
  * LATERAL include planner. Loaded on the first include.
3
3
  */
4
4
  import { type IncludeHooks, type Plan } from "./plan.js";
5
- /**
6
- * Decodes a result that has includes.
7
- *
8
- * @param plan - Compiled plan
9
- * @param rows - Wire rows
10
- * @param table - Table the call named
11
- * @returns The call's value
12
- */
13
5
  export declare function decodeIncluded(plan: Plan, rows: readonly (readonly (string | null)[])[], table: string): unknown;
14
6
  /** Hooks the read planner calls after this module has loaded. */
15
7
  export declare const includeHooks: IncludeHooks;
@@ -2,7 +2,7 @@
2
2
  * Refuses a positive timeout on a driver that cannot cancel.
3
3
  *
4
4
  * `tx({ timeout })` and `batch({ timeout })` load this with the call. The
5
- * connect graph does not. The message stays the one {@link noTimeout} throws.
5
+ * connect graph does not. The OKM1120 text loads with the lazy error module.
6
6
  */
7
7
  import type { DriverPool } from "../contracts/driver.js";
8
8
  /**
@@ -0,0 +1,105 @@
1
+ /**
2
+ * OpenTelemetry observers (`okmodel/otel`).
3
+ *
4
+ * The package does not import `@opentelemetry/*`. Pass a tracer you already
5
+ * have. The observers are `hookm`, `onRoute`, and an `inspect()` result.
6
+ * Statement text is off unless `statement` is true. Parameters and tenant ids
7
+ * are never attributes (spec §5.5, D267).
8
+ */
9
+ import type { RouteEvent } from "./topology.js";
10
+ import type { Hookm, Inspection } from "./types.js";
11
+ /** A scalar OpenTelemetry attribute. Arrays are not used. */
12
+ export type OtelAttribute = string | number | boolean;
13
+ /**
14
+ * Status codes from the OpenTelemetry API.
15
+ *
16
+ * `0` is unset, `1` is OK, and `2` is ERROR.
17
+ */
18
+ export type OtelStatusCode = 0 | 1 | 2;
19
+ /**
20
+ * The span methods this entry calls.
21
+ *
22
+ * A tracer from `@opentelemetry/api` satisfies this shape.
23
+ */
24
+ export interface OtelSpan {
25
+ /** Sets one attribute. */
26
+ setAttribute(key: string, value: OtelAttribute): void;
27
+ /** Sets the span status. `message` is never sent. */
28
+ setStatus(status: {
29
+ readonly code: OtelStatusCode;
30
+ }): void;
31
+ /**
32
+ * Records an exception.
33
+ *
34
+ * `name` is the error name. `code` is an OKM code when the error has one.
35
+ * Message and stack are omitted.
36
+ */
37
+ recordException(exception: {
38
+ readonly name: string;
39
+ readonly code?: string;
40
+ }): void;
41
+ /** Adds a span event. */
42
+ addEvent(name: string, attributes?: Readonly<Record<string, OtelAttribute>>): void;
43
+ /** Ends the span. */
44
+ end(): void;
45
+ }
46
+ /** Options passed to `startSpan`. `kind` is `2` (client). */
47
+ export interface OtelSpanOptions {
48
+ /** OpenTelemetry span kind. This entry always passes `2`. */
49
+ readonly kind?: number;
50
+ /** Attributes set when the span starts. */
51
+ readonly attributes?: Readonly<Record<string, OtelAttribute>>;
52
+ }
53
+ /**
54
+ * The tracer methods this entry calls.
55
+ *
56
+ * A tracer from `@opentelemetry/api` satisfies this shape.
57
+ */
58
+ export interface OtelTracer {
59
+ /**
60
+ * Starts a span.
61
+ *
62
+ * @param name - Span name
63
+ * @param options - Kind and attributes
64
+ */
65
+ startSpan(name: string, options?: OtelSpanOptions): OtelSpan;
66
+ }
67
+ /** What {@link otel} accepts. */
68
+ export interface OtelOptions {
69
+ /** Tracer the caller owns. This module does not construct one. */
70
+ readonly tracer: OtelTracer;
71
+ /**
72
+ * Record `db.query.text` from `inspect()`.
73
+ *
74
+ * Omitted or false, the text is left off. Parameters stay off either way.
75
+ */
76
+ readonly statement?: boolean;
77
+ }
78
+ /**
79
+ * Observers to pass to `connect`, plus `query` for one `inspect()` result.
80
+ */
81
+ export interface OtelObservers {
82
+ /** Pass this in `connect({ hookm })`. */
83
+ readonly hookm: Hookm;
84
+ /** Pass this in `connect({ onRoute })`. A topology calls it. */
85
+ readonly onRoute: (event: RouteEvent) => void;
86
+ /**
87
+ * Records `db.query.summary` from `inspect()`.
88
+ *
89
+ * The fingerprint is that summary. `db.query.text` is included only when
90
+ * `statement` is true.
91
+ *
92
+ * @param inspection - The result of `inspect()`
93
+ */
94
+ readonly query: (inspection: Inspection) => void;
95
+ }
96
+ /**
97
+ * Connects the existing observers to a tracer.
98
+ *
99
+ * `onRoute` spans start and end in that call, because the hook fires once.
100
+ * A transaction span stays open from `start` until `commit` or `rollback`.
101
+ *
102
+ * @param options - Tracer, and whether statement text is recorded
103
+ * @returns `hookm`, `onRoute`, and `query`
104
+ */
105
+ export declare function otel(options: OtelOptions): OtelObservers;
@@ -0,0 +1,97 @@
1
+ // src/runtime/otel.ts
2
+ var SYSTEM = "postgresql";
3
+ var CLIENT = 2;
4
+ var STATUS_OK = 1;
5
+ var STATUS_ERROR = 2;
6
+ function otel(options) {
7
+ const tracer = options.tracer;
8
+ const statement = options.statement === true;
9
+ const open = [];
10
+ const hookm = {
11
+ onTransaction(event) {
12
+ if (event.phase === "start") {
13
+ const name = event.depth === 0 ? "transaction" : "savepoint";
14
+ open.push({
15
+ depth: event.depth,
16
+ span: begin(tracer, name, {
17
+ "db.system.name": SYSTEM,
18
+ "db.operation.name": name
19
+ })
20
+ });
21
+ return;
22
+ }
23
+ const index = latest(open, event.depth);
24
+ const found = index < 0 ? undefined : open[index];
25
+ if (found === undefined)
26
+ return;
27
+ open.splice(index, 1);
28
+ if (event.phase === "rollback") {
29
+ found.span.setAttribute("error.type", "rollback");
30
+ found.span.setStatus({ code: STATUS_ERROR });
31
+ } else {
32
+ found.span.setStatus({ code: STATUS_OK });
33
+ }
34
+ found.span.end();
35
+ },
36
+ onError(error) {
37
+ const span = begin(tracer, "error", {
38
+ "db.system.name": SYSTEM,
39
+ "error.type": errorType(error)
40
+ });
41
+ span.recordException(recordedException(error));
42
+ span.setStatus({ code: STATUS_ERROR });
43
+ span.end();
44
+ }
45
+ };
46
+ return {
47
+ hookm,
48
+ onRoute(event) {
49
+ const span = begin(tracer, event.op, {
50
+ "db.system.name": SYSTEM,
51
+ "db.operation.name": event.op
52
+ });
53
+ span.addEvent("route", { endpoint: event.endpoint, reason: event.reason });
54
+ span.end();
55
+ },
56
+ query(inspection) {
57
+ const op = inspection.intent.op;
58
+ const table = inspection.intent.table;
59
+ const attributes = {
60
+ "db.system.name": SYSTEM,
61
+ "db.operation.name": op,
62
+ "db.collection.name": table,
63
+ "db.query.summary": inspection.plan.fingerprint
64
+ };
65
+ if (statement)
66
+ attributes["db.query.text"] = inspection.sql.text;
67
+ begin(tracer, `${op} ${table}`, attributes).end();
68
+ }
69
+ };
70
+ }
71
+ function begin(tracer, name, attributes) {
72
+ return tracer.startSpan(name, { kind: CLIENT, attributes });
73
+ }
74
+ function latest(open, depth) {
75
+ for (let index = open.length - 1;index >= 0; index -= 1) {
76
+ if (open[index]?.depth === depth)
77
+ return index;
78
+ }
79
+ return -1;
80
+ }
81
+ function errorType(error) {
82
+ return error instanceof Error && error.name.length > 0 ? error.name : "error";
83
+ }
84
+ function recordedException(error) {
85
+ const name = errorType(error);
86
+ const code = okmCode(error);
87
+ return code === undefined ? { name } : { name, code };
88
+ }
89
+ function okmCode(error) {
90
+ if (typeof error !== "object" || error === null || !("code" in error))
91
+ return;
92
+ const code = error.code;
93
+ return typeof code === "string" && /^OKM\d+$/.test(code) ? code : undefined;
94
+ }
95
+ export {
96
+ otel
97
+ };
@@ -20,6 +20,9 @@ import { type ArchiveView } from "./plan.js";
20
20
  * @param options - `where`, `select`, `orderBy`, `limit`, `include`, and `after`
21
21
  * @param mods - Signal and timeout
22
22
  * @param view - Archive visibility
23
+ * @param pin - Endpoint a stream already chose. Absent for `page()`
23
24
  * @returns A handle that resolves to `{ items, next }`
24
25
  */
25
- export declare function build(session: Session, table: string, options: object, mods: Mods, view: ArchiveView | undefined): Promise<unknown> & Record<string, unknown>;
26
+ export declare function build(session: Session, table: string, options: object, mods: Mods, view: ArchiveView | undefined, pin?: {
27
+ name?: string;
28
+ }): Promise<unknown> & Record<string, unknown>;
@@ -1,23 +1,27 @@
1
- import"../../shared/8dqhth8c.js";
2
1
  import {
3
2
  DriverError2
4
- } from "../../shared/31vm914h.js";
3
+ } from "../../shared/cm3w0ywp.js";
5
4
  import {
5
+ markClientPool,
6
6
  open5
7
- } from "../../shared/32cnm7kn.js";
7
+ } from "../../shared/zbqbmmrp.js";
8
8
  import {
9
9
  BUNSQL_CAPABILITIES,
10
10
  readCapability2,
11
11
  hasCapability2
12
- } from "../../shared/cgbamx3e.js";
12
+ } from "../../shared/ae4j5f42.js";
13
13
  import {
14
14
  createClient
15
- } from "../../shared/j60w0dvr.js";
15
+ } from "../../shared/bah9nbg3.js";
16
16
 
17
17
  // src/runtime/pg/bun.ts
18
18
  function connect(target, options) {
19
19
  if (typeof target === "object" && !isPool(target)) {
20
- return import("../../shared/929h19xp.js").then((mod) => mod.default(target, options, open5));
20
+ return import("../../shared/0wrea3jq.js").then((mod) => mod.default(target, options, (config) => {
21
+ const pool = open5(config);
22
+ markClientPool(pool);
23
+ return pool;
24
+ }));
21
25
  }
22
26
  const owned = !isPool(target);
23
27
  const pool = isPool(target) ? target : open5({
@@ -28,6 +32,8 @@ function connect(target, options) {
28
32
  ...options.searchPath !== undefined ? { searchPath: options.searchPath } : {},
29
33
  ...options.ssl !== undefined ? { ssl: options.ssl } : {}
30
34
  });
35
+ if (!isPool(target))
36
+ markClientPool(pool);
31
37
  return createClient(options.schema, pool, {
32
38
  ownsPool: owned,
33
39
  http: options.errors?.http,
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `connect` for Neon (`okmodel/pg/neon`).
3
+ *
4
+ * A string or an existing pool is one endpoint. A `{ primary, replicas }` object
5
+ * loads the topology module. The client is typed by the schema passed in.
6
+ * `mode` is `websocket` (the default) or `http`.
7
+ */
8
+ import type { DriverPool } from "../../contracts/driver.js";
9
+ import type { QuerySchema } from "../../dialects/pg/model.js";
10
+ import { type NeonConfig } from "../../adapters/pg/neon.js";
11
+ import type { RoutedClient, TopologyInput, TopologyOptions } from "../topology.js";
12
+ import type { ConnectOptions, Connected } from "../types.js";
13
+ export { open, type NeonConfig, type NeonMode } from "../../adapters/pg/neon.js";
14
+ export { capabilities, hasCapability, httpCapabilities, readCapability, } from "../../adapters/pg/neon.js";
15
+ export { DriverError } from "../../adapters/error.js";
16
+ /** A connection string or a pool from {@link open}. */
17
+ export type NeonTarget = string | DriverPool;
18
+ /** Driver options `connect` forwards to {@link open}. */
19
+ export type NeonConnectOptions<S extends QuerySchema> = ConnectOptions<S> & Omit<NeonConfig, "url"> & TopologyOptions;
20
+ /**
21
+ * Connects one Neon endpoint, or a primary and its replicas.
22
+ *
23
+ * A string or a pool is one endpoint. A topology loads on demand and the promise
24
+ * resolves to the client. Reads use the first healthy replica.
25
+ *
26
+ * `mode: "websocket"` is the default. Interactive `tx()` needs it. `mode: "http"`
27
+ * is one-shot HTTP: `batch()` is atomic and `tx()` is refused.
28
+ *
29
+ * Named prepared statements are off unless `prepared` is `"named"`.
30
+ * `prepared: "named"` is not for transaction-mode poolers.
31
+ *
32
+ * @typeParam S - Schema
33
+ * @param target - URL, an existing pool, or `{ primary, replicas }`
34
+ * @param options - Schema, mode, errors, logger, and driver options
35
+ * @returns The client. A topology returns a promise. Await `connected` for the dialect check
36
+ */
37
+ export declare function connect<const S extends QuerySchema>(target: TopologyInput, options: NeonConnectOptions<S>): Promise<RoutedClient<S>>;
38
+ export declare function connect<const S extends QuerySchema>(target: NeonTarget, options: NeonConnectOptions<S>): Promise<Connected<S>>;
@@ -0,0 +1,64 @@
1
+ import {
2
+ DriverError2
3
+ } from "../../shared/cm3w0ywp.js";
4
+ import {
5
+ open6
6
+ } from "../../shared/agsfb86s.js";
7
+ import {
8
+ NEON_WEBSOCKET_CAPABILITIES,
9
+ NEON_HTTP_CAPABILITIES,
10
+ readCapability2,
11
+ hasCapability2
12
+ } from "../../shared/ae4j5f42.js";
13
+ import {
14
+ createClient
15
+ } from "../../shared/bah9nbg3.js";
16
+
17
+ // src/runtime/pg/neon.ts
18
+ function connect(target, options) {
19
+ if (typeof target === "object" && !isPool(target)) {
20
+ return import("../../shared/0wrea3jq.js").then((mod) => mod.default(target, options, (config) => open6({
21
+ url: config.url,
22
+ ...options.mode !== undefined ? { mode: options.mode } : {},
23
+ ...config.max !== undefined ? { max: config.max } : {},
24
+ ...config.timeouts !== undefined ? { timeouts: config.timeouts } : {},
25
+ ...config.prepared !== undefined ? { prepared: config.prepared } : {},
26
+ ...config.searchPath !== undefined ? { searchPath: config.searchPath } : {}
27
+ })));
28
+ }
29
+ const owned = !isPool(target);
30
+ const opened = isPool(target) ? Promise.resolve(target) : open6({
31
+ url: target,
32
+ ...options.mode !== undefined ? { mode: options.mode } : {},
33
+ ...options.max !== undefined ? { max: options.max } : {},
34
+ ...options.timeouts !== undefined ? { timeouts: options.timeouts } : {},
35
+ ...options.prepared !== undefined ? { prepared: options.prepared } : {},
36
+ ...options.searchPath !== undefined ? { searchPath: options.searchPath } : {}
37
+ });
38
+ return opened.then((pool) => createClient(options.schema, pool, {
39
+ ownsPool: owned,
40
+ http: options.errors?.http,
41
+ includeValues: options.errors?.includeValues,
42
+ logger: options.logger,
43
+ signal: options.signal,
44
+ timeout: options.timeout,
45
+ timeouts: options.timeouts,
46
+ hookm: options.hookm,
47
+ catalog: options.catalog,
48
+ catalogDir: options.catalogDir,
49
+ requireMeta: options.requireMeta,
50
+ generators: options.generators
51
+ }));
52
+ }
53
+ function isPool(target) {
54
+ return typeof target === "object" && "execute" in target && "capabilities" in target;
55
+ }
56
+ export {
57
+ DriverError2 as DriverError,
58
+ NEON_WEBSOCKET_CAPABILITIES as capabilities,
59
+ connect,
60
+ hasCapability2 as hasCapability,
61
+ NEON_HTTP_CAPABILITIES as httpCapabilities,
62
+ open6 as open,
63
+ readCapability2 as readCapability
64
+ };
@@ -1,22 +1,22 @@
1
1
  import {
2
2
  DriverError2
3
- } from "../../shared/31vm914h.js";
3
+ } from "../../shared/cm3w0ywp.js";
4
4
  import {
5
5
  open4
6
- } from "../../shared/1z04fa85.js";
6
+ } from "../../shared/14x60fbf.js";
7
7
  import {
8
8
  NODE_POSTGRES_CAPABILITIES,
9
9
  readCapability2,
10
10
  hasCapability2
11
- } from "../../shared/cgbamx3e.js";
11
+ } from "../../shared/ae4j5f42.js";
12
12
  import {
13
13
  createClient
14
- } from "../../shared/j60w0dvr.js";
14
+ } from "../../shared/bah9nbg3.js";
15
15
 
16
16
  // src/runtime/pg/pg.ts
17
17
  function connect(target, options) {
18
18
  if (typeof target === "object" && !isPool(target)) {
19
- return import("../../shared/929h19xp.js").then((mod) => mod.default(target, options, open4));
19
+ return import("../../shared/0wrea3jq.js").then((mod) => mod.default(target, options, open4));
20
20
  }
21
21
  const owned = !isPool(target);
22
22
  const pool = isPool(target) ? target : open4({
@@ -2,6 +2,7 @@
2
2
  * `connect` for PGlite (`okmodel/pg/pglite`).
3
3
  *
4
4
  * Opening a database is async. An existing pool is reused and not closed.
5
+ * Closing that client marks the client closed.
5
6
  * A `{ primary, replicas }` object loads the topology module. A replica URL is
6
7
  * that endpoint's data directory.
7
8
  */
@@ -1,30 +1,30 @@
1
- import"../../shared/8dqhth8c.js";
2
1
  import {
3
2
  DriverError2
4
- } from "../../shared/31vm914h.js";
3
+ } from "../../shared/cm3w0ywp.js";
5
4
  import {
6
- open3
7
- } from "../../shared/5j36z8dn.js";
5
+ open3,
6
+ seal2
7
+ } from "../../shared/4m6hskg8.js";
8
8
  import {
9
9
  PGLITE_CAPABILITIES,
10
10
  readCapability2,
11
11
  hasCapability2
12
- } from "../../shared/cgbamx3e.js";
12
+ } from "../../shared/ae4j5f42.js";
13
13
  import {
14
14
  createClient
15
- } from "../../shared/j60w0dvr.js";
15
+ } from "../../shared/bah9nbg3.js";
16
16
 
17
17
  // src/runtime/pg/pglite.ts
18
18
  async function connect(target, options) {
19
19
  if (typeof target === "object" && !isPool(target)) {
20
- return import("../../shared/929h19xp.js").then((mod) => mod.default(target, options, open3));
20
+ return import("../../shared/0wrea3jq.js").then((mod) => mod.default(target, options, open3));
21
21
  }
22
- const pool = isPool(target) ? target : await open3({
22
+ const pool = isPool(target) ? seal2(target) : await open3({
23
23
  ...target !== undefined ? { dataDir: target } : {},
24
24
  ...options.timeouts !== undefined ? { timeouts: options.timeouts } : {}
25
25
  });
26
26
  return createClient(options.schema, pool, {
27
- ownsPool: !isPool(target),
27
+ ownsPool: true,
28
28
  http: options.errors?.http,
29
29
  includeValues: options.errors?.includeValues,
30
30
  logger: options.logger,
@@ -1,22 +1,22 @@
1
1
  import {
2
2
  DriverError2
3
- } from "../../shared/31vm914h.js";
3
+ } from "../../shared/cm3w0ywp.js";
4
4
  import {
5
5
  open2
6
- } from "../../shared/wkme6tep.js";
6
+ } from "../../shared/35q0n9tz.js";
7
7
  import {
8
8
  POSTGRESJS_CAPABILITIES,
9
9
  readCapability2,
10
10
  hasCapability2
11
- } from "../../shared/cgbamx3e.js";
11
+ } from "../../shared/ae4j5f42.js";
12
12
  import {
13
13
  createClient
14
- } from "../../shared/j60w0dvr.js";
14
+ } from "../../shared/bah9nbg3.js";
15
15
 
16
16
  // src/runtime/pg/postgresjs.ts
17
17
  function connect(target, options) {
18
18
  if (typeof target === "object" && !isPool(target)) {
19
- return import("../../shared/929h19xp.js").then((mod) => mod.default(target, options, open2));
19
+ return import("../../shared/0wrea3jq.js").then((mod) => mod.default(target, options, open2));
20
20
  }
21
21
  const owned = !isPool(target);
22
22
  const pool = isPool(target) ? target : open2({