@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 +16 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -122
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.test.ts +170 -0
- package/src/index.ts +67 -170
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
|
|
15
|
-
import
|
|
16
|
-
import type {
|
|
17
|
-
|
|
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
|
-
|
|
33
|
+
recordClientCursor<DB extends SyncCoreDb>(db: Kysely<DB> | Transaction<DB>, args: {
|
|
37
34
|
partitionId?: string;
|
|
38
|
-
|
|
39
|
-
|
|
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:
|
|
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:
|
|
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
|
}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,MAAM,kBAAkB,CAAC;AACnD,OAAO,EACL,qBAAqB,EAItB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9D,qBAAa,yBAA0B,SAAQ,qBAAqB;IAClE,QAAQ,CAAC,IAAI,aAAuB;IACpC,QAAQ,CAAC,iBAAiB,QAAQ;IAClC,QAAQ,CAAC,kBAAkB,QAAQ;IAMnC,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAErE;IAED,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAErE;IAMK,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,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,CA0BnB;IAEK,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;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,CA8D1B;IAEK,uBAAuB,CAAC,EAAE,SAAS,UAAU,EACjD,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,EAClB,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,CA8BD;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,CAwCjB;IAMD,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAE7C;IAED,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAKlC;IAED,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEpC;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"}
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
250
|
-
|
|
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
|
|
263
|
-
const partitionId =
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
|
399
|
-
|
|
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:
|
|
403
|
-
cursor
|
|
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
|
-
|
|
411
|
-
if (
|
|
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
|
@@ -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
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return String(value);
|
|
40
|
-
}
|
|
31
|
+
// ===========================================================================
|
|
32
|
+
// SQL Fragment Hooks
|
|
33
|
+
// ===========================================================================
|
|
41
34
|
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
352
|
-
|
|
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
|
|
310
|
+
async recordClientCursor<DB extends SyncCoreDb>(
|
|
370
311
|
db: Kysely<DB> | Transaction<DB>,
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
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
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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:
|
|
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:
|
|
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
|
|
542
|
+
let processedCommits = 0;
|
|
543
|
+
let cursor = args.cursor;
|
|
604
544
|
|
|
605
|
-
while (
|
|
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:
|
|
609
|
-
cursor
|
|
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
|
-
|
|
619
|
-
if (
|
|
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:
|
|
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
|
// ===========================================================================
|