Skip to content
← Public packages

@kody/browser-run

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

src/sessions/get.ts

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

const getInput = object(
	{
		accountId: string(),
		sessionId: string(),
		apiTokenSecret: optional(string()),
		dryRun: optional(boolean()),
	},
	{ unknownKeys: 'error' },
)

/**
 * Get details for one Browser Run session
 * (`GET .../devtools/session/{sessionId}`).
 *
 * @param raw.accountId - Cloudflare account id
 * @param raw.sessionId - Session UUID
 * @param raw.dryRun - Preview only
 * @param raw.apiTokenSecret - Optional alternate secret name
 * @returns Session detail object
 *
 * @example
 * import getSession from 'kody:@kody/browser-run/sessions/get'
 * const session = await getSession({
 *   accountId: 'YOUR_ACCOUNT_ID',
 *   sessionId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
 * })
 */
export default async function getSession(raw: unknown = {}) {
	const input = parse(getInput, raw ?? {})
	const auth = pickAuth(input)
	const accountId = requireAccountId(auth)
	const sessionId = String(input.sessionId).trim()
	if (!sessionId) throw new Error('sessionId is required.')
	const path = accountPath(
		accountId,
		`/browser-rendering/devtools/session/${encodeURIComponent(sessionId)}`,
	)

	if (input.dryRun === true) {
		return {
			dryRun: true as const,
			method: 'GET' as const,
			path,
			accountId,
			sessionId,
		}
	}

	const response = await browserRunFetch(path, { ...auth, method: 'GET' })
	return {
		ok: true,
		accountId,
		sessionId,
		session: response.kind === 'json' ? response.result : response,
		browserMsUsed: response.browserMsUsed,
	}
}