@@ -2,6 +2,7 @@ import { assert, it } from "@effect/vitest";
22import * as NodeCrypto from "@effect/platform-node/NodeCrypto" ;
33import * as Deferred from "effect/Deferred" ;
44import * as Effect from "effect/Effect" ;
5+ import * as Exit from "effect/Exit" ;
56import * as Layer from "effect/Layer" ;
67import * as FileSystem from "effect/FileSystem" ;
78import * as Path from "effect/Path" ;
@@ -69,14 +70,19 @@ import * as ElectronWindow from "../electron/ElectronWindow.ts";
6970import * as MacPermissions from "../permissions/MacPermissions.ts" ;
7071import * as PreviewManager from "../preview/Manager.ts" ;
7172
72- it . effect (
73- "starts the backend and window while Linux registration is stalled and cancels it on shutdown " ,
74- ( ) =>
73+ it . effect . each ( [ false , true ] ) (
74+ "stops backends together before flushing history and cancels Linux registration, stop defect=%s " ,
75+ ( stopDefect ) =>
7576 Effect . gen ( function * ( ) {
7677 const registrationStarted = yield * Deferred . make < void > ( ) ;
7778 const releaseRegistration = yield * Deferred . make < void > ( ) ;
7879 const registrationStopped = yield * Deferred . make < void > ( ) ;
7980 const windowStarted = yield * Deferred . make < void > ( ) ;
81+ const firstStopStarted = yield * Deferred . make < void > ( ) ;
82+ const secondStopStarted = yield * Deferred . make < void > ( ) ;
83+ const releaseStops = yield * Deferred . make < void > ( ) ;
84+ const historyStarted = yield * Deferred . make < void > ( ) ;
85+ const releaseHistory = yield * Deferred . make < void > ( ) ;
8086 const quitting = yield * Ref . make ( false ) ;
8187 const events : string [ ] = [ ] ;
8288 const record = ( event : string ) =>
@@ -169,7 +175,21 @@ it.effect(
169175 start : record ( "backend" ) ,
170176 currentConfig : Effect . succeedSome ( { preflightFailure : Option . none ( ) } ) ,
171177 } ) ,
172- list : Effect . succeed ( [ ] ) ,
178+ list : Effect . succeed ( [
179+ {
180+ stop : ( ) =>
181+ Deferred . succeed ( firstStopStarted , undefined ) . pipe (
182+ Effect . andThen ( Deferred . await ( releaseStops ) ) ,
183+ Effect . andThen ( stopDefect ? Effect . die ( "stop defect" ) : Effect . void ) ,
184+ ) ,
185+ } ,
186+ {
187+ stop : ( ) =>
188+ Deferred . succeed ( secondStopStarted , undefined ) . pipe (
189+ Effect . andThen ( Deferred . await ( releaseStops ) ) ,
190+ ) ,
191+ } ,
192+ ] ) ,
173193 } as unknown as DesktopBackendPool . DesktopBackendPool [ "Service" ] ) ,
174194 Effect . provideService ( DesktopServerExposure . DesktopServerExposure , {
175195 configureFromSettings : ( ) => Effect . succeed ( { mode : "local-only" } ) ,
@@ -182,7 +202,10 @@ it.effect(
182202 start : Effect . void ,
183203 } as unknown as DesktopAppActivation . DesktopAppActivation [ "Service" ] ) ,
184204 Effect . provideService ( DesktopRendererHistory . DesktopRendererHistory , {
185- shutdown : Effect . void ,
205+ shutdown : Deferred . succeed ( historyStarted , undefined ) . pipe (
206+ Effect . andThen ( Deferred . await ( releaseHistory ) ) ,
207+ Effect . asVoid ,
208+ ) ,
186209 } as DesktopRendererHistory . DesktopRendererHistory [ "Service" ] ) ,
187210 ) ;
188211 const app = yield * runApp . pipe (
@@ -226,8 +249,19 @@ it.effect(
226249 yield * Deferred . await ( windowStarted ) ;
227250 assert . deepEqual ( events , [ "identity" , "ready" , "identity" , "backend" , "window" ] ) ;
228251 assert . isFalse ( yield * Deferred . isDone ( registrationStopped ) ) ;
229- yield * ( yield * DesktopShutdown . DesktopShutdown ) . request ;
230- yield * Fiber . join ( app ) ;
252+ const shutdown = yield * DesktopShutdown . DesktopShutdown ;
253+ yield * shutdown . request ;
254+ yield * Deferred . await ( firstStopStarted ) ;
255+ yield * Deferred . await ( secondStopStarted ) ;
256+ assert . isFalse ( yield * Deferred . isDone ( historyStarted ) ) ;
257+ assert . isFalse ( yield * shutdown . isComplete ) ;
258+ yield * Deferred . succeed ( releaseStops , undefined ) ;
259+ yield * Deferred . await ( historyStarted ) ;
260+ assert . isFalse ( yield * shutdown . isComplete ) ;
261+ yield * Deferred . succeed ( releaseHistory , undefined ) ;
262+ const result = yield * Fiber . await ( app ) ;
263+ assert . equal ( Exit . isFailure ( result ) , stopDefect ) ;
264+ assert . isTrue ( yield * shutdown . isComplete ) ;
231265 assert . isTrue ( yield * Deferred . isDone ( registrationStopped ) ) ;
232266 } ) . pipe ( Effect . provide ( DesktopShutdown . layer ) ) ,
233267) ;
0 commit comments