Skip to content

Commit c5f08f6

Browse files
authored
feat: Add installationId in LiveQuery connect (#976)
1 parent f757dad commit c5f08f6

File tree

6 files changed

+95
-7
lines changed

6 files changed

+95
-7
lines changed

packages/dart/CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## [6.3.0](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-6.2.0...dart-6.3.0) (2023-11-11)
2+
3+
### Features
4+
5+
* Add `installationId` in LiveQuery `connect` ([#976](https://github.com/parse-community/Parse-SDK-Flutter/pull/976))
6+
17
## [6.2.0](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-6.1.0...dart-6.2.0) (2023-10-18)
28

39
### Features

packages/dart/lib/src/base/parse_constants.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
part of flutter_parse_sdk;
22

33
// Library
4-
const String keySdkVersion = '6.2.0';
4+
const String keySdkVersion = '6.3.0';
55
const String keyLibraryName = 'Flutter Parse SDK';
66

77
// End Points

packages/dart/lib/src/network/parse_live_query.dart

+22-4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class Subscription<T extends ParseObject> {
2222
'error'
2323
];
2424
Map<String, Function> eventCallbacks = <String, Function>{};
25+
2526
void on(LiveQueryEvent op, Function callback) {
2627
eventCallbacks[_liveQueryEvent[op.index]] = callback;
2728
}
@@ -140,8 +141,10 @@ class LiveQueryClient {
140141
reconnectingController = LiveQueryReconnectingController(
141142
() => reconnect(userInitialized: false), getClientEventStream, _debug);
142143
}
144+
143145
static LiveQueryClient get instance => _getInstance();
144146
static LiveQueryClient? _instance;
147+
145148
static LiveQueryClient _getInstance({bool? debug, bool? autoSendSessionId}) {
146149
String? liveQueryURL = ParseCoreData().liveQueryURL;
147150
if (liveQueryURL == null) {
@@ -174,13 +177,14 @@ class LiveQueryClient {
174177
bool _connecting = false;
175178
late StreamController<LiveQueryClientEvent> _clientEventStreamController;
176179
late Stream<LiveQueryClientEvent> _clientEventStream;
180+
StreamController<String>? chanelStream;
177181
late LiveQueryReconnectingController reconnectingController;
178182

179183
final Map<int, Subscription> _requestSubscription = <int, Subscription>{};
180184

181185
Future<void> reconnect({bool userInitialized = false}) async {
182186
await _connect(userInitialized: userInitialized);
183-
_connectLiveQuery();
187+
await _connectLiveQuery();
184188
}
185189

186190
int readyState() {
@@ -286,6 +290,8 @@ class LiveQueryClient {
286290
_channel = channel;
287291
channel.stream.listen((dynamic message) {
288292
_handleMessage(message);
293+
294+
chanelStream?.sink.add(message);
289295
}, onDone: () {
290296
_clientEventStreamController.sink
291297
.add(LiveQueryClientEvent.disconnected);
@@ -315,7 +321,7 @@ class LiveQueryClient {
315321
}
316322
}
317323

318-
void _connectLiveQuery() {
324+
Future<void> _connectLiveQuery() async {
319325
WebSocketChannel? channel = _channel;
320326
if (channel == null) {
321327
return;
@@ -333,10 +339,22 @@ class LiveQueryClient {
333339
connectMessage['sessionToken'] = sessionId;
334340
}
335341
}
342+
336343
String? clientKey = ParseCoreData().clientKey;
344+
if (clientKey != null) {
345+
connectMessage['clientKey'] = clientKey;
346+
}
347+
337348
String? masterKey = ParseCoreData().masterKey;
338-
if (clientKey != null) connectMessage['clientKey'] = clientKey;
339-
if (masterKey != null) connectMessage['masterKey'] = masterKey;
349+
if (masterKey != null) {
350+
connectMessage['masterKey'] = masterKey;
351+
}
352+
353+
String? parseInstallation =
354+
(await ParseInstallation.currentInstallation()).installationId;
355+
if (parseInstallation != null) {
356+
connectMessage['installationId'] = parseInstallation;
357+
}
340358

341359
if (_debug) {
342360
print('$_printConstLiveQuery: ConnectMessage: $connectMessage');

packages/dart/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: parse_server_sdk
22
description: The Dart SDK to connect to Parse Server. Build your apps faster with Parse Platform, the complete application stack.
3-
version: 6.2.0
3+
version: 6.3.0
44
homepage: https://parseplatform.org
55
repository: https://github.com/parse-community/Parse-SDK-Flutter
66
issue_tracker: https://github.com/parse-community/Parse-SDK-Flutter/issues
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import 'dart:async';
2+
import 'dart:convert';
3+
4+
import 'package:parse_server_sdk/parse_server_sdk.dart';
5+
import 'package:test/test.dart';
6+
7+
import '../../test_utils.dart';
8+
9+
void main() {
10+
setUpAll(() async {
11+
// Create a fake server
12+
final channel = spawnHybridCode(r'''
13+
import 'dart:io';
14+
import 'package:stream_channel/stream_channel.dart';
15+
16+
hybridMain(StreamChannel channel) async {
17+
var server = await HttpServer.bind('localhost', 0);
18+
server.transform(WebSocketTransformer()).listen((webSocket) {
19+
webSocket.listen((request) {
20+
webSocket.add(request);
21+
});
22+
});
23+
channel.sink.add(server.port);
24+
}
25+
''');
26+
27+
// Get port server
28+
int port = await channel.stream.first as int;
29+
await initializeParse(liveQueryUrl: 'http://localhost:$port');
30+
});
31+
32+
test('should exist installationId in connect LiveQuery', () async {
33+
// arrange
34+
QueryBuilder<ParseObject> query =
35+
QueryBuilder<ParseObject>(ParseObject('Test'));
36+
37+
// Set installationId
38+
ParseInstallation parseInstallation = ParseInstallation();
39+
parseInstallation.set(keyInstallationId, "1234");
40+
final String objectJson = json.encode(parseInstallation.toJson(full: true));
41+
await ParseCoreData()
42+
.getStore()
43+
.setString(keyParseStoreInstallation, objectJson);
44+
45+
// Initialize LiveQuery
46+
final LiveQuery liveQuery = LiveQuery();
47+
liveQuery.client.chanelStream = StreamController<String>();
48+
49+
// act
50+
await liveQuery.client.reconnect();
51+
await liveQuery.client.subscribe(query);
52+
53+
// assert
54+
liveQuery.client.chanelStream?.stream.listen((event) {
55+
if (event.contains('connect')) {
56+
expect(true, event.contains('1234'));
57+
}
58+
});
59+
60+
// 10 millisecond hold for stream
61+
await Future.delayed(Duration(milliseconds: 10));
62+
});
63+
}

packages/dart/test/test_utils.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import 'package:test/test.dart';
33

44
const serverUrl = 'https://example.com';
55

6-
Future<void> initializeParse() async {
6+
Future<void> initializeParse({String? liveQueryUrl}) async {
77
await Parse().initialize(
88
'appId',
99
serverUrl,
10+
liveQueryUrl: liveQueryUrl,
1011
debug: true,
1112
// to prevent automatic detection
1213
fileDirectory: 'someDirectory',

0 commit comments

Comments
 (0)