@syncular/server-dialect-sqlite 0.0.1-100

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.
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @syncular/server-dialect-sqlite - SQLite Server Sync Dialect
3
+ *
4
+ * SQLite adaptation of the commit-log based sync system.
5
+ * Works with any SQLite-compatible Kysely dialect (bun:sqlite, wa-sqlite, better-sqlite3, etc.).
6
+ *
7
+ * Key differences from Postgres:
8
+ * - No bigserial → INTEGER PRIMARY KEY AUTOINCREMENT
9
+ * - No JSONB → JSON stored as TEXT (with json_extract for filtering)
10
+ * - No array && overlap → JSON object key matching
11
+ * - No timestamptz → TEXT with ISO format
12
+ * - No GIN index → regular index + manual filtering
13
+ * - REPEATABLE READ → no-op (SQLite uses serializable by default)
14
+ */
15
+ import type { ScopeValues, StoredScopes } from '@syncular/core';
16
+ import type { DbExecutor } from '@syncular/server';
17
+ import { BaseServerSyncDialect, type IncrementalPullRow, type IncrementalPullRowsArgs } from '@syncular/server';
18
+ import type { SyncChangeRow, SyncCoreDb } from '@syncular/server/schema';
19
+ import type { Kysely, RawBuilder } from 'kysely';
20
+ export declare class SqliteServerSyncDialect extends BaseServerSyncDialect {
21
+ readonly name: "sqlite";
22
+ readonly supportsForUpdate = false;
23
+ readonly supportsSavepoints: boolean;
24
+ private readonly _supportsTransactions;
25
+ constructor(options?: {
26
+ supportsTransactions?: boolean;
27
+ });
28
+ protected buildNumberListFilter(values: number[]): RawBuilder<unknown>;
29
+ protected buildStringListFilter(values: string[]): RawBuilder<unknown>;
30
+ ensureSyncSchema<DB extends SyncCoreDb>(db: Kysely<DB>): Promise<void>;
31
+ executeInTransaction<DB extends SyncCoreDb, T>(db: Kysely<DB>, fn: (executor: DbExecutor<DB>) => Promise<T>): Promise<T>;
32
+ setRepeatableRead<DB extends SyncCoreDb>(_trx: DbExecutor<DB>): Promise<void>;
33
+ readChangesForCommits<DB extends SyncCoreDb>(db: DbExecutor<DB>, args: {
34
+ commitSeqs: number[];
35
+ table: string;
36
+ scopes: ScopeValues;
37
+ partitionId?: string;
38
+ }): Promise<SyncChangeRow[]>;
39
+ protected readIncrementalPullRowsBatch<DB extends SyncCoreDb>(db: DbExecutor<DB>, args: Omit<IncrementalPullRowsArgs, 'batchSize'>): Promise<IncrementalPullRow[]>;
40
+ compactChanges<DB extends SyncCoreDb>(db: DbExecutor<DB>, args: {
41
+ fullHistoryHours: number;
42
+ }): Promise<number>;
43
+ scopesToDb(scopes: StoredScopes): string;
44
+ dbToArray(value: unknown): string[];
45
+ arrayToDb(values: string[]): string;
46
+ ensureConsoleSchema<DB extends SyncCoreDb>(db: Kysely<DB>): Promise<void>;
47
+ }
48
+ export declare function createSqliteServerDialect(options?: {
49
+ supportsTransactions?: boolean;
50
+ }): SqliteServerSyncDialect;
51
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAU,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EACL,qBAAqB,EAGrB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAE7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAe,MAAM,QAAQ,CAAC;AA4F9D,qBAAa,uBAAwB,SAAQ,qBAAqB;IAChE,QAAQ,CAAC,IAAI,WAAqB;IAClC,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAEhD,YAAY,OAAO,CAAC,EAAE;QAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;KAAE,EAIvD;IAMD,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAMrE;IAED,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAMrE;IAMK,gBAAgB,CAAC,EAAE,SAAS,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6J3E;IAMK,oBAAoB,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC,EACjD,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,EAAE,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3C,OAAO,CAAC,CAAC,CAAC,CAqBZ;IAEK,iBAAiB,CAAC,EAAE,SAAS,UAAU,EAC3C,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;IAMK,qBAAqB,CAAC,EAAE,SAAS,UAAU,EAC/C,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,EAClB,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,WAAW,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC,aAAa,EAAE,CAAC,CA0C1B;IAED,UAAyB,4BAA4B,CAAC,EAAE,SAAS,UAAU,EACzE,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,EAClB,IAAI,EAAE,IAAI,CAAC,uBAAuB,EAAE,WAAW,CAAC,GAC/C,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAmF/B;IAEK,cAAc,CAAC,EAAE,SAAS,UAAU,EACxC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,EAClB,IAAI,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAA;KAAE,GACjC,OAAO,CAAC,MAAM,CAAC,CA6FjB;IAMD,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEvC;IAED,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAElC;IAED,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAElC;IAMK,mBAAmB,CAAC,EAAE,SAAS,UAAU,EAC7C,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GACb,OAAO,CAAC,IAAI,CAAC,CAuDf;CACF;AAED,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE;IAClD,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,GAAG,uBAAuB,CAE1B"}
package/dist/index.js ADDED
@@ -0,0 +1,501 @@
1
+ /**
2
+ * @syncular/server-dialect-sqlite - SQLite Server Sync Dialect
3
+ *
4
+ * SQLite adaptation of the commit-log based sync system.
5
+ * Works with any SQLite-compatible Kysely dialect (bun:sqlite, wa-sqlite, better-sqlite3, etc.).
6
+ *
7
+ * Key differences from Postgres:
8
+ * - No bigserial → INTEGER PRIMARY KEY AUTOINCREMENT
9
+ * - No JSONB → JSON stored as TEXT (with json_extract for filtering)
10
+ * - No array && overlap → JSON object key matching
11
+ * - No timestamptz → TEXT with ISO format
12
+ * - No GIN index → regular index + manual filtering
13
+ * - REPEATABLE READ → no-op (SQLite uses serializable by default)
14
+ */
15
+ import { BaseServerSyncDialect, coerceIsoString, coerceNumber, parseScopes, } from '@syncular/server';
16
+ import { sql } from 'kysely';
17
+ function isActiveTransaction(db) {
18
+ return db.isTransaction === true;
19
+ }
20
+ function createSavepointName() {
21
+ const randomPart = Math.floor(Math.random() * 1_000_000_000).toString(36);
22
+ return `syncular_sp_${Date.now().toString(36)}_${randomPart}`;
23
+ }
24
+ function parseJsonValue(value) {
25
+ if (value === null || value === undefined)
26
+ return null;
27
+ if (typeof value === 'object')
28
+ return value;
29
+ if (typeof value === 'string') {
30
+ try {
31
+ return JSON.parse(value);
32
+ }
33
+ catch {
34
+ return value;
35
+ }
36
+ }
37
+ return value;
38
+ }
39
+ function toStringArray(value) {
40
+ if (Array.isArray(value)) {
41
+ return value.filter((k) => typeof k === 'string');
42
+ }
43
+ if (typeof value === 'string') {
44
+ try {
45
+ const parsed = JSON.parse(value);
46
+ if (Array.isArray(parsed)) {
47
+ return parsed.filter((k) => typeof k === 'string');
48
+ }
49
+ }
50
+ catch {
51
+ // ignore
52
+ }
53
+ }
54
+ return [];
55
+ }
56
+ /**
57
+ * Check if stored scopes match the requested scope values.
58
+ * Uses OR semantics for arrays and treats missing keys as wildcards.
59
+ */
60
+ function scopesMatch(stored, requested) {
61
+ for (const [key, value] of Object.entries(requested)) {
62
+ const storedValue = stored[key];
63
+ if (storedValue === undefined)
64
+ return false;
65
+ if (Array.isArray(value)) {
66
+ if (!value.includes(storedValue))
67
+ return false;
68
+ }
69
+ else {
70
+ if (storedValue !== value)
71
+ return false;
72
+ }
73
+ }
74
+ return true;
75
+ }
76
+ async function ensurePartitionColumn(db, table) {
77
+ try {
78
+ await sql
79
+ .raw(`ALTER TABLE ${table} ADD COLUMN partition_id TEXT NOT NULL DEFAULT 'default'`)
80
+ .execute(db);
81
+ }
82
+ catch {
83
+ // Ignore when column already exists (or table is immutable in the current backend).
84
+ }
85
+ }
86
+ async function ensureTransportPathColumn(db) {
87
+ try {
88
+ await sql
89
+ .raw("ALTER TABLE sync_request_events ADD COLUMN transport_path TEXT NOT NULL DEFAULT 'direct'")
90
+ .execute(db);
91
+ }
92
+ catch {
93
+ // Ignore when column already exists (or table is immutable in the current backend).
94
+ }
95
+ }
96
+ export class SqliteServerSyncDialect extends BaseServerSyncDialect {
97
+ name = 'sqlite';
98
+ supportsForUpdate = false;
99
+ supportsSavepoints;
100
+ _supportsTransactions;
101
+ constructor(options) {
102
+ super();
103
+ this._supportsTransactions = options?.supportsTransactions ?? true;
104
+ this.supportsSavepoints = this._supportsTransactions;
105
+ }
106
+ // ===========================================================================
107
+ // SQL Fragment Hooks
108
+ // ===========================================================================
109
+ buildNumberListFilter(values) {
110
+ const list = sql.join(values.map((v) => sql `${v}`), sql `, `);
111
+ return sql `IN (${list})`;
112
+ }
113
+ buildStringListFilter(values) {
114
+ const list = sql.join(values.map((v) => sql `${v}`), sql `, `);
115
+ return sql `IN (${list})`;
116
+ }
117
+ // ===========================================================================
118
+ // Schema Setup
119
+ // ===========================================================================
120
+ async ensureSyncSchema(db) {
121
+ await sql `PRAGMA foreign_keys = ON`.execute(db);
122
+ const nowIso = sql `(strftime('%Y-%m-%dT%H:%M:%fZ','now'))`;
123
+ // sync_commits table
124
+ await db.schema
125
+ .createTable('sync_commits')
126
+ .ifNotExists()
127
+ .addColumn('commit_seq', 'integer', (col) => col.primaryKey().autoIncrement())
128
+ .addColumn('partition_id', 'text', (col) => col.notNull().defaultTo('default'))
129
+ .addColumn('actor_id', 'text', (col) => col.notNull())
130
+ .addColumn('client_id', 'text', (col) => col.notNull())
131
+ .addColumn('client_commit_id', 'text', (col) => col.notNull())
132
+ .addColumn('created_at', 'text', (col) => col.notNull().defaultTo(nowIso))
133
+ .addColumn('meta', 'json')
134
+ .addColumn('result_json', 'json')
135
+ .addColumn('change_count', 'integer', (col) => col.notNull().defaultTo(0))
136
+ .addColumn('affected_tables', 'text', (col) => col.notNull().defaultTo('[]'))
137
+ .execute();
138
+ await ensurePartitionColumn(db, 'sync_commits');
139
+ await sql `DROP INDEX IF EXISTS idx_sync_commits_client_commit`.execute(db);
140
+ await sql `CREATE UNIQUE INDEX IF NOT EXISTS idx_sync_commits_client_commit
141
+ ON sync_commits(partition_id, client_id, client_commit_id)`.execute(db);
142
+ // sync_table_commits table (index of which commits affect which tables)
143
+ await db.schema
144
+ .createTable('sync_table_commits')
145
+ .ifNotExists()
146
+ .addColumn('partition_id', 'text', (col) => col.notNull().defaultTo('default'))
147
+ .addColumn('table', 'text', (col) => col.notNull())
148
+ .addColumn('commit_seq', 'integer', (col) => col.notNull().references('sync_commits.commit_seq').onDelete('cascade'))
149
+ .addPrimaryKeyConstraint('sync_table_commits_pk', [
150
+ 'partition_id',
151
+ 'table',
152
+ 'commit_seq',
153
+ ])
154
+ .execute();
155
+ await ensurePartitionColumn(db, 'sync_table_commits');
156
+ // Ensure unique index matches ON CONFLICT clause in push.ts
157
+ // (needed when migrating from old schema where PK was only (table, commit_seq))
158
+ await sql `CREATE UNIQUE INDEX IF NOT EXISTS idx_sync_table_commits_partition_pk
159
+ ON sync_table_commits(partition_id, "table", commit_seq)`.execute(db);
160
+ await sql `CREATE INDEX IF NOT EXISTS idx_sync_table_commits_commit_seq
161
+ ON sync_table_commits(partition_id, commit_seq)`.execute(db);
162
+ // sync_changes table - uses JSON for scopes
163
+ await db.schema
164
+ .createTable('sync_changes')
165
+ .ifNotExists()
166
+ .addColumn('change_id', 'integer', (col) => col.primaryKey().autoIncrement())
167
+ .addColumn('partition_id', 'text', (col) => col.notNull().defaultTo('default'))
168
+ .addColumn('commit_seq', 'integer', (col) => col.notNull().references('sync_commits.commit_seq').onDelete('cascade'))
169
+ .addColumn('table', 'text', (col) => col.notNull())
170
+ .addColumn('row_id', 'text', (col) => col.notNull())
171
+ .addColumn('op', 'text', (col) => col.notNull())
172
+ .addColumn('row_json', 'json')
173
+ .addColumn('row_version', 'integer')
174
+ .addColumn('scopes', 'json', (col) => col.notNull())
175
+ .execute();
176
+ await ensurePartitionColumn(db, 'sync_changes');
177
+ await sql `CREATE INDEX IF NOT EXISTS idx_sync_changes_commit_seq
178
+ ON sync_changes(partition_id, commit_seq)`.execute(db);
179
+ await sql `CREATE INDEX IF NOT EXISTS idx_sync_changes_table
180
+ ON sync_changes(partition_id, "table")`.execute(db);
181
+ // sync_client_cursors table
182
+ await db.schema
183
+ .createTable('sync_client_cursors')
184
+ .ifNotExists()
185
+ .addColumn('partition_id', 'text', (col) => col.notNull().defaultTo('default'))
186
+ .addColumn('client_id', 'text', (col) => col.notNull())
187
+ .addColumn('actor_id', 'text', (col) => col.notNull())
188
+ .addColumn('cursor', 'integer', (col) => col.notNull().defaultTo(0))
189
+ .addColumn('effective_scopes', 'json', (col) => col.notNull().defaultTo('{}'))
190
+ .addColumn('updated_at', 'text', (col) => col.notNull().defaultTo(nowIso))
191
+ .addPrimaryKeyConstraint('sync_client_cursors_pk', [
192
+ 'partition_id',
193
+ 'client_id',
194
+ ])
195
+ .execute();
196
+ await ensurePartitionColumn(db, 'sync_client_cursors');
197
+ // Ensure unique index matches ON CONFLICT clause in recordClientCursor
198
+ // (needed when migrating from old schema where PK was only (client_id))
199
+ await sql `CREATE UNIQUE INDEX IF NOT EXISTS idx_sync_client_cursors_partition_pk
200
+ ON sync_client_cursors(partition_id, client_id)`.execute(db);
201
+ await sql `CREATE INDEX IF NOT EXISTS idx_sync_client_cursors_updated_at
202
+ ON sync_client_cursors(updated_at)`.execute(db);
203
+ // sync_snapshot_chunks table
204
+ await db.schema
205
+ .createTable('sync_snapshot_chunks')
206
+ .ifNotExists()
207
+ .addColumn('chunk_id', 'text', (col) => col.primaryKey())
208
+ .addColumn('partition_id', 'text', (col) => col.notNull().defaultTo('default'))
209
+ .addColumn('scope_key', 'text', (col) => col.notNull())
210
+ .addColumn('scope', 'text', (col) => col.notNull())
211
+ .addColumn('as_of_commit_seq', 'integer', (col) => col.notNull())
212
+ .addColumn('row_cursor', 'text', (col) => col.notNull().defaultTo(''))
213
+ .addColumn('row_limit', 'integer', (col) => col.notNull())
214
+ .addColumn('encoding', 'text', (col) => col.notNull())
215
+ .addColumn('compression', 'text', (col) => col.notNull())
216
+ .addColumn('sha256', 'text', (col) => col.notNull())
217
+ .addColumn('byte_length', 'integer', (col) => col.notNull())
218
+ .addColumn('blob_hash', 'text', (col) => col.notNull().defaultTo(''))
219
+ .addColumn('body', 'blob') // Deprecated: use blob storage
220
+ .addColumn('created_at', 'text', (col) => col.notNull().defaultTo(nowIso))
221
+ .addColumn('expires_at', 'text', (col) => col.notNull())
222
+ .execute();
223
+ await ensurePartitionColumn(db, 'sync_snapshot_chunks');
224
+ await sql `CREATE INDEX IF NOT EXISTS idx_sync_snapshot_chunks_expires_at
225
+ ON sync_snapshot_chunks(expires_at)`.execute(db);
226
+ await sql `CREATE UNIQUE INDEX IF NOT EXISTS idx_sync_snapshot_chunks_page_key
227
+ ON sync_snapshot_chunks(partition_id, scope_key, scope, as_of_commit_seq, row_cursor, row_limit, encoding, compression)`.execute(db);
228
+ // Cleanup orphaned rows
229
+ await sql `
230
+ DELETE FROM sync_table_commits
231
+ WHERE commit_seq NOT IN (SELECT commit_seq FROM sync_commits)
232
+ `.execute(db);
233
+ await sql `
234
+ DELETE FROM sync_changes
235
+ WHERE commit_seq NOT IN (SELECT commit_seq FROM sync_commits)
236
+ `.execute(db);
237
+ }
238
+ // ===========================================================================
239
+ // Transaction Control
240
+ // ===========================================================================
241
+ async executeInTransaction(db, fn) {
242
+ if (isActiveTransaction(db)) {
243
+ if (!this._supportsTransactions) {
244
+ return fn(db);
245
+ }
246
+ const savepoint = createSavepointName();
247
+ await sql.raw(`SAVEPOINT ${savepoint}`).execute(db);
248
+ try {
249
+ const result = await fn(db);
250
+ await sql.raw(`RELEASE SAVEPOINT ${savepoint}`).execute(db);
251
+ return result;
252
+ }
253
+ catch (error) {
254
+ await sql.raw(`ROLLBACK TO SAVEPOINT ${savepoint}`).execute(db);
255
+ await sql.raw(`RELEASE SAVEPOINT ${savepoint}`).execute(db);
256
+ throw error;
257
+ }
258
+ }
259
+ if (this._supportsTransactions) {
260
+ return db.transaction().execute(fn);
261
+ }
262
+ return fn(db);
263
+ }
264
+ async setRepeatableRead(_trx) {
265
+ // SQLite uses serializable isolation by default in WAL mode.
266
+ }
267
+ // ===========================================================================
268
+ // Commit/Change Log Queries (dialect-specific)
269
+ // ===========================================================================
270
+ async readChangesForCommits(db, args) {
271
+ const partitionId = args.partitionId ?? 'default';
272
+ if (args.commitSeqs.length === 0)
273
+ return [];
274
+ const commitSeqsIn = sql.join(args.commitSeqs.map((seq) => sql `${seq}`), sql `, `);
275
+ // Fetch all changes for the table and commit sequences
276
+ const res = await sql `
277
+ SELECT commit_seq, "table", row_id, op, row_json, row_version, scopes
278
+ FROM sync_changes
279
+ WHERE commit_seq IN (${commitSeqsIn})
280
+ AND partition_id = ${partitionId}
281
+ AND "table" = ${args.table}
282
+ ORDER BY commit_seq ASC, change_id ASC
283
+ `.execute(db);
284
+ // Filter by scopes (manual, since SQLite JSON operators are limited)
285
+ return res.rows
286
+ .filter((row) => {
287
+ const storedScopes = parseScopes(row.scopes);
288
+ return scopesMatch(storedScopes, args.scopes);
289
+ })
290
+ .map((row) => ({
291
+ commit_seq: coerceNumber(row.commit_seq) ?? 0,
292
+ table: row.table,
293
+ row_id: row.row_id,
294
+ op: row.op,
295
+ row_json: parseJsonValue(row.row_json),
296
+ row_version: coerceNumber(row.row_version),
297
+ scopes: parseScopes(row.scopes),
298
+ }));
299
+ }
300
+ async readIncrementalPullRowsBatch(db, args) {
301
+ const partitionId = args.partitionId ?? 'default';
302
+ const limitCommits = Math.max(1, Math.min(500, args.limitCommits));
303
+ // Get commit_seqs for this table
304
+ const commitSeqsRes = await sql `
305
+ SELECT commit_seq
306
+ FROM sync_table_commits
307
+ WHERE partition_id = ${partitionId}
308
+ AND "table" = ${args.table}
309
+ AND commit_seq > ${args.cursor}
310
+ AND EXISTS (
311
+ SELECT 1
312
+ FROM sync_commits cm
313
+ WHERE cm.commit_seq = sync_table_commits.commit_seq
314
+ AND cm.partition_id = ${partitionId}
315
+ )
316
+ ORDER BY commit_seq ASC
317
+ LIMIT ${limitCommits}
318
+ `.execute(db);
319
+ const commitSeqs = commitSeqsRes.rows
320
+ .map((r) => coerceNumber(r.commit_seq))
321
+ .filter((n) => n !== null);
322
+ if (commitSeqs.length === 0)
323
+ return [];
324
+ const commitSeqsIn = sql.join(commitSeqs.map((seq) => sql `${seq}`), sql `, `);
325
+ // Get commits and changes for these commit_seqs
326
+ const changesRes = await sql `
327
+ SELECT
328
+ cm.commit_seq,
329
+ cm.actor_id,
330
+ cm.created_at,
331
+ c.change_id,
332
+ c."table",
333
+ c.row_id,
334
+ c.op,
335
+ c.row_json,
336
+ c.row_version,
337
+ c.scopes
338
+ FROM sync_commits cm
339
+ JOIN sync_changes c ON c.commit_seq = cm.commit_seq
340
+ WHERE cm.commit_seq IN (${commitSeqsIn})
341
+ AND cm.partition_id = ${partitionId}
342
+ AND c.partition_id = ${partitionId}
343
+ AND c."table" = ${args.table}
344
+ ORDER BY cm.commit_seq ASC, c.change_id ASC
345
+ `.execute(db);
346
+ // Filter by scopes and transform
347
+ return changesRes.rows
348
+ .filter((row) => {
349
+ const storedScopes = parseScopes(row.scopes);
350
+ return scopesMatch(storedScopes, args.scopes);
351
+ })
352
+ .map((row) => ({
353
+ commit_seq: coerceNumber(row.commit_seq) ?? 0,
354
+ actor_id: row.actor_id,
355
+ created_at: coerceIsoString(row.created_at),
356
+ change_id: coerceNumber(row.change_id) ?? 0,
357
+ table: row.table,
358
+ row_id: row.row_id,
359
+ op: row.op,
360
+ row_json: parseJsonValue(row.row_json),
361
+ row_version: coerceNumber(row.row_version),
362
+ scopes: parseScopes(row.scopes),
363
+ }));
364
+ }
365
+ async compactChanges(db, args) {
366
+ const cutoffIso = new Date(Date.now() - args.fullHistoryHours * 60 * 60 * 1000).toISOString();
367
+ // Find all old changes
368
+ const oldChanges = await sql `
369
+ SELECT c.change_id, c.partition_id, c.commit_seq, c."table", c.row_id, c.scopes
370
+ FROM sync_changes c
371
+ JOIN sync_commits cm ON cm.commit_seq = c.commit_seq
372
+ WHERE cm.created_at < ${cutoffIso}
373
+ `.execute(db);
374
+ // Group by (partition_id, table, row_id, scopes)
375
+ const groups = new Map();
376
+ for (const row of oldChanges.rows) {
377
+ const scopesStr = JSON.stringify(parseScopes(row.scopes));
378
+ const key = `${row.partition_id}|${row.table}|${row.row_id}|${scopesStr}`;
379
+ if (!groups.has(key)) {
380
+ groups.set(key, []);
381
+ }
382
+ groups.get(key).push({
383
+ change_id: coerceNumber(row.change_id) ?? 0,
384
+ commit_seq: coerceNumber(row.commit_seq) ?? 0,
385
+ });
386
+ }
387
+ // Find change_ids to delete (all but the one with highest commit_seq)
388
+ const toDelete = [];
389
+ for (const changes of groups.values()) {
390
+ if (changes.length <= 1)
391
+ continue;
392
+ changes.sort((a, b) => {
393
+ if (a.commit_seq !== b.commit_seq)
394
+ return b.commit_seq - a.commit_seq;
395
+ return b.change_id - a.change_id;
396
+ });
397
+ for (let i = 1; i < changes.length; i++) {
398
+ toDelete.push(changes[i].change_id);
399
+ }
400
+ }
401
+ if (toDelete.length === 0)
402
+ return 0;
403
+ // Delete in batches
404
+ const deleteBatchSize = 500;
405
+ let deleted = 0;
406
+ for (let i = 0; i < toDelete.length; i += deleteBatchSize) {
407
+ const batch = toDelete.slice(i, i + deleteBatchSize);
408
+ const batchIn = sql.join(batch.map((id) => sql `${id}`), sql `, `);
409
+ const res = await sql `
410
+ DELETE FROM sync_changes
411
+ WHERE change_id IN (${batchIn})
412
+ `.execute(db);
413
+ deleted += Number(res.numAffectedRows ?? 0);
414
+ }
415
+ // Remove routing index entries that no longer have any remaining changes
416
+ await sql `
417
+ DELETE FROM sync_table_commits
418
+ WHERE commit_seq IN (
419
+ SELECT commit_seq
420
+ FROM sync_commits
421
+ WHERE created_at < ${cutoffIso}
422
+ AND partition_id = sync_table_commits.partition_id
423
+ )
424
+ AND NOT EXISTS (
425
+ SELECT 1
426
+ FROM sync_changes c
427
+ WHERE c.commit_seq = sync_table_commits.commit_seq
428
+ AND c.partition_id = sync_table_commits.partition_id
429
+ AND c."table" = sync_table_commits."table"
430
+ )
431
+ `.execute(db);
432
+ return deleted;
433
+ }
434
+ // ===========================================================================
435
+ // Scope Conversion Helpers
436
+ // ===========================================================================
437
+ scopesToDb(scopes) {
438
+ return JSON.stringify(scopes);
439
+ }
440
+ dbToArray(value) {
441
+ return toStringArray(value);
442
+ }
443
+ arrayToDb(values) {
444
+ return JSON.stringify(values.filter((v) => v.length > 0));
445
+ }
446
+ // ===========================================================================
447
+ // Console Schema (Request Events)
448
+ // ===========================================================================
449
+ async ensureConsoleSchema(db) {
450
+ const nowIso = sql `(strftime('%Y-%m-%dT%H:%M:%fZ','now'))`;
451
+ await db.schema
452
+ .createTable('sync_request_events')
453
+ .ifNotExists()
454
+ .addColumn('event_id', 'integer', (col) => col.primaryKey().autoIncrement())
455
+ .addColumn('event_type', 'text', (col) => col.notNull())
456
+ .addColumn('actor_id', 'text', (col) => col.notNull())
457
+ .addColumn('client_id', 'text', (col) => col.notNull())
458
+ .addColumn('status_code', 'integer', (col) => col.notNull())
459
+ .addColumn('outcome', 'text', (col) => col.notNull())
460
+ .addColumn('duration_ms', 'integer', (col) => col.notNull())
461
+ .addColumn('commit_seq', 'integer')
462
+ .addColumn('operation_count', 'integer')
463
+ .addColumn('row_count', 'integer')
464
+ .addColumn('tables', 'text', (col) => col.notNull().defaultTo('[]'))
465
+ .addColumn('error_message', 'text')
466
+ .addColumn('transport_path', 'text', (col) => col.notNull().defaultTo('direct'))
467
+ .addColumn('created_at', 'text', (col) => col.notNull().defaultTo(nowIso))
468
+ .execute();
469
+ await ensureTransportPathColumn(db);
470
+ await sql `CREATE INDEX IF NOT EXISTS idx_sync_request_events_created_at
471
+ ON sync_request_events(created_at DESC)`.execute(db);
472
+ await sql `CREATE INDEX IF NOT EXISTS idx_sync_request_events_event_type
473
+ ON sync_request_events(event_type)`.execute(db);
474
+ await sql `CREATE INDEX IF NOT EXISTS idx_sync_request_events_client_id
475
+ ON sync_request_events(client_id)`.execute(db);
476
+ // API Keys table
477
+ await db.schema
478
+ .createTable('sync_api_keys')
479
+ .ifNotExists()
480
+ .addColumn('key_id', 'text', (col) => col.primaryKey())
481
+ .addColumn('key_hash', 'text', (col) => col.notNull())
482
+ .addColumn('key_prefix', 'text', (col) => col.notNull())
483
+ .addColumn('name', 'text', (col) => col.notNull())
484
+ .addColumn('key_type', 'text', (col) => col.notNull())
485
+ .addColumn('scope_keys', 'text', (col) => col.defaultTo('[]'))
486
+ .addColumn('actor_id', 'text')
487
+ .addColumn('created_at', 'text', (col) => col.notNull().defaultTo(nowIso))
488
+ .addColumn('expires_at', 'text')
489
+ .addColumn('last_used_at', 'text')
490
+ .addColumn('revoked_at', 'text')
491
+ .execute();
492
+ await sql `CREATE INDEX IF NOT EXISTS idx_sync_api_keys_key_hash
493
+ ON sync_api_keys(key_hash)`.execute(db);
494
+ await sql `CREATE INDEX IF NOT EXISTS idx_sync_api_keys_key_type
495
+ ON sync_api_keys(key_type)`.execute(db);
496
+ }
497
+ }
498
+ export function createSqliteServerDialect(options) {
499
+ return new SqliteServerSyncDialect(options);
500
+ }
501
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@syncular/server-dialect-sqlite",
3
+ "version": "0.0.1-100",
4
+ "description": "SQLite dialect for the Syncular server",
5
+ "license": "MIT",
6
+ "author": "Benjamin Kniffler",
7
+ "homepage": "https://syncular.dev",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/syncular/syncular.git",
11
+ "directory": "packages/server-dialect-sqlite"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/syncular/syncular/issues"
15
+ },
16
+ "keywords": [
17
+ "sync",
18
+ "offline-first",
19
+ "realtime",
20
+ "database",
21
+ "typescript"
22
+ ],
23
+ "private": false,
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "type": "module",
28
+ "exports": {
29
+ ".": {
30
+ "bun": "./src/index.ts",
31
+ "import": {
32
+ "types": "./dist/index.d.ts",
33
+ "default": "./dist/index.js"
34
+ }
35
+ }
36
+ },
37
+ "scripts": {
38
+ "tsgo": "tsgo --noEmit",
39
+ "build": "tsgo",
40
+ "release": "bunx syncular-publish"
41
+ },
42
+ "dependencies": {
43
+ "@syncular/core": "0.0.1",
44
+ "@syncular/server": "0.0.1"
45
+ },
46
+ "peerDependencies": {
47
+ "kysely": "^0.28.0"
48
+ },
49
+ "devDependencies": {
50
+ "@syncular/config": "0.0.0",
51
+ "kysely": "*"
52
+ },
53
+ "files": [
54
+ "dist",
55
+ "src"
56
+ ]
57
+ }