@@ -54,6 +54,28 @@ function sleep(ms: number) {
5454}
5555
5656export function createAutoJobRuntime ( deps : AutoJobRuntimeDeps ) {
57+ function isCurrentJob ( sessionId : string , job : WebAutoJob ) {
58+ return deps . autoJobs . get ( sessionId ) === job ;
59+ }
60+
61+ function deleteCurrentJob ( sessionId : string , job : WebAutoJob ) {
62+ if ( isCurrentJob ( sessionId , job ) ) {
63+ deps . autoJobs . delete ( sessionId ) ;
64+ }
65+ }
66+
67+ function stopCurrentJob ( sessionId : string , job : WebAutoJob ) {
68+ if ( ! isCurrentJob ( sessionId , job ) ) {
69+ return false ;
70+ }
71+ job . queue = [ ] ;
72+ for ( const controller of job . controllers . values ( ) ) {
73+ controller . abort ( ) ;
74+ }
75+ deps . autoJobs . delete ( sessionId ) ;
76+ return true ;
77+ }
78+
5779 async function emitRewriteProgress (
5880 session : DocumentSession ,
5981 job : WebAutoJob ,
@@ -110,9 +132,13 @@ export function createAutoJobRuntime(deps: AutoJobRuntimeDeps) {
110132 }
111133
112134 while ( true ) {
135+ if ( ! isCurrentJob ( sessionId , job ) ) {
136+ return ;
137+ }
138+
113139 const session = deps . sessions . get ( sessionId ) ;
114140 if ( ! session ) {
115- deps . autoJobs . delete ( sessionId ) ;
141+ deleteCurrentJob ( sessionId , job ) ;
116142 return ;
117143 }
118144
@@ -122,7 +148,7 @@ export function createAutoJobRuntime(deps: AutoJobRuntimeDeps) {
122148 deps . updateSessionTimestamp ( session ) ;
123149 await emitRewriteProgress ( session , job , "cancelled" ) ;
124150 await emitRewriteFinished ( sessionId ) ;
125- deps . autoJobs . delete ( sessionId ) ;
151+ deleteCurrentJob ( sessionId , job ) ;
126152 return ;
127153 }
128154
@@ -152,13 +178,15 @@ export function createAutoJobRuntime(deps: AutoJobRuntimeDeps) {
152178 job . controllers . set ( token , controller ) ;
153179 void emitRewriteProgress ( session , job , "running" ) ;
154180
155- const promise = deps
156- . processRewriteBatch ( {
157- session,
158- rewriteUnitIds,
159- autoApprove : true ,
160- signal : controller . signal
161- } )
181+ const promise = Promise . resolve ( )
182+ . then ( ( ) =>
183+ deps . processRewriteBatch ( {
184+ session,
185+ rewriteUnitIds,
186+ autoApprove : true ,
187+ signal : controller . signal
188+ } )
189+ )
162190 . then (
163191 ( completed ) : WebAutoBatchResult => ( {
164192 kind : "success" ,
@@ -183,7 +211,7 @@ export function createAutoJobRuntime(deps: AutoJobRuntimeDeps) {
183211 void ( async ( ) => {
184212 const result = await promise ;
185213 const activeSession = deps . sessions . get ( sessionId ) ;
186- if ( ! activeSession ) {
214+ if ( ! activeSession || ! isCurrentJob ( sessionId , job ) ) {
187215 return ;
188216 }
189217 if ( result . kind === "cancelled" ) {
@@ -193,23 +221,29 @@ export function createAutoJobRuntime(deps: AutoJobRuntimeDeps) {
193221 }
194222 if ( result . kind === "failed" ) {
195223 deps . markBatchFailure ( activeSession , result . rewriteUnitIds , result . error ) ;
224+ stopCurrentJob ( sessionId , job ) ;
196225 await emitRewriteFailed ( sessionId , result . error ) ;
197- deps . autoJobs . delete ( sessionId ) ;
198226 return ;
199227 }
200228 job . completedUnits += result . completed . length ;
201229 await emitRewriteUnitCompleted ( sessionId , result . completed ) ;
202- await emitRewriteProgress ( activeSession , job , "running" ) ;
230+ if ( isCurrentJob ( sessionId , job ) ) {
231+ await emitRewriteProgress ( activeSession , job , "running" ) ;
232+ }
203233 } ) ( ) ;
204234 }
205235
236+ if ( ! isCurrentJob ( sessionId , job ) ) {
237+ return ;
238+ }
239+
206240 if ( job . controllers . size === 0 && job . queue . length === 0 ) {
207241 deps . clearRunningUnits ( session ) ;
208242 session . status = deps . computeSessionState ( session ) ;
209243 deps . updateSessionTimestamp ( session ) ;
210244 await emitRewriteProgress ( session , job , session . status ) ;
211245 await emitRewriteFinished ( sessionId ) ;
212- deps . autoJobs . delete ( sessionId ) ;
246+ deleteCurrentJob ( sessionId , job ) ;
213247 return ;
214248 }
215249
0 commit comments