2023-03-17 21:06:01 +01:00
|
|
|
import 'package:localstore/localstore.dart';
|
|
|
|
import 'package:http/http.dart' as http;
|
|
|
|
import 'dart:convert';
|
|
|
|
|
2023-03-18 20:24:48 +01:00
|
|
|
import 'package:outbag_app/main.dart';
|
|
|
|
|
2023-03-17 21:06:01 +01:00
|
|
|
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(
|
2023-03-18 20:24:48 +01:00
|
|
|
{required this.host,
|
2023-03-17 21:06:01 +01:00
|
|
|
required this.port,
|
|
|
|
required this.path,
|
|
|
|
required this.tag});
|
|
|
|
|
|
|
|
String get base {
|
|
|
|
return Uri(
|
|
|
|
host: host,
|
|
|
|
port: port,
|
|
|
|
path: path,
|
|
|
|
scheme: 'https',
|
|
|
|
).toString();
|
|
|
|
}
|
|
|
|
|
2023-03-18 20:24:48 +01:00
|
|
|
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 {
|
2023-03-17 21:06:01 +01:00
|
|
|
final db = Localstore.instance;
|
2023-03-18 20:24:48 +01:00
|
|
|
await db.collection('meta').doc('server').set(toMap());
|
2023-03-17 21:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static Future<OutbagServer> fromDisk() async {
|
|
|
|
final db = Localstore.instance;
|
|
|
|
final data = await db.collection('meta').doc('server').get();
|
|
|
|
|
2023-03-18 20:24:48 +01:00
|
|
|
return OutbagServer.fromMap(data!);
|
2023-03-17 21:06:01 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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(
|
2023-03-18 20:24:48 +01:00
|
|
|
host: rootUri.host,
|
|
|
|
port: uri.port,
|
|
|
|
path: uri.path,
|
|
|
|
tag: onRoot ? rootUri.host : '${rootUri.host}:${uri.port}');
|
2023-03-17 21:06:01 +01:00
|
|
|
} catch (_) {
|
|
|
|
if (onRoot) {
|
|
|
|
final uri = await fetchWellKnown(rootUri.host, defaultPort);
|
|
|
|
return OutbagServer(
|
2023-03-18 20:24:48 +01:00
|
|
|
host: rootUri.host,
|
|
|
|
port: uri.port,
|
|
|
|
path: uri.path,
|
|
|
|
tag: onRoot ? rootUri.host : '${rootUri.host}:${uri.port}');
|
2023-03-17 21:06:01 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
throw Error();
|
|
|
|
}
|