@@ -157,17 +157,34 @@ export const layer = Layer.effect(
157157
158158 yield * Effect . addFinalizer ( ( ) =>
159159 Effect . gen ( function * ( ) {
160- for ( const item of state . pending . values ( ) ) {
160+ for ( const id of Array . from ( state . pending . keys ( ) ) ) {
161+ const item = yield * removePending ( state . pending , id , "reject" )
162+ if ( ! item ) continue
161163 yield * Deferred . fail ( item . deferred , new RejectedError ( ) )
162164 }
163- state . pending . clear ( )
164165 } ) ,
165166 )
166167
167168 return state
168169 } ) ,
169170 )
170171
172+ const removePending = Effect . fn ( "Permission.removePending" ) ( function * (
173+ pending : Map < PermissionID , PendingEntry > ,
174+ id : PermissionID ,
175+ reply : Reply ,
176+ ) {
177+ const item = pending . get ( id )
178+ if ( ! item ) return undefined
179+ pending . delete ( id )
180+ yield * bus . publish ( Event . Replied , {
181+ sessionID : item . info . sessionID ,
182+ requestID : item . info . id ,
183+ reply,
184+ } )
185+ return item
186+ } )
187+
171188 const ask = Effect . fn ( "Permission.ask" ) ( function * ( input : AskInput ) {
172189 const { approved, pending } = yield * InstanceState . get ( state )
173190 const { ruleset, ...request } = input
@@ -202,26 +219,14 @@ export const layer = Layer.effect(
202219 const deferred = yield * Deferred . make < void , RejectedError | CorrectedError > ( )
203220 pending . set ( id , { info, deferred } )
204221 yield * bus . publish ( Event . Asked , info )
205- return yield * Effect . ensuring (
206- Deferred . await ( deferred ) ,
207- Effect . sync ( ( ) => {
208- pending . delete ( id )
209- } ) ,
210- )
222+ return yield * Effect . ensuring ( Deferred . await ( deferred ) , removePending ( pending , id , "reject" ) . pipe ( Effect . ignore ) )
211223 } )
212224
213225 const reply = Effect . fn ( "Permission.reply" ) ( function * ( input : ReplyInput ) {
214226 const { approved, pending } = yield * InstanceState . get ( state )
215- const existing = pending . get ( input . requestID )
227+ const existing = yield * removePending ( pending , input . requestID , input . reply )
216228 if ( ! existing ) return yield * new NotFoundError ( { requestID : input . requestID } )
217229
218- pending . delete ( input . requestID )
219- yield * bus . publish ( Event . Replied , {
220- sessionID : existing . info . sessionID ,
221- requestID : existing . info . id ,
222- reply : input . reply ,
223- } )
224-
225230 if ( input . reply === "reject" ) {
226231 yield * Deferred . fail (
227232 existing . deferred ,
@@ -230,13 +235,8 @@ export const layer = Layer.effect(
230235
231236 for ( const [ id , item ] of pending . entries ( ) ) {
232237 if ( item . info . sessionID !== existing . info . sessionID ) continue
233- pending . delete ( id )
234- yield * bus . publish ( Event . Replied , {
235- sessionID : item . info . sessionID ,
236- requestID : item . info . id ,
237- reply : "reject" ,
238- } )
239- yield * Deferred . fail ( item . deferred , new RejectedError ( ) )
238+ const removed = yield * removePending ( pending , id , "reject" )
239+ if ( removed ) yield * Deferred . fail ( removed . deferred , new RejectedError ( ) )
240240 }
241241 return
242242 }
@@ -258,13 +258,8 @@ export const layer = Layer.effect(
258258 ( pattern ) => evaluate ( item . info . permission , pattern , approved ) . action === "allow" ,
259259 )
260260 if ( ! ok ) continue
261- pending . delete ( id )
262- yield * bus . publish ( Event . Replied , {
263- sessionID : item . info . sessionID ,
264- requestID : item . info . id ,
265- reply : "always" ,
266- } )
267- yield * Deferred . succeed ( item . deferred , undefined )
261+ const removed = yield * removePending ( pending , id , "always" )
262+ if ( removed ) yield * Deferred . succeed ( removed . deferred , undefined )
268263 }
269264 } )
270265
0 commit comments