Build HttpApi UI route from services (#25177)

This commit is contained in:
Kit Langton
2026-04-30 19:24:10 -04:00
committed by GitHub
parent 3aaac0098e
commit fc155e9fc5
3 changed files with 57 additions and 36 deletions
@@ -74,22 +74,26 @@ function app(input?: { password?: string; username?: string }) {
function uiApp(input?: { password?: string; username?: string; client?: Layer.Layer<HttpClient.HttpClient> }) {
const handler = HttpRouter.toWebHandler(
HttpRouter.add("*", "/*", (request) =>
serveUIEffect(request).pipe(
Effect.provide(AppFileSystem.defaultLayer),
Effect.provide(input?.client ?? httpClient(new Response("ui"))),
),
Layer.effectDiscard(
Effect.gen(function* () {
const fs = yield* AppFileSystem.Service
const client = yield* HttpClient.HttpClient
const router = yield* HttpRouter.HttpRouter
yield* router.add("*", "/*", (request) => serveUIEffect(request, { fs, client }))
}),
).pipe(
Layer.provide(authorizationRouterMiddleware.layer.pipe(Layer.provide(ServerAuthConfig.defaultLayer))),
Layer.provide(HttpServer.layerServices),
Layer.provide(
Layer.provide([
AppFileSystem.defaultLayer,
input?.client ?? httpClient(new Response("ui")),
HttpServer.layerServices,
ConfigProvider.layer(
ConfigProvider.fromUnknown({
OPENCODE_SERVER_PASSWORD: input?.password,
OPENCODE_SERVER_USERNAME: input?.username,
}),
),
),
]),
),
{ disableLogger: true },
).handler
@@ -140,26 +144,32 @@ describe("HttpApi UI fallback", () => {
let proxiedUrl: string | undefined
const response = await Effect.runPromise(
serveUIEffect(HttpServerRequest.fromWeb(new Request("http://localhost/assets/app.js"))).pipe(
Effect.provide(AppFileSystem.defaultLayer),
Effect.gen(function* () {
const fs = yield* AppFileSystem.Service
const client = yield* HttpClient.HttpClient
return yield* serveUIEffect(HttpServerRequest.fromWeb(new Request("http://localhost/assets/app.js")), { fs, client })
}).pipe(
Effect.provide(
Layer.succeed(
HttpClient.HttpClient,
HttpClient.make((request) => {
proxiedUrl = request.url
return Effect.succeed(
HttpClientResponse.fromWeb(
request,
new Response("console.log('ok')", {
headers: {
"content-encoding": "br",
"content-length": "999",
"content-type": "text/javascript",
},
}),
),
)
}),
Layer.mergeAll(
AppFileSystem.defaultLayer,
Layer.succeed(
HttpClient.HttpClient,
HttpClient.make((request) => {
proxiedUrl = request.url
return Effect.succeed(
HttpClientResponse.fromWeb(
request,
new Response("console.log('ok')", {
headers: {
"content-encoding": "br",
"content-length": "999",
"content-type": "text/javascript",
},
}),
),
)
}),
),
),
),
Effect.map(HttpServerResponse.toWeb),