Extract InstanceStore.provide helper (#25372)
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import { GlobalBus } from "@/bus/global"
|
import { GlobalBus } from "@/bus/global"
|
||||||
import { WorkspaceContext } from "@/control-plane/workspace-context"
|
import { WorkspaceContext } from "@/control-plane/workspace-context"
|
||||||
|
import { InstanceRef } from "@/effect/instance-ref"
|
||||||
import { disposeInstance } from "@/effect/instance-registry"
|
import { disposeInstance } from "@/effect/instance-registry"
|
||||||
import { makeRuntime } from "@/effect/run-service"
|
import { makeRuntime } from "@/effect/run-service"
|
||||||
import { AppFileSystem } from "@opencode-ai/core/filesystem"
|
import { AppFileSystem } from "@opencode-ai/core/filesystem"
|
||||||
@@ -19,6 +20,7 @@ export interface Interface {
|
|||||||
readonly reload: (input: LoadInput) => Effect.Effect<InstanceContext>
|
readonly reload: (input: LoadInput) => Effect.Effect<InstanceContext>
|
||||||
readonly dispose: (ctx: InstanceContext) => Effect.Effect<void>
|
readonly dispose: (ctx: InstanceContext) => Effect.Effect<void>
|
||||||
readonly disposeAll: () => Effect.Effect<void>
|
readonly disposeAll: () => Effect.Effect<void>
|
||||||
|
readonly provide: <A, E, R>(input: LoadInput, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Service extends Context.Service<Service, Interface>()("@opencode/InstanceStore") {}
|
export class Service extends Context.Service<Service, Interface>()("@opencode/InstanceStore") {}
|
||||||
@@ -168,6 +170,9 @@ export const layer: Layer.Layer<Service, never, Project.Service> = Layer.effect(
|
|||||||
return yield* cachedDisposeAll
|
return yield* cachedDisposeAll
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const provide = <A, E, R>(input: LoadInput, effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
|
||||||
|
load(input).pipe(Effect.flatMap((ctx) => effect.pipe(Effect.provideService(InstanceRef, ctx))))
|
||||||
|
|
||||||
yield* Effect.addFinalizer(() => disposeAll().pipe(Effect.ignore))
|
yield* Effect.addFinalizer(() => disposeAll().pipe(Effect.ignore))
|
||||||
|
|
||||||
return Service.of({
|
return Service.of({
|
||||||
@@ -175,6 +180,7 @@ export const layer: Layer.Layer<Service, never, Project.Service> = Layer.effect(
|
|||||||
reload,
|
reload,
|
||||||
dispose,
|
dispose,
|
||||||
disposeAll,
|
disposeAll,
|
||||||
|
provide,
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|||||||
+4
-13
@@ -1,7 +1,6 @@
|
|||||||
import { InstanceRef, WorkspaceRef } from "@/effect/instance-ref"
|
import { WorkspaceRef } from "@/effect/instance-ref"
|
||||||
import { AppRuntime } from "@/effect/app-runtime"
|
import { AppRuntime } from "@/effect/app-runtime"
|
||||||
import { InstanceBootstrap } from "@/project/bootstrap"
|
import { InstanceBootstrap } from "@/project/bootstrap"
|
||||||
import type { InstanceContext } from "@/project/instance"
|
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
import { InstanceStore } from "@/project/instance-store"
|
||||||
import { Effect, Layer } from "effect"
|
import { Effect, Layer } from "effect"
|
||||||
import { HttpRouter, HttpServerResponse } from "effect/unstable/http"
|
import { HttpRouter, HttpServerResponse } from "effect/unstable/http"
|
||||||
@@ -23,23 +22,15 @@ function decode(input: string): string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function makeInstanceContext(store: InstanceStore.Interface, directory: string): Effect.Effect<InstanceContext> {
|
|
||||||
return store.load({
|
|
||||||
directory: decode(directory),
|
|
||||||
init: () => AppRuntime.runPromise(InstanceBootstrap),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function provideInstanceContext<E>(
|
function provideInstanceContext<E>(
|
||||||
effect: Effect.Effect<HttpServerResponse.HttpServerResponse, E>,
|
effect: Effect.Effect<HttpServerResponse.HttpServerResponse, E>,
|
||||||
store: InstanceStore.Interface,
|
store: InstanceStore.Interface,
|
||||||
): Effect.Effect<HttpServerResponse.HttpServerResponse, E, WorkspaceRouteContext> {
|
): Effect.Effect<HttpServerResponse.HttpServerResponse, E, WorkspaceRouteContext> {
|
||||||
return Effect.gen(function* () {
|
return Effect.gen(function* () {
|
||||||
const route = yield* WorkspaceRouteContext
|
const route = yield* WorkspaceRouteContext
|
||||||
const ctx = yield* makeInstanceContext(store, route.directory)
|
return yield* store.provide(
|
||||||
return yield* effect.pipe(
|
{ directory: decode(route.directory), init: () => AppRuntime.runPromise(InstanceBootstrap) },
|
||||||
Effect.provideService(InstanceRef, ctx),
|
effect.pipe(Effect.provideService(WorkspaceRef, route.workspaceID)),
|
||||||
Effect.provideService(WorkspaceRef, route.workspaceID),
|
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user