@syncular/server 0.0.1-122 → 0.0.1-124
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/compaction.d.ts +1 -1
- package/dist/compaction.js +1 -1
- package/dist/{shapes → handlers}/create-handler.d.ts +5 -5
- package/dist/handlers/create-handler.d.ts.map +1 -0
- package/dist/{shapes → handlers}/create-handler.js +11 -1
- package/dist/handlers/create-handler.js.map +1 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/registry.d.ts.map +1 -0
- package/dist/handlers/registry.js.map +1 -0
- package/dist/{shapes → handlers}/types.d.ts +7 -7
- package/dist/{shapes → handlers}/types.d.ts.map +1 -1
- package/dist/{shapes → handlers}/types.js.map +1 -1
- package/dist/helpers/conflict.d.ts +1 -1
- package/dist/helpers/conflict.d.ts.map +1 -1
- package/dist/helpers/emitted-change.d.ts +1 -1
- package/dist/helpers/emitted-change.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/proxy/handler.d.ts +1 -1
- package/dist/proxy/handler.d.ts.map +1 -1
- package/dist/proxy/handler.js +7 -7
- package/dist/proxy/handler.js.map +1 -1
- package/dist/proxy/oplog.d.ts +1 -1
- package/dist/proxy/oplog.d.ts.map +1 -1
- package/dist/proxy/oplog.js +6 -6
- package/dist/proxy/oplog.js.map +1 -1
- package/dist/pull.d.ts +2 -2
- package/dist/pull.d.ts.map +1 -1
- package/dist/pull.js +9 -9
- package/dist/pull.js.map +1 -1
- package/dist/push.d.ts +2 -2
- package/dist/push.d.ts.map +1 -1
- package/dist/push.js +1 -1
- package/dist/push.js.map +1 -1
- package/dist/subscriptions/resolve.d.ts +6 -6
- package/dist/subscriptions/resolve.d.ts.map +1 -1
- package/dist/subscriptions/resolve.js +53 -14
- package/dist/subscriptions/resolve.js.map +1 -1
- package/package.json +2 -2
- package/src/compaction.ts +1 -1
- package/src/{shapes → handlers}/create-handler.ts +24 -4
- package/src/{shapes → handlers}/types.ts +10 -7
- package/src/helpers/conflict.ts +1 -1
- package/src/helpers/emitted-change.ts +1 -1
- package/src/index.ts +1 -1
- package/src/notify.test.ts +26 -26
- package/src/proxy/handler.test.ts +3 -3
- package/src/proxy/handler.ts +8 -8
- package/src/proxy/oplog.ts +7 -7
- package/src/pull.ts +11 -11
- package/src/push.ts +3 -3
- package/src/subscriptions/resolve.ts +73 -18
- package/dist/shapes/create-handler.d.ts.map +0 -1
- package/dist/shapes/create-handler.js.map +0 -1
- package/dist/shapes/index.d.ts.map +0 -1
- package/dist/shapes/index.js.map +0 -1
- package/dist/shapes/registry.d.ts.map +0 -1
- package/dist/shapes/registry.js.map +0 -1
- /package/dist/{shapes → handlers}/index.d.ts +0 -0
- /package/dist/{shapes → handlers}/index.js +0 -0
- /package/dist/{shapes → handlers}/registry.d.ts +0 -0
- /package/dist/{shapes → handlers}/registry.js +0 -0
- /package/dist/{shapes → handlers}/types.js +0 -0
- /package/src/{shapes → handlers}/index.ts +0 -0
- /package/src/{shapes → handlers}/registry.ts +0 -0
package/src/notify.test.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
|
|
2
2
|
import { createBunSqliteDb } from '../../dialect-bun-sqlite/src';
|
|
3
3
|
import { createSqliteServerDialect } from '../../server-dialect-sqlite/src';
|
|
4
|
+
import { createServerHandler } from './handlers';
|
|
5
|
+
import { TableRegistry } from './handlers/registry';
|
|
4
6
|
import { ensureSyncSchema } from './migrate';
|
|
5
7
|
import { EXTERNAL_CLIENT_ID, notifyExternalDataChange } from './notify';
|
|
6
8
|
import { pull } from './pull';
|
|
7
9
|
import type { SyncCoreDb } from './schema';
|
|
8
|
-
import { createServerHandler } from './shapes';
|
|
9
|
-
import { TableRegistry } from './shapes/registry';
|
|
10
10
|
|
|
11
11
|
interface TasksTable {
|
|
12
12
|
id: string;
|
|
@@ -227,14 +227,14 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
227
227
|
resolveScopes: async () => ({ catalog_id: '*' }),
|
|
228
228
|
});
|
|
229
229
|
|
|
230
|
-
const
|
|
231
|
-
|
|
230
|
+
const handlers = new TableRegistry<TestDb>();
|
|
231
|
+
handlers.register(codesHandler);
|
|
232
232
|
|
|
233
233
|
// 1. Initial bootstrap pull
|
|
234
234
|
const firstPull = await pull({
|
|
235
235
|
db,
|
|
236
236
|
dialect,
|
|
237
|
-
|
|
237
|
+
handlers,
|
|
238
238
|
actorId: 'u1',
|
|
239
239
|
request: {
|
|
240
240
|
clientId: 'client-1',
|
|
@@ -244,7 +244,7 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
244
244
|
subscriptions: [
|
|
245
245
|
{
|
|
246
246
|
id: 'sub-codes',
|
|
247
|
-
|
|
247
|
+
table: 'codes',
|
|
248
248
|
scopes: { catalog_id: 'icd' },
|
|
249
249
|
cursor: -1,
|
|
250
250
|
},
|
|
@@ -261,7 +261,7 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
261
261
|
const incrementalPull = await pull({
|
|
262
262
|
db,
|
|
263
263
|
dialect,
|
|
264
|
-
|
|
264
|
+
handlers,
|
|
265
265
|
actorId: 'u1',
|
|
266
266
|
request: {
|
|
267
267
|
clientId: 'client-1',
|
|
@@ -271,7 +271,7 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
271
271
|
subscriptions: [
|
|
272
272
|
{
|
|
273
273
|
id: 'sub-codes',
|
|
274
|
-
|
|
274
|
+
table: 'codes',
|
|
275
275
|
scopes: { catalog_id: 'icd' },
|
|
276
276
|
cursor: cursorAfterBootstrap,
|
|
277
277
|
},
|
|
@@ -295,7 +295,7 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
295
295
|
const rebootstrapPull = await pull({
|
|
296
296
|
db,
|
|
297
297
|
dialect,
|
|
298
|
-
|
|
298
|
+
handlers,
|
|
299
299
|
actorId: 'u1',
|
|
300
300
|
request: {
|
|
301
301
|
clientId: 'client-1',
|
|
@@ -305,7 +305,7 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
305
305
|
subscriptions: [
|
|
306
306
|
{
|
|
307
307
|
id: 'sub-codes',
|
|
308
|
-
|
|
308
|
+
table: 'codes',
|
|
309
309
|
scopes: { catalog_id: 'icd' },
|
|
310
310
|
cursor: cursorAfterBootstrap,
|
|
311
311
|
},
|
|
@@ -341,15 +341,15 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
341
341
|
resolveScopes: async () => ({ catalog_id: '*' }),
|
|
342
342
|
});
|
|
343
343
|
|
|
344
|
-
const
|
|
345
|
-
|
|
346
|
-
|
|
344
|
+
const handlers = new TableRegistry<TestDb>();
|
|
345
|
+
handlers.register(tasksHandler);
|
|
346
|
+
handlers.register(codesHandler);
|
|
347
347
|
|
|
348
348
|
// 1. Bootstrap pull for tasks
|
|
349
349
|
const firstPull = await pull({
|
|
350
350
|
db,
|
|
351
351
|
dialect,
|
|
352
|
-
|
|
352
|
+
handlers,
|
|
353
353
|
actorId: 'u1',
|
|
354
354
|
request: {
|
|
355
355
|
clientId: 'client-1',
|
|
@@ -359,7 +359,7 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
359
359
|
subscriptions: [
|
|
360
360
|
{
|
|
361
361
|
id: 'sub-tasks',
|
|
362
|
-
|
|
362
|
+
table: 'tasks',
|
|
363
363
|
scopes: { user_id: 'u1' },
|
|
364
364
|
cursor: -1,
|
|
365
365
|
},
|
|
@@ -381,7 +381,7 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
381
381
|
const pullAfterNotify = await pull({
|
|
382
382
|
db,
|
|
383
383
|
dialect,
|
|
384
|
-
|
|
384
|
+
handlers,
|
|
385
385
|
actorId: 'u1',
|
|
386
386
|
request: {
|
|
387
387
|
clientId: 'client-1',
|
|
@@ -391,7 +391,7 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
391
391
|
subscriptions: [
|
|
392
392
|
{
|
|
393
393
|
id: 'sub-tasks',
|
|
394
|
-
|
|
394
|
+
table: 'tasks',
|
|
395
395
|
scopes: { user_id: 'u1' },
|
|
396
396
|
cursor: cursorAfterBootstrap,
|
|
397
397
|
},
|
|
@@ -437,15 +437,15 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
437
437
|
resolveScopes: async () => ({ catalog_id: '*' }),
|
|
438
438
|
});
|
|
439
439
|
|
|
440
|
-
const
|
|
441
|
-
|
|
442
|
-
|
|
440
|
+
const handlers = new TableRegistry<TestDb>();
|
|
441
|
+
handlers.register(tasksHandler);
|
|
442
|
+
handlers.register(codesHandler);
|
|
443
443
|
|
|
444
444
|
// 1. Bootstrap both subscriptions
|
|
445
445
|
const firstPull = await pull({
|
|
446
446
|
db,
|
|
447
447
|
dialect,
|
|
448
|
-
|
|
448
|
+
handlers,
|
|
449
449
|
actorId: 'u1',
|
|
450
450
|
request: {
|
|
451
451
|
clientId: 'client-1',
|
|
@@ -455,13 +455,13 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
455
455
|
subscriptions: [
|
|
456
456
|
{
|
|
457
457
|
id: 'sub-tasks',
|
|
458
|
-
|
|
458
|
+
table: 'tasks',
|
|
459
459
|
scopes: { user_id: 'u1' },
|
|
460
460
|
cursor: -1,
|
|
461
461
|
},
|
|
462
462
|
{
|
|
463
463
|
id: 'sub-codes',
|
|
464
|
-
|
|
464
|
+
table: 'codes',
|
|
465
465
|
scopes: { catalog_id: 'icd' },
|
|
466
466
|
cursor: -1,
|
|
467
467
|
},
|
|
@@ -479,7 +479,7 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
479
479
|
const pullAfter = await pull({
|
|
480
480
|
db,
|
|
481
481
|
dialect,
|
|
482
|
-
|
|
482
|
+
handlers,
|
|
483
483
|
actorId: 'u1',
|
|
484
484
|
request: {
|
|
485
485
|
clientId: 'client-1',
|
|
@@ -489,13 +489,13 @@ describe('pull re-bootstrap after external data change', () => {
|
|
|
489
489
|
subscriptions: [
|
|
490
490
|
{
|
|
491
491
|
id: 'sub-tasks',
|
|
492
|
-
|
|
492
|
+
table: 'tasks',
|
|
493
493
|
scopes: { user_id: 'u1' },
|
|
494
494
|
cursor: tasksCursor,
|
|
495
495
|
},
|
|
496
496
|
{
|
|
497
497
|
id: 'sub-codes',
|
|
498
|
-
|
|
498
|
+
table: 'codes',
|
|
499
499
|
scopes: { catalog_id: 'icd' },
|
|
500
500
|
cursor: codesCursor,
|
|
501
501
|
},
|
|
@@ -21,7 +21,7 @@ interface ProxyTestDb extends SyncCoreDb {
|
|
|
21
21
|
describe('executeProxyQuery', () => {
|
|
22
22
|
let db: Kysely<ProxyTestDb>;
|
|
23
23
|
const dialect = createSqliteServerDialect();
|
|
24
|
-
const
|
|
24
|
+
const handlers = new ProxyTableRegistry().register({
|
|
25
25
|
table: 'tasks',
|
|
26
26
|
computeScopes: (row) => ({
|
|
27
27
|
user_id: String(row.user_id),
|
|
@@ -59,7 +59,7 @@ describe('executeProxyQuery', () => {
|
|
|
59
59
|
const result = await executeProxyQuery({
|
|
60
60
|
db,
|
|
61
61
|
dialect,
|
|
62
|
-
|
|
62
|
+
handlers,
|
|
63
63
|
ctx: { actorId: 'actor-1', clientId: 'proxy-client-1' },
|
|
64
64
|
sqlQuery:
|
|
65
65
|
'/* admin */ UPDATE tasks SET title = $1, server_version = server_version + 1 WHERE id = $2',
|
|
@@ -95,7 +95,7 @@ describe('executeProxyQuery', () => {
|
|
|
95
95
|
executeProxyQuery({
|
|
96
96
|
db,
|
|
97
97
|
dialect,
|
|
98
|
-
|
|
98
|
+
handlers,
|
|
99
99
|
ctx: { actorId: 'actor-1', clientId: 'proxy-client-1' },
|
|
100
100
|
sqlQuery: 'UPDATE tasks SET title = $1 WHERE id = $2 RETURNING id',
|
|
101
101
|
parameters: ['blocked title', 't1'],
|
package/src/proxy/handler.ts
CHANGED
|
@@ -24,7 +24,7 @@ export interface ExecuteProxyQueryArgs<DB extends SyncCoreDb = SyncCoreDb> {
|
|
|
24
24
|
/** Server sync dialect */
|
|
25
25
|
dialect: ServerSyncDialect;
|
|
26
26
|
/** Proxy table registry for oplog generation */
|
|
27
|
-
|
|
27
|
+
handlers: ProxyTableRegistry;
|
|
28
28
|
/** Query context (actor/client IDs) */
|
|
29
29
|
ctx: ProxyQueryContext;
|
|
30
30
|
/** SQL query string */
|
|
@@ -100,7 +100,7 @@ function buildRawQuery(
|
|
|
100
100
|
export async function executeProxyQuery<DB extends SyncCoreDb>(
|
|
101
101
|
args: ExecuteProxyQueryArgs<DB>
|
|
102
102
|
): Promise<ExecuteProxyQueryResult> {
|
|
103
|
-
const { db, dialect,
|
|
103
|
+
const { db, dialect, handlers, ctx, sqlQuery, parameters } = args;
|
|
104
104
|
|
|
105
105
|
const mutation = detectMutation(sqlQuery);
|
|
106
106
|
|
|
@@ -110,10 +110,10 @@ export async function executeProxyQuery<DB extends SyncCoreDb>(
|
|
|
110
110
|
return { rows: result.rows };
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
// Check if this table has a registered
|
|
114
|
-
const
|
|
115
|
-
if (!
|
|
116
|
-
// No
|
|
113
|
+
// Check if this table has a registered handler
|
|
114
|
+
const handler = handlers.get(mutation.tableName);
|
|
115
|
+
if (!handler) {
|
|
116
|
+
// No handler registered - execute without oplog
|
|
117
117
|
// This allows proxy operations on non-synced tables
|
|
118
118
|
const result = await buildRawQuery(sqlQuery, parameters).execute(db);
|
|
119
119
|
return {
|
|
@@ -122,7 +122,7 @@ export async function executeProxyQuery<DB extends SyncCoreDb>(
|
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
// Mutation with registered
|
|
125
|
+
// Mutation with registered handler - append RETURNING * and create oplog
|
|
126
126
|
const hasReturning = hasReturningClause(sqlQuery);
|
|
127
127
|
if (hasReturning && !hasReturningWildcard(sqlQuery)) {
|
|
128
128
|
throw new Error(
|
|
@@ -146,7 +146,7 @@ export async function executeProxyQuery<DB extends SyncCoreDb>(
|
|
|
146
146
|
actorId: ctx.actorId,
|
|
147
147
|
clientId: ctx.clientId,
|
|
148
148
|
partitionId: ctx.partitionId,
|
|
149
|
-
|
|
149
|
+
handler,
|
|
150
150
|
operation: mutation.operation,
|
|
151
151
|
rows: affectedRows,
|
|
152
152
|
});
|
package/src/proxy/oplog.ts
CHANGED
|
@@ -30,19 +30,19 @@ export async function createOplogEntries<DB extends SyncCoreDb>(args: {
|
|
|
30
30
|
actorId: string;
|
|
31
31
|
clientId: string;
|
|
32
32
|
partitionId?: string;
|
|
33
|
-
|
|
33
|
+
handler: ProxyTableHandler;
|
|
34
34
|
operation: SyncOp;
|
|
35
35
|
rows: Record<string, unknown>[];
|
|
36
36
|
}): Promise<{ commitSeq: number; affectedTables: string[] }> {
|
|
37
|
-
const { trx, dialect, actorId, clientId,
|
|
37
|
+
const { trx, dialect, actorId, clientId, handler, operation, rows } = args;
|
|
38
38
|
const partitionId = args.partitionId ?? 'default';
|
|
39
39
|
|
|
40
40
|
if (rows.length === 0) {
|
|
41
41
|
return { commitSeq: 0, affectedTables: [] };
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
const pk =
|
|
45
|
-
const versionCol =
|
|
44
|
+
const pk = handler.primaryKey ?? 'id';
|
|
45
|
+
const versionCol = handler.versionColumn ?? 'server_version';
|
|
46
46
|
|
|
47
47
|
// Create commit record
|
|
48
48
|
const commitResult = await sql<{ commit_seq: number }>`
|
|
@@ -73,15 +73,15 @@ export async function createOplogEntries<DB extends SyncCoreDb>(args: {
|
|
|
73
73
|
|
|
74
74
|
// Compute scopes for all rows and collect changes
|
|
75
75
|
const affectedTablesSet = new Set<string>();
|
|
76
|
-
affectedTablesSet.add(
|
|
76
|
+
affectedTablesSet.add(handler.table);
|
|
77
77
|
|
|
78
78
|
const changes = rows.map((row) => {
|
|
79
|
-
const scopes =
|
|
79
|
+
const scopes = handler.computeScopes(row);
|
|
80
80
|
|
|
81
81
|
return {
|
|
82
82
|
commit_seq: commitSeq,
|
|
83
83
|
partition_id: partitionId,
|
|
84
|
-
table:
|
|
84
|
+
table: handler.table,
|
|
85
85
|
row_id: String(row[pk]),
|
|
86
86
|
op: operation,
|
|
87
87
|
row_json: operation === 'delete' ? null : row,
|
package/src/pull.ts
CHANGED
|
@@ -21,9 +21,9 @@ import {
|
|
|
21
21
|
} from '@syncular/core';
|
|
22
22
|
import type { Kysely } from 'kysely';
|
|
23
23
|
import type { DbExecutor, ServerSyncDialect } from './dialect/types';
|
|
24
|
+
import type { TableRegistry } from './handlers/registry';
|
|
24
25
|
import { EXTERNAL_CLIENT_ID } from './notify';
|
|
25
26
|
import type { SyncCoreDb } from './schema';
|
|
26
|
-
import type { TableRegistry } from './shapes/registry';
|
|
27
27
|
import {
|
|
28
28
|
insertSnapshotChunk,
|
|
29
29
|
readSnapshotChunkRefByPageKey,
|
|
@@ -302,7 +302,7 @@ async function readExternalDataChanges<DB extends SyncCoreDb>(
|
|
|
302
302
|
export async function pull<DB extends SyncCoreDb>(args: {
|
|
303
303
|
db: Kysely<DB>;
|
|
304
304
|
dialect: ServerSyncDialect;
|
|
305
|
-
|
|
305
|
+
handlers: TableRegistry<DB>;
|
|
306
306
|
actorId: string;
|
|
307
307
|
partitionId?: string;
|
|
308
308
|
request: SyncPullRequest;
|
|
@@ -353,7 +353,7 @@ export async function pull<DB extends SyncCoreDb>(args: {
|
|
|
353
353
|
db,
|
|
354
354
|
actorId: args.actorId,
|
|
355
355
|
subscriptions: request.subscriptions ?? [],
|
|
356
|
-
|
|
356
|
+
handlers: args.handlers,
|
|
357
357
|
});
|
|
358
358
|
|
|
359
359
|
const result = await dialect.executeInTransaction(db, async (trx) => {
|
|
@@ -395,8 +395,8 @@ export async function pull<DB extends SyncCoreDb>(args: {
|
|
|
395
395
|
|
|
396
396
|
for (const sub of resolved) {
|
|
397
397
|
const cursor = Math.max(-1, sub.cursor ?? -1);
|
|
398
|
-
// Validate
|
|
399
|
-
args.
|
|
398
|
+
// Validate table handler exists (throws if not registered)
|
|
399
|
+
args.handlers.getOrThrow(sub.table);
|
|
400
400
|
|
|
401
401
|
if (
|
|
402
402
|
sub.status === 'revoked' ||
|
|
@@ -422,12 +422,12 @@ export async function pull<DB extends SyncCoreDb>(args: {
|
|
|
422
422
|
cursor > maxCommitSeq ||
|
|
423
423
|
(minCommitSeq > 0 && cursor < minCommitSeq - 1) ||
|
|
424
424
|
externalDataChanges.some(
|
|
425
|
-
(c) => c.commitSeq > cursor && c.tables.includes(sub.
|
|
425
|
+
(c) => c.commitSeq > cursor && c.tables.includes(sub.table)
|
|
426
426
|
);
|
|
427
427
|
|
|
428
428
|
if (needsBootstrap) {
|
|
429
|
-
const tables = args.
|
|
430
|
-
.getBootstrapOrderFor(sub.
|
|
429
|
+
const tables = args.handlers
|
|
430
|
+
.getBootstrapOrderFor(sub.table)
|
|
431
431
|
.map((handler) => handler.table);
|
|
432
432
|
|
|
433
433
|
const initState: SyncBootstrapState = {
|
|
@@ -601,7 +601,7 @@ export async function pull<DB extends SyncCoreDb>(args: {
|
|
|
601
601
|
break;
|
|
602
602
|
}
|
|
603
603
|
|
|
604
|
-
const tableHandler = args.
|
|
604
|
+
const tableHandler = args.handlers.getOrThrow(nextTableName);
|
|
605
605
|
if (!activeBundle || activeBundle.table !== nextTableName) {
|
|
606
606
|
if (activeBundle) {
|
|
607
607
|
await flushSnapshotBundle(activeBundle);
|
|
@@ -685,7 +685,7 @@ export async function pull<DB extends SyncCoreDb>(args: {
|
|
|
685
685
|
partitionId,
|
|
686
686
|
cursor,
|
|
687
687
|
limitCommits,
|
|
688
|
-
tables: [sub.
|
|
688
|
+
tables: [sub.table],
|
|
689
689
|
});
|
|
690
690
|
const maxScannedCommitSeq =
|
|
691
691
|
scannedCommitSeqs.length > 0
|
|
@@ -710,7 +710,7 @@ export async function pull<DB extends SyncCoreDb>(args: {
|
|
|
710
710
|
|
|
711
711
|
for await (const row of dialect.iterateIncrementalPullRows(trx, {
|
|
712
712
|
partitionId,
|
|
713
|
-
table: sub.
|
|
713
|
+
table: sub.table,
|
|
714
714
|
scopes: effectiveScopes,
|
|
715
715
|
cursor,
|
|
716
716
|
limitCommits,
|
package/src/push.ts
CHANGED
|
@@ -16,8 +16,8 @@ import type {
|
|
|
16
16
|
} from 'kysely';
|
|
17
17
|
import { sql } from 'kysely';
|
|
18
18
|
import type { ServerSyncDialect } from './dialect/types';
|
|
19
|
+
import type { TableRegistry } from './handlers/registry';
|
|
19
20
|
import type { SyncCoreDb } from './schema';
|
|
20
|
-
import type { TableRegistry } from './shapes/registry';
|
|
21
21
|
|
|
22
22
|
// biome-ignore lint/complexity/noBannedTypes: Kysely uses `{}` as the initial "no selected columns yet" marker.
|
|
23
23
|
type EmptySelection = {};
|
|
@@ -136,7 +136,7 @@ function recordPushMetrics(args: {
|
|
|
136
136
|
export async function pushCommit<DB extends SyncCoreDb>(args: {
|
|
137
137
|
db: Kysely<DB>;
|
|
138
138
|
dialect: ServerSyncDialect;
|
|
139
|
-
|
|
139
|
+
handlers: TableRegistry<DB>;
|
|
140
140
|
actorId: string;
|
|
141
141
|
partitionId?: string;
|
|
142
142
|
request: SyncPushRequest;
|
|
@@ -377,7 +377,7 @@ export async function pushCommit<DB extends SyncCoreDb>(args: {
|
|
|
377
377
|
|
|
378
378
|
for (let i = 0; i < ops.length; i++) {
|
|
379
379
|
const op = ops[i]!;
|
|
380
|
-
const handler = args.
|
|
380
|
+
const handler = args.handlers.getOrThrow(op.table);
|
|
381
381
|
const applied = await handler.applyOperation(
|
|
382
382
|
{
|
|
383
383
|
db: trx,
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
|
+
extractScopeVars,
|
|
3
|
+
type ScopeValues,
|
|
4
|
+
type SyncSubscriptionRequest,
|
|
5
|
+
} from '@syncular/core';
|
|
2
6
|
import type { Kysely } from 'kysely';
|
|
7
|
+
import type { TableRegistry } from '../handlers/registry';
|
|
3
8
|
import type { SyncCoreDb } from '../schema';
|
|
4
|
-
import type { TableRegistry } from '../shapes/registry';
|
|
5
9
|
|
|
6
10
|
export class InvalidSubscriptionScopeError extends Error {
|
|
7
11
|
constructor(message: string) {
|
|
@@ -15,7 +19,7 @@ export class InvalidSubscriptionScopeError extends Error {
|
|
|
15
19
|
*/
|
|
16
20
|
export interface ResolvedSubscription {
|
|
17
21
|
id: string;
|
|
18
|
-
|
|
22
|
+
table: string;
|
|
19
23
|
scopes: ScopeValues;
|
|
20
24
|
params: Record<string, unknown> | undefined;
|
|
21
25
|
cursor: number;
|
|
@@ -83,12 +87,46 @@ function scopesEmpty(scopes: ScopeValues): boolean {
|
|
|
83
87
|
return true;
|
|
84
88
|
}
|
|
85
89
|
|
|
90
|
+
/**
|
|
91
|
+
* Collect valid scope keys from handler scope patterns.
|
|
92
|
+
*/
|
|
93
|
+
function collectScopeKeys(scopePatterns: readonly string[]): Set<string> {
|
|
94
|
+
const keys = new Set<string>();
|
|
95
|
+
for (const pattern of scopePatterns) {
|
|
96
|
+
for (const key of extractScopeVars(pattern)) {
|
|
97
|
+
keys.add(key);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return keys;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function validateScopeKeys(args: {
|
|
104
|
+
scopeValues: ScopeValues;
|
|
105
|
+
validScopeKeys: Set<string>;
|
|
106
|
+
source: string;
|
|
107
|
+
subscriptionId: string;
|
|
108
|
+
table: string;
|
|
109
|
+
}): void {
|
|
110
|
+
for (const scopeKey of Object.keys(args.scopeValues)) {
|
|
111
|
+
if (args.validScopeKeys.has(scopeKey)) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const expectedKeys =
|
|
115
|
+
args.validScopeKeys.size > 0
|
|
116
|
+
? Array.from(args.validScopeKeys).sort().join(', ')
|
|
117
|
+
: '(none)';
|
|
118
|
+
throw new InvalidSubscriptionScopeError(
|
|
119
|
+
`Invalid scope key "${scopeKey}" in ${args.source} for subscription "${args.subscriptionId}" on table "${args.table}". Expected keys: ${expectedKeys}`
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
86
124
|
/**
|
|
87
125
|
* Resolve effective scopes for subscriptions.
|
|
88
126
|
*
|
|
89
127
|
* For each subscription:
|
|
90
|
-
* 1. Look up the
|
|
91
|
-
* 2. Call
|
|
128
|
+
* 1. Look up the table handler by subscription.table
|
|
129
|
+
* 2. Call handler.resolveScopes() to get allowed scopes for this actor
|
|
92
130
|
* 3. Intersect requested scopes with allowed scopes
|
|
93
131
|
* 4. Mark as revoked if no effective scopes
|
|
94
132
|
*/
|
|
@@ -98,7 +136,7 @@ export async function resolveEffectiveScopesForSubscriptions<
|
|
|
98
136
|
db: Kysely<DB>;
|
|
99
137
|
actorId: string;
|
|
100
138
|
subscriptions: SyncSubscriptionRequest[];
|
|
101
|
-
|
|
139
|
+
handlers: TableRegistry<DB>;
|
|
102
140
|
}): Promise<ResolvedSubscription[]> {
|
|
103
141
|
const out: ResolvedSubscription[] = [];
|
|
104
142
|
const seenIds = new Set<string>();
|
|
@@ -114,23 +152,33 @@ export async function resolveEffectiveScopesForSubscriptions<
|
|
|
114
152
|
}
|
|
115
153
|
seenIds.add(sub.id);
|
|
116
154
|
|
|
117
|
-
if (!sub.
|
|
155
|
+
if (!sub.table || typeof sub.table !== 'string') {
|
|
118
156
|
throw new InvalidSubscriptionScopeError(
|
|
119
|
-
`Subscription ${sub.id} requires a
|
|
157
|
+
`Subscription ${sub.id} requires a table name`
|
|
120
158
|
);
|
|
121
159
|
}
|
|
122
160
|
|
|
123
|
-
const
|
|
124
|
-
if (!
|
|
161
|
+
const handler = args.handlers.get(sub.table);
|
|
162
|
+
if (!handler) {
|
|
125
163
|
throw new InvalidSubscriptionScopeError(
|
|
126
|
-
`Unknown
|
|
164
|
+
`Unknown table: ${sub.table} for subscription ${sub.id}`
|
|
127
165
|
);
|
|
128
166
|
}
|
|
129
167
|
|
|
130
|
-
|
|
168
|
+
const validScopeKeys = collectScopeKeys(handler.scopePatterns);
|
|
169
|
+
const requested = sub.scopes ?? {};
|
|
170
|
+
validateScopeKeys({
|
|
171
|
+
scopeValues: requested,
|
|
172
|
+
validScopeKeys,
|
|
173
|
+
source: 'requested scopes',
|
|
174
|
+
subscriptionId: sub.id,
|
|
175
|
+
table: sub.table,
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// Get allowed scopes from the handler
|
|
131
179
|
let allowed: ScopeValues;
|
|
132
180
|
try {
|
|
133
|
-
allowed = await
|
|
181
|
+
allowed = await handler.resolveScopes({
|
|
134
182
|
db: args.db,
|
|
135
183
|
actorId: args.actorId,
|
|
136
184
|
});
|
|
@@ -138,12 +186,12 @@ export async function resolveEffectiveScopesForSubscriptions<
|
|
|
138
186
|
// Scope resolution failed - mark subscription as revoked
|
|
139
187
|
// rather than failing the entire pull
|
|
140
188
|
console.error(
|
|
141
|
-
`[resolveScopes] Failed for
|
|
189
|
+
`[resolveScopes] Failed for table ${sub.table}, subscription ${sub.id}:`,
|
|
142
190
|
resolveErr
|
|
143
191
|
);
|
|
144
192
|
out.push({
|
|
145
193
|
id: sub.id,
|
|
146
|
-
|
|
194
|
+
table: sub.table,
|
|
147
195
|
scopes: {},
|
|
148
196
|
params: sub.params,
|
|
149
197
|
cursor: sub.cursor,
|
|
@@ -153,14 +201,21 @@ export async function resolveEffectiveScopesForSubscriptions<
|
|
|
153
201
|
continue;
|
|
154
202
|
}
|
|
155
203
|
|
|
204
|
+
validateScopeKeys({
|
|
205
|
+
scopeValues: allowed,
|
|
206
|
+
validScopeKeys,
|
|
207
|
+
source: 'resolveScopes() result',
|
|
208
|
+
subscriptionId: sub.id,
|
|
209
|
+
table: sub.table,
|
|
210
|
+
});
|
|
211
|
+
|
|
156
212
|
// Intersect with requested scopes
|
|
157
|
-
const requested = sub.scopes ?? {};
|
|
158
213
|
const effective = intersectScopes(requested, allowed);
|
|
159
214
|
|
|
160
215
|
if (scopesEmpty(effective)) {
|
|
161
216
|
out.push({
|
|
162
217
|
id: sub.id,
|
|
163
|
-
|
|
218
|
+
table: sub.table,
|
|
164
219
|
scopes: {},
|
|
165
220
|
params: sub.params,
|
|
166
221
|
cursor: sub.cursor,
|
|
@@ -172,7 +227,7 @@ export async function resolveEffectiveScopesForSubscriptions<
|
|
|
172
227
|
|
|
173
228
|
out.push({
|
|
174
229
|
id: sub.id,
|
|
175
|
-
|
|
230
|
+
table: sub.table,
|
|
176
231
|
scopes: effective,
|
|
177
232
|
params: sub.params,
|
|
178
233
|
cursor: sub.cursor,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-handler.d.ts","sourceRoot":"","sources":["../../src/shapes/create-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAEV,WAAW,EACX,eAAe,IAAI,qBAAqB,EACxC,YAAY,EACZ,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAMV,UAAU,EAEV,UAAU,EAGX,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAGV,2BAA2B,EAC3B,aAAa,EAEb,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,KAAK,eAAe,GAChB,IAAI,GACJ;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAoBzD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,0BAA0B,CACzC,QAAQ,SAAS,UAAU,EAC3B,QAAQ,EACR,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,QAAQ,GAAG,MAAM;IAE1D,iCAAiC;IACjC,KAAK,EAAE,SAAS,CAAC;IAEjB;;;;;;;;;;;;;;OAcG;IACH,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAEhC,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,2CAA2C;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;;;;;;OASG;IACH,aAAa,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAEtE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CACjB,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EACxB,GAAG,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,KAC5B,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAErC;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAClB,GAAG,EAAE,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KACjC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEzB;;;OAGG;IACH,SAAS,CAAC,EAAE,CACV,GAAG,EAAE,2BAA2B,CAAC,QAAQ,CAAC,EAC1C,EAAE,EAAE,aAAa,KACd,OAAO,CAAC,eAAe,CAAC,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC;IAEpD;;OAEG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAEhE;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,YAAY,CAAC;CAChE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,SAAS,UAAU,EAC3B,QAAQ,EACR,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,QAAQ,GAAG,MAAM,EAE1D,OAAO,EAAE,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,GACjE,kBAAkB,CAAC,QAAQ,CAAC,CA+Y9B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-handler.js","sourceRoot":"","sources":["../../src/shapes/create-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shapes/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
package/dist/shapes/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shapes/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/shapes/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,qBAAa,aAAa,CAAC,EAAE,SAAS,UAAU,GAAG,UAAU;IAC3D,OAAO,CAAC,MAAM,CAA6C;IAE3D,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC,GAAG,IAAI,CAgB9C;IAED,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAC,EAAE,CAAC,GAAG,SAAS,CAErD;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAIhD;IAED,MAAM,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAEjC;IAED;;;OAGG;IACH,iBAAiB,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CA8B5C;IAED;;;OAGG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAC,EAAE,CAAC,EAAE,CA6B5D;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/shapes/registry.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|