Experiment with serving shared preferences over grpc

The idea is that for GitJournal's web version, we can have it talking
with the mobile version which runs a grpc server. All of the git + fs
logic will still run in the mobile and the web version will only have
the UI.
This commit is contained in:
Vishesh Handa
2021-07-29 14:33:00 +02:00
parent a7869612b3
commit ad76dabcfb
8 changed files with 1348 additions and 0 deletions

View File

@ -0,0 +1,96 @@
import 'package:fixnum/fixnum.dart';
import 'package:grpc/grpc.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:gitjournal/generated/shared_preferences.pb.dart';
import 'package:gitjournal/generated/shared_preferences.pbgrpc.dart';
class SharedPreferencesService extends SharedPreferencesServiceBase {
final SharedPreferences pref;
SharedPreferencesService(this.pref);
@override
Future<BoolMessage> containsKey(ServiceCall _, StringMessage message) async {
return BoolMessage()..value = pref.containsKey(message.value);
}
@override
Future<StringListMessage> getKeys(ServiceCall _, EmptyMessage __) async {
return StringListMessage(value: pref.getKeys());
}
@override
Future<OptionalBool> getBool(ServiceCall _, StringMessage key) async {
return OptionalBool(value: pref.getBool(key.value));
}
@override
Future<OptionalInt> getInt(ServiceCall _, StringMessage key) async {
var ret = pref.getInt(key.value);
if (ret != null) {
return OptionalInt(value: Int64(ret));
}
return OptionalInt();
}
@override
Future<OptionalDouble> getDouble(ServiceCall _, StringMessage key) async {
return OptionalDouble(value: pref.getDouble(key.value));
}
@override
Future<OptionalString> getString(ServiceCall _, StringMessage key) async {
return OptionalString(value: pref.getString(key.value));
}
@override
Future<StringListMessage> getStringList(
ServiceCall _, StringMessage key) async {
return StringListMessage(value: pref.getStringList(key.value));
}
@override
Future<BoolMessage> setBool(ServiceCall _, SetBoolRequest req) async {
return BoolMessage(value: await pref.setBool(req.key, req.value));
}
@override
Future<BoolMessage> setInt(ServiceCall _, SetIntRequest req) async {
return BoolMessage(value: await pref.setInt(req.key, req.value.toInt()));
}
@override
Future<BoolMessage> setDouble(ServiceCall _, SetDoubleRequest req) async {
return BoolMessage(value: await pref.setDouble(req.key, req.value));
}
@override
Future<BoolMessage> setString(ServiceCall _, SetStringRequest req) async {
return BoolMessage(value: await pref.setString(req.key, req.value));
}
@override
Future<BoolMessage> setStringList(
ServiceCall _, SetStringListRequest req) async {
return BoolMessage(value: await pref.setStringList(req.key, req.value));
}
@override
Future<BoolMessage> remove(ServiceCall _, StringMessage key) async {
return BoolMessage(value: await pref.remove(key.value));
}
}
Future<void> main(List<String> args) async {
var pref = await SharedPreferences.getInstance();
final server = Server(
[SharedPreferencesService(pref)],
const <Interceptor>[],
CodecRegistry(codecs: const [GzipCodec(), IdentityCodec()]),
);
await server.serve(port: 50051);
print('Server listening on port ${server.port}...');
}
// todo: Create some kind of QR code for getting the URL