@syncular/client 0.0.1-122 → 0.0.1-123
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/client.d.ts +4 -4
- package/dist/client.js +5 -5
- package/dist/client.js.map +1 -1
- package/dist/create-client.js +2 -2
- package/dist/engine/SyncEngine.d.ts.map +1 -1
- package/dist/engine/SyncEngine.js +4 -4
- package/dist/engine/SyncEngine.js.map +1 -1
- package/dist/engine/types.d.ts +2 -2
- package/dist/engine/types.d.ts.map +1 -1
- package/dist/migrate.d.ts +1 -1
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +148 -28
- package/dist/migrate.js.map +1 -1
- package/dist/plugins/incrementing-version.d.ts +1 -1
- package/dist/plugins/incrementing-version.js +2 -2
- package/dist/pull-engine.d.ts +2 -2
- package/dist/pull-engine.d.ts.map +1 -1
- package/dist/pull-engine.js +16 -16
- package/dist/pull-engine.js.map +1 -1
- package/dist/schema.d.ts +2 -2
- package/dist/schema.d.ts.map +1 -1
- package/dist/sync-loop.d.ts +1 -1
- package/dist/sync-loop.d.ts.map +1 -1
- package/dist/sync-loop.js +7 -7
- package/dist/sync-loop.js.map +1 -1
- package/package.json +3 -3
- package/src/client.test.ts +1 -1
- package/src/client.ts +8 -8
- package/src/create-client.ts +2 -2
- package/src/engine/SyncEngine.test.ts +3 -3
- package/src/engine/SyncEngine.ts +21 -16
- package/src/engine/types.ts +2 -2
- package/src/migrate.ts +215 -33
- package/src/plugins/incrementing-version.ts +2 -2
- package/src/pull-engine.test.ts +3 -3
- package/src/pull-engine.ts +16 -16
- package/src/schema.ts +2 -2
- package/src/sync-loop.ts +7 -7
package/dist/sync-loop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-loop.js","sourceRoot":"","sources":["../src/sync-loop.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sync-loop.js","sourceRoot":"","sources":["../src/sync-loop.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syncular/client",
|
|
3
|
-
"version": "0.0.1-
|
|
3
|
+
"version": "0.0.1-123",
|
|
4
4
|
"description": "Client-side sync engine with offline-first support, outbox, and conflict resolution",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Benjamin Kniffler",
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"release": "bunx syncular-publish"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@syncular/core": "0.0.1-
|
|
50
|
-
"@syncular/transport-http": "0.0.1-
|
|
49
|
+
"@syncular/core": "0.0.1-123",
|
|
50
|
+
"@syncular/transport-http": "0.0.1-123"
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
53
|
"kysely": "*"
|
package/src/client.test.ts
CHANGED
package/src/client.ts
CHANGED
|
@@ -85,7 +85,7 @@ export interface ClientOptions<DB extends SyncClientDb> {
|
|
|
85
85
|
/** Subscriptions to sync */
|
|
86
86
|
subscriptions: Array<{
|
|
87
87
|
id: string;
|
|
88
|
-
|
|
88
|
+
table: string;
|
|
89
89
|
scopes?: Record<string, string | string[]>;
|
|
90
90
|
params?: Record<string, unknown>;
|
|
91
91
|
}>;
|
|
@@ -251,7 +251,7 @@ type ClientEventHandler<E extends ClientEventType> = (
|
|
|
251
251
|
* tableHandlers,
|
|
252
252
|
* clientId: 'device-123',
|
|
253
253
|
* actorId: 'user-456',
|
|
254
|
-
* subscriptions: [{ id: 'tasks',
|
|
254
|
+
* subscriptions: [{ id: 'tasks', table: 'tasks', scopes: { user_id: 'user-456' } }],
|
|
255
255
|
* });
|
|
256
256
|
*
|
|
257
257
|
* await client.start();
|
|
@@ -353,12 +353,12 @@ export class Client<DB extends SyncClientDb = SyncClientDb> {
|
|
|
353
353
|
this.engine = new SyncEngine({
|
|
354
354
|
db: this.options.db,
|
|
355
355
|
transport: this.options.transport,
|
|
356
|
-
|
|
356
|
+
handlers: this.options.tableHandlers,
|
|
357
357
|
clientId: this.options.clientId,
|
|
358
358
|
actorId: this.options.actorId,
|
|
359
359
|
subscriptions: this.options.subscriptions.map((s) => ({
|
|
360
360
|
id: s.id,
|
|
361
|
-
|
|
361
|
+
table: s.table,
|
|
362
362
|
scopes: s.scopes ?? {},
|
|
363
363
|
params: s.params ?? {},
|
|
364
364
|
})),
|
|
@@ -416,7 +416,7 @@ export class Client<DB extends SyncClientDb = SyncClientDb> {
|
|
|
416
416
|
updateSubscriptions(
|
|
417
417
|
subscriptions: Array<{
|
|
418
418
|
id: string;
|
|
419
|
-
|
|
419
|
+
table: string;
|
|
420
420
|
scopes?: Record<string, string | string[]>;
|
|
421
421
|
params?: Record<string, unknown>;
|
|
422
422
|
}>
|
|
@@ -426,7 +426,7 @@ export class Client<DB extends SyncClientDb = SyncClientDb> {
|
|
|
426
426
|
this.engine.updateSubscriptions(
|
|
427
427
|
subscriptions.map((s) => ({
|
|
428
428
|
id: s.id,
|
|
429
|
-
|
|
429
|
+
table: s.table,
|
|
430
430
|
scopes: s.scopes ?? {},
|
|
431
431
|
params: s.params ?? {},
|
|
432
432
|
}))
|
|
@@ -439,13 +439,13 @@ export class Client<DB extends SyncClientDb = SyncClientDb> {
|
|
|
439
439
|
*/
|
|
440
440
|
getSubscriptions(): Array<{
|
|
441
441
|
id: string;
|
|
442
|
-
|
|
442
|
+
table: string;
|
|
443
443
|
scopes: Record<string, string | string[]>;
|
|
444
444
|
params: Record<string, unknown>;
|
|
445
445
|
}> {
|
|
446
446
|
return this.options.subscriptions.map((s) => ({
|
|
447
447
|
id: s.id,
|
|
448
|
-
|
|
448
|
+
table: s.table,
|
|
449
449
|
scopes: s.scopes ?? {},
|
|
450
450
|
params: s.params ?? {},
|
|
451
451
|
}));
|
package/src/create-client.ts
CHANGED
|
@@ -247,7 +247,7 @@ export async function createClient<DB extends SyncClientDb>(
|
|
|
247
247
|
});
|
|
248
248
|
return {
|
|
249
249
|
id: handler.table,
|
|
250
|
-
|
|
250
|
+
table: handler.table,
|
|
251
251
|
scopes,
|
|
252
252
|
params: {},
|
|
253
253
|
};
|
|
@@ -262,7 +262,7 @@ export async function createClient<DB extends SyncClientDb>(
|
|
|
262
262
|
}
|
|
263
263
|
return {
|
|
264
264
|
id: handler.table,
|
|
265
|
-
|
|
265
|
+
table: handler.table,
|
|
266
266
|
scopes,
|
|
267
267
|
params: sub.params ?? {},
|
|
268
268
|
};
|
|
@@ -57,7 +57,7 @@ describe('SyncEngine WS inline apply', () => {
|
|
|
57
57
|
.values({
|
|
58
58
|
state_id: 'default',
|
|
59
59
|
subscription_id: 'sub-1',
|
|
60
|
-
|
|
60
|
+
table: 'tasks',
|
|
61
61
|
scopes_json: '{}',
|
|
62
62
|
params_json: '{}',
|
|
63
63
|
cursor: 0,
|
|
@@ -74,7 +74,7 @@ describe('SyncEngine WS inline apply', () => {
|
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
it('rolls back row updates and cursor when any inline WS change fails', async () => {
|
|
77
|
-
const
|
|
77
|
+
const handlers = new ClientTableRegistry<TestDb>().register({
|
|
78
78
|
table: 'tasks',
|
|
79
79
|
async applySnapshot() {},
|
|
80
80
|
async clearAll() {},
|
|
@@ -101,7 +101,7 @@ describe('SyncEngine WS inline apply', () => {
|
|
|
101
101
|
const engine = new SyncEngine<TestDb>({
|
|
102
102
|
db,
|
|
103
103
|
transport: noopTransport,
|
|
104
|
-
|
|
104
|
+
handlers,
|
|
105
105
|
actorId: 'u1',
|
|
106
106
|
clientId: 'client-1',
|
|
107
107
|
subscriptions: [],
|
package/src/engine/SyncEngine.ts
CHANGED
|
@@ -573,19 +573,24 @@ export class SyncEngine<DB extends SyncClientDb = SyncClientDb> {
|
|
|
573
573
|
attributes: { trigger: triggerLabel },
|
|
574
574
|
},
|
|
575
575
|
() =>
|
|
576
|
-
syncOnce(
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
.
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
576
|
+
syncOnce(
|
|
577
|
+
this.config.db,
|
|
578
|
+
this.config.transport,
|
|
579
|
+
this.config.handlers,
|
|
580
|
+
{
|
|
581
|
+
clientId: this.config.clientId!,
|
|
582
|
+
actorId: this.config.actorId ?? undefined,
|
|
583
|
+
plugins: this.config.plugins,
|
|
584
|
+
subscriptions: this.config
|
|
585
|
+
.subscriptions as SyncSubscriptionRequest[],
|
|
586
|
+
limitCommits: this.config.limitCommits,
|
|
587
|
+
limitSnapshotRows: this.config.limitSnapshotRows,
|
|
588
|
+
maxSnapshotPages: this.config.maxSnapshotPages,
|
|
589
|
+
stateId: this.config.stateId,
|
|
590
|
+
sha256: this.config.sha256,
|
|
591
|
+
trigger,
|
|
592
|
+
}
|
|
593
|
+
)
|
|
589
594
|
);
|
|
590
595
|
|
|
591
596
|
const syncResult: SyncResult = {
|
|
@@ -750,7 +755,7 @@ export class SyncEngine<DB extends SyncClientDb = SyncClientDb> {
|
|
|
750
755
|
try {
|
|
751
756
|
await this.config.db.transaction().execute(async (trx) => {
|
|
752
757
|
for (const change of changes) {
|
|
753
|
-
const handler = this.config.
|
|
758
|
+
const handler = this.config.handlers.get(change.table);
|
|
754
759
|
if (!handler) {
|
|
755
760
|
throw new Error(
|
|
756
761
|
`Missing client table handler for WS change table "${change.table}"`
|
|
@@ -1391,13 +1396,13 @@ export class SyncEngine<DB extends SyncClientDb = SyncClientDb> {
|
|
|
1391
1396
|
}>
|
|
1392
1397
|
): Promise<void> {
|
|
1393
1398
|
const db = this.config.db;
|
|
1394
|
-
const
|
|
1399
|
+
const handlers = this.config.handlers;
|
|
1395
1400
|
const affectedTables = new Set<string>();
|
|
1396
1401
|
const now = Date.now();
|
|
1397
1402
|
|
|
1398
1403
|
await db.transaction().execute(async (trx) => {
|
|
1399
1404
|
for (const input of inputs) {
|
|
1400
|
-
const handler =
|
|
1405
|
+
const handler = handlers.get(input.table);
|
|
1401
1406
|
if (!handler) continue;
|
|
1402
1407
|
|
|
1403
1408
|
affectedTables.add(input.table);
|
package/src/engine/types.ts
CHANGED
|
@@ -139,8 +139,8 @@ export interface SyncEngineConfig<DB extends SyncClientDb = SyncClientDb> {
|
|
|
139
139
|
db: Kysely<DB>;
|
|
140
140
|
/** Sync transport */
|
|
141
141
|
transport: SyncTransport;
|
|
142
|
-
/** Client
|
|
143
|
-
|
|
142
|
+
/** Client table handler registry */
|
|
143
|
+
handlers: ClientTableRegistry<DB>;
|
|
144
144
|
/** Actor id for sync scoping (null/undefined disables sync) */
|
|
145
145
|
actorId: string | null | undefined;
|
|
146
146
|
/** Stable device/app installation id */
|
package/src/migrate.ts
CHANGED
|
@@ -2,9 +2,188 @@
|
|
|
2
2
|
* @syncular/client - Sync migrations (SQLite reference)
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type
|
|
5
|
+
import { type Kysely, sql } from 'kysely';
|
|
6
6
|
import type { SyncClientDb } from './schema';
|
|
7
7
|
|
|
8
|
+
type SyncInternalTable =
|
|
9
|
+
| 'sync_subscription_state'
|
|
10
|
+
| 'sync_outbox_commits'
|
|
11
|
+
| 'sync_conflicts';
|
|
12
|
+
|
|
13
|
+
function toErrorMessage(error: unknown): string {
|
|
14
|
+
return error instanceof Error ? error.message : String(error);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function isMissingTableError(message: string): boolean {
|
|
18
|
+
const normalized = message.toLowerCase();
|
|
19
|
+
return (
|
|
20
|
+
normalized.includes('no such table') ||
|
|
21
|
+
(normalized.includes('relation') && normalized.includes('does not exist'))
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function isMissingColumnError(message: string): boolean {
|
|
26
|
+
const normalized = message.toLowerCase();
|
|
27
|
+
return (
|
|
28
|
+
normalized.includes('no such column') ||
|
|
29
|
+
(normalized.includes('column') && normalized.includes('does not exist'))
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function isDuplicateColumnError(message: string): boolean {
|
|
34
|
+
const normalized = message.toLowerCase();
|
|
35
|
+
return (
|
|
36
|
+
normalized.includes('duplicate column name') ||
|
|
37
|
+
(normalized.includes('column') && normalized.includes('already exists'))
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function getColumnNames<DB extends SyncClientDb>(
|
|
42
|
+
db: Kysely<DB>,
|
|
43
|
+
tableName: SyncInternalTable
|
|
44
|
+
): Promise<Set<string> | null> {
|
|
45
|
+
try {
|
|
46
|
+
const sqlite = await sql<{ name: string }>`
|
|
47
|
+
select name from pragma_table_info(${sql.val(tableName)})
|
|
48
|
+
`.execute(db);
|
|
49
|
+
return new Set(sqlite.rows.map((row) => String(row.name)));
|
|
50
|
+
} catch {
|
|
51
|
+
// Not SQLite or pragma unavailable.
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
const postgres = await sql<{ name: string }>`
|
|
56
|
+
select column_name as name
|
|
57
|
+
from information_schema.columns
|
|
58
|
+
where table_name = ${sql.val(tableName)}
|
|
59
|
+
`.execute(db);
|
|
60
|
+
return new Set(postgres.rows.map((row) => String(row.name)));
|
|
61
|
+
} catch {
|
|
62
|
+
// Introspection unavailable; caller falls back to probing.
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function hasColumn<DB extends SyncClientDb>(
|
|
69
|
+
db: Kysely<DB>,
|
|
70
|
+
tableName: SyncInternalTable,
|
|
71
|
+
columnName: string
|
|
72
|
+
): Promise<boolean> {
|
|
73
|
+
const columns = await getColumnNames(db, tableName);
|
|
74
|
+
if (columns) {
|
|
75
|
+
return columns.has(columnName);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
await sql`select ${sql.ref(columnName)} from ${sql.table(tableName)} limit 1`.execute(
|
|
80
|
+
db
|
|
81
|
+
);
|
|
82
|
+
return true;
|
|
83
|
+
} catch (error) {
|
|
84
|
+
const message = toErrorMessage(error);
|
|
85
|
+
if (isMissingTableError(message) || isMissingColumnError(message)) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function addColumnIfMissing<DB extends SyncClientDb>(
|
|
93
|
+
db: Kysely<DB>,
|
|
94
|
+
tableName: SyncInternalTable,
|
|
95
|
+
columnName: string,
|
|
96
|
+
addColumn: () => Promise<void>
|
|
97
|
+
): Promise<void> {
|
|
98
|
+
if (await hasColumn(db, tableName, columnName)) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
await addColumn();
|
|
103
|
+
} catch (error) {
|
|
104
|
+
const message = toErrorMessage(error);
|
|
105
|
+
if (isDuplicateColumnError(message)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function ensureClientSyncSchemaCompat<DB extends SyncClientDb>(
|
|
113
|
+
db: Kysely<DB>
|
|
114
|
+
): Promise<void> {
|
|
115
|
+
const hasTableColumn = await hasColumn(
|
|
116
|
+
db,
|
|
117
|
+
'sync_subscription_state',
|
|
118
|
+
'table'
|
|
119
|
+
);
|
|
120
|
+
if (
|
|
121
|
+
!hasTableColumn &&
|
|
122
|
+
(await hasColumn(db, 'sync_subscription_state', 'shape'))
|
|
123
|
+
) {
|
|
124
|
+
try {
|
|
125
|
+
await sql`alter table ${sql.table('sync_subscription_state')} rename column ${sql.ref('shape')} to ${sql.ref('table')}`.execute(
|
|
126
|
+
db
|
|
127
|
+
);
|
|
128
|
+
} catch {
|
|
129
|
+
await addColumnIfMissing(
|
|
130
|
+
db,
|
|
131
|
+
'sync_subscription_state',
|
|
132
|
+
'table',
|
|
133
|
+
async () => {
|
|
134
|
+
await db.schema
|
|
135
|
+
.alterTable('sync_subscription_state')
|
|
136
|
+
.addColumn('table', 'text', (col) => col.notNull().defaultTo(''))
|
|
137
|
+
.execute();
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
await sql`update ${sql.table('sync_subscription_state')}
|
|
141
|
+
set ${sql.ref('table')} = ${sql.ref('shape')}
|
|
142
|
+
where ${sql.ref('table')} = ${sql.val('')}`.execute(db);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
await addColumnIfMissing(
|
|
147
|
+
db,
|
|
148
|
+
'sync_subscription_state',
|
|
149
|
+
'bootstrap_state_json',
|
|
150
|
+
async () => {
|
|
151
|
+
await db.schema
|
|
152
|
+
.alterTable('sync_subscription_state')
|
|
153
|
+
.addColumn('bootstrap_state_json', 'text')
|
|
154
|
+
.execute();
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
await addColumnIfMissing(
|
|
159
|
+
db,
|
|
160
|
+
'sync_outbox_commits',
|
|
161
|
+
'schema_version',
|
|
162
|
+
async () => {
|
|
163
|
+
await db.schema
|
|
164
|
+
.alterTable('sync_outbox_commits')
|
|
165
|
+
.addColumn('schema_version', 'integer', (col) =>
|
|
166
|
+
col.notNull().defaultTo(1)
|
|
167
|
+
)
|
|
168
|
+
.execute();
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
await addColumnIfMissing(db, 'sync_conflicts', 'resolved_at', async () => {
|
|
173
|
+
await db.schema
|
|
174
|
+
.alterTable('sync_conflicts')
|
|
175
|
+
.addColumn('resolved_at', 'bigint')
|
|
176
|
+
.execute();
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
await addColumnIfMissing(db, 'sync_conflicts', 'resolution', async () => {
|
|
180
|
+
await db.schema
|
|
181
|
+
.alterTable('sync_conflicts')
|
|
182
|
+
.addColumn('resolution', 'text')
|
|
183
|
+
.execute();
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
8
187
|
/**
|
|
9
188
|
* Ensures the client sync schema exists in the database.
|
|
10
189
|
* Safe to call multiple times (idempotent).
|
|
@@ -14,13 +193,13 @@ import type { SyncClientDb } from './schema';
|
|
|
14
193
|
export async function ensureClientSyncSchema<DB extends SyncClientDb>(
|
|
15
194
|
db: Kysely<DB>
|
|
16
195
|
): Promise<void> {
|
|
17
|
-
// Schema builder doesn't need typed access - operates on raw SQL
|
|
196
|
+
// Schema builder doesn't need typed access - operates on raw SQL.
|
|
18
197
|
await db.schema
|
|
19
198
|
.createTable('sync_subscription_state')
|
|
20
199
|
.ifNotExists()
|
|
21
200
|
.addColumn('state_id', 'text', (col) => col.notNull())
|
|
22
201
|
.addColumn('subscription_id', 'text', (col) => col.notNull())
|
|
23
|
-
.addColumn('
|
|
202
|
+
.addColumn('table', 'text', (col) => col.notNull())
|
|
24
203
|
.addColumn('scopes_json', 'text', (col) => col.notNull().defaultTo('{}'))
|
|
25
204
|
.addColumn('params_json', 'text', (col) => col.notNull())
|
|
26
205
|
.addColumn('cursor', 'bigint', (col) => col.notNull())
|
|
@@ -30,21 +209,6 @@ export async function ensureClientSyncSchema<DB extends SyncClientDb>(
|
|
|
30
209
|
.addColumn('updated_at', 'bigint', (col) => col.notNull())
|
|
31
210
|
.execute();
|
|
32
211
|
|
|
33
|
-
await db.schema
|
|
34
|
-
.createIndex('idx_sync_subscription_state_state_sub')
|
|
35
|
-
.ifNotExists()
|
|
36
|
-
.on('sync_subscription_state')
|
|
37
|
-
.columns(['state_id', 'subscription_id'])
|
|
38
|
-
.unique()
|
|
39
|
-
.execute();
|
|
40
|
-
|
|
41
|
-
await db.schema
|
|
42
|
-
.createIndex('idx_sync_subscription_state_state')
|
|
43
|
-
.ifNotExists()
|
|
44
|
-
.on('sync_subscription_state')
|
|
45
|
-
.columns(['state_id', 'updated_at'])
|
|
46
|
-
.execute();
|
|
47
|
-
|
|
48
212
|
await db.schema
|
|
49
213
|
.createTable('sync_outbox_commits')
|
|
50
214
|
.ifNotExists()
|
|
@@ -61,21 +225,6 @@ export async function ensureClientSyncSchema<DB extends SyncClientDb>(
|
|
|
61
225
|
.addColumn('schema_version', 'integer', (col) => col.notNull().defaultTo(1))
|
|
62
226
|
.execute();
|
|
63
227
|
|
|
64
|
-
await db.schema
|
|
65
|
-
.createIndex('idx_sync_outbox_commits_client_commit_id')
|
|
66
|
-
.ifNotExists()
|
|
67
|
-
.on('sync_outbox_commits')
|
|
68
|
-
.columns(['client_commit_id'])
|
|
69
|
-
.unique()
|
|
70
|
-
.execute();
|
|
71
|
-
|
|
72
|
-
await db.schema
|
|
73
|
-
.createIndex('idx_sync_outbox_commits_status_created_at')
|
|
74
|
-
.ifNotExists()
|
|
75
|
-
.on('sync_outbox_commits')
|
|
76
|
-
.columns(['status', 'created_at'])
|
|
77
|
-
.execute();
|
|
78
|
-
|
|
79
228
|
await db.schema
|
|
80
229
|
.createTable('sync_conflicts')
|
|
81
230
|
.ifNotExists()
|
|
@@ -93,6 +242,39 @@ export async function ensureClientSyncSchema<DB extends SyncClientDb>(
|
|
|
93
242
|
.addColumn('resolution', 'text')
|
|
94
243
|
.execute();
|
|
95
244
|
|
|
245
|
+
// Apply framework-managed compatibility upgrades for legacy sync tables.
|
|
246
|
+
await ensureClientSyncSchemaCompat(db);
|
|
247
|
+
|
|
248
|
+
await db.schema
|
|
249
|
+
.createIndex('idx_sync_subscription_state_state_sub')
|
|
250
|
+
.ifNotExists()
|
|
251
|
+
.on('sync_subscription_state')
|
|
252
|
+
.columns(['state_id', 'subscription_id'])
|
|
253
|
+
.unique()
|
|
254
|
+
.execute();
|
|
255
|
+
|
|
256
|
+
await db.schema
|
|
257
|
+
.createIndex('idx_sync_subscription_state_state')
|
|
258
|
+
.ifNotExists()
|
|
259
|
+
.on('sync_subscription_state')
|
|
260
|
+
.columns(['state_id', 'updated_at'])
|
|
261
|
+
.execute();
|
|
262
|
+
|
|
263
|
+
await db.schema
|
|
264
|
+
.createIndex('idx_sync_outbox_commits_client_commit_id')
|
|
265
|
+
.ifNotExists()
|
|
266
|
+
.on('sync_outbox_commits')
|
|
267
|
+
.columns(['client_commit_id'])
|
|
268
|
+
.unique()
|
|
269
|
+
.execute();
|
|
270
|
+
|
|
271
|
+
await db.schema
|
|
272
|
+
.createIndex('idx_sync_outbox_commits_status_created_at')
|
|
273
|
+
.ifNotExists()
|
|
274
|
+
.on('sync_outbox_commits')
|
|
275
|
+
.columns(['status', 'created_at'])
|
|
276
|
+
.execute();
|
|
277
|
+
|
|
96
278
|
await db.schema
|
|
97
279
|
.createIndex('idx_sync_conflicts_outbox_commit')
|
|
98
280
|
.ifNotExists()
|
|
@@ -50,7 +50,7 @@ function touchLru(
|
|
|
50
50
|
* - Operations are pushed in commit order for a given client (outbox ordering).
|
|
51
51
|
*
|
|
52
52
|
* This plugin:
|
|
53
|
-
* - Tracks the "next expected server version" per (
|
|
53
|
+
* - Tracks the "next expected server version" per (table, row_id) based on
|
|
54
54
|
* successfully applied pushes.
|
|
55
55
|
* - Rewrites outgoing `base_version` to that expected version when it is higher
|
|
56
56
|
* than the caller-provided value, preventing "self-conflicts" on hot rows.
|
|
@@ -122,7 +122,7 @@ export function createIncrementingVersionPlugin(
|
|
|
122
122
|
maxTrackedRows
|
|
123
123
|
);
|
|
124
124
|
} else {
|
|
125
|
-
// Insert case: most
|
|
125
|
+
// Insert case: most tables start at version 1.
|
|
126
126
|
touchLru(nextExpectedBaseVersionByRow, key, 1, maxTrackedRows);
|
|
127
127
|
}
|
|
128
128
|
}
|
package/src/pull-engine.test.ts
CHANGED
|
@@ -75,7 +75,7 @@ describe('applyPullResponse chunk streaming', () => {
|
|
|
75
75
|
},
|
|
76
76
|
};
|
|
77
77
|
|
|
78
|
-
const
|
|
78
|
+
const handlers = new ClientTableRegistry<TestDb>().register(
|
|
79
79
|
createClientHandler({
|
|
80
80
|
table: 'items',
|
|
81
81
|
scopes: ['items:{id}'],
|
|
@@ -87,7 +87,7 @@ describe('applyPullResponse chunk streaming', () => {
|
|
|
87
87
|
subscriptions: [
|
|
88
88
|
{
|
|
89
89
|
id: 'items-sub',
|
|
90
|
-
|
|
90
|
+
table: 'items',
|
|
91
91
|
scopes: {},
|
|
92
92
|
},
|
|
93
93
|
],
|
|
@@ -131,7 +131,7 @@ describe('applyPullResponse chunk streaming', () => {
|
|
|
131
131
|
await applyPullResponse(
|
|
132
132
|
db,
|
|
133
133
|
transport,
|
|
134
|
-
|
|
134
|
+
handlers,
|
|
135
135
|
options,
|
|
136
136
|
pullState,
|
|
137
137
|
response
|