Line data Source code
1 : import 'dart:convert';
2 : import 'dart:isolate';
3 :
4 : import 'package:at_client/at_client.dart';
5 : import 'package:at_client/src/client/remote_secondary.dart';
6 : import 'package:at_commons/at_builders.dart';
7 : import 'package:at_utils/at_logger.dart';
8 :
9 : class SyncIsolateManager {
10 0 : static final SyncIsolateManager _singleton = SyncIsolateManager._internal();
11 :
12 0 : SyncIsolateManager._internal();
13 :
14 0 : factory SyncIsolateManager.getInstance() {
15 0 : return _singleton;
16 : }
17 :
18 0 : static var logger = AtSignLogger('SyncIsolateManager');
19 :
20 0 : static void syncImmediateIsolate(SendPort sendPort) {
21 : try {
22 0 : var isolateReceive = ReceivePort();
23 0 : sendPort.send(isolateReceive.sendPort);
24 0 : isolateReceive.listen((message) async {
25 0 : var builder = message['builder'];
26 0 : var atSign = message['atsign'];
27 0 : var preference = message['preference'];
28 0 : var privateKey = message['privateKey'];
29 : var remoteSecondary =
30 0 : RemoteSecondary(atSign, preference, privateKey: privateKey);
31 0 : var verbResult = await remoteSecondary.executeVerb(builder);
32 0 : logger.info('syncIsolate result:$verbResult');
33 0 : var serverCommitId = verbResult.split(':')[1];
34 0 : sendPort.send(serverCommitId);
35 : });
36 0 : } on Exception catch (e) {
37 0 : logger.severe('exception in syncImmediateIsolate ${e.toString()}');
38 : }
39 : }
40 :
41 0 : static void executeRemoteCommandIsolate(SendPort sendPort) async {
42 : try {
43 0 : var isolateReceive = ReceivePort();
44 0 : sendPort.send(isolateReceive.sendPort);
45 0 : isolateReceive.listen((message) async {
46 0 : var operation = message['operation'];
47 0 : var atSign = message['atsign'];
48 0 : var preference = message['preference'];
49 0 : var privateKey = message['private_key'];
50 : var remoteSecondary =
51 0 : RemoteSecondary(atSign, preference, privateKey: privateKey);
52 :
53 : switch (operation) {
54 0 : case 'get_commit_id':
55 : // Send stats verb to get latest server commit id.
56 : int? commitId;
57 0 : var builder = StatsVerbBuilder()..statIds = '3';
58 0 : var result = await remoteSecondary.executeVerb(builder);
59 0 : result = result.replaceAll('data: ', '');
60 0 : var statsJson = jsonDecode(result);
61 0 : if (statsJson[0]['value'] != 'null') {
62 0 : commitId = int.parse(statsJson[0]['value']);
63 : }
64 0 : var isolateResult = <String, dynamic>{};
65 0 : isolateResult['operation'] = 'get_commit_id_result';
66 0 : isolateResult['commit_id'] = commitId;
67 0 : sendPort.send(isolateResult);
68 : break;
69 0 : case 'get_server_commits':
70 : // send sync verb to get latest changes from server
71 0 : var lastSyncedId = message['last_synced_commit_id'];
72 0 : var result = await remoteSecondary.sync(lastSyncedId);
73 0 : var isolateResult = <String, dynamic>{};
74 0 : isolateResult['operation'] = 'get_server_commits_result';
75 0 : isolateResult['sync_response'] = result;
76 0 : sendPort.send(isolateResult);
77 : break;
78 0 : case 'push_to_remote':
79 : // execute update/delete verb on server
80 0 : var builder = message['builder'];
81 0 : var result = await remoteSecondary.executeVerb(builder);
82 0 : var serverCommitId = result.split(':')[1];
83 0 : var isolateResult = <String, dynamic>{};
84 0 : isolateResult['operation'] = 'push_to_remote_result';
85 0 : isolateResult['operation_commit_id'] = serverCommitId;
86 0 : isolateResult['entry_key'] = message['entry_key'];
87 0 : logger.info(
88 0 : 'pushed to remote:${builder.atKey}:${builder.sharedWith} ${isolateResult['entry_key']} $serverCommitId');
89 0 : sendPort.send(isolateResult);
90 : break;
91 : }
92 : });
93 0 : } on Exception catch (e) {
94 0 : logger.severe('exception in executeRemoteCommandIsolate ${e.toString()}');
95 : }
96 : }
97 : }
|