Invite links: starsync:// opens the app and asks to join; one app per profile; real invite address; clipboard pick-up
- starsync://host:port/?name=&pw= (PROTOCOL.md "Invite link"); the password only when ticked, never in logs - Linux: launcher entry takes x-scheme-handler/starsync (%u, StartupNotify) and becomes its xdg-mime default; Windows: HKCU\Software\Classes\starsync -> starsync.exe - InstanceLock: lock file + loopback handoff per profile folder; the running app comes up with the second start's activation token (Wayland/X11) or AllowSetForegroundWindow (Windows) - Sharing looks up the internet address (HTTPS services with fallbacks); members card picks Internet / Home network / VPN and says when the port needs forwarding - JoinOffers: link and clipboard prompt with /health, joins through ConnectFlow; dismissed clipboard invites kept as fingerprints Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d48915dc47
commit
6048fbe7d1
35 files changed
+1943
-181
No files matched your search
@@ -12,6 +12,7 @@ import '../schedule/animeflow.dart';
|
||||
import '../screens/home/health_probe.dart';
|
||||
import '../session/connection.dart' show Connection;
|
||||
import '../session/identity.dart' show ClientIdentity, Profile;
|
||||
import '../session/join_offers.dart';
|
||||
import '../session/navigation.dart';
|
||||
import '../session/notifier.dart';
|
||||
import '../session/session_coordinator.dart';
|
||||
@@ -65,6 +66,9 @@ class AppGraph {
|
||||
/// What's new once after an update; keeps the notes the updater saves.
|
||||
final WhatsNew whatsNew;
|
||||
|
||||
/// The join prompt for a clicked invite link or one on the clipboard.
|
||||
final JoinOffers joinOffers;
|
||||
|
||||
AppGraph._({
|
||||
required this.ports,
|
||||
required this.sfx,
|
||||
@@ -78,10 +82,12 @@ class AppGraph {
|
||||
required this.watch,
|
||||
required this.updates,
|
||||
required this.whatsNew,
|
||||
required this.joinOffers,
|
||||
});
|
||||
|
||||
/// The desktop app's graph. Tests pass their own [ports], [identity]
|
||||
/// (default: the install's stored one), [healthGet] and server starter.
|
||||
/// (default: the install's stored one), [healthGet], server starter and
|
||||
/// internet address lookup ([publicAddress]).
|
||||
factory AppGraph.build({
|
||||
Ports? ports,
|
||||
ClientIdentity? identity,
|
||||
@@ -90,6 +96,7 @@ class AppGraph {
|
||||
JellyfinAccounts? jellyfin,
|
||||
ShowMatcher? library,
|
||||
WatchHistory? history,
|
||||
Future<String?> Function()? publicAddress,
|
||||
}) {
|
||||
final p = ports ?? desktopPorts();
|
||||
final settings = AppSettings.instance;
|
||||
@@ -142,6 +149,7 @@ class AppGraph {
|
||||
},
|
||||
logDir: () => appLogDir,
|
||||
starter: serverStarter,
|
||||
publicAddress: publicAddress,
|
||||
);
|
||||
final navigation = Navigation(
|
||||
coordinator: coordinator,
|
||||
@@ -172,6 +180,7 @@ class AppGraph {
|
||||
watch: watch,
|
||||
updates: updates,
|
||||
whatsNew: whatsNew,
|
||||
joinOffers: JoinOffers(navigation: navigation, yourServer: yourServer, forms: forms),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user