@supalive/core 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -2
- package/dist/bytes-AuEkyxeU.js +19 -0
- package/dist/bytes-AuEkyxeU.js.map +1 -0
- package/dist/codec-BHAmGEIQ.js +62 -0
- package/dist/codec-BHAmGEIQ.js.map +1 -0
- package/dist/helper-CiacMqje.d.ts +14 -0
- package/dist/helper-CiacMqje.d.ts.map +1 -0
- package/dist/helper-wGbzz6zo.js +42 -0
- package/dist/helper-wGbzz6zo.js.map +1 -0
- package/dist/index-CaWMDqq0.d.ts +1754 -0
- package/dist/index-CaWMDqq0.d.ts.map +1 -0
- package/dist/mysql-Cxd4Uq5p.d.ts +104 -0
- package/dist/mysql-Cxd4Uq5p.d.ts.map +1 -0
- package/dist/mysql-bvnjYWvZ.js +570 -0
- package/dist/mysql-bvnjYWvZ.js.map +1 -0
- package/dist/overlap-checker-Ct_HP_iB.js +187 -0
- package/dist/overlap-checker-Ct_HP_iB.js.map +1 -0
- package/dist/postgres-B8u1YN8X.js +824 -0
- package/dist/postgres-B8u1YN8X.js.map +1 -0
- package/dist/postgres-Ck-xt72U.d.ts +108 -0
- package/dist/postgres-Ck-xt72U.d.ts.map +1 -0
- package/dist/procedure-DX87tyef.js +124 -0
- package/dist/procedure-DX87tyef.js.map +1 -0
- package/dist/query-Bh0RNxDz.js +673 -0
- package/dist/query-Bh0RNxDz.js.map +1 -0
- package/dist/realtime_db-DOCgqbwi.js +247 -0
- package/dist/realtime_db-DOCgqbwi.js.map +1 -0
- package/dist/router-DlTYWpop.js +81 -0
- package/dist/router-DlTYWpop.js.map +1 -0
- package/dist/schema-Dd7u0A1L.js +109 -0
- package/dist/schema-Dd7u0A1L.js.map +1 -0
- package/dist/src/client/index.d.ts +2 -17
- package/dist/src/client/index.js +1152 -18
- package/dist/src/client/index.js.map +1 -1
- package/dist/src/exports/mysql.d.ts +2 -2
- package/dist/src/exports/mysql.js +2 -2
- package/dist/src/exports/postgres.d.ts +2 -2
- package/dist/src/exports/postgres.js +2 -2
- package/dist/src/exports/procedure.d.ts +3 -5
- package/dist/src/exports/procedure.js +6 -5
- package/dist/src/exports/schema-sql.d.ts +18 -0
- package/dist/src/exports/schema-sql.d.ts.map +1 -0
- package/dist/src/exports/schema-sql.js +161 -0
- package/dist/src/exports/schema-sql.js.map +1 -0
- package/dist/src/exports/server.d.ts +368 -2
- package/dist/src/exports/server.d.ts.map +1 -1
- package/dist/src/exports/server.js +1346 -2
- package/dist/src/exports/server.js.map +1 -1
- package/dist/src/exports/subscription-manager-worker-entry.d.ts +1 -0
- package/dist/src/exports/subscription-manager-worker-entry.js +115 -0
- package/dist/src/exports/subscription-manager-worker-entry.js.map +1 -0
- package/dist/src/exports/types.d.ts +4 -6
- package/dist/src/exports/types.js +5 -6
- package/dist/subscription-worker-pahX0zxg.js +511 -0
- package/dist/subscription-worker-pahX0zxg.js.map +1 -0
- package/dist/types_client_rpc-CIsjQQGG.js +105 -0
- package/dist/types_client_rpc-CIsjQQGG.js.map +1 -0
- package/dist/types_db-DXj_l9n-.js +168 -0
- package/dist/types_db-DXj_l9n-.js.map +1 -0
- package/dist/types_server-Dk6o_B7N.js +24 -0
- package/dist/types_server-Dk6o_B7N.js.map +1 -0
- package/dist/types_server-TFo6SWDH.d.ts +216 -0
- package/dist/types_server-TFo6SWDH.d.ts.map +1 -0
- package/package.json +7 -3
- package/dist/src/client/caller_client.d.ts +0 -42
- package/dist/src/client/caller_client.d.ts.map +0 -1
- package/dist/src/client/caller_client.js +0 -77
- package/dist/src/client/caller_client.js.map +0 -1
- package/dist/src/client/client.d.ts +0 -149
- package/dist/src/client/client.d.ts.map +0 -1
- package/dist/src/client/client.js +0 -308
- package/dist/src/client/client.js.map +0 -1
- package/dist/src/client/index.d.ts.map +0 -1
- package/dist/src/client/sub_key.d.ts +0 -20
- package/dist/src/client/sub_key.d.ts.map +0 -1
- package/dist/src/client/sub_key.js +0 -37
- package/dist/src/client/sub_key.js.map +0 -1
- package/dist/src/client/ws_client_manager.d.ts +0 -268
- package/dist/src/client/ws_client_manager.d.ts.map +0 -1
- package/dist/src/client/ws_client_manager.js +0 -1013
- package/dist/src/client/ws_client_manager.js.map +0 -1
- package/dist/src/config.d.ts +0 -117
- package/dist/src/config.d.ts.map +0 -1
- package/dist/src/config.js +0 -2
- package/dist/src/config.js.map +0 -1
- package/dist/src/db/bytes.d.ts +0 -4
- package/dist/src/db/bytes.d.ts.map +0 -1
- package/dist/src/db/bytes.js +0 -24
- package/dist/src/db/bytes.js.map +0 -1
- package/dist/src/db/cache.d.ts +0 -30
- package/dist/src/db/cache.d.ts.map +0 -1
- package/dist/src/db/cache.js +0 -153
- package/dist/src/db/cache.js.map +0 -1
- package/dist/src/db/codec.d.ts +0 -10
- package/dist/src/db/codec.d.ts.map +0 -1
- package/dist/src/db/codec.js +0 -73
- package/dist/src/db/codec.js.map +0 -1
- package/dist/src/db/context.d.ts +0 -28
- package/dist/src/db/context.d.ts.map +0 -1
- package/dist/src/db/context.js +0 -147
- package/dist/src/db/context.js.map +0 -1
- package/dist/src/db/db.d.ts +0 -154
- package/dist/src/db/db.d.ts.map +0 -1
- package/dist/src/db/db.js +0 -23
- package/dist/src/db/db.js.map +0 -1
- package/dist/src/db/mysql.d.ts +0 -120
- package/dist/src/db/mysql.d.ts.map +0 -1
- package/dist/src/db/mysql.js +0 -708
- package/dist/src/db/mysql.js.map +0 -1
- package/dist/src/db/postgres.d.ts +0 -116
- package/dist/src/db/postgres.d.ts.map +0 -1
- package/dist/src/db/postgres.js +0 -998
- package/dist/src/db/postgres.js.map +0 -1
- package/dist/src/db/query.d.ts +0 -174
- package/dist/src/db/query.d.ts.map +0 -1
- package/dist/src/db/query.js +0 -790
- package/dist/src/db/query.js.map +0 -1
- package/dist/src/db/query_definition.d.ts +0 -54
- package/dist/src/db/query_definition.d.ts.map +0 -1
- package/dist/src/db/query_definition.js +0 -47
- package/dist/src/db/query_definition.js.map +0 -1
- package/dist/src/db/realtime_db.d.ts +0 -19
- package/dist/src/db/realtime_db.d.ts.map +0 -1
- package/dist/src/db/realtime_db.js +0 -98
- package/dist/src/db/realtime_db.js.map +0 -1
- package/dist/src/db/schema.d.ts +0 -110
- package/dist/src/db/schema.d.ts.map +0 -1
- package/dist/src/db/schema.js +0 -47
- package/dist/src/db/schema.js.map +0 -1
- package/dist/src/db/types_client_rpc.d.ts +0 -157
- package/dist/src/db/types_client_rpc.d.ts.map +0 -1
- package/dist/src/db/types_client_rpc.js +0 -106
- package/dist/src/db/types_client_rpc.js.map +0 -1
- package/dist/src/db/types_db.d.ts +0 -236
- package/dist/src/db/types_db.d.ts.map +0 -1
- package/dist/src/db/types_db.js +0 -188
- package/dist/src/db/types_db.js.map +0 -1
- package/dist/src/exports/mysql.d.ts.map +0 -1
- package/dist/src/exports/mysql.js.map +0 -1
- package/dist/src/exports/postgres.d.ts.map +0 -1
- package/dist/src/exports/postgres.js.map +0 -1
- package/dist/src/exports/procedure.d.ts.map +0 -1
- package/dist/src/exports/procedure.js.map +0 -1
- package/dist/src/exports/types.d.ts.map +0 -1
- package/dist/src/exports/types.js.map +0 -1
- package/dist/src/helper.d.ts +0 -11
- package/dist/src/helper.d.ts.map +0 -1
- package/dist/src/helper.js +0 -45
- package/dist/src/helper.js.map +0 -1
- package/dist/src/logger.d.ts +0 -7
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/logger.js +0 -47
- package/dist/src/logger.js.map +0 -1
- package/dist/src/router/index.d.ts +0 -4
- package/dist/src/router/index.d.ts.map +0 -1
- package/dist/src/router/index.js +0 -4
- package/dist/src/router/index.js.map +0 -1
- package/dist/src/router/procedure.d.ts +0 -204
- package/dist/src/router/procedure.d.ts.map +0 -1
- package/dist/src/router/procedure.js +0 -122
- package/dist/src/router/procedure.js.map +0 -1
- package/dist/src/router/router.d.ts +0 -88
- package/dist/src/router/router.d.ts.map +0 -1
- package/dist/src/router/router.js +0 -88
- package/dist/src/router/router.js.map +0 -1
- package/dist/src/server/hash.d.ts +0 -12
- package/dist/src/server/hash.d.ts.map +0 -1
- package/dist/src/server/hash.js +0 -20
- package/dist/src/server/hash.js.map +0 -1
- package/dist/src/server/hash.test.d.ts +0 -2
- package/dist/src/server/hash.test.d.ts.map +0 -1
- package/dist/src/server/hash.test.js +0 -43
- package/dist/src/server/hash.test.js.map +0 -1
- package/dist/src/server/index.d.ts +0 -9
- package/dist/src/server/index.d.ts.map +0 -1
- package/dist/src/server/index.js +0 -8
- package/dist/src/server/index.js.map +0 -1
- package/dist/src/server/overlap-checker.d.ts +0 -18
- package/dist/src/server/overlap-checker.d.ts.map +0 -1
- package/dist/src/server/overlap-checker.js +0 -247
- package/dist/src/server/overlap-checker.js.map +0 -1
- package/dist/src/server/sub_hash.d.ts +0 -23
- package/dist/src/server/sub_hash.d.ts.map +0 -1
- package/dist/src/server/sub_hash.js +0 -38
- package/dist/src/server/sub_hash.js.map +0 -1
- package/dist/src/server/subscription-manager-client.d.ts +0 -120
- package/dist/src/server/subscription-manager-client.d.ts.map +0 -1
- package/dist/src/server/subscription-manager-client.js +0 -207
- package/dist/src/server/subscription-manager-client.js.map +0 -1
- package/dist/src/server/subscription-manager-types.d.ts +0 -168
- package/dist/src/server/subscription-manager-types.d.ts.map +0 -1
- package/dist/src/server/subscription-manager-types.js +0 -94
- package/dist/src/server/subscription-manager-types.js.map +0 -1
- package/dist/src/server/subscription-manager-worker-entry.d.ts +0 -2
- package/dist/src/server/subscription-manager-worker-entry.d.ts.map +0 -1
- package/dist/src/server/subscription-manager-worker-entry.js +0 -127
- package/dist/src/server/subscription-manager-worker-entry.js.map +0 -1
- package/dist/src/server/subscription-manager-worker-protocol.d.ts +0 -40
- package/dist/src/server/subscription-manager-worker-protocol.d.ts.map +0 -1
- package/dist/src/server/subscription-manager-worker-protocol.js +0 -20
- package/dist/src/server/subscription-manager-worker-protocol.js.map +0 -1
- package/dist/src/server/subscription-manager.d.ts +0 -32
- package/dist/src/server/subscription-manager.d.ts.map +0 -1
- package/dist/src/server/subscription-manager.js +0 -249
- package/dist/src/server/subscription-manager.js.map +0 -1
- package/dist/src/server/subscription-manager.test.d.ts +0 -2
- package/dist/src/server/subscription-manager.test.d.ts.map +0 -1
- package/dist/src/server/subscription-manager.test.js +0 -610
- package/dist/src/server/subscription-manager.test.js.map +0 -1
- package/dist/src/server/subscription-worker.d.ts +0 -32
- package/dist/src/server/subscription-worker.d.ts.map +0 -1
- package/dist/src/server/subscription-worker.js +0 -190
- package/dist/src/server/subscription-worker.js.map +0 -1
- package/dist/src/server/supalive-server.d.ts +0 -158
- package/dist/src/server/supalive-server.d.ts.map +0 -1
- package/dist/src/server/supalive-server.js +0 -1048
- package/dist/src/server/supalive-server.js.map +0 -1
- package/dist/src/server/types_server.d.ts +0 -96
- package/dist/src/server/types_server.d.ts.map +0 -1
- package/dist/src/server/types_server.js +0 -36
- package/dist/src/server/types_server.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
package/dist/src/db/context.js
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { normalizeCodec, unwrapZodType } from "./codec";
|
|
3
|
-
import { QueryBuilder } from "./query";
|
|
4
|
-
export class TxContext {
|
|
5
|
-
beginTs;
|
|
6
|
-
db;
|
|
7
|
-
readSet = [];
|
|
8
|
-
writeSet = [];
|
|
9
|
-
models = new Map();
|
|
10
|
-
getOrCreateModel(schema) {
|
|
11
|
-
const existing = this.models.get(schema.table);
|
|
12
|
-
if (existing)
|
|
13
|
-
return existing;
|
|
14
|
-
const shape = schema.schema.shape;
|
|
15
|
-
const customColumns = schema.columns;
|
|
16
|
-
const columns = {};
|
|
17
|
-
const types = {};
|
|
18
|
-
const codecs = {};
|
|
19
|
-
const schemaCodecs = schema.columnsOptions.codecs ?? {};
|
|
20
|
-
for (const key of Object.keys(shape)) {
|
|
21
|
-
columns[key] = customColumns?.[key] ?? key;
|
|
22
|
-
const field = shape[key];
|
|
23
|
-
const baseField = unwrapZodType(field);
|
|
24
|
-
if (baseField instanceof z.ZodNumber) {
|
|
25
|
-
types[key] = "integer";
|
|
26
|
-
}
|
|
27
|
-
else if (baseField instanceof z.ZodString) {
|
|
28
|
-
types[key] = "string";
|
|
29
|
-
}
|
|
30
|
-
else if (baseField instanceof z.ZodBoolean) {
|
|
31
|
-
types[key] = "boolean";
|
|
32
|
-
}
|
|
33
|
-
else if (baseField instanceof z.ZodArray) {
|
|
34
|
-
types[key] = "array";
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
types[key] = "json";
|
|
38
|
-
}
|
|
39
|
-
codecs[key] = normalizeCodec(schemaCodecs[key], baseField);
|
|
40
|
-
}
|
|
41
|
-
const model = {
|
|
42
|
-
table: schema.table,
|
|
43
|
-
tableId: schema.tableId,
|
|
44
|
-
columns,
|
|
45
|
-
reverseColumns: Object.fromEntries(Object.entries(columns).map(([k, v]) => [v, k])),
|
|
46
|
-
types,
|
|
47
|
-
codecs,
|
|
48
|
-
};
|
|
49
|
-
this.models.set(schema.table, model);
|
|
50
|
-
return model;
|
|
51
|
-
}
|
|
52
|
-
constructor(db, beginTs) {
|
|
53
|
-
this.db = db;
|
|
54
|
-
this.beginTs = beginTs;
|
|
55
|
-
}
|
|
56
|
-
internalGetReadSet() { return this.readSet; }
|
|
57
|
-
internalGetWriteSet() { return this.writeSet; }
|
|
58
|
-
findPendingWrite(table, id) {
|
|
59
|
-
return this.writeSet.find(w => w.table === table && w.id === id);
|
|
60
|
-
}
|
|
61
|
-
findPendingInsert(table, id) {
|
|
62
|
-
return this.writeSet.find(w => w.table === table && w.id === id && w.op === "insert");
|
|
63
|
-
}
|
|
64
|
-
encodeWithCodec(model, property, value) {
|
|
65
|
-
const codec = model.codecs[property];
|
|
66
|
-
if (!codec?.encode || value === undefined || value === null)
|
|
67
|
-
return value;
|
|
68
|
-
return codec.encode(value);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
export class DbReader extends TxContext {
|
|
72
|
-
query(schema) {
|
|
73
|
-
const model = this.getOrCreateModel(schema);
|
|
74
|
-
return new QueryBuilder(this, model);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
export class DbWriter extends DbReader {
|
|
78
|
-
async insert(schema, id, data) {
|
|
79
|
-
const model = this.getOrCreateModel(schema);
|
|
80
|
-
const mappedData = { id };
|
|
81
|
-
const shape = schema.schema.shape;
|
|
82
|
-
for (const key of Object.keys(shape)) {
|
|
83
|
-
let value = data[key];
|
|
84
|
-
if (value === undefined) {
|
|
85
|
-
const field = shape[key];
|
|
86
|
-
if (field instanceof z.ZodDefault) {
|
|
87
|
-
const defaultVal = field.def.defaultValue;
|
|
88
|
-
value = (typeof defaultVal === "function" ? defaultVal() : defaultVal);
|
|
89
|
-
if (value !== undefined) {
|
|
90
|
-
const columnName = model.columns[key] ?? key;
|
|
91
|
-
mappedData[columnName] = this.encodeWithCodec(model, key, value);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
const columnName = model.columns[key] ?? key;
|
|
97
|
-
mappedData[columnName] = this.encodeWithCodec(model, key, value);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
// ensure id same
|
|
101
|
-
mappedData["id"] = id;
|
|
102
|
-
// Check for existing pending write for the same ID
|
|
103
|
-
const existing = this.findPendingWrite(schema.table, id);
|
|
104
|
-
if (existing) {
|
|
105
|
-
if (existing.op === "delete") {
|
|
106
|
-
// If there's a pending delete, change it to an update with the new data
|
|
107
|
-
existing.op = "update";
|
|
108
|
-
existing.data = mappedData;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
// If there's a pending update or same insert with the same ID , merge the new data
|
|
112
|
-
existing.data = { ...existing.data, ...mappedData };
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
this.writeSet.push({ table: schema.table, tableId: schema.tableId, id: id, op: "insert", data: mappedData });
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
async update(schema, id, data) {
|
|
120
|
-
const model = this.getOrCreateModel(schema);
|
|
121
|
-
const mappedData = {};
|
|
122
|
-
for (const [key, value] of Object.entries(data)) {
|
|
123
|
-
const columnName = model.columns[key] ?? key;
|
|
124
|
-
mappedData[columnName] = this.encodeWithCodec(model, key, value);
|
|
125
|
-
}
|
|
126
|
-
const existing = this.findPendingWrite(schema.table, id);
|
|
127
|
-
if (existing) {
|
|
128
|
-
existing.op = existing.op === "insert" ? "insert" : "update";
|
|
129
|
-
existing.data = { ...existing.data, ...mappedData };
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
// expectedTs will be filled by the committer via batch fetch if not known yet
|
|
133
|
-
this.writeSet.push({ table: schema.table, tableId: schema.tableId, id, op: "update", data: mappedData });
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
async delete(schema, id) {
|
|
137
|
-
// If there's a pending insert for the same ID, remove it instead of adding a delete
|
|
138
|
-
const existingInsert = this.findPendingInsert(schema.table, id);
|
|
139
|
-
if (existingInsert) {
|
|
140
|
-
this.writeSet = this.writeSet.filter(w => w !== existingInsert);
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
// expectedTs will be filled by the committer via batch fetch if not known yet
|
|
144
|
-
this.writeSet.push({ table: schema.table, tableId: schema.tableId, id, op: "delete" });
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
//# sourceMappingURL=context.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/db/context.ts"],"names":[],"mappings":"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"}
|
package/dist/src/db/db.d.ts
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { CacheLayer } from "../server";
|
|
2
|
-
import type { CommitLogEntry, PointRead, RawReadEntry } from "./types_db";
|
|
3
|
-
import { ReadEntry, WriteEntry } from "./types_db";
|
|
4
|
-
export interface DbQueryResult<T = any> {
|
|
5
|
-
rows: T[];
|
|
6
|
-
rowCount?: number | null;
|
|
7
|
-
}
|
|
8
|
-
export interface RawClient {
|
|
9
|
-
query<T = any>(sql: string, params?: unknown[]): Promise<DbQueryResult<T>>;
|
|
10
|
-
}
|
|
11
|
-
export interface PooledClient extends RawClient {
|
|
12
|
-
release(): void;
|
|
13
|
-
}
|
|
14
|
-
export type DbType = "postgres" | "mysql";
|
|
15
|
-
export interface PendingPointEntry {
|
|
16
|
-
entry: PointRead;
|
|
17
|
-
key: string;
|
|
18
|
-
}
|
|
19
|
-
export interface PreparedQuery {
|
|
20
|
-
sql: string;
|
|
21
|
-
params: unknown[] | unknown[][];
|
|
22
|
-
operation: "insertSingle" | "insertBatch" | "updateSingle" | "updateBatch" | "deleteSingle" | "deleteBatch" | "pointReadValidation" | "commit_logs";
|
|
23
|
-
table: string;
|
|
24
|
-
entryId?: unknown;
|
|
25
|
-
expectedTs?: bigint;
|
|
26
|
-
entries?: WriteEntry[];
|
|
27
|
-
pendingsEntry?: PendingPointEntry[];
|
|
28
|
-
}
|
|
29
|
-
export interface PreparedQueries {
|
|
30
|
-
commits: PreparedQuery[];
|
|
31
|
-
validateReadPoints?: PreparedQuery[];
|
|
32
|
-
hasRangeRead: boolean;
|
|
33
|
-
tableIds?: Uint8Array[];
|
|
34
|
-
rawReadSet?: RawReadEntry[];
|
|
35
|
-
}
|
|
36
|
-
export interface Database {
|
|
37
|
-
readonly dbType: DbType;
|
|
38
|
-
readonly sqlBuilder: SqlBuilder;
|
|
39
|
-
columnTypes: Map<string, Map<string, string>>;
|
|
40
|
-
migrationSql: string[];
|
|
41
|
-
bootstrapColumnTypes(opts: {
|
|
42
|
-
redis?: CacheLayer;
|
|
43
|
-
cacheKey: string;
|
|
44
|
-
tables?: string[];
|
|
45
|
-
}): Promise<void>;
|
|
46
|
-
query<T = any>(sql: string, params?: unknown[]): Promise<DbQueryResult<T>>;
|
|
47
|
-
getClient(): Promise<PooledClient>;
|
|
48
|
-
getTransactionClient(): Promise<TxDatabase>;
|
|
49
|
-
getLatestSnapshotTimestamp(): Promise<bigint>;
|
|
50
|
-
updateLatestSnapshotTimestamp(commitTs: bigint): Promise<void>;
|
|
51
|
-
getNextTimestamp(): Promise<bigint>;
|
|
52
|
-
prepareCommitWrites(readSet: ReadEntry[], writeSet: WriteEntry[], commitTs: LazyCommitTsParam): Promise<PreparedQueries>;
|
|
53
|
-
commitWrites(beginTs: bigint, queries: PreparedQueries, commitTs: bigint): Promise<{
|
|
54
|
-
success: boolean;
|
|
55
|
-
}>;
|
|
56
|
-
close(): Promise<void>;
|
|
57
|
-
/**
|
|
58
|
-
* Delete commit_logs older than `ts` (exclusive). Used by the periodic
|
|
59
|
-
* retention sweep in SubscriptionManager so the table doesn't grow
|
|
60
|
-
* unbounded.
|
|
61
|
-
*/
|
|
62
|
-
pruneCommitLogsBefore(ts: bigint): Promise<bigint>;
|
|
63
|
-
/**
|
|
64
|
-
* Half-open range scan: ts >= beginTs AND ts < endTs. Used by the
|
|
65
|
-
* subscription-recovery path to replay logs in a specific time window.
|
|
66
|
-
*/
|
|
67
|
-
getCommitLogsBetweenTs(beginTs: bigint, endTs: bigint, tableIds: Uint8Array[]): Promise<CommitLogEntry[]>;
|
|
68
|
-
/**
|
|
69
|
-
* Conflict-check scan for OCC: ts >= sinceTs AND ts <> excludeTs. The
|
|
70
|
-
* exclude is our own commitTs so we don't conflict with ourselves; the
|
|
71
|
-
* lack of an upper bound is intentional, so a concurrent peer that
|
|
72
|
-
* happens to have a higher commitTs but committed before us is still
|
|
73
|
-
* visible. (MVCC keeps in-flight peers invisible until they commit.)
|
|
74
|
-
*/
|
|
75
|
-
getCommitLogsSinceTs(sinceTs: bigint, excludeTs: bigint, tableIds: Uint8Array[]): Promise<CommitLogEntry[]>;
|
|
76
|
-
/**
|
|
77
|
-
* For each `update`/`delete` entry, attach `prevData` (consumed by the
|
|
78
|
-
* invalidator) and `expectedCommitTs` (the CAS fence).
|
|
79
|
-
*
|
|
80
|
-
* `expectedCommitTs` is preferentially copied from a prior point-read of
|
|
81
|
-
* the same row in `readSet` — that's the value the handler's logic
|
|
82
|
-
* actually depended on, so the CAS check enforces beginTs-level isolation
|
|
83
|
-
* for read-then-update patterns. If no prior read exists ("blind"
|
|
84
|
-
* write), we fall back to the value observed in this batch fetch (weak
|
|
85
|
-
* OCC, sufficient for writes that don't depend on prior state).
|
|
86
|
-
*
|
|
87
|
-
* `prevData` always comes from this batch fetch (SELECT * per table) so
|
|
88
|
-
* the invalidator has the full row regardless of which columns the
|
|
89
|
-
* handler's read selected.
|
|
90
|
-
*
|
|
91
|
-
* If the target row no longer exists at fetch time, `expectedCommitTs`
|
|
92
|
-
* is left undefined and the per-row CAS will match nothing — surfaced
|
|
93
|
-
* as OccConflictError.
|
|
94
|
-
*/
|
|
95
|
-
attachPrevDataToWriteSet(writeSet: WriteEntry[], readSet: ReadEntry[]): Promise<void>;
|
|
96
|
-
}
|
|
97
|
-
export interface TxDatabase extends Database {
|
|
98
|
-
begin(): Promise<void>;
|
|
99
|
-
commit(): Promise<void>;
|
|
100
|
-
rollback(): Promise<void>;
|
|
101
|
-
release(): void;
|
|
102
|
-
}
|
|
103
|
-
export interface JsonOpOptions {
|
|
104
|
-
/**
|
|
105
|
-
* When true, the bound `value` parameter is treated as already prepared
|
|
106
|
-
* for the underlying SQL (e.g. a literal JSON path string for
|
|
107
|
-
* jsonHasKey, a JSON-encoded literal for the contains family). When
|
|
108
|
-
* false/omitted, the value was prepared client-side from a JS value.
|
|
109
|
-
*/
|
|
110
|
-
raw?: boolean;
|
|
111
|
-
/**
|
|
112
|
-
* 1-based positional index of an extra bound parameter holding a
|
|
113
|
-
* jsonpath that scopes the contains-family check to a sub-document of
|
|
114
|
-
* the target column. When omitted, the check runs against the whole
|
|
115
|
-
* column value.
|
|
116
|
-
*/
|
|
117
|
-
pathIndex?: number;
|
|
118
|
-
/**
|
|
119
|
-
* jsonHasKey only: when set, multiple path parameters are bound starting
|
|
120
|
-
* at `paramIndex`, and the predicate evaluates whether any (`one`) or
|
|
121
|
-
* every (`all`) path exists in the column.
|
|
122
|
-
*/
|
|
123
|
-
mode?: "one" | "all";
|
|
124
|
-
/** Number of bound path parameters in multi-path mode. */
|
|
125
|
-
pathCount?: number;
|
|
126
|
-
}
|
|
127
|
-
export interface SqlBuilder {
|
|
128
|
-
placeholder(index: number): string;
|
|
129
|
-
like(col: string, paramIndex: number): string;
|
|
130
|
-
ilike(col: string, paramIndex: number): string;
|
|
131
|
-
icontains(col: string, paramIndex: number): string;
|
|
132
|
-
/** PG @> ; MySQL JSON_CONTAINS */
|
|
133
|
-
jsonContains(col: string, paramIndex: number, opts?: JsonOpOptions): string;
|
|
134
|
-
/** PG <@ ; MySQL JSON_CONTAINS(candidate, target) */
|
|
135
|
-
jsonContainedBy(col: string, paramIndex: number, opts?: JsonOpOptions): string;
|
|
136
|
-
/**
|
|
137
|
-
* Key/path existence. With `opts.raw === true`, the bound param is a JSON
|
|
138
|
-
* path expression (PG `jsonb_path_exists`, MySQL `JSON_CONTAINS_PATH`).
|
|
139
|
-
* Otherwise the bound param is a literal top-level key (PG `?`, MySQL
|
|
140
|
-
* `JSON_CONTAINS_PATH($."<key>")` with server-side quoting).
|
|
141
|
-
* With `opts.pathCount` set, emits the multi-path form keyed by `mode`.
|
|
142
|
-
*/
|
|
143
|
-
jsonHasKey(col: string, paramIndex: number, opts?: JsonOpOptions): string;
|
|
144
|
-
/** Array membership: target array contains the given element. */
|
|
145
|
-
jsonArrayContains(col: string, paramIndex: number, opts?: JsonOpOptions): string;
|
|
146
|
-
}
|
|
147
|
-
export declare class LazyCommitTsParam {
|
|
148
|
-
value: unknown;
|
|
149
|
-
constructor(value: unknown);
|
|
150
|
-
toPostgres(prepareValue: (value: any) => any): any;
|
|
151
|
-
toString(): any;
|
|
152
|
-
validate(): void;
|
|
153
|
-
}
|
|
154
|
-
//# sourceMappingURL=db.d.ts.map
|
package/dist/src/db/db.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/db/db.ts"],"names":[],"mappings":"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"}
|
package/dist/src/db/db.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
;
|
|
2
|
-
export class LazyCommitTsParam {
|
|
3
|
-
value;
|
|
4
|
-
constructor(value) {
|
|
5
|
-
this.value = value;
|
|
6
|
-
}
|
|
7
|
-
// used by postgres
|
|
8
|
-
toPostgres(prepareValue) {
|
|
9
|
-
return prepareValue(this.value);
|
|
10
|
-
}
|
|
11
|
-
// used by mysql
|
|
12
|
-
toString() {
|
|
13
|
-
return this.value.toString();
|
|
14
|
-
}
|
|
15
|
-
validate() {
|
|
16
|
-
const p = new LazyCommitTsParam(undefined);
|
|
17
|
-
const hasNotObjConstructor = p.constructor !== Object;
|
|
18
|
-
const hasNotToJSON = typeof p.toJSON !== 'function';
|
|
19
|
-
console.log('constructor must not object', hasNotObjConstructor);
|
|
20
|
-
console.log('should not have toJSON', hasNotToJSON);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=db.js.map
|
package/dist/src/db/db.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/db/db.ts"],"names":[],"mappings":"AAkCC,CAAC;AAuHF,MAAM,OAAO,iBAAiB;IACT;IAAnB,YAAmB,KAAc;QAAd,UAAK,GAAL,KAAK,CAAS;IAAI,CAAC;IAEtC,mBAAmB;IACnB,UAAU,CAAC,YAAiC;QAC1C,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,gBAAgB;IAChB,QAAQ;QACN,OAAQ,IAAI,CAAC,KAAa,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,QAAQ;QACN,MAAM,CAAC,GAAG,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,oBAAoB,GAAG,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC;QACtD,MAAM,YAAY,GAAG,OAAQ,CAAS,CAAC,MAAM,KAAK,UAAU,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,oBAAoB,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC;CACF"}
|
package/dist/src/db/mysql.d.ts
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { Pool, PoolConnection, PoolOptions } from "mysql2/promise";
|
|
2
|
-
import { Database, DbQueryResult, DbType, LazyCommitTsParam, PooledClient, PreparedQueries, SqlBuilder, TxDatabase } from "./db";
|
|
3
|
-
import { CommitLogEntry, ReadEntry, WriteEntry } from "./types_db";
|
|
4
|
-
import { CacheLayer } from "../server";
|
|
5
|
-
import { Logger } from "pino";
|
|
6
|
-
interface QueryConnection {
|
|
7
|
-
query(opts: {
|
|
8
|
-
sql: string;
|
|
9
|
-
timeout?: number;
|
|
10
|
-
values?: unknown[];
|
|
11
|
-
}): Promise<[any[], unknown]>;
|
|
12
|
-
query(sql: string, params?: unknown[]): Promise<[any[], unknown]>;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* mysql2's PoolOptions does not have a per-statement timeout field; we
|
|
16
|
-
* carry our own. Set 0 to disable.
|
|
17
|
-
*/
|
|
18
|
-
export type MySqlPoolOptions = PoolOptions & {
|
|
19
|
-
queryTimeoutMs?: number;
|
|
20
|
-
};
|
|
21
|
-
export declare class MySqlDatabase implements Database {
|
|
22
|
-
constructor(logger: Logger, config: MySqlPoolOptions, pool?: Pool | undefined);
|
|
23
|
-
private logger;
|
|
24
|
-
config: PoolOptions;
|
|
25
|
-
protected queryTimeoutMs: number;
|
|
26
|
-
private pool;
|
|
27
|
-
readonly dbType: DbType;
|
|
28
|
-
readonly sqlBuilder: SqlBuilder;
|
|
29
|
-
columnTypes: Map<string, Map<string, string>>;
|
|
30
|
-
protected sqlCache: Map<string, string>;
|
|
31
|
-
/**
|
|
32
|
-
* Fetches actual column types from MySQL for `table` and returns a
|
|
33
|
-
* map of DB column name → MySQL type string (as produced by `COLUMN_TYPE`,
|
|
34
|
-
* e.g. `bigint`, `integer`, `varchar(32)`, `text`, `json`).
|
|
35
|
-
* No caching here — see {@link getColumnTypes} for the cached path.
|
|
36
|
-
*/
|
|
37
|
-
loadColumnTypesFromMySql(table: string): Promise<Map<string, string>>;
|
|
38
|
-
/**
|
|
39
|
-
* Synchronous column-type lookup. The apply path calls this on every
|
|
40
|
-
* batched write, so it can't await — populate the cache via
|
|
41
|
-
* {@link bootstrapColumnTypes} at server start. Throws if `table` is
|
|
42
|
-
* missing (programmer error / bootstrap skipped).
|
|
43
|
-
*/
|
|
44
|
-
getColumnTypes(table: string): Map<string, string> | null;
|
|
45
|
-
/**
|
|
46
|
-
* Eagerly load column types into the in-memory cache. With a Redis
|
|
47
|
-
* client supplied, attempts the cache key first and falls through to
|
|
48
|
-
* MySQL on miss (writing the result back to Redis). This is the
|
|
49
|
-
* "one server queries MySQL, the rest read from Redis" pattern for cold
|
|
50
|
-
* starts in a multi-instance deploy. Without Redis, always queries MySQL.
|
|
51
|
-
*
|
|
52
|
-
* Pass `tables` to limit the load to a specific list; otherwise every
|
|
53
|
-
* user table in the connected database is loaded.
|
|
54
|
-
*
|
|
55
|
-
* The Redis cache key should encode whatever invalidates types in your
|
|
56
|
-
* environment (typically a schema version / deploy version). The
|
|
57
|
-
* subscriber in supalive-server.ts is expected to publish a reload
|
|
58
|
-
* signal after migrations and invoke {@link invalidateColumnTypes}.
|
|
59
|
-
*/
|
|
60
|
-
bootstrapColumnTypes(opts: {
|
|
61
|
-
redis?: CacheLayer;
|
|
62
|
-
cacheKey: string;
|
|
63
|
-
tables?: string[];
|
|
64
|
-
}): Promise<void>;
|
|
65
|
-
/**
|
|
66
|
-
* Invalidate cached types (and dependent SQL) for `table`, or the entire
|
|
67
|
-
* cache if `table` is omitted. The Redis-pubsub reload signal in
|
|
68
|
-
* supalive-server.ts is expected to call this on schema changes.
|
|
69
|
-
*/
|
|
70
|
-
invalidateColumnTypes(table?: string): void;
|
|
71
|
-
/** Replace this instance's caches with shared references from a parent.
|
|
72
|
-
* Used by getTransactionClient so types loaded once at startup are
|
|
73
|
-
* visible inside transactions. */
|
|
74
|
-
adoptCaches(columnTypes: Map<string, Map<string, string>>, sqlCache: Map<string, string>): void;
|
|
75
|
-
/** Enumerate the user-defined tables in the connected database for mysql — used
|
|
76
|
-
* by bootstrapColumnTypes() when no explicit list is provided. */
|
|
77
|
-
private listUserTables;
|
|
78
|
-
migrationSql: string[];
|
|
79
|
-
query<T = any>(sql: string, params?: unknown[]): Promise<DbQueryResult<T>>;
|
|
80
|
-
getClient(): Promise<PooledClient>;
|
|
81
|
-
getTransactionClient(): Promise<TxDatabase>;
|
|
82
|
-
getLatestSnapshotTimestamp(): Promise<bigint>;
|
|
83
|
-
updateLatestSnapshotTimestamp(commitTs: bigint): Promise<void>;
|
|
84
|
-
getNextTimestamp(): Promise<bigint>;
|
|
85
|
-
attachPrevDataToWriteSet(writeSet: WriteEntry[], readSet: ReadEntry[]): Promise<void>;
|
|
86
|
-
prepareCommitWrites(readSet: ReadEntry[], writeSet: WriteEntry[], commitTs: LazyCommitTsParam): Promise<PreparedQueries>;
|
|
87
|
-
private mysqlPrepareBatchWrites;
|
|
88
|
-
private mysqlPrepareInsertBatch;
|
|
89
|
-
private mysqlPrepareUpdateSingle;
|
|
90
|
-
private mysqlPrepareDeleteBatch;
|
|
91
|
-
private mysqlPrepareCommitLogs;
|
|
92
|
-
/**
|
|
93
|
-
* Point-only OCC check. For each genuine point read, compare the row's
|
|
94
|
-
* current commit_ts against the value captured at read time. A `null`
|
|
95
|
-
* expectedCommitTs means "row didn't exist when we read"; any row found
|
|
96
|
-
* now is a conflict. Reads whose row is being written in this same txn
|
|
97
|
-
* are skipped — the CAS UPDATE/DELETE already validated those.
|
|
98
|
-
*/
|
|
99
|
-
private mysqlPrepareValidatePointReadsByCommitTs;
|
|
100
|
-
commitWrites(beginTs: bigint, queries: PreparedQueries, commitTs: bigint): Promise<{
|
|
101
|
-
success: boolean;
|
|
102
|
-
}>;
|
|
103
|
-
private mysqlApplyWrites;
|
|
104
|
-
private validatePointReadsByCommitTs;
|
|
105
|
-
pruneCommitLogsBefore(ts: bigint): Promise<bigint>;
|
|
106
|
-
getCommitLogsBetweenTs(beginTs: bigint, endTs: bigint, tableIds: Uint8Array[]): Promise<CommitLogEntry[]>;
|
|
107
|
-
getCommitLogsSinceTs(sinceTs: bigint, excludeTs: bigint, tableIds: Uint8Array[]): Promise<CommitLogEntry[]>;
|
|
108
|
-
close(): Promise<void>;
|
|
109
|
-
}
|
|
110
|
-
export declare class MySqlTxDatabase extends MySqlDatabase {
|
|
111
|
-
constructor(logger: Logger, config: MySqlPoolOptions, pool: Pool, client: PoolConnection & QueryConnection);
|
|
112
|
-
private client;
|
|
113
|
-
query<T = any>(sql: string, params?: unknown[]): Promise<DbQueryResult<T>>;
|
|
114
|
-
begin(): Promise<void>;
|
|
115
|
-
commit(): Promise<void>;
|
|
116
|
-
rollback(): Promise<void>;
|
|
117
|
-
release(): void;
|
|
118
|
-
}
|
|
119
|
-
export {};
|
|
120
|
-
//# sourceMappingURL=mysql.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../../src/db/mysql.ts"],"names":[],"mappings":"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"}
|