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

fix(app): remote http server connections

Adam пре 2 месеци
родитељ
комит
958320f9c1
1 измењених фајлова са 32 додато и 5 уклоњено
  1. 32 5
      packages/app/src/context/global-sdk.tsx

+ 32 - 5
packages/app/src/context/global-sdk.tsx

@@ -12,19 +12,32 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
     const platform = usePlatform()
     const abort = new AbortController()
 
+    const password = typeof window === "undefined" ? undefined : window.__OPENCODE__?.serverPassword
+
     const auth = (() => {
-      if (typeof window === "undefined") return
-      const password = window.__OPENCODE__?.serverPassword
       if (!password) return
+      if (!server.isLocal()) return
       return {
         Authorization: `Basic ${btoa(`opencode:${password}`)}`,
       }
     })()
 
+    const eventFetch = (() => {
+      if (!platform.fetch) return
+      try {
+        const url = new URL(server.url)
+        const loopback = url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "::1"
+        if (url.protocol === "http:" && !loopback) return platform.fetch
+      } catch {
+        return
+      }
+    })()
+
     const eventSdk = createOpencodeClient({
       baseUrl: server.url,
       signal: abort.signal,
-      headers: auth,
+      fetch: eventFetch,
+      headers: eventFetch ? undefined : auth,
     })
     const emitter = createGlobalEmitter<{
       [key: string]: Event
@@ -80,7 +93,17 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
     let streamErrorLogged = false
 
     void (async () => {
-      const events = await eventSdk.global.event()
+      const events = await eventSdk.global.event({
+        onSseError: (error) => {
+          if (streamErrorLogged) return
+          streamErrorLogged = true
+          console.error("[global-sdk] event stream error", {
+            url: server.url,
+            fetch: eventFetch ? "platform" : "webview",
+            error,
+          })
+        },
+      })
       let yielded = Date.now()
       for await (const event of events.stream) {
         const directory = event.directory ?? "global"
@@ -106,7 +129,11 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
       .catch((error) => {
         if (streamErrorLogged) return
         streamErrorLogged = true
-        console.error("[global-sdk] event stream failed", error)
+        console.error("[global-sdk] event stream failed", {
+          url: server.url,
+          fetch: eventFetch ? "platform" : "webview",
+          error,
+        })
       })
 
     onCleanup(() => {