@supalive/core 1.12.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/db-ClCicssQ.js.map +1 -1
- package/dist/helper-zdJT5FUc.js +58 -0
- package/dist/helper-zdJT5FUc.js.map +1 -0
- package/dist/index-BIIcgvu8.d.ts +2300 -0
- package/dist/index-BIIcgvu8.d.ts.map +1 -0
- package/dist/index-BedlCLem.d.ts +2292 -0
- package/dist/index-BedlCLem.d.ts.map +1 -0
- package/dist/index-BnV8LnOf.d.ts +2286 -0
- package/dist/index-BnV8LnOf.d.ts.map +1 -0
- package/dist/index-BziK63TZ.d.ts +2271 -0
- package/dist/index-BziK63TZ.d.ts.map +1 -0
- package/dist/index-D31hMBDE.d.ts +2288 -0
- package/dist/index-D31hMBDE.d.ts.map +1 -0
- package/dist/index-DZhReQWB.d.ts +2288 -0
- package/dist/index-DZhReQWB.d.ts.map +1 -0
- package/dist/index-DlG8HDCO.d.ts +2215 -0
- package/dist/index-DlG8HDCO.d.ts.map +1 -0
- package/dist/index-Wgi_dGzj.d.ts +2215 -0
- package/dist/index-Wgi_dGzj.d.ts.map +1 -0
- package/dist/index-j3YTMNlF.d.ts +2223 -0
- package/dist/index-j3YTMNlF.d.ts.map +1 -0
- package/dist/mysql-BBbilD4I.js +614 -0
- package/dist/mysql-BBbilD4I.js.map +1 -0
- package/dist/mysql-BHJ2mrwZ.d.ts +113 -0
- package/dist/mysql-BHJ2mrwZ.d.ts.map +1 -0
- package/dist/mysql-BQbHJ_rK.js +617 -0
- package/dist/mysql-BQbHJ_rK.js.map +1 -0
- package/dist/mysql-BXoAON7c.d.ts +113 -0
- package/dist/mysql-BXoAON7c.d.ts.map +1 -0
- package/dist/mysql-BgfCUYGt.d.ts +113 -0
- package/dist/mysql-BgfCUYGt.d.ts.map +1 -0
- package/dist/mysql-Br7MqUXg.js +620 -0
- package/dist/mysql-Br7MqUXg.js.map +1 -0
- package/dist/mysql-BrueWtO9.d.ts +113 -0
- package/dist/mysql-BrueWtO9.d.ts.map +1 -0
- package/dist/mysql-CCo--z6n.d.ts +113 -0
- package/dist/mysql-CCo--z6n.d.ts.map +1 -0
- package/dist/mysql-CQcbcZB8.d.ts +113 -0
- package/dist/mysql-CQcbcZB8.d.ts.map +1 -0
- package/dist/mysql-CbgCY89y.d.ts +113 -0
- package/dist/mysql-CbgCY89y.d.ts.map +1 -0
- package/dist/mysql-CqD1ZnNY.js +619 -0
- package/dist/mysql-CqD1ZnNY.js.map +1 -0
- package/dist/mysql-D3Db2q3_.js +619 -0
- package/dist/mysql-D3Db2q3_.js.map +1 -0
- package/dist/mysql-DBrhTmYm.js +619 -0
- package/dist/mysql-DBrhTmYm.js.map +1 -0
- package/dist/mysql-DX7YA7IS.d.ts +113 -0
- package/dist/mysql-DX7YA7IS.d.ts.map +1 -0
- package/dist/mysql-DZ0_Rsjc.js +614 -0
- package/dist/mysql-DZ0_Rsjc.js.map +1 -0
- package/dist/mysql-Dko1MJqQ.js +619 -0
- package/dist/mysql-Dko1MJqQ.js.map +1 -0
- package/dist/mysql-F831ycnw.d.ts +113 -0
- package/dist/mysql-F831ycnw.d.ts.map +1 -0
- package/dist/mysql-TLPG62tv.js +618 -0
- package/dist/mysql-TLPG62tv.js.map +1 -0
- package/dist/mysql-e-ii74yG.js +613 -0
- package/dist/mysql-e-ii74yG.js.map +1 -0
- package/dist/overlap-checker-BBkqRdcs.js +259 -0
- package/dist/overlap-checker-BBkqRdcs.js.map +1 -0
- package/dist/overlap-checker-DHUJe-Yy.js +259 -0
- package/dist/overlap-checker-DHUJe-Yy.js.map +1 -0
- package/dist/overlap-checker-DWeQLpSD.js +259 -0
- package/dist/overlap-checker-DWeQLpSD.js.map +1 -0
- package/dist/overlap-checker-Kz7B_jsp.js +259 -0
- package/dist/overlap-checker-Kz7B_jsp.js.map +1 -0
- package/dist/postgres-7hJuQX4Y.d.ts +117 -0
- package/dist/postgres-7hJuQX4Y.d.ts.map +1 -0
- package/dist/postgres-B4H78IkW.js +864 -0
- package/dist/postgres-B4H78IkW.js.map +1 -0
- package/dist/postgres-B4h8D5U2.d.ts +117 -0
- package/dist/postgres-B4h8D5U2.d.ts.map +1 -0
- package/dist/postgres-BXFPamkP.js +864 -0
- package/dist/postgres-BXFPamkP.js.map +1 -0
- package/dist/postgres-CoR3TUMd.js +865 -0
- package/dist/postgres-CoR3TUMd.js.map +1 -0
- package/dist/postgres-D-RsG12a.d.ts +117 -0
- package/dist/postgres-D-RsG12a.d.ts.map +1 -0
- package/dist/postgres-D5Z1S3J9.d.ts +117 -0
- package/dist/postgres-D5Z1S3J9.d.ts.map +1 -0
- package/dist/postgres-DHs89iWT.js +864 -0
- package/dist/postgres-DHs89iWT.js.map +1 -0
- package/dist/postgres-DvBIRnYA.d.ts +117 -0
- package/dist/postgres-DvBIRnYA.d.ts.map +1 -0
- package/dist/postgres-Eo-lpUiX.d.ts +117 -0
- package/dist/postgres-Eo-lpUiX.d.ts.map +1 -0
- package/dist/postgres-VLAGIFLR.d.ts +117 -0
- package/dist/postgres-VLAGIFLR.d.ts.map +1 -0
- package/dist/postgres-hrQmDPUp.d.ts +117 -0
- package/dist/postgres-hrQmDPUp.d.ts.map +1 -0
- package/dist/postgres-pXrP9Fx0.d.ts +117 -0
- package/dist/postgres-pXrP9Fx0.d.ts.map +1 -0
- package/dist/query-BuOs9w-U.js +730 -0
- package/dist/query-BuOs9w-U.js.map +1 -0
- package/dist/query-Xw2hi6TB.js +730 -0
- package/dist/query-Xw2hi6TB.js.map +1 -0
- package/dist/read-routing-BUcQAwnd.js +62 -0
- package/dist/read-routing-BUcQAwnd.js.map +1 -0
- package/dist/read-routing-BXflWzQI.js +61 -0
- package/dist/read-routing-BXflWzQI.js.map +1 -0
- package/dist/read-routing-CcsLp0ow.js +61 -0
- package/dist/read-routing-CcsLp0ow.js.map +1 -0
- package/dist/realtime_db-B70vqtRZ.js +272 -0
- package/dist/realtime_db-B70vqtRZ.js.map +1 -0
- package/dist/realtime_db-BMysrWym.js +312 -0
- package/dist/realtime_db-BMysrWym.js.map +1 -0
- package/dist/realtime_db-Bi7S938D.js +312 -0
- package/dist/realtime_db-Bi7S938D.js.map +1 -0
- package/dist/realtime_db-CVze3gM0.js +312 -0
- package/dist/realtime_db-CVze3gM0.js.map +1 -0
- package/dist/realtime_db-DMipkUmD.js +312 -0
- package/dist/realtime_db-DMipkUmD.js.map +1 -0
- package/dist/realtime_db-XWzuq2JS.js +272 -0
- package/dist/realtime_db-XWzuq2JS.js.map +1 -0
- package/dist/router-Kgrlci8X.js +337 -0
- package/dist/router-Kgrlci8X.js.map +1 -0
- package/dist/router-g8qSQb8m.js +314 -0
- package/dist/router-g8qSQb8m.js.map +1 -0
- package/dist/schema-DLue3K2s.js +134 -0
- package/dist/schema-DLue3K2s.js.map +1 -0
- package/dist/schema-DfowI0ip.js +134 -0
- package/dist/schema-DfowI0ip.js.map +1 -0
- package/dist/schema-fKldWzwc.js +134 -0
- package/dist/schema-fKldWzwc.js.map +1 -0
- package/dist/src/client/index.d.ts +1 -1
- package/dist/src/client/index.js +69 -29
- package/dist/src/client/index.js.map +1 -1
- package/dist/src/exports/mysql.d.ts +1 -1
- package/dist/src/exports/mysql.js +1 -1
- package/dist/src/exports/postgres.d.ts +1 -1
- package/dist/src/exports/postgres.js +1 -1
- package/dist/src/exports/procedure.d.ts +1 -1
- package/dist/src/exports/procedure.js +5 -6
- package/dist/src/exports/procedure.js.map +1 -1
- package/dist/src/exports/schema-sql.d.ts +18 -1
- package/dist/src/exports/schema-sql.d.ts.map +1 -1
- package/dist/src/exports/schema-sql.js +91 -15
- package/dist/src/exports/schema-sql.js.map +1 -1
- package/dist/src/exports/server.d.ts +11 -4
- package/dist/src/exports/server.d.ts.map +1 -1
- package/dist/src/exports/server.js +136 -59
- package/dist/src/exports/server.js.map +1 -1
- package/dist/src/exports/sub-manager-worker-entry.js +1 -1
- package/dist/src/exports/types.d.ts +2 -2
- package/dist/src/exports/types.js +4 -4
- package/dist/sub-worker-dispatch-CO9nVdSG.js +813 -0
- package/dist/sub-worker-dispatch-CO9nVdSG.js.map +1 -0
- package/dist/sub-worker-dispatch-CQBknEL7.js +813 -0
- package/dist/sub-worker-dispatch-CQBknEL7.js.map +1 -0
- package/dist/sub-worker-dispatch-CQHeit6D.js +813 -0
- package/dist/sub-worker-dispatch-CQHeit6D.js.map +1 -0
- package/dist/sub-worker-dispatch-CmEW10it.js +813 -0
- package/dist/sub-worker-dispatch-CmEW10it.js.map +1 -0
- package/dist/sub-worker-dispatch-CunxuOPT.js +823 -0
- package/dist/sub-worker-dispatch-CunxuOPT.js.map +1 -0
- package/dist/sub-worker-dispatch-CvvFm40r.js +817 -0
- package/dist/sub-worker-dispatch-CvvFm40r.js.map +1 -0
- package/dist/sub-worker-dispatch-D15UHo1g.js +813 -0
- package/dist/sub-worker-dispatch-D15UHo1g.js.map +1 -0
- package/dist/sub-worker-dispatch-D8DY56ry.js +817 -0
- package/dist/sub-worker-dispatch-D8DY56ry.js.map +1 -0
- package/dist/sub-worker-dispatch-DJgWxtSQ.js +823 -0
- package/dist/sub-worker-dispatch-DJgWxtSQ.js.map +1 -0
- package/dist/sub-worker-dispatch-Dplqeubd.js +813 -0
- package/dist/sub-worker-dispatch-Dplqeubd.js.map +1 -0
- package/dist/sub-worker-dispatch-dXjUmSMN.js +813 -0
- package/dist/sub-worker-dispatch-dXjUmSMN.js.map +1 -0
- package/dist/table-id-BJdmctEQ.js +91 -0
- package/dist/table-id-BJdmctEQ.js.map +1 -0
- package/dist/table-id-DyrJBKAQ.js +105 -0
- package/dist/table-id-DyrJBKAQ.js.map +1 -0
- package/dist/types_client_rpc-BGMwPJst.js +123 -0
- package/dist/types_client_rpc-BGMwPJst.js.map +1 -0
- package/dist/types_client_rpc-ByGwoRCL.js +132 -0
- package/dist/types_client_rpc-ByGwoRCL.js.map +1 -0
- package/dist/types_db-BsR02Sph.js +171 -0
- package/dist/types_db-BsR02Sph.js.map +1 -0
- package/dist/types_db-CgGlOMmr.js +187 -0
- package/dist/types_db-CgGlOMmr.js.map +1 -0
- package/dist/types_db-OUou3o2Z.js +172 -0
- package/dist/types_db-OUou3o2Z.js.map +1 -0
- package/dist/types_server-B3z8hi-Z.d.ts +523 -0
- package/dist/types_server-B3z8hi-Z.d.ts.map +1 -0
- package/dist/types_server-BXBvz4T8.d.ts +523 -0
- package/dist/types_server-BXBvz4T8.d.ts.map +1 -0
- package/dist/types_server-BhC19R2a.js +27 -0
- package/dist/types_server-BhC19R2a.js.map +1 -0
- package/dist/types_server-CClUPZn1.d.ts +521 -0
- package/dist/types_server-CClUPZn1.d.ts.map +1 -0
- package/dist/types_server-CnYTSPhM.d.ts +523 -0
- package/dist/types_server-CnYTSPhM.d.ts.map +1 -0
- package/dist/types_server-DHpGUHB_.d.ts +521 -0
- package/dist/types_server-DHpGUHB_.d.ts.map +1 -0
- package/dist/types_server-Ded1u3bL.d.ts +521 -0
- package/dist/types_server-Ded1u3bL.d.ts.map +1 -0
- package/dist/types_server-fons7nmo.d.ts +523 -0
- package/dist/types_server-fons7nmo.d.ts.map +1 -0
- package/dist/types_server-okvBG4v_.d.ts +521 -0
- package/dist/types_server-okvBG4v_.d.ts.map +1 -0
- package/dist/types_server-pD8DiI7s.d.ts +521 -0
- package/dist/types_server-pD8DiI7s.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types_client_rpc-ByGwoRCL.js","names":[],"sources":["../src/db/types_client_rpc.ts"],"sourcesContent":["import z from \"zod\";\n\nexport interface ErrorMessage {\n type: \"error\";\n id?: string;\n error: string;\n code?: string;\n}\n\n// ─── WebSocket Message Schemas ────────────────────────────────────────────────\n// Zod schemas for runtime validation of WebSocket messages\n\nexport const AuthMessageSchema = z.object({\n type: z.literal(\"auth\"),\n data: z.record(z.string(), z.any()).optional(),\n});\n\nexport const CallMessageSchema = z.object({\n type: z.literal(\"call\"),\n id: z.string(),\n procedure: z.string(),\n input: z.unknown(),\n /**\n * Client read high-water: the largest commit/snapshot ts the client has\n * already observed (from a prior mutation's commitTs or a query's returned\n * `ts`). Decimal string (bigint on the wire). The server routes a query's\n * reads to the replica ONLY when the replica has applied at least this ts —\n * giving read-your-writes + monotonic reads without a signed token. Omitted\n * until the client has observed anything. The server clamps it to its own\n * primary latest, so a client can't pin the primary forever with a bogus value.\n */\n minTs: z.string().optional(),\n});\n\nexport const SubscribeMessageSchema = z.object({\n type: z.literal(\"subscribe\"),\n id: z.string(),\n procedure: z.string(),\n input: z.unknown(),\n});\n\nexport const UnsubscribeMessageSchema = z.object({\n type: z.literal(\"unsubscribe\"),\n subId: z.string(),\n});\n\nexport const ClientMessageSchema = z.union([\n AuthMessageSchema,\n CallMessageSchema,\n SubscribeMessageSchema,\n UnsubscribeMessageSchema,\n]);\n\n// Infer TypeScript types from schemas\nexport type AuthMessage = z.infer<typeof AuthMessageSchema>;\nexport type CallMessage = z.infer<typeof CallMessageSchema>;\nexport type SubscribeMessage = z.infer<typeof SubscribeMessageSchema>;\nexport type UnsubscribeMessage = z.infer<typeof UnsubscribeMessageSchema>;\nexport type ClientMessage = z.infer<typeof ClientMessageSchema>;\n\n// ─── Server Message Schemas ───────────────────────────────────────────────────\n\nexport const ConnectedMessageSchema = z.object({\n type: z.literal(\"connected\"),\n sessionId: z.string(),\n});\n\nexport const AuthSuccessMessageSchema = z.object({\n type: z.literal(\"auth:success\"),\n userId: z.string(),\n extra: z.object().optional()\n});\n\nexport const AuthFailedMessageSchema = z.object({\n type: z.literal(\"auth:failed\"),\n message: z.string(),\n extra: z.record(z.string(), z.unknown()).optional()\n});\n\nexport const ResponseMessageSchema = z.object({\n type: z.literal(\"response\"),\n id: z.string(),\n success: z.boolean(),\n data: z.unknown().optional(),\n error: z.string().optional(),\n code: z.string().optional(),\n /**\n * Populated by the server only for a successful `subscribe` response.\n * Carries the canonical, server-computed subscription id so the client\n * can route subsequent `sub:update` / `sub:gone` messages without\n * recomputing the hash locally (which would require the wasm runtime\n * and would not reflect server-side per-procedure `queryIdentity`\n * overrides).\n */\n subId: z.string().optional(),\n /**\n * Observed commit/snapshot ts for a successful `call`. Decimal string\n * (bigint on the wire). For a query it's the snapshot the reads ran at; for a\n * mutation it's the commitTs. The client folds it into its read high-water\n * (see {@link CallMessageSchema.minTs}) so later reads preserve\n * read-your-writes / monotonic reads. Absent for actions and error responses.\n */\n ts: z.string().optional(),\n});\n\nexport const SubscriptionUpdateMessageSchema = z.object({\n type: z.literal(\"sub:update\"),\n subId: z.string(),\n data: z.unknown(),\n dataHash: z.string().optional(),\n /**\n * The primary snapshot ts this update's data reflects. Decimal string (bigint\n * on the wire). The client folds it into its read high-water so a later\n * one-shot query can't route to a replica that is behind what the live view\n * already showed (cross-subscription monotonic reads). Present on server-side\n * recomputes; omitted when the update is served straight from cache (no ts\n * handy) — the client simply doesn't advance for those.\n */\n ts: z.string().optional(),\n});\n\n/**\n * Notifies a client that a subscription is no longer tracked on the server\n * and will not receive further updates. Sent when, during a sub-manager\n * recovery cycle, the registration record could not be found (e.g. another\n * app-server instance fully unregistered the sub while we were disconnected).\n * The client may choose to re-subscribe or surface the state to the user.\n */\nexport const SubscriptionGoneMessageSchema = z.object({\n type: z.literal(\"sub:gone\"),\n subId: z.string(),\n reason: z.string().optional(),\n});\n\n/**\n * Server-driven liveness signal. Sent when the channel has been idle for\n * the configured app-ping interval (default 15s) and again after every\n * outbound message. Pure no-op for the client: receiving any message\n * (including this one) resets the client's inactivity watchdog. The client\n * does NOT reply.\n */\nexport const ServerPingMessageSchema = z.object({\n type: z.literal(\"ping\"),\n});\n\nexport const ServerMessageSchema = z.union([\n ConnectedMessageSchema,\n AuthSuccessMessageSchema,\n AuthFailedMessageSchema,\n ResponseMessageSchema,\n SubscriptionUpdateMessageSchema,\n SubscriptionGoneMessageSchema,\n ServerPingMessageSchema,\n]);\n\nexport type ConnectedMessage = z.infer<typeof ConnectedMessageSchema>;\nexport type AuthSuccessMessage = z.infer<typeof AuthSuccessMessageSchema>;\nexport type AuthFailedMessage = z.infer<typeof AuthFailedMessageSchema>;\nexport type ResponseMessage = z.infer<typeof ResponseMessageSchema>;\nexport type SubscriptionUpdateMessage = z.infer<typeof SubscriptionUpdateMessageSchema>;\nexport type SubscriptionGoneMessage = z.infer<typeof SubscriptionGoneMessageSchema>;\nexport type ServerPingMessage = z.infer<typeof ServerPingMessageSchema>;\nexport type ServerMessage = z.infer<typeof ServerMessageSchema>;\n\nexport class AuthenticationError extends Error {\n constructor(\n message: string,\n public extra: Record<string, unknown> = {},\n ) {\n super(message);\n }\n}\n\n/**\n * Helper type to check if a procedure is internal.\n */\nexport type IsInternal<T> = T extends { internal: infer I } ? (I extends true ? true : false) : false;\n\nexport interface Context {\n requestId: string;\n /** Authenticated user info */\n user: {\n userId: string;\n };\n}\n"],"mappings":";;AAYA,MAAa,oBAAoB,EAAE,OAAO;CACxC,MAAM,EAAE,QAAQ,MAAM;CACtB,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS;AAC/C,CAAC;AAED,MAAa,oBAAoB,EAAE,OAAO;CACxC,MAAM,EAAE,QAAQ,MAAM;CACtB,IAAI,EAAE,OAAO;CACb,WAAW,EAAE,OAAO;CACpB,OAAO,EAAE,QAAQ;;;;;;;;;;CAUjB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;AAC7B,CAAC;AAED,MAAa,yBAAyB,EAAE,OAAO;CAC7C,MAAM,EAAE,QAAQ,WAAW;CAC3B,IAAI,EAAE,OAAO;CACb,WAAW,EAAE,OAAO;CACpB,OAAO,EAAE,QAAQ;AACnB,CAAC;AAED,MAAa,2BAA2B,EAAE,OAAO;CAC/C,MAAM,EAAE,QAAQ,aAAa;CAC7B,OAAO,EAAE,OAAO;AAClB,CAAC;AAED,MAAa,sBAAsB,EAAE,MAAM;CACzC;CACA;CACA;CACA;AACF,CAAC;AAWD,MAAa,yBAAyB,EAAE,OAAO;CAC7C,MAAM,EAAE,QAAQ,WAAW;CAC3B,WAAW,EAAE,OAAO;AACtB,CAAC;AAED,MAAa,2BAA2B,EAAE,OAAO;CAC/C,MAAM,EAAE,QAAQ,cAAc;CAC9B,QAAQ,EAAE,OAAO;CACjB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;AAC7B,CAAC;AAED,MAAa,0BAA0B,EAAE,OAAO;CAC9C,MAAM,EAAE,QAAQ,aAAa;CAC7B,SAAS,EAAE,OAAO;CAClB,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;AACpD,CAAC;AAED,MAAa,wBAAwB,EAAE,OAAO;CAC5C,MAAM,EAAE,QAAQ,UAAU;CAC1B,IAAI,EAAE,OAAO;CACb,SAAS,EAAE,QAAQ;CACnB,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS;CAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;;;;;;;;;CAS1B,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;;;;;;;;CAQ3B,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS;AAC1B,CAAC;AAED,MAAa,kCAAkC,EAAE,OAAO;CACtD,MAAM,EAAE,QAAQ,YAAY;CAC5B,OAAO,EAAE,OAAO;CAChB,MAAM,EAAE,QAAQ;CAChB,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS;;;;;;;;;CAS9B,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS;AAC1B,CAAC;;;;;;;;AASD,MAAa,gCAAgC,EAAE,OAAO;CACpD,MAAM,EAAE,QAAQ,UAAU;CAC1B,OAAO,EAAE,OAAO;CAChB,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;AAC9B,CAAC;;;;;;;;AASD,MAAa,0BAA0B,EAAE,OAAO,EAC9C,MAAM,EAAE,QAAQ,MAAM,EACxB,CAAC;AAED,MAAa,sBAAsB,EAAE,MAAM;CACzC;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAWD,IAAa,sBAAb,cAAyC,MAAM;CAGpC;CAFT,YACE,SACA,QAAwC,CAAC,GACzC;EACA,MAAM,OAAO;EAFN,KAAA,QAAA;CAGT;AACF"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { o as utf8Encode } from "./helper-zdJT5FUc.js";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
//#region src/db/types_db.ts
|
|
4
|
+
const BigIntSchema = z.string().transform((val) => BigInt(val));
|
|
5
|
+
const CompareOperatorSchema = z.enum([
|
|
6
|
+
"=",
|
|
7
|
+
"!=",
|
|
8
|
+
">",
|
|
9
|
+
">=",
|
|
10
|
+
"<",
|
|
11
|
+
"<=",
|
|
12
|
+
"like",
|
|
13
|
+
"ilike",
|
|
14
|
+
"contains",
|
|
15
|
+
"icontains",
|
|
16
|
+
"between",
|
|
17
|
+
"in",
|
|
18
|
+
"jsonContains",
|
|
19
|
+
"jsonContainedBy",
|
|
20
|
+
"jsonHasKey",
|
|
21
|
+
"jsonArrayContains",
|
|
22
|
+
"isNull",
|
|
23
|
+
"isNotNull"
|
|
24
|
+
]);
|
|
25
|
+
const PredicateSchema = z.lazy(() => z.union([
|
|
26
|
+
LeafPredicateSchema,
|
|
27
|
+
AndPredicateSchema,
|
|
28
|
+
OrPredicateSchema
|
|
29
|
+
]));
|
|
30
|
+
const LeafPredicateSchema = z.object({
|
|
31
|
+
"kind": z.literal("leaf"),
|
|
32
|
+
column: z.string(),
|
|
33
|
+
operator: CompareOperatorSchema,
|
|
34
|
+
value: z.unknown(),
|
|
35
|
+
value2: z.unknown().optional(),
|
|
36
|
+
raw: z.boolean().optional(),
|
|
37
|
+
path: z.string().optional(),
|
|
38
|
+
mode: z.enum(["one", "all"]).optional()
|
|
39
|
+
});
|
|
40
|
+
const AndPredicateSchema = z.object({
|
|
41
|
+
kind: z.literal("and"),
|
|
42
|
+
children: z.array(PredicateSchema)
|
|
43
|
+
});
|
|
44
|
+
const OrPredicateSchema = z.object({
|
|
45
|
+
kind: z.literal("or"),
|
|
46
|
+
children: z.array(PredicateSchema)
|
|
47
|
+
});
|
|
48
|
+
const Uint8ArraySchema = z.any().transform((val) => {
|
|
49
|
+
if (val instanceof Uint8Array) return val;
|
|
50
|
+
return bytesFromJson(val);
|
|
51
|
+
});
|
|
52
|
+
function normalizeIdToBytes(id, fromHex = false) {
|
|
53
|
+
const data = (typeof id === "number" ? String(id) : id).replace(/-/g, "");
|
|
54
|
+
if (fromHex === true) {
|
|
55
|
+
const len = data.length >>> 1;
|
|
56
|
+
const out = new Uint8Array(len);
|
|
57
|
+
for (let i = 0; i < len; i++) out[i] = parseInt(data.substring(i * 2, i * 2 + 2), 16);
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
return utf8Encode(data);
|
|
61
|
+
}
|
|
62
|
+
function normalizeToBytes(value) {
|
|
63
|
+
try {
|
|
64
|
+
return bytesFromJson(value);
|
|
65
|
+
} catch (_) {
|
|
66
|
+
return /* @__PURE__ */ new Uint8Array(0);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function bytesFromJson(value) {
|
|
70
|
+
if (value instanceof Uint8Array) return value;
|
|
71
|
+
if (Array.isArray(value)) return Uint8Array.from(value);
|
|
72
|
+
if (value && typeof value === "object" && "type" in value && value.type === "Buffer" && "data" in value) return Uint8Array.from(value.data);
|
|
73
|
+
if (typeof value === "string") return utf8Encode(value);
|
|
74
|
+
if (typeof value === "number") return utf8Encode(String(value));
|
|
75
|
+
throw new Error("Invalid buffer value");
|
|
76
|
+
}
|
|
77
|
+
const PointReadSchema = z.object({
|
|
78
|
+
kind: z.literal("point"),
|
|
79
|
+
table: z.string(),
|
|
80
|
+
id: z.string(),
|
|
81
|
+
expectedCommitTs: BigIntSchema.nullable().optional()
|
|
82
|
+
});
|
|
83
|
+
const RawPointReadSchema = z.object({
|
|
84
|
+
kind: z.literal("point"),
|
|
85
|
+
tableId: Uint8ArraySchema,
|
|
86
|
+
id: Uint8ArraySchema,
|
|
87
|
+
table: z.string(),
|
|
88
|
+
expectedCommitTs: BigIntSchema.nullable().optional()
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* Query specification for a range read (get with filters).
|
|
92
|
+
* This is the query definition, not the result.
|
|
93
|
+
*/
|
|
94
|
+
const RangeReadSchema = z.object({
|
|
95
|
+
kind: z.literal("range"),
|
|
96
|
+
table: z.string(),
|
|
97
|
+
predicate: PredicateSchema,
|
|
98
|
+
columns: z.array(z.string()),
|
|
99
|
+
orderBy: z.array(z.string()).nullable().optional(),
|
|
100
|
+
limit: z.number().nullable().optional(),
|
|
101
|
+
offset: z.number().nullable().optional()
|
|
102
|
+
});
|
|
103
|
+
const RawRangeReadSchema = z.object({
|
|
104
|
+
kind: z.literal("range"),
|
|
105
|
+
table: z.string(),
|
|
106
|
+
tableId: Uint8ArraySchema,
|
|
107
|
+
predicate: PredicateSchema,
|
|
108
|
+
columns: z.array(z.string()),
|
|
109
|
+
orderBy: z.array(z.string()).nullable().optional(),
|
|
110
|
+
limit: z.number().nullable().optional(),
|
|
111
|
+
offset: z.number().nullable().optional()
|
|
112
|
+
});
|
|
113
|
+
const ReadEntrySchema = z.union([PointReadSchema, RangeReadSchema]);
|
|
114
|
+
const RawReadEntrySchema = z.union([RawPointReadSchema, RawRangeReadSchema]);
|
|
115
|
+
const WriteOpSchema = z.enum([
|
|
116
|
+
"insert",
|
|
117
|
+
"update",
|
|
118
|
+
"delete"
|
|
119
|
+
]);
|
|
120
|
+
const WriteEntrySchema = z.object({
|
|
121
|
+
table: z.string(),
|
|
122
|
+
tableId: Uint8ArraySchema,
|
|
123
|
+
id: z.string(),
|
|
124
|
+
op: WriteOpSchema,
|
|
125
|
+
data: z.record(z.string(), z.unknown()).optional(),
|
|
126
|
+
prevData: z.record(z.string(), z.unknown()).optional(),
|
|
127
|
+
expectedCommitTs: BigIntSchema.nullable().optional()
|
|
128
|
+
});
|
|
129
|
+
const QueryCacheMetadataSchema = z.object({
|
|
130
|
+
lastSnapshotTs: BigIntSchema,
|
|
131
|
+
version: z.string(),
|
|
132
|
+
readSet: z.array(ReadEntrySchema)
|
|
133
|
+
});
|
|
134
|
+
const QueryCacheEntrySchema = z.object({
|
|
135
|
+
data: z.unknown(),
|
|
136
|
+
version: z.string()
|
|
137
|
+
});
|
|
138
|
+
const CachedPgMetadataSchema = z.record(z.string(), z.record(z.string(), z.string()));
|
|
139
|
+
const NO_RETRY = {
|
|
140
|
+
maxAttempts: 1,
|
|
141
|
+
backoff: "none"
|
|
142
|
+
};
|
|
143
|
+
const DEFAULT_RETRY = {
|
|
144
|
+
maxAttempts: 12,
|
|
145
|
+
backoff: "exponential",
|
|
146
|
+
delayMs: 15
|
|
147
|
+
};
|
|
148
|
+
var OccConflictError = class OccConflictError extends Error {
|
|
149
|
+
reason;
|
|
150
|
+
conflictDetail;
|
|
151
|
+
constructor(reason, conflictDetail) {
|
|
152
|
+
super(`OCC conflict: ${reason}`);
|
|
153
|
+
this.reason = reason;
|
|
154
|
+
this.conflictDetail = conflictDetail;
|
|
155
|
+
this.name = "OccConflictError";
|
|
156
|
+
}
|
|
157
|
+
static isOccConflictError(err) {
|
|
158
|
+
if (err instanceof OccConflictError || err && typeof err === "object" && err.name === "OccConflictError") return true;
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
var OccAbortError = class extends Error {
|
|
163
|
+
constructor(message) {
|
|
164
|
+
super(message);
|
|
165
|
+
this.name = "OccAbortError";
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
//#endregion
|
|
169
|
+
export { normalizeIdToBytes as C, bytesFromJson as S, RawRangeReadSchema as _, DEFAULT_RETRY as a, WriteEntrySchema as b, OccAbortError as c, PointReadSchema as d, PredicateSchema as f, RawPointReadSchema as g, RangeReadSchema as h, CompareOperatorSchema as i, OccConflictError as l, QueryCacheMetadataSchema as m, BigIntSchema as n, LeafPredicateSchema as o, QueryCacheEntrySchema as p, CachedPgMetadataSchema as r, NO_RETRY as s, AndPredicateSchema as t, OrPredicateSchema as u, RawReadEntrySchema as v, normalizeToBytes as w, WriteOpSchema as x, ReadEntrySchema as y };
|
|
170
|
+
|
|
171
|
+
//# sourceMappingURL=types_db-BsR02Sph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types_db-BsR02Sph.js","names":[],"sources":["../src/db/types_db.ts"],"sourcesContent":["import z from \"zod\";\nimport { utf8Encode } from \"./bytes\";\n\n/** Monotonically increasing integer from global_commit_ts sequence in Postgres */\nexport type CommitTs = bigint;\n\nexport const BigIntSchema = z.string().transform((val) => BigInt(val));\n\nexport const CompareOperatorSchema = z.enum([\n \"=\", \"!=\", \">\", \">=\", \"<\", \"<=\",\n \"like\", \"ilike\", \"contains\", \"icontains\",\n \"between\", \"in\",\n \"jsonContains\", \"jsonContainedBy\", \"jsonHasKey\", \"jsonArrayContains\",\n \"isNull\", \"isNotNull\"\n]);\nexport type CompareOperator = z.infer<typeof CompareOperatorSchema>;\n\n// Define the type first so z.lazy() can reference it\nexport type Predicate =\n | LeafPredicate\n | { kind: \"and\"; children: Predicate[] }\n | { kind: \"or\"; children: Predicate[] };\nexport const PredicateSchema: z.ZodType<Predicate> = z.lazy(() =>\n z.union([\n LeafPredicateSchema,\n AndPredicateSchema,\n OrPredicateSchema,\n ])\n);\n\nexport const LeafPredicateSchema = z.object({\n \"kind\": z.literal(\"leaf\"),\n column: z.string(),\n operator: CompareOperatorSchema,\n value: z.unknown(),\n value2: z.unknown().optional(),\n // For JSON ops: `true` means `value` is already in dialect-prepared form\n // (a path expression for jsonHasKey, a JSON string for the contains family)\n // and the SqlBuilder should pass it through without further escaping.\n raw: z.boolean().optional(),\n // For jsonContains/jsonContainedBy/jsonArrayContains: optional sub-path\n // into the target JSON value to scope the check (jsonpath syntax, e.g.\n // `$.\"a\".\"b\"`). Already compiled to a single string.\n path: z.string().optional(),\n // For jsonHasKey multi-path mode: when set, `value` is `string[]` (each\n // entry a jsonpath) and the predicate checks for existence of any (`one`)\n // or all (`all`) of them.\n mode: z.enum([\"one\", \"all\"]).optional(),\n});\nexport type LeafPredicate = z.infer<typeof LeafPredicateSchema>;\n\nexport const AndPredicateSchema = z.object({\n kind: z.literal(\"and\"),\n children: z.array(PredicateSchema),\n});\nexport type AndPredicate = z.infer<typeof AndPredicateSchema>;\n\nexport const OrPredicateSchema = z.object({\n kind: z.literal(\"or\"),\n children: z.array(PredicateSchema),\n});\nexport type OrPredicate = z.infer<typeof OrPredicateSchema>;\n\n/** Query specification - what was queried (used for cache key generation) */\nexport type QuerySpec = ReadEntry;\n\nconst Uint8ArraySchema = z.any().transform((val) => {\n if (val instanceof Uint8Array) return val;\n return bytesFromJson(val);\n});\n\nexport function normalizeIdToBytes(id: string | number, fromHex = false): Uint8Array {\n const idStr = typeof id === \"number\" ? String(id) : id;\n const data = idStr.replace(/-/g, \"\");\n if (fromHex === true) {\n const len = data.length >>> 1;\n const out = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n out[i] = parseInt(data.substring(i * 2, i * 2 + 2), 16);\n }\n return out;\n }\n return utf8Encode(data);\n}\n\nexport function normalizeToBytes(value: Uint8Array | unknown): Uint8Array {\n try {\n return bytesFromJson(value);\n } catch (_) {\n return new Uint8Array(0);\n }\n}\n\nexport function bytesFromJson(value: Uint8Array | unknown): Uint8Array {\n if (value instanceof Uint8Array) {\n return value;\n }\n if (Array.isArray(value)) {\n return Uint8Array.from(value as number[]);\n }\n if (value && typeof value === \"object\" && \"type\" in value && (value as any).type === \"Buffer\" && \"data\" in value) {\n return Uint8Array.from((value as any).data);\n }\n if (typeof value === \"string\") {\n return utf8Encode(value);\n }\n if (typeof value === \"number\") {\n return utf8Encode(String(value));\n }\n\n throw new Error(\"Invalid buffer value\");\n}\n\n/* \n * Query specification for a point read (find by ID).\n */\nexport const PointReadSchema = z.object({\n kind: z.literal(\"point\"),\n table: z.string(),\n id: z.string(),\n // No `tableId`: it is `utf8(table)` and is derived on demand (mapReadEntryToRaw\n // → tableIdOf), so it is never stored in the persisted/wire read set.\n // tableId: Uint8ArraySchema,\n\n // commit_ts of the row at read time. `null` = row didn't exist (so a later\n // insert is a conflict). `undefined` = the read was added synthetically and\n // OCC should fall back to the commit-log scan / general validator.\n expectedCommitTs: BigIntSchema.nullable().optional(),\n});\nexport type PointRead = z.infer<typeof PointReadSchema>;\n\nexport const RawPointReadSchema = z.object({\n kind: z.literal(\"point\"),\n tableId: Uint8ArraySchema,\n id: Uint8ArraySchema,\n table: z.string(),\n expectedCommitTs: BigIntSchema.nullable().optional(),\n});\nexport type RawPointRead = z.infer<typeof RawPointReadSchema>;\n\n/**\n * Query specification for a range read (get with filters).\n * This is the query definition, not the result.\n */\nexport const RangeReadSchema = z.object({\n kind: z.literal(\"range\"),\n table: z.string(),\n // No `tableId`: derived on demand from `table` (see PointReadSchema).\n // tableId: Uint8ArraySchema,\n\n predicate: PredicateSchema,\n columns: z.array(z.string()),\n orderBy: z.array(z.string()).nullable().optional(),\n limit: z.number().nullable().optional(),\n offset: z.number().nullable().optional(),\n});\nexport type RangeRead = z.infer<typeof RangeReadSchema>;\n\nexport const RawRangeReadSchema = z.object({\n kind: z.literal(\"range\"),\n table: z.string(),\n tableId: Uint8ArraySchema,\n predicate: PredicateSchema,\n columns: z.array(z.string()),\n orderBy: z.array(z.string()).nullable().optional(),\n limit: z.number().nullable().optional(),\n offset: z.number().nullable().optional(),\n});\nexport type RawRangeRead = z.infer<typeof RawRangeReadSchema>;\n\nexport const ReadEntrySchema = z.union([PointReadSchema, RangeReadSchema]);\nexport type ReadEntry = z.infer<typeof ReadEntrySchema>;\n\nexport const RawReadEntrySchema = z.union([RawPointReadSchema, RawRangeReadSchema]);\nexport type RawReadEntry = z.infer<typeof RawReadEntrySchema>;\n\nexport const WriteOpSchema = z.enum([\"insert\", \"update\", \"delete\"]);\nexport type WriteOp = z.infer<typeof WriteOpSchema>;\n\nexport const WriteEntrySchema = z.object({\n table: z.string(),\n tableId: Uint8ArraySchema,\n id: z.string(),\n op: WriteOpSchema,\n data: z.record(z.string(), z.unknown()).optional(),\n // Row state at beginTs, before this write. Populated server-side by\n // attachPrevDataToWriteSet for `update`/`delete`. Lets the invalidator\n // detect rows leaving a filtered result set (e.g. status changed from\n // matching to non-matching).\n prevData: z.record(z.string(), z.unknown()).optional(),\n // commit_ts the row had right before this write. Drives the CAS guard:\n // `UPDATE ... WHERE id=? AND commit_ts=expectedCommitTs`. Populated by\n // attachPrevDataToWriteSet or carried over from a prior find() in the\n // same txn. Undefined on inserts.\n expectedCommitTs: BigIntSchema.nullable().optional(),\n});\nexport type WriteEntry = z.infer<typeof WriteEntrySchema>;\n\nexport interface CommitLogEntry {\n id: Uint8Array;\n ts: bigint;\n tableId: Uint8Array;\n data: Uint8Array;\n\n _parsedData?: Record<string, unknown> | null\n}\n\nexport interface MutationResult<T> {\n result: T;\n writeSet: WriteEntry[];\n commitTs: CommitTs;\n}\n\nexport interface LiveResult<T> {\n ts: bigint,\n data: T;\n readSet: ReadEntry[];\n}\n\nexport const QueryCacheMetadataSchema = z.object({\n lastSnapshotTs: BigIntSchema,\n // Identity of the cached DATA this metadata describes = the data's compute\n // snapshot ts, stringified. Distinct from `lastSnapshotTs`, which the worker\n // can advance past the compute ts (a still-fresh entry gets a higher horizon\n // without recomputing). A reader trusts the cached data blob only when its\n // `version` matches this — so a data/metadata pair that diverged (torn read,\n // cross-process write race) is detected and recomputed instead of served stale.\n version: z.string(),\n readSet: z.array(ReadEntrySchema),\n});\nexport type QueryCacheMetadata = z.infer<typeof QueryCacheMetadataSchema>;\n\nexport const QueryCacheEntrySchema = z.object({\n data: z.unknown(),\n // Must equal the metadata's `version` for the data to be served (see above).\n version: z.string(),\n});\nexport type QueryCacheEntry = z.infer<typeof QueryCacheEntrySchema>;\n\nexport const CachedPgMetadataSchema = z.record(z.string(), z.record(z.string(), z.string()));\nexport type CachedPgMetadata = z.infer<typeof CachedPgMetadataSchema>;\n\nexport interface RetryConfig {\n maxAttempts: number;\n backoff: \"none\" | \"linear\" | \"exponential\";\n delayMs?: number;\n onConflict?: (attempt: number, error: OccConflictError) => void;\n}\n\nexport const NO_RETRY: RetryConfig = { maxAttempts: 1, backoff: \"none\" };\n\nexport const DEFAULT_RETRY: RetryConfig = {\n maxAttempts: 12,\n backoff: \"exponential\",\n delayMs: 15,\n};\n\nexport class OccConflictError extends Error {\n constructor(\n public readonly reason: string,\n public readonly conflictDetail?: unknown\n ) {\n super(`OCC conflict: ${reason}`);\n this.name = \"OccConflictError\";\n }\n\n static isOccConflictError(err: unknown): boolean {\n if (err instanceof OccConflictError ||\n (err && typeof err === \"object\" && (err as { name?: string }).name === \"OccConflictError\")) {\n return true;\n }\n return false;\n }\n}\n\nexport class OccAbortError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OccAbortError\";\n }\n}"],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { o as utf8Encode } from "./helper-zdJT5FUc.js";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
//#region src/db/types_db.ts
|
|
4
|
+
const BigIntSchema = z.string().transform((val) => BigInt(val));
|
|
5
|
+
const CompareOperatorSchema = z.enum([
|
|
6
|
+
"=",
|
|
7
|
+
"!=",
|
|
8
|
+
">",
|
|
9
|
+
">=",
|
|
10
|
+
"<",
|
|
11
|
+
"<=",
|
|
12
|
+
"like",
|
|
13
|
+
"ilike",
|
|
14
|
+
"contains",
|
|
15
|
+
"icontains",
|
|
16
|
+
"between",
|
|
17
|
+
"in",
|
|
18
|
+
"jsonContains",
|
|
19
|
+
"jsonContainedBy",
|
|
20
|
+
"jsonHasKey",
|
|
21
|
+
"jsonArrayContains",
|
|
22
|
+
"isNull",
|
|
23
|
+
"isNotNull"
|
|
24
|
+
]);
|
|
25
|
+
const PredicateSchema = z.lazy(() => z.union([
|
|
26
|
+
LeafPredicateSchema,
|
|
27
|
+
AndPredicateSchema,
|
|
28
|
+
OrPredicateSchema
|
|
29
|
+
]));
|
|
30
|
+
const LeafPredicateSchema = z.object({
|
|
31
|
+
"kind": z.literal("leaf"),
|
|
32
|
+
column: z.string(),
|
|
33
|
+
operator: CompareOperatorSchema,
|
|
34
|
+
value: z.unknown(),
|
|
35
|
+
value2: z.unknown().optional(),
|
|
36
|
+
raw: z.boolean().optional(),
|
|
37
|
+
path: z.string().optional(),
|
|
38
|
+
mode: z.enum(["one", "all"]).optional()
|
|
39
|
+
});
|
|
40
|
+
const AndPredicateSchema = z.object({
|
|
41
|
+
kind: z.literal("and"),
|
|
42
|
+
children: z.array(PredicateSchema)
|
|
43
|
+
});
|
|
44
|
+
const OrPredicateSchema = z.object({
|
|
45
|
+
kind: z.literal("or"),
|
|
46
|
+
children: z.array(PredicateSchema)
|
|
47
|
+
});
|
|
48
|
+
const Uint8ArraySchema = z.any().transform((val) => {
|
|
49
|
+
if (val instanceof Uint8Array) return val;
|
|
50
|
+
return bytesFromJson(val);
|
|
51
|
+
});
|
|
52
|
+
function normalizeIdToBytes(id, fromHex = false) {
|
|
53
|
+
const data = (typeof id === "number" ? String(id) : id).replace(/-/g, "");
|
|
54
|
+
if (fromHex === true) {
|
|
55
|
+
const len = data.length >>> 1;
|
|
56
|
+
const out = new Uint8Array(len);
|
|
57
|
+
for (let i = 0; i < len; i++) out[i] = parseInt(data.substring(i * 2, i * 2 + 2), 16);
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
return utf8Encode(data);
|
|
61
|
+
}
|
|
62
|
+
function normalizeToBytes(value) {
|
|
63
|
+
try {
|
|
64
|
+
return bytesFromJson(value);
|
|
65
|
+
} catch (_) {
|
|
66
|
+
return /* @__PURE__ */ new Uint8Array(0);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function bytesFromJson(value) {
|
|
70
|
+
if (value instanceof Uint8Array) return value;
|
|
71
|
+
if (Array.isArray(value)) return Uint8Array.from(value);
|
|
72
|
+
if (value && typeof value === "object" && "type" in value && value.type === "Buffer" && "data" in value) return Uint8Array.from(value.data);
|
|
73
|
+
if (typeof value === "string") return utf8Encode(value);
|
|
74
|
+
if (typeof value === "number") return utf8Encode(String(value));
|
|
75
|
+
throw new Error("Invalid buffer value");
|
|
76
|
+
}
|
|
77
|
+
const PointReadSchema = z.object({
|
|
78
|
+
kind: z.literal("point"),
|
|
79
|
+
table: z.string(),
|
|
80
|
+
id: z.string(),
|
|
81
|
+
expectedCommitTs: BigIntSchema.nullable().optional()
|
|
82
|
+
});
|
|
83
|
+
const RawPointReadSchema = z.object({
|
|
84
|
+
kind: z.literal("point"),
|
|
85
|
+
tableId: Uint8ArraySchema,
|
|
86
|
+
id: Uint8ArraySchema,
|
|
87
|
+
table: z.string(),
|
|
88
|
+
expectedCommitTs: BigIntSchema.nullable().optional()
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* Query specification for a range read (get with filters).
|
|
92
|
+
* This is the query definition, not the result.
|
|
93
|
+
*/
|
|
94
|
+
const RangeReadSchema = z.object({
|
|
95
|
+
kind: z.literal("range"),
|
|
96
|
+
table: z.string(),
|
|
97
|
+
predicate: PredicateSchema,
|
|
98
|
+
columns: z.array(z.string()),
|
|
99
|
+
orderBy: z.array(z.string()).nullable().optional(),
|
|
100
|
+
limit: z.number().nullable().optional(),
|
|
101
|
+
offset: z.number().nullable().optional()
|
|
102
|
+
});
|
|
103
|
+
const RawRangeReadSchema = z.object({
|
|
104
|
+
kind: z.literal("range"),
|
|
105
|
+
table: z.string(),
|
|
106
|
+
tableId: Uint8ArraySchema,
|
|
107
|
+
predicate: PredicateSchema,
|
|
108
|
+
columns: z.array(z.string()),
|
|
109
|
+
orderBy: z.array(z.string()).nullable().optional(),
|
|
110
|
+
limit: z.number().nullable().optional(),
|
|
111
|
+
offset: z.number().nullable().optional()
|
|
112
|
+
});
|
|
113
|
+
const ReadEntrySchema = z.union([PointReadSchema, RangeReadSchema]);
|
|
114
|
+
const RawReadEntrySchema = z.union([RawPointReadSchema, RawRangeReadSchema]);
|
|
115
|
+
const WriteOpSchema = z.enum([
|
|
116
|
+
"insert",
|
|
117
|
+
"update",
|
|
118
|
+
"delete"
|
|
119
|
+
]);
|
|
120
|
+
const WriteEntrySchema = z.object({
|
|
121
|
+
table: z.string(),
|
|
122
|
+
tableId: Uint8ArraySchema,
|
|
123
|
+
id: z.string(),
|
|
124
|
+
op: WriteOpSchema,
|
|
125
|
+
data: z.record(z.string(), z.unknown()).optional(),
|
|
126
|
+
prevData: z.record(z.string(), z.unknown()).optional(),
|
|
127
|
+
expectedCommitTs: BigIntSchema.nullable().optional()
|
|
128
|
+
});
|
|
129
|
+
const QueryCacheMetadataSchema = z.object({
|
|
130
|
+
lastSnapshotTs: BigIntSchema,
|
|
131
|
+
version: z.string(),
|
|
132
|
+
readSet: z.array(ReadEntrySchema)
|
|
133
|
+
});
|
|
134
|
+
const QueryCacheEntrySchema = z.object({
|
|
135
|
+
data: z.unknown(),
|
|
136
|
+
version: z.string(),
|
|
137
|
+
lastSnapshotTs: BigIntSchema.optional()
|
|
138
|
+
});
|
|
139
|
+
/**
|
|
140
|
+
* The snapshot ts a cached entry's `data` reflects. Prefers the dedicated
|
|
141
|
+
* {@link QueryCacheEntry.lastSnapshotTs} field; for legacy entries that predate
|
|
142
|
+
* it, falls back to parsing `version` (which historically held the stringified
|
|
143
|
+
* ts). Returns `undefined` when neither yields a usable ts — callers then simply
|
|
144
|
+
* skip advancing any high-water rather than throwing on a malformed value.
|
|
145
|
+
*/
|
|
146
|
+
function queryCacheEntrySnapshotTs(entry) {
|
|
147
|
+
if (entry.lastSnapshotTs !== void 0) return entry.lastSnapshotTs;
|
|
148
|
+
try {
|
|
149
|
+
return BigInt(entry.version);
|
|
150
|
+
} catch {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const CachedPgMetadataSchema = z.record(z.string(), z.record(z.string(), z.string()));
|
|
155
|
+
const NO_RETRY = {
|
|
156
|
+
maxAttempts: 1,
|
|
157
|
+
backoff: "none"
|
|
158
|
+
};
|
|
159
|
+
const DEFAULT_RETRY = {
|
|
160
|
+
maxAttempts: 12,
|
|
161
|
+
backoff: "exponential",
|
|
162
|
+
delayMs: 15
|
|
163
|
+
};
|
|
164
|
+
var OccConflictError = class OccConflictError extends Error {
|
|
165
|
+
reason;
|
|
166
|
+
conflictDetail;
|
|
167
|
+
constructor(reason, conflictDetail) {
|
|
168
|
+
super(`OCC conflict: ${reason}`);
|
|
169
|
+
this.reason = reason;
|
|
170
|
+
this.conflictDetail = conflictDetail;
|
|
171
|
+
this.name = "OccConflictError";
|
|
172
|
+
}
|
|
173
|
+
static isOccConflictError(err) {
|
|
174
|
+
if (err instanceof OccConflictError || err && typeof err === "object" && err.name === "OccConflictError") return true;
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
var OccAbortError = class extends Error {
|
|
179
|
+
constructor(message) {
|
|
180
|
+
super(message);
|
|
181
|
+
this.name = "OccAbortError";
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
//#endregion
|
|
185
|
+
export { normalizeIdToBytes as C, bytesFromJson as S, queryCacheEntrySnapshotTs as T, RawRangeReadSchema as _, DEFAULT_RETRY as a, WriteEntrySchema as b, OccAbortError as c, PointReadSchema as d, PredicateSchema as f, RawPointReadSchema as g, RangeReadSchema as h, CompareOperatorSchema as i, OccConflictError as l, QueryCacheMetadataSchema as m, BigIntSchema as n, LeafPredicateSchema as o, QueryCacheEntrySchema as p, CachedPgMetadataSchema as r, NO_RETRY as s, AndPredicateSchema as t, OrPredicateSchema as u, RawReadEntrySchema as v, normalizeToBytes as w, WriteOpSchema as x, ReadEntrySchema as y };
|
|
186
|
+
|
|
187
|
+
//# sourceMappingURL=types_db-CgGlOMmr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types_db-CgGlOMmr.js","names":[],"sources":["../src/db/types_db.ts"],"sourcesContent":["import z from \"zod\";\nimport { utf8Encode } from \"./bytes\";\n\n/** Monotonically increasing integer from global_commit_ts sequence in Postgres */\nexport type CommitTs = bigint;\n\nexport const BigIntSchema = z.string().transform((val) => BigInt(val));\n\nexport const CompareOperatorSchema = z.enum([\n \"=\", \"!=\", \">\", \">=\", \"<\", \"<=\",\n \"like\", \"ilike\", \"contains\", \"icontains\",\n \"between\", \"in\",\n \"jsonContains\", \"jsonContainedBy\", \"jsonHasKey\", \"jsonArrayContains\",\n \"isNull\", \"isNotNull\"\n]);\nexport type CompareOperator = z.infer<typeof CompareOperatorSchema>;\n\n// Define the type first so z.lazy() can reference it\nexport type Predicate =\n | LeafPredicate\n | { kind: \"and\"; children: Predicate[] }\n | { kind: \"or\"; children: Predicate[] };\nexport const PredicateSchema: z.ZodType<Predicate> = z.lazy(() =>\n z.union([\n LeafPredicateSchema,\n AndPredicateSchema,\n OrPredicateSchema,\n ])\n);\n\nexport const LeafPredicateSchema = z.object({\n \"kind\": z.literal(\"leaf\"),\n column: z.string(),\n operator: CompareOperatorSchema,\n value: z.unknown(),\n value2: z.unknown().optional(),\n // For JSON ops: `true` means `value` is already in dialect-prepared form\n // (a path expression for jsonHasKey, a JSON string for the contains family)\n // and the SqlBuilder should pass it through without further escaping.\n raw: z.boolean().optional(),\n // For jsonContains/jsonContainedBy/jsonArrayContains: optional sub-path\n // into the target JSON value to scope the check (jsonpath syntax, e.g.\n // `$.\"a\".\"b\"`). Already compiled to a single string.\n path: z.string().optional(),\n // For jsonHasKey multi-path mode: when set, `value` is `string[]` (each\n // entry a jsonpath) and the predicate checks for existence of any (`one`)\n // or all (`all`) of them.\n mode: z.enum([\"one\", \"all\"]).optional(),\n});\nexport type LeafPredicate = z.infer<typeof LeafPredicateSchema>;\n\nexport const AndPredicateSchema = z.object({\n kind: z.literal(\"and\"),\n children: z.array(PredicateSchema),\n});\nexport type AndPredicate = z.infer<typeof AndPredicateSchema>;\n\nexport const OrPredicateSchema = z.object({\n kind: z.literal(\"or\"),\n children: z.array(PredicateSchema),\n});\nexport type OrPredicate = z.infer<typeof OrPredicateSchema>;\n\n/** Query specification - what was queried (used for cache key generation) */\nexport type QuerySpec = ReadEntry;\n\nconst Uint8ArraySchema = z.any().transform((val) => {\n if (val instanceof Uint8Array) return val;\n return bytesFromJson(val);\n});\n\nexport function normalizeIdToBytes(id: string | number, fromHex = false): Uint8Array {\n const idStr = typeof id === \"number\" ? String(id) : id;\n const data = idStr.replace(/-/g, \"\");\n if (fromHex === true) {\n const len = data.length >>> 1;\n const out = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n out[i] = parseInt(data.substring(i * 2, i * 2 + 2), 16);\n }\n return out;\n }\n return utf8Encode(data);\n}\n\nexport function normalizeToBytes(value: Uint8Array | unknown): Uint8Array {\n try {\n return bytesFromJson(value);\n } catch (_) {\n return new Uint8Array(0);\n }\n}\n\nexport function bytesFromJson(value: Uint8Array | unknown): Uint8Array {\n if (value instanceof Uint8Array) {\n return value;\n }\n if (Array.isArray(value)) {\n return Uint8Array.from(value as number[]);\n }\n if (value && typeof value === \"object\" && \"type\" in value && (value as any).type === \"Buffer\" && \"data\" in value) {\n return Uint8Array.from((value as any).data);\n }\n if (typeof value === \"string\") {\n return utf8Encode(value);\n }\n if (typeof value === \"number\") {\n return utf8Encode(String(value));\n }\n\n throw new Error(\"Invalid buffer value\");\n}\n\n/* \n * Query specification for a point read (find by ID).\n */\nexport const PointReadSchema = z.object({\n kind: z.literal(\"point\"),\n table: z.string(),\n id: z.string(),\n // No `tableId`: it is `utf8(table)` and is derived on demand (mapReadEntryToRaw\n // → tableIdOf), so it is never stored in the persisted/wire read set.\n // tableId: Uint8ArraySchema,\n\n // commit_ts of the row at read time. `null` = row didn't exist (so a later\n // insert is a conflict). `undefined` = the read was added synthetically and\n // OCC should fall back to the commit-log scan / general validator.\n expectedCommitTs: BigIntSchema.nullable().optional(),\n});\nexport type PointRead = z.infer<typeof PointReadSchema>;\n\nexport const RawPointReadSchema = z.object({\n kind: z.literal(\"point\"),\n tableId: Uint8ArraySchema,\n id: Uint8ArraySchema,\n table: z.string(),\n expectedCommitTs: BigIntSchema.nullable().optional(),\n});\nexport type RawPointRead = z.infer<typeof RawPointReadSchema>;\n\n/**\n * Query specification for a range read (get with filters).\n * This is the query definition, not the result.\n */\nexport const RangeReadSchema = z.object({\n kind: z.literal(\"range\"),\n table: z.string(),\n // No `tableId`: derived on demand from `table` (see PointReadSchema).\n // tableId: Uint8ArraySchema,\n\n predicate: PredicateSchema,\n columns: z.array(z.string()),\n orderBy: z.array(z.string()).nullable().optional(),\n limit: z.number().nullable().optional(),\n offset: z.number().nullable().optional(),\n});\nexport type RangeRead = z.infer<typeof RangeReadSchema>;\n\nexport const RawRangeReadSchema = z.object({\n kind: z.literal(\"range\"),\n table: z.string(),\n tableId: Uint8ArraySchema,\n predicate: PredicateSchema,\n columns: z.array(z.string()),\n orderBy: z.array(z.string()).nullable().optional(),\n limit: z.number().nullable().optional(),\n offset: z.number().nullable().optional(),\n});\nexport type RawRangeRead = z.infer<typeof RawRangeReadSchema>;\n\nexport const ReadEntrySchema = z.union([PointReadSchema, RangeReadSchema]);\nexport type ReadEntry = z.infer<typeof ReadEntrySchema>;\n\nexport const RawReadEntrySchema = z.union([RawPointReadSchema, RawRangeReadSchema]);\nexport type RawReadEntry = z.infer<typeof RawReadEntrySchema>;\n\nexport const WriteOpSchema = z.enum([\"insert\", \"update\", \"delete\"]);\nexport type WriteOp = z.infer<typeof WriteOpSchema>;\n\nexport const WriteEntrySchema = z.object({\n table: z.string(),\n tableId: Uint8ArraySchema,\n id: z.string(),\n op: WriteOpSchema,\n data: z.record(z.string(), z.unknown()).optional(),\n // Row state at beginTs, before this write. Populated server-side by\n // attachPrevDataToWriteSet for `update`/`delete`. Lets the invalidator\n // detect rows leaving a filtered result set (e.g. status changed from\n // matching to non-matching).\n prevData: z.record(z.string(), z.unknown()).optional(),\n // commit_ts the row had right before this write. Drives the CAS guard:\n // `UPDATE ... WHERE id=? AND commit_ts=expectedCommitTs`. Populated by\n // attachPrevDataToWriteSet or carried over from a prior find() in the\n // same txn. Undefined on inserts.\n expectedCommitTs: BigIntSchema.nullable().optional(),\n});\nexport type WriteEntry = z.infer<typeof WriteEntrySchema>;\n\nexport interface CommitLogEntry {\n id: Uint8Array;\n ts: bigint;\n tableId: Uint8Array;\n data: Uint8Array;\n\n _parsedData?: Record<string, unknown> | null\n}\n\nexport interface MutationResult<T> {\n result: T;\n writeSet: WriteEntry[];\n commitTs: CommitTs;\n}\n\nexport interface LiveResult<T> {\n ts: bigint,\n data: T;\n readSet: ReadEntry[];\n}\n\nexport const QueryCacheMetadataSchema = z.object({\n lastSnapshotTs: BigIntSchema,\n // Identity of the cached DATA this metadata describes = the data's compute\n // snapshot ts, stringified. Distinct from `lastSnapshotTs`, which the worker\n // can advance past the compute ts (a still-fresh entry gets a higher horizon\n // without recomputing). A reader trusts the cached data blob only when its\n // `version` matches this — so a data/metadata pair that diverged (torn read,\n // cross-process write race) is detected and recomputed instead of served stale.\n version: z.string(),\n readSet: z.array(ReadEntrySchema),\n});\nexport type QueryCacheMetadata = z.infer<typeof QueryCacheMetadataSchema>;\n\nexport const QueryCacheEntrySchema = z.object({\n data: z.unknown(),\n // Must equal the metadata's `version` for the data to be served (see above).\n version: z.string(),\n // The snapshot ts the cached `data` reflects, as its OWN field — decoupled from\n // `version` on purpose. Historically `version` doubled as the stringified ts,\n // but callers should read the ts from here so a future change to how `version`\n // is minted (e.g. an opaque identifier) can't silently break ts consumers.\n // Optional for backward compatibility: entries written before this field\n // existed lack it, and readers fall back to `version` (see\n // {@link queryCacheEntrySnapshotTs}).\n lastSnapshotTs: BigIntSchema.optional(),\n});\nexport type QueryCacheEntry = z.infer<typeof QueryCacheEntrySchema>;\n\n/**\n * The snapshot ts a cached entry's `data` reflects. Prefers the dedicated\n * {@link QueryCacheEntry.lastSnapshotTs} field; for legacy entries that predate\n * it, falls back to parsing `version` (which historically held the stringified\n * ts). Returns `undefined` when neither yields a usable ts — callers then simply\n * skip advancing any high-water rather than throwing on a malformed value.\n */\nexport function queryCacheEntrySnapshotTs(entry: QueryCacheEntry): bigint | undefined {\n if (entry.lastSnapshotTs !== undefined) return entry.lastSnapshotTs;\n try {\n return BigInt(entry.version);\n } catch {\n return undefined;\n }\n}\n\nexport const CachedPgMetadataSchema = z.record(z.string(), z.record(z.string(), z.string()));\nexport type CachedPgMetadata = z.infer<typeof CachedPgMetadataSchema>;\n\nexport interface RetryConfig {\n maxAttempts: number;\n backoff: \"none\" | \"linear\" | \"exponential\";\n delayMs?: number;\n onConflict?: (attempt: number, error: OccConflictError) => void;\n}\n\nexport const NO_RETRY: RetryConfig = { maxAttempts: 1, backoff: \"none\" };\n\nexport const DEFAULT_RETRY: RetryConfig = {\n maxAttempts: 12,\n backoff: \"exponential\",\n delayMs: 15,\n};\n\nexport class OccConflictError extends Error {\n constructor(\n public readonly reason: string,\n public readonly conflictDetail?: unknown\n ) {\n super(`OCC conflict: ${reason}`);\n this.name = \"OccConflictError\";\n }\n\n static isOccConflictError(err: unknown): boolean {\n if (err instanceof OccConflictError ||\n (err && typeof err === \"object\" && (err as { name?: string }).name === \"OccConflictError\")) {\n return true;\n }\n return false;\n }\n}\n\nexport class OccAbortError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OccAbortError\";\n }\n}"],"mappings":"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"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { o as utf8Encode } from "./helper-zdJT5FUc.js";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
//#region src/db/types_db.ts
|
|
4
|
+
const BigIntSchema = z.string().transform((val) => BigInt(val));
|
|
5
|
+
const CompareOperatorSchema = z.enum([
|
|
6
|
+
"=",
|
|
7
|
+
"!=",
|
|
8
|
+
">",
|
|
9
|
+
">=",
|
|
10
|
+
"<",
|
|
11
|
+
"<=",
|
|
12
|
+
"like",
|
|
13
|
+
"ilike",
|
|
14
|
+
"contains",
|
|
15
|
+
"icontains",
|
|
16
|
+
"between",
|
|
17
|
+
"in",
|
|
18
|
+
"jsonContains",
|
|
19
|
+
"jsonContainedBy",
|
|
20
|
+
"jsonHasKey",
|
|
21
|
+
"jsonArrayContains",
|
|
22
|
+
"isNull",
|
|
23
|
+
"isNotNull"
|
|
24
|
+
]);
|
|
25
|
+
const PredicateSchema = z.lazy(() => z.union([
|
|
26
|
+
LeafPredicateSchema,
|
|
27
|
+
AndPredicateSchema,
|
|
28
|
+
OrPredicateSchema
|
|
29
|
+
]));
|
|
30
|
+
const LeafPredicateSchema = z.object({
|
|
31
|
+
"kind": z.literal("leaf"),
|
|
32
|
+
column: z.string(),
|
|
33
|
+
operator: CompareOperatorSchema,
|
|
34
|
+
value: z.unknown(),
|
|
35
|
+
value2: z.unknown().optional(),
|
|
36
|
+
raw: z.boolean().optional(),
|
|
37
|
+
path: z.string().optional(),
|
|
38
|
+
mode: z.enum(["one", "all"]).optional()
|
|
39
|
+
});
|
|
40
|
+
const AndPredicateSchema = z.object({
|
|
41
|
+
kind: z.literal("and"),
|
|
42
|
+
children: z.array(PredicateSchema)
|
|
43
|
+
});
|
|
44
|
+
const OrPredicateSchema = z.object({
|
|
45
|
+
kind: z.literal("or"),
|
|
46
|
+
children: z.array(PredicateSchema)
|
|
47
|
+
});
|
|
48
|
+
const Uint8ArraySchema = z.any().transform((val) => {
|
|
49
|
+
if (val instanceof Uint8Array) return val;
|
|
50
|
+
return bytesFromJson(val);
|
|
51
|
+
});
|
|
52
|
+
function normalizeIdToBytes(id, fromHex = false) {
|
|
53
|
+
const data = (typeof id === "number" ? String(id) : id).replace(/-/g, "");
|
|
54
|
+
if (fromHex === true) {
|
|
55
|
+
const len = data.length >>> 1;
|
|
56
|
+
const out = new Uint8Array(len);
|
|
57
|
+
for (let i = 0; i < len; i++) out[i] = parseInt(data.substring(i * 2, i * 2 + 2), 16);
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
return utf8Encode(data);
|
|
61
|
+
}
|
|
62
|
+
function normalizeToBytes(value) {
|
|
63
|
+
try {
|
|
64
|
+
return bytesFromJson(value);
|
|
65
|
+
} catch (_) {
|
|
66
|
+
return /* @__PURE__ */ new Uint8Array(0);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function bytesFromJson(value) {
|
|
70
|
+
if (value instanceof Uint8Array) return value;
|
|
71
|
+
if (Array.isArray(value)) return Uint8Array.from(value);
|
|
72
|
+
if (value && typeof value === "object" && "type" in value && value.type === "Buffer" && "data" in value) return Uint8Array.from(value.data);
|
|
73
|
+
if (typeof value === "string") return utf8Encode(value);
|
|
74
|
+
if (typeof value === "number") return utf8Encode(String(value));
|
|
75
|
+
throw new Error("Invalid buffer value");
|
|
76
|
+
}
|
|
77
|
+
const PointReadSchema = z.object({
|
|
78
|
+
kind: z.literal("point"),
|
|
79
|
+
table: z.string(),
|
|
80
|
+
id: z.string(),
|
|
81
|
+
expectedCommitTs: BigIntSchema.nullable().optional()
|
|
82
|
+
});
|
|
83
|
+
const RawPointReadSchema = z.object({
|
|
84
|
+
kind: z.literal("point"),
|
|
85
|
+
tableId: Uint8ArraySchema,
|
|
86
|
+
id: Uint8ArraySchema,
|
|
87
|
+
table: z.string(),
|
|
88
|
+
expectedCommitTs: BigIntSchema.nullable().optional()
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* Query specification for a range read (get with filters).
|
|
92
|
+
* This is the query definition, not the result.
|
|
93
|
+
*/
|
|
94
|
+
const RangeReadSchema = z.object({
|
|
95
|
+
kind: z.literal("range"),
|
|
96
|
+
table: z.string(),
|
|
97
|
+
predicate: PredicateSchema,
|
|
98
|
+
columns: z.array(z.string()),
|
|
99
|
+
orderBy: z.array(z.string()).nullable().optional(),
|
|
100
|
+
limit: z.number().nullable().optional(),
|
|
101
|
+
offset: z.number().nullable().optional()
|
|
102
|
+
});
|
|
103
|
+
const RawRangeReadSchema = z.object({
|
|
104
|
+
kind: z.literal("range"),
|
|
105
|
+
table: z.string(),
|
|
106
|
+
tableId: Uint8ArraySchema,
|
|
107
|
+
predicate: PredicateSchema,
|
|
108
|
+
columns: z.array(z.string()),
|
|
109
|
+
orderBy: z.array(z.string()).nullable().optional(),
|
|
110
|
+
limit: z.number().nullable().optional(),
|
|
111
|
+
offset: z.number().nullable().optional()
|
|
112
|
+
});
|
|
113
|
+
const ReadEntrySchema = z.union([PointReadSchema, RangeReadSchema]);
|
|
114
|
+
const RawReadEntrySchema = z.union([RawPointReadSchema, RawRangeReadSchema]);
|
|
115
|
+
const WriteOpSchema = z.enum([
|
|
116
|
+
"insert",
|
|
117
|
+
"update",
|
|
118
|
+
"delete"
|
|
119
|
+
]);
|
|
120
|
+
const WriteEntrySchema = z.object({
|
|
121
|
+
table: z.string(),
|
|
122
|
+
tableId: Uint8ArraySchema,
|
|
123
|
+
id: z.string(),
|
|
124
|
+
op: WriteOpSchema,
|
|
125
|
+
data: z.record(z.string(), z.unknown()).optional(),
|
|
126
|
+
prevData: z.record(z.string(), z.unknown()).optional(),
|
|
127
|
+
expectedCommitTs: BigIntSchema.nullable().optional()
|
|
128
|
+
});
|
|
129
|
+
const QueryCacheMetadataSchema = z.object({
|
|
130
|
+
lastSnapshotTs: BigIntSchema,
|
|
131
|
+
version: z.string(),
|
|
132
|
+
readSet: z.array(ReadEntrySchema)
|
|
133
|
+
});
|
|
134
|
+
const QueryCacheEntrySchema = z.object({
|
|
135
|
+
lastSnapshotTs: BigIntSchema,
|
|
136
|
+
data: z.unknown(),
|
|
137
|
+
version: z.string()
|
|
138
|
+
});
|
|
139
|
+
const CachedPgMetadataSchema = z.record(z.string(), z.record(z.string(), z.string()));
|
|
140
|
+
const NO_RETRY = {
|
|
141
|
+
maxAttempts: 1,
|
|
142
|
+
backoff: "none"
|
|
143
|
+
};
|
|
144
|
+
const DEFAULT_RETRY = {
|
|
145
|
+
maxAttempts: 12,
|
|
146
|
+
backoff: "exponential",
|
|
147
|
+
delayMs: 15
|
|
148
|
+
};
|
|
149
|
+
var OccConflictError = class OccConflictError extends Error {
|
|
150
|
+
reason;
|
|
151
|
+
conflictDetail;
|
|
152
|
+
constructor(reason, conflictDetail) {
|
|
153
|
+
super(`OCC conflict: ${reason}`);
|
|
154
|
+
this.reason = reason;
|
|
155
|
+
this.conflictDetail = conflictDetail;
|
|
156
|
+
this.name = "OccConflictError";
|
|
157
|
+
}
|
|
158
|
+
static isOccConflictError(err) {
|
|
159
|
+
if (err instanceof OccConflictError || err && typeof err === "object" && err.name === "OccConflictError") return true;
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
var OccAbortError = class extends Error {
|
|
164
|
+
constructor(message) {
|
|
165
|
+
super(message);
|
|
166
|
+
this.name = "OccAbortError";
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
//#endregion
|
|
170
|
+
export { normalizeIdToBytes as C, bytesFromJson as S, RawRangeReadSchema as _, DEFAULT_RETRY as a, WriteEntrySchema as b, OccAbortError as c, PointReadSchema as d, PredicateSchema as f, RawPointReadSchema as g, RangeReadSchema as h, CompareOperatorSchema as i, OccConflictError as l, QueryCacheMetadataSchema as m, BigIntSchema as n, LeafPredicateSchema as o, QueryCacheEntrySchema as p, CachedPgMetadataSchema as r, NO_RETRY as s, AndPredicateSchema as t, OrPredicateSchema as u, RawReadEntrySchema as v, normalizeToBytes as w, WriteOpSchema as x, ReadEntrySchema as y };
|
|
171
|
+
|
|
172
|
+
//# sourceMappingURL=types_db-OUou3o2Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types_db-OUou3o2Z.js","names":[],"sources":["../src/db/types_db.ts"],"sourcesContent":["import z from \"zod\";\nimport { utf8Encode } from \"./bytes\";\n\n/** Monotonically increasing integer from global_commit_ts sequence in Postgres */\nexport type CommitTs = bigint;\n\nexport const BigIntSchema = z.string().transform((val) => BigInt(val));\n\nexport const CompareOperatorSchema = z.enum([\n \"=\", \"!=\", \">\", \">=\", \"<\", \"<=\",\n \"like\", \"ilike\", \"contains\", \"icontains\",\n \"between\", \"in\",\n \"jsonContains\", \"jsonContainedBy\", \"jsonHasKey\", \"jsonArrayContains\",\n \"isNull\", \"isNotNull\"\n]);\nexport type CompareOperator = z.infer<typeof CompareOperatorSchema>;\n\n// Define the type first so z.lazy() can reference it\nexport type Predicate =\n | LeafPredicate\n | { kind: \"and\"; children: Predicate[] }\n | { kind: \"or\"; children: Predicate[] };\nexport const PredicateSchema: z.ZodType<Predicate> = z.lazy(() =>\n z.union([\n LeafPredicateSchema,\n AndPredicateSchema,\n OrPredicateSchema,\n ])\n);\n\nexport const LeafPredicateSchema = z.object({\n \"kind\": z.literal(\"leaf\"),\n column: z.string(),\n operator: CompareOperatorSchema,\n value: z.unknown(),\n value2: z.unknown().optional(),\n // For JSON ops: `true` means `value` is already in dialect-prepared form\n // (a path expression for jsonHasKey, a JSON string for the contains family)\n // and the SqlBuilder should pass it through without further escaping.\n raw: z.boolean().optional(),\n // For jsonContains/jsonContainedBy/jsonArrayContains: optional sub-path\n // into the target JSON value to scope the check (jsonpath syntax, e.g.\n // `$.\"a\".\"b\"`). Already compiled to a single string.\n path: z.string().optional(),\n // For jsonHasKey multi-path mode: when set, `value` is `string[]` (each\n // entry a jsonpath) and the predicate checks for existence of any (`one`)\n // or all (`all`) of them.\n mode: z.enum([\"one\", \"all\"]).optional(),\n});\nexport type LeafPredicate = z.infer<typeof LeafPredicateSchema>;\n\nexport const AndPredicateSchema = z.object({\n kind: z.literal(\"and\"),\n children: z.array(PredicateSchema),\n});\nexport type AndPredicate = z.infer<typeof AndPredicateSchema>;\n\nexport const OrPredicateSchema = z.object({\n kind: z.literal(\"or\"),\n children: z.array(PredicateSchema),\n});\nexport type OrPredicate = z.infer<typeof OrPredicateSchema>;\n\n/** Query specification - what was queried (used for cache key generation) */\nexport type QuerySpec = ReadEntry;\n\nconst Uint8ArraySchema = z.any().transform((val) => {\n if (val instanceof Uint8Array) return val;\n return bytesFromJson(val);\n});\n\nexport function normalizeIdToBytes(id: string | number, fromHex = false): Uint8Array {\n const idStr = typeof id === \"number\" ? String(id) : id;\n const data = idStr.replace(/-/g, \"\");\n if (fromHex === true) {\n const len = data.length >>> 1;\n const out = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n out[i] = parseInt(data.substring(i * 2, i * 2 + 2), 16);\n }\n return out;\n }\n return utf8Encode(data);\n}\n\nexport function normalizeToBytes(value: Uint8Array | unknown): Uint8Array {\n try {\n return bytesFromJson(value);\n } catch (_) {\n return new Uint8Array(0);\n }\n}\n\nexport function bytesFromJson(value: Uint8Array | unknown): Uint8Array {\n if (value instanceof Uint8Array) {\n return value;\n }\n if (Array.isArray(value)) {\n return Uint8Array.from(value as number[]);\n }\n if (value && typeof value === \"object\" && \"type\" in value && (value as any).type === \"Buffer\" && \"data\" in value) {\n return Uint8Array.from((value as any).data);\n }\n if (typeof value === \"string\") {\n return utf8Encode(value);\n }\n if (typeof value === \"number\") {\n return utf8Encode(String(value));\n }\n\n throw new Error(\"Invalid buffer value\");\n}\n\n/* \n * Query specification for a point read (find by ID).\n */\nexport const PointReadSchema = z.object({\n kind: z.literal(\"point\"),\n table: z.string(),\n id: z.string(),\n // No `tableId`: it is `utf8(table)` and is derived on demand (mapReadEntryToRaw\n // → tableIdOf), so it is never stored in the persisted/wire read set.\n // tableId: Uint8ArraySchema,\n\n // commit_ts of the row at read time. `null` = row didn't exist (so a later\n // insert is a conflict). `undefined` = the read was added synthetically and\n // OCC should fall back to the commit-log scan / general validator.\n expectedCommitTs: BigIntSchema.nullable().optional(),\n});\nexport type PointRead = z.infer<typeof PointReadSchema>;\n\nexport const RawPointReadSchema = z.object({\n kind: z.literal(\"point\"),\n tableId: Uint8ArraySchema,\n id: Uint8ArraySchema,\n table: z.string(),\n expectedCommitTs: BigIntSchema.nullable().optional(),\n});\nexport type RawPointRead = z.infer<typeof RawPointReadSchema>;\n\n/**\n * Query specification for a range read (get with filters).\n * This is the query definition, not the result.\n */\nexport const RangeReadSchema = z.object({\n kind: z.literal(\"range\"),\n table: z.string(),\n // No `tableId`: derived on demand from `table` (see PointReadSchema).\n // tableId: Uint8ArraySchema,\n\n predicate: PredicateSchema,\n columns: z.array(z.string()),\n orderBy: z.array(z.string()).nullable().optional(),\n limit: z.number().nullable().optional(),\n offset: z.number().nullable().optional(),\n});\nexport type RangeRead = z.infer<typeof RangeReadSchema>;\n\nexport const RawRangeReadSchema = z.object({\n kind: z.literal(\"range\"),\n table: z.string(),\n tableId: Uint8ArraySchema,\n predicate: PredicateSchema,\n columns: z.array(z.string()),\n orderBy: z.array(z.string()).nullable().optional(),\n limit: z.number().nullable().optional(),\n offset: z.number().nullable().optional(),\n});\nexport type RawRangeRead = z.infer<typeof RawRangeReadSchema>;\n\nexport const ReadEntrySchema = z.union([PointReadSchema, RangeReadSchema]);\nexport type ReadEntry = z.infer<typeof ReadEntrySchema>;\n\nexport const RawReadEntrySchema = z.union([RawPointReadSchema, RawRangeReadSchema]);\nexport type RawReadEntry = z.infer<typeof RawReadEntrySchema>;\n\nexport const WriteOpSchema = z.enum([\"insert\", \"update\", \"delete\"]);\nexport type WriteOp = z.infer<typeof WriteOpSchema>;\n\nexport const WriteEntrySchema = z.object({\n table: z.string(),\n tableId: Uint8ArraySchema,\n id: z.string(),\n op: WriteOpSchema,\n data: z.record(z.string(), z.unknown()).optional(),\n // Row state at beginTs, before this write. Populated server-side by\n // attachPrevDataToWriteSet for `update`/`delete`. Lets the invalidator\n // detect rows leaving a filtered result set (e.g. status changed from\n // matching to non-matching).\n prevData: z.record(z.string(), z.unknown()).optional(),\n // commit_ts the row had right before this write. Drives the CAS guard:\n // `UPDATE ... WHERE id=? AND commit_ts=expectedCommitTs`. Populated by\n // attachPrevDataToWriteSet or carried over from a prior find() in the\n // same txn. Undefined on inserts.\n expectedCommitTs: BigIntSchema.nullable().optional(),\n});\nexport type WriteEntry = z.infer<typeof WriteEntrySchema>;\n\nexport interface CommitLogEntry {\n id: Uint8Array;\n ts: bigint;\n tableId: Uint8Array;\n data: Uint8Array;\n\n _parsedData?: Record<string, unknown> | null\n}\n\nexport interface MutationResult<T> {\n result: T;\n writeSet: WriteEntry[];\n commitTs: CommitTs;\n}\n\nexport interface LiveResult<T> {\n ts: bigint,\n data: T;\n readSet: ReadEntry[];\n}\n\nexport const QueryCacheMetadataSchema = z.object({\n lastSnapshotTs: BigIntSchema,\n // Identity of the cached DATA this metadata describes = the data's compute\n // snapshot ts, stringified. Distinct from `lastSnapshotTs`, which the worker\n // can advance past the compute ts (a still-fresh entry gets a higher horizon\n // without recomputing). A reader trusts the cached data blob only when its\n // `version` matches this — so a data/metadata pair that diverged (torn read,\n // cross-process write race) is detected and recomputed instead of served stale.\n version: z.string(),\n readSet: z.array(ReadEntrySchema),\n});\nexport type QueryCacheMetadata = z.infer<typeof QueryCacheMetadataSchema>;\n\nexport const QueryCacheEntrySchema = z.object({\n lastSnapshotTs: BigIntSchema,\n data: z.unknown(),\n // Must equal the metadata's `version` for the data to be served (see above).\n version: z.string(),\n});\nexport type QueryCacheEntry = z.infer<typeof QueryCacheEntrySchema>;\n\nexport const CachedPgMetadataSchema = z.record(z.string(), z.record(z.string(), z.string()));\nexport type CachedPgMetadata = z.infer<typeof CachedPgMetadataSchema>;\n\nexport interface RetryConfig {\n maxAttempts: number;\n backoff: \"none\" | \"linear\" | \"exponential\";\n delayMs?: number;\n onConflict?: (attempt: number, error: OccConflictError) => void;\n}\n\nexport const NO_RETRY: RetryConfig = { maxAttempts: 1, backoff: \"none\" };\n\nexport const DEFAULT_RETRY: RetryConfig = {\n maxAttempts: 12,\n backoff: \"exponential\",\n delayMs: 15,\n};\n\nexport class OccConflictError extends Error {\n constructor(\n public readonly reason: string,\n public readonly conflictDetail?: unknown\n ) {\n super(`OCC conflict: ${reason}`);\n this.name = \"OccConflictError\";\n }\n\n static isOccConflictError(err: unknown): boolean {\n if (err instanceof OccConflictError ||\n (err && typeof err === \"object\" && (err as { name?: string }).name === \"OccConflictError\")) {\n return true;\n }\n return false;\n }\n}\n\nexport class OccAbortError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OccAbortError\";\n }\n}"],"mappings":"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"}
|