Skip to content

Commit a0b6020

Browse files
authored
Seperate the dart and the flutter parts of this sdk (#434)
* Set TODO's Set TODO's, needed for #78 (comment) * First step of seperating the flutter and the dart parts * added one todo * remove connectivity from the dart part * Removed path_provider from the dart part Not so happy with the fact that `CoreStoreSembastImp implements sdk.CoreStoreSembastImp` in `parse_server_sdk.dart` but I didn't find a better solution. * Removed shared_preferences from the dart part * Update pubspec.yaml * Update parse_server_sdk_dart.dart * removed dart:ui from dart part * removed flutter from dart part * fixed tests
1 parent efbb9c6 commit a0b6020

15 files changed

+663
-405
lines changed

example/pubspec.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ dependencies:
1111
sembast: ^2.0.1
1212
shared_preferences: ^0.5.0
1313

14+
path_provider: ^1.6.14
15+
1416
dev_dependencies:
1517
parse_server_sdk:
1618
path: ../

lib/parse_server_sdk.dart

Lines changed: 145 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,156 +1,198 @@
1-
library flutter_parse_sdk;
2-
31
import 'dart:async';
4-
import 'dart:convert';
52
import 'dart:io';
6-
import 'dart:math';
7-
import 'dart:typed_data';
83
import 'dart:ui' as ui;
94

105
import 'package:connectivity/connectivity.dart';
116
import 'package:flutter/widgets.dart';
12-
import 'package:http/http.dart';
13-
import 'package:http/io_client.dart';
14-
import 'package:meta/meta.dart';
157
import 'package:package_info/package_info.dart';
16-
import 'package:parse_server_sdk/src/network/parse_websocket.dart'
17-
as parse_web_socket;
188
import 'package:path/path.dart' as path;
199
import 'package:path_provider/path_provider.dart';
2010
import 'package:sembast/sembast.dart';
21-
import 'package:sembast/sembast_io.dart';
22-
import 'package:shared_preferences/shared_preferences.dart';
23-
import 'package:uuid/uuid.dart';
24-
import 'package:web_socket_channel/web_socket_channel.dart';
25-
import 'package:xxtea/xxtea.dart';
26-
27-
export 'src/utils/parse_live_list.dart';
28-
29-
part 'package:parse_server_sdk/src/data/core_store.dart';
30-
part 'package:parse_server_sdk/src/data/parse_subclass_handler.dart';
31-
part 'package:parse_server_sdk/src/objects/response/parse_error_response.dart';
32-
part 'package:parse_server_sdk/src/objects/response/parse_exception_response.dart';
33-
part 'package:parse_server_sdk/src/objects/response/parse_response_builder.dart';
34-
part 'package:parse_server_sdk/src/objects/response/parse_response_utils.dart';
35-
part 'package:parse_server_sdk/src/objects/response/parse_success_no_results.dart';
36-
part 'package:parse_server_sdk/src/storage/core_store_sem_impl.dart';
37-
part 'package:parse_server_sdk/src/storage/core_store_sp_impl.dart';
38-
part 'package:parse_server_sdk/src/storage/xxtea_codec.dart';
39-
part 'src/base/parse_constants.dart';
40-
part 'src/data/parse_core_data.dart';
41-
part 'src/enums/parse_enum_api_rq.dart';
42-
part 'src/network/parse_http_client.dart';
43-
part 'src/network/parse_live_query.dart';
44-
part 'src/network/parse_query.dart';
45-
part 'src/objects/parse_acl.dart';
46-
part 'src/objects/parse_base.dart';
47-
part 'src/objects/parse_cloneable.dart';
48-
part 'src/objects/parse_config.dart';
49-
part 'src/objects/parse_error.dart';
50-
part 'src/objects/parse_file.dart';
51-
part 'src/objects/parse_file_base.dart';
52-
part 'src/objects/parse_file_web.dart';
53-
part 'src/objects/parse_function.dart';
54-
part 'src/objects/parse_geo_point.dart';
55-
part 'src/objects/parse_installation.dart';
56-
part 'src/objects/parse_merge.dart';
57-
part 'src/objects/parse_object.dart';
58-
part 'src/objects/parse_relation.dart';
59-
part 'src/objects/parse_response.dart';
60-
part 'src/objects/parse_session.dart';
61-
part 'src/objects/parse_user.dart';
62-
part 'src/utils/parse_date_format.dart';
63-
part 'src/utils/parse_decoder.dart';
64-
part 'src/utils/parse_encoder.dart';
65-
part 'src/utils/parse_file_extensions.dart';
66-
part 'src/utils/parse_logger.dart';
67-
part 'src/utils/parse_login_helpers.dart';
68-
part 'src/utils/parse_utils.dart';
69-
70-
class Parse {
71-
ParseCoreData data;
72-
bool _hasBeenInitialized = false;
7311

12+
import 'parse_server_sdk_dart.dart' as sdk;
13+
import 'src/storage/core_store_sp_impl.dart';
14+
15+
export 'parse_server_sdk_dart.dart' hide Parse, CoreStoreSembastImp;
16+
export 'src/storage/core_store_sp_impl.dart';
17+
export 'src/utils/parse_live_list_flutter.dart';
18+
19+
class Parse extends sdk.Parse
20+
with WidgetsBindingObserver
21+
implements sdk.ParseConnectivityProvider {
7422
/// To initialize Parse Server in your application
7523
///
7624
/// This should be initialized in MyApp() creation
7725
///
7826
/// ```
7927
/// Parse().initialize(
80-
// "PARSE_APP_ID",
81-
// "https://parse.myaddress.com/parse/,
82-
// masterKey: "asd23rjh234r234r234r",
83-
// debug: true,
84-
// liveQuery: true);
85-
// ```
28+
/// "PARSE_APP_ID",
29+
/// "https://parse.myaddress.com/parse/,
30+
/// masterKey: "asd23rjh234r234r234r",
31+
/// debug: true,
32+
/// liveQuery: true);
33+
/// ```
34+
/// [appName], [appVersion] and [appPackageName] are automatically set on Android and IOS, if they are not defined. You should provide a value on web.
35+
/// [fileDirectory] is not used on web
36+
@override
8637
Future<Parse> initialize(
8738
String appId,
8839
String serverUrl, {
8940
bool debug = false,
90-
String appName = '',
41+
String appName,
42+
String appVersion,
43+
String appPackageName,
44+
String locale,
9145
String liveQueryUrl,
9246
String clientKey,
9347
String masterKey,
9448
String sessionId,
9549
bool autoSendSessionId,
9650
SecurityContext securityContext,
97-
CoreStore coreStore,
98-
Map<String, ParseObjectConstructor> registeredSubClassMap,
99-
ParseUserConstructor parseUserConstructor,
100-
ParseFileConstructor parseFileConstructor,
51+
sdk.CoreStore coreStore,
52+
Map<String, sdk.ParseObjectConstructor> registeredSubClassMap,
53+
sdk.ParseUserConstructor parseUserConstructor,
54+
sdk.ParseFileConstructor parseFileConstructor,
10155
List<int> liveListRetryIntervals,
56+
sdk.ParseConnectivityProvider connectivityProvider,
57+
String fileDirectory,
58+
Stream<void> appResumedStream,
10259
}) async {
103-
final String url = removeTrailingSlash(serverUrl);
60+
if (!sdk.parseIsWeb && (appName == null || appVersion == null || appPackageName == null)) {
61+
final PackageInfo packageInfo = await PackageInfo.fromPlatform();
62+
appName ??= packageInfo.appName;
63+
appVersion ??= packageInfo.version;
64+
appPackageName ??= packageInfo.packageName;
65+
}
10466

105-
await ParseCoreData.init(
67+
return await super.initialize(
10668
appId,
107-
url,
69+
serverUrl,
10870
debug: debug,
10971
appName: appName,
72+
appVersion: appVersion,
73+
appPackageName: appPackageName,
74+
locale: locale ?? sdk.parseIsWeb
75+
? ui.window.locale.toString()
76+
: Platform.localeName,
11077
liveQueryUrl: liveQueryUrl,
111-
masterKey: masterKey,
11278
clientKey: clientKey,
79+
masterKey: masterKey,
11380
sessionId: sessionId,
11481
autoSendSessionId: autoSendSessionId,
11582
securityContext: securityContext,
116-
store: coreStore,
83+
coreStore: coreStore ??
84+
await CoreStoreSharedPrefsImp.getInstance(password: masterKey),
11785
registeredSubClassMap: registeredSubClassMap,
11886
parseUserConstructor: parseUserConstructor,
11987
parseFileConstructor: parseFileConstructor,
120-
liveListRetryIntervals: liveListRetryIntervals,
88+
connectivityProvider: connectivityProvider ?? this,
89+
fileDirectory: fileDirectory ?? (await getTemporaryDirectory()).path,
90+
appResumedStream: appResumedStream ?? _appResumedStreamController.stream,
12191
);
92+
}
12293

123-
_hasBeenInitialized = true;
94+
final StreamController<void> _appResumedStreamController =
95+
StreamController<void>();
96+
97+
@override
98+
Future<sdk.ParseConnectivityResult> checkConnectivity() async {
99+
//Connectivity works differently on web
100+
if (!sdk.parseIsWeb) {
101+
switch (await Connectivity().checkConnectivity()) {
102+
case ConnectivityResult.wifi:
103+
return sdk.ParseConnectivityResult.wifi;
104+
case ConnectivityResult.mobile:
105+
return sdk.ParseConnectivityResult.mobile;
106+
case ConnectivityResult.none:
107+
return sdk.ParseConnectivityResult.none;
108+
}
109+
}
110+
return sdk.ParseConnectivityResult.wifi;
111+
}
124112

125-
return this;
113+
@override
114+
Stream<sdk.ParseConnectivityResult> get connectivityStream {
115+
return Connectivity().onConnectivityChanged.map((ConnectivityResult event) {
116+
switch (event) {
117+
case ConnectivityResult.wifi:
118+
return sdk.ParseConnectivityResult.wifi;
119+
case ConnectivityResult.mobile:
120+
return sdk.ParseConnectivityResult.mobile;
121+
default:
122+
return sdk.ParseConnectivityResult.none;
123+
}
124+
});
126125
}
127126

128-
bool hasParseBeenInitialized() => _hasBeenInitialized;
127+
@override
128+
void didChangeAppLifecycleState(AppLifecycleState state) {
129+
_appResumedStreamController.sink.add(null);
130+
}
131+
}
129132

130-
Future<ParseResponse> healthCheck(
131-
{bool debug, ParseHTTPClient client, bool sendSessionIdByDefault}) async {
132-
ParseResponse parseResponse;
133+
class CoreStoreSembastImp implements sdk.CoreStoreSembastImp {
134+
CoreStoreSembastImp._();
135+
136+
static sdk.CoreStoreSembastImp _sembastImp;
137+
138+
static Future<sdk.CoreStore> getInstance(String dbPath,
139+
{DatabaseFactory factory, String password}) async {
140+
if (_sembastImp == null) {
141+
String dbDirectory = '';
142+
if (!sdk.parseIsWeb &&
143+
(Platform.isIOS || Platform.isAndroid || Platform.isMacOS))
144+
dbDirectory = (await getApplicationDocumentsDirectory()).path;
145+
final String dbPath = path.join('$dbDirectory/parse', 'parse.db');
146+
_sembastImp ??= await sdk.CoreStoreSembastImp.getInstance(dbPath,
147+
factory: factory, password: password);
148+
}
149+
return CoreStoreSembastImp._();
150+
}
133151

134-
final bool _debug = isDebugEnabled(objectLevelDebug: debug);
152+
@override
153+
Future<bool> clear() => _sembastImp.clear();
135154

136-
final ParseHTTPClient _client = client ??
137-
ParseHTTPClient(
138-
sendSessionId:
139-
sendSessionIdByDefault ?? ParseCoreData().autoSendSessionId,
140-
securityContext: ParseCoreData().securityContext);
155+
@override
156+
Future<bool> containsKey(String key) => _sembastImp.containsKey(key);
141157

142-
const String className = 'parseBase';
143-
const ParseApiRQ type = ParseApiRQ.healthCheck;
158+
@override
159+
Future<dynamic> get(String key) => _sembastImp.get(key);
144160

145-
try {
146-
final Response response =
147-
await _client.get('${ParseCoreData().serverUrl}$keyEndPointHealth');
148-
parseResponse =
149-
handleResponse<Parse>(null, response, type, _debug, className);
150-
} on Exception catch (e) {
151-
parseResponse = handleException(e, type, _debug, className);
152-
}
161+
@override
162+
Future<bool> getBool(String key) => _sembastImp.getBool(key);
153163

154-
return parseResponse;
155-
}
164+
@override
165+
Future<double> getDouble(String key) => _sembastImp.getDouble(key);
166+
167+
@override
168+
Future<int> getInt(String key) => _sembastImp.getInt(key);
169+
170+
@override
171+
Future<String> getString(String key) => _sembastImp.getString(key);
172+
173+
@override
174+
Future<List<String>> getStringList(String key) =>
175+
_sembastImp.getStringList(key);
176+
177+
@override
178+
Future<void> remove(String key) => _sembastImp.remove(key);
179+
180+
@override
181+
Future<void> setBool(String key, bool value) =>
182+
_sembastImp.setBool(key, value);
183+
184+
@override
185+
Future<void> setDouble(String key, double value) =>
186+
_sembastImp.setDouble(key, value);
187+
188+
@override
189+
Future<void> setInt(String key, int value) => _sembastImp.setInt(key, value);
190+
191+
@override
192+
Future<void> setString(String key, String value) =>
193+
_sembastImp.setString(key, value);
194+
195+
@override
196+
Future<void> setStringList(String key, List<String> values) =>
197+
_sembastImp.setStringList(key, values);
156198
}

0 commit comments

Comments
 (0)