import { Context } from "effect" const opencodeOrigin = /^https:\/\/([a-z0-9-]+\.)*opencode\.ai$/ export type CorsOptions = { readonly cors?: ReadonlyArray } export const CorsConfig = Context.Reference("@opencode/ServerCorsConfig", { defaultValue: () => undefined, }) export function isAllowedCorsOrigin(input: string | undefined, opts?: CorsOptions) { if (!input) return true if (input.startsWith("http://localhost:")) return true if (input.startsWith("http://127.0.0.1:")) return true if (input.startsWith("oc://renderer")) return true if (input === "tauri://localhost" || input === "http://tauri.localhost" || input === "https://tauri.localhost") return true if (opencodeOrigin.test(input)) return true return opts?.cors?.includes(input) ?? false } export function isAllowedRequestOrigin(input: string | undefined, host: string | undefined, opts?: CorsOptions) { if (!input) return true if (host && sameHost(input, host)) return true return isAllowedCorsOrigin(input, opts) } function sameHost(origin: string, host: string) { try { return new URL(origin).host === host } catch { return false } }