Spaces:
Paused
Paused
| 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<string, unknown>; | |
| targetId?: string; | |
| profile?: string; | |
| }, | |
| ): Promise<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>(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<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>(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<string, string> }> { | |
| 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<string, string>; | |
| }>(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<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>( | |
| 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<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>( | |
| 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<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>(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<string, string>; | |
| targetId?: string; | |
| profile?: string; | |
| }, | |
| ): Promise<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>(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<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>( | |
| 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<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>( | |
| 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<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>(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<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>(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<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>(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<BrowserActionTargetOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionTargetOk>(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<BrowserActionOk> { | |
| const q = buildProfileQuery(opts.profile); | |
| return await fetchBrowserJson<BrowserActionOk>(withBaseUrl(baseUrl, `/set/geolocation${q}`), { | |
| method: "POST", | |
| headers: { "Content-Type": "application/json" }, | |
| body: JSON.stringify({ targetId: opts.targetId, clear: true }), | |
| timeoutMs: 20000, | |
| }); | |
| } | |