Преглед изворни кода

feat(core): configurable cors hosts

Adam пре 1 месец
родитељ
комит
b1a6333d17

+ 11 - 1
packages/opencode/src/cli/network.ts

@@ -17,6 +17,12 @@ const options = {
     describe: "enable mDNS service discovery (defaults hostname to 0.0.0.0)",
     describe: "enable mDNS service discovery (defaults hostname to 0.0.0.0)",
     default: false,
     default: false,
   },
   },
+  cors: {
+    type: "string" as const,
+    array: true,
+    describe: "additional domains to allow for CORS",
+    default: [] as string[],
+  },
 }
 }
 
 
 export type NetworkOptions = InferredOptionTypes<typeof options>
 export type NetworkOptions = InferredOptionTypes<typeof options>
@@ -30,6 +36,7 @@ export async function resolveNetworkOptions(args: NetworkOptions) {
   const portExplicitlySet = process.argv.includes("--port")
   const portExplicitlySet = process.argv.includes("--port")
   const hostnameExplicitlySet = process.argv.includes("--hostname")
   const hostnameExplicitlySet = process.argv.includes("--hostname")
   const mdnsExplicitlySet = process.argv.includes("--mdns")
   const mdnsExplicitlySet = process.argv.includes("--mdns")
+  const corsExplicitlySet = process.argv.includes("--cors")
 
 
   const mdns = mdnsExplicitlySet ? args.mdns : (config?.server?.mdns ?? args.mdns)
   const mdns = mdnsExplicitlySet ? args.mdns : (config?.server?.mdns ?? args.mdns)
   const port = portExplicitlySet ? args.port : (config?.server?.port ?? args.port)
   const port = portExplicitlySet ? args.port : (config?.server?.port ?? args.port)
@@ -38,6 +45,9 @@ export async function resolveNetworkOptions(args: NetworkOptions) {
     : mdns && !config?.server?.hostname
     : mdns && !config?.server?.hostname
       ? "0.0.0.0"
       ? "0.0.0.0"
       : (config?.server?.hostname ?? args.hostname)
       : (config?.server?.hostname ?? args.hostname)
+  const configCors = config?.server?.cors ?? []
+  const argsCors = Array.isArray(args.cors) ? args.cors : args.cors ? [args.cors] : []
+  const cors = [...configCors, ...argsCors]
 
 
-  return { hostname, port, mdns }
+  return { hostname, port, mdns, cors }
 }
 }

+ 1 - 0
packages/opencode/src/config/config.ts

@@ -586,6 +586,7 @@ export namespace Config {
       port: z.number().int().positive().optional().describe("Port to listen on"),
       port: z.number().int().positive().optional().describe("Port to listen on"),
       hostname: z.string().optional().describe("Hostname to listen on"),
       hostname: z.string().optional().describe("Hostname to listen on"),
       mdns: z.boolean().optional().describe("Enable mDNS service discovery"),
       mdns: z.boolean().optional().describe("Enable mDNS service discovery"),
+      cors: z.array(z.string()).optional().describe("Additional domains to allow for CORS"),
     })
     })
     .strict()
     .strict()
     .meta({
     .meta({

+ 8 - 2
packages/opencode/src/server/server.ts

@@ -45,7 +45,6 @@ import { Snapshot } from "@/snapshot"
 import { SessionSummary } from "@/session/summary"
 import { SessionSummary } from "@/session/summary"
 import { SessionStatus } from "@/session/status"
 import { SessionStatus } from "@/session/status"
 import { upgradeWebSocket, websocket } from "hono/bun"
 import { upgradeWebSocket, websocket } from "hono/bun"
-import type { BunWebSocketData } from "hono/bun"
 import { errors } from "./error"
 import { errors } from "./error"
 import { Pty } from "@/pty"
 import { Pty } from "@/pty"
 import { Installation } from "@/installation"
 import { Installation } from "@/installation"
@@ -58,6 +57,7 @@ export namespace Server {
   const log = Log.create({ service: "server" })
   const log = Log.create({ service: "server" })
 
 
   let _url: URL | undefined
   let _url: URL | undefined
+  let _corsWhitelist: string[] = []
 
 
   export function url(): URL {
   export function url(): URL {
     return _url ?? new URL("http://localhost:4096")
     return _url ?? new URL("http://localhost:4096")
@@ -117,6 +117,10 @@ export namespace Server {
             if (/^https:\/\/([a-z0-9-]+\.)*opencode\.ai$/.test(input)) {
             if (/^https:\/\/([a-z0-9-]+\.)*opencode\.ai$/.test(input)) {
               return input
               return input
             }
             }
+            if (_corsWhitelist.includes(input)) {
+              return input
+            }
+
             return
             return
           },
           },
         }),
         }),
@@ -2676,7 +2680,9 @@ export namespace Server {
     return result
     return result
   }
   }
 
 
-  export function listen(opts: { port: number; hostname: string; mdns?: boolean }) {
+  export function listen(opts: { port: number; hostname: string; mdns?: boolean; cors?: string[] }) {
+    _corsWhitelist = opts.cors ?? []
+
     const args = {
     const args = {
       hostname: opts.hostname,
       hostname: opts.hostname,
       idleTimeout: 0,
       idleTimeout: 0,