@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.
@@ -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-122",
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-122",
50
- "@syncular/transport-http": "0.0.1-122"
49
+ "@syncular/core": "0.0.1-123",
50
+ "@syncular/transport-http": "0.0.1-123"
51
51
  },
52
52
  "peerDependencies": {
53
53
  "kysely": "*"
@@ -175,7 +175,7 @@ describe('Client conflict events', () => {
175
175
  engine = new SyncEngine<TestDb>({
176
176
  db,
177
177
  transport: noopTransport,
178
- shapes: handlers,
178
+ handlers: handlers,
179
179
  actorId: 'u1',
180
180
  clientId: 'client-1',
181
181
  subscriptions: [],
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
- shape: string;
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', shape: 'tasks', scopes: { user_id: 'user-456' } }],
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
- shapes: this.options.tableHandlers,
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
- shape: s.shape,
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
- shape: string;
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
- shape: s.shape,
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
- shape: string;
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
- shape: s.shape,
448
+ table: s.table,
449
449
  scopes: s.scopes ?? {},
450
450
  params: s.params ?? {},
451
451
  }));
@@ -247,7 +247,7 @@ export async function createClient<DB extends SyncClientDb>(
247
247
  });
248
248
  return {
249
249
  id: handler.table,
250
- shape: handler.table,
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
- shape: handler.table,
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
- shape: 'tasks',
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 shapes = new ClientTableRegistry<TestDb>().register({
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
- shapes,
104
+ handlers,
105
105
  actorId: 'u1',
106
106
  clientId: 'client-1',
107
107
  subscriptions: [],
@@ -573,19 +573,24 @@ export class SyncEngine<DB extends SyncClientDb = SyncClientDb> {
573
573
  attributes: { trigger: triggerLabel },
574
574
  },
575
575
  () =>
576
- syncOnce(this.config.db, this.config.transport, this.config.shapes, {
577
- clientId: this.config.clientId!,
578
- actorId: this.config.actorId ?? undefined,
579
- plugins: this.config.plugins,
580
- subscriptions: this.config
581
- .subscriptions as SyncSubscriptionRequest[],
582
- limitCommits: this.config.limitCommits,
583
- limitSnapshotRows: this.config.limitSnapshotRows,
584
- maxSnapshotPages: this.config.maxSnapshotPages,
585
- stateId: this.config.stateId,
586
- sha256: this.config.sha256,
587
- trigger,
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.shapes.get(change.table);
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 shapes = this.config.shapes;
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 = shapes.get(input.table);
1405
+ const handler = handlers.get(input.table);
1401
1406
  if (!handler) continue;
1402
1407
 
1403
1408
  affectedTables.add(input.table);
@@ -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 shape registry */
143
- shapes: ClientTableRegistry<DB>;
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 { Kysely } from 'kysely';
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('shape', 'text', (col) => col.notNull())
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 (shape, table, row_id) based on
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 shapes start at version 1.
125
+ // Insert case: most tables start at version 1.
126
126
  touchLru(nextExpectedBaseVersionByRow, key, 1, maxTrackedRows);
127
127
  }
128
128
  }
@@ -75,7 +75,7 @@ describe('applyPullResponse chunk streaming', () => {
75
75
  },
76
76
  };
77
77
 
78
- const shapes = new ClientTableRegistry<TestDb>().register(
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
- shape: 'items',
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
- shapes,
134
+ handlers,
135
135
  options,
136
136
  pullState,
137
137
  response