diff --git a/crates/core/src/sync/interface.rs b/crates/core/src/sync/interface.rs index f97d98bd..ac2883c5 100644 --- a/crates/core/src/sync/interface.rs +++ b/crates/core/src/sync/interface.rs @@ -18,6 +18,7 @@ use powersync_sqlite_nostd::bindings::SQLITE_RESULT_SUBTYPE; use powersync_sqlite_nostd::{self as sqlite, ColumnType}; use powersync_sqlite_nostd::{Connection, Context}; use serde::{Deserialize, Serialize}; +use serde_json::value::RawValue; use sqlite::{ResultCode, Value}; use crate::sync::BucketPriority; @@ -40,6 +41,8 @@ pub struct StartSyncStream { /// We will increase the expiry date for those streams at the time we connect and disconnect. #[serde(default)] pub active_streams: Rc>, + #[serde(default)] + pub app_metadata: Option>, } impl StartSyncStream { @@ -55,6 +58,7 @@ impl Default for StartSyncStream { schema: Default::default(), include_defaults: Self::include_defaults_by_default(), active_streams: Default::default(), + app_metadata: Default::default(), } } } @@ -159,6 +163,8 @@ pub struct StreamingSyncRequest { pub client_id: String, pub parameters: Option>, pub streams: Rc, + #[serde(skip_serializing_if = "Option::is_none")] + pub app_metadata: Option>, } #[derive(Debug, Serialize, PartialEq)] diff --git a/crates/core/src/sync/streaming_sync.rs b/crates/core/src/sync/streaming_sync.rs index 0a170cf0..c31c3397 100644 --- a/crates/core/src/sync/streaming_sync.rs +++ b/crates/core/src/sync/streaming_sync.rs @@ -886,6 +886,7 @@ impl StreamingSyncIteration { client_id: client_id(self.db)?, parameters: self.options.parameters.take(), streams: stream_subscriptions.request.clone(), + app_metadata: self.options.app_metadata.take(), }; event diff --git a/dart/test/sync_test.dart b/dart/test/sync_test.dart index 5adaf19a..95c6cd28 100644 --- a/dart/test/sync_test.dart +++ b/dart/test/sync_test.dart @@ -179,6 +179,28 @@ void _syncTests({ }); }); + syncTest('app_metadata is passed to EstablishSyncStream request', (_) { + final startInstructions = invokeControlRaw( + 'start', + json.encode({ + 'app_metadata': {'key1': 'value1', 'key2': 'value2'} + }), + ); + + expect( + startInstructions, + contains( + containsPair( + 'EstablishSyncStream', + containsPair( + 'request', + containsPair('app_metadata', {'key1': 'value1', 'key2': 'value2'}), + ), + ), + ), + ); + }); + test('handles connection events', () { invokeControl('start', null); expect(invokeControl('connection', 'established'), [