@syncular/server 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/adapters/database.d.ts +83 -0
- package/dist/blobs/adapters/database.d.ts.map +1 -0
- package/dist/blobs/adapters/database.js +180 -0
- package/dist/blobs/adapters/database.js.map +1 -0
- package/dist/blobs/adapters/s3.d.ts +82 -0
- package/dist/blobs/adapters/s3.d.ts.map +1 -0
- package/dist/blobs/adapters/s3.js +170 -0
- package/dist/blobs/adapters/s3.js.map +1 -0
- package/dist/blobs/index.d.ts +9 -0
- package/dist/blobs/index.d.ts.map +1 -0
- package/dist/blobs/index.js +9 -0
- package/dist/blobs/index.js.map +1 -0
- package/dist/blobs/manager.d.ts +195 -0
- package/dist/blobs/manager.d.ts.map +1 -0
- package/dist/blobs/manager.js +440 -0
- package/dist/blobs/manager.js.map +1 -0
- package/dist/blobs/migrate.d.ts +27 -0
- package/dist/blobs/migrate.d.ts.map +1 -0
- package/dist/blobs/migrate.js +119 -0
- package/dist/blobs/migrate.js.map +1 -0
- package/dist/blobs/types.d.ts +54 -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/clients.d.ts +14 -0
- package/dist/clients.d.ts.map +1 -0
- package/dist/clients.js +7 -0
- package/dist/clients.js.map +1 -0
- package/dist/compaction.d.ts +27 -0
- package/dist/compaction.d.ts.map +1 -0
- package/dist/compaction.js +49 -0
- package/dist/compaction.js.map +1 -0
- package/dist/dialect/index.d.ts +5 -0
- package/dist/dialect/index.d.ts.map +1 -0
- package/dist/dialect/index.js +5 -0
- package/dist/dialect/index.js.map +1 -0
- package/dist/dialect/types.d.ts +170 -0
- package/dist/dialect/types.d.ts.map +1 -0
- package/dist/dialect/types.js +8 -0
- package/dist/dialect/types.js.map +1 -0
- package/dist/helpers/conflict.d.ts +52 -0
- package/dist/helpers/conflict.d.ts.map +1 -0
- package/dist/helpers/conflict.js +49 -0
- package/dist/helpers/conflict.js.map +1 -0
- package/dist/helpers/emitted-change.d.ts +56 -0
- package/dist/helpers/emitted-change.d.ts.map +1 -0
- package/dist/helpers/emitted-change.js +46 -0
- package/dist/helpers/emitted-change.js.map +1 -0
- package/dist/helpers/index.d.ts +10 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +10 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/paginate.d.ts +49 -0
- package/dist/helpers/paginate.d.ts.map +1 -0
- package/dist/helpers/paginate.js +54 -0
- package/dist/helpers/paginate.js.map +1 -0
- package/dist/helpers/scope-strings.d.ts +74 -0
- package/dist/helpers/scope-strings.d.ts.map +1 -0
- package/dist/helpers/scope-strings.js +82 -0
- package/dist/helpers/scope-strings.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/migrate.d.ts +14 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +13 -0
- package/dist/migrate.js.map +1 -0
- package/dist/proxy/handler.d.ts +42 -0
- package/dist/proxy/handler.d.ts.map +1 -0
- package/dist/proxy/handler.js +99 -0
- package/dist/proxy/handler.js.map +1 -0
- package/dist/proxy/index.d.ts +9 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +14 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/mutation-detector.d.ts +31 -0
- package/dist/proxy/mutation-detector.d.ts.map +1 -0
- package/dist/proxy/mutation-detector.js +61 -0
- package/dist/proxy/mutation-detector.js.map +1 -0
- package/dist/proxy/oplog.d.ts +30 -0
- package/dist/proxy/oplog.d.ts.map +1 -0
- package/dist/proxy/oplog.js +110 -0
- package/dist/proxy/oplog.js.map +1 -0
- package/dist/proxy/registry.d.ts +35 -0
- package/dist/proxy/registry.d.ts.map +1 -0
- package/dist/proxy/registry.js +49 -0
- package/dist/proxy/registry.js.map +1 -0
- package/dist/proxy/types.d.ts +44 -0
- package/dist/proxy/types.d.ts.map +1 -0
- package/dist/proxy/types.js +7 -0
- package/dist/proxy/types.js.map +1 -0
- package/dist/prune.d.ts +37 -0
- package/dist/prune.d.ts.map +1 -0
- package/dist/prune.js +112 -0
- package/dist/prune.js.map +1 -0
- package/dist/pull.d.ts +31 -0
- package/dist/pull.d.ts.map +1 -0
- package/dist/pull.js +414 -0
- package/dist/pull.js.map +1 -0
- package/dist/push.d.ts +33 -0
- package/dist/push.d.ts.map +1 -0
- package/dist/push.js +329 -0
- package/dist/push.js.map +1 -0
- package/dist/realtime/in-memory.d.ts +13 -0
- package/dist/realtime/in-memory.d.ts.map +1 -0
- package/dist/realtime/in-memory.js +28 -0
- package/dist/realtime/in-memory.js.map +1 -0
- package/dist/realtime/index.d.ts +3 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +2 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/types.d.ts +50 -0
- package/dist/realtime/types.d.ts.map +1 -0
- package/dist/realtime/types.js +7 -0
- package/dist/realtime/types.js.map +1 -0
- package/dist/schema.d.ts +164 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +10 -0
- package/dist/schema.js.map +1 -0
- package/dist/shapes/create-handler.d.ts +119 -0
- package/dist/shapes/create-handler.d.ts.map +1 -0
- package/dist/shapes/create-handler.js +327 -0
- package/dist/shapes/create-handler.js.map +1 -0
- package/dist/shapes/index.d.ts +4 -0
- package/dist/shapes/index.d.ts.map +1 -0
- package/dist/shapes/index.js +4 -0
- package/dist/shapes/index.js.map +1 -0
- package/dist/shapes/registry.d.ts +20 -0
- package/dist/shapes/registry.d.ts.map +1 -0
- package/dist/shapes/registry.js +88 -0
- package/dist/shapes/registry.js.map +1 -0
- package/dist/shapes/types.d.ts +204 -0
- package/dist/shapes/types.d.ts.map +1 -0
- package/dist/shapes/types.js +2 -0
- package/dist/shapes/types.js.map +1 -0
- package/dist/snapshot-chunks/adapters/s3.d.ts +63 -0
- package/dist/snapshot-chunks/adapters/s3.d.ts.map +1 -0
- package/dist/snapshot-chunks/adapters/s3.js +50 -0
- package/dist/snapshot-chunks/adapters/s3.js.map +1 -0
- package/dist/snapshot-chunks/db-metadata.d.ts +33 -0
- package/dist/snapshot-chunks/db-metadata.d.ts.map +1 -0
- package/dist/snapshot-chunks/db-metadata.js +169 -0
- package/dist/snapshot-chunks/db-metadata.js.map +1 -0
- package/dist/snapshot-chunks/index.d.ts +9 -0
- package/dist/snapshot-chunks/index.d.ts.map +1 -0
- package/dist/snapshot-chunks/index.js +9 -0
- package/dist/snapshot-chunks/index.js.map +1 -0
- package/dist/snapshot-chunks/types.d.ts +65 -0
- package/dist/snapshot-chunks/types.d.ts.map +1 -0
- package/dist/snapshot-chunks/types.js +8 -0
- package/dist/snapshot-chunks/types.js.map +1 -0
- package/dist/snapshot-chunks.d.ts +59 -0
- package/dist/snapshot-chunks.d.ts.map +1 -0
- package/dist/snapshot-chunks.js +202 -0
- package/dist/snapshot-chunks.js.map +1 -0
- package/dist/stats.d.ts +19 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +57 -0
- package/dist/stats.js.map +1 -0
- package/dist/subscriptions/index.d.ts +2 -0
- package/dist/subscriptions/index.d.ts.map +1 -0
- package/dist/subscriptions/index.js +2 -0
- package/dist/subscriptions/index.js.map +1 -0
- package/dist/subscriptions/resolve.d.ts +35 -0
- package/dist/subscriptions/resolve.d.ts.map +1 -0
- package/dist/subscriptions/resolve.js +134 -0
- package/dist/subscriptions/resolve.js.map +1 -0
- package/package.json +80 -0
- package/src/blobs/adapters/database.ts +290 -0
- package/src/blobs/adapters/s3.ts +271 -0
- package/src/blobs/index.ts +9 -0
- package/src/blobs/manager.ts +600 -0
- package/src/blobs/migrate.ts +150 -0
- package/src/blobs/types.ts +70 -0
- package/src/clients.ts +21 -0
- package/src/compaction.ts +77 -0
- package/src/dialect/index.ts +5 -0
- package/src/dialect/types.ts +222 -0
- package/src/helpers/conflict.ts +64 -0
- package/src/helpers/emitted-change.ts +69 -0
- package/src/helpers/index.ts +10 -0
- package/src/helpers/paginate.ts +82 -0
- package/src/helpers/scope-strings.ts +101 -0
- package/src/index.ts +28 -0
- package/src/migrate.ts +20 -0
- package/src/proxy/handler.ts +152 -0
- package/src/proxy/index.ts +18 -0
- package/src/proxy/mutation-detector.ts +83 -0
- package/src/proxy/oplog.ts +144 -0
- package/src/proxy/registry.ts +56 -0
- package/src/proxy/types.ts +46 -0
- package/src/prune.ts +200 -0
- package/src/pull.ts +551 -0
- package/src/push.ts +457 -0
- package/src/realtime/in-memory.ts +33 -0
- package/src/realtime/index.ts +5 -0
- package/src/realtime/types.ts +55 -0
- package/src/schema.ts +172 -0
- package/src/shapes/create-handler.ts +590 -0
- package/src/shapes/index.ts +3 -0
- package/src/shapes/registry.ts +109 -0
- package/src/shapes/types.ts +267 -0
- package/src/snapshot-chunks/adapters/s3.ts +68 -0
- package/src/snapshot-chunks/db-metadata.ts +238 -0
- package/src/snapshot-chunks/index.ts +9 -0
- package/src/snapshot-chunks/types.ts +79 -0
- package/src/snapshot-chunks.ts +301 -0
- package/src/stats.ts +104 -0
- package/src/subscriptions/index.ts +1 -0
- package/src/subscriptions/resolve.ts +185 -0
package/dist/push.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { sql } from 'kysely';
|
|
2
|
+
class RejectCommitError extends Error {
|
|
3
|
+
response;
|
|
4
|
+
constructor(response) {
|
|
5
|
+
super('REJECT_COMMIT');
|
|
6
|
+
this.response = response;
|
|
7
|
+
this.name = 'RejectCommitError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
async function readCommitAffectedTables(db, dialect, commitSeq, partitionId) {
|
|
11
|
+
try {
|
|
12
|
+
const commitsQ = db.selectFrom('sync_commits');
|
|
13
|
+
const row = await commitsQ
|
|
14
|
+
.selectAll()
|
|
15
|
+
.where(sql `commit_seq = ${commitSeq}`)
|
|
16
|
+
.where(sql `partition_id = ${partitionId}`)
|
|
17
|
+
.executeTakeFirst();
|
|
18
|
+
const raw = row?.affected_tables;
|
|
19
|
+
return dialect.dbToArray(raw);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// ignore and fall back to scanning changes (best-effort)
|
|
23
|
+
}
|
|
24
|
+
// Fallback: read from changes using dialect-specific implementation
|
|
25
|
+
return dialect.readAffectedTablesFromChanges(db, commitSeq, { partitionId });
|
|
26
|
+
}
|
|
27
|
+
function scopeKeysFromEmitted(emitted) {
|
|
28
|
+
const keys = new Set();
|
|
29
|
+
for (const c of emitted) {
|
|
30
|
+
for (const [key, value] of Object.entries(c.scopes)) {
|
|
31
|
+
if (!value)
|
|
32
|
+
continue;
|
|
33
|
+
const prefix = key.replace(/_id$/, '');
|
|
34
|
+
keys.add(`${prefix}:${value}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return Array.from(keys);
|
|
38
|
+
}
|
|
39
|
+
export async function pushCommit(args) {
|
|
40
|
+
const { request, dialect } = args;
|
|
41
|
+
const db = args.db;
|
|
42
|
+
const partitionId = args.partitionId ?? 'default';
|
|
43
|
+
if (!request.clientId || !request.clientCommitId) {
|
|
44
|
+
return {
|
|
45
|
+
response: {
|
|
46
|
+
ok: true,
|
|
47
|
+
status: 'rejected',
|
|
48
|
+
results: [
|
|
49
|
+
{
|
|
50
|
+
opIndex: 0,
|
|
51
|
+
status: 'error',
|
|
52
|
+
error: 'INVALID_REQUEST',
|
|
53
|
+
code: 'INVALID_REQUEST',
|
|
54
|
+
retriable: false,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
affectedTables: [],
|
|
59
|
+
scopeKeys: [],
|
|
60
|
+
emittedChanges: [],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const ops = request.operations ?? [];
|
|
64
|
+
if (!Array.isArray(ops) || ops.length === 0) {
|
|
65
|
+
return {
|
|
66
|
+
response: {
|
|
67
|
+
ok: true,
|
|
68
|
+
status: 'rejected',
|
|
69
|
+
results: [
|
|
70
|
+
{
|
|
71
|
+
opIndex: 0,
|
|
72
|
+
status: 'error',
|
|
73
|
+
error: 'EMPTY_COMMIT',
|
|
74
|
+
code: 'EMPTY_COMMIT',
|
|
75
|
+
retriable: false,
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
affectedTables: [],
|
|
80
|
+
scopeKeys: [],
|
|
81
|
+
emittedChanges: [],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return dialect.executeInTransaction(db, async (trx) => {
|
|
85
|
+
const syncTrx = trx;
|
|
86
|
+
// Clean up any stale commit row with null result_json.
|
|
87
|
+
// This can happen when a previous push inserted the commit row but crashed
|
|
88
|
+
// before writing the result (e.g., on D1 without transaction support).
|
|
89
|
+
await syncTrx
|
|
90
|
+
.deleteFrom('sync_commits')
|
|
91
|
+
.where('partition_id', '=', partitionId)
|
|
92
|
+
.where('client_id', '=', request.clientId)
|
|
93
|
+
.where('client_commit_id', '=', request.clientCommitId)
|
|
94
|
+
.where('result_json', 'is', null)
|
|
95
|
+
.execute();
|
|
96
|
+
// Insert commit row (idempotency key)
|
|
97
|
+
const commitRow = {
|
|
98
|
+
partition_id: partitionId,
|
|
99
|
+
actor_id: args.actorId,
|
|
100
|
+
client_id: request.clientId,
|
|
101
|
+
client_commit_id: request.clientCommitId,
|
|
102
|
+
meta: null,
|
|
103
|
+
result_json: null,
|
|
104
|
+
};
|
|
105
|
+
const insertResult = await syncTrx
|
|
106
|
+
.insertInto('sync_commits')
|
|
107
|
+
.values(commitRow)
|
|
108
|
+
.onConflict((oc) => oc.columns(['partition_id', 'client_id', 'client_commit_id']).doNothing())
|
|
109
|
+
.executeTakeFirstOrThrow();
|
|
110
|
+
const insertedRows = Number(insertResult.numInsertedOrUpdatedRows ?? 0);
|
|
111
|
+
if (insertedRows === 0) {
|
|
112
|
+
// Existing commit: return cached response (applied or rejected)
|
|
113
|
+
// Use forUpdate() for row locking on databases that support it
|
|
114
|
+
let query = syncTrx.selectFrom('sync_commits')
|
|
115
|
+
.selectAll()
|
|
116
|
+
.where('partition_id', '=', partitionId)
|
|
117
|
+
.where('client_id', '=', request.clientId)
|
|
118
|
+
.where('client_commit_id', '=', request.clientCommitId);
|
|
119
|
+
if (dialect.supportsForUpdate) {
|
|
120
|
+
query = query.forUpdate();
|
|
121
|
+
}
|
|
122
|
+
const existing = await query.executeTakeFirstOrThrow();
|
|
123
|
+
const cached = existing.result_json;
|
|
124
|
+
if (!cached || cached.ok !== true) {
|
|
125
|
+
return {
|
|
126
|
+
response: {
|
|
127
|
+
ok: true,
|
|
128
|
+
status: 'rejected',
|
|
129
|
+
results: [
|
|
130
|
+
{
|
|
131
|
+
opIndex: 0,
|
|
132
|
+
status: 'error',
|
|
133
|
+
error: 'IDEMPOTENCY_CACHE_MISS',
|
|
134
|
+
code: 'INTERNAL',
|
|
135
|
+
retriable: true,
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
},
|
|
139
|
+
affectedTables: [],
|
|
140
|
+
scopeKeys: [],
|
|
141
|
+
emittedChanges: [],
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const base = {
|
|
145
|
+
...cached,
|
|
146
|
+
commitSeq: Number(existing.commit_seq),
|
|
147
|
+
};
|
|
148
|
+
if (cached.status === 'applied') {
|
|
149
|
+
const tablesFromDb = dialect.dbToArray(existing.affected_tables);
|
|
150
|
+
return {
|
|
151
|
+
response: { ...base, status: 'cached' },
|
|
152
|
+
affectedTables: tablesFromDb.length > 0
|
|
153
|
+
? tablesFromDb
|
|
154
|
+
: await readCommitAffectedTables(trx, dialect, Number(existing.commit_seq), partitionId),
|
|
155
|
+
scopeKeys: [],
|
|
156
|
+
emittedChanges: [],
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
response: base,
|
|
161
|
+
affectedTables: [],
|
|
162
|
+
scopeKeys: [],
|
|
163
|
+
emittedChanges: [],
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
const insertedCommit = await syncTrx.selectFrom('sync_commits')
|
|
167
|
+
.selectAll()
|
|
168
|
+
.where('partition_id', '=', partitionId)
|
|
169
|
+
.where('client_id', '=', request.clientId)
|
|
170
|
+
.where('client_commit_id', '=', request.clientCommitId)
|
|
171
|
+
.executeTakeFirstOrThrow();
|
|
172
|
+
const commitSeq = Number(insertedCommit.commit_seq);
|
|
173
|
+
const commitId = `${request.clientId}:${request.clientCommitId}`;
|
|
174
|
+
const savepointName = 'sync_apply';
|
|
175
|
+
const useSavepoints = dialect.supportsSavepoints;
|
|
176
|
+
let savepointCreated = false;
|
|
177
|
+
try {
|
|
178
|
+
// Apply the commit under a savepoint so we can roll back app writes on conflict
|
|
179
|
+
// while still persisting the commit-level cached response.
|
|
180
|
+
if (useSavepoints) {
|
|
181
|
+
await sql.raw(`SAVEPOINT ${savepointName}`).execute(trx);
|
|
182
|
+
savepointCreated = true;
|
|
183
|
+
}
|
|
184
|
+
const allEmitted = [];
|
|
185
|
+
const results = [];
|
|
186
|
+
const affectedTablesSet = new Set();
|
|
187
|
+
for (let i = 0; i < ops.length; i++) {
|
|
188
|
+
const op = ops[i];
|
|
189
|
+
const handler = args.shapes.getOrThrow(op.table);
|
|
190
|
+
const applied = await handler.applyOperation({
|
|
191
|
+
db: trx,
|
|
192
|
+
trx,
|
|
193
|
+
actorId: args.actorId,
|
|
194
|
+
clientId: request.clientId,
|
|
195
|
+
commitId,
|
|
196
|
+
schemaVersion: request.schemaVersion,
|
|
197
|
+
}, op, i);
|
|
198
|
+
if (applied.result.status !== 'applied') {
|
|
199
|
+
results.push(applied.result);
|
|
200
|
+
throw new RejectCommitError({
|
|
201
|
+
ok: true,
|
|
202
|
+
status: 'rejected',
|
|
203
|
+
commitSeq,
|
|
204
|
+
results,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
// Framework-level enforcement: emitted changes must have scopes
|
|
208
|
+
for (const c of applied.emittedChanges ?? []) {
|
|
209
|
+
const scopes = c?.scopes;
|
|
210
|
+
if (!scopes || typeof scopes !== 'object') {
|
|
211
|
+
results.push({
|
|
212
|
+
opIndex: i,
|
|
213
|
+
status: 'error',
|
|
214
|
+
error: 'MISSING_SCOPES',
|
|
215
|
+
code: 'INVALID_SCOPE',
|
|
216
|
+
retriable: false,
|
|
217
|
+
});
|
|
218
|
+
throw new RejectCommitError({
|
|
219
|
+
ok: true,
|
|
220
|
+
status: 'rejected',
|
|
221
|
+
commitSeq,
|
|
222
|
+
results,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
results.push(applied.result);
|
|
227
|
+
allEmitted.push(...applied.emittedChanges);
|
|
228
|
+
for (const c of applied.emittedChanges) {
|
|
229
|
+
affectedTablesSet.add(c.table);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (allEmitted.length > 0) {
|
|
233
|
+
const changeRows = allEmitted.map((c) => ({
|
|
234
|
+
partition_id: partitionId,
|
|
235
|
+
commit_seq: commitSeq,
|
|
236
|
+
table: c.table,
|
|
237
|
+
row_id: c.row_id,
|
|
238
|
+
op: c.op,
|
|
239
|
+
row_json: c.row_json,
|
|
240
|
+
row_version: c.row_version,
|
|
241
|
+
scopes: dialect.scopesToDb(c.scopes),
|
|
242
|
+
}));
|
|
243
|
+
await syncTrx.insertInto('sync_changes').values(changeRows).execute();
|
|
244
|
+
}
|
|
245
|
+
const appliedResponse = {
|
|
246
|
+
ok: true,
|
|
247
|
+
status: 'applied',
|
|
248
|
+
commitSeq,
|
|
249
|
+
results,
|
|
250
|
+
};
|
|
251
|
+
const affectedTables = Array.from(affectedTablesSet).sort();
|
|
252
|
+
const appliedCommitUpdate = {
|
|
253
|
+
result_json: appliedResponse,
|
|
254
|
+
change_count: allEmitted.length,
|
|
255
|
+
affected_tables: affectedTables,
|
|
256
|
+
};
|
|
257
|
+
await syncTrx
|
|
258
|
+
.updateTable('sync_commits')
|
|
259
|
+
.set(appliedCommitUpdate)
|
|
260
|
+
.where('commit_seq', '=', commitSeq)
|
|
261
|
+
.execute();
|
|
262
|
+
// Insert table commits for subscription filtering
|
|
263
|
+
if (affectedTables.length > 0) {
|
|
264
|
+
const tableCommits = affectedTables.map((table) => ({
|
|
265
|
+
partition_id: partitionId,
|
|
266
|
+
table,
|
|
267
|
+
commit_seq: commitSeq,
|
|
268
|
+
}));
|
|
269
|
+
await syncTrx
|
|
270
|
+
.insertInto('sync_table_commits')
|
|
271
|
+
.values(tableCommits)
|
|
272
|
+
.onConflict((oc) => oc.columns(['partition_id', 'table', 'commit_seq']).doNothing())
|
|
273
|
+
.execute();
|
|
274
|
+
}
|
|
275
|
+
if (useSavepoints) {
|
|
276
|
+
await sql.raw(`RELEASE SAVEPOINT ${savepointName}`).execute(trx);
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
response: appliedResponse,
|
|
280
|
+
affectedTables,
|
|
281
|
+
scopeKeys: scopeKeysFromEmitted(allEmitted),
|
|
282
|
+
emittedChanges: allEmitted.map((c) => ({
|
|
283
|
+
table: c.table,
|
|
284
|
+
row_id: c.row_id,
|
|
285
|
+
op: c.op,
|
|
286
|
+
row_json: c.row_json,
|
|
287
|
+
row_version: c.row_version,
|
|
288
|
+
scopes: c.scopes,
|
|
289
|
+
})),
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
// Roll back app writes but keep the commit row.
|
|
294
|
+
if (savepointCreated) {
|
|
295
|
+
try {
|
|
296
|
+
await sql.raw(`ROLLBACK TO SAVEPOINT ${savepointName}`).execute(trx);
|
|
297
|
+
await sql.raw(`RELEASE SAVEPOINT ${savepointName}`).execute(trx);
|
|
298
|
+
}
|
|
299
|
+
catch (savepointErr) {
|
|
300
|
+
// If savepoint rollback fails, the transaction may be in an
|
|
301
|
+
// inconsistent state. Log and rethrow to fail the entire commit
|
|
302
|
+
// rather than risk data corruption.
|
|
303
|
+
console.error('[pushCommit] Savepoint rollback failed:', savepointErr);
|
|
304
|
+
throw savepointErr;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (!(err instanceof RejectCommitError))
|
|
308
|
+
throw err;
|
|
309
|
+
const rejectedCommitUpdate = {
|
|
310
|
+
result_json: err.response,
|
|
311
|
+
change_count: 0,
|
|
312
|
+
affected_tables: [],
|
|
313
|
+
};
|
|
314
|
+
// Persist the rejected response for commit-level idempotency.
|
|
315
|
+
await syncTrx
|
|
316
|
+
.updateTable('sync_commits')
|
|
317
|
+
.set(rejectedCommitUpdate)
|
|
318
|
+
.where('commit_seq', '=', commitSeq)
|
|
319
|
+
.execute();
|
|
320
|
+
return {
|
|
321
|
+
response: err.response,
|
|
322
|
+
affectedTables: [],
|
|
323
|
+
scopeKeys: [],
|
|
324
|
+
emittedChanges: [],
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=push.js.map
|
package/dist/push.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SyncRealtimeBroadcaster, SyncRealtimeEvent } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory broadcaster for tests and single-process setups.
|
|
4
|
+
*
|
|
5
|
+
* This simulates multi-instance fanout when shared across "instances" in a test.
|
|
6
|
+
*/
|
|
7
|
+
export declare class InMemorySyncRealtimeBroadcaster implements SyncRealtimeBroadcaster {
|
|
8
|
+
private handlers;
|
|
9
|
+
subscribe(handler: (event: SyncRealtimeEvent) => void): () => void;
|
|
10
|
+
publish(event: SyncRealtimeEvent): Promise<void>;
|
|
11
|
+
close(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=in-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory.d.ts","sourceRoot":"","sources":["../../src/realtime/in-memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE1E;;;;GAIG;AACH,qBAAa,+BACX,YAAW,uBAAuB;IAElC,OAAO,CAAC,QAAQ,CAAiD;IAEjE,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAKjE;IAEK,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory broadcaster for tests and single-process setups.
|
|
3
|
+
*
|
|
4
|
+
* This simulates multi-instance fanout when shared across "instances" in a test.
|
|
5
|
+
*/
|
|
6
|
+
export class InMemorySyncRealtimeBroadcaster {
|
|
7
|
+
handlers = new Set();
|
|
8
|
+
subscribe(handler) {
|
|
9
|
+
this.handlers.add(handler);
|
|
10
|
+
return () => {
|
|
11
|
+
this.handlers.delete(handler);
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
async publish(event) {
|
|
15
|
+
for (const handler of this.handlers) {
|
|
16
|
+
try {
|
|
17
|
+
handler(event);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// ignore individual handler errors; realtime is best-effort
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async close() {
|
|
25
|
+
this.handlers.clear();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=in-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory.js","sourceRoot":"","sources":["../../src/realtime/in-memory.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,+BAA+B;IAGlC,QAAQ,GAAG,IAAI,GAAG,EAAsC,CAAC;IAEjE,SAAS,CAAC,OAA2C,EAAc;QACjE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAA,CAC/B,CAAC;IAAA,CACH;IAED,KAAK,CAAC,OAAO,CAAC,KAAwB,EAAiB;QACrD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;YAC9D,CAAC;QACH,CAAC;IAAA,CACF;IAED,KAAK,CAAC,KAAK,GAAkB;QAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAAA,CACvB;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EACV,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/server - Realtime broadcaster types
|
|
3
|
+
*
|
|
4
|
+
* Realtime is a best-effort "wake up" mechanism. Correctness always comes from pull + cursors.
|
|
5
|
+
*/
|
|
6
|
+
export interface SyncRealtimeCommitEvent {
|
|
7
|
+
type: 'commit';
|
|
8
|
+
commitSeq: number;
|
|
9
|
+
/** Logical partition key (tenant / demo / workspace). */
|
|
10
|
+
partitionId?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Optional scopes affected by the commit.
|
|
13
|
+
* Broadcasters may omit this to keep payloads small (listeners can look up in DB).
|
|
14
|
+
*/
|
|
15
|
+
scopeKeys?: string[];
|
|
16
|
+
/** Optional instance id to suppress echo on the originating instance. */
|
|
17
|
+
sourceInstanceId?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Presence event for tracking which clients are connected to which scopes.
|
|
21
|
+
* Used for collaborative features like "who's online" indicators.
|
|
22
|
+
*/
|
|
23
|
+
export interface SyncRealtimePresenceEvent {
|
|
24
|
+
type: 'presence';
|
|
25
|
+
/** The action that occurred */
|
|
26
|
+
action: 'join' | 'leave' | 'update';
|
|
27
|
+
/** The scope key this presence event relates to */
|
|
28
|
+
scopeKey: string;
|
|
29
|
+
/** Client/device identifier */
|
|
30
|
+
clientId: string;
|
|
31
|
+
/** Actor/user identifier */
|
|
32
|
+
actorId: string;
|
|
33
|
+
/** Optional metadata (e.g., entity being viewed/edited) */
|
|
34
|
+
metadata?: Record<string, unknown>;
|
|
35
|
+
/** Optional instance id to suppress echo on the originating instance. */
|
|
36
|
+
sourceInstanceId?: string;
|
|
37
|
+
}
|
|
38
|
+
export type SyncRealtimeEvent = SyncRealtimeCommitEvent | SyncRealtimePresenceEvent;
|
|
39
|
+
export interface SyncRealtimeBroadcaster {
|
|
40
|
+
/** Publish an event to other app instances. */
|
|
41
|
+
publish(event: SyncRealtimeEvent): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Subscribe to events from other app instances.
|
|
44
|
+
* Returns an unsubscribe function.
|
|
45
|
+
*/
|
|
46
|
+
subscribe(handler: (event: SyncRealtimeEvent) => void): () => void;
|
|
47
|
+
/** Close underlying resources (best-effort). */
|
|
48
|
+
close(): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,UAAU,CAAC;IACjB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,iBAAiB,GACzB,uBAAuB,GACvB,yBAAyB,CAAC;AAE9B,MAAM,WAAW,uBAAuB;IACtC,+CAA+C;IAC/C,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACnE,gDAAgD;IAChD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/server - database schema types
|
|
3
|
+
*
|
|
4
|
+
* Commit-log based sync tables:
|
|
5
|
+
* - sync_commits: one row per committed push
|
|
6
|
+
* - sync_changes: one row per emitted change, stamped with scopes
|
|
7
|
+
* - sync_table_commits: commit routing index for fast pull
|
|
8
|
+
*/
|
|
9
|
+
import type { SyncOp } from '@syncular/core';
|
|
10
|
+
import type { Generated } from 'kysely';
|
|
11
|
+
/**
|
|
12
|
+
* Commit log.
|
|
13
|
+
*/
|
|
14
|
+
export interface SyncCommitsTable {
|
|
15
|
+
/** Monotonic commit sequence (server-assigned) */
|
|
16
|
+
commit_seq: Generated<number>;
|
|
17
|
+
/** Logical partition key (tenant / demo / workspace) */
|
|
18
|
+
partition_id: string;
|
|
19
|
+
/** Actor who produced the commit */
|
|
20
|
+
actor_id: string;
|
|
21
|
+
/** Client/device identifier */
|
|
22
|
+
client_id: string;
|
|
23
|
+
/** Client-provided commit idempotency key (unique per client) */
|
|
24
|
+
client_commit_id: string;
|
|
25
|
+
/** Creation timestamp */
|
|
26
|
+
created_at: Generated<string>;
|
|
27
|
+
/** Optional metadata */
|
|
28
|
+
meta: unknown | null;
|
|
29
|
+
/** Cached push response for idempotency */
|
|
30
|
+
result_json: unknown | null;
|
|
31
|
+
/** Number of emitted changes (denormalized for observability) */
|
|
32
|
+
change_count: Generated<number>;
|
|
33
|
+
/**
|
|
34
|
+
* Tables affected by this commit (for realtime notifications).
|
|
35
|
+
* Array of table names that had changes.
|
|
36
|
+
*/
|
|
37
|
+
affected_tables: Generated<string[]>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Change log entries (filtered by scopes on pull).
|
|
41
|
+
*/
|
|
42
|
+
export interface SyncChangesTable {
|
|
43
|
+
/** Monotonic change id */
|
|
44
|
+
change_id: Generated<number>;
|
|
45
|
+
/** Logical partition key (tenant / demo / workspace) */
|
|
46
|
+
partition_id: string;
|
|
47
|
+
/** Commit sequence this change belongs to */
|
|
48
|
+
commit_seq: number;
|
|
49
|
+
/** Table name being changed */
|
|
50
|
+
table: string;
|
|
51
|
+
/** Row primary key */
|
|
52
|
+
row_id: string;
|
|
53
|
+
/** Operation: 'upsert' or 'delete' */
|
|
54
|
+
op: SyncOp;
|
|
55
|
+
/** Row data as JSON (null for deletes) */
|
|
56
|
+
row_json: unknown | null;
|
|
57
|
+
/** Optional row version for optimistic concurrency */
|
|
58
|
+
row_version: number | null;
|
|
59
|
+
/**
|
|
60
|
+
* Scope values for routing/filtering (JSONB).
|
|
61
|
+
* Example: { "user_id": "U1", "project_id": "P1" }
|
|
62
|
+
*/
|
|
63
|
+
scopes: unknown;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Per-client cursor tracking (for pruning + observability).
|
|
67
|
+
*/
|
|
68
|
+
export interface SyncClientCursorsTable {
|
|
69
|
+
/** Logical partition key (tenant / demo / workspace) */
|
|
70
|
+
partition_id: string;
|
|
71
|
+
/** Client/device identifier */
|
|
72
|
+
client_id: string;
|
|
73
|
+
/** Actor currently associated with the client */
|
|
74
|
+
actor_id: string;
|
|
75
|
+
/** Last successfully pulled commit_seq */
|
|
76
|
+
cursor: number;
|
|
77
|
+
/**
|
|
78
|
+
* Effective scope values for the client's last pull (JSONB).
|
|
79
|
+
* This is the intersection of requested scopes and allowed scopes.
|
|
80
|
+
*/
|
|
81
|
+
effective_scopes: unknown;
|
|
82
|
+
/** Last update timestamp */
|
|
83
|
+
updated_at: Generated<string>;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Cached bootstrap snapshot chunks (encoded, for large read-only bootstraps).
|
|
87
|
+
*/
|
|
88
|
+
export interface SyncSnapshotChunksTable {
|
|
89
|
+
/** Opaque chunk id */
|
|
90
|
+
chunk_id: string;
|
|
91
|
+
/** Logical partition key (tenant / demo / workspace) */
|
|
92
|
+
partition_id: string;
|
|
93
|
+
/** Effective scope key this chunk belongs to */
|
|
94
|
+
scope_key: string;
|
|
95
|
+
/** Scope identifier */
|
|
96
|
+
scope: string;
|
|
97
|
+
/** Snapshot as-of commit sequence */
|
|
98
|
+
as_of_commit_seq: number;
|
|
99
|
+
/** Snapshot row cursor key (empty string represents null) */
|
|
100
|
+
row_cursor: string;
|
|
101
|
+
/** Snapshot row limit used to produce this chunk */
|
|
102
|
+
row_limit: number;
|
|
103
|
+
/** Row encoding (e.g. 'ndjson') */
|
|
104
|
+
encoding: string;
|
|
105
|
+
/** Compression algorithm (e.g. 'gzip') */
|
|
106
|
+
compression: string;
|
|
107
|
+
/** Hex-encoded sha256 of content */
|
|
108
|
+
sha256: string;
|
|
109
|
+
/** Byte length of content */
|
|
110
|
+
byte_length: number;
|
|
111
|
+
/** Reference to blob storage (new field for external storage) */
|
|
112
|
+
blob_hash: string;
|
|
113
|
+
/** Encoded chunk bytes (deprecated: use blob storage via blob_hash) */
|
|
114
|
+
body?: Uint8Array | null;
|
|
115
|
+
/** Created timestamp */
|
|
116
|
+
created_at: Generated<string>;
|
|
117
|
+
/** Expiration timestamp (server may delete after this) */
|
|
118
|
+
expires_at: string;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Index table: which commits affect which tables.
|
|
122
|
+
*
|
|
123
|
+
* Used to efficiently find commit_seq values for a table without scanning
|
|
124
|
+
* the (much larger) change log.
|
|
125
|
+
*/
|
|
126
|
+
export interface SyncTableCommitsTable {
|
|
127
|
+
/** Logical partition key (tenant / demo / workspace) */
|
|
128
|
+
partition_id: string;
|
|
129
|
+
table: string;
|
|
130
|
+
commit_seq: number;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Database interface for sync infrastructure tables
|
|
134
|
+
* Merge this with your app's database interface
|
|
135
|
+
*/
|
|
136
|
+
export interface SyncCoreDb {
|
|
137
|
+
sync_commits: SyncCommitsTable;
|
|
138
|
+
sync_changes: SyncChangesTable;
|
|
139
|
+
sync_client_cursors: SyncClientCursorsTable;
|
|
140
|
+
sync_table_commits: SyncTableCommitsTable;
|
|
141
|
+
sync_snapshot_chunks: SyncSnapshotChunksTable;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Commit metadata row for pull responses
|
|
145
|
+
*/
|
|
146
|
+
export interface SyncCommitRow {
|
|
147
|
+
commit_seq: number;
|
|
148
|
+
actor_id: string;
|
|
149
|
+
created_at: string;
|
|
150
|
+
result_json: unknown | null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Change row for pull responses
|
|
154
|
+
*/
|
|
155
|
+
export interface SyncChangeRow {
|
|
156
|
+
commit_seq: number;
|
|
157
|
+
table: string;
|
|
158
|
+
row_id: string;
|
|
159
|
+
op: SyncOp;
|
|
160
|
+
row_json: unknown | null;
|
|
161
|
+
row_version: number | null;
|
|
162
|
+
scopes: unknown;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/server - database schema types
|
|
3
|
+
*
|
|
4
|
+
* Commit-log based sync tables:
|
|
5
|
+
* - sync_commits: one row per committed push
|
|
6
|
+
* - sync_changes: one row per emitted change, stamped with scopes
|
|
7
|
+
* - sync_table_commits: commit routing index for fast pull
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|