| 12345678910111213141516171819202122232425262728293031323334 |
- 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>("@kirincode/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
- }
- }
|