@syncular/client 0.0.1-60
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/blobs/index.d.ts +7 -0
- package/dist/blobs/index.d.ts.map +1 -0
- package/dist/blobs/index.js +7 -0
- package/dist/blobs/index.js.map +1 -0
- package/dist/blobs/manager.d.ts +345 -0
- package/dist/blobs/manager.d.ts.map +1 -0
- package/dist/blobs/manager.js +749 -0
- package/dist/blobs/manager.js.map +1 -0
- package/dist/blobs/migrate.d.ts +14 -0
- package/dist/blobs/migrate.d.ts.map +1 -0
- package/dist/blobs/migrate.js +59 -0
- package/dist/blobs/migrate.js.map +1 -0
- package/dist/blobs/types.d.ts +62 -0
- package/dist/blobs/types.d.ts.map +1 -0
- package/dist/blobs/types.js +5 -0
- package/dist/blobs/types.js.map +1 -0
- package/dist/client.d.ts +338 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +834 -0
- package/dist/client.js.map +1 -0
- package/dist/conflicts.d.ts +31 -0
- package/dist/conflicts.d.ts.map +1 -0
- package/dist/conflicts.js +118 -0
- package/dist/conflicts.js.map +1 -0
- package/dist/create-client.d.ts +115 -0
- package/dist/create-client.d.ts.map +1 -0
- package/dist/create-client.js +162 -0
- package/dist/create-client.js.map +1 -0
- package/dist/engine/SyncEngine.d.ts +215 -0
- package/dist/engine/SyncEngine.d.ts.map +1 -0
- package/dist/engine/SyncEngine.js +1066 -0
- package/dist/engine/SyncEngine.js.map +1 -0
- package/dist/engine/index.d.ts +6 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +6 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/types.d.ts +230 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +7 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/handlers/create-handler.d.ts +110 -0
- package/dist/handlers/create-handler.d.ts.map +1 -0
- package/dist/handlers/create-handler.js +140 -0
- package/dist/handlers/create-handler.js.map +1 -0
- package/dist/handlers/registry.d.ts +15 -0
- package/dist/handlers/registry.d.ts.map +1 -0
- package/dist/handlers/registry.js +29 -0
- package/dist/handlers/registry.js.map +1 -0
- package/dist/handlers/types.d.ts +83 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/types.js +5 -0
- package/dist/handlers/types.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/migrate.d.ts +19 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +106 -0
- package/dist/migrate.js.map +1 -0
- package/dist/mutations.d.ts +138 -0
- package/dist/mutations.d.ts.map +1 -0
- package/dist/mutations.js +611 -0
- package/dist/mutations.js.map +1 -0
- package/dist/outbox.d.ts +112 -0
- package/dist/outbox.d.ts.map +1 -0
- package/dist/outbox.js +304 -0
- package/dist/outbox.js.map +1 -0
- package/dist/plugins/incrementing-version.d.ts +34 -0
- package/dist/plugins/incrementing-version.d.ts.map +1 -0
- package/dist/plugins/incrementing-version.js +83 -0
- package/dist/plugins/incrementing-version.js.map +1 -0
- package/dist/plugins/index.d.ts +3 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/types.d.ts +49 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +15 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/proxy/connection.d.ts +33 -0
- package/dist/proxy/connection.d.ts.map +1 -0
- package/dist/proxy/connection.js +153 -0
- package/dist/proxy/connection.js.map +1 -0
- package/dist/proxy/dialect.d.ts +46 -0
- package/dist/proxy/dialect.d.ts.map +1 -0
- package/dist/proxy/dialect.js +58 -0
- package/dist/proxy/dialect.js.map +1 -0
- package/dist/proxy/driver.d.ts +42 -0
- package/dist/proxy/driver.d.ts.map +1 -0
- package/dist/proxy/driver.js +78 -0
- package/dist/proxy/driver.js.map +1 -0
- package/dist/proxy/index.d.ts +10 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +10 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/mutations.d.ts +9 -0
- package/dist/proxy/mutations.d.ts.map +1 -0
- package/dist/proxy/mutations.js +11 -0
- package/dist/proxy/mutations.js.map +1 -0
- package/dist/pull-engine.d.ts +45 -0
- package/dist/pull-engine.d.ts.map +1 -0
- package/dist/pull-engine.js +391 -0
- package/dist/pull-engine.js.map +1 -0
- package/dist/push-engine.d.ts +18 -0
- package/dist/push-engine.d.ts.map +1 -0
- package/dist/push-engine.js +155 -0
- package/dist/push-engine.js.map +1 -0
- package/dist/query/FingerprintCollector.d.ts +18 -0
- package/dist/query/FingerprintCollector.d.ts.map +1 -0
- package/dist/query/FingerprintCollector.js +28 -0
- package/dist/query/FingerprintCollector.js.map +1 -0
- package/dist/query/QueryContext.d.ts +33 -0
- package/dist/query/QueryContext.d.ts.map +1 -0
- package/dist/query/QueryContext.js +16 -0
- package/dist/query/QueryContext.js.map +1 -0
- package/dist/query/fingerprint.d.ts +61 -0
- package/dist/query/fingerprint.d.ts.map +1 -0
- package/dist/query/fingerprint.js +91 -0
- package/dist/query/fingerprint.js.map +1 -0
- package/dist/query/index.d.ts +7 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +7 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/tracked-select.d.ts +18 -0
- package/dist/query/tracked-select.d.ts.map +1 -0
- package/dist/query/tracked-select.js +90 -0
- package/dist/query/tracked-select.js.map +1 -0
- package/dist/schema.d.ts +83 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +7 -0
- package/dist/schema.js.map +1 -0
- package/dist/sync-loop.d.ts +32 -0
- package/dist/sync-loop.d.ts.map +1 -0
- package/dist/sync-loop.js +249 -0
- package/dist/sync-loop.js.map +1 -0
- package/dist/utils/id.d.ts +8 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +19 -0
- package/dist/utils/id.js.map +1 -0
- package/package.json +58 -0
- package/src/blobs/index.ts +7 -0
- package/src/blobs/manager.ts +1027 -0
- package/src/blobs/migrate.ts +67 -0
- package/src/blobs/types.ts +84 -0
- package/src/client.ts +1222 -0
- package/src/conflicts.ts +180 -0
- package/src/create-client.ts +297 -0
- package/src/engine/SyncEngine.ts +1337 -0
- package/src/engine/index.ts +6 -0
- package/src/engine/types.ts +268 -0
- package/src/handlers/create-handler.ts +287 -0
- package/src/handlers/registry.ts +36 -0
- package/src/handlers/types.ts +102 -0
- package/src/index.ts +25 -0
- package/src/migrate.ts +122 -0
- package/src/mutations.ts +926 -0
- package/src/outbox.ts +397 -0
- package/src/plugins/incrementing-version.ts +133 -0
- package/src/plugins/index.ts +2 -0
- package/src/plugins/types.ts +63 -0
- package/src/proxy/connection.ts +191 -0
- package/src/proxy/dialect.ts +76 -0
- package/src/proxy/driver.ts +126 -0
- package/src/proxy/index.ts +10 -0
- package/src/proxy/mutations.ts +18 -0
- package/src/pull-engine.ts +518 -0
- package/src/push-engine.ts +201 -0
- package/src/query/FingerprintCollector.ts +29 -0
- package/src/query/QueryContext.ts +54 -0
- package/src/query/fingerprint.ts +109 -0
- package/src/query/index.ts +10 -0
- package/src/query/tracked-select.ts +139 -0
- package/src/schema.ts +94 -0
- package/src/sync-loop.ts +368 -0
- package/src/utils/id.ts +20 -0
|
@@ -0,0 +1,611 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/client - Mutations API (Proxy-based, typed)
|
|
3
|
+
*
|
|
4
|
+
* Provides a dynamic `Proxy` mutation interface with Kysely typings:
|
|
5
|
+
* - `mutations.tasks.insert({ ... })` (auto-generates id)
|
|
6
|
+
* - `mutations.tasks.update(id, { ... })`
|
|
7
|
+
* - `mutations.tasks.delete(id)`
|
|
8
|
+
* - `mutations.$commit(async (tx) => { ... })` for batching
|
|
9
|
+
*
|
|
10
|
+
* Under the hood this compiles to sync `upsert/delete` operations.
|
|
11
|
+
*
|
|
12
|
+
* This module is framework-agnostic. `@syncular/client-react` wraps it to add
|
|
13
|
+
* React state and automatic sync triggering.
|
|
14
|
+
*/
|
|
15
|
+
import { sql } from 'kysely';
|
|
16
|
+
import { enqueueOutboxCommit } from './outbox';
|
|
17
|
+
function randomId() {
|
|
18
|
+
if (typeof crypto !== 'undefined' &&
|
|
19
|
+
typeof crypto.randomUUID === 'function') {
|
|
20
|
+
return crypto.randomUUID();
|
|
21
|
+
}
|
|
22
|
+
// Very small fallback; good enough for tests.
|
|
23
|
+
return `${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
24
|
+
}
|
|
25
|
+
function isRecord(value) {
|
|
26
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
27
|
+
}
|
|
28
|
+
function sanitizePayload(payload, args) {
|
|
29
|
+
if (args.omit.length === 0)
|
|
30
|
+
return payload;
|
|
31
|
+
const omitSet = new Set(args.omit);
|
|
32
|
+
let changed = false;
|
|
33
|
+
const out = {};
|
|
34
|
+
for (const [k, v] of Object.entries(payload)) {
|
|
35
|
+
if (omitSet.has(k)) {
|
|
36
|
+
changed = true;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
out[k] = v;
|
|
40
|
+
}
|
|
41
|
+
return changed ? out : payload;
|
|
42
|
+
}
|
|
43
|
+
function coerceBaseVersion(value) {
|
|
44
|
+
if (value === null || value === undefined)
|
|
45
|
+
return null;
|
|
46
|
+
const n = typeof value === 'number' ? value : Number(value);
|
|
47
|
+
if (!Number.isFinite(n))
|
|
48
|
+
return null;
|
|
49
|
+
if (n <= 0)
|
|
50
|
+
return null;
|
|
51
|
+
return n;
|
|
52
|
+
}
|
|
53
|
+
function hasOwn(obj, key) {
|
|
54
|
+
return Object.hasOwn(obj, key);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Valid SQL identifier regex.
|
|
58
|
+
* Allows: alphanumeric, underscore, cannot start with digit
|
|
59
|
+
*/
|
|
60
|
+
const VALID_IDENTIFIER_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
61
|
+
/**
|
|
62
|
+
* Validate table name to prevent SQL injection.
|
|
63
|
+
* Table names are inserted directly into SQL, so they must be validated.
|
|
64
|
+
*/
|
|
65
|
+
function validateTableName(table) {
|
|
66
|
+
if (!VALID_IDENTIFIER_REGEX.test(table)) {
|
|
67
|
+
throw new Error(`Invalid table name "${table}". Table names must match /^[a-zA-Z_][a-zA-Z0-9_]*$/`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Internal helpers for dynamic table operations.
|
|
72
|
+
*
|
|
73
|
+
* Kysely's query builder is typed around compile-time table names. For the
|
|
74
|
+
* Proxy-based mutations API, we need runtime table/column names. We use
|
|
75
|
+
* Kysely's `sql` builder with strict identifier validation to avoid unsafe
|
|
76
|
+
* `any`/`unknown` casts while keeping the public API typed.
|
|
77
|
+
*/
|
|
78
|
+
function validateColumnName(column) {
|
|
79
|
+
if (!VALID_IDENTIFIER_REGEX.test(column)) {
|
|
80
|
+
throw new Error(`Invalid column name "${column}". Column names must match /^[a-zA-Z_][a-zA-Z0-9_]*$/`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function readBaseVersion(args) {
|
|
84
|
+
validateTableName(args.table);
|
|
85
|
+
validateColumnName(args.idColumn);
|
|
86
|
+
validateColumnName(args.versionColumn);
|
|
87
|
+
const res = await sql `
|
|
88
|
+
select ${sql.ref(args.versionColumn)} as v
|
|
89
|
+
from ${sql.table(args.table)}
|
|
90
|
+
where ${sql.ref(args.idColumn)} = ${sql.val(args.rowId)}
|
|
91
|
+
limit 1
|
|
92
|
+
`.execute(args.trx);
|
|
93
|
+
return coerceBaseVersion(res.rows[0]?.v);
|
|
94
|
+
}
|
|
95
|
+
async function dynamicInsert(trx, table, values) {
|
|
96
|
+
validateTableName(table);
|
|
97
|
+
const rows = Array.isArray(values) ? values : [values];
|
|
98
|
+
if (rows.length === 0)
|
|
99
|
+
return;
|
|
100
|
+
const columnsSet = new Set();
|
|
101
|
+
for (const row of rows) {
|
|
102
|
+
for (const col of Object.keys(row)) {
|
|
103
|
+
validateColumnName(col);
|
|
104
|
+
columnsSet.add(col);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const columns = Array.from(columnsSet);
|
|
108
|
+
if (columns.length === 0)
|
|
109
|
+
return;
|
|
110
|
+
await sql `
|
|
111
|
+
insert into ${sql.table(table)} (${sql.join(columns.map((c) => sql.ref(c)))})
|
|
112
|
+
values ${sql.join(rows.map((row) => sql `(${sql.join(columns.map((c) => sql.val(row[c] ?? null)))})`))}
|
|
113
|
+
`.execute(trx);
|
|
114
|
+
}
|
|
115
|
+
async function dynamicUpsert(trx, table, idColumn, id, values) {
|
|
116
|
+
validateTableName(table);
|
|
117
|
+
validateColumnName(idColumn);
|
|
118
|
+
// Check if the row already exists
|
|
119
|
+
const existing = await sql `
|
|
120
|
+
select 1 from ${sql.table(table)}
|
|
121
|
+
where ${sql.ref(idColumn)} = ${sql.val(id)}
|
|
122
|
+
limit 1
|
|
123
|
+
`.execute(trx);
|
|
124
|
+
if (existing.rows.length > 0) {
|
|
125
|
+
// Row exists: just update the provided columns
|
|
126
|
+
await dynamicUpdate(trx, table, idColumn, id, values);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// Row doesn't exist: insert with all provided columns + id
|
|
130
|
+
await dynamicInsert(trx, table, { ...values, [idColumn]: id });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function dynamicUpdate(trx, table, idColumn, id, values) {
|
|
134
|
+
validateTableName(table);
|
|
135
|
+
validateColumnName(idColumn);
|
|
136
|
+
const setParts = Object.entries(values).map(([col, value]) => {
|
|
137
|
+
validateColumnName(col);
|
|
138
|
+
return sql `${sql.ref(col)} = ${sql.val(value)}`;
|
|
139
|
+
});
|
|
140
|
+
if (setParts.length === 0)
|
|
141
|
+
return;
|
|
142
|
+
await sql `
|
|
143
|
+
update ${sql.table(table)}
|
|
144
|
+
set ${sql.join(setParts)}
|
|
145
|
+
where ${sql.ref(idColumn)} = ${sql.val(id)}
|
|
146
|
+
`.execute(trx);
|
|
147
|
+
}
|
|
148
|
+
async function dynamicDelete(trx, table, idColumn, id) {
|
|
149
|
+
validateTableName(table);
|
|
150
|
+
validateColumnName(idColumn);
|
|
151
|
+
await sql `
|
|
152
|
+
delete from ${sql.table(table)}
|
|
153
|
+
where ${sql.ref(idColumn)} = ${sql.val(id)}
|
|
154
|
+
`.execute(trx);
|
|
155
|
+
}
|
|
156
|
+
export function createMutationsApi(commit) {
|
|
157
|
+
const rootTableCache = new Map();
|
|
158
|
+
const apiBase = {
|
|
159
|
+
$commit: async (fn, options) => {
|
|
160
|
+
const { result, receipt } = await commit(fn, options);
|
|
161
|
+
return { result, commit: receipt };
|
|
162
|
+
},
|
|
163
|
+
$table: (table) => {
|
|
164
|
+
const cached = rootTableCache.get(table);
|
|
165
|
+
if (cached)
|
|
166
|
+
return cached;
|
|
167
|
+
const tableApi = {
|
|
168
|
+
async insert(values) {
|
|
169
|
+
const { result, receipt } = await commit(async (tx) => await tx[table].insert(values));
|
|
170
|
+
return { ...receipt, id: result };
|
|
171
|
+
},
|
|
172
|
+
async insertMany(rows) {
|
|
173
|
+
const { result, receipt } = await commit(async (tx) => await tx[table].insertMany(rows));
|
|
174
|
+
return { ...receipt, ids: result };
|
|
175
|
+
},
|
|
176
|
+
async update(id, patch, opts) {
|
|
177
|
+
const { receipt } = await commit(async (tx) => {
|
|
178
|
+
await tx[table].update(id, patch, opts);
|
|
179
|
+
return null;
|
|
180
|
+
});
|
|
181
|
+
return receipt;
|
|
182
|
+
},
|
|
183
|
+
async delete(id, opts) {
|
|
184
|
+
const { receipt } = await commit(async (tx) => {
|
|
185
|
+
await tx[table].delete(id, opts);
|
|
186
|
+
return null;
|
|
187
|
+
});
|
|
188
|
+
return receipt;
|
|
189
|
+
},
|
|
190
|
+
async upsert(id, patch, opts) {
|
|
191
|
+
const { receipt } = await commit(async (tx) => {
|
|
192
|
+
await tx[table].upsert(id, patch, opts);
|
|
193
|
+
return null;
|
|
194
|
+
});
|
|
195
|
+
return receipt;
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
rootTableCache.set(table, tableApi);
|
|
199
|
+
return tableApi;
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
return new Proxy(apiBase, {
|
|
203
|
+
get(target, prop) {
|
|
204
|
+
if (prop === 'then')
|
|
205
|
+
return undefined;
|
|
206
|
+
if (typeof prop !== 'string')
|
|
207
|
+
return undefined;
|
|
208
|
+
if (hasOwn(target, prop)) {
|
|
209
|
+
return target[prop];
|
|
210
|
+
}
|
|
211
|
+
return target.$table(prop);
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
export function createOutboxCommit(config) {
|
|
216
|
+
const idColumn = config.idColumn ?? 'id';
|
|
217
|
+
const versionColumn = config.versionColumn ?? 'server_version';
|
|
218
|
+
const omitColumns = config.omitColumns ?? [];
|
|
219
|
+
return async (fn) => {
|
|
220
|
+
const operations = [];
|
|
221
|
+
const localMutations = [];
|
|
222
|
+
const { result, receipt } = await config.db
|
|
223
|
+
.transaction()
|
|
224
|
+
.execute(async (trx) => {
|
|
225
|
+
const txTableCache = new Map();
|
|
226
|
+
const makeTxTable = (table) => {
|
|
227
|
+
const cached = txTableCache.get(table);
|
|
228
|
+
if (cached)
|
|
229
|
+
return cached;
|
|
230
|
+
const tableApi = {
|
|
231
|
+
async insert(values) {
|
|
232
|
+
const raw = isRecord(values) ? values : {};
|
|
233
|
+
const rawId = raw[idColumn];
|
|
234
|
+
const id = typeof rawId === 'string' && rawId ? rawId : randomId();
|
|
235
|
+
const row = { ...raw, [idColumn]: id };
|
|
236
|
+
await dynamicInsert(trx, table, row);
|
|
237
|
+
const payload = sanitizePayload(row, {
|
|
238
|
+
omit: [
|
|
239
|
+
idColumn,
|
|
240
|
+
...(versionColumn ? [versionColumn] : []),
|
|
241
|
+
...omitColumns,
|
|
242
|
+
],
|
|
243
|
+
});
|
|
244
|
+
operations.push({
|
|
245
|
+
table: table,
|
|
246
|
+
row_id: id,
|
|
247
|
+
op: 'upsert',
|
|
248
|
+
payload,
|
|
249
|
+
base_version: null,
|
|
250
|
+
});
|
|
251
|
+
localMutations.push({ table, rowId: id, op: 'upsert' });
|
|
252
|
+
return id;
|
|
253
|
+
},
|
|
254
|
+
async insertMany(rows) {
|
|
255
|
+
const ids = [];
|
|
256
|
+
const toInsert = [];
|
|
257
|
+
for (const values of rows) {
|
|
258
|
+
const raw = isRecord(values) ? values : {};
|
|
259
|
+
const rawId = raw[idColumn];
|
|
260
|
+
const id = typeof rawId === 'string' && rawId ? rawId : randomId();
|
|
261
|
+
ids.push(id);
|
|
262
|
+
toInsert.push({ ...raw, [idColumn]: id });
|
|
263
|
+
}
|
|
264
|
+
if (toInsert.length > 0) {
|
|
265
|
+
await dynamicInsert(trx, table, toInsert);
|
|
266
|
+
}
|
|
267
|
+
for (let i = 0; i < toInsert.length; i++) {
|
|
268
|
+
const row = toInsert[i];
|
|
269
|
+
const id = ids[i];
|
|
270
|
+
const payload = sanitizePayload(row, {
|
|
271
|
+
omit: [
|
|
272
|
+
idColumn,
|
|
273
|
+
...(versionColumn ? [versionColumn] : []),
|
|
274
|
+
...omitColumns,
|
|
275
|
+
],
|
|
276
|
+
});
|
|
277
|
+
operations.push({
|
|
278
|
+
table: table,
|
|
279
|
+
row_id: id,
|
|
280
|
+
op: 'upsert',
|
|
281
|
+
payload,
|
|
282
|
+
base_version: null,
|
|
283
|
+
});
|
|
284
|
+
localMutations.push({ table, rowId: id, op: 'upsert' });
|
|
285
|
+
}
|
|
286
|
+
return ids;
|
|
287
|
+
},
|
|
288
|
+
async update(id, patch, opts) {
|
|
289
|
+
const rawPatch = isRecord(patch) ? patch : {};
|
|
290
|
+
const sanitized = sanitizePayload(rawPatch, {
|
|
291
|
+
omit: [
|
|
292
|
+
idColumn,
|
|
293
|
+
...(versionColumn ? [versionColumn] : []),
|
|
294
|
+
...omitColumns,
|
|
295
|
+
],
|
|
296
|
+
});
|
|
297
|
+
const hasExplicitBaseVersion = !!opts && hasOwn(opts, 'baseVersion');
|
|
298
|
+
await dynamicUpdate(trx, table, idColumn, id, sanitized);
|
|
299
|
+
const baseVersion = hasExplicitBaseVersion
|
|
300
|
+
? (opts.baseVersion ?? null)
|
|
301
|
+
: versionColumn
|
|
302
|
+
? await readBaseVersion({
|
|
303
|
+
trx: trx,
|
|
304
|
+
table,
|
|
305
|
+
rowId: id,
|
|
306
|
+
idColumn,
|
|
307
|
+
versionColumn,
|
|
308
|
+
})
|
|
309
|
+
: null;
|
|
310
|
+
operations.push({
|
|
311
|
+
table: table,
|
|
312
|
+
row_id: id,
|
|
313
|
+
op: 'upsert',
|
|
314
|
+
payload: sanitized,
|
|
315
|
+
base_version: coerceBaseVersion(baseVersion),
|
|
316
|
+
});
|
|
317
|
+
localMutations.push({ table, rowId: id, op: 'upsert' });
|
|
318
|
+
},
|
|
319
|
+
async delete(id, opts) {
|
|
320
|
+
const hasExplicitBaseVersion = !!opts && hasOwn(opts, 'baseVersion');
|
|
321
|
+
const baseVersion = hasExplicitBaseVersion
|
|
322
|
+
? (opts.baseVersion ?? null)
|
|
323
|
+
: versionColumn
|
|
324
|
+
? await readBaseVersion({
|
|
325
|
+
trx: trx,
|
|
326
|
+
table,
|
|
327
|
+
rowId: id,
|
|
328
|
+
idColumn,
|
|
329
|
+
versionColumn,
|
|
330
|
+
})
|
|
331
|
+
: null;
|
|
332
|
+
await dynamicDelete(trx, table, idColumn, id);
|
|
333
|
+
operations.push({
|
|
334
|
+
table: table,
|
|
335
|
+
row_id: id,
|
|
336
|
+
op: 'delete',
|
|
337
|
+
payload: null,
|
|
338
|
+
base_version: coerceBaseVersion(baseVersion),
|
|
339
|
+
});
|
|
340
|
+
localMutations.push({ table, rowId: id, op: 'delete' });
|
|
341
|
+
},
|
|
342
|
+
async upsert(id, patch, opts) {
|
|
343
|
+
const rawPatch = isRecord(patch) ? patch : {};
|
|
344
|
+
const sanitized = sanitizePayload(rawPatch, {
|
|
345
|
+
omit: [
|
|
346
|
+
idColumn,
|
|
347
|
+
...(versionColumn ? [versionColumn] : []),
|
|
348
|
+
...omitColumns,
|
|
349
|
+
],
|
|
350
|
+
});
|
|
351
|
+
const hasExplicitBaseVersion = !!opts && hasOwn(opts, 'baseVersion');
|
|
352
|
+
await dynamicUpsert(trx, table, idColumn, id, sanitized);
|
|
353
|
+
const baseVersion = hasExplicitBaseVersion
|
|
354
|
+
? (opts.baseVersion ?? null)
|
|
355
|
+
: versionColumn
|
|
356
|
+
? await readBaseVersion({
|
|
357
|
+
trx: trx,
|
|
358
|
+
table,
|
|
359
|
+
rowId: id,
|
|
360
|
+
idColumn,
|
|
361
|
+
versionColumn,
|
|
362
|
+
})
|
|
363
|
+
: null;
|
|
364
|
+
operations.push({
|
|
365
|
+
table: table,
|
|
366
|
+
row_id: id,
|
|
367
|
+
op: 'upsert',
|
|
368
|
+
payload: sanitized,
|
|
369
|
+
base_version: coerceBaseVersion(baseVersion),
|
|
370
|
+
});
|
|
371
|
+
localMutations.push({ table, rowId: id, op: 'upsert' });
|
|
372
|
+
},
|
|
373
|
+
};
|
|
374
|
+
txTableCache.set(table, tableApi);
|
|
375
|
+
return tableApi;
|
|
376
|
+
};
|
|
377
|
+
const txProxy = new Proxy({}, {
|
|
378
|
+
get(_target, prop) {
|
|
379
|
+
if (prop === 'then')
|
|
380
|
+
return undefined;
|
|
381
|
+
if (typeof prop !== 'string')
|
|
382
|
+
return undefined;
|
|
383
|
+
return makeTxTable(prop);
|
|
384
|
+
},
|
|
385
|
+
});
|
|
386
|
+
const result = await fn(txProxy);
|
|
387
|
+
if (operations.length === 0) {
|
|
388
|
+
throw new Error('No mutations were enqueued');
|
|
389
|
+
}
|
|
390
|
+
// Enqueue outbox commit within this transaction
|
|
391
|
+
const receipt = await enqueueOutboxCommit(trx, { operations });
|
|
392
|
+
return {
|
|
393
|
+
result,
|
|
394
|
+
receipt: { id: receipt.id, clientCommitId: receipt.clientCommitId },
|
|
395
|
+
};
|
|
396
|
+
});
|
|
397
|
+
return {
|
|
398
|
+
result,
|
|
399
|
+
receipt: { commitId: receipt.id, clientCommitId: receipt.clientCommitId },
|
|
400
|
+
meta: { operations, localMutations },
|
|
401
|
+
};
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
export function createOutboxMutations(config) {
|
|
405
|
+
return createMutationsApi(createOutboxCommit(config));
|
|
406
|
+
}
|
|
407
|
+
function clonePushRequest(request) {
|
|
408
|
+
if (typeof structuredClone === 'function')
|
|
409
|
+
return structuredClone(request);
|
|
410
|
+
return JSON.parse(JSON.stringify(request));
|
|
411
|
+
}
|
|
412
|
+
export function createPushCommit(config) {
|
|
413
|
+
const idColumn = config.idColumn ?? 'id';
|
|
414
|
+
const versionColumn = config.versionColumn ?? 'server_version';
|
|
415
|
+
const omitColumns = config.omitColumns ?? [];
|
|
416
|
+
return async (fn) => {
|
|
417
|
+
const operations = [];
|
|
418
|
+
const localMutations = [];
|
|
419
|
+
const txTableCache = new Map();
|
|
420
|
+
const makeTxTable = (table) => {
|
|
421
|
+
const cached = txTableCache.get(table);
|
|
422
|
+
if (cached)
|
|
423
|
+
return cached;
|
|
424
|
+
const tableApi = {
|
|
425
|
+
async insert(values) {
|
|
426
|
+
const raw = isRecord(values) ? values : {};
|
|
427
|
+
const rawId = raw[idColumn];
|
|
428
|
+
const id = typeof rawId === 'string' && rawId ? rawId : randomId();
|
|
429
|
+
const row = { ...raw, [idColumn]: id };
|
|
430
|
+
const payload = sanitizePayload(row, {
|
|
431
|
+
omit: [
|
|
432
|
+
idColumn,
|
|
433
|
+
...(versionColumn ? [versionColumn] : []),
|
|
434
|
+
...omitColumns,
|
|
435
|
+
],
|
|
436
|
+
});
|
|
437
|
+
operations.push({
|
|
438
|
+
table: table,
|
|
439
|
+
row_id: id,
|
|
440
|
+
op: 'upsert',
|
|
441
|
+
payload,
|
|
442
|
+
base_version: null,
|
|
443
|
+
});
|
|
444
|
+
localMutations.push({ table, rowId: id, op: 'upsert' });
|
|
445
|
+
return id;
|
|
446
|
+
},
|
|
447
|
+
async insertMany(rows) {
|
|
448
|
+
const ids = [];
|
|
449
|
+
const toUpsert = [];
|
|
450
|
+
for (const values of rows) {
|
|
451
|
+
const raw = isRecord(values) ? values : {};
|
|
452
|
+
const rawId = raw[idColumn];
|
|
453
|
+
const id = typeof rawId === 'string' && rawId ? rawId : randomId();
|
|
454
|
+
ids.push(id);
|
|
455
|
+
toUpsert.push({ ...raw, [idColumn]: id });
|
|
456
|
+
}
|
|
457
|
+
for (let i = 0; i < toUpsert.length; i++) {
|
|
458
|
+
const row = toUpsert[i];
|
|
459
|
+
const id = ids[i];
|
|
460
|
+
const payload = sanitizePayload(row, {
|
|
461
|
+
omit: [
|
|
462
|
+
idColumn,
|
|
463
|
+
...(versionColumn ? [versionColumn] : []),
|
|
464
|
+
...omitColumns,
|
|
465
|
+
],
|
|
466
|
+
});
|
|
467
|
+
operations.push({
|
|
468
|
+
table: table,
|
|
469
|
+
row_id: id,
|
|
470
|
+
op: 'upsert',
|
|
471
|
+
payload,
|
|
472
|
+
base_version: null,
|
|
473
|
+
});
|
|
474
|
+
localMutations.push({ table, rowId: id, op: 'upsert' });
|
|
475
|
+
}
|
|
476
|
+
return ids;
|
|
477
|
+
},
|
|
478
|
+
async update(id, patch, opts) {
|
|
479
|
+
const rawPatch = isRecord(patch) ? patch : {};
|
|
480
|
+
const sanitized = sanitizePayload(rawPatch, {
|
|
481
|
+
omit: [
|
|
482
|
+
idColumn,
|
|
483
|
+
...(versionColumn ? [versionColumn] : []),
|
|
484
|
+
...omitColumns,
|
|
485
|
+
],
|
|
486
|
+
});
|
|
487
|
+
const hasExplicitBaseVersion = !!opts && hasOwn(opts, 'baseVersion');
|
|
488
|
+
const baseVersion = hasExplicitBaseVersion
|
|
489
|
+
? (opts.baseVersion ?? null)
|
|
490
|
+
: versionColumn && config.readBaseVersion
|
|
491
|
+
? await config.readBaseVersion({
|
|
492
|
+
table,
|
|
493
|
+
rowId: id,
|
|
494
|
+
idColumn,
|
|
495
|
+
versionColumn,
|
|
496
|
+
})
|
|
497
|
+
: null;
|
|
498
|
+
operations.push({
|
|
499
|
+
table: table,
|
|
500
|
+
row_id: id,
|
|
501
|
+
op: 'upsert',
|
|
502
|
+
payload: sanitized,
|
|
503
|
+
base_version: coerceBaseVersion(baseVersion),
|
|
504
|
+
});
|
|
505
|
+
localMutations.push({ table, rowId: id, op: 'upsert' });
|
|
506
|
+
},
|
|
507
|
+
async delete(id, opts) {
|
|
508
|
+
const hasExplicitBaseVersion = !!opts && hasOwn(opts, 'baseVersion');
|
|
509
|
+
const baseVersion = hasExplicitBaseVersion
|
|
510
|
+
? (opts.baseVersion ?? null)
|
|
511
|
+
: versionColumn && config.readBaseVersion
|
|
512
|
+
? await config.readBaseVersion({
|
|
513
|
+
table,
|
|
514
|
+
rowId: id,
|
|
515
|
+
idColumn,
|
|
516
|
+
versionColumn,
|
|
517
|
+
})
|
|
518
|
+
: null;
|
|
519
|
+
operations.push({
|
|
520
|
+
table: table,
|
|
521
|
+
row_id: id,
|
|
522
|
+
op: 'delete',
|
|
523
|
+
payload: null,
|
|
524
|
+
base_version: coerceBaseVersion(baseVersion),
|
|
525
|
+
});
|
|
526
|
+
localMutations.push({ table, rowId: id, op: 'delete' });
|
|
527
|
+
},
|
|
528
|
+
async upsert(id, patch, opts) {
|
|
529
|
+
await tableApi.update(id, patch, opts);
|
|
530
|
+
},
|
|
531
|
+
};
|
|
532
|
+
txTableCache.set(table, tableApi);
|
|
533
|
+
return tableApi;
|
|
534
|
+
};
|
|
535
|
+
const txProxy = new Proxy({}, {
|
|
536
|
+
get(_target, prop) {
|
|
537
|
+
if (prop === 'then')
|
|
538
|
+
return undefined;
|
|
539
|
+
if (typeof prop !== 'string')
|
|
540
|
+
return undefined;
|
|
541
|
+
return makeTxTable(prop);
|
|
542
|
+
},
|
|
543
|
+
});
|
|
544
|
+
const result = await fn(txProxy);
|
|
545
|
+
if (operations.length === 0) {
|
|
546
|
+
throw new Error('No mutations were enqueued');
|
|
547
|
+
}
|
|
548
|
+
const commitId = randomId();
|
|
549
|
+
const clientCommitId = randomId();
|
|
550
|
+
const request = {
|
|
551
|
+
clientId: config.clientId,
|
|
552
|
+
clientCommitId,
|
|
553
|
+
operations,
|
|
554
|
+
schemaVersion: config.schemaVersion ?? 1,
|
|
555
|
+
};
|
|
556
|
+
const plugins = config.plugins ?? [];
|
|
557
|
+
// Sort plugins by priority (lower numbers first, default 50)
|
|
558
|
+
const sortedPlugins = [...plugins].sort((a, b) => (a.priority ?? 50) - (b.priority ?? 50));
|
|
559
|
+
const ctx = {
|
|
560
|
+
actorId: config.actorId ?? 'unknown',
|
|
561
|
+
clientId: config.clientId,
|
|
562
|
+
};
|
|
563
|
+
let requestToSend = request;
|
|
564
|
+
if (sortedPlugins.length > 0) {
|
|
565
|
+
requestToSend = clonePushRequest(request);
|
|
566
|
+
for (const plugin of sortedPlugins) {
|
|
567
|
+
if (!plugin.beforePush)
|
|
568
|
+
continue;
|
|
569
|
+
requestToSend = await plugin.beforePush(ctx, requestToSend);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
const combined = await config.transport.sync({
|
|
573
|
+
clientId: requestToSend.clientId,
|
|
574
|
+
push: {
|
|
575
|
+
clientCommitId: requestToSend.clientCommitId,
|
|
576
|
+
operations: requestToSend.operations,
|
|
577
|
+
schemaVersion: requestToSend.schemaVersion,
|
|
578
|
+
},
|
|
579
|
+
});
|
|
580
|
+
if (!combined.push) {
|
|
581
|
+
throw new Error('Server returned no push response');
|
|
582
|
+
}
|
|
583
|
+
const rawResponse = combined.push;
|
|
584
|
+
let response = rawResponse;
|
|
585
|
+
if (sortedPlugins.length > 0) {
|
|
586
|
+
// Run afterPush in reverse priority order (higher numbers first)
|
|
587
|
+
for (const plugin of [...sortedPlugins].reverse()) {
|
|
588
|
+
if (!plugin.afterPush)
|
|
589
|
+
continue;
|
|
590
|
+
response = await plugin.afterPush(ctx, {
|
|
591
|
+
request: requestToSend,
|
|
592
|
+
response,
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
if (response.status !== 'applied' && response.status !== 'cached') {
|
|
597
|
+
const conflictCount = response.results.filter((r) => r.status === 'conflict').length;
|
|
598
|
+
const errorCount = response.results.filter((r) => r.status === 'error').length;
|
|
599
|
+
throw new Error(`Push rejected (${conflictCount} conflicts, ${errorCount} errors)`);
|
|
600
|
+
}
|
|
601
|
+
return {
|
|
602
|
+
result,
|
|
603
|
+
receipt: { commitId, clientCommitId },
|
|
604
|
+
meta: { operations, localMutations, response },
|
|
605
|
+
};
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
export function createPushMutations(config) {
|
|
609
|
+
return createMutationsApi(createPushCommit(config));
|
|
610
|
+
}
|
|
611
|
+
//# sourceMappingURL=mutations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutations.js","sourceRoot":"","sources":["../src/mutations.ts"],"names":[],"mappings":"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"}
|