@syncular/server-dialect-postgres 0.0.1-72 → 0.0.1-83

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/index.d.ts CHANGED
@@ -11,38 +11,39 @@
11
11
  * - sync_client_cursors: per-client cursor tracking (pruning/observability)
12
12
  */
13
13
  import type { ScopeValues, StoredScopes, SyncOp } from '@syncular/core';
14
- import type { DbExecutor, ServerSyncDialect } from '@syncular/server';
15
- import type { SyncChangeRow, SyncCommitRow, SyncCoreDb } from '@syncular/server/schema';
16
- import type { Kysely, Transaction } from 'kysely';
17
- export declare class PostgresServerSyncDialect implements ServerSyncDialect {
14
+ import type { DbExecutor } from '@syncular/server';
15
+ import { BaseServerSyncDialect } from '@syncular/server';
16
+ import type { SyncChangeRow, SyncCoreDb } from '@syncular/server/schema';
17
+ import type { Kysely, RawBuilder, Transaction } from 'kysely';
18
+ export declare class PostgresServerSyncDialect extends BaseServerSyncDialect {
18
19
  readonly name: "postgres";
19
20
  readonly supportsForUpdate = true;
20
21
  readonly supportsSavepoints = true;
22
+ protected buildNumberListFilter(values: number[]): RawBuilder<unknown>;
23
+ protected buildStringListFilter(values: string[]): RawBuilder<unknown>;
21
24
  ensureSyncSchema<DB extends SyncCoreDb>(db: Kysely<DB>): Promise<void>;
22
25
  executeInTransaction<DB extends SyncCoreDb, T>(db: Kysely<DB>, fn: (executor: DbExecutor<DB>) => Promise<T>): Promise<T>;
23
26
  setRepeatableRead<DB extends SyncCoreDb>(trx: DbExecutor<DB>): Promise<void>;
24
- readMaxCommitSeq<DB extends SyncCoreDb>(db: Kysely<DB> | Transaction<DB>, options?: {
25
- partitionId?: string;
26
- }): Promise<number>;
27
- readMinCommitSeq<DB extends SyncCoreDb>(db: Kysely<DB> | Transaction<DB>, options?: {
28
- partitionId?: string;
29
- }): Promise<number>;
30
27
  readCommitSeqsForPull<DB extends SyncCoreDb>(db: Kysely<DB> | Transaction<DB>, args: {
31
28
  cursor: number;
32
29
  limitCommits: number;
33
30
  tables: string[];
34
31
  partitionId?: string;
35
32
  }): Promise<number[]>;
36
- readCommits<DB extends SyncCoreDb>(db: Kysely<DB> | Transaction<DB>, commitSeqs: number[], options?: {
33
+ recordClientCursor<DB extends SyncCoreDb>(db: Kysely<DB> | Transaction<DB>, args: {
37
34
  partitionId?: string;
38
- }): Promise<SyncCommitRow[]>;
39
- readChangesForCommits<DB extends SyncCoreDb>(db: Kysely<DB> | Transaction<DB>, args: {
35
+ clientId: string;
36
+ actorId: string;
37
+ cursor: number;
38
+ effectiveScopes: ScopeValues;
39
+ }): Promise<void>;
40
+ readChangesForCommits<DB extends SyncCoreDb>(db: DbExecutor<DB>, args: {
40
41
  commitSeqs: number[];
41
42
  table: string;
42
43
  scopes: ScopeValues;
43
44
  partitionId?: string;
44
45
  }): Promise<SyncChangeRow[]>;
45
- readIncrementalPullRows<DB extends SyncCoreDb>(db: Kysely<DB> | Transaction<DB>, args: {
46
+ readIncrementalPullRows<DB extends SyncCoreDb>(db: DbExecutor<DB>, args: {
46
47
  table: string;
47
48
  scopes: ScopeValues;
48
49
  cursor: number;
@@ -79,23 +80,12 @@ export declare class PostgresServerSyncDialect implements ServerSyncDialect {
79
80
  row_version: number | null;
80
81
  scopes: StoredScopes;
81
82
  }>;
82
- compactChanges<DB extends SyncCoreDb>(db: Kysely<DB> | Transaction<DB>, args: {
83
+ compactChanges<DB extends SyncCoreDb>(db: DbExecutor<DB>, args: {
83
84
  fullHistoryHours: number;
84
85
  }): Promise<number>;
85
- recordClientCursor<DB extends SyncCoreDb>(db: Kysely<DB> | Transaction<DB>, args: {
86
- partitionId?: string;
87
- clientId: string;
88
- actorId: string;
89
- cursor: number;
90
- effectiveScopes: ScopeValues;
91
- }): Promise<void>;
92
86
  scopesToDb(scopes: StoredScopes): StoredScopes;
93
- dbToScopes(value: unknown): StoredScopes;
94
87
  dbToArray(value: unknown): string[];
95
88
  arrayToDb(values: string[]): string[];
96
- readAffectedTablesFromChanges<DB extends SyncCoreDb>(db: Kysely<DB> | Transaction<DB>, commitSeq: number, options?: {
97
- partitionId?: string;
98
- }): Promise<string[]>;
99
89
  ensureConsoleSchema<DB extends SyncCoreDb>(db: Kysely<DB>): Promise<void>;
100
90
  private ensureIndex;
101
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,UAAU,EACX,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAmClD,qBAAa,yBAA0B,YAAW,iBAAiB;IACjE,QAAQ,CAAC,IAAI,aAAuB;IACpC,QAAQ,CAAC,iBAAiB,QAAQ;IAClC,QAAQ,CAAC,kBAAkB,QAAQ;IAM7B,gBAAgB,CAAC,EAAE,SAAS,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA4M3E;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,CAEZ;IAEK,iBAAiB,CAAC,EAAE,SAAS,UAAU,EAC3C,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC,GAClB,OAAO,CAAC,IAAI,CAAC,CAEf;IAMK,gBAAgB,CAAC,EAAE,SAAS,UAAU,EAC1C,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,EAChC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACjC,OAAO,CAAC,MAAM,CAAC,CASjB;IAEK,gBAAgB,CAAC,EAAE,SAAS,UAAU,EAC1C,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,EAChC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACjC,OAAO,CAAC,MAAM,CAAC,CASjB;IAEK,qBAAqB,CAAC,EAAE,SAAS,UAAU,EAC/C,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,EAChC,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC,MAAM,EAAE,CAAC,CAuCnB;IAEK,WAAW,CAAC,EAAE,SAAS,UAAU,EACrC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,EAChC,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACjC,OAAO,CAAC,aAAa,EAAE,CAAC,CAuB1B;IAEK,qBAAqB,CAAC,EAAE,SAAS,UAAU,EAC/C,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,EAChC,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,CAgE1B;IAEK,uBAAuB,CAAC,EAAE,SAAS,UAAU,EACjD,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,EAChC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,WAAW,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CACR,KAAK,CAAC;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,MAAM,EAAE,YAAY,CAAC;KACtB,CAAC,CACH,CAmFA;IAEM,yBAAyB,CAAC,EAAE,SAAS,UAAU,EACpD,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,EAChC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,WAAW,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,cAAc,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,MAAM,EAAE,YAAY,CAAC;KACtB,CAAC,CAqBD;IAEK,cAAc,CAAC,EAAE,SAAS,UAAU,EACxC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,EAChC,IAAI,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAA;KAAE,GACjC,OAAO,CAAC,MAAM,CAAC,CAwCjB;IAMK,kBAAkB,CAAC,EAAE,SAAS,UAAU,EAC5C,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,EAChC,IAAI,EAAE;QACJ,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,WAAW,CAAC;KAC9B,GACA,OAAO,CAAC,IAAI,CAAC,CAcf;IAMD,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAE7C;IAED,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAEvC;IAED,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAKlC;IAED,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEpC;IAEK,6BAA6B,CAAC,EAAE,SAAS,UAAU,EACvD,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,EAChC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CAYnB;IAMK,mBAAmB,CAAC,EAAE,SAAS,UAAU,EAC7C,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GACb,OAAO,CAAC,IAAI,CAAC,CAmEf;YAMa,WAAW;CAgB1B;AAED,wBAAgB,2BAA2B,IAAI,yBAAyB,CAEvE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -10,46 +10,22 @@
10
10
  * - sync_changes: change log (JSONB scopes for filtering)
11
11
  * - sync_client_cursors: per-client cursor tracking (pruning/observability)
12
12
  */
13
+ import { BaseServerSyncDialect, coerceIsoString, coerceNumber, parseScopes, } from '@syncular/server';
13
14
  import { sql } from 'kysely';
14
- function coerceNumber(value) {
15
- if (value === null || value === undefined)
16
- return null;
17
- if (typeof value === 'number')
18
- return Number.isFinite(value) ? value : null;
19
- if (typeof value === 'bigint')
20
- return Number.isFinite(Number(value)) ? Number(value) : null;
21
- if (typeof value === 'string') {
22
- const n = Number(value);
23
- return Number.isFinite(n) ? n : null;
24
- }
25
- return null;
26
- }
27
- function coerceIsoString(value) {
28
- if (typeof value === 'string')
29
- return value;
30
- if (value instanceof Date)
31
- return value.toISOString();
32
- return String(value);
33
- }
34
- function parseScopes(value) {
35
- if (value === null || value === undefined)
36
- return {};
37
- if (typeof value === 'object' && !Array.isArray(value)) {
38
- const result = {};
39
- for (const [k, v] of Object.entries(value)) {
40
- if (typeof v === 'string') {
41
- result[k] = v;
42
- }
43
- }
44
- return result;
45
- }
46
- return {};
47
- }
48
- export class PostgresServerSyncDialect {
15
+ export class PostgresServerSyncDialect extends BaseServerSyncDialect {
49
16
  name = 'postgres';
50
17
  supportsForUpdate = true;
51
18
  supportsSavepoints = true;
52
19
  // ===========================================================================
20
+ // SQL Fragment Hooks
21
+ // ===========================================================================
22
+ buildNumberListFilter(values) {
23
+ return sql `= ANY(${values}::bigint[])`;
24
+ }
25
+ buildStringListFilter(values) {
26
+ return sql `= ANY(${values}::text[])`;
27
+ }
28
+ // ===========================================================================
53
29
  // Schema Setup
54
30
  // ===========================================================================
55
31
  async ensureSyncSchema(db) {
@@ -208,30 +184,13 @@ export class PostgresServerSyncDialect {
208
184
  await sql `SET TRANSACTION ISOLATION LEVEL REPEATABLE READ`.execute(trx);
209
185
  }
210
186
  // ===========================================================================
211
- // Commit/Change Log Queries
187
+ // Overrides (dialect-specific optimizations / casts)
212
188
  // ===========================================================================
213
- async readMaxCommitSeq(db, options) {
214
- const partitionId = options?.partitionId ?? 'default';
215
- const res = await sql `
216
- SELECT max(commit_seq) as max_seq
217
- FROM sync_commits
218
- WHERE partition_id = ${partitionId}
219
- `.execute(db);
220
- return coerceNumber(res.rows[0]?.max_seq) ?? 0;
221
- }
222
- async readMinCommitSeq(db, options) {
223
- const partitionId = options?.partitionId ?? 'default';
224
- const res = await sql `
225
- SELECT min(commit_seq) as min_seq
226
- FROM sync_commits
227
- WHERE partition_id = ${partitionId}
228
- `.execute(db);
229
- return coerceNumber(res.rows[0]?.min_seq) ?? 0;
230
- }
231
189
  async readCommitSeqsForPull(db, args) {
232
190
  const partitionId = args.partitionId ?? 'default';
233
191
  if (args.tables.length === 0)
234
192
  return [];
193
+ // Single-table fast path: skip DISTINCT since (partition_id, table, commit_seq) is PK
235
194
  if (args.tables.length === 1) {
236
195
  const res = await sql `
237
196
  SELECT commit_seq
@@ -246,47 +205,34 @@ export class PostgresServerSyncDialect {
246
205
  .map((r) => coerceNumber(r.commit_seq))
247
206
  .filter((n) => typeof n === 'number' && Number.isFinite(n) && n > args.cursor);
248
207
  }
249
- const res = await sql `
250
- SELECT DISTINCT commit_seq
251
- FROM sync_table_commits
252
- WHERE partition_id = ${partitionId}
253
- AND "table" = ANY(${args.tables}::text[])
254
- AND commit_seq > ${args.cursor}
255
- ORDER BY commit_seq ASC
256
- LIMIT ${args.limitCommits}
257
- `.execute(db);
258
- return res.rows
259
- .map((r) => coerceNumber(r.commit_seq))
260
- .filter((n) => typeof n === 'number' && Number.isFinite(n) && n > args.cursor);
208
+ // Multi-table: use ANY() with DISTINCT
209
+ return super.readCommitSeqsForPull(db, args);
261
210
  }
262
- async readCommits(db, commitSeqs, options) {
263
- const partitionId = options?.partitionId ?? 'default';
264
- if (commitSeqs.length === 0)
265
- return [];
266
- const res = await sql `
267
- SELECT commit_seq, actor_id, created_at, result_json
268
- FROM sync_commits
269
- WHERE commit_seq = ANY(${commitSeqs}::bigint[])
270
- AND partition_id = ${partitionId}
271
- ORDER BY commit_seq ASC
211
+ async recordClientCursor(db, args) {
212
+ const partitionId = args.partitionId ?? 'default';
213
+ const now = new Date().toISOString();
214
+ const scopesJson = JSON.stringify(args.effectiveScopes);
215
+ await sql `
216
+ INSERT INTO sync_client_cursors (partition_id, client_id, actor_id, cursor, effective_scopes, updated_at)
217
+ VALUES (${partitionId}, ${args.clientId}, ${args.actorId}, ${args.cursor}, ${scopesJson}::jsonb, ${now})
218
+ ON CONFLICT(partition_id, client_id) DO UPDATE SET
219
+ actor_id = ${args.actorId},
220
+ cursor = ${args.cursor},
221
+ effective_scopes = ${scopesJson}::jsonb,
222
+ updated_at = ${now}
272
223
  `.execute(db);
273
- return res.rows.map((row) => ({
274
- commit_seq: coerceNumber(row.commit_seq) ?? 0,
275
- actor_id: row.actor_id,
276
- created_at: coerceIsoString(row.created_at),
277
- result_json: row.result_json ?? null,
278
- }));
279
224
  }
225
+ // ===========================================================================
226
+ // Commit/Change Log Queries (dialect-specific)
227
+ // ===========================================================================
280
228
  async readChangesForCommits(db, args) {
281
229
  const partitionId = args.partitionId ?? 'default';
282
230
  if (args.commitSeqs.length === 0)
283
231
  return [];
284
232
  // Build JSONB containment conditions for scope filtering
285
- // For each scope key/value, we need: scopes->>'key' = 'value' OR scopes->>'key' IN (values)
286
233
  const scopeConditions = [];
287
234
  for (const [key, value] of Object.entries(args.scopes)) {
288
235
  if (Array.isArray(value)) {
289
- // OR condition for array values
290
236
  scopeConditions.push(sql `scopes->>${key} = ANY(${value}::text[])`);
291
237
  }
292
238
  else {
@@ -395,20 +341,28 @@ export class PostgresServerSyncDialect {
395
341
  async *streamIncrementalPullRows(db, args) {
396
342
  // PostgreSQL: use batching approach (could use pg-query-stream for true streaming)
397
343
  const batchSize = Math.min(100, args.batchSize ?? 100);
398
- let processed = 0;
399
- while (processed < args.limitCommits) {
344
+ let processedCommits = 0;
345
+ let cursor = args.cursor;
346
+ while (processedCommits < args.limitCommits) {
347
+ const remainingCommits = args.limitCommits - processedCommits;
348
+ const commitLimit = Math.min(batchSize, remainingCommits);
400
349
  const batch = await this.readIncrementalPullRows(db, {
401
350
  ...args,
402
- limitCommits: Math.min(batchSize, args.limitCommits - processed),
403
- cursor: args.cursor + processed,
351
+ limitCommits: commitLimit,
352
+ cursor,
404
353
  });
405
354
  if (batch.length === 0)
406
355
  break;
407
356
  for (const row of batch) {
408
357
  yield row;
409
358
  }
410
- processed += batch.length;
411
- if (batch.length < batchSize)
359
+ const lastCommitSeq = batch[batch.length - 1]?.commit_seq;
360
+ if (lastCommitSeq === undefined || lastCommitSeq <= cursor)
361
+ break;
362
+ const commitSeqs = new Set(batch.map((row) => row.commit_seq));
363
+ processedCommits += commitSeqs.size;
364
+ cursor = lastCommitSeq;
365
+ if (commitSeqs.size < commitLimit)
412
366
  break;
413
367
  }
414
368
  }
@@ -448,31 +402,11 @@ export class PostgresServerSyncDialect {
448
402
  return deletedChanges;
449
403
  }
450
404
  // ===========================================================================
451
- // Client Cursor Recording
452
- // ===========================================================================
453
- async recordClientCursor(db, args) {
454
- const partitionId = args.partitionId ?? 'default';
455
- const now = new Date().toISOString();
456
- const scopesJson = JSON.stringify(args.effectiveScopes);
457
- await sql `
458
- INSERT INTO sync_client_cursors (partition_id, client_id, actor_id, cursor, effective_scopes, updated_at)
459
- VALUES (${partitionId}, ${args.clientId}, ${args.actorId}, ${args.cursor}, ${scopesJson}::jsonb, ${now})
460
- ON CONFLICT(partition_id, client_id) DO UPDATE SET
461
- actor_id = ${args.actorId},
462
- cursor = ${args.cursor},
463
- effective_scopes = ${scopesJson}::jsonb,
464
- updated_at = ${now}
465
- `.execute(db);
466
- }
467
- // ===========================================================================
468
405
  // Scope Conversion Helpers
469
406
  // ===========================================================================
470
407
  scopesToDb(scopes) {
471
408
  return scopes;
472
409
  }
473
- dbToScopes(value) {
474
- return parseScopes(value);
475
- }
476
410
  dbToArray(value) {
477
411
  if (Array.isArray(value)) {
478
412
  return value.filter((k) => typeof k === 'string');
@@ -482,18 +416,6 @@ export class PostgresServerSyncDialect {
482
416
  arrayToDb(values) {
483
417
  return values.filter((v) => v.length > 0);
484
418
  }
485
- async readAffectedTablesFromChanges(db, commitSeq, options) {
486
- const partitionId = options?.partitionId ?? 'default';
487
- const res = await sql `
488
- SELECT DISTINCT "table"
489
- FROM sync_changes
490
- WHERE commit_seq = ${commitSeq}
491
- AND partition_id = ${partitionId}
492
- `.execute(db);
493
- return res.rows
494
- .map((r) => r.table)
495
- .filter((t) => typeof t === 'string' && t.length > 0);
496
- }
497
419
  // ===========================================================================
498
420
  // Console Schema (Request Events)
499
421
  // ===========================================================================
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syncular/server-dialect-postgres",
3
- "version": "0.0.1-72",
3
+ "version": "0.0.1-83",
4
4
  "description": "PostgreSQL dialect for the Syncular server",
5
5
  "license": "MIT",
6
6
  "author": "Benjamin Kniffler",
@@ -0,0 +1,170 @@
1
+ import Database from 'bun:sqlite';
2
+ import { afterEach, describe, expect, it } from 'bun:test';
3
+ import type { ScopeValues, StoredScopes, SyncOp } from '@syncular/core';
4
+ import type { DbExecutor } from '@syncular/server';
5
+ import type { SyncCoreDb } from '@syncular/server/schema';
6
+ import type { Dialect, QueryResult } from 'kysely';
7
+ import {
8
+ Kysely,
9
+ SqliteAdapter,
10
+ SqliteIntrospector,
11
+ SqliteQueryCompiler,
12
+ } from 'kysely';
13
+ import { PostgresServerSyncDialect } from './index';
14
+
15
+ class TestPostgresServerSyncDialect extends PostgresServerSyncDialect {
16
+ readonly calls: Array<{ cursor: number; limitCommits: number }> = [];
17
+
18
+ override async readIncrementalPullRows<DB extends SyncCoreDb>(
19
+ _db: DbExecutor<DB>,
20
+ args: {
21
+ table: string;
22
+ scopes: ScopeValues;
23
+ cursor: number;
24
+ limitCommits: number;
25
+ partitionId?: string;
26
+ }
27
+ ): Promise<
28
+ Array<{
29
+ commit_seq: number;
30
+ actor_id: string;
31
+ created_at: string;
32
+ change_id: number;
33
+ table: string;
34
+ row_id: string;
35
+ op: SyncOp;
36
+ row_json: unknown | null;
37
+ row_version: number | null;
38
+ scopes: StoredScopes;
39
+ }>
40
+ > {
41
+ this.calls.push({ cursor: args.cursor, limitCommits: args.limitCommits });
42
+
43
+ const startCommit = args.cursor + 1;
44
+ const endCommit = Math.min(args.cursor + args.limitCommits, 120);
45
+ if (startCommit > endCommit) return [];
46
+
47
+ const rows: Array<{
48
+ commit_seq: number;
49
+ actor_id: string;
50
+ created_at: string;
51
+ change_id: number;
52
+ table: string;
53
+ row_id: string;
54
+ op: SyncOp;
55
+ row_json: unknown | null;
56
+ row_version: number | null;
57
+ scopes: StoredScopes;
58
+ }> = [];
59
+
60
+ let changeId = 0;
61
+ for (let commitSeq = startCommit; commitSeq <= endCommit; commitSeq += 1) {
62
+ for (let i = 0; i < 3; i += 1) {
63
+ changeId += 1;
64
+ rows.push({
65
+ commit_seq: commitSeq,
66
+ actor_id: 'actor-1',
67
+ created_at: '2026-01-01T00:00:00.000Z',
68
+ change_id: changeId,
69
+ table: args.table,
70
+ row_id: `row-${commitSeq}-${i}`,
71
+ op: 'upsert',
72
+ row_json: { id: `row-${commitSeq}-${i}` },
73
+ row_version: commitSeq,
74
+ scopes: { actor_id: 'actor-1' },
75
+ });
76
+ }
77
+ }
78
+
79
+ return rows;
80
+ }
81
+ }
82
+
83
+ describe('PostgresServerSyncDialect.streamIncrementalPullRows', () => {
84
+ let db: Kysely<SyncCoreDb>;
85
+
86
+ function createTestDb(): Kysely<SyncCoreDb> {
87
+ const sqlite = new Database(':memory:');
88
+ const dialect: Dialect = {
89
+ createAdapter: () => new SqliteAdapter(),
90
+ createDriver: () => ({
91
+ init: async () => {},
92
+ acquireConnection: async () => ({
93
+ executeQuery: async <R>(compiledQuery: {
94
+ sql: string;
95
+ parameters: readonly unknown[];
96
+ }): Promise<QueryResult<R>> => {
97
+ const normalizedSql = compiledQuery.sql.trimStart().toLowerCase();
98
+ if (
99
+ normalizedSql.startsWith('select') ||
100
+ normalizedSql.startsWith('with') ||
101
+ normalizedSql.startsWith('pragma')
102
+ ) {
103
+ const rows = sqlite
104
+ .prepare(compiledQuery.sql)
105
+ .all(...(compiledQuery.parameters ?? [])) as R[];
106
+ return { rows };
107
+ }
108
+ const result = sqlite
109
+ .prepare(compiledQuery.sql)
110
+ .run(...(compiledQuery.parameters ?? []));
111
+ return {
112
+ rows: [] as R[],
113
+ numAffectedRows: BigInt(result.changes),
114
+ insertId:
115
+ result.lastInsertRowid != null
116
+ ? BigInt(result.lastInsertRowid)
117
+ : undefined,
118
+ };
119
+ },
120
+ streamQuery: <R>(): AsyncIterableIterator<QueryResult<R>> => {
121
+ throw new Error('Not implemented in test driver');
122
+ },
123
+ }),
124
+ beginTransaction: async () => {},
125
+ commitTransaction: async () => {},
126
+ rollbackTransaction: async () => {},
127
+ releaseConnection: async () => {},
128
+ destroy: async () => {
129
+ sqlite.close();
130
+ },
131
+ }),
132
+ createIntrospector: (innerDb) => new SqliteIntrospector(innerDb),
133
+ createQueryCompiler: () => new SqliteQueryCompiler(),
134
+ };
135
+
136
+ return new Kysely<SyncCoreDb>({ dialect });
137
+ }
138
+
139
+ afterEach(async () => {
140
+ if (db) {
141
+ await db.destroy();
142
+ }
143
+ });
144
+
145
+ it('advances the batch cursor by commit sequence, not by row count', async () => {
146
+ db = createTestDb();
147
+ const dialect = new TestPostgresServerSyncDialect();
148
+
149
+ const rows = [];
150
+ for await (const row of dialect.streamIncrementalPullRows(db, {
151
+ table: 'tasks',
152
+ scopes: { actor_id: 'actor-1' },
153
+ cursor: 0,
154
+ limitCommits: 120,
155
+ batchSize: 100,
156
+ })) {
157
+ rows.push(row);
158
+ }
159
+
160
+ const commitSeqs = new Set(rows.map((row) => row.commit_seq));
161
+ const maxCommitSeq = Math.max(...commitSeqs.values());
162
+
163
+ expect(commitSeqs.size).toBe(120);
164
+ expect(maxCommitSeq).toBe(120);
165
+ expect(dialect.calls).toEqual([
166
+ { cursor: 0, limitCommits: 100 },
167
+ { cursor: 100, limitCommits: 20 },
168
+ ]);
169
+ });
170
+ });
package/src/index.ts CHANGED
@@ -12,51 +12,33 @@
12
12
  */
13
13
 
14
14
  import type { ScopeValues, StoredScopes, SyncOp } from '@syncular/core';
15
- import type { DbExecutor, ServerSyncDialect } from '@syncular/server';
16
- import type {
17
- SyncChangeRow,
18
- SyncCommitRow,
19
- SyncCoreDb,
20
- } from '@syncular/server/schema';
21
- import type { Kysely, Transaction } from 'kysely';
15
+ import type { DbExecutor } from '@syncular/server';
16
+ import {
17
+ BaseServerSyncDialect,
18
+ coerceIsoString,
19
+ coerceNumber,
20
+ parseScopes,
21
+ } from '@syncular/server';
22
+ import type { SyncChangeRow, SyncCoreDb } from '@syncular/server/schema';
23
+ import type { Kysely, RawBuilder, Transaction } from 'kysely';
22
24
  import { sql } from 'kysely';
23
25
 
24
- function coerceNumber(value: unknown): number | null {
25
- if (value === null || value === undefined) return null;
26
- if (typeof value === 'number') return Number.isFinite(value) ? value : null;
27
- if (typeof value === 'bigint')
28
- return Number.isFinite(Number(value)) ? Number(value) : null;
29
- if (typeof value === 'string') {
30
- const n = Number(value);
31
- return Number.isFinite(n) ? n : null;
32
- }
33
- return null;
34
- }
26
+ export class PostgresServerSyncDialect extends BaseServerSyncDialect {
27
+ readonly name = 'postgres' as const;
28
+ readonly supportsForUpdate = true;
29
+ readonly supportsSavepoints = true;
35
30
 
36
- function coerceIsoString(value: unknown): string {
37
- if (typeof value === 'string') return value;
38
- if (value instanceof Date) return value.toISOString();
39
- return String(value);
40
- }
31
+ // ===========================================================================
32
+ // SQL Fragment Hooks
33
+ // ===========================================================================
41
34
 
42
- function parseScopes(value: unknown): StoredScopes {
43
- if (value === null || value === undefined) return {};
44
- if (typeof value === 'object' && !Array.isArray(value)) {
45
- const result: StoredScopes = {};
46
- for (const [k, v] of Object.entries(value as Record<string, unknown>)) {
47
- if (typeof v === 'string') {
48
- result[k] = v;
49
- }
50
- }
51
- return result;
35
+ protected buildNumberListFilter(values: number[]): RawBuilder<unknown> {
36
+ return sql`= ANY(${values}::bigint[])`;
52
37
  }
53
- return {};
54
- }
55
38
 
56
- export class PostgresServerSyncDialect implements ServerSyncDialect {
57
- readonly name = 'postgres' as const;
58
- readonly supportsForUpdate = true;
59
- readonly supportsSavepoints = true;
39
+ protected buildStringListFilter(values: string[]): RawBuilder<unknown> {
40
+ return sql`= ANY(${values}::text[])`;
41
+ }
60
42
 
61
43
  // ===========================================================================
62
44
  // Schema Setup
@@ -286,37 +268,9 @@ export class PostgresServerSyncDialect implements ServerSyncDialect {
286
268
  }
287
269
 
288
270
  // ===========================================================================
289
- // Commit/Change Log Queries
271
+ // Overrides (dialect-specific optimizations / casts)
290
272
  // ===========================================================================
291
273
 
292
- async readMaxCommitSeq<DB extends SyncCoreDb>(
293
- db: Kysely<DB> | Transaction<DB>,
294
- options?: { partitionId?: string }
295
- ): Promise<number> {
296
- const partitionId = options?.partitionId ?? 'default';
297
- const res = await sql<{ max_seq: unknown }>`
298
- SELECT max(commit_seq) as max_seq
299
- FROM sync_commits
300
- WHERE partition_id = ${partitionId}
301
- `.execute(db);
302
-
303
- return coerceNumber(res.rows[0]?.max_seq) ?? 0;
304
- }
305
-
306
- async readMinCommitSeq<DB extends SyncCoreDb>(
307
- db: Kysely<DB> | Transaction<DB>,
308
- options?: { partitionId?: string }
309
- ): Promise<number> {
310
- const partitionId = options?.partitionId ?? 'default';
311
- const res = await sql<{ min_seq: unknown }>`
312
- SELECT min(commit_seq) as min_seq
313
- FROM sync_commits
314
- WHERE partition_id = ${partitionId}
315
- `.execute(db);
316
-
317
- return coerceNumber(res.rows[0]?.min_seq) ?? 0;
318
- }
319
-
320
274
  async readCommitSeqsForPull<DB extends SyncCoreDb>(
321
275
  db: Kysely<DB> | Transaction<DB>,
322
276
  args: {
@@ -329,6 +283,7 @@ export class PostgresServerSyncDialect implements ServerSyncDialect {
329
283
  const partitionId = args.partitionId ?? 'default';
330
284
  if (args.tables.length === 0) return [];
331
285
 
286
+ // Single-table fast path: skip DISTINCT since (partition_id, table, commit_seq) is PK
332
287
  if (args.tables.length === 1) {
333
288
  const res = await sql<{ commit_seq: unknown }>`
334
289
  SELECT commit_seq
@@ -348,55 +303,41 @@ export class PostgresServerSyncDialect implements ServerSyncDialect {
348
303
  );
349
304
  }
350
305
 
351
- const res = await sql<{ commit_seq: unknown }>`
352
- SELECT DISTINCT commit_seq
353
- FROM sync_table_commits
354
- WHERE partition_id = ${partitionId}
355
- AND "table" = ANY(${args.tables}::text[])
356
- AND commit_seq > ${args.cursor}
357
- ORDER BY commit_seq ASC
358
- LIMIT ${args.limitCommits}
359
- `.execute(db);
360
-
361
- return res.rows
362
- .map((r) => coerceNumber(r.commit_seq))
363
- .filter(
364
- (n): n is number =>
365
- typeof n === 'number' && Number.isFinite(n) && n > args.cursor
366
- );
306
+ // Multi-table: use ANY() with DISTINCT
307
+ return super.readCommitSeqsForPull(db, args);
367
308
  }
368
309
 
369
- async readCommits<DB extends SyncCoreDb>(
310
+ async recordClientCursor<DB extends SyncCoreDb>(
370
311
  db: Kysely<DB> | Transaction<DB>,
371
- commitSeqs: number[],
372
- options?: { partitionId?: string }
373
- ): Promise<SyncCommitRow[]> {
374
- const partitionId = options?.partitionId ?? 'default';
375
- if (commitSeqs.length === 0) return [];
312
+ args: {
313
+ partitionId?: string;
314
+ clientId: string;
315
+ actorId: string;
316
+ cursor: number;
317
+ effectiveScopes: ScopeValues;
318
+ }
319
+ ): Promise<void> {
320
+ const partitionId = args.partitionId ?? 'default';
321
+ const now = new Date().toISOString();
322
+ const scopesJson = JSON.stringify(args.effectiveScopes);
376
323
 
377
- const res = await sql<{
378
- commit_seq: unknown;
379
- actor_id: string;
380
- created_at: unknown;
381
- result_json: unknown | null;
382
- }>`
383
- SELECT commit_seq, actor_id, created_at, result_json
384
- FROM sync_commits
385
- WHERE commit_seq = ANY(${commitSeqs}::bigint[])
386
- AND partition_id = ${partitionId}
387
- ORDER BY commit_seq ASC
324
+ await sql`
325
+ INSERT INTO sync_client_cursors (partition_id, client_id, actor_id, cursor, effective_scopes, updated_at)
326
+ VALUES (${partitionId}, ${args.clientId}, ${args.actorId}, ${args.cursor}, ${scopesJson}::jsonb, ${now})
327
+ ON CONFLICT(partition_id, client_id) DO UPDATE SET
328
+ actor_id = ${args.actorId},
329
+ cursor = ${args.cursor},
330
+ effective_scopes = ${scopesJson}::jsonb,
331
+ updated_at = ${now}
388
332
  `.execute(db);
389
-
390
- return res.rows.map((row) => ({
391
- commit_seq: coerceNumber(row.commit_seq) ?? 0,
392
- actor_id: row.actor_id,
393
- created_at: coerceIsoString(row.created_at),
394
- result_json: row.result_json ?? null,
395
- }));
396
333
  }
397
334
 
335
+ // ===========================================================================
336
+ // Commit/Change Log Queries (dialect-specific)
337
+ // ===========================================================================
338
+
398
339
  async readChangesForCommits<DB extends SyncCoreDb>(
399
- db: Kysely<DB> | Transaction<DB>,
340
+ db: DbExecutor<DB>,
400
341
  args: {
401
342
  commitSeqs: number[];
402
343
  table: string;
@@ -408,11 +349,9 @@ export class PostgresServerSyncDialect implements ServerSyncDialect {
408
349
  if (args.commitSeqs.length === 0) return [];
409
350
 
410
351
  // Build JSONB containment conditions for scope filtering
411
- // For each scope key/value, we need: scopes->>'key' = 'value' OR scopes->>'key' IN (values)
412
352
  const scopeConditions: ReturnType<typeof sql>[] = [];
413
353
  for (const [key, value] of Object.entries(args.scopes)) {
414
354
  if (Array.isArray(value)) {
415
- // OR condition for array values
416
355
  scopeConditions.push(sql`scopes->>${key} = ANY(${value}::text[])`);
417
356
  } else {
418
357
  scopeConditions.push(sql`scopes->>${key} = ${value}`);
@@ -470,7 +409,7 @@ export class PostgresServerSyncDialect implements ServerSyncDialect {
470
409
  }
471
410
 
472
411
  async readIncrementalPullRows<DB extends SyncCoreDb>(
473
- db: Kysely<DB> | Transaction<DB>,
412
+ db: DbExecutor<DB>,
474
413
  args: {
475
414
  table: string;
476
415
  scopes: ScopeValues;
@@ -600,13 +539,16 @@ export class PostgresServerSyncDialect implements ServerSyncDialect {
600
539
  }> {
601
540
  // PostgreSQL: use batching approach (could use pg-query-stream for true streaming)
602
541
  const batchSize = Math.min(100, args.batchSize ?? 100);
603
- let processed = 0;
542
+ let processedCommits = 0;
543
+ let cursor = args.cursor;
604
544
 
605
- while (processed < args.limitCommits) {
545
+ while (processedCommits < args.limitCommits) {
546
+ const remainingCommits = args.limitCommits - processedCommits;
547
+ const commitLimit = Math.min(batchSize, remainingCommits);
606
548
  const batch = await this.readIncrementalPullRows(db, {
607
549
  ...args,
608
- limitCommits: Math.min(batchSize, args.limitCommits - processed),
609
- cursor: args.cursor + processed,
550
+ limitCommits: commitLimit,
551
+ cursor,
610
552
  });
611
553
 
612
554
  if (batch.length === 0) break;
@@ -615,13 +557,19 @@ export class PostgresServerSyncDialect implements ServerSyncDialect {
615
557
  yield row;
616
558
  }
617
559
 
618
- processed += batch.length;
619
- if (batch.length < batchSize) break;
560
+ const lastCommitSeq = batch[batch.length - 1]?.commit_seq;
561
+ if (lastCommitSeq === undefined || lastCommitSeq <= cursor) break;
562
+
563
+ const commitSeqs = new Set(batch.map((row) => row.commit_seq));
564
+ processedCommits += commitSeqs.size;
565
+ cursor = lastCommitSeq;
566
+
567
+ if (commitSeqs.size < commitLimit) break;
620
568
  }
621
569
  }
622
570
 
623
571
  async compactChanges<DB extends SyncCoreDb>(
624
- db: Kysely<DB> | Transaction<DB>,
572
+ db: DbExecutor<DB>,
625
573
  args: { fullHistoryHours: number }
626
574
  ): Promise<number> {
627
575
  const cutoffIso = new Date(
@@ -665,35 +613,6 @@ export class PostgresServerSyncDialect implements ServerSyncDialect {
665
613
  return deletedChanges;
666
614
  }
667
615
 
668
- // ===========================================================================
669
- // Client Cursor Recording
670
- // ===========================================================================
671
-
672
- async recordClientCursor<DB extends SyncCoreDb>(
673
- db: Kysely<DB> | Transaction<DB>,
674
- args: {
675
- partitionId?: string;
676
- clientId: string;
677
- actorId: string;
678
- cursor: number;
679
- effectiveScopes: ScopeValues;
680
- }
681
- ): Promise<void> {
682
- const partitionId = args.partitionId ?? 'default';
683
- const now = new Date().toISOString();
684
- const scopesJson = JSON.stringify(args.effectiveScopes);
685
-
686
- await sql`
687
- INSERT INTO sync_client_cursors (partition_id, client_id, actor_id, cursor, effective_scopes, updated_at)
688
- VALUES (${partitionId}, ${args.clientId}, ${args.actorId}, ${args.cursor}, ${scopesJson}::jsonb, ${now})
689
- ON CONFLICT(partition_id, client_id) DO UPDATE SET
690
- actor_id = ${args.actorId},
691
- cursor = ${args.cursor},
692
- effective_scopes = ${scopesJson}::jsonb,
693
- updated_at = ${now}
694
- `.execute(db);
695
- }
696
-
697
616
  // ===========================================================================
698
617
  // Scope Conversion Helpers
699
618
  // ===========================================================================
@@ -702,10 +621,6 @@ export class PostgresServerSyncDialect implements ServerSyncDialect {
702
621
  return scopes;
703
622
  }
704
623
 
705
- dbToScopes(value: unknown): StoredScopes {
706
- return parseScopes(value);
707
- }
708
-
709
624
  dbToArray(value: unknown): string[] {
710
625
  if (Array.isArray(value)) {
711
626
  return value.filter((k: unknown): k is string => typeof k === 'string');
@@ -717,24 +632,6 @@ export class PostgresServerSyncDialect implements ServerSyncDialect {
717
632
  return values.filter((v) => v.length > 0);
718
633
  }
719
634
 
720
- async readAffectedTablesFromChanges<DB extends SyncCoreDb>(
721
- db: Kysely<DB> | Transaction<DB>,
722
- commitSeq: number,
723
- options?: { partitionId?: string }
724
- ): Promise<string[]> {
725
- const partitionId = options?.partitionId ?? 'default';
726
- const res = await sql<{ table: string }>`
727
- SELECT DISTINCT "table"
728
- FROM sync_changes
729
- WHERE commit_seq = ${commitSeq}
730
- AND partition_id = ${partitionId}
731
- `.execute(db);
732
-
733
- return res.rows
734
- .map((r) => r.table)
735
- .filter((t): t is string => typeof t === 'string' && t.length > 0);
736
- }
737
-
738
635
  // ===========================================================================
739
636
  // Console Schema (Request Events)
740
637
  // ===========================================================================