From 802bdeeb53d63fd32436fb3db7c933b6c2372024 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Tue, 20 Aug 2024 15:28:26 +0200 Subject: [PATCH 01/21] Use new functions from core lib. --- .../powersync/lib/src/bucket_storage.dart | 7 ++--- .../lib/src/database/powersync_db_mixin.dart | 27 ++++++------------- .../powersync/test/bucket_storage_test.dart | 13 +++++++++ packages/powersync/test/disconnect_test.dart | 3 +++ 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/packages/powersync/lib/src/bucket_storage.dart b/packages/powersync/lib/src/bucket_storage.dart index 2781f1d4..e0d7e98d 100644 --- a/packages/powersync/lib/src/bucket_storage.dart +++ b/packages/powersync/lib/src/bucket_storage.dart @@ -89,9 +89,10 @@ class BucketStorage { if (_hasCompletedSync) { return true; } - final rs = await select( - "SELECT name, last_applied_op FROM ps_buckets WHERE last_applied_op > 0 LIMIT 1"); - if (rs.isNotEmpty) { + final rs = await select("SELECT powersync_last_synced_at() as synced_at"); + final value = rs.first['synced_at'] as String?; + + if (value != null) { _hasCompletedSync = true; return true; } diff --git a/packages/powersync/lib/src/database/powersync_db_mixin.dart b/packages/powersync/lib/src/database/powersync_db_mixin.dart index 0fc3f31c..683b72f6 100644 --- a/packages/powersync/lib/src/database/powersync_db_mixin.dart +++ b/packages/powersync/lib/src/database/powersync_db_mixin.dart @@ -91,15 +91,16 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection { } Future _updateHasSynced() async { - const syncedSQL = - 'SELECT 1 FROM ps_buckets WHERE last_applied_op > 0 LIMIT 1'; - // Query the database to see if any data has been synced. - final result = await database.execute(syncedSQL); - final hasSynced = result.rows.isNotEmpty; + final result = + await database.get('SELECT powersync_last_synced_at() as synced_at'); + final timestamp = result['synced_at'] as String?; + final hasSynced = timestamp != null; if (hasSynced != currentStatus.hasSynced) { - final status = SyncStatus(hasSynced: hasSynced); + final lastSyncedAt = timestamp == null ? null : DateTime.parse(timestamp); + final status = + SyncStatus(hasSynced: hasSynced, lastSyncedAt: lastSyncedAt); setStatus(status); } } @@ -225,19 +226,7 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection { await disconnect(); await writeTransaction((tx) async { - await tx.execute('DELETE FROM ps_oplog'); - await tx.execute('DELETE FROM ps_crud'); - await tx.execute('DELETE FROM ps_buckets'); - await tx.execute('DELETE FROM ps_untyped'); - - final tableGlob = clearLocal ? 'ps_data_*' : 'ps_data__*'; - final existingTableRows = await tx.getAll( - "SELECT name FROM sqlite_master WHERE type='table' AND name GLOB ?", - [tableGlob]); - - for (var row in existingTableRows) { - await tx.execute('DELETE FROM ${quoteIdentifier(row['name'])}'); - } + await tx.execute('select powersync_clear(?)', [clearLocal ? 1 : 0]); }); // The data has been deleted - reset these setStatus(SyncStatus(lastSyncedAt: null, hasSynced: false)); diff --git a/packages/powersync/test/bucket_storage_test.dart b/packages/powersync/test/bucket_storage_test.dart index 5fb123f9..e6213513 100644 --- a/packages/powersync/test/bucket_storage_test.dart +++ b/packages/powersync/test/bucket_storage_test.dart @@ -86,6 +86,7 @@ void main() { test('Basic Setup', () async { expect(await bucketStorage.getBucketStates(), equals([])); + expect(await bucketStorage.hasCompletedSync(), equals(false)); await bucketStorage.saveSyncData(SyncDataBatch([ SyncBucketData( @@ -103,6 +104,18 @@ void main() { checksums: [BucketChecksum(bucket: 'bucket1', checksum: 6)])); await expectAsset1_3(); + + expect(await bucketStorage.hasCompletedSync(), equals(true)); + }); + + test('empty sync', () async { + expect(await bucketStorage.getBucketStates(), equals([])); + expect(await bucketStorage.hasCompletedSync(), equals(false)); + + await syncLocalChecked(Checkpoint(lastOpId: '3', checksums: [])); + + expect(await bucketStorage.getBucketStates(), equals([])); + expect(await bucketStorage.hasCompletedSync(), equals(true)); }); test('should get an object from multiple buckets', () async { diff --git a/packages/powersync/test/disconnect_test.dart b/packages/powersync/test/disconnect_test.dart index c4c7ad55..71c6b25c 100644 --- a/packages/powersync/test/disconnect_test.dart +++ b/packages/powersync/test/disconnect_test.dart @@ -55,6 +55,9 @@ void main() { final finalCustomers = await db.getAll(getCustomersQuery); expect(finalCustomers.length, equals(0)); + + expect(db.currentStatus.lastSyncedAt, equals(null)); + expect(db.currentStatus.hasSynced, equals(false)); }); }); } From e878b250365464ffc24fa9a4caba597a839e3e92 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Tue, 20 Aug 2024 15:34:45 +0200 Subject: [PATCH 02/21] Test update notifications on delete. --- packages/powersync/lib/src/sync_status.dart | 2 +- packages/powersync/test/disconnect_test.dart | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/powersync/lib/src/sync_status.dart b/packages/powersync/lib/src/sync_status.dart index a1f4a543..f04e7300 100644 --- a/packages/powersync/lib/src/sync_status.dart +++ b/packages/powersync/lib/src/sync_status.dart @@ -21,7 +21,7 @@ class SyncStatus { /// Time that a last sync has fully completed, if any. /// - /// Currently this is reset to null after a restart. + /// This is null while loading the database. final DateTime? lastSyncedAt; /// Indicates whether there has been at least one full sync, if any. diff --git a/packages/powersync/test/disconnect_test.dart b/packages/powersync/test/disconnect_test.dart index 71c6b25c..80cb52ed 100644 --- a/packages/powersync/test/disconnect_test.dart +++ b/packages/powersync/test/disconnect_test.dart @@ -1,4 +1,5 @@ import 'package:powersync/powersync.dart'; +import 'package:powersync/sqlite_async.dart'; import 'package:test/test.dart'; import 'streaming_sync_test.dart'; import 'utils/test_utils_impl.dart'; @@ -51,6 +52,11 @@ void main() { final initialCustomers = await db.getAll(getCustomersQuery); expect(initialCustomers.length, equals(1)); + final changesFuture = db + .onChange({'customers'}, triggerImmediately: false) + .take(1) + .toList(); + await db.disconnectAndClear(); final finalCustomers = await db.getAll(getCustomersQuery); @@ -58,6 +64,9 @@ void main() { expect(db.currentStatus.lastSyncedAt, equals(null)); expect(db.currentStatus.hasSynced, equals(false)); + + final changes = await changesFuture; + expect(changes.first, equals(UpdateNotification({'customers'}))); }); }); } From 6d9583f24c6f2c11d636a2f78178a37b249448da Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Tue, 20 Aug 2024 16:50:51 +0200 Subject: [PATCH 03/21] Add client_id to sync stream request. --- packages/powersync/lib/src/bucket_storage.dart | 5 +++++ packages/powersync/lib/src/streaming_sync.dart | 5 +++-- packages/powersync/lib/src/sync_types.dart | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/powersync/lib/src/bucket_storage.dart b/packages/powersync/lib/src/bucket_storage.dart index e0d7e98d..94a57232 100644 --- a/packages/powersync/lib/src/bucket_storage.dart +++ b/packages/powersync/lib/src/bucket_storage.dart @@ -40,6 +40,11 @@ class BucketStorage { ]; } + Future getClientId() async { + final rows = await select('SELECT powersync_client_id() as client_id'); + return rows.first['client_id'] as String; + } + Future streamOp(String op) async { await writeTransaction((tx) async { await tx.execute( diff --git a/packages/powersync/lib/src/streaming_sync.dart b/packages/powersync/lib/src/streaming_sync.dart index 82b32864..056e3b71 100644 --- a/packages/powersync/lib/src/streaming_sync.dart +++ b/packages/powersync/lib/src/streaming_sync.dart @@ -245,6 +245,7 @@ class StreamingSyncImplementation { {AbortController? abortController}) async { adapter.startSession(); final bucketEntries = await adapter.getBucketStates(); + final clientId = await adapter.getClientId(); Map initialBucketStates = {}; @@ -262,8 +263,8 @@ class StreamingSyncImplementation { Checkpoint? appliedCheckpoint; var bucketSet = Set.from(initialBucketStates.keys); - var requestStream = - streamingSyncRequest(StreamingSyncRequest(buckets, syncParameters)); + var requestStream = streamingSyncRequest( + StreamingSyncRequest(buckets, syncParameters, clientId)); var merged = addBroadcast(requestStream, _localPingController.stream); diff --git a/packages/powersync/lib/src/sync_types.dart b/packages/powersync/lib/src/sync_types.dart index 627d0987..46eeb959 100644 --- a/packages/powersync/lib/src/sync_types.dart +++ b/packages/powersync/lib/src/sync_types.dart @@ -112,15 +112,17 @@ Object? parseStreamingSyncLine(Map line) { class StreamingSyncRequest { List buckets; bool includeChecksum = true; + String clientId; Map? parameters; - StreamingSyncRequest(this.buckets, this.parameters); + StreamingSyncRequest(this.buckets, this.parameters, this.clientId); Map toJson() { final Map json = { 'buckets': buckets, 'include_checksum': includeChecksum, 'raw_data': true, + 'client_id': clientId }; if (parameters != null) { From f8dc5644c29a8ebef43c25363cdc089f3a4ffb08 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Tue, 20 Aug 2024 17:50:00 +0200 Subject: [PATCH 04/21] Add User-Agent header. --- packages/powersync/lib/src/streaming_sync.dart | 16 ++++++++++++++-- .../powersync/lib/src/user_agent/user_agent.dart | 6 ++++++ .../lib/src/user_agent/user_agent_native.dart | 14 ++++++++++++++ .../lib/src/user_agent/user_agent_stub.dart | 3 +++ packages/powersync/lib/src/version.dart | 2 ++ 5 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 packages/powersync/lib/src/user_agent/user_agent.dart create mode 100644 packages/powersync/lib/src/user_agent/user_agent_native.dart create mode 100644 packages/powersync/lib/src/user_agent/user_agent_stub.dart create mode 100644 packages/powersync/lib/src/version.dart diff --git a/packages/powersync/lib/src/streaming_sync.dart b/packages/powersync/lib/src/streaming_sync.dart index 056e3b71..80ac5f5b 100644 --- a/packages/powersync/lib/src/streaming_sync.dart +++ b/packages/powersync/lib/src/streaming_sync.dart @@ -5,6 +5,7 @@ import 'package:http/http.dart' as http; import 'package:powersync/src/abort_controller.dart'; import 'package:powersync/src/exceptions.dart'; import 'package:powersync/src/log_internal.dart'; +import 'package:powersync/src/user_agent/user_agent.dart'; import 'package:sqlite_async/mutex.dart'; import 'bucket_storage.dart'; @@ -48,6 +49,8 @@ class StreamingSyncImplementation { final Mutex syncMutex, crudMutex; + late final String? userAgent; + StreamingSyncImplementation( {required this.adapter, required this.credentialsCallback, @@ -65,6 +68,7 @@ class StreamingSyncImplementation { crudMutex = Mutex(identifier: "crud-$identifier") { _client = client; statusStream = _statusStreamController.stream; + userAgent = powerSyncUserAgent(); } /// Close any active streams. @@ -195,10 +199,15 @@ class StreamingSyncImplementation { } final uri = credentials.endpointUri('write-checkpoint2.json'); - final response = await _client.get(uri, headers: { + Map headers = { 'Content-Type': 'application/json', 'Authorization': "Token ${credentials.token}" - }); + }; + if (userAgent != null) { + headers['User-Agent'] = userAgent!; + } + + final response = await _client.get(uri, headers: headers); if (response.statusCode == 401) { if (invalidCredentialsCallback != null) { await invalidCredentialsCallback!(); @@ -405,6 +414,9 @@ class StreamingSyncImplementation { final request = http.Request('POST', uri); request.headers['Content-Type'] = 'application/json'; request.headers['Authorization'] = "Token ${credentials.token}"; + if (userAgent != null) { + request.headers['User-Agent'] = userAgent!; + } request.body = convert.jsonEncode(data); http.StreamedResponse res; diff --git a/packages/powersync/lib/src/user_agent/user_agent.dart b/packages/powersync/lib/src/user_agent/user_agent.dart new file mode 100644 index 00000000..191e103f --- /dev/null +++ b/packages/powersync/lib/src/user_agent/user_agent.dart @@ -0,0 +1,6 @@ +// For native, expose a user agent. +// For web, we're not able to override the user agent anyway. + +export './user_agent_stub.dart' + // ignore: uri_does_not_exist + if (dart.library.io) './user_agent_native.dart'; diff --git a/packages/powersync/lib/src/user_agent/user_agent_native.dart b/packages/powersync/lib/src/user_agent/user_agent_native.dart new file mode 100644 index 00000000..bd88a23c --- /dev/null +++ b/packages/powersync/lib/src/user_agent/user_agent_native.dart @@ -0,0 +1,14 @@ +import 'dart:io'; + +import 'package:powersync/src/version.dart'; + +String? powerSyncUserAgent() { + var dartVersion = RegExp(r'[\w.]+').stringMatch(Platform.version); + var dart = 'Dart'; + if (dartVersion != null) { + dart = "Dart/$dartVersion"; + } + // Ideally we'd get an OS version, but that's quite complex. + + return 'PowerSync/$libraryVersion ($dart; ${Platform.operatingSystem})'; +} diff --git a/packages/powersync/lib/src/user_agent/user_agent_stub.dart b/packages/powersync/lib/src/user_agent/user_agent_stub.dart new file mode 100644 index 00000000..5c5bcde9 --- /dev/null +++ b/packages/powersync/lib/src/user_agent/user_agent_stub.dart @@ -0,0 +1,3 @@ +String? powerSyncUserAgent() { + return null; +} diff --git a/packages/powersync/lib/src/version.dart b/packages/powersync/lib/src/version.dart new file mode 100644 index 00000000..20793430 --- /dev/null +++ b/packages/powersync/lib/src/version.dart @@ -0,0 +1,2 @@ +// TODO: auto-update when bumping the version +const libraryVersion = '1.6.4'; From 9ca79811dff976a278ee7f5f76ff0535173970f0 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Tue, 20 Aug 2024 17:55:38 +0200 Subject: [PATCH 05/21] Add Client-ID header. --- packages/powersync/lib/src/streaming_sync.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/powersync/lib/src/streaming_sync.dart b/packages/powersync/lib/src/streaming_sync.dart index 80ac5f5b..7f0f89a6 100644 --- a/packages/powersync/lib/src/streaming_sync.dart +++ b/packages/powersync/lib/src/streaming_sync.dart @@ -50,6 +50,7 @@ class StreamingSyncImplementation { final Mutex syncMutex, crudMutex; late final String? userAgent; + String? clientId; StreamingSyncImplementation( {required this.adapter, @@ -103,6 +104,7 @@ class StreamingSyncImplementation { Future streamingSync() async { try { _abort = AbortController(); + clientId = await adapter.getClientId(); crudLoop(); var invalidCredentials = false; while (!aborted) { @@ -201,7 +203,8 @@ class StreamingSyncImplementation { Map headers = { 'Content-Type': 'application/json', - 'Authorization': "Token ${credentials.token}" + 'Authorization': "Token ${credentials.token}", + 'Client-ID': clientId! }; if (userAgent != null) { headers['User-Agent'] = userAgent!; @@ -254,7 +257,6 @@ class StreamingSyncImplementation { {AbortController? abortController}) async { adapter.startSession(); final bucketEntries = await adapter.getBucketStates(); - final clientId = await adapter.getClientId(); Map initialBucketStates = {}; @@ -273,7 +275,7 @@ class StreamingSyncImplementation { var bucketSet = Set.from(initialBucketStates.keys); var requestStream = streamingSyncRequest( - StreamingSyncRequest(buckets, syncParameters, clientId)); + StreamingSyncRequest(buckets, syncParameters, clientId!)); var merged = addBroadcast(requestStream, _localPingController.stream); @@ -414,6 +416,7 @@ class StreamingSyncImplementation { final request = http.Request('POST', uri); request.headers['Content-Type'] = 'application/json'; request.headers['Authorization'] = "Token ${credentials.token}"; + request.headers['Client-ID'] = clientId!; if (userAgent != null) { request.headers['User-Agent'] = userAgent!; } From f402c2e6f09d1f18648f3b4a266d58c4bdaf57c5 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Wed, 21 Aug 2024 09:18:47 +0200 Subject: [PATCH 06/21] Automate updating libraryVersion. --- melos.yaml | 5 +++++ .../lib/src/user_agent/user_agent_native.dart | 2 +- packages/powersync/lib/src/version.dart | 3 +-- pubspec.lock | 2 +- pubspec.yaml | 1 + tool/update_version.dart | 12 ++++++++++++ 6 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 tool/update_version.dart diff --git a/melos.yaml b/melos.yaml index d4083fcf..d90b2442 100644 --- a/melos.yaml +++ b/melos.yaml @@ -14,6 +14,11 @@ command: changelog: false packageFilters: noPrivate: true + hooks: + # Automatically update libraryVersion: + preCommit: | + dart run tool/update_version.dart + git add packages/powersync/lib/src/version.dart publish: hooks: pre: sh tool/download_binaries.sh diff --git a/packages/powersync/lib/src/user_agent/user_agent_native.dart b/packages/powersync/lib/src/user_agent/user_agent_native.dart index bd88a23c..4979e50a 100644 --- a/packages/powersync/lib/src/user_agent/user_agent_native.dart +++ b/packages/powersync/lib/src/user_agent/user_agent_native.dart @@ -9,6 +9,6 @@ String? powerSyncUserAgent() { dart = "Dart/$dartVersion"; } // Ideally we'd get an OS version, but that's quite complex. - + // Platform.operatingSystemVersion is very verbose. return 'PowerSync/$libraryVersion ($dart; ${Platform.operatingSystem})'; } diff --git a/packages/powersync/lib/src/version.dart b/packages/powersync/lib/src/version.dart index 20793430..afd23634 100644 --- a/packages/powersync/lib/src/version.dart +++ b/packages/powersync/lib/src/version.dart @@ -1,2 +1 @@ -// TODO: auto-update when bumping the version -const libraryVersion = '1.6.4'; +const String libraryVersion = '1.6.4'; diff --git a/pubspec.lock b/pubspec.lock index 0ffee54d..7207a487 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -506,7 +506,7 @@ packages: source: hosted version: "1.2.1" yaml: - dependency: transitive + dependency: "direct main" description: name: yaml sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" diff --git a/pubspec.yaml b/pubspec.yaml index 829a05de..61ea3e13 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,3 +12,4 @@ dev_dependencies: melos: ^3.4.0 test: ^1.25.0 path: ^1.0.0 + yaml: ^3.1.2 diff --git a/tool/update_version.dart b/tool/update_version.dart new file mode 100644 index 00000000..7d7e8ee7 --- /dev/null +++ b/tool/update_version.dart @@ -0,0 +1,12 @@ +import 'dart:io'; +import 'package:yaml/yaml.dart'; + +void main() { + final pubspecFile = File('packages/powersync/pubspec.yaml'); + final pubspecContent = pubspecFile.readAsStringSync(); + final yaml = loadYaml(pubspecContent); + final version = yaml['version']; + + final versionFile = File('packages/powersync/lib/src/version.dart'); + versionFile.writeAsStringSync("const String libraryVersion = '$version';\n"); +} From 7e8181044f1a9d88ef398d9c3a814ac25822d969 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Wed, 21 Aug 2024 09:37:57 +0200 Subject: [PATCH 07/21] Use powersync-dart/1.2.3 for user-agent. --- packages/powersync/lib/src/user_agent/user_agent_native.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/powersync/lib/src/user_agent/user_agent_native.dart b/packages/powersync/lib/src/user_agent/user_agent_native.dart index 4979e50a..cee4f528 100644 --- a/packages/powersync/lib/src/user_agent/user_agent_native.dart +++ b/packages/powersync/lib/src/user_agent/user_agent_native.dart @@ -8,7 +8,7 @@ String? powerSyncUserAgent() { if (dartVersion != null) { dart = "Dart/$dartVersion"; } - // Ideally we'd get an OS version, but that's quite complex. + // Ideally we'd get an OS version as well, but that's a little complex. // Platform.operatingSystemVersion is very verbose. - return 'PowerSync/$libraryVersion ($dart; ${Platform.operatingSystem})'; + return 'powersync-dart/$libraryVersion ($dart; ${Platform.operatingSystem})'; } From 9fa7d9d935b4f787de7f0922c1eb46c32c48f23d Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Wed, 21 Aug 2024 10:29:30 +0200 Subject: [PATCH 08/21] Use X-User-Agent on web. --- packages/powersync/lib/src/streaming_sync.dart | 18 ++++++++---------- .../lib/src/user_agent/user_agent.dart | 7 +++---- .../lib/src/user_agent/user_agent_native.dart | 6 +++++- .../lib/src/user_agent/user_agent_stub.dart | 8 ++++++-- .../lib/src/user_agent/user_agent_web.dart | 12 ++++++++++++ 5 files changed, 34 insertions(+), 17 deletions(-) create mode 100644 packages/powersync/lib/src/user_agent/user_agent_web.dart diff --git a/packages/powersync/lib/src/streaming_sync.dart b/packages/powersync/lib/src/streaming_sync.dart index 7f0f89a6..98083b38 100644 --- a/packages/powersync/lib/src/streaming_sync.dart +++ b/packages/powersync/lib/src/streaming_sync.dart @@ -49,7 +49,8 @@ class StreamingSyncImplementation { final Mutex syncMutex, crudMutex; - late final String? userAgent; + final Map _userAgentHeaders; + String? clientId; StreamingSyncImplementation( @@ -66,10 +67,10 @@ class StreamingSyncImplementation { /// A good value is typically the DB file path which it will mutate when syncing. String? identifier = "unknown"}) : syncMutex = Mutex(identifier: "sync-$identifier"), - crudMutex = Mutex(identifier: "crud-$identifier") { + crudMutex = Mutex(identifier: "crud-$identifier"), + _userAgentHeaders = userAgentHeaders() { _client = client; statusStream = _statusStreamController.stream; - userAgent = powerSyncUserAgent(); } /// Close any active streams. @@ -204,11 +205,9 @@ class StreamingSyncImplementation { Map headers = { 'Content-Type': 'application/json', 'Authorization': "Token ${credentials.token}", - 'Client-ID': clientId! + 'Client-ID': clientId!, + ..._userAgentHeaders }; - if (userAgent != null) { - headers['User-Agent'] = userAgent!; - } final response = await _client.get(uri, headers: headers); if (response.statusCode == 401) { @@ -417,9 +416,8 @@ class StreamingSyncImplementation { request.headers['Content-Type'] = 'application/json'; request.headers['Authorization'] = "Token ${credentials.token}"; request.headers['Client-ID'] = clientId!; - if (userAgent != null) { - request.headers['User-Agent'] = userAgent!; - } + request.headers.addAll(_userAgentHeaders); + request.body = convert.jsonEncode(data); http.StreamedResponse res; diff --git a/packages/powersync/lib/src/user_agent/user_agent.dart b/packages/powersync/lib/src/user_agent/user_agent.dart index 191e103f..8f5405e1 100644 --- a/packages/powersync/lib/src/user_agent/user_agent.dart +++ b/packages/powersync/lib/src/user_agent/user_agent.dart @@ -1,6 +1,5 @@ -// For native, expose a user agent. -// For web, we're not able to override the user agent anyway. - export './user_agent_stub.dart' // ignore: uri_does_not_exist - if (dart.library.io) './user_agent_native.dart'; + if (dart.library.io) './user_agent_native.dart' + // ignore: uri_does_not_exist + if (dart.library.html) './user_agent_web.dart'; diff --git a/packages/powersync/lib/src/user_agent/user_agent_native.dart b/packages/powersync/lib/src/user_agent/user_agent_native.dart index cee4f528..49771c54 100644 --- a/packages/powersync/lib/src/user_agent/user_agent_native.dart +++ b/packages/powersync/lib/src/user_agent/user_agent_native.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:powersync/src/version.dart'; -String? powerSyncUserAgent() { +String powerSyncUserAgent() { var dartVersion = RegExp(r'[\w.]+').stringMatch(Platform.version); var dart = 'Dart'; if (dartVersion != null) { @@ -12,3 +12,7 @@ String? powerSyncUserAgent() { // Platform.operatingSystemVersion is very verbose. return 'powersync-dart/$libraryVersion ($dart; ${Platform.operatingSystem})'; } + +Map userAgentHeaders() { + return {'User-Agent': powerSyncUserAgent()}; +} diff --git a/packages/powersync/lib/src/user_agent/user_agent_stub.dart b/packages/powersync/lib/src/user_agent/user_agent_stub.dart index 5c5bcde9..ee9642c9 100644 --- a/packages/powersync/lib/src/user_agent/user_agent_stub.dart +++ b/packages/powersync/lib/src/user_agent/user_agent_stub.dart @@ -1,3 +1,7 @@ -String? powerSyncUserAgent() { - return null; +String powerSyncUserAgent() { + return ''; +} + +Map userAgentHeaders() { + return {}; } diff --git a/packages/powersync/lib/src/user_agent/user_agent_web.dart b/packages/powersync/lib/src/user_agent/user_agent_web.dart new file mode 100644 index 00000000..28dc7012 --- /dev/null +++ b/packages/powersync/lib/src/user_agent/user_agent_web.dart @@ -0,0 +1,12 @@ +import 'package:powersync/src/version.dart'; + +String powerSyncUserAgent() { + return 'powersync-dart/$libraryVersion (flutter-web)'; +} + +Map userAgentHeaders() { + var ua = powerSyncUserAgent(); + // Chrome doesn't allow overriding the user agent. + // Instead, we send an additional x-user-agent header. + return {'X-User-Agent': ua}; +} From b10893d235d1ba392a49c1d857203e2a54114054 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Wed, 21 Aug 2024 10:46:46 +0200 Subject: [PATCH 09/21] Use client_id parameter instead. --- packages/powersync/lib/src/streaming_sync.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/powersync/lib/src/streaming_sync.dart b/packages/powersync/lib/src/streaming_sync.dart index 98083b38..0d7821df 100644 --- a/packages/powersync/lib/src/streaming_sync.dart +++ b/packages/powersync/lib/src/streaming_sync.dart @@ -200,12 +200,12 @@ class StreamingSyncImplementation { if (credentials == null) { throw CredentialsException("Not logged in"); } - final uri = credentials.endpointUri('write-checkpoint2.json'); + final uri = + credentials.endpointUri('write-checkpoint2.json?client_id=$clientId'); Map headers = { 'Content-Type': 'application/json', 'Authorization': "Token ${credentials.token}", - 'Client-ID': clientId!, ..._userAgentHeaders }; @@ -415,7 +415,6 @@ class StreamingSyncImplementation { final request = http.Request('POST', uri); request.headers['Content-Type'] = 'application/json'; request.headers['Authorization'] = "Token ${credentials.token}"; - request.headers['Client-ID'] = clientId!; request.headers.addAll(_userAgentHeaders); request.body = convert.jsonEncode(data); From f000958ac17aad308c2bf9bbb3db87ffa040518e Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Wed, 21 Aug 2024 11:14:37 +0200 Subject: [PATCH 10/21] Avoid potential SQL injection. --- packages/powersync/lib/src/bucket_storage.dart | 6 ++++-- packages/powersync/lib/src/database/powersync_db_mixin.dart | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/powersync/lib/src/bucket_storage.dart b/packages/powersync/lib/src/bucket_storage.dart index 94a57232..add4f42c 100644 --- a/packages/powersync/lib/src/bucket_storage.dart +++ b/packages/powersync/lib/src/bucket_storage.dart @@ -263,7 +263,8 @@ class BucketStorage { } await tx.execute( - "UPDATE ps_buckets SET target_op = ? WHERE name='\$local'", [opId]); + "UPDATE ps_buckets SET target_op = CAST(? as INTEGER) WHERE name='\$local'", + [opId]); return true; }); @@ -300,7 +301,8 @@ class BucketStorage { if (writeCheckpoint != null && (await tx.execute('SELECT 1 FROM ps_crud LIMIT 1')).isEmpty) { await tx.execute( - 'UPDATE ps_buckets SET target_op = $writeCheckpoint WHERE name=\'\$local\''); + 'UPDATE ps_buckets SET target_op = CAST(? as INTEGER) WHERE name=\'\$local\'', + [writeCheckpoint]); } else { await tx.execute( 'UPDATE ps_buckets SET target_op = $maxOpId WHERE name=\'\$local\''); diff --git a/packages/powersync/lib/src/database/powersync_db_mixin.dart b/packages/powersync/lib/src/database/powersync_db_mixin.dart index 683b72f6..58308109 100644 --- a/packages/powersync/lib/src/database/powersync_db_mixin.dart +++ b/packages/powersync/lib/src/database/powersync_db_mixin.dart @@ -310,7 +310,8 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection { if (writeCheckpoint != null && await db.getOptional('SELECT 1 FROM ps_crud LIMIT 1') == null) { await db.execute( - 'UPDATE ps_buckets SET target_op = $writeCheckpoint WHERE name=\'\$local\''); + 'UPDATE ps_buckets SET target_op = CAST(? as INTEGER) WHERE name=\'\$local\'', + [writeCheckpoint]); } else { await db.execute( 'UPDATE ps_buckets SET target_op = $maxOpId WHERE name=\'\$local\''); @@ -361,7 +362,8 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection { await db.getOptional('SELECT 1 FROM ps_crud LIMIT 1') == null) { await db.execute( - 'UPDATE ps_buckets SET target_op = $writeCheckpoint WHERE name=\'\$local\''); + 'UPDATE ps_buckets SET target_op = CAST(? as INTEGER) WHERE name=\'\$local\'', + [writeCheckpoint]); } else { await db.execute( 'UPDATE ps_buckets SET target_op = $maxOpId WHERE name=\'\$local\''); From c74129165e9fa5bbdcffac12071aabdda5cf8b25 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Wed, 21 Aug 2024 13:22:28 +0200 Subject: [PATCH 11/21] powersync-sqlite-core 0.2.0 --- melos.yaml | 2 +- packages/powersync/bin/setup_web.dart | 2 +- packages/powersync_flutter_libs/android/build.gradle | 2 +- .../powersync_flutter_libs/ios/powersync_flutter_libs.podspec | 2 +- packages/powersync_flutter_libs/linux/CMakeLists.txt | 1 - .../powersync_flutter_libs/macos/powersync_flutter_libs.podspec | 2 +- pubspec.lock | 2 +- scripts/init_powersync_core_binary.dart | 2 +- 8 files changed, 7 insertions(+), 8 deletions(-) diff --git a/melos.yaml b/melos.yaml index 2edd9691..ae31d81c 100644 --- a/melos.yaml +++ b/melos.yaml @@ -21,7 +21,7 @@ command: git add packages/powersync/lib/src/version.dart publish: hooks: - pre: sh tool/download_binaries.sh v0.1.8 # Download latest core binaries when publishing + pre: sh tool/download_binaries.sh v0.2.0 # Download latest core binaries when publishing packageFilters: noPrivate: true diff --git a/packages/powersync/bin/setup_web.dart b/packages/powersync/bin/setup_web.dart index b714cf93..d7b427d1 100644 --- a/packages/powersync/bin/setup_web.dart +++ b/packages/powersync/bin/setup_web.dart @@ -91,7 +91,7 @@ void main(List arguments) async { bool coreVersionIsInRange(String tag) { //Sets the range of powersync core version that is compatible with the sqlite3 version - VersionConstraint constraint = VersionConstraint.parse('>=0.1.0 <=0.1.9'); + VersionConstraint constraint = VersionConstraint.parse('>=0.2.0 <0.3.0'); List parts = tag.split('-'); String powersyncPart = parts[1]; diff --git a/packages/powersync_flutter_libs/android/build.gradle b/packages/powersync_flutter_libs/android/build.gradle index 08576136..c5414e13 100644 --- a/packages/powersync_flutter_libs/android/build.gradle +++ b/packages/powersync_flutter_libs/android/build.gradle @@ -50,5 +50,5 @@ android { } dependencies { - implementation 'co.powersync:powersync-sqlite-core:0.1.7' + implementation 'co.powersync:powersync-sqlite-core:0.2.0' } diff --git a/packages/powersync_flutter_libs/ios/powersync_flutter_libs.podspec b/packages/powersync_flutter_libs/ios/powersync_flutter_libs.podspec index b7e2abe2..5c7736d5 100644 --- a/packages/powersync_flutter_libs/ios/powersync_flutter_libs.podspec +++ b/packages/powersync_flutter_libs/ios/powersync_flutter_libs.podspec @@ -22,7 +22,7 @@ A new Flutter FFI plugin project. s.dependency 'Flutter' s.platform = :ios, '11.0' - s.dependency "powersync-sqlite-core", "~> 0.1.6" + s.dependency "powersync-sqlite-core", "~> 0.2.0" # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } diff --git a/packages/powersync_flutter_libs/linux/CMakeLists.txt b/packages/powersync_flutter_libs/linux/CMakeLists.txt index 99e3ada7..7c94cbbf 100644 --- a/packages/powersync_flutter_libs/linux/CMakeLists.txt +++ b/packages/powersync_flutter_libs/linux/CMakeLists.txt @@ -25,7 +25,6 @@ target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) # ---------------------------------------------------------------------- # Add powersync prebuilt library. -set(POWERSYNC_VERSION 0.1.6) set(CORE_FILE_NAME "libpowersync.so") set(POWERSYNC_ARCH ${CMAKE_SYSTEM_PROCESSOR}) diff --git a/packages/powersync_flutter_libs/macos/powersync_flutter_libs.podspec b/packages/powersync_flutter_libs/macos/powersync_flutter_libs.podspec index 463fb759..b9683279 100644 --- a/packages/powersync_flutter_libs/macos/powersync_flutter_libs.podspec +++ b/packages/powersync_flutter_libs/macos/powersync_flutter_libs.podspec @@ -21,7 +21,7 @@ A new Flutter FFI plugin project. s.source_files = 'Classes/**/*' s.dependency 'FlutterMacOS' - s.dependency "powersync-sqlite-core", "~> 0.1.6" + s.dependency "powersync-sqlite-core", "~> 0.2.0" s.platform = :osx, '10.11' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } diff --git a/pubspec.lock b/pubspec.lock index b4e6c332..730df670 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -522,7 +522,7 @@ packages: source: hosted version: "1.2.1" yaml: - dependency: "direct main" + dependency: "direct dev" description: name: yaml sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" diff --git a/scripts/init_powersync_core_binary.dart b/scripts/init_powersync_core_binary.dart index db4af56f..709ce8d8 100644 --- a/scripts/init_powersync_core_binary.dart +++ b/scripts/init_powersync_core_binary.dart @@ -6,7 +6,7 @@ import 'dart:io'; import 'package:melos/melos.dart'; final sqliteUrl = - 'https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v0.1.8'; + 'https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v0.2.0'; void main() async { final sqliteCoreFilename = getLibraryForPlatform(); From ce3ee5a6146d6b3e3d54a0b6a89001a1a617441b Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Thu, 22 Aug 2024 10:03:48 +0200 Subject: [PATCH 12/21] Update dependencies. --- demos/django-todolist/pubspec.lock | 72 +++---- .../supabase-edge-function-auth/pubspec.lock | 182 ++++++++++-------- demos/supabase-simple-chat/pubspec.lock | 172 ++++++++++------- demos/supabase-todolist/pubspec.lock | 176 ++++++++--------- 4 files changed, 321 insertions(+), 281 deletions(-) diff --git a/demos/django-todolist/pubspec.lock b/demos/django-todolist/pubspec.lock index abb053c3..ab8807e7 100644 --- a/demos/django-todolist/pubspec.lock +++ b/demos/django-todolist/pubspec.lock @@ -61,10 +61,10 @@ packages: dependency: transitive description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" fake_async: dependency: transitive description: @@ -93,10 +93,10 @@ packages: dependency: transitive description: name: ffi - sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" file: dependency: transitive description: @@ -140,10 +140,10 @@ packages: dependency: "direct main" description: name: http - sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" http_parser: dependency: transitive description: @@ -244,18 +244,18 @@ packages: dependency: "direct main" description: name: path_provider - sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: bca87b0165ffd7cdb9cad8edd22d18d2201e886d9a9f19b4fb3452ea7df3a72a + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" url: "https://pub.dev" source: hosted - version: "2.2.6" + version: "2.2.10" path_provider_foundation: dependency: transitive description: @@ -284,10 +284,10 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" platform: dependency: transitive description: @@ -338,58 +338,58 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" + sha256: a7e8467e9181cef109f601e3f65765685786c1a738a83d7fbbde377589c0d974 url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.1" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" + sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.5.2" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" sky_engine: dependency: transitive description: flutter @@ -415,10 +415,10 @@ packages: dependency: transitive description: name: sqlite3 - sha256: "6d17989c0b06a5870b2190d391925186f944cb943e5262d0d3f778fcfca3bc6e" + sha256: fde692580bee3379374af1f624eb3e113ab2865ecb161dbe2d8ac2de9735dbdb url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.4.5" sqlite3_flutter_libs: dependency: transitive description: @@ -439,10 +439,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + sha256: "7708a2129582d43614f436e28623fcbeb142a02022ba372e45cfe403c84dd2b5" url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.8.3" stack_trace: dependency: transitive description: @@ -503,10 +503,10 @@ packages: dependency: transitive description: name: uuid - sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" + sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90" url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.4.2" vector_math: dependency: transitive description: @@ -531,14 +531,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.1" - win32: - dependency: transitive - description: - name: win32 - sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 - url: "https://pub.dev" - source: hosted - version: "5.5.1" xdg_directories: dependency: transitive description: diff --git a/demos/supabase-edge-function-auth/pubspec.lock b/demos/supabase-edge-function-auth/pubspec.lock index d86dd147..cdf25d0a 100644 --- a/demos/supabase-edge-function-auth/pubspec.lock +++ b/demos/supabase-edge-function-auth/pubspec.lock @@ -5,10 +5,34 @@ packages: dependency: transitive description: name: app_links - sha256: "42dc15aecf2618ace4ffb74a2e58a50e45cd1b9f2c17c8f0cafe4c297f08c815" + sha256: f04c3ca96426baba784c736a201926bd4145524c36a1b38942a351b033305e21 url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "6.2.1" + app_links_linux: + dependency: transitive + description: + name: app_links_linux + sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 + url: "https://pub.dev" + source: hosted + version: "1.0.3" + app_links_platform_interface: + dependency: transitive + description: + name: app_links_platform_interface + sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + app_links_web: + dependency: transitive + description: + name: app_links_web + sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 + url: "https://pub.dev" + source: hosted + version: "1.0.4" args: dependency: transitive description: @@ -69,10 +93,10 @@ packages: dependency: transitive description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" fake_async: dependency: transitive description: @@ -101,10 +125,10 @@ packages: dependency: transitive description: name: ffi - sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" file: dependency: transitive description: @@ -148,18 +172,18 @@ packages: dependency: transitive description: name: functions_client - sha256: "9a0ab83a525c8691a6724746e642de755a299afa04158807787364cd9e718001" + sha256: e63f49cd3b41727f47b3bde284a11a4ac62839e0604f64077d4257487510e484 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.3.2" gotrue: dependency: transitive description: name: gotrue - sha256: a0eee21a7e8ec09e6bbd5c9a36e31e423827b575ba6fc2dd049805dcfaac5b02 + sha256: "8703db795511f69194fe77125a0c838bbb6befc2f95717b6e40331784a8bdecb" url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.8.4" gtk: dependency: transitive description: @@ -172,10 +196,10 @@ packages: dependency: transitive description: name: http - sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" http_parser: dependency: transitive description: @@ -292,26 +316,26 @@ packages: dependency: "direct main" description: name: path_provider - sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "51f0d2c554cfbc9d6a312ab35152fc77e2f0b758ce9f1a444a3a1e5b8f3c6b7f" + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.2.10" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -332,18 +356,18 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" platform: dependency: transitive description: name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: @@ -356,10 +380,10 @@ packages: dependency: transitive description: name: postgrest - sha256: "9a3b590cf123f8d323b6a918702e037f037027d12a01902f9dc6ee38fdc05d6c" + sha256: c4197238601c7c3103b03a4bb77f2050b17d0064bf8b968309421abdebbb7f0e url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.4" powersync: dependency: "direct main" description: @@ -394,10 +418,10 @@ packages: dependency: transitive description: name: realtime_client - sha256: bb6747fe2feff7f8349d563ac9d4a8f10ac2dd809bdff1e7e319321d5ea16b49 + sha256: d897a65ee3b1b5ddc1cf606f0b83792262d38fd5679c2df7e38da29c977513da url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.2.1" retry: dependency: transitive description: @@ -410,66 +434,66 @@ packages: dependency: transitive description: name: rxdart - sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" url: "https://pub.dev" source: hosted - version: "0.27.7" + version: "0.28.0" shared_preferences: dependency: transitive description: name: shared_preferences - sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + sha256: a7e8467e9181cef109f601e3f65765685786c1a738a83d7fbbde377589c0d974 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.1" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.5.2" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" sky_engine: dependency: transitive description: flutter @@ -495,10 +519,10 @@ packages: dependency: transitive description: name: sqlite3 - sha256: "6d17989c0b06a5870b2190d391925186f944cb943e5262d0d3f778fcfca3bc6e" + sha256: fde692580bee3379374af1f624eb3e113ab2865ecb161dbe2d8ac2de9735dbdb url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.4.5" sqlite3_flutter_libs: dependency: transitive description: @@ -519,10 +543,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + sha256: "7708a2129582d43614f436e28623fcbeb142a02022ba372e45cfe403c84dd2b5" url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.8.3" stack_trace: dependency: transitive description: @@ -535,10 +559,10 @@ packages: dependency: transitive description: name: storage_client - sha256: bf5589d5de61a2451edb1b8960a0e673d4bb5c42ecc4dddf7c051a93789ced34 + sha256: "28c147c805304dbc2b762becd1fc26ee0cb621ace3732b9ae61ef979aab8b367" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.3" stream_channel: dependency: transitive description: @@ -559,18 +583,18 @@ packages: dependency: transitive description: name: supabase - sha256: "2ddedf13f6dc013084569673dff7a7d540f5eacdd5b36fede8d58322e5d79c55" + sha256: "4ed1cf3298f39865c05b2d8557f92eb131a9b9af70e32e218672a0afce01a6bc" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.3.0" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: "2d9683a15098258de137cb9182e695fa2a1a0f366c7409c2a6e6d47bc5a42be3" + sha256: ff6ba3048fd47d831fdc0027d3efb99346d99b95becfcb406562454bd9b229c5 url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.6.0" term_glyph: dependency: transitive description: @@ -607,42 +631,42 @@ packages: dependency: transitive description: name: url_launcher - sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.2.5" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 + sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79 url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.3.9" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e url: "https://pub.dev" source: hosted - version: "6.2.5" + version: "6.3.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.2.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.0" url_launcher_platform_interface: dependency: transitive description: @@ -655,26 +679,26 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" uuid: dependency: transitive description: name: uuid - sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" + sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90" url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.4.2" vector_math: dependency: transitive description: @@ -699,22 +723,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.1" - web_socket_channel: + web_socket: dependency: transitive description: - name: web_socket_channel - sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" url: "https://pub.dev" source: hosted - version: "2.4.5" - win32: + version: "0.1.6" + web_socket_channel: dependency: transitive description: - name: win32 - sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" + name: web_socket_channel + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "3.0.1" xdg_directories: dependency: transitive description: @@ -735,10 +759,10 @@ packages: dependency: transitive description: name: yet_another_json_isolate - sha256: e727502a2640d65b4b8a8a6cb48af9dd0cbe644ba4b3ee667c7f4afa0c1d6069 + sha256: "47ed3900e6b0e4dfe378811a4402e85b7fc126a7daa94f840fef65ea9c8e46f4" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.2" sdks: dart: ">=3.4.0 <4.0.0" - flutter: ">=3.19.0" + flutter: ">=3.22.0" diff --git a/demos/supabase-simple-chat/pubspec.lock b/demos/supabase-simple-chat/pubspec.lock index 4e0ec3c4..43de8716 100644 --- a/demos/supabase-simple-chat/pubspec.lock +++ b/demos/supabase-simple-chat/pubspec.lock @@ -5,10 +5,34 @@ packages: dependency: transitive description: name: app_links - sha256: "3ced568a5d9e309e99af71285666f1f3117bddd0bd5b3317979dccc1a40cada4" + sha256: f04c3ca96426baba784c736a201926bd4145524c36a1b38942a351b033305e21 url: "https://pub.dev" source: hosted - version: "3.5.1" + version: "6.2.1" + app_links_linux: + dependency: transitive + description: + name: app_links_linux + sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 + url: "https://pub.dev" + source: hosted + version: "1.0.3" + app_links_platform_interface: + dependency: transitive + description: + name: app_links_platform_interface + sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + app_links_web: + dependency: transitive + description: + name: app_links_web + sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 + url: "https://pub.dev" + source: hosted + version: "1.0.4" args: dependency: transitive description: @@ -69,10 +93,10 @@ packages: dependency: transitive description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" cupertino_icons: dependency: "direct main" description: @@ -109,10 +133,10 @@ packages: dependency: transitive description: name: ffi - sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" file: dependency: transitive description: @@ -156,18 +180,18 @@ packages: dependency: transitive description: name: functions_client - sha256: "48659e5c6a4bbe02659102bf6406a0cf39142202deae65aacfa78688f2e68946" + sha256: e63f49cd3b41727f47b3bde284a11a4ac62839e0604f64077d4257487510e484 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.2" gotrue: dependency: transitive description: name: gotrue - sha256: a8784341bcc08f88ba7a4b04a40a37059c7e71c315f058d45c31d09e8a951194 + sha256: "8703db795511f69194fe77125a0c838bbb6befc2f95717b6e40331784a8bdecb" url: "https://pub.dev" source: hosted - version: "2.8.3" + version: "2.8.4" gtk: dependency: transitive description: @@ -180,10 +204,10 @@ packages: dependency: transitive description: name: http - sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" http_parser: dependency: transitive description: @@ -308,18 +332,18 @@ packages: dependency: "direct main" description: name: path_provider - sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "9c96da072b421e98183f9ea7464898428e764bc0ce5567f27ec8693442e72514" + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" url: "https://pub.dev" source: hosted - version: "2.2.5" + version: "2.2.10" path_provider_foundation: dependency: transitive description: @@ -348,18 +372,18 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" platform: dependency: transitive description: name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: @@ -372,10 +396,10 @@ packages: dependency: transitive description: name: postgrest - sha256: f1f78470a74c611811132ff12acdef9c08b3ec65b61e88161a057d6cc5fbbd83 + sha256: c4197238601c7c3103b03a4bb77f2050b17d0064bf8b968309421abdebbb7f0e url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" powersync: dependency: "direct main" description: @@ -410,10 +434,10 @@ packages: dependency: transitive description: name: realtime_client - sha256: a99b7817e203c57ada746e9fe113820410cf84d9029f4310c57737aae890b0f7 + sha256: d897a65ee3b1b5ddc1cf606f0b83792262d38fd5679c2df7e38da29c977513da url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.2.1" retry: dependency: transitive description: @@ -426,66 +450,66 @@ packages: dependency: transitive description: name: rxdart - sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" url: "https://pub.dev" source: hosted - version: "0.27.7" + version: "0.28.0" shared_preferences: dependency: transitive description: name: shared_preferences - sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" + sha256: a7e8467e9181cef109f601e3f65765685786c1a738a83d7fbbde377589c0d974 url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.1" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" + sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.5.2" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" sky_engine: dependency: transitive description: flutter @@ -511,10 +535,10 @@ packages: dependency: transitive description: name: sqlite3 - sha256: "6d17989c0b06a5870b2190d391925186f944cb943e5262d0d3f778fcfca3bc6e" + sha256: fde692580bee3379374af1f624eb3e113ab2865ecb161dbe2d8ac2de9735dbdb url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.4.5" sqlite3_flutter_libs: dependency: transitive description: @@ -535,10 +559,10 @@ packages: dependency: transitive description: name: sqlite_async - sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + sha256: "7708a2129582d43614f436e28623fcbeb142a02022ba372e45cfe403c84dd2b5" url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.8.3" stack_trace: dependency: transitive description: @@ -551,10 +575,10 @@ packages: dependency: transitive description: name: storage_client - sha256: e37f1b9d40f43078d12bd2d1b6b08c2c16fbdbafc58b57bc44922da6ea3f5625 + sha256: "28c147c805304dbc2b762becd1fc26ee0cb621ace3732b9ae61ef979aab8b367" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" stream_channel: dependency: transitive description: @@ -575,18 +599,18 @@ packages: dependency: transitive description: name: supabase - sha256: "7d2ca0499a6933b9aed2f4ff9eff4cbc4107f54006be35c42c8e1db70e99438e" + sha256: "4ed1cf3298f39865c05b2d8557f92eb131a9b9af70e32e218672a0afce01a6bc" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.3.0" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: "048d9377a76e43b95039d67e26b4bb2326fc8818df8d2f4bd63b4fdfc79f8f50" + sha256: ff6ba3048fd47d831fdc0027d3efb99346d99b95becfcb406562454bd9b229c5 url: "https://pub.dev" source: hosted - version: "2.5.8" + version: "2.6.0" term_glyph: dependency: transitive description: @@ -607,10 +631,10 @@ packages: dependency: "direct main" description: name: timeago - sha256: d3204eb4c788214883380253da7f23485320a58c11d145babc82ad16bf4e7764 + sha256: "054cedf68706bb142839ba0ae6b135f6b68039f0b8301cbe8784ae653d5ff8de" url: "https://pub.dev" source: hosted - version: "3.6.1" + version: "3.7.0" typed_data: dependency: transitive description: @@ -639,26 +663,26 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf + sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79 url: "https://pub.dev" source: hosted - version: "6.3.3" + version: "6.3.9" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.3.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.2.0" url_launcher_macos: dependency: transitive description: @@ -679,26 +703,26 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" uuid: dependency: transitive description: name: uuid - sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" + sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90" url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.4.2" vector_math: dependency: transitive description: @@ -723,22 +747,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.1" - web_socket_channel: + web_socket: dependency: transitive description: - name: web_socket_channel - sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" url: "https://pub.dev" source: hosted - version: "2.4.5" - win32: + version: "0.1.6" + web_socket_channel: dependency: transitive description: - name: win32 - sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 + name: web_socket_channel + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" url: "https://pub.dev" source: hosted - version: "5.5.1" + version: "3.0.1" xdg_directories: dependency: transitive description: @@ -759,10 +783,10 @@ packages: dependency: transitive description: name: yet_another_json_isolate - sha256: e727502a2640d65b4b8a8a6cb48af9dd0cbe644ba4b3ee667c7f4afa0c1d6069 + sha256: "47ed3900e6b0e4dfe378811a4402e85b7fc126a7daa94f840fef65ea9c8e46f4" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.2" sdks: dart: ">=3.4.0 <4.0.0" flutter: ">=3.22.0" diff --git a/demos/supabase-todolist/pubspec.lock b/demos/supabase-todolist/pubspec.lock index 0aa0cb01..edf3123c 100644 --- a/demos/supabase-todolist/pubspec.lock +++ b/demos/supabase-todolist/pubspec.lock @@ -5,34 +5,34 @@ packages: dependency: transitive description: name: app_links - sha256: a9905d6a60e814503fabc7523a9ed161b812d7ca69c99ad8ceea14279dc4f06b + sha256: f04c3ca96426baba784c736a201926bd4145524c36a1b38942a351b033305e21 url: "https://pub.dev" source: hosted - version: "6.1.3" + version: "6.2.1" app_links_linux: dependency: transitive description: name: app_links_linux - sha256: "567139eca3ca9fb113f2082f3aaa75a26f30f0ebdbe5fa7f09a3913c5bebd630" + sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.3" app_links_platform_interface: dependency: transitive description: name: app_links_platform_interface - sha256: "58cff6f11df59b0e514dd5e4a61e988348ad5662f0e75d45d4e214ebea55c94c" + sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.2" app_links_web: dependency: transitive description: name: app_links_web - sha256: "74586ed5f3c4786341e82a0fa43c39ec3f13108a550f74e80d8bf68aa11349d1" + sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" archive: dependency: transitive description: @@ -77,34 +77,34 @@ packages: dependency: transitive description: name: camera_android - sha256: "4ef97ae90dab306a4ed8d5eee14c85fd8daf403ae22488b5617c848774396d72" + sha256: "32f04948a284b71d938fe275616faf4957d07f9b3aab8021bfc8c418301a289e" url: "https://pub.dev" source: hosted - version: "0.10.9+6" + version: "0.10.9+11" camera_avfoundation: dependency: transitive description: name: camera_avfoundation - sha256: "7d021e8cd30d9b71b8b92b4ad669e80af432d722d18d6aac338572754a786c15" + sha256: "7c28969a975a7eb2349bc2cb2dfe3ad218a33dba9968ecfb181ce08c87486655" url: "https://pub.dev" source: hosted - version: "0.9.16" + version: "0.9.17+3" camera_platform_interface: dependency: transitive description: name: camera_platform_interface - sha256: a250314a48ea337b35909a4c9d5416a208d736dcb01d0b02c6af122be66660b0 + sha256: b3ede1f171532e0d83111fe0980b46d17f1aa9788a07a2fbed07366bbdbb9061 url: "https://pub.dev" source: hosted - version: "2.7.4" + version: "2.8.0" camera_web: dependency: transitive description: name: camera_web - sha256: "9e9aba2fbab77ce2472924196ff8ac4dd8f9126c4f9a3096171cd1d870d6b26c" + sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f" url: "https://pub.dev" source: hosted - version: "0.3.3" + version: "0.3.5" characters: dependency: transitive description: @@ -141,18 +141,18 @@ packages: dependency: transitive description: name: cross_file - sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" url: "https://pub.dev" source: hosted - version: "0.3.4+1" + version: "0.3.4+2" crypto: dependency: transitive description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" fake_async: dependency: transitive description: @@ -181,10 +181,10 @@ packages: dependency: transitive description: name: ffi - sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" file: dependency: transitive description: @@ -218,10 +218,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e + sha256: "9d98bd47ef9d34e803d438f17fd32b116d31009f534a6fa5ce3a1167f189a6de" url: "https://pub.dev" source: hosted - version: "2.0.20" + version: "2.0.21" flutter_test: dependency: "direct dev" description: flutter @@ -236,18 +236,18 @@ packages: dependency: transitive description: name: functions_client - sha256: "48659e5c6a4bbe02659102bf6406a0cf39142202deae65aacfa78688f2e68946" + sha256: e63f49cd3b41727f47b3bde284a11a4ac62839e0604f64077d4257487510e484 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.2" gotrue: dependency: transitive description: name: gotrue - sha256: "65c8c47afb8230218bc295e6edcb948b117e39801f91c4a4bcb94dfd26b57134" + sha256: "8703db795511f69194fe77125a0c838bbb6befc2f95717b6e40331784a8bdecb" url: "https://pub.dev" source: hosted - version: "2.8.1" + version: "2.8.4" gtk: dependency: transitive description: @@ -260,10 +260,10 @@ packages: dependency: transitive description: name: http - sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" http_parser: dependency: transitive description: @@ -388,18 +388,18 @@ packages: dependency: "direct main" description: name: path_provider - sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: bca87b0165ffd7cdb9cad8edd22d18d2201e886d9a9f19b4fb3452ea7df3a72a + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" url: "https://pub.dev" source: hosted - version: "2.2.6" + version: "2.2.10" path_provider_foundation: dependency: transitive description: @@ -428,10 +428,10 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" petitparser: dependency: transitive description: @@ -460,10 +460,10 @@ packages: dependency: transitive description: name: postgrest - sha256: f1f78470a74c611811132ff12acdef9c08b3ec65b61e88161a057d6cc5fbbd83 + sha256: c4197238601c7c3103b03a4bb77f2050b17d0064bf8b968309421abdebbb7f0e url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" powersync: dependency: "direct main" description: @@ -505,10 +505,10 @@ packages: dependency: transitive description: name: realtime_client - sha256: cd44fa21407a2e217d674f1c1a33b36c49ad0d8aea0349bf5b66594db06c80fb + sha256: d897a65ee3b1b5ddc1cf606f0b83792262d38fd5679c2df7e38da29c977513da url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.1" retry: dependency: transitive description: @@ -521,66 +521,66 @@ packages: dependency: transitive description: name: rxdart - sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" url: "https://pub.dev" source: hosted - version: "0.27.7" + version: "0.28.0" shared_preferences: dependency: transitive description: name: shared_preferences - sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" + sha256: a7e8467e9181cef109f601e3f65765685786c1a738a83d7fbbde377589c0d974 url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.1" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" + sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.5.2" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" sky_engine: dependency: transitive description: flutter @@ -606,10 +606,10 @@ packages: dependency: transitive description: name: sqlite3 - sha256: "6d17989c0b06a5870b2190d391925186f944cb943e5262d0d3f778fcfca3bc6e" + sha256: fde692580bee3379374af1f624eb3e113ab2865ecb161dbe2d8ac2de9735dbdb url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.4.5" sqlite3_flutter_libs: dependency: transitive description: @@ -630,10 +630,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + sha256: "7708a2129582d43614f436e28623fcbeb142a02022ba372e45cfe403c84dd2b5" url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.8.3" stack_trace: dependency: transitive description: @@ -646,10 +646,10 @@ packages: dependency: transitive description: name: storage_client - sha256: e37f1b9d40f43078d12bd2d1b6b08c2c16fbdbafc58b57bc44922da6ea3f5625 + sha256: "28c147c805304dbc2b762becd1fc26ee0cb621ace3732b9ae61ef979aab8b367" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" stream_channel: dependency: transitive description: @@ -678,18 +678,18 @@ packages: dependency: transitive description: name: supabase - sha256: "073aabf6a9f6ada2ebb77082222e1104949afb9f7f181017d0643d99bda0efe3" + sha256: "4ed1cf3298f39865c05b2d8557f92eb131a9b9af70e32e218672a0afce01a6bc" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.0" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: ae56c20924fadd62f0a83f0570c22cec85f4b093768fbd0e049c4e1741a109a7 + sha256: ff6ba3048fd47d831fdc0027d3efb99346d99b95becfcb406562454bd9b229c5 url: "https://pub.dev" source: hosted - version: "2.5.6" + version: "2.6.0" term_glyph: dependency: transitive description: @@ -734,26 +734,26 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf + sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79 url: "https://pub.dev" source: hosted - version: "6.3.3" + version: "6.3.9" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.3.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.2.0" url_launcher_macos: dependency: transitive description: @@ -774,26 +774,26 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" uuid: dependency: transitive description: name: uuid - sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" + sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90" url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.4.2" vector_math: dependency: transitive description: @@ -818,22 +818,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.1" - web_socket_channel: + web_socket: dependency: transitive description: - name: web_socket_channel - sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" url: "https://pub.dev" source: hosted - version: "2.4.5" - win32: + version: "0.1.6" + web_socket_channel: dependency: transitive description: - name: win32 - sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 + name: web_socket_channel + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" url: "https://pub.dev" source: hosted - version: "5.5.1" + version: "3.0.1" xdg_directories: dependency: transitive description: @@ -862,10 +862,10 @@ packages: dependency: transitive description: name: yet_another_json_isolate - sha256: e727502a2640d65b4b8a8a6cb48af9dd0cbe644ba4b3ee667c7f4afa0c1d6069 + sha256: "47ed3900e6b0e4dfe378811a4402e85b7fc126a7daa94f840fef65ea9c8e46f4" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.2" sdks: dart: ">=3.4.0 <4.0.0" flutter: ">=3.22.0" From 107cb87b7763660d0dba657deec8357c09363c77 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Thu, 22 Aug 2024 10:07:14 +0200 Subject: [PATCH 13/21] Specify sqlite3 >= 2.4.5 --- packages/powersync/pubspec.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/powersync/pubspec.yaml b/packages/powersync/pubspec.yaml index 958d833e..37a28044 100644 --- a/packages/powersync/pubspec.yaml +++ b/packages/powersync/pubspec.yaml @@ -11,6 +11,9 @@ dependencies: sdk: flutter sqlite_async: ^0.8.1 + # We only use sqlite3 as a transitive dependency, + # but right now we need a minimum of v2.4.5. + sqlite3: ">=2.4.5" universal_io: ^2.0.0 sqlite3_flutter_libs: ^0.5.23 powersync_flutter_libs: ^0.2.2 @@ -30,7 +33,7 @@ dev_dependencies: test: ^1.25.0 test_api: ^0.7.0 path_provider: ^2.0.13 - sqlite3: "^2.4.4" + sqlite3: "^2.4.5" shelf: ^1.4.1 shelf_router: ^1.1.4 shelf_static: ^1.1.2 From d97a04ed387df04f3be2f3bb60d79c5b28afde1e Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Thu, 22 Aug 2024 10:21:50 +0200 Subject: [PATCH 14/21] Fix dependency lint issue. --- packages/powersync/pubspec.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/powersync/pubspec.yaml b/packages/powersync/pubspec.yaml index 37a28044..04e6a040 100644 --- a/packages/powersync/pubspec.yaml +++ b/packages/powersync/pubspec.yaml @@ -33,7 +33,6 @@ dev_dependencies: test: ^1.25.0 test_api: ^0.7.0 path_provider: ^2.0.13 - sqlite3: "^2.4.5" shelf: ^1.4.1 shelf_router: ^1.1.4 shelf_static: ^1.1.2 From 72f774b1a64f510717df2babbd1584d90430d80b Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Thu, 22 Aug 2024 10:25:59 +0200 Subject: [PATCH 15/21] Another dependency bump. --- demos/supabase-anonymous-auth/pubspec.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/supabase-anonymous-auth/pubspec.lock b/demos/supabase-anonymous-auth/pubspec.lock index d86dd147..f11e5741 100644 --- a/demos/supabase-anonymous-auth/pubspec.lock +++ b/demos/supabase-anonymous-auth/pubspec.lock @@ -495,10 +495,10 @@ packages: dependency: transitive description: name: sqlite3 - sha256: "6d17989c0b06a5870b2190d391925186f944cb943e5262d0d3f778fcfca3bc6e" + sha256: fde692580bee3379374af1f624eb3e113ab2865ecb161dbe2d8ac2de9735dbdb url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.4.5" sqlite3_flutter_libs: dependency: transitive description: From a2538f6c4fb3745c8458eb997eea8ab0cfba9280 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Thu, 22 Aug 2024 10:55:36 +0200 Subject: [PATCH 16/21] Check extension version. --- .../lib/src/database/powersync_db_mixin.dart | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/packages/powersync/lib/src/database/powersync_db_mixin.dart b/packages/powersync/lib/src/database/powersync_db_mixin.dart index 58308109..8ba702f6 100644 --- a/packages/powersync/lib/src/database/powersync_db_mixin.dart +++ b/packages/powersync/lib/src/database/powersync_db_mixin.dart @@ -78,11 +78,42 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection { .cast(); await database.initialize(); + await _checkVersion(); await database.execute('SELECT powersync_init()'); await updateSchema(schema); await _updateHasSynced(); } + /// Check that a supported version of the powersync extension is loaded. + Future _checkVersion() async { + // Get version + String version; + try { + final row = + await database.get('SELECT powersync_rs_version() as version'); + version = row['version']; + } catch (e) { + throw SqliteException( + 1, 'The powersync extension is not loaded correctly. Details: $e'); + } + + // Parse version + List versionInts; + try { + versionInts = + version.split(RegExp(r'[./]')).take(3).map(int.parse).toList(); + } catch (e) { + throw SqliteException(1, + 'Unsupported powersync extension version. Need ^0.2.0, got: $version. Details: $e'); + } + + // Validate ^0.2.0 + if (versionInts[0] != 0 || versionInts[1] != 2 || versionInts[2] < 0) { + throw SqliteException(1, + 'Unsupported powersync extension version. Need ^0.2.0, got: $version'); + } + } + /// Wait for initialization to complete. /// /// While initializing is automatic, this helps to catch and report initialization errors. From 773f2636365e0c10588f20aa59e99dfb6891f2b6 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Thu, 29 Aug 2024 10:47:14 +0200 Subject: [PATCH 17/21] Add PowerSyncDatabase.getClientId(). --- .../powersync/lib/src/database/powersync_db_mixin.dart | 7 +++++++ packages/powersync/test/powersync_shared_test.dart | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/packages/powersync/lib/src/database/powersync_db_mixin.dart b/packages/powersync/lib/src/database/powersync_db_mixin.dart index 8ba702f6..82c0f626 100644 --- a/packages/powersync/lib/src/database/powersync_db_mixin.dart +++ b/packages/powersync/lib/src/database/powersync_db_mixin.dart @@ -287,6 +287,13 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection { return database.isolateConnectionFactory(); } + /// Get an unique id for this client. + /// This id is only reset when the database is deleted. + Future getClientId() async { + final row = await get('SELECT powersync_client_id() as client_id'); + return row['client_id'] as String; + } + /// Get upload queue size estimate and count. Future getUploadQueueStats( {bool includeSize = false}) async { diff --git a/packages/powersync/test/powersync_shared_test.dart b/packages/powersync/test/powersync_shared_test.dart index 3cb3a9c3..9db23616 100644 --- a/packages/powersync/test/powersync_shared_test.dart +++ b/packages/powersync/test/powersync_shared_test.dart @@ -1,5 +1,7 @@ import 'package:sqlite_async/mutex.dart'; import 'package:test/test.dart'; +import 'package:uuid/parsing.dart'; +import 'package:uuid/v4.dart'; import 'utils/test_utils_impl.dart'; final testUtils = TestUtils(); @@ -79,5 +81,13 @@ void main() { await db.execute('PRAGMA wal_checkpoint(TRUNCATE)'); await db.execute('VACUUM'); }); + + test('should have a client id', () async { + final db = await testUtils.setupPowerSync(path: path); + + final id = await db.getClientId(); + // Check that it is a valid uuid + final _uuid = UuidParsing.parseAsByteList(id); + }); }); } From b3c71c9ed16bdf131be42b8936b1c3c14e68c005 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Thu, 29 Aug 2024 10:50:09 +0200 Subject: [PATCH 18/21] Use sqlite3 ^2.4.5 --- packages/powersync/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/powersync/pubspec.yaml b/packages/powersync/pubspec.yaml index 04e6a040..8f456dcc 100644 --- a/packages/powersync/pubspec.yaml +++ b/packages/powersync/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: sqlite_async: ^0.8.1 # We only use sqlite3 as a transitive dependency, # but right now we need a minimum of v2.4.5. - sqlite3: ">=2.4.5" + sqlite3: ^2.4.5 universal_io: ^2.0.0 sqlite3_flutter_libs: ^0.5.23 powersync_flutter_libs: ^0.2.2 From 4e89e9aa97adddf7067353a6758c75a0c88c825a Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Thu, 29 Aug 2024 10:55:10 +0200 Subject: [PATCH 19/21] Fix lint issues. --- packages/powersync/test/powersync_shared_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/powersync/test/powersync_shared_test.dart b/packages/powersync/test/powersync_shared_test.dart index 9db23616..26b458d8 100644 --- a/packages/powersync/test/powersync_shared_test.dart +++ b/packages/powersync/test/powersync_shared_test.dart @@ -1,7 +1,7 @@ import 'package:sqlite_async/mutex.dart'; import 'package:test/test.dart'; import 'package:uuid/parsing.dart'; -import 'package:uuid/v4.dart'; + import 'utils/test_utils_impl.dart'; final testUtils = TestUtils(); @@ -87,7 +87,7 @@ void main() { final id = await db.getClientId(); // Check that it is a valid uuid - final _uuid = UuidParsing.parseAsByteList(id); + UuidParsing.parseAsByteList(id); }); }); } From 97f452127c0d28e1b84ff92ee66dd88c381e3208 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Mon, 2 Sep 2024 09:45:03 +0200 Subject: [PATCH 20/21] Use powersync-sqlite-core v0.2.1 --- packages/powersync_flutter_libs/android/build.gradle | 2 +- .../powersync_flutter_libs/ios/powersync_flutter_libs.podspec | 2 +- .../powersync_flutter_libs/macos/powersync_flutter_libs.podspec | 2 +- scripts/download_core_binary_demos.dart | 2 +- scripts/init_powersync_core_binary.dart | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/powersync_flutter_libs/android/build.gradle b/packages/powersync_flutter_libs/android/build.gradle index c5414e13..cfde045d 100644 --- a/packages/powersync_flutter_libs/android/build.gradle +++ b/packages/powersync_flutter_libs/android/build.gradle @@ -50,5 +50,5 @@ android { } dependencies { - implementation 'co.powersync:powersync-sqlite-core:0.2.0' + implementation 'co.powersync:powersync-sqlite-core:0.2.1' } diff --git a/packages/powersync_flutter_libs/ios/powersync_flutter_libs.podspec b/packages/powersync_flutter_libs/ios/powersync_flutter_libs.podspec index 5c7736d5..d8ad8e47 100644 --- a/packages/powersync_flutter_libs/ios/powersync_flutter_libs.podspec +++ b/packages/powersync_flutter_libs/ios/powersync_flutter_libs.podspec @@ -22,7 +22,7 @@ A new Flutter FFI plugin project. s.dependency 'Flutter' s.platform = :ios, '11.0' - s.dependency "powersync-sqlite-core", "~> 0.2.0" + s.dependency "powersync-sqlite-core", "~> 0.2.1" # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } diff --git a/packages/powersync_flutter_libs/macos/powersync_flutter_libs.podspec b/packages/powersync_flutter_libs/macos/powersync_flutter_libs.podspec index b9683279..32d1d829 100644 --- a/packages/powersync_flutter_libs/macos/powersync_flutter_libs.podspec +++ b/packages/powersync_flutter_libs/macos/powersync_flutter_libs.podspec @@ -21,7 +21,7 @@ A new Flutter FFI plugin project. s.source_files = 'Classes/**/*' s.dependency 'FlutterMacOS' - s.dependency "powersync-sqlite-core", "~> 0.2.0" + s.dependency "powersync-sqlite-core", "~> 0.2.1" s.platform = :osx, '10.11' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } diff --git a/scripts/download_core_binary_demos.dart b/scripts/download_core_binary_demos.dart index 1c13f215..723e31c2 100644 --- a/scripts/download_core_binary_demos.dart +++ b/scripts/download_core_binary_demos.dart @@ -3,7 +3,7 @@ import 'dart:io'; final coreUrl = - 'https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v0.2.0'; + 'https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v0.2.1'; void main() async { final powersyncLibsLinuxPath = "packages/powersync_flutter_libs/linux"; diff --git a/scripts/init_powersync_core_binary.dart b/scripts/init_powersync_core_binary.dart index 709ce8d8..87298e93 100644 --- a/scripts/init_powersync_core_binary.dart +++ b/scripts/init_powersync_core_binary.dart @@ -6,7 +6,7 @@ import 'dart:io'; import 'package:melos/melos.dart'; final sqliteUrl = - 'https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v0.2.0'; + 'https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v0.2.1'; void main() async { final sqliteCoreFilename = getLibraryForPlatform(); From d5ac13e3e8729b11656382947370f4fa675e36a4 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Thu, 5 Sep 2024 12:21:50 +0200 Subject: [PATCH 21/21] Fix lastSyncedAt. --- .../powersync/lib/src/database/powersync_db_mixin.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/powersync/lib/src/database/powersync_db_mixin.dart b/packages/powersync/lib/src/database/powersync_db_mixin.dart index 82c0f626..9547d420 100644 --- a/packages/powersync/lib/src/database/powersync_db_mixin.dart +++ b/packages/powersync/lib/src/database/powersync_db_mixin.dart @@ -129,7 +129,8 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection { final hasSynced = timestamp != null; if (hasSynced != currentStatus.hasSynced) { - final lastSyncedAt = timestamp == null ? null : DateTime.parse(timestamp); + final lastSyncedAt = + timestamp == null ? null : DateTime.parse('${timestamp}Z').toLocal(); final status = SyncStatus(hasSynced: hasSynced, lastSyncedAt: lastSyncedAt); setStatus(status); @@ -157,7 +158,8 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection { // The previous values of hasSynced should be preserved here. hasSynced: status.lastSyncedAt != null ? true - : status.hasSynced ?? currentStatus.hasSynced); + : status.hasSynced ?? currentStatus.hasSynced, + lastSyncedAt: status.lastSyncedAt ?? currentStatus.lastSyncedAt); statusStreamController.add(currentStatus); } } @@ -260,7 +262,8 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection { await tx.execute('select powersync_clear(?)', [clearLocal ? 1 : 0]); }); // The data has been deleted - reset these - setStatus(SyncStatus(lastSyncedAt: null, hasSynced: false)); + currentStatus = SyncStatus(lastSyncedAt: null, hasSynced: false); + statusStreamController.add(currentStatus); } @Deprecated('Use [disconnectAndClear] instead.')