From e8b3a5b750882340fb03101aa7bfee1000323bf5 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 6 Jun 2024 16:42:07 +0200 Subject: [PATCH 1/4] feature: Added support for user parameters in sync rules. --- packages/service-core/src/routes/socket-route.ts | 6 +++++- packages/service-core/src/routes/sync-stream.ts | 5 ++++- packages/service-core/src/util/protocol-types.ts | 7 ++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/service-core/src/routes/socket-route.ts b/packages/service-core/src/routes/socket-route.ts index d607a42cf..9b00ba371 100644 --- a/packages/service-core/src/routes/socket-route.ts +++ b/packages/service-core/src/routes/socket-route.ts @@ -34,7 +34,11 @@ export const sync_stream_reactive: SocketRouteGenerator = (router) => const controller = new AbortController(); - const syncParams: SyncParameters = normalizeTokenParameters(context.token_payload?.parameters ?? {}); + const syncParams: SyncParameters = normalizeTokenParameters( + context.token_payload?.parameters ?? {}, + params.parameters ?? {} + ); + const storage = system.storage; // Sanity check before we start the stream const cp = await storage.getActiveCheckpoint(); diff --git a/packages/service-core/src/routes/sync-stream.ts b/packages/service-core/src/routes/sync-stream.ts index d99876650..a1de899af 100644 --- a/packages/service-core/src/routes/sync-stream.ts +++ b/packages/service-core/src/routes/sync-stream.ts @@ -30,7 +30,10 @@ export const syncStreamed: RouteGenerator = (router) => } const params: util.StreamingSyncRequest = payload.params; - const syncParams: SyncParameters = normalizeTokenParameters(payload.context.token_payload!.parameters ?? {}); + const syncParams: SyncParameters = normalizeTokenParameters( + payload.context.token_payload!.parameters ?? {}, + payload.params.parameters ?? {} + ); const storage = system.storage; // Sanity check before we start the stream diff --git a/packages/service-core/src/util/protocol-types.ts b/packages/service-core/src/util/protocol-types.ts index 91073f102..81bdb8369 100644 --- a/packages/service-core/src/util/protocol-types.ts +++ b/packages/service-core/src/util/protocol-types.ts @@ -89,7 +89,12 @@ export const StreamingSyncRequest = t.object({ /** * Data is received in a serialized BSON Buffer */ - binary_data: t.boolean.optional() + binary_data: t.boolean.optional(), + + /** + * Client parameters to be passed to the sync rules. + */ + parameters: t.record(t.string).optional() }); export type StreamingSyncRequest = t.Decoded; From b04398edd39755802bbadd8aa266bb1177eadc3a Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 10 Jun 2024 13:50:24 +0200 Subject: [PATCH 2/4] Updated a sync rule test to use both token and user parameters. --- .../service-core/test/src/sync_rules.test.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/service-core/test/src/sync_rules.test.ts b/packages/service-core/test/src/sync_rules.test.ts index 1cfd800c8..cf8a58b6e 100644 --- a/packages/service-core/test/src/sync_rules.test.ts +++ b/packages/service-core/test/src/sync_rules.test.ts @@ -100,27 +100,29 @@ bucket_definitions: const rules = SqlSyncRules.fromYaml(` bucket_definitions: mybucket: - parameters: SELECT token_parameters.user_id + parameters: SELECT token_parameters.user_id, user_parameters.device_id data: - - SELECT id, description FROM assets WHERE assets.user_id = bucket.user_id AND NOT assets.archived + - SELECT id, description FROM assets WHERE assets.user_id = bucket.user_id AND assets.device_id = bucket.device_id AND NOT assets.archived `); const bucket = rules.bucket_descriptors[0]; - expect(bucket.bucket_parameters).toEqual(['user_id']); + expect(bucket.bucket_parameters).toEqual(['user_id', 'device_id']); const param_query = bucket.global_parameter_queries[0]; - expect(param_query.bucket_parameters).toEqual(['user_id']); - expect(rules.getStaticBucketIds(normalizeTokenParameters({ user_id: 'user1' }))).toEqual(['mybucket["user1"]']); + expect(param_query.bucket_parameters).toEqual(['user_id', 'device_id']); + expect(rules.getStaticBucketIds(normalizeTokenParameters({ user_id: 'user1' }, { device_id: 'device1' }))).toEqual([ + 'mybucket["user1","device1"]' + ]); const data_query = bucket.data_queries[0]; - expect(data_query.bucket_parameters).toEqual(['user_id']); + expect(data_query.bucket_parameters).toEqual(['user_id', 'device_id']); expect( rules.evaluateRow({ sourceTable: ASSETS, - record: { id: 'asset1', description: 'test', user_id: 'user1' } + record: { id: 'asset1', description: 'test', user_id: 'user1', device_id: 'device1' } }) ).toEqual([ { ruleId: '1', - bucket: 'mybucket["user1"]', + bucket: 'mybucket["user1","device1"]', id: 'asset1', data: { id: 'asset1', @@ -132,7 +134,7 @@ bucket_definitions: expect( rules.evaluateRow({ sourceTable: ASSETS, - record: { id: 'asset1', description: 'test', user_id: 'user1', archived: 1 } + record: { id: 'asset1', description: 'test', user_id: 'user1', archived: 1, device_id: 'device1' } }) ).toEqual([]); }); From 48258725cd882cb84aeae29973336607ef26edf1 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 10 Jun 2024 14:14:35 +0200 Subject: [PATCH 3/4] changed StreamingSyncRequest parameter's field to take a record of `any` instead of just strings. --- packages/service-core/src/util/protocol-types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/service-core/src/util/protocol-types.ts b/packages/service-core/src/util/protocol-types.ts index 81bdb8369..e577a60fc 100644 --- a/packages/service-core/src/util/protocol-types.ts +++ b/packages/service-core/src/util/protocol-types.ts @@ -94,7 +94,7 @@ export const StreamingSyncRequest = t.object({ /** * Client parameters to be passed to the sync rules. */ - parameters: t.record(t.string).optional() + parameters: t.record(t.any).optional() }); export type StreamingSyncRequest = t.Decoded; From 0ae72e30dbcf11e4aa3c0627c255aae27d8c312f Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 10 Jun 2024 14:29:00 +0200 Subject: [PATCH 4/4] Added changeset entry. --- .changeset/witty-ducks-work.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/witty-ducks-work.md diff --git a/.changeset/witty-ducks-work.md b/.changeset/witty-ducks-work.md new file mode 100644 index 000000000..fa6d31af0 --- /dev/null +++ b/.changeset/witty-ducks-work.md @@ -0,0 +1,5 @@ +--- +'@powersync/service-core': minor +--- + +Added support for user parameters when making a StreamingSyncRequest.