actions-test/lib/backend/resolve_url.dart
Jakob Meier 1af8d6f068
Migrated from localstore to shared preferences
(only for user, server and theme)

This was done, because localstore is somewhat inconsistent
in terms of events on different platforms.
Also storing user, server and theme using shared-preferences
should fit into flutters ecosystem a little better
2023-03-29 18:27:05 +02:00

104 lines
2.8 KiB
Dart

import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
const String wellKnownPath = "/.well-known/outbag/server";
const int defaultPort = 7223;
Future<Uri> fetchWellKnown(String host, int port) async {
Uri uri = Uri(path: wellKnownPath, host: host, port: port, scheme: "https");
final resp = await http.get(uri);
final json = jsonDecode(resp.body);
return Uri(host: host, path: json['path'], port: json['port']);
}
class OutbagServer {
final String host;
final int port;
final String path;
final String tag;
const OutbagServer(
{required this.host,
required this.port,
required this.path,
required this.tag});
String get base {
return Uri(
host: host,
port: port,
path: path,
scheme: 'https',
).toString();
}
factory OutbagServer.fromMap(Map<String, dynamic> data) {
return OutbagServer(
tag: data['tag'],
host: data['host'],
path: data['path'],
port: data['port']);
}
Map<String, dynamic> toMap() {
return {'host': host, 'port': port, 'path': path, 'tag': tag};
}
Future<void> toDisk() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setString('server-host', host);
await prefs.setInt('server-port', port);
await prefs.setString('server-path', path);
await prefs.setString('server-tag', tag);
}
static Future<OutbagServer> fromDisk() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return OutbagServer(
path: prefs.getString('server-path')!,
port: prefs.getInt('server-port')!,
tag: prefs.getString('server-tag')!,
host: prefs.getString('server-host')!
);
}
static Future<void> removeDisk() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.remove('server-host');
await prefs.remove('server-port');
await prefs.remove('server-path');
await prefs.remove('server-tag');
}
}
Future<OutbagServer> getOutbagServerUrl(String tag) async {
final rootUri = Uri.parse(tag.startsWith('https://') ? tag : 'https://$tag');
bool onRoot = rootUri.port == 443;
try {
final uri = await fetchWellKnown(rootUri.host, rootUri.port);
return OutbagServer(
host: rootUri.host,
port: uri.port,
path: uri.path,
tag: onRoot ? rootUri.host : '${rootUri.host}:${uri.port}');
} catch (_) {
if (onRoot) {
final uri = await fetchWellKnown(rootUri.host, defaultPort);
return OutbagServer(
host: rootUri.host,
port: uri.port,
path: uri.path,
tag: onRoot ? rootUri.host : '${rootUri.host}:${uri.port}');
}
}
throw Error();
}