@supalive/core 1.12.0 → 1.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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-C_i3U4cd.d.ts +2302 -0
- package/dist/index-C_i3U4cd.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-BPWGBeum.js +623 -0
- package/dist/mysql-BPWGBeum.js.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-Di6iuKWT.d.ts +114 -0
- package/dist/mysql-Di6iuKWT.d.ts.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-CkhK4DqZ.d.ts +118 -0
- package/dist/postgres-CkhK4DqZ.d.ts.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-ZKEo6Mjg.js +868 -0
- package/dist/postgres-ZKEo6Mjg.js.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 +16 -6
- 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-CzwVHQVi.js +826 -0
- package/dist/sub-worker-dispatch-CzwVHQVi.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-MneZYjXl.js +823 -0
- package/dist/sub-worker-dispatch-MneZYjXl.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-CG453PHb.d.ts +523 -0
- package/dist/types_server-CG453PHb.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,134 @@
|
|
|
1
|
+
import { a as unwrapZodType, n as tableNameToId, r as commitTsCodec } from "./table-id-BJdmctEQ.js";
|
|
2
|
+
import { z as z$1 } from "zod";
|
|
3
|
+
//#region src/db/schema.ts
|
|
4
|
+
function defineComputedField(config) {
|
|
5
|
+
return config;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Read the effective max length declared on a Zod string (via `.max(n)` /
|
|
9
|
+
* `.length(n)`), unwrapping optional/nullable/default wrappers. Returns
|
|
10
|
+
* undefined for non-strings or unconstrained strings. Mirrors the reader in
|
|
11
|
+
* schema-sql.ts (kept local to avoid a schema <-> schema-sql import cycle) and
|
|
12
|
+
* is used to carry a primary-key id's length into the injected id column so the
|
|
13
|
+
* SQL generator can emit `VARCHAR(n)` instead of an (invalid-as-a-MySQL-PK)
|
|
14
|
+
* `TEXT`.
|
|
15
|
+
*/
|
|
16
|
+
function readZodStringMax(field) {
|
|
17
|
+
const unwrapped = unwrapZodType(field);
|
|
18
|
+
if (!(unwrapped instanceof z$1.ZodString)) return void 0;
|
|
19
|
+
const checks = unwrapped.def?.checks ?? [];
|
|
20
|
+
let maxLength;
|
|
21
|
+
for (const check of checks) {
|
|
22
|
+
const c = check?._zod?.def ?? check;
|
|
23
|
+
if (c?.check === "length_equals" || c?.check === "size_equals") {
|
|
24
|
+
const len = c.length ?? c.size;
|
|
25
|
+
if (typeof len === "number") maxLength = maxLength === void 0 ? len : Math.min(maxLength, len);
|
|
26
|
+
}
|
|
27
|
+
if (c?.check === "max_length" || c?.check === "max_size") {
|
|
28
|
+
const len = c.maximum ?? c.max;
|
|
29
|
+
if (typeof len === "number") maxLength = maxLength === void 0 ? len : Math.min(maxLength, len);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return maxLength;
|
|
33
|
+
}
|
|
34
|
+
const schemaRegistry = /* @__PURE__ */ new Map();
|
|
35
|
+
let shouldTrackSchema = false;
|
|
36
|
+
function trackSchema() {
|
|
37
|
+
shouldTrackSchema = true;
|
|
38
|
+
}
|
|
39
|
+
function getAutoIdCodec(idMeta, userCodec) {
|
|
40
|
+
if (userCodec) return void 0;
|
|
41
|
+
const rawType = idMeta.pgType ?? idMeta.mysqlType;
|
|
42
|
+
if (!rawType) return void 0;
|
|
43
|
+
const upper = rawType.toUpperCase().replace(/\(.*\)/, "").trim();
|
|
44
|
+
if ([
|
|
45
|
+
"BIGINT",
|
|
46
|
+
"INT8",
|
|
47
|
+
"SERIAL8"
|
|
48
|
+
].includes(upper)) return {
|
|
49
|
+
encode: (v) => BigInt(v),
|
|
50
|
+
decode: (v) => String(v)
|
|
51
|
+
};
|
|
52
|
+
if ([
|
|
53
|
+
"INTEGER",
|
|
54
|
+
"INT",
|
|
55
|
+
"SERIAL",
|
|
56
|
+
"INT4",
|
|
57
|
+
"SMALLINT",
|
|
58
|
+
"INT2"
|
|
59
|
+
].includes(upper)) return {
|
|
60
|
+
encode: (v) => Number(v),
|
|
61
|
+
decode: (v) => String(v)
|
|
62
|
+
};
|
|
63
|
+
if ([
|
|
64
|
+
"DECIMAL",
|
|
65
|
+
"NUMERIC",
|
|
66
|
+
"FLOAT",
|
|
67
|
+
"REAL",
|
|
68
|
+
"DOUBLE",
|
|
69
|
+
"FLOAT8",
|
|
70
|
+
"FLOAT4"
|
|
71
|
+
].includes(upper)) return {
|
|
72
|
+
encode: (v) => Number(v),
|
|
73
|
+
decode: (v) => String(v)
|
|
74
|
+
};
|
|
75
|
+
if (upper === "BOOLEAN" || upper === "BOOL" || upper.startsWith("TINYINT") && rawType.toUpperCase().includes("(1)")) return {
|
|
76
|
+
encode: (v) => v === "true" || v === "1",
|
|
77
|
+
decode: (v) => String(v)
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function defineSchema(config) {
|
|
81
|
+
const columns = {};
|
|
82
|
+
if (config.columns) Object.assign(columns, {
|
|
83
|
+
"id": "id",
|
|
84
|
+
"commitTs": "commit_ts",
|
|
85
|
+
...config.columns
|
|
86
|
+
});
|
|
87
|
+
else {
|
|
88
|
+
for (const key of Object.keys(config.schema)) columns[key] = key;
|
|
89
|
+
columns["id"] = "id";
|
|
90
|
+
columns["commitTs"] = "commit_ts";
|
|
91
|
+
}
|
|
92
|
+
const idMeta = {};
|
|
93
|
+
if ("id" in config.schema) {
|
|
94
|
+
const userMeta = config.schema.id?.meta?.();
|
|
95
|
+
if (userMeta) for (const k of Object.keys(userMeta)) {
|
|
96
|
+
if (k === "primaryKey") continue;
|
|
97
|
+
idMeta[k] = userMeta[k];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const userIdMax = "id" in config.schema ? readZodStringMax(config.schema.id) : void 0;
|
|
101
|
+
const idColumn = userIdMax !== void 0 ? z$1.string().max(userIdMax) : z$1.string();
|
|
102
|
+
const augmentedShape = {
|
|
103
|
+
...config.schema,
|
|
104
|
+
id: idColumn.meta({
|
|
105
|
+
primaryKey: true,
|
|
106
|
+
...idMeta
|
|
107
|
+
}),
|
|
108
|
+
commitTs: z$1.coerce.bigint()
|
|
109
|
+
};
|
|
110
|
+
const userCodecs = config.options?.codecs;
|
|
111
|
+
const autoIdCodec = getAutoIdCodec(idMeta, userCodecs?.id);
|
|
112
|
+
const mergedCodecs = {
|
|
113
|
+
...autoIdCodec ? { id: autoIdCodec } : {},
|
|
114
|
+
...userCodecs,
|
|
115
|
+
commitTs: commitTsCodec
|
|
116
|
+
};
|
|
117
|
+
const result = {
|
|
118
|
+
tableId: tableNameToId(config.name),
|
|
119
|
+
table: config.name,
|
|
120
|
+
schema: z$1.object(augmentedShape),
|
|
121
|
+
columnsOptions: {
|
|
122
|
+
...config.options,
|
|
123
|
+
codecs: mergedCodecs
|
|
124
|
+
},
|
|
125
|
+
columns,
|
|
126
|
+
indexes: config.indexes ?? []
|
|
127
|
+
};
|
|
128
|
+
if (shouldTrackSchema) schemaRegistry.set(config.name, result);
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
//#endregion
|
|
132
|
+
export { trackSchema as a, shouldTrackSchema as i, defineSchema as n, schemaRegistry as r, defineComputedField as t };
|
|
133
|
+
|
|
134
|
+
//# sourceMappingURL=schema-DfowI0ip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-DfowI0ip.js","names":["z"],"sources":["../src/db/schema.ts"],"sourcesContent":["import { z, ZodRawShape } from \"zod\";\nimport { commitTsCodec, unwrapZodType } from \"./codec\";\nimport { LiveQueryHandle } from \"../client\";\nimport { tableNameToId } from \"./table-id\";\n\nexport interface ColumnCodec<TData = unknown, TDriver = unknown> {\n encode?: (value: TData) => TDriver;\n decode?: (value: TDriver) => TData;\n}\n\n// Constrain a codec's decoded type to match the schema field's inferred type.\n// Without this, `decode` could return any value (e.g. a string outside an enum)\n// and silently override the schema's declared type at the type level.\ntype SchemaCodecField<TSchema extends ZodRawShape, K extends PropertyKey> =\n K extends keyof TSchema\n ? TSchema[K] extends z.ZodTypeAny ? z.infer<TSchema[K]> : unknown\n : K extends keyof BaseSchema\n ? BaseSchema[K] extends z.ZodTypeAny ? z.infer<BaseSchema[K]> : unknown\n : unknown;\n\nexport type SchemaCodecs<TSchema extends ZodRawShape> = Partial<{\n [K in keyof (TSchema & BaseSchema)]: ColumnCodec<SchemaCodecField<TSchema, K>, any>;\n}>;\n\nexport interface SchemaColumnsOptions<TSchema extends ZodRawShape = ZodRawShape> {\n codecs?: SchemaCodecs<TSchema>;\n}\n\nexport interface SchemaColumnMapping {\n [key: string]: string;\n}\n\nexport interface DeclarativeIndex {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: \"btree\" | \"hash\" | \"gin\" | \"gist\" | \"spgist\" | \"brin\";\n where?: string;\n using?: string;\n options?: string;\n tablespace?: string;\n}\n\nexport type IndexDefinition = string | DeclarativeIndex;\n\nexport interface DefineSchemaConfig<TSchema extends ZodRawShape> {\n name: string;\n schema: TSchema;\n options?: SchemaColumnsOptions<TSchema>;\n columns?: SchemaColumnMapping;\n indexes?: IndexDefinition[];\n}\n\n// Tuple-wrap the `undefined` checks so they don't fall through to the\n// object-shape conditionals when consumers compile under `strict: false`\n// (without `strictNullChecks`, `undefined` is assignable to object types and\n// would otherwise match `{ decode: ... }` / `ColumnCodec<...>` with all\n// `infer`s collapsing to `unknown`).\ntype CodecDataType<TCodec, TFallback> =\n [TCodec] extends [undefined] ? TFallback\n : TCodec extends { decode: (...args: any[]) => infer TDecoded } ? TDecoded\n : TCodec extends ColumnCodec<infer TData, unknown> ? TData\n : TFallback;\n\ntype ZodOutput<TZod> =\n [TZod] extends [undefined] ? unknown\n : TZod extends z.ZodTypeAny ? z.infer<TZod>\n : unknown;\nexport type ComputedDataType<TCodec, TZod> = CodecDataType<TCodec, ZodOutput<TZod>>;\nexport type ComputedCodec<TData, TDriver> = ColumnCodec<TData, TDriver>;\nexport type OverrideField<TObj, TKey extends PropertyKey, TValue> = Omit<TObj, TKey> & { [K in TKey]: TValue };\nexport interface ComputedFieldConfig<\n TField extends string,\n TDecoded = unknown,\n TDriver = unknown,\n TZodType extends z.ZodTypeAny | undefined = undefined,\n> {\n field: TField;\n sql: string;\n alias?: string;\n type?: TZodType;\n codec?: {\n decode: (value: TDriver) => TDecoded;\n encode?: (value: TDecoded) => TDriver;\n };\n}\n\nexport type ComputedField = {\n field: string;\n sql: string;\n alias: string;\n codec?: ColumnCodec<any, any>;\n};\n\nexport function defineComputedField<\n TField extends string,\n TDecoded = unknown,\n TDriver = unknown,\n TZodType extends z.ZodTypeAny | undefined = undefined,\n>(\n config: ComputedFieldConfig<TField, TDecoded, TDriver, TZodType>\n): ComputedFieldConfig<TField, TDecoded, TDriver, TZodType> {\n return config;\n}\n\nexport type Prettify<T> = { [K in keyof T]: T[K] } & {};\n\ntype ApplySchemaCodecs<TBase, TCodecs> = {\n [K in keyof TBase]: K extends keyof TCodecs ? CodecDataType<TCodecs[K], TBase[K]> : TBase[K];\n};\n\n// Only apply codecs when `options.codecs` is explicitly provided. Without this\n// guard, the default constraint (`SchemaColumnsOptions<TSchema>`) makes\n// `TOptions[\"codecs\"]` infer as `Partial<{ [K]: ColumnCodec<any, any> }>`,\n// which collapses every field to `any` inside `ApplySchemaCodecs`.\ntype ResolveSchemaType<\n TSchema extends ZodRawShape,\n TOptions extends SchemaColumnsOptions<TSchema>\n> = TOptions extends { codecs: infer TCodecs }\n ? Prettify<ApplySchemaCodecs<z.infer<z.ZodObject<TSchema & BaseSchema>>, TCodecs>>\n : Prettify<z.infer<z.ZodObject<TSchema & BaseSchema>>>;\n\n// Helper to detect if a Zod type is optional or nullable\ntype IsOptionalField<T> =\n T extends z.ZodOptional<any> ? true :\n T extends z.ZodNullable<any> ? true :\n T extends z.ZodDefault<any> ? true :\n false;\n\n// Split schema keys into required vs optional\ntype OptionalKeys<TZod extends ZodRawShape> = {\n [K in keyof TZod]: IsOptionalField<TZod[K]> extends true ? K : never\n}[keyof TZod];\n\ntype RequiredKeys<TZod extends ZodRawShape> = {\n [K in keyof TZod]: IsOptionalField<TZod[K]> extends true ? never : K\n}[keyof TZod];\n\n// Add a base shape type that all schemas will include\ntype BaseSchema = {\n id: z.ZodString;\n commitTs: z.ZodCoercedBigInt;\n};\n\n/**\n * Read the effective max length declared on a Zod string (via `.max(n)` /\n * `.length(n)`), unwrapping optional/nullable/default wrappers. Returns\n * undefined for non-strings or unconstrained strings. Mirrors the reader in\n * schema-sql.ts (kept local to avoid a schema <-> schema-sql import cycle) and\n * is used to carry a primary-key id's length into the injected id column so the\n * SQL generator can emit `VARCHAR(n)` instead of an (invalid-as-a-MySQL-PK)\n * `TEXT`.\n */\nfunction readZodStringMax(field: unknown): number | undefined {\n const unwrapped = unwrapZodType(field);\n if (!(unwrapped instanceof z.ZodString)) return undefined;\n\n const checks = unwrapped.def?.checks ?? [];\n let maxLength: number | undefined;\n for (const check of checks) {\n const c = check?._zod?.def ?? check;\n if (c?.check === \"length_equals\" || c?.check === \"size_equals\") {\n const len = (c as any).length ?? (c as any).size;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n if (c?.check === \"max_length\" || c?.check === \"max_size\") {\n const len = (c as any).maximum ?? (c as any).max;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n }\n return maxLength;\n}\n\nexport const schemaRegistry = new Map<string, SchemaDefinition<string, any, any>>();\nexport let shouldTrackSchema = false;\n\nexport function trackSchema(): void {\n shouldTrackSchema = true;\n}\n\nfunction getAutoIdCodec(idMeta: Record<string, unknown>, userCodec: unknown): ColumnCodec<any, any> | undefined {\n if (userCodec) return undefined;\n const rawType = (idMeta.pgType as string | undefined) ?? (idMeta.mysqlType as string | undefined);\n if (!rawType) return undefined;\n\n const upper = rawType.toUpperCase().replace(/\\(.*\\)/, \"\").trim();\n if ([\"BIGINT\", \"INT8\", \"SERIAL8\"].includes(upper)) {\n return {\n encode: (v: string) => BigInt(v),\n decode: (v: unknown) => String(v),\n };\n }\n if ([\"INTEGER\", \"INT\", \"SERIAL\", \"INT4\", \"SMALLINT\", \"INT2\"].includes(upper)) {\n return {\n encode: (v: string) => Number(v),\n decode: (v: unknown) => String(v),\n };\n }\n if ([\"DECIMAL\", \"NUMERIC\", \"FLOAT\", \"REAL\", \"DOUBLE\", \"FLOAT8\", \"FLOAT4\"].includes(upper)) {\n return {\n encode: (v: string) => Number(v),\n decode: (v: unknown) => String(v),\n };\n }\n if (upper === \"BOOLEAN\" || upper === \"BOOL\" || (upper.startsWith(\"TINYINT\") && rawType.toUpperCase().includes(\"(1)\"))) {\n return {\n encode: (v: string) => v === \"true\" || v === \"1\",\n decode: (v: unknown) => String(v),\n };\n }\n return undefined;\n}\n\nexport function defineSchema<\n TSchema extends ZodRawShape,\n TName extends string,\n TOptions extends SchemaColumnsOptions<TSchema> = SchemaColumnsOptions<TSchema>\n>(\n config: DefineSchemaConfig<TSchema> & { name: TName; options?: TOptions }\n): SchemaDefinition<TName, Prettify<TSchema & BaseSchema>, ResolveSchemaType<TSchema, TOptions>> {\n const columns: Record<string, string> = {};\n\n if (config.columns) {\n Object.assign(columns, { 'id': 'id', 'commitTs': 'commit_ts', ...config.columns });\n } else {\n // Default: use field name as column name\n for (const key of Object.keys(config.schema)) {\n columns[key] = key;\n }\n columns['id'] = 'id';\n columns['commitTs'] = 'commit_ts';\n }\n\n // Preserve user's id meta (pgType, mysqlType, etc.) so the SQL generator\n // can emit the correct raw type. primaryKey is always forced true.\n const idMeta: Record<string, unknown> = {};\n if (\"id\" in config.schema) {\n const userMeta = (config.schema.id as any)?.meta?.();\n if (userMeta) {\n for (const k of Object.keys(userMeta)) {\n if (k === \"primaryKey\") continue; // always forced true\n idMeta[k] = userMeta[k];\n }\n }\n }\n\n // Preserve the user's id length constraint (`zodPrimaryIdColumn().max(32)`)\n // so the SQL generator emits `VARCHAR(n)`. `.max()` is a Zod *check*, not\n // metadata, so it isn't captured by `idMeta` above and must be re-applied to\n // the injected id — otherwise the PK renders as `TEXT`, which MySQL cannot\n // use as a primary key.\n const userIdMax = \"id\" in config.schema ? readZodStringMax(config.schema.id) : undefined;\n const idColumn = userIdMax !== undefined ? z.string().max(userIdMax) : z.string();\n\n // Merge id/commitTs into the Zod schema, user-defined fields win for everything else,\n // but id/commitTs are always forced to their correct types\n const augmentedShape = {\n ...config.schema,\n // always string, even if user defined it differently\n id: idColumn.meta({ primaryKey: true, ...idMeta }),\n // always bigint, mapped to commit_ts column\n commitTs: z.coerce.bigint(),\n };\n\n const userCodecs = config.options?.codecs;\n const autoIdCodec = getAutoIdCodec(idMeta, userCodecs?.id);\n const mergedCodecs = {\n ...(autoIdCodec ? { id: autoIdCodec } : {}),\n ...userCodecs,\n commitTs: commitTsCodec,\n };\n\n const result = {\n tableId: tableNameToId(config.name),\n table: config.name,\n schema: z.object(augmentedShape),\n columnsOptions: {\n ...config.options,\n codecs: mergedCodecs,\n },\n columns,\n indexes: config.indexes ?? [],\n } as SchemaDefinition<TName, TSchema & BaseSchema, ResolveSchemaType<TSchema, TOptions>>;\n\n if (shouldTrackSchema) {\n schemaRegistry.set(config.name, result);\n }\n\n return result\n}\n\n// tableNameToId now lives in ./table-id (leaf module, also home to the memoized\n// tableIdOf). Re-exported here so existing `from \"./schema\"` imports still resolve.\nexport { tableNameToId };\n\n// Stored codec map is intentionally loose: the strict per-field constraint is\n// enforced on the input (`DefineSchemaConfig.options`), but storing the strict\n// type here would break variance when assigning a specific schema to a generic\n// `SchemaDefinition<string, ZodRawShape>` constraint (ColumnCodec.encode is\n// contravariant in its data type).\nexport interface StoredSchemaColumnsOptions {\n codecs?: Record<string, ColumnCodec<any, any>>;\n}\n\nexport interface SchemaDefinition<\n TTable extends string,\n TZod extends ZodRawShape,\n TData = z.infer<z.ZodObject<TZod>>\n> {\n tableId: Uint8Array;\n table: TTable;\n schema: z.ZodObject<TZod>;\n columnsOptions: StoredSchemaColumnsOptions;\n columns: Record<string, string>;\n indexes: IndexDefinition[];\n _dataType?: TData;\n}\n\nexport type InferSchema<T extends SchemaDefinition<string, ZodRawShape, any>> =\n T extends SchemaDefinition<string, ZodRawShape, infer TData> ? TData : never;\n\nexport type InsertData<T extends SchemaDefinition<string, ZodRawShape, any>> =\n T extends SchemaDefinition<string, infer TZod, infer TData>\n ? {\n [K in RequiredKeys<TZod> as K extends \"id\" | \"commitTs\" ? never : K]:\n Extract<K, string> extends keyof TData ? TData[Extract<K, string>] : never\n } & {\n [K in OptionalKeys<TZod> as K extends \"id\" | \"commitTs\" ? never : K]?:\n Extract<K, string> extends keyof TData ? TData[Extract<K, string>] : never\n }\n : never;\n\nexport interface Model {\n table: string;\n tableId: Uint8Array,\n columns: Record<string, string>;\n reverseColumns: Record<string, string>;\n types: Record<string, string>;\n codecs: Record<string, ColumnCodec<any, any>>;\n}\n\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type ReturnLiveQuery<\n TLiveQueryFn extends (...args: any[]) => MaybePromise<LiveQueryHandle<any>>\n> =\n Awaited<ReturnType<TLiveQueryFn>> extends LiveQueryHandle<infer T>\n ? T\n : never;\n\nexport type ReturnQuery<TQueryFn extends (...args: any[]) => any> =\n Awaited<ReturnType<TQueryFn>>;\n\nexport type QueryArgs<TQueryFn extends (...args: any[]) => any> =\n Parameters<TQueryFn>[0];\n\nexport type MutationArgs<TMutationFn extends (...args: any[]) => any> =\n Parameters<TMutationFn>[0];\n\nexport type ActionArgs<TActionFn extends (...args: any[]) => any> =\n Parameters<TActionFn>[0];"],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { a as unwrapZodType, n as tableNameToId, r as commitTsCodec } from "./table-id-x9y1eHUr.js";
|
|
2
|
+
import { z as z$1 } from "zod";
|
|
3
|
+
//#region src/db/schema.ts
|
|
4
|
+
function defineComputedField(config) {
|
|
5
|
+
return config;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Read the effective max length declared on a Zod string (via `.max(n)` /
|
|
9
|
+
* `.length(n)`), unwrapping optional/nullable/default wrappers. Returns
|
|
10
|
+
* undefined for non-strings or unconstrained strings. Mirrors the reader in
|
|
11
|
+
* schema-sql.ts (kept local to avoid a schema <-> schema-sql import cycle) and
|
|
12
|
+
* is used to carry a primary-key id's length into the injected id column so the
|
|
13
|
+
* SQL generator can emit `VARCHAR(n)` instead of an (invalid-as-a-MySQL-PK)
|
|
14
|
+
* `TEXT`.
|
|
15
|
+
*/
|
|
16
|
+
function readZodStringMax(field) {
|
|
17
|
+
const unwrapped = unwrapZodType(field);
|
|
18
|
+
if (!(unwrapped instanceof z$1.ZodString)) return void 0;
|
|
19
|
+
const checks = unwrapped.def?.checks ?? [];
|
|
20
|
+
let maxLength;
|
|
21
|
+
for (const check of checks) {
|
|
22
|
+
const c = check?._zod?.def ?? check?.def ?? check;
|
|
23
|
+
if (c?.check === "length_equals" || c?.check === "size_equals") {
|
|
24
|
+
const len = c.length ?? c.size;
|
|
25
|
+
if (typeof len === "number") maxLength = maxLength === void 0 ? len : Math.min(maxLength, len);
|
|
26
|
+
}
|
|
27
|
+
if (c?.check === "max_length" || c?.check === "max_size") {
|
|
28
|
+
const len = c.maximum ?? c.max;
|
|
29
|
+
if (typeof len === "number") maxLength = maxLength === void 0 ? len : Math.min(maxLength, len);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return maxLength;
|
|
33
|
+
}
|
|
34
|
+
const schemaRegistry = /* @__PURE__ */ new Map();
|
|
35
|
+
let shouldTrackSchema = false;
|
|
36
|
+
function trackSchema() {
|
|
37
|
+
shouldTrackSchema = true;
|
|
38
|
+
}
|
|
39
|
+
function getAutoIdCodec(idMeta, userCodec) {
|
|
40
|
+
if (userCodec) return void 0;
|
|
41
|
+
const rawType = idMeta.pgType ?? idMeta.mysqlType;
|
|
42
|
+
if (!rawType) return void 0;
|
|
43
|
+
const upper = rawType.toUpperCase().replace(/\(.*\)/, "").trim();
|
|
44
|
+
if ([
|
|
45
|
+
"BIGINT",
|
|
46
|
+
"INT8",
|
|
47
|
+
"SERIAL8"
|
|
48
|
+
].includes(upper)) return {
|
|
49
|
+
encode: (v) => BigInt(v),
|
|
50
|
+
decode: (v) => String(v)
|
|
51
|
+
};
|
|
52
|
+
if ([
|
|
53
|
+
"INTEGER",
|
|
54
|
+
"INT",
|
|
55
|
+
"SERIAL",
|
|
56
|
+
"INT4",
|
|
57
|
+
"SMALLINT",
|
|
58
|
+
"INT2"
|
|
59
|
+
].includes(upper)) return {
|
|
60
|
+
encode: (v) => Number(v),
|
|
61
|
+
decode: (v) => String(v)
|
|
62
|
+
};
|
|
63
|
+
if ([
|
|
64
|
+
"DECIMAL",
|
|
65
|
+
"NUMERIC",
|
|
66
|
+
"FLOAT",
|
|
67
|
+
"REAL",
|
|
68
|
+
"DOUBLE",
|
|
69
|
+
"FLOAT8",
|
|
70
|
+
"FLOAT4"
|
|
71
|
+
].includes(upper)) return {
|
|
72
|
+
encode: (v) => Number(v),
|
|
73
|
+
decode: (v) => String(v)
|
|
74
|
+
};
|
|
75
|
+
if (upper === "BOOLEAN" || upper === "BOOL" || upper.startsWith("TINYINT") && rawType.toUpperCase().includes("(1)")) return {
|
|
76
|
+
encode: (v) => v === "true" || v === "1",
|
|
77
|
+
decode: (v) => String(v)
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function defineSchema(config) {
|
|
81
|
+
const columns = {};
|
|
82
|
+
if (config.columns) Object.assign(columns, {
|
|
83
|
+
"id": "id",
|
|
84
|
+
"commitTs": "commit_ts",
|
|
85
|
+
...config.columns
|
|
86
|
+
});
|
|
87
|
+
else {
|
|
88
|
+
for (const key of Object.keys(config.schema)) columns[key] = key;
|
|
89
|
+
columns["id"] = "id";
|
|
90
|
+
columns["commitTs"] = "commit_ts";
|
|
91
|
+
}
|
|
92
|
+
const idMeta = {};
|
|
93
|
+
if ("id" in config.schema) {
|
|
94
|
+
const userMeta = config.schema.id?.meta?.();
|
|
95
|
+
if (userMeta) for (const k of Object.keys(userMeta)) {
|
|
96
|
+
if (k === "primaryKey") continue;
|
|
97
|
+
idMeta[k] = userMeta[k];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const userIdMax = "id" in config.schema ? readZodStringMax(config.schema.id) : void 0;
|
|
101
|
+
const idColumn = userIdMax !== void 0 ? z$1.string().max(userIdMax) : z$1.string();
|
|
102
|
+
const augmentedShape = {
|
|
103
|
+
...config.schema,
|
|
104
|
+
id: idColumn.meta({
|
|
105
|
+
primaryKey: true,
|
|
106
|
+
...idMeta
|
|
107
|
+
}),
|
|
108
|
+
commitTs: z$1.coerce.bigint()
|
|
109
|
+
};
|
|
110
|
+
const userCodecs = config.options?.codecs;
|
|
111
|
+
const autoIdCodec = getAutoIdCodec(idMeta, userCodecs?.id);
|
|
112
|
+
const mergedCodecs = {
|
|
113
|
+
...autoIdCodec ? { id: autoIdCodec } : {},
|
|
114
|
+
...userCodecs,
|
|
115
|
+
commitTs: commitTsCodec
|
|
116
|
+
};
|
|
117
|
+
const result = {
|
|
118
|
+
tableId: tableNameToId(config.name),
|
|
119
|
+
table: config.name,
|
|
120
|
+
schema: z$1.object(augmentedShape),
|
|
121
|
+
columnsOptions: {
|
|
122
|
+
...config.options,
|
|
123
|
+
codecs: mergedCodecs
|
|
124
|
+
},
|
|
125
|
+
columns,
|
|
126
|
+
indexes: config.indexes ?? []
|
|
127
|
+
};
|
|
128
|
+
if (shouldTrackSchema) schemaRegistry.set(config.name, result);
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
//#endregion
|
|
132
|
+
export { trackSchema as a, shouldTrackSchema as i, defineSchema as n, schemaRegistry as r, defineComputedField as t };
|
|
133
|
+
|
|
134
|
+
//# sourceMappingURL=schema-fKldWzwc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-fKldWzwc.js","names":["z"],"sources":["../src/db/schema.ts"],"sourcesContent":["import { z, ZodRawShape } from \"zod\";\nimport { commitTsCodec, unwrapZodType } from \"./codec\";\nimport { LiveQueryHandle } from \"../client\";\nimport { tableNameToId } from \"./table-id\";\n\nexport interface ColumnCodec<TData = unknown, TDriver = unknown> {\n encode?: (value: TData) => TDriver;\n decode?: (value: TDriver) => TData;\n}\n\n// Constrain a codec's decoded type to match the schema field's inferred type.\n// Without this, `decode` could return any value (e.g. a string outside an enum)\n// and silently override the schema's declared type at the type level.\ntype SchemaCodecField<TSchema extends ZodRawShape, K extends PropertyKey> =\n K extends keyof TSchema\n ? TSchema[K] extends z.ZodTypeAny ? z.infer<TSchema[K]> : unknown\n : K extends keyof BaseSchema\n ? BaseSchema[K] extends z.ZodTypeAny ? z.infer<BaseSchema[K]> : unknown\n : unknown;\n\nexport type SchemaCodecs<TSchema extends ZodRawShape> = Partial<{\n [K in keyof (TSchema & BaseSchema)]: ColumnCodec<SchemaCodecField<TSchema, K>, any>;\n}>;\n\nexport interface SchemaColumnsOptions<TSchema extends ZodRawShape = ZodRawShape> {\n codecs?: SchemaCodecs<TSchema>;\n}\n\nexport interface SchemaColumnMapping {\n [key: string]: string;\n}\n\nexport interface DeclarativeIndex {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: \"btree\" | \"hash\" | \"gin\" | \"gist\" | \"spgist\" | \"brin\";\n where?: string;\n using?: string;\n options?: string;\n tablespace?: string;\n}\n\nexport type IndexDefinition = string | DeclarativeIndex;\n\nexport interface DefineSchemaConfig<TSchema extends ZodRawShape> {\n name: string;\n schema: TSchema;\n options?: SchemaColumnsOptions<TSchema>;\n columns?: SchemaColumnMapping;\n indexes?: IndexDefinition[];\n}\n\n// Tuple-wrap the `undefined` checks so they don't fall through to the\n// object-shape conditionals when consumers compile under `strict: false`\n// (without `strictNullChecks`, `undefined` is assignable to object types and\n// would otherwise match `{ decode: ... }` / `ColumnCodec<...>` with all\n// `infer`s collapsing to `unknown`).\ntype CodecDataType<TCodec, TFallback> =\n [TCodec] extends [undefined] ? TFallback\n : TCodec extends { decode: (...args: any[]) => infer TDecoded } ? TDecoded\n : TCodec extends ColumnCodec<infer TData, unknown> ? TData\n : TFallback;\n\ntype ZodOutput<TZod> =\n [TZod] extends [undefined] ? unknown\n : TZod extends z.ZodTypeAny ? z.infer<TZod>\n : unknown;\nexport type ComputedDataType<TCodec, TZod> = CodecDataType<TCodec, ZodOutput<TZod>>;\nexport type ComputedCodec<TData, TDriver> = ColumnCodec<TData, TDriver>;\nexport type OverrideField<TObj, TKey extends PropertyKey, TValue> = Omit<TObj, TKey> & { [K in TKey]: TValue };\nexport interface ComputedFieldConfig<\n TField extends string,\n TDecoded = unknown,\n TDriver = unknown,\n TZodType extends z.ZodTypeAny | undefined = undefined,\n> {\n field: TField;\n sql: string;\n alias?: string;\n type?: TZodType;\n codec?: {\n decode: (value: TDriver) => TDecoded;\n encode?: (value: TDecoded) => TDriver;\n };\n}\n\nexport type ComputedField = {\n field: string;\n sql: string;\n alias: string;\n codec?: ColumnCodec<any, any>;\n};\n\nexport function defineComputedField<\n TField extends string,\n TDecoded = unknown,\n TDriver = unknown,\n TZodType extends z.ZodTypeAny | undefined = undefined,\n>(\n config: ComputedFieldConfig<TField, TDecoded, TDriver, TZodType>\n): ComputedFieldConfig<TField, TDecoded, TDriver, TZodType> {\n return config;\n}\n\nexport type Prettify<T> = { [K in keyof T]: T[K] } & {};\n\ntype ApplySchemaCodecs<TBase, TCodecs> = {\n [K in keyof TBase]: K extends keyof TCodecs ? CodecDataType<TCodecs[K], TBase[K]> : TBase[K];\n};\n\n// Only apply codecs when `options.codecs` is explicitly provided. Without this\n// guard, the default constraint (`SchemaColumnsOptions<TSchema>`) makes\n// `TOptions[\"codecs\"]` infer as `Partial<{ [K]: ColumnCodec<any, any> }>`,\n// which collapses every field to `any` inside `ApplySchemaCodecs`.\ntype ResolveSchemaType<\n TSchema extends ZodRawShape,\n TOptions extends SchemaColumnsOptions<TSchema>\n> = TOptions extends { codecs: infer TCodecs }\n ? Prettify<ApplySchemaCodecs<z.infer<z.ZodObject<TSchema & BaseSchema>>, TCodecs>>\n : Prettify<z.infer<z.ZodObject<TSchema & BaseSchema>>>;\n\n// Helper to detect if a Zod type is optional or nullable\ntype IsOptionalField<T> =\n T extends z.ZodOptional<any> ? true :\n T extends z.ZodNullable<any> ? true :\n T extends z.ZodDefault<any> ? true :\n false;\n\n// Split schema keys into required vs optional\ntype OptionalKeys<TZod extends ZodRawShape> = {\n [K in keyof TZod]: IsOptionalField<TZod[K]> extends true ? K : never\n}[keyof TZod];\n\ntype RequiredKeys<TZod extends ZodRawShape> = {\n [K in keyof TZod]: IsOptionalField<TZod[K]> extends true ? never : K\n}[keyof TZod];\n\n// Add a base shape type that all schemas will include\ntype BaseSchema = {\n id: z.ZodString;\n commitTs: z.ZodCoercedBigInt;\n};\n\n/**\n * Read the effective max length declared on a Zod string (via `.max(n)` /\n * `.length(n)`), unwrapping optional/nullable/default wrappers. Returns\n * undefined for non-strings or unconstrained strings. Mirrors the reader in\n * schema-sql.ts (kept local to avoid a schema <-> schema-sql import cycle) and\n * is used to carry a primary-key id's length into the injected id column so the\n * SQL generator can emit `VARCHAR(n)` instead of an (invalid-as-a-MySQL-PK)\n * `TEXT`.\n */\nfunction readZodStringMax(field: unknown): number | undefined {\n const unwrapped = unwrapZodType(field);\n if (!(unwrapped instanceof z.ZodString)) return undefined;\n\n const checks: any[] = (unwrapped as any).def?.checks ?? [];\n let maxLength: number | undefined;\n for (const check of checks) {\n const c = check?._zod?.def ?? check?.def ?? check;\n if (c?.check === \"length_equals\" || c?.check === \"size_equals\") {\n const len = c.length ?? c.size;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n if (c?.check === \"max_length\" || c?.check === \"max_size\") {\n const len = c.maximum ?? c.max;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n }\n return maxLength;\n}\n\nexport const schemaRegistry = new Map<string, SchemaDefinition<string, any, any>>();\nexport let shouldTrackSchema = false;\n\nexport function trackSchema(): void {\n shouldTrackSchema = true;\n}\n\nfunction getAutoIdCodec(idMeta: Record<string, unknown>, userCodec: unknown): ColumnCodec<any, any> | undefined {\n if (userCodec) return undefined;\n const rawType = (idMeta.pgType as string | undefined) ?? (idMeta.mysqlType as string | undefined);\n if (!rawType) return undefined;\n\n const upper = rawType.toUpperCase().replace(/\\(.*\\)/, \"\").trim();\n if ([\"BIGINT\", \"INT8\", \"SERIAL8\"].includes(upper)) {\n return {\n encode: (v: string) => BigInt(v),\n decode: (v: unknown) => String(v),\n };\n }\n if ([\"INTEGER\", \"INT\", \"SERIAL\", \"INT4\", \"SMALLINT\", \"INT2\"].includes(upper)) {\n return {\n encode: (v: string) => Number(v),\n decode: (v: unknown) => String(v),\n };\n }\n if ([\"DECIMAL\", \"NUMERIC\", \"FLOAT\", \"REAL\", \"DOUBLE\", \"FLOAT8\", \"FLOAT4\"].includes(upper)) {\n return {\n encode: (v: string) => Number(v),\n decode: (v: unknown) => String(v),\n };\n }\n if (upper === \"BOOLEAN\" || upper === \"BOOL\" || (upper.startsWith(\"TINYINT\") && rawType.toUpperCase().includes(\"(1)\"))) {\n return {\n encode: (v: string) => v === \"true\" || v === \"1\",\n decode: (v: unknown) => String(v),\n };\n }\n return undefined;\n}\n\nexport function defineSchema<\n TSchema extends ZodRawShape,\n TName extends string,\n TOptions extends SchemaColumnsOptions<TSchema> = SchemaColumnsOptions<TSchema>\n>(\n config: DefineSchemaConfig<TSchema> & { name: TName; options?: TOptions }\n): SchemaDefinition<TName, Prettify<TSchema & BaseSchema>, ResolveSchemaType<TSchema, TOptions>> {\n const columns: Record<string, string> = {};\n\n if (config.columns) {\n Object.assign(columns, { 'id': 'id', 'commitTs': 'commit_ts', ...config.columns });\n } else {\n // Default: use field name as column name\n for (const key of Object.keys(config.schema)) {\n columns[key] = key;\n }\n columns['id'] = 'id';\n columns['commitTs'] = 'commit_ts';\n }\n\n // Preserve user's id meta (pgType, mysqlType, etc.) so the SQL generator\n // can emit the correct raw type. primaryKey is always forced true.\n const idMeta: Record<string, unknown> = {};\n if (\"id\" in config.schema) {\n const userMeta = (config.schema.id as any)?.meta?.();\n if (userMeta) {\n for (const k of Object.keys(userMeta)) {\n if (k === \"primaryKey\") continue; // always forced true\n idMeta[k] = userMeta[k];\n }\n }\n }\n\n // Preserve the user's id length constraint (`zodPrimaryIdColumn().max(32)`)\n // so the SQL generator emits `VARCHAR(n)`. `.max()` is a Zod *check*, not\n // metadata, so it isn't captured by `idMeta` above and must be re-applied to\n // the injected id — otherwise the PK renders as `TEXT`, which MySQL cannot\n // use as a primary key.\n const userIdMax = \"id\" in config.schema ? readZodStringMax(config.schema.id) : undefined;\n const idColumn = userIdMax !== undefined ? z.string().max(userIdMax) : z.string();\n\n // Merge id/commitTs into the Zod schema, user-defined fields win for everything else,\n // but id/commitTs are always forced to their correct types\n const augmentedShape = {\n ...config.schema,\n // always string, even if user defined it differently\n id: idColumn.meta({ primaryKey: true, ...idMeta }),\n // always bigint, mapped to commit_ts column\n commitTs: z.coerce.bigint(),\n };\n\n const userCodecs = config.options?.codecs;\n const autoIdCodec = getAutoIdCodec(idMeta, userCodecs?.id);\n const mergedCodecs = {\n ...(autoIdCodec ? { id: autoIdCodec } : {}),\n ...userCodecs,\n commitTs: commitTsCodec,\n };\n\n const result = {\n tableId: tableNameToId(config.name),\n table: config.name,\n schema: z.object(augmentedShape),\n columnsOptions: {\n ...config.options,\n codecs: mergedCodecs,\n },\n columns,\n indexes: config.indexes ?? [],\n } as SchemaDefinition<TName, TSchema & BaseSchema, ResolveSchemaType<TSchema, TOptions>>;\n\n if (shouldTrackSchema) {\n schemaRegistry.set(config.name, result);\n }\n\n return result\n}\n\n// tableNameToId now lives in ./table-id (leaf module, also home to the memoized\n// tableIdOf). Re-exported here so existing `from \"./schema\"` imports still resolve.\nexport { tableNameToId };\n\n// Stored codec map is intentionally loose: the strict per-field constraint is\n// enforced on the input (`DefineSchemaConfig.options`), but storing the strict\n// type here would break variance when assigning a specific schema to a generic\n// `SchemaDefinition<string, ZodRawShape>` constraint (ColumnCodec.encode is\n// contravariant in its data type).\nexport interface StoredSchemaColumnsOptions {\n codecs?: Record<string, ColumnCodec<any, any>>;\n}\n\nexport interface SchemaDefinition<\n TTable extends string,\n TZod extends ZodRawShape,\n TData = z.infer<z.ZodObject<TZod>>\n> {\n tableId: Uint8Array;\n table: TTable;\n schema: z.ZodObject<TZod>;\n columnsOptions: StoredSchemaColumnsOptions;\n columns: Record<string, string>;\n indexes: IndexDefinition[];\n _dataType?: TData;\n}\n\nexport type InferSchema<T extends SchemaDefinition<string, ZodRawShape, any>> =\n T extends SchemaDefinition<string, ZodRawShape, infer TData> ? TData : never;\n\nexport type InsertData<T extends SchemaDefinition<string, ZodRawShape, any>> =\n T extends SchemaDefinition<string, infer TZod, infer TData>\n ? {\n [K in RequiredKeys<TZod> as K extends \"id\" | \"commitTs\" ? never : K]:\n Extract<K, string> extends keyof TData ? TData[Extract<K, string>] : never\n } & {\n [K in OptionalKeys<TZod> as K extends \"id\" | \"commitTs\" ? never : K]?:\n Extract<K, string> extends keyof TData ? TData[Extract<K, string>] : never\n }\n : never;\n\nexport interface Model {\n table: string;\n tableId: Uint8Array,\n columns: Record<string, string>;\n reverseColumns: Record<string, string>;\n types: Record<string, string>;\n codecs: Record<string, ColumnCodec<any, any>>;\n}\n\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type ReturnLiveQuery<\n TLiveQueryFn extends (...args: any[]) => MaybePromise<LiveQueryHandle<any>>\n> =\n Awaited<ReturnType<TLiveQueryFn>> extends LiveQueryHandle<infer T>\n ? T\n : never;\n\nexport type ReturnQuery<TQueryFn extends (...args: any[]) => any> =\n Awaited<ReturnType<TQueryFn>>;\n\nexport type QueryArgs<TQueryFn extends (...args: any[]) => any> =\n Parameters<TQueryFn>[0];\n\nexport type MutationArgs<TMutationFn extends (...args: any[]) => any> =\n Parameters<TMutationFn>[0];\n\nexport type ActionArgs<TActionFn extends (...args: any[]) => any> =\n Parameters<TActionFn>[0];"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as ProcedureNames, $r as WriteEntry, $t as TxContext, Ar as OccConflictError, Br as QueryCacheMetadataSchema, Cn as InsertData, Cr as DEFAULT_RETRY, Ct as QueryFn, Dr as MutationResult, Er as LiveResult, Et as createActionBuilder, Fr as Predicate, G as RPCError, Gr as RawPointReadSchema, Gt as DefsToMap, Hr as RangeRead, Ht as SupaliveDb, In as defineComputedField, Ir as PredicateSchema, J as ActionProcedures, Jr as RawReadEntry, Jt as ResultOf, K as WSClientOptions, Kr as RawRangeRead, Kt as ParamsOf, Ln as defineSchema, Lr as QueryCacheEntry, Mr as OrPredicateSchema, Nn as SchemaColumnsOptions, Nr as PointRead, Or as NO_RETRY, Ot as createMutationBuilder, Pn as SchemaDefinition, Pr as PointReadSchema, Q as MutationProcedures, Qr as RetryConfig, Qt as DbWriter, Rr as QueryCacheEntrySchema, Sn as InferSchema, Sr as CompareOperatorSchema, St as QueryCtx, Tr as LeafPredicateSchema, Tt as TypeOf, U as ClientPublicState, Un as Database, Ur as RangeReadSchema, Ut as sleep, Vr as QuerySpec, W as HeartbeatOptions, Wn as DbQueryResult, Wr as RawPointRead, Wt as AnyQueryDef, Xr as ReadEntry, Xt as defineQuery, Y as AppRouter, Yn as RawClient, Yr as RawReadEntrySchema, Yt as _resetGlobalDefs, Zr as ReadEntrySchema, Zt as DbReader, _r as CachedPgMetadata, _t as MutationCtx, a as CallOptions, ai as normalizeToBytes, at as router, br as CommitTs, bt as OutputOf, c as LiveQueryHandle, ct as ActionFn, d as WSClientMethods, dt as ContextOf, ei as WriteEntrySchema, et as PublicProcedures, f as createClient, fn as matchesPredicate, gr as BigIntSchema, gt as MutationConfig, hr as AndPredicateSchema, i as createCaller, ii as normalizeIdToBytes, jn as SchemaCodecs, jr as OrPredicate, kr as OccAbortError, kt as createQueryBuilder, l as LiveQueryState, lt as ActionProcedure, mn as ColumnCodec, mr as AndPredicate, n as CallerFromRouter, ni as WriteOpSchema, nt as RegisteredProcedure, o as ClientFromProcedures, ot as ActionConfig, q as WsClientManager, qn as PooledClient, qr as RawRangeReadSchema, qt as QueryDefinition, r as CallerOptions, ri as bytesFromJson, rt as Router, s as ClientOptions, st as ActionCtx, t as CallerFromProcedures, ti as WriteOp, tt as QueryProcedures, u as LiveQueryStatus, ut as AnyProcedure, vn as ComputedFieldConfig, vr as CachedPgMetadataSchema, vt as MutationFn, wn as Model, wr as LeafPredicate, wt as QueryProcedure, xr as CompareOperator, xt as QueryConfig, yr as CommitLogEntry, yt as MutationProcedure, zr as QueryCacheMetadata } from "../../index-
|
|
1
|
+
import { $ as ProcedureNames, $r as WriteEntry, $t as TxContext, Ar as OccConflictError, Br as QueryCacheMetadataSchema, Cn as InsertData, Cr as DEFAULT_RETRY, Ct as QueryFn, Dr as MutationResult, Er as LiveResult, Et as createActionBuilder, Fr as Predicate, G as RPCError, Gr as RawPointReadSchema, Gt as DefsToMap, Hr as RangeRead, Ht as SupaliveDb, In as defineComputedField, Ir as PredicateSchema, J as ActionProcedures, Jr as RawReadEntry, Jt as ResultOf, K as WSClientOptions, Kr as RawRangeRead, Kt as ParamsOf, Ln as defineSchema, Lr as QueryCacheEntry, Mr as OrPredicateSchema, Nn as SchemaColumnsOptions, Nr as PointRead, Or as NO_RETRY, Ot as createMutationBuilder, Pn as SchemaDefinition, Pr as PointReadSchema, Q as MutationProcedures, Qr as RetryConfig, Qt as DbWriter, Rr as QueryCacheEntrySchema, Sn as InferSchema, Sr as CompareOperatorSchema, St as QueryCtx, Tr as LeafPredicateSchema, Tt as TypeOf, U as ClientPublicState, Un as Database, Ur as RangeReadSchema, Ut as sleep, Vr as QuerySpec, W as HeartbeatOptions, Wn as DbQueryResult, Wr as RawPointRead, Wt as AnyQueryDef, Xr as ReadEntry, Xt as defineQuery, Y as AppRouter, Yn as RawClient, Yr as RawReadEntrySchema, Yt as _resetGlobalDefs, Zr as ReadEntrySchema, Zt as DbReader, _r as CachedPgMetadata, _t as MutationCtx, a as CallOptions, ai as normalizeToBytes, at as router, br as CommitTs, bt as OutputOf, c as LiveQueryHandle, ct as ActionFn, d as WSClientMethods, dt as ContextOf, ei as WriteEntrySchema, et as PublicProcedures, f as createClient, fn as matchesPredicate, gr as BigIntSchema, gt as MutationConfig, hr as AndPredicateSchema, i as createCaller, ii as normalizeIdToBytes, jn as SchemaCodecs, jr as OrPredicate, kr as OccAbortError, kt as createQueryBuilder, l as LiveQueryState, lt as ActionProcedure, mn as ColumnCodec, mr as AndPredicate, n as CallerFromRouter, ni as WriteOpSchema, nt as RegisteredProcedure, o as ClientFromProcedures, ot as ActionConfig, q as WsClientManager, qn as PooledClient, qr as RawRangeReadSchema, qt as QueryDefinition, r as CallerOptions, ri as bytesFromJson, rt as Router, s as ClientOptions, st as ActionCtx, t as CallerFromProcedures, ti as WriteOp, tt as QueryProcedures, u as LiveQueryStatus, ut as AnyProcedure, vn as ComputedFieldConfig, vr as CachedPgMetadataSchema, vt as MutationFn, wn as Model, wr as LeafPredicate, wt as QueryProcedure, xr as CompareOperator, xt as QueryConfig, yr as CommitLogEntry, yt as MutationProcedure, zr as QueryCacheMetadata } from "../../index-C_i3U4cd.js";
|
|
2
2
|
export { type ActionConfig, type ActionCtx, type ActionFn, type ActionProcedure, type ActionProcedures, AndPredicate, AndPredicateSchema, type AnyProcedure, type AnyQueryDef, type AppRouter, BigIntSchema, CachedPgMetadata, CachedPgMetadataSchema, type CallOptions, CallerFromProcedures, CallerFromRouter, CallerOptions, type ClientFromProcedures, type ClientOptions, type ClientPublicState, type ColumnCodec, CommitLogEntry, CommitTs, CompareOperator, CompareOperatorSchema, type ComputedFieldConfig, type ContextOf, DEFAULT_RETRY, type Database, type DbQueryResult, DbReader, DbReader as ReadContext, DbWriter, DbWriter as WritableContext, type DefsToMap, type HeartbeatOptions, type InferSchema, type InsertData, LeafPredicate, LeafPredicateSchema, type LiveQueryHandle, type LiveQueryState, type LiveQueryStatus, LiveResult, type Model, type MutationConfig, type MutationCtx, type MutationFn, type MutationProcedure, type MutationProcedures, MutationResult, NO_RETRY, OccAbortError, OccConflictError, OrPredicate, OrPredicateSchema, type OutputOf, type ParamsOf, PointRead, PointReadSchema, type PooledClient, Predicate, PredicateSchema, type ProcedureNames, type PublicProcedures, QueryCacheEntry, QueryCacheEntrySchema, QueryCacheMetadata, QueryCacheMetadataSchema, type QueryConfig, type QueryCtx, type QueryDefinition, type QueryFn, type QueryProcedure, type QueryProcedures, QuerySpec, RPCError, RangeRead, RangeReadSchema, type RawClient, RawPointRead, RawPointReadSchema, RawRangeRead, RawRangeReadSchema, RawReadEntry, RawReadEntrySchema, ReadEntry, ReadEntrySchema, type RegisteredProcedure, type ResultOf, RetryConfig, type Router, type SchemaCodecs, type SchemaColumnsOptions, type SchemaDefinition, SupaliveDb, TxContext, type TypeOf, type WSClientMethods, type WSClientOptions, WriteEntry, WriteEntrySchema, WriteOp, WriteOpSchema, WsClientManager, _resetGlobalDefs, bytesFromJson, createActionBuilder, createCaller, createClient, createMutationBuilder, createQueryBuilder, defineComputedField, defineQuery, defineSchema, matchesPredicate, normalizeIdToBytes, normalizeToBytes, router, sleep };
|
package/dist/src/client/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { i as
|
|
2
|
-
import {
|
|
3
|
-
import { o as matchesPredicate } from "../../query-
|
|
4
|
-
import { n as defineSchema, t as defineComputedField } from "../../schema-
|
|
5
|
-
import { r as
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
1
|
+
import { c as parentConn, i as createActionBuilder, n as getContextRegistry, o as createMutationBuilder, r as router, s as createQueryBuilder, u as primaryOnlyConn } from "../../router-Kgrlci8X.js";
|
|
2
|
+
import { r as supaliveStringify } from "../../helper-zdJT5FUc.js";
|
|
3
|
+
import { o as matchesPredicate } from "../../query-Xw2hi6TB.js";
|
|
4
|
+
import { n as defineSchema, t as defineComputedField } from "../../schema-DLue3K2s.js";
|
|
5
|
+
import { C as normalizeIdToBytes, S as bytesFromJson, _ as RawRangeReadSchema, a as DEFAULT_RETRY, b as WriteEntrySchema, c as OccAbortError, d as PointReadSchema, f as PredicateSchema, g as RawPointReadSchema, h as RangeReadSchema, i as CompareOperatorSchema, l as OccConflictError, m as QueryCacheMetadataSchema, n as BigIntSchema, o as LeafPredicateSchema, p as QueryCacheEntrySchema, r as CachedPgMetadataSchema, s as NO_RETRY, t as AndPredicateSchema, u as OrPredicateSchema, v as RawReadEntrySchema, w as normalizeToBytes, x as WriteOpSchema, y as ReadEntrySchema } from "../../types_db-OUou3o2Z.js";
|
|
6
|
+
import { l as ServerMessageSchema } from "../../types_client_rpc-ByGwoRCL.js";
|
|
7
|
+
import { a as TxContext, i as DbWriter, n as sleep, r as DbReader, t as SupaliveDb } from "../../realtime_db-CVze3gM0.js";
|
|
8
|
+
import { n as resolveReadRouting, t as makeConnRouting } from "../../read-routing-BUcQAwnd.js";
|
|
9
9
|
import { sha1 } from "hash-wasm";
|
|
10
10
|
//#region src/db/query_definition.ts
|
|
11
11
|
const _globalDefs = /* @__PURE__ */ new Map();
|
|
@@ -111,6 +111,7 @@ var WsClientManager = class {
|
|
|
111
111
|
explicitlyClosed = false;
|
|
112
112
|
stateListeners = /* @__PURE__ */ new Set();
|
|
113
113
|
lastPublicState = "disconnected";
|
|
114
|
+
highWaterTs = 0n;
|
|
114
115
|
serverInactivityMs;
|
|
115
116
|
lastServerMessageAt = 0;
|
|
116
117
|
inactivityTimer = null;
|
|
@@ -335,10 +336,22 @@ var WsClientManager = class {
|
|
|
335
336
|
type: "call",
|
|
336
337
|
id,
|
|
337
338
|
procedure,
|
|
338
|
-
input
|
|
339
|
+
input,
|
|
340
|
+
minTs: this.highWaterTs > 0n ? this.highWaterTs.toString() : void 0
|
|
339
341
|
});
|
|
340
342
|
});
|
|
341
343
|
}
|
|
344
|
+
/** Advance the read high-water from a server-returned `ts` (monotonic). */
|
|
345
|
+
advanceHighWater(ts) {
|
|
346
|
+
if (ts === void 0) return;
|
|
347
|
+
let parsed;
|
|
348
|
+
try {
|
|
349
|
+
parsed = BigInt(ts);
|
|
350
|
+
} catch {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
if (parsed > this.highWaterTs) this.highWaterTs = parsed;
|
|
354
|
+
}
|
|
342
355
|
/**
|
|
343
356
|
* Flush queued calls in FIFO order. Called once `isReady()` becomes
|
|
344
357
|
* true. With the throttle enabled, dispatch the first batch
|
|
@@ -644,12 +657,18 @@ var WsClientManager = class {
|
|
|
644
657
|
if (!pending) return;
|
|
645
658
|
this.pendingRequests.delete(message.id);
|
|
646
659
|
if (message.success) if (pending.subscribeResolve) pending.subscribeResolve(message.subId);
|
|
647
|
-
else
|
|
660
|
+
else {
|
|
661
|
+
this.advanceHighWater(message.ts);
|
|
662
|
+
pending.resolve?.(message.data);
|
|
663
|
+
}
|
|
648
664
|
else pending.reject(new RPCError(message.error ?? "Unknown error", message.code));
|
|
649
665
|
}
|
|
650
666
|
handleSubscriptionUpdate(message) {
|
|
651
667
|
const sub = this.subscriptions.get(message.subId);
|
|
652
|
-
if (sub)
|
|
668
|
+
if (sub) {
|
|
669
|
+
this.advanceHighWater(message.ts);
|
|
670
|
+
sub.onUpdate(message.data);
|
|
671
|
+
}
|
|
653
672
|
}
|
|
654
673
|
/**
|
|
655
674
|
* Handles a `sub:gone` message: the server no longer tracks this
|
|
@@ -1076,6 +1095,35 @@ var LiveQueryHandleImpl = class {
|
|
|
1076
1095
|
//#endregion
|
|
1077
1096
|
//#region src/client/caller_client.ts
|
|
1078
1097
|
/**
|
|
1098
|
+
* Run a standalone (non-transaction-joining) server-side query with replica
|
|
1099
|
+
* routing that DEFAULTS to the primary.
|
|
1100
|
+
*
|
|
1101
|
+
* Unlike a client one-shot query, the internal caller has no client `minTs`
|
|
1102
|
+
* high-water to gate replica staleness — a caller that just performed an
|
|
1103
|
+
* internal write and then reads back would silently read a lagging replica. So
|
|
1104
|
+
* the safe default here is the PRIMARY; a handler can still opt a heavy
|
|
1105
|
+
* reporting read onto the replica with `ctx.useReplicaConn()` (and force back
|
|
1106
|
+
* with `ctx.usePrimaryConn()` / `{ readOwnWrite: true }`). The connection knobs
|
|
1107
|
+
* use the SAME shared routing rule as the one-shot path ({@link resolveReadRouting}
|
|
1108
|
+
* / {@link makeConnRouting}) — the only difference is the DEFAULT connection
|
|
1109
|
+
* (primary here, replica-if-caught-up there). With no minTs floor, an explicit
|
|
1110
|
+
* `useReplicaConn()` resolves to the replica whenever one is configured. With no
|
|
1111
|
+
* replica configured every branch resolves to the primary.
|
|
1112
|
+
*/
|
|
1113
|
+
async function runRoutedCallerQuery(db, serverCtx, fn) {
|
|
1114
|
+
const routing = await resolveReadRouting(db, await db.impl.getLatestSnapshotTimestamp(), 0n);
|
|
1115
|
+
return (await db.queryInternalOn({
|
|
1116
|
+
impl: routing.primaryImpl,
|
|
1117
|
+
beginTs: routing.primaryTs
|
|
1118
|
+
}, async (dbCtx) => {
|
|
1119
|
+
return fn({
|
|
1120
|
+
db: dbCtx,
|
|
1121
|
+
serverCtx,
|
|
1122
|
+
...makeConnRouting(dbCtx, routing)
|
|
1123
|
+
});
|
|
1124
|
+
})).data;
|
|
1125
|
+
}
|
|
1126
|
+
/**
|
|
1079
1127
|
* Create a server-side caller that bypasses HTTP/WebSocket.
|
|
1080
1128
|
*
|
|
1081
1129
|
* For in-memory calls, input validation is skipped (data is already a JS object).
|
|
@@ -1108,13 +1156,7 @@ function createCaller(options) {
|
|
|
1108
1156
|
query: async (input, serverCtx) => {
|
|
1109
1157
|
if (procedure.type !== "query") throw new Error(`Procedure "${procedureName}" is not a query`);
|
|
1110
1158
|
const validatedInput = validateInput(input);
|
|
1111
|
-
return db
|
|
1112
|
-
const ctx = {
|
|
1113
|
-
db: dbCtx,
|
|
1114
|
-
serverCtx
|
|
1115
|
-
};
|
|
1116
|
-
return procedure.fn(ctx, validatedInput);
|
|
1117
|
-
});
|
|
1159
|
+
return runRoutedCallerQuery(db, serverCtx, (ctx) => procedure.fn(ctx, validatedInput));
|
|
1118
1160
|
},
|
|
1119
1161
|
runQuery: async (input, parentCtx) => {
|
|
1120
1162
|
if (procedure.type !== "query") throw new Error(`Procedure "${procedureName}" is not a query`);
|
|
@@ -1122,17 +1164,12 @@ function createCaller(options) {
|
|
|
1122
1164
|
if (parentCtx.db instanceof TxContext) {
|
|
1123
1165
|
const ctx = {
|
|
1124
1166
|
db: parentCtx.db,
|
|
1125
|
-
serverCtx: parentCtx.serverCtx
|
|
1167
|
+
serverCtx: parentCtx.serverCtx,
|
|
1168
|
+
...parentConn
|
|
1126
1169
|
};
|
|
1127
1170
|
return procedure.fn(ctx, validatedInput);
|
|
1128
1171
|
}
|
|
1129
|
-
return parentCtx.db.
|
|
1130
|
-
const ctx = {
|
|
1131
|
-
db: dbCtx,
|
|
1132
|
-
serverCtx: parentCtx.serverCtx
|
|
1133
|
-
};
|
|
1134
|
-
return procedure.fn(ctx, validatedInput);
|
|
1135
|
-
});
|
|
1172
|
+
return runRoutedCallerQuery(parentCtx.db, parentCtx.serverCtx, (ctx) => procedure.fn(ctx, validatedInput));
|
|
1136
1173
|
},
|
|
1137
1174
|
mutate: async (input, serverCtx) => {
|
|
1138
1175
|
if (procedure.type !== "mutation") throw new Error(`Procedure "${procedureName}" is not a mutation`);
|
|
@@ -1140,7 +1177,8 @@ function createCaller(options) {
|
|
|
1140
1177
|
return (await db.mutation(async (dbCtx) => {
|
|
1141
1178
|
const ctx = {
|
|
1142
1179
|
db: dbCtx,
|
|
1143
|
-
serverCtx
|
|
1180
|
+
serverCtx,
|
|
1181
|
+
...primaryOnlyConn
|
|
1144
1182
|
};
|
|
1145
1183
|
return procedure.fn(ctx, validatedInput);
|
|
1146
1184
|
})).result;
|
|
@@ -1151,7 +1189,8 @@ function createCaller(options) {
|
|
|
1151
1189
|
return (await (parentCtx.db instanceof TxContext ? db : parentCtx.db).mutation(async (dbCtx) => {
|
|
1152
1190
|
const ctx = {
|
|
1153
1191
|
db: dbCtx,
|
|
1154
|
-
serverCtx: parentCtx.serverCtx
|
|
1192
|
+
serverCtx: parentCtx.serverCtx,
|
|
1193
|
+
...primaryOnlyConn
|
|
1155
1194
|
};
|
|
1156
1195
|
if (parentCtx.db instanceof TxContext) ctx.db.appendInternalReadSet(parentCtx.db.internalGetReadSet());
|
|
1157
1196
|
return procedure.fn(ctx, validatedInput);
|
|
@@ -1182,7 +1221,8 @@ function createCaller(options) {
|
|
|
1182
1221
|
return db.liveQuery(async (dbCtx) => {
|
|
1183
1222
|
const ctx = {
|
|
1184
1223
|
db: dbCtx,
|
|
1185
|
-
serverCtx
|
|
1224
|
+
serverCtx,
|
|
1225
|
+
...primaryOnlyConn
|
|
1186
1226
|
};
|
|
1187
1227
|
return procedure.fn(ctx, validatedInput);
|
|
1188
1228
|
});
|