fix(core): move instance middleware after control plane routes (#23150)
This commit is contained in:
@@ -15,6 +15,7 @@ import { Command } from "@/command"
|
|||||||
import { QuestionRoutes } from "./question"
|
import { QuestionRoutes } from "./question"
|
||||||
import { PermissionRoutes } from "./permission"
|
import { PermissionRoutes } from "./permission"
|
||||||
import { Flag } from "@/flag/flag"
|
import { Flag } from "@/flag/flag"
|
||||||
|
import { WorkspaceID } from "@/control-plane/schema"
|
||||||
import { ExperimentalHttpApiServer } from "./httpapi/server"
|
import { ExperimentalHttpApiServer } from "./httpapi/server"
|
||||||
import { ProjectRoutes } from "./project"
|
import { ProjectRoutes } from "./project"
|
||||||
import { SessionRoutes } from "./session"
|
import { SessionRoutes } from "./session"
|
||||||
@@ -27,9 +28,10 @@ import { ProviderRoutes } from "./provider"
|
|||||||
import { EventRoutes } from "./event"
|
import { EventRoutes } from "./event"
|
||||||
import { SyncRoutes } from "./sync"
|
import { SyncRoutes } from "./sync"
|
||||||
import { AppRuntime } from "@/effect/app-runtime"
|
import { AppRuntime } from "@/effect/app-runtime"
|
||||||
|
import { InstanceMiddleware } from "./middleware"
|
||||||
|
|
||||||
export const InstanceRoutes = (upgrade: UpgradeWebSocket): Hono => {
|
export const InstanceRoutes = (upgrade: UpgradeWebSocket, workspaceID?: WorkspaceID): Hono => {
|
||||||
const app = new Hono()
|
const app = new Hono().use(InstanceMiddleware(workspaceID))
|
||||||
|
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_HTTPAPI) {
|
if (Flag.OPENCODE_EXPERIMENTAL_HTTPAPI) {
|
||||||
const handler = ExperimentalHttpApiServer.webHandler().handler
|
const handler = ExperimentalHttpApiServer.webHandler().handler
|
||||||
|
|||||||
35
packages/opencode/src/server/routes/instance/middleware.ts
Normal file
35
packages/opencode/src/server/routes/instance/middleware.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import type { MiddlewareHandler } from "hono"
|
||||||
|
import { Instance } from "@/project/instance"
|
||||||
|
import { InstanceBootstrap } from "@/project/bootstrap"
|
||||||
|
import { AppRuntime } from "@/effect/app-runtime"
|
||||||
|
import { AppFileSystem } from "@opencode-ai/shared/filesystem"
|
||||||
|
import { WorkspaceContext } from "@/control-plane/workspace-context"
|
||||||
|
import { WorkspaceID } from "@/control-plane/schema"
|
||||||
|
|
||||||
|
export function InstanceMiddleware(workspaceID?: WorkspaceID): MiddlewareHandler {
|
||||||
|
return async (c, next) => {
|
||||||
|
const raw = c.req.query("directory") || c.req.header("x-opencode-directory") || process.cwd()
|
||||||
|
const directory = AppFileSystem.resolve(
|
||||||
|
(() => {
|
||||||
|
try {
|
||||||
|
return decodeURIComponent(raw)
|
||||||
|
} catch {
|
||||||
|
return raw
|
||||||
|
}
|
||||||
|
})(),
|
||||||
|
)
|
||||||
|
|
||||||
|
return WorkspaceContext.provide({
|
||||||
|
workspaceID,
|
||||||
|
async fn() {
|
||||||
|
return Instance.provide({
|
||||||
|
directory,
|
||||||
|
init: () => AppRuntime.runPromise(InstanceBootstrap),
|
||||||
|
async fn() {
|
||||||
|
return next()
|
||||||
|
},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,16 +1,10 @@
|
|||||||
import { generateSpecs } from "hono-openapi"
|
import { generateSpecs } from "hono-openapi"
|
||||||
import { Hono } from "hono"
|
import { Hono } from "hono"
|
||||||
import type { MiddlewareHandler } from "hono"
|
|
||||||
import { adapter } from "#hono"
|
import { adapter } from "#hono"
|
||||||
import { lazy } from "@/util/lazy"
|
import { lazy } from "@/util/lazy"
|
||||||
import { Log } from "@/util"
|
import { Log } from "@/util"
|
||||||
import { Flag } from "@/flag/flag"
|
import { Flag } from "@/flag/flag"
|
||||||
import { Instance } from "@/project/instance"
|
|
||||||
import { InstanceBootstrap } from "@/project/bootstrap"
|
|
||||||
import { AppRuntime } from "@/effect/app-runtime"
|
|
||||||
import { AppFileSystem } from "@opencode-ai/shared/filesystem"
|
|
||||||
import { WorkspaceID } from "@/control-plane/schema"
|
import { WorkspaceID } from "@/control-plane/schema"
|
||||||
import { WorkspaceContext } from "@/control-plane/workspace-context"
|
|
||||||
import { MDNS } from "./mdns"
|
import { MDNS } from "./mdns"
|
||||||
import { AuthMiddleware, CompressionMiddleware, CorsMiddleware, ErrorMiddleware, LoggerMiddleware } from "./middleware"
|
import { AuthMiddleware, CompressionMiddleware, CorsMiddleware, ErrorMiddleware, LoggerMiddleware } from "./middleware"
|
||||||
import { FenceMiddleware } from "./fence"
|
import { FenceMiddleware } from "./fence"
|
||||||
@@ -48,47 +42,23 @@ function create(opts: { cors?: string[] }) {
|
|||||||
|
|
||||||
const runtime = adapter.create(app)
|
const runtime = adapter.create(app)
|
||||||
|
|
||||||
function InstanceMiddleware(workspaceID?: WorkspaceID): MiddlewareHandler {
|
|
||||||
return async (c, next) => {
|
|
||||||
const raw = c.req.query("directory") || c.req.header("x-opencode-directory") || process.cwd()
|
|
||||||
const directory = AppFileSystem.resolve(
|
|
||||||
(() => {
|
|
||||||
try {
|
|
||||||
return decodeURIComponent(raw)
|
|
||||||
} catch {
|
|
||||||
return raw
|
|
||||||
}
|
|
||||||
})(),
|
|
||||||
)
|
|
||||||
|
|
||||||
return WorkspaceContext.provide({
|
|
||||||
workspaceID,
|
|
||||||
async fn() {
|
|
||||||
return Instance.provide({
|
|
||||||
directory,
|
|
||||||
init: () => AppRuntime.runPromise(InstanceBootstrap),
|
|
||||||
async fn() {
|
|
||||||
return next()
|
|
||||||
},
|
|
||||||
})
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Flag.OPENCODE_WORKSPACE_ID) {
|
if (Flag.OPENCODE_WORKSPACE_ID) {
|
||||||
return {
|
return {
|
||||||
app: app
|
app: app
|
||||||
.use(InstanceMiddleware(Flag.OPENCODE_WORKSPACE_ID ? WorkspaceID.make(Flag.OPENCODE_WORKSPACE_ID) : undefined))
|
|
||||||
.use(FenceMiddleware)
|
.use(FenceMiddleware)
|
||||||
.route("/", InstanceRoutes(runtime.upgradeWebSocket)),
|
.route(
|
||||||
|
"/",
|
||||||
|
InstanceRoutes(
|
||||||
|
runtime.upgradeWebSocket,
|
||||||
|
Flag.OPENCODE_WORKSPACE_ID ? WorkspaceID.make(Flag.OPENCODE_WORKSPACE_ID) : undefined,
|
||||||
|
),
|
||||||
|
),
|
||||||
runtime,
|
runtime,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
app: app
|
app: app
|
||||||
.use(InstanceMiddleware())
|
|
||||||
.route("/", ControlPlaneRoutes())
|
.route("/", ControlPlaneRoutes())
|
||||||
.use(WorkspaceRouterMiddleware(runtime.upgradeWebSocket))
|
.use(WorkspaceRouterMiddleware(runtime.upgradeWebSocket))
|
||||||
.route("/", InstanceRoutes(runtime.upgradeWebSocket))
|
.route("/", InstanceRoutes(runtime.upgradeWebSocket))
|
||||||
|
|||||||
Reference in New Issue
Block a user