1import { DEFAULT_RELAY_URL, normalizeRelayUrl } from "../shared/rendezvous";2import { setRelayUrlForAllPairedDevices } from "./paired-devices";3456789101112131415export type SyncMode = "public" | "private" | "off";1617export interface SyncSettings {18 mode: SyncMode;19 2021222324 relayUrl: string;25}2627const RELAY_URL_KEY = "peach_relay_url_v1";28const SYNC_MODE_KEY = "peach_sync_mode_v1";2930const LEGACY_LAN_ONLY_KEY = "peach_sync_lan_only_v1";3132export async function getSyncSettings(): Promise<SyncSettings> {33 try {34 const values = (await chrome.storage.local.get([35 RELAY_URL_KEY,36 SYNC_MODE_KEY,37 LEGACY_LAN_ONLY_KEY,38 ])) as Record<string, unknown>;3940 const storedUrl =41 typeof values[RELAY_URL_KEY] === "string"42 ? safeNormalize(values[RELAY_URL_KEY] as string)43 : DEFAULT_RELAY_URL;4445 const stored = values[SYNC_MODE_KEY];46 if (stored === "public" || stored === "private" || stored === "off") {47 return { mode: stored, relayUrl: relayFor(stored, storedUrl) };48 }4950 51 52 53 54 const mode: SyncMode =55 values[LEGACY_LAN_ONLY_KEY] === true56 ? "off"57 : storedUrl === DEFAULT_RELAY_URL58 ? "public"59 : "private";60 return { mode, relayUrl: relayFor(mode, storedUrl) };61 } catch {62 return { mode: "public", relayUrl: DEFAULT_RELAY_URL };63 }64}656667export async function isSyncEnabled(): Promise<boolean> {68 return (await getSyncSettings()).mode !== "off";69}7071export async function setSyncMode(mode: SyncMode): Promise<SyncSettings> {72 const current = await getSyncSettings();73 const relayUrl = relayFor(mode, current.relayUrl);74 75 76 if (mode !== "off") await setRelayUrlForAllPairedDevices(relayUrl);77 await chrome.storage.local.set({ [SYNC_MODE_KEY]: mode, [RELAY_URL_KEY]: relayUrl });78 return { mode, relayUrl };79}808182838485export async function setPrivateRelayUrl(input: string): Promise<SyncSettings> {86 const relayUrl = normalizeRelayUrl(input);87 await setRelayUrlForAllPairedDevices(relayUrl);88 await chrome.storage.local.set({89 [RELAY_URL_KEY]: relayUrl,90 [SYNC_MODE_KEY]: "private" satisfies SyncMode,91 });92 return { mode: "private", relayUrl };93}9495function relayFor(mode: SyncMode, configured: string): string {96 return mode === "public" ? DEFAULT_RELAY_URL : configured;97}9899function safeNormalize(input: string): string {100 try {101 return normalizeRelayUrl(input);102 } catch {103 return DEFAULT_RELAY_URL;104 }105}