mirror of
https://github.com/moltbot/moltbot.git
synced 2026-03-08 06:54:24 +00:00
279 lines
7.6 KiB
TypeScript
279 lines
7.6 KiB
TypeScript
import type { BrowserActionOk, BrowserActionTargetOk } from "./client-actions-types.js";
|
|
import { buildProfileQuery, withBaseUrl } from "./client-actions-url.js";
|
|
import { fetchBrowserJson } from "./client-fetch.js";
|
|
|
|
type TargetedProfileOptions = {
|
|
targetId?: string;
|
|
profile?: string;
|
|
};
|
|
|
|
type HttpCredentialsOptions = TargetedProfileOptions & {
|
|
username?: string;
|
|
password?: string;
|
|
clear?: boolean;
|
|
};
|
|
|
|
type GeolocationOptions = TargetedProfileOptions & {
|
|
latitude?: number;
|
|
longitude?: number;
|
|
accuracy?: number;
|
|
origin?: string;
|
|
clear?: boolean;
|
|
};
|
|
|
|
function buildStateQuery(params: { targetId?: string; key?: string; profile?: string }): string {
|
|
const query = new URLSearchParams();
|
|
if (params.targetId) {
|
|
query.set("targetId", params.targetId);
|
|
}
|
|
if (params.key) {
|
|
query.set("key", params.key);
|
|
}
|
|
if (params.profile) {
|
|
query.set("profile", params.profile);
|
|
}
|
|
const suffix = query.toString();
|
|
return suffix ? `?${suffix}` : "";
|
|
}
|
|
|
|
async function postProfileJson<T>(
|
|
baseUrl: string | undefined,
|
|
params: { path: string; profile?: string; body: unknown },
|
|
): Promise<T> {
|
|
const query = buildProfileQuery(params.profile);
|
|
return await fetchBrowserJson<T>(withBaseUrl(baseUrl, `${params.path}${query}`), {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(params.body),
|
|
timeoutMs: 20000,
|
|
});
|
|
}
|
|
|
|
async function postTargetedProfileJson(
|
|
baseUrl: string | undefined,
|
|
params: {
|
|
path: string;
|
|
opts: { targetId?: string; profile?: string };
|
|
body: Record<string, unknown>;
|
|
},
|
|
): Promise<BrowserActionTargetOk> {
|
|
return await postProfileJson<BrowserActionTargetOk>(baseUrl, {
|
|
path: params.path,
|
|
profile: params.opts.profile,
|
|
body: {
|
|
targetId: params.opts.targetId,
|
|
...params.body,
|
|
},
|
|
});
|
|
}
|
|
|
|
export async function browserCookies(
|
|
baseUrl: string | undefined,
|
|
opts: { targetId?: string; profile?: string } = {},
|
|
): Promise<{ ok: true; targetId: string; cookies: unknown[] }> {
|
|
const suffix = buildStateQuery({ targetId: opts.targetId, profile: opts.profile });
|
|
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> {
|
|
return await postProfileJson<BrowserActionTargetOk>(baseUrl, {
|
|
path: "/cookies/set",
|
|
profile: opts.profile,
|
|
body: { targetId: opts.targetId, cookie: opts.cookie },
|
|
});
|
|
}
|
|
|
|
export async function browserCookiesClear(
|
|
baseUrl: string | undefined,
|
|
opts: { targetId?: string; profile?: string } = {},
|
|
): Promise<BrowserActionTargetOk> {
|
|
return await postProfileJson<BrowserActionTargetOk>(baseUrl, {
|
|
path: "/cookies/clear",
|
|
profile: opts.profile,
|
|
body: { targetId: opts.targetId },
|
|
});
|
|
}
|
|
|
|
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 suffix = buildStateQuery({ targetId: opts.targetId, key: opts.key, profile: opts.profile });
|
|
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> {
|
|
return await postProfileJson<BrowserActionTargetOk>(baseUrl, {
|
|
path: `/storage/${opts.kind}/set`,
|
|
profile: opts.profile,
|
|
body: {
|
|
targetId: opts.targetId,
|
|
key: opts.key,
|
|
value: opts.value,
|
|
},
|
|
});
|
|
}
|
|
|
|
export async function browserStorageClear(
|
|
baseUrl: string | undefined,
|
|
opts: { kind: "local" | "session"; targetId?: string; profile?: string },
|
|
): Promise<BrowserActionTargetOk> {
|
|
return await postProfileJson<BrowserActionTargetOk>(baseUrl, {
|
|
path: `/storage/${opts.kind}/clear`,
|
|
profile: opts.profile,
|
|
body: { targetId: opts.targetId },
|
|
});
|
|
}
|
|
|
|
export async function browserSetOffline(
|
|
baseUrl: string | undefined,
|
|
opts: { offline: boolean; targetId?: string; profile?: string },
|
|
): Promise<BrowserActionTargetOk> {
|
|
return await postProfileJson<BrowserActionTargetOk>(baseUrl, {
|
|
path: "/set/offline",
|
|
profile: opts.profile,
|
|
body: { targetId: opts.targetId, offline: opts.offline },
|
|
});
|
|
}
|
|
|
|
export async function browserSetHeaders(
|
|
baseUrl: string | undefined,
|
|
opts: {
|
|
headers: Record<string, string>;
|
|
targetId?: string;
|
|
profile?: string;
|
|
},
|
|
): Promise<BrowserActionTargetOk> {
|
|
return await postProfileJson<BrowserActionTargetOk>(baseUrl, {
|
|
path: "/set/headers",
|
|
profile: opts.profile,
|
|
body: { targetId: opts.targetId, headers: opts.headers },
|
|
});
|
|
}
|
|
|
|
export async function browserSetHttpCredentials(
|
|
baseUrl: string | undefined,
|
|
opts: HttpCredentialsOptions = {},
|
|
): Promise<BrowserActionTargetOk> {
|
|
return await postTargetedProfileJson(baseUrl, {
|
|
path: "/set/credentials",
|
|
opts,
|
|
body: {
|
|
username: opts.username,
|
|
password: opts.password,
|
|
clear: opts.clear,
|
|
},
|
|
});
|
|
}
|
|
|
|
export async function browserSetGeolocation(
|
|
baseUrl: string | undefined,
|
|
opts: GeolocationOptions = {},
|
|
): Promise<BrowserActionTargetOk> {
|
|
return await postTargetedProfileJson(baseUrl, {
|
|
path: "/set/geolocation",
|
|
opts,
|
|
body: {
|
|
latitude: opts.latitude,
|
|
longitude: opts.longitude,
|
|
accuracy: opts.accuracy,
|
|
origin: opts.origin,
|
|
clear: opts.clear,
|
|
},
|
|
});
|
|
}
|
|
|
|
export async function browserSetMedia(
|
|
baseUrl: string | undefined,
|
|
opts: {
|
|
colorScheme: "dark" | "light" | "no-preference" | "none";
|
|
targetId?: string;
|
|
profile?: string;
|
|
},
|
|
): Promise<BrowserActionTargetOk> {
|
|
return await postProfileJson<BrowserActionTargetOk>(baseUrl, {
|
|
path: "/set/media",
|
|
profile: opts.profile,
|
|
body: {
|
|
targetId: opts.targetId,
|
|
colorScheme: opts.colorScheme,
|
|
},
|
|
});
|
|
}
|
|
|
|
export async function browserSetTimezone(
|
|
baseUrl: string | undefined,
|
|
opts: { timezoneId: string; targetId?: string; profile?: string },
|
|
): Promise<BrowserActionTargetOk> {
|
|
return await postProfileJson<BrowserActionTargetOk>(baseUrl, {
|
|
path: "/set/timezone",
|
|
profile: opts.profile,
|
|
body: {
|
|
targetId: opts.targetId,
|
|
timezoneId: opts.timezoneId,
|
|
},
|
|
});
|
|
}
|
|
|
|
export async function browserSetLocale(
|
|
baseUrl: string | undefined,
|
|
opts: { locale: string; targetId?: string; profile?: string },
|
|
): Promise<BrowserActionTargetOk> {
|
|
return await postProfileJson<BrowserActionTargetOk>(baseUrl, {
|
|
path: "/set/locale",
|
|
profile: opts.profile,
|
|
body: { targetId: opts.targetId, locale: opts.locale },
|
|
});
|
|
}
|
|
|
|
export async function browserSetDevice(
|
|
baseUrl: string | undefined,
|
|
opts: { name: string; targetId?: string; profile?: string },
|
|
): Promise<BrowserActionTargetOk> {
|
|
return await postProfileJson<BrowserActionTargetOk>(baseUrl, {
|
|
path: "/set/device",
|
|
profile: opts.profile,
|
|
body: { targetId: opts.targetId, name: opts.name },
|
|
});
|
|
}
|
|
|
|
export async function browserClearPermissions(
|
|
baseUrl: string | undefined,
|
|
opts: { targetId?: string; profile?: string } = {},
|
|
): Promise<BrowserActionOk> {
|
|
return await postProfileJson<BrowserActionOk>(baseUrl, {
|
|
path: "/set/geolocation",
|
|
profile: opts.profile,
|
|
body: { targetId: opts.targetId, clear: true },
|
|
});
|
|
}
|