Skip to content

Commit f8dc564

Browse files
committed
Add User-Agent header.
1 parent 6d9583f commit f8dc564

File tree

5 files changed

+39
-2
lines changed

5 files changed

+39
-2
lines changed

packages/powersync/lib/src/streaming_sync.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:http/http.dart' as http;
55
import 'package:powersync/src/abort_controller.dart';
66
import 'package:powersync/src/exceptions.dart';
77
import 'package:powersync/src/log_internal.dart';
8+
import 'package:powersync/src/user_agent/user_agent.dart';
89
import 'package:sqlite_async/mutex.dart';
910

1011
import 'bucket_storage.dart';
@@ -48,6 +49,8 @@ class StreamingSyncImplementation {
4849

4950
final Mutex syncMutex, crudMutex;
5051

52+
late final String? userAgent;
53+
5154
StreamingSyncImplementation(
5255
{required this.adapter,
5356
required this.credentialsCallback,
@@ -65,6 +68,7 @@ class StreamingSyncImplementation {
6568
crudMutex = Mutex(identifier: "crud-$identifier") {
6669
_client = client;
6770
statusStream = _statusStreamController.stream;
71+
userAgent = powerSyncUserAgent();
6872
}
6973

7074
/// Close any active streams.
@@ -195,10 +199,15 @@ class StreamingSyncImplementation {
195199
}
196200
final uri = credentials.endpointUri('write-checkpoint2.json');
197201

198-
final response = await _client.get(uri, headers: {
202+
Map<String, String> headers = {
199203
'Content-Type': 'application/json',
200204
'Authorization': "Token ${credentials.token}"
201-
});
205+
};
206+
if (userAgent != null) {
207+
headers['User-Agent'] = userAgent!;
208+
}
209+
210+
final response = await _client.get(uri, headers: headers);
202211
if (response.statusCode == 401) {
203212
if (invalidCredentialsCallback != null) {
204213
await invalidCredentialsCallback!();
@@ -405,6 +414,9 @@ class StreamingSyncImplementation {
405414
final request = http.Request('POST', uri);
406415
request.headers['Content-Type'] = 'application/json';
407416
request.headers['Authorization'] = "Token ${credentials.token}";
417+
if (userAgent != null) {
418+
request.headers['User-Agent'] = userAgent!;
419+
}
408420
request.body = convert.jsonEncode(data);
409421

410422
http.StreamedResponse res;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// For native, expose a user agent.
2+
// For web, we're not able to override the user agent anyway.
3+
4+
export './user_agent_stub.dart'
5+
// ignore: uri_does_not_exist
6+
if (dart.library.io) './user_agent_native.dart';
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import 'dart:io';
2+
3+
import 'package:powersync/src/version.dart';
4+
5+
String? powerSyncUserAgent() {
6+
var dartVersion = RegExp(r'[\w.]+').stringMatch(Platform.version);
7+
var dart = 'Dart';
8+
if (dartVersion != null) {
9+
dart = "Dart/$dartVersion";
10+
}
11+
// Ideally we'd get an OS version, but that's quite complex.
12+
13+
return 'PowerSync/$libraryVersion ($dart; ${Platform.operatingSystem})';
14+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
String? powerSyncUserAgent() {
2+
return null;
3+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// TODO: auto-update when bumping the version
2+
const libraryVersion = '1.6.4';

0 commit comments

Comments
 (0)