1- import type { WorkspaceID } from "@/control-plane/schema"
2- import { WorkspaceContext } from "@/control-plane/workspace-context"
3- import { WorkspaceRef } from "@/effect/instance-ref"
4- import { Instance , type InstanceContext } from "@/project/instance"
1+ import { EffectBridge } from "@/effect/bridge"
2+ import type { InstanceContext } from "@/project/instance"
53import { InstanceStore } from "@/project/instance-store"
64import { Effect } from "effect"
75import { HttpEffect , HttpMiddleware , HttpServerRequest } from "effect/unstable/http"
86
97type MarkedInstance = {
108 ctx : InstanceContext
119 store : InstanceStore . Interface
12- workspaceID ?: WorkspaceID
10+ bridge : EffectBridge . Shape
1311}
1412
1513// Disposal is requested by an endpoint handler, but must run from the outer
@@ -19,20 +17,9 @@ const disposeAfterResponse = new WeakMap<object, MarkedInstance>()
1917
2018const mark = ( ctx : InstanceContext ) =>
2119 Effect . gen ( function * ( ) {
22- return { ctx, store : yield * InstanceStore . Service , workspaceID : yield * WorkspaceRef }
20+ return { ctx, store : yield * InstanceStore . Service , bridge : yield * EffectBridge . make ( ) }
2321 } )
2422
25- // InstanceStore lifecycle operations still publish events through legacy ALS helpers.
26- // Effect request handlers carry these values in services, so bridge them back
27- // into the legacy contexts only around the lifecycle operation.
28- const restoreMarked = < A > ( marked : MarkedInstance , effect : Effect . Effect < A > ) =>
29- Effect . promise ( ( ) =>
30- WorkspaceContext . provide ( {
31- workspaceID : marked . workspaceID ,
32- fn : ( ) => Instance . restore ( marked . ctx , ( ) => Effect . runPromise ( effect ) ) ,
33- } ) ,
34- )
35-
3623export const markInstanceForDisposal = ( ctx : InstanceContext ) =>
3724 Effect . gen ( function * ( ) {
3825 const marked = yield * mark ( ctx )
@@ -49,7 +36,7 @@ export const markInstanceForReload = (ctx: InstanceContext, next: InstanceStore.
4936 Effect . gen ( function * ( ) {
5037 const marked = yield * mark ( ctx )
5138 return yield * HttpEffect . appendPreResponseHandler ( ( _request , response ) =>
52- Effect . as ( Effect . uninterruptible ( restoreMarked ( marked , marked . store . reload ( next ) ) ) , response ) ,
39+ Effect . as ( Effect . uninterruptible ( marked . bridge . run ( marked . store . reload ( next ) ) ) , response ) ,
5340 )
5441 } )
5542
@@ -60,6 +47,6 @@ export const disposeMiddleware: HttpMiddleware.HttpMiddleware = (effect) =>
6047 const marked = disposeAfterResponse . get ( request . source )
6148 if ( ! marked ) return response
6249 disposeAfterResponse . delete ( request . source )
63- yield * Effect . uninterruptible ( restoreMarked ( marked , marked . store . dispose ( marked . ctx ) ) )
50+ yield * Effect . uninterruptible ( marked . bridge . run ( marked . store . dispose ( marked . ctx ) ) )
6451 return response
6552 } )
0 commit comments