Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Generate text and images via the reverse-engineered Gemini Web API with multi-turn conversation support.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
scripts/gemini-webapi/utils/cookie-file.ts
1import fs from 'node:fs';2import path from 'node:path';3import { mkdir, readFile, writeFile } from 'node:fs/promises';45import { resolveGeminiWebCookiePath } from './paths.js';67export type CookieMap = Record<string, string>;89export type CookieFileData =10| {11cookies: CookieMap;12updated_at: number;13source?: string;14}15| {16version: number;17updatedAt: string;18cookieMap: CookieMap;19source?: string;20};2122export async function read_cookie_file(p: string = resolveGeminiWebCookiePath()): Promise<CookieMap | null> {23try {24if (!fs.existsSync(p) || !fs.statSync(p).isFile()) return null;25const raw = await readFile(p, 'utf8');26const data = JSON.parse(raw) as unknown;2728if (data && typeof data === 'object' && 'cookies' in (data as any)) {29const cookies = (data as any).cookies as unknown;30if (cookies && typeof cookies === 'object') {31const out: CookieMap = {};32for (const [k, v] of Object.entries(cookies as Record<string, unknown>)) {33if (typeof v === 'string') out[k] = v;34}35return out;36}37}3839if (data && typeof data === 'object' && 'cookieMap' in (data as any)) {40const cookies = (data as any).cookieMap as unknown;41if (cookies && typeof cookies === 'object') {42const out: CookieMap = {};43for (const [k, v] of Object.entries(cookies as Record<string, unknown>)) {44if (typeof v === 'string') out[k] = v;45}46return Object.keys(out).length > 0 ? out : null;47}48}4950if (data && typeof data === 'object') {51const out: CookieMap = {};52for (const [k, v] of Object.entries(data as Record<string, unknown>)) {53if (typeof v === 'string') out[k] = v;54}55return Object.keys(out).length > 0 ? out : null;56}5758return null;59} catch {60return null;61}62}6364export async function write_cookie_file(65cookies: CookieMap,66p: string = resolveGeminiWebCookiePath(),67source?: string,68): Promise<void> {69const dir = path.dirname(p);70await mkdir(dir, { recursive: true });7172const payload: CookieFileData = {73version: 1,74updatedAt: new Date().toISOString(),75cookieMap: cookies,76source,77};78await writeFile(p, JSON.stringify(payload, null, 2), 'utf8');79}8081export const readCookieFile = read_cookie_file;82export const writeCookieFile = write_cookie_file;83