Skip to content

Seperate the dart and the flutter parts of this sdk #434

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2 changes: 2 additions & 0 deletions example/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ dependencies:
sembast: ^2.0.1
shared_preferences: ^0.5.0

path_provider: ^1.6.14

dev_dependencies:
parse_server_sdk:
path: ../
Expand Down
248 changes: 145 additions & 103 deletions lib/parse_server_sdk.dart
Original file line number Diff line number Diff line change
@@ -1,156 +1,198 @@
library flutter_parse_sdk;

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'dart:typed_data';
import 'dart:ui' as ui;

import 'package:connectivity/connectivity.dart';
import 'package:flutter/widgets.dart';
import 'package:http/http.dart';
import 'package:http/io_client.dart';
import 'package:meta/meta.dart';
import 'package:package_info/package_info.dart';
import 'package:parse_server_sdk/src/network/parse_websocket.dart'
as parse_web_socket;
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';
import 'package:sembast/sembast.dart';
import 'package:sembast/sembast_io.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:uuid/uuid.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:xxtea/xxtea.dart';

export 'src/utils/parse_live_list.dart';

part 'package:parse_server_sdk/src/data/core_store.dart';
part 'package:parse_server_sdk/src/data/parse_subclass_handler.dart';
part 'package:parse_server_sdk/src/objects/response/parse_error_response.dart';
part 'package:parse_server_sdk/src/objects/response/parse_exception_response.dart';
part 'package:parse_server_sdk/src/objects/response/parse_response_builder.dart';
part 'package:parse_server_sdk/src/objects/response/parse_response_utils.dart';
part 'package:parse_server_sdk/src/objects/response/parse_success_no_results.dart';
part 'package:parse_server_sdk/src/storage/core_store_sem_impl.dart';
part 'package:parse_server_sdk/src/storage/core_store_sp_impl.dart';
part 'package:parse_server_sdk/src/storage/xxtea_codec.dart';
part 'src/base/parse_constants.dart';
part 'src/data/parse_core_data.dart';
part 'src/enums/parse_enum_api_rq.dart';
part 'src/network/parse_http_client.dart';
part 'src/network/parse_live_query.dart';
part 'src/network/parse_query.dart';
part 'src/objects/parse_acl.dart';
part 'src/objects/parse_base.dart';
part 'src/objects/parse_cloneable.dart';
part 'src/objects/parse_config.dart';
part 'src/objects/parse_error.dart';
part 'src/objects/parse_file.dart';
part 'src/objects/parse_file_base.dart';
part 'src/objects/parse_file_web.dart';
part 'src/objects/parse_function.dart';
part 'src/objects/parse_geo_point.dart';
part 'src/objects/parse_installation.dart';
part 'src/objects/parse_merge.dart';
part 'src/objects/parse_object.dart';
part 'src/objects/parse_relation.dart';
part 'src/objects/parse_response.dart';
part 'src/objects/parse_session.dart';
part 'src/objects/parse_user.dart';
part 'src/utils/parse_date_format.dart';
part 'src/utils/parse_decoder.dart';
part 'src/utils/parse_encoder.dart';
part 'src/utils/parse_file_extensions.dart';
part 'src/utils/parse_logger.dart';
part 'src/utils/parse_login_helpers.dart';
part 'src/utils/parse_utils.dart';

class Parse {
ParseCoreData data;
bool _hasBeenInitialized = false;

import 'parse_server_sdk_dart.dart' as sdk;
import 'src/storage/core_store_sp_impl.dart';

export 'parse_server_sdk_dart.dart' hide Parse, CoreStoreSembastImp;
export 'src/storage/core_store_sp_impl.dart';
export 'src/utils/parse_live_list_flutter.dart';

class Parse extends sdk.Parse
with WidgetsBindingObserver
implements sdk.ParseConnectivityProvider {
/// To initialize Parse Server in your application
///
/// This should be initialized in MyApp() creation
///
/// ```
/// Parse().initialize(
// "PARSE_APP_ID",
// "https://parse.myaddress.com/parse/,
// masterKey: "asd23rjh234r234r234r",
// debug: true,
// liveQuery: true);
// ```
/// "PARSE_APP_ID",
/// "https://parse.myaddress.com/parse/,
/// masterKey: "asd23rjh234r234r234r",
/// debug: true,
/// liveQuery: true);
/// ```
/// [appName], [appVersion] and [appPackageName] are automatically set on Android and IOS, if they are not defined. You should provide a value on web.
/// [fileDirectory] is not used on web
@override
Future<Parse> initialize(
String appId,
String serverUrl, {
bool debug = false,
String appName = '',
String appName,
String appVersion,
String appPackageName,
String locale,
String liveQueryUrl,
String clientKey,
String masterKey,
String sessionId,
bool autoSendSessionId,
SecurityContext securityContext,
CoreStore coreStore,
Map<String, ParseObjectConstructor> registeredSubClassMap,
ParseUserConstructor parseUserConstructor,
ParseFileConstructor parseFileConstructor,
sdk.CoreStore coreStore,
Map<String, sdk.ParseObjectConstructor> registeredSubClassMap,
sdk.ParseUserConstructor parseUserConstructor,
sdk.ParseFileConstructor parseFileConstructor,
List<int> liveListRetryIntervals,
sdk.ParseConnectivityProvider connectivityProvider,
String fileDirectory,
Stream<void> appResumedStream,
}) async {
final String url = removeTrailingSlash(serverUrl);
if (!sdk.parseIsWeb && (appName == null || appVersion == null || appPackageName == null)) {
final PackageInfo packageInfo = await PackageInfo.fromPlatform();
appName ??= packageInfo.appName;
appVersion ??= packageInfo.version;
appPackageName ??= packageInfo.packageName;
}

await ParseCoreData.init(
return await super.initialize(
appId,
url,
serverUrl,
debug: debug,
appName: appName,
appVersion: appVersion,
appPackageName: appPackageName,
locale: locale ?? sdk.parseIsWeb
? ui.window.locale.toString()
: Platform.localeName,
liveQueryUrl: liveQueryUrl,
masterKey: masterKey,
clientKey: clientKey,
masterKey: masterKey,
sessionId: sessionId,
autoSendSessionId: autoSendSessionId,
securityContext: securityContext,
store: coreStore,
coreStore: coreStore ??
await CoreStoreSharedPrefsImp.getInstance(password: masterKey),
registeredSubClassMap: registeredSubClassMap,
parseUserConstructor: parseUserConstructor,
parseFileConstructor: parseFileConstructor,
liveListRetryIntervals: liveListRetryIntervals,
connectivityProvider: connectivityProvider ?? this,
fileDirectory: fileDirectory ?? (await getTemporaryDirectory()).path,
appResumedStream: appResumedStream ?? _appResumedStreamController.stream,
);
}

_hasBeenInitialized = true;
final StreamController<void> _appResumedStreamController =
StreamController<void>();

@override
Future<sdk.ParseConnectivityResult> checkConnectivity() async {
//Connectivity works differently on web
if (!sdk.parseIsWeb) {
switch (await Connectivity().checkConnectivity()) {
case ConnectivityResult.wifi:
return sdk.ParseConnectivityResult.wifi;
case ConnectivityResult.mobile:
return sdk.ParseConnectivityResult.mobile;
case ConnectivityResult.none:
return sdk.ParseConnectivityResult.none;
}
}
return sdk.ParseConnectivityResult.wifi;
}

return this;
@override
Stream<sdk.ParseConnectivityResult> get connectivityStream {
return Connectivity().onConnectivityChanged.map((ConnectivityResult event) {
switch (event) {
case ConnectivityResult.wifi:
return sdk.ParseConnectivityResult.wifi;
case ConnectivityResult.mobile:
return sdk.ParseConnectivityResult.mobile;
default:
return sdk.ParseConnectivityResult.none;
}
});
}

bool hasParseBeenInitialized() => _hasBeenInitialized;
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
_appResumedStreamController.sink.add(null);
}
}

Future<ParseResponse> healthCheck(
{bool debug, ParseHTTPClient client, bool sendSessionIdByDefault}) async {
ParseResponse parseResponse;
class CoreStoreSembastImp implements sdk.CoreStoreSembastImp {
CoreStoreSembastImp._();

static sdk.CoreStoreSembastImp _sembastImp;

static Future<sdk.CoreStore> getInstance(String dbPath,
{DatabaseFactory factory, String password}) async {
if (_sembastImp == null) {
String dbDirectory = '';
if (!sdk.parseIsWeb &&
(Platform.isIOS || Platform.isAndroid || Platform.isMacOS))
dbDirectory = (await getApplicationDocumentsDirectory()).path;
final String dbPath = path.join('$dbDirectory/parse', 'parse.db');
_sembastImp ??= await sdk.CoreStoreSembastImp.getInstance(dbPath,
factory: factory, password: password);
}
return CoreStoreSembastImp._();
}

final bool _debug = isDebugEnabled(objectLevelDebug: debug);
@override
Future<bool> clear() => _sembastImp.clear();

final ParseHTTPClient _client = client ??
ParseHTTPClient(
sendSessionId:
sendSessionIdByDefault ?? ParseCoreData().autoSendSessionId,
securityContext: ParseCoreData().securityContext);
@override
Future<bool> containsKey(String key) => _sembastImp.containsKey(key);

const String className = 'parseBase';
const ParseApiRQ type = ParseApiRQ.healthCheck;
@override
Future<dynamic> get(String key) => _sembastImp.get(key);

try {
final Response response =
await _client.get('${ParseCoreData().serverUrl}$keyEndPointHealth');
parseResponse =
handleResponse<Parse>(null, response, type, _debug, className);
} on Exception catch (e) {
parseResponse = handleException(e, type, _debug, className);
}
@override
Future<bool> getBool(String key) => _sembastImp.getBool(key);

return parseResponse;
}
@override
Future<double> getDouble(String key) => _sembastImp.getDouble(key);

@override
Future<int> getInt(String key) => _sembastImp.getInt(key);

@override
Future<String> getString(String key) => _sembastImp.getString(key);

@override
Future<List<String>> getStringList(String key) =>
_sembastImp.getStringList(key);

@override
Future<void> remove(String key) => _sembastImp.remove(key);

@override
Future<void> setBool(String key, bool value) =>
_sembastImp.setBool(key, value);

@override
Future<void> setDouble(String key, double value) =>
_sembastImp.setDouble(key, value);

@override
Future<void> setInt(String key, int value) => _sembastImp.setInt(key, value);

@override
Future<void> setString(String key, String value) =>
_sembastImp.setString(key, value);

@override
Future<void> setStringList(String key, List<String> values) =>
_sembastImp.setStringList(key, values);
}
Loading