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";2930export async function getSyncSettings(): Promise<SyncSettings> {31 try {32 const values = (await chrome.storage.local.get([33 RELAY_URL_KEY,34 SYNC_MODE_KEY,35 ])) as Record<string, unknown>;3637 const storedUrl =38 typeof values[RELAY_URL_KEY] === "string"39 ? safeNormalize(values[RELAY_URL_KEY] as string)40 : DEFAULT_RELAY_URL;4142 const stored = values[SYNC_MODE_KEY];43 if (stored === "public" || stored === "private" || stored === "off") {44 return { mode: stored, relayUrl: relayFor(stored, storedUrl) };45 }4647 48 49 50 const mode: SyncMode =51 storedUrl === DEFAULT_RELAY_URL ? "public" : "private";52 return { mode, relayUrl: relayFor(mode, storedUrl) };53 } catch {54 return { mode: "public", relayUrl: DEFAULT_RELAY_URL };55 }56}5758596061626364export function isPrivateRelayUnconfigured(settings: SyncSettings): boolean {65 return settings.mode === "private" && settings.relayUrl === DEFAULT_RELAY_URL;66}67686970717273export function relayInForce(settings: SyncSettings): string {74 if (settings.mode === "off") throw new Error("sync_disabled");75 if (isPrivateRelayUnconfigured(settings)) throw new Error("private_relay_unset");76 return settings.relayUrl;77}7879export async function setSyncMode(mode: SyncMode): Promise<SyncSettings> {80 const current = await getSyncSettings();81 const next: SyncSettings = { mode, relayUrl: relayFor(mode, current.relayUrl) };82 83 84 85 86 if (mode !== "off" && !isPrivateRelayUnconfigured(next)) {87 await setRelayUrlForAllPairedDevices(next.relayUrl);88 }89 await chrome.storage.local.set({ [SYNC_MODE_KEY]: mode, [RELAY_URL_KEY]: next.relayUrl });90 return next;91}9293949596979899100export async function setRelayUrl(input: string): Promise<SyncSettings> {101 const relayUrl = normalizeRelayUrl(input);102 const mode: SyncMode = relayUrl === DEFAULT_RELAY_URL ? "public" : "private";103 await setRelayUrlForAllPairedDevices(relayUrl);104 await chrome.storage.local.set({ [RELAY_URL_KEY]: relayUrl, [SYNC_MODE_KEY]: mode });105 return { mode, relayUrl };106}107108function relayFor(mode: SyncMode, configured: string): string {109 return mode === "public" ? DEFAULT_RELAY_URL : configured;110}111112function safeNormalize(input: string): string {113 try {114 return normalizeRelayUrl(input);115 } catch {116 return DEFAULT_RELAY_URL;117 }118}