import type { BrowserActionOk, BrowserActionTargetOk } from "./client-actions-types.js"; import { fetchBrowserJson } from "./client-fetch.js"; function buildProfileQuery(profile?: string): string { return profile ? `?profile=${encodeURIComponent(profile)}` : ""; } function withBaseUrl(baseUrl: string | undefined, path: string): string { const trimmed = baseUrl?.trim(); if (!trimmed) { return path; } return `${trimmed.replace(/\/$/, "")}${path}`; } export async function browserCookies( baseUrl: string | undefined, opts: { targetId?: string; profile?: string } = {}, ): Promise<{ ok: true; targetId: string; cookies: unknown[] }> { const q = new URLSearchParams(); if (opts.targetId) { q.set("targetId", opts.targetId); } if (opts.profile) { q.set("profile", opts.profile); } const suffix = q.toString() ? `?${q.toString()}` : ""; return await fetchBrowserJson<{ ok: true; targetId: string; cookies: unknown[]; }>(withBaseUrl(baseUrl, `/cookies${suffix}`), { timeoutMs: 20000 }); } export async function browserCookiesSet( baseUrl: string | undefined, opts: { cookie: Record; targetId?: string; profile?: string; }, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson(withBaseUrl(baseUrl, `/cookies/set${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId, cookie: opts.cookie }), timeoutMs: 20000, }); } export async function browserCookiesClear( baseUrl: string | undefined, opts: { targetId?: string; profile?: string } = {}, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson(withBaseUrl(baseUrl, `/cookies/clear${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId }), timeoutMs: 20000, }); } export async function browserStorageGet( baseUrl: string | undefined, opts: { kind: "local" | "session"; key?: string; targetId?: string; profile?: string; }, ): Promise<{ ok: true; targetId: string; values: Record }> { const q = new URLSearchParams(); if (opts.targetId) { q.set("targetId", opts.targetId); } if (opts.key) { q.set("key", opts.key); } if (opts.profile) { q.set("profile", opts.profile); } const suffix = q.toString() ? `?${q.toString()}` : ""; return await fetchBrowserJson<{ ok: true; targetId: string; values: Record; }>(withBaseUrl(baseUrl, `/storage/${opts.kind}${suffix}`), { timeoutMs: 20000 }); } export async function browserStorageSet( baseUrl: string | undefined, opts: { kind: "local" | "session"; key: string; value: string; targetId?: string; profile?: string; }, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson( withBaseUrl(baseUrl, `/storage/${opts.kind}/set${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId, key: opts.key, value: opts.value, }), timeoutMs: 20000, }, ); } export async function browserStorageClear( baseUrl: string | undefined, opts: { kind: "local" | "session"; targetId?: string; profile?: string }, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson( withBaseUrl(baseUrl, `/storage/${opts.kind}/clear${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId }), timeoutMs: 20000, }, ); } export async function browserSetOffline( baseUrl: string | undefined, opts: { offline: boolean; targetId?: string; profile?: string }, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson(withBaseUrl(baseUrl, `/set/offline${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId, offline: opts.offline }), timeoutMs: 20000, }); } export async function browserSetHeaders( baseUrl: string | undefined, opts: { headers: Record; targetId?: string; profile?: string; }, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson(withBaseUrl(baseUrl, `/set/headers${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId, headers: opts.headers }), timeoutMs: 20000, }); } export async function browserSetHttpCredentials( baseUrl: string | undefined, opts: { username?: string; password?: string; clear?: boolean; targetId?: string; profile?: string; } = {}, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson( withBaseUrl(baseUrl, `/set/credentials${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId, username: opts.username, password: opts.password, clear: opts.clear, }), timeoutMs: 20000, }, ); } export async function browserSetGeolocation( baseUrl: string | undefined, opts: { latitude?: number; longitude?: number; accuracy?: number; origin?: string; clear?: boolean; targetId?: string; profile?: string; } = {}, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson( withBaseUrl(baseUrl, `/set/geolocation${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId, latitude: opts.latitude, longitude: opts.longitude, accuracy: opts.accuracy, origin: opts.origin, clear: opts.clear, }), timeoutMs: 20000, }, ); } export async function browserSetMedia( baseUrl: string | undefined, opts: { colorScheme: "dark" | "light" | "no-preference" | "none"; targetId?: string; profile?: string; }, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson(withBaseUrl(baseUrl, `/set/media${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId, colorScheme: opts.colorScheme, }), timeoutMs: 20000, }); } export async function browserSetTimezone( baseUrl: string | undefined, opts: { timezoneId: string; targetId?: string; profile?: string }, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson(withBaseUrl(baseUrl, `/set/timezone${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId, timezoneId: opts.timezoneId, }), timeoutMs: 20000, }); } export async function browserSetLocale( baseUrl: string | undefined, opts: { locale: string; targetId?: string; profile?: string }, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson(withBaseUrl(baseUrl, `/set/locale${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId, locale: opts.locale }), timeoutMs: 20000, }); } export async function browserSetDevice( baseUrl: string | undefined, opts: { name: string; targetId?: string; profile?: string }, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson(withBaseUrl(baseUrl, `/set/device${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId, name: opts.name }), timeoutMs: 20000, }); } export async function browserClearPermissions( baseUrl: string | undefined, opts: { targetId?: string; profile?: string } = {}, ): Promise { const q = buildProfileQuery(opts.profile); return await fetchBrowserJson(withBaseUrl(baseUrl, `/set/geolocation${q}`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetId: opts.targetId, clear: true }), timeoutMs: 20000, }); }