Skip to content

Commit 160928a

Browse files
authored
Extract InstanceStore.provide helper (#25372)
1 parent d297c29 commit 160928a

2 files changed

Lines changed: 10 additions & 13 deletions

File tree

packages/opencode/src/project/instance-store.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { GlobalBus } from "@/bus/global"
22
import { WorkspaceContext } from "@/control-plane/workspace-context"
3+
import { InstanceRef } from "@/effect/instance-ref"
34
import { disposeInstance } from "@/effect/instance-registry"
45
import { makeRuntime } from "@/effect/run-service"
56
import { AppFileSystem } from "@opencode-ai/core/filesystem"
@@ -19,6 +20,7 @@ export interface Interface {
1920
readonly reload: (input: LoadInput) => Effect.Effect<InstanceContext>
2021
readonly dispose: (ctx: InstanceContext) => Effect.Effect<void>
2122
readonly disposeAll: () => Effect.Effect<void>
23+
readonly provide: <A, E, R>(input: LoadInput, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
2224
}
2325

2426
export class Service extends Context.Service<Service, Interface>()("@opencode/InstanceStore") {}
@@ -168,13 +170,17 @@ export const layer: Layer.Layer<Service, never, Project.Service> = Layer.effect(
168170
return yield* cachedDisposeAll
169171
})
170172

173+
const provide = <A, E, R>(input: LoadInput, effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
174+
load(input).pipe(Effect.flatMap((ctx) => effect.pipe(Effect.provideService(InstanceRef, ctx))))
175+
171176
yield* Effect.addFinalizer(() => disposeAll().pipe(Effect.ignore))
172177

173178
return Service.of({
174179
load,
175180
reload,
176181
dispose,
177182
disposeAll,
183+
provide,
178184
})
179185
}),
180186
)

packages/opencode/src/server/routes/instance/httpapi/middleware/instance-context.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import { InstanceRef, WorkspaceRef } from "@/effect/instance-ref"
1+
import { WorkspaceRef } from "@/effect/instance-ref"
22
import { AppRuntime } from "@/effect/app-runtime"
33
import { InstanceBootstrap } from "@/project/bootstrap"
4-
import type { InstanceContext } from "@/project/instance"
54
import { InstanceStore } from "@/project/instance-store"
65
import { Effect, Layer } from "effect"
76
import { HttpRouter, HttpServerResponse } from "effect/unstable/http"
@@ -23,23 +22,15 @@ function decode(input: string): string {
2322
}
2423
}
2524

26-
function makeInstanceContext(store: InstanceStore.Interface, directory: string): Effect.Effect<InstanceContext> {
27-
return store.load({
28-
directory: decode(directory),
29-
init: () => AppRuntime.runPromise(InstanceBootstrap),
30-
})
31-
}
32-
3325
function provideInstanceContext<E>(
3426
effect: Effect.Effect<HttpServerResponse.HttpServerResponse, E>,
3527
store: InstanceStore.Interface,
3628
): Effect.Effect<HttpServerResponse.HttpServerResponse, E, WorkspaceRouteContext> {
3729
return Effect.gen(function* () {
3830
const route = yield* WorkspaceRouteContext
39-
const ctx = yield* makeInstanceContext(store, route.directory)
40-
return yield* effect.pipe(
41-
Effect.provideService(InstanceRef, ctx),
42-
Effect.provideService(WorkspaceRef, route.workspaceID),
31+
return yield* store.provide(
32+
{ directory: decode(route.directory), init: () => AppRuntime.runPromise(InstanceBootstrap) },
33+
effect.pipe(Effect.provideService(WorkspaceRef, route.workspaceID)),
4334
)
4435
})
4536
}

0 commit comments

Comments
 (0)