mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-23 10:45:33 -04:00
35 lines
1.2 KiB
TypeScript
35 lines
1.2 KiB
TypeScript
import { Context } from "effect"
|
|
|
|
const opencodeOrigin = /^https:\/\/([a-z0-9-]+\.)*opencode\.ai$/
|
|
|
|
export type CorsOptions = { readonly cors?: ReadonlyArray<string> }
|
|
|
|
export const CorsConfig = Context.Reference<CorsOptions | undefined>("@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
|
|
}
|
|
}
|