Skip to content
← Public packages

@kody/browser-run

Call Cloudflare Browser Run Quick Actions and reuse shared sessions with createBrowserContext.

src/sessions/list.ts

73 lines · 2.1 KB · TypeScript
import { boolean, number, object, optional, parse, string } from 'remix/data-schema'
import {
	accountPath,
	browserRunFetch,
	pickAuth,
	requireAccountId,
} from '../client.ts'

const listInput = object(
	{
		accountId: string(),
		apiTokenSecret: optional(string()),
		limit: optional(number()),
		offset: optional(number()),
		dryRun: optional(boolean()),
	},
	{ unknownKeys: 'error' },
)

/**
 * List active Cloudflare Browser Run sessions
 * (`GET .../browser-rendering/devtools/session`).
 * Prefer this before launching a new browser; pair with `./open-isolated`.
 *
 * @param raw.accountId - Cloudflare account id
 * @param raw.limit - Optional page limit
 * @param raw.offset - Optional page offset
 * @param raw.dryRun - When true, return the request preview without calling CF
 * @param raw.apiTokenSecret - Optional alternate secret name
 * @returns `{ sessions, count }` or a dry-run preview
 *
 * @example
 * import listSessions from 'kody:@kody/browser-run/sessions/list'
 * const { sessions } = await listSessions({ accountId: 'YOUR_ACCOUNT_ID' })
 */
export default async function listSessions(raw: unknown = {}) {
	const input = parse(listInput, raw ?? {})
	const auth = pickAuth(input)
	const accountId = requireAccountId(auth)
	const path = accountPath(accountId, '/browser-rendering/devtools/session')
	const query: Record<string, number> = {}
	if (input.limit != null) query.limit = input.limit
	if (input.offset != null) query.offset = input.offset

	if (input.dryRun === true) {
		return {
			dryRun: true as const,
			method: 'GET' as const,
			path,
			query,
			accountId,
			note: 'Would list active Browser Run sessions.',
		}
	}

	const response = await browserRunFetch(path, { ...auth, method: 'GET', query })
	const result = response.kind === 'json' ? response.result : null
	const sessions = Array.isArray(result)
		? result
		: Array.isArray((result as { sessions?: unknown })?.sessions)
			? (result as { sessions: unknown[] }).sessions
			: result
				? [result]
				: []

	return {
		ok: true,
		accountId,
		count: sessions.length,
		sessions,
		browserMsUsed: response.browserMsUsed,
	}
}