@@ -96,7 +96,7 @@ export function createResourceScope(): ResourceScope {
96
96
* Resource scope manager for automatic cleanup
97
97
*/
98
98
export class ResourceScope implements Disposable , AsyncDisposable {
99
- private readonly stack = new AsyncDisposableStack ( ) ;
99
+ private readonly resources : ( Disposable | AsyncDisposable ) [ ] = [ ] ;
100
100
private disposed = false ;
101
101
102
102
/**
@@ -106,7 +106,8 @@ export class ResourceScope implements Disposable, AsyncDisposable {
106
106
if ( this . disposed ) {
107
107
throw new Error ( 'ResourceScope has been disposed' ) ;
108
108
}
109
- return this . stack . use ( resource ) ;
109
+ this . resources . push ( resource ) ;
110
+ return resource ;
110
111
}
111
112
112
113
/**
@@ -129,7 +130,7 @@ export class ResourceScope implements Disposable, AsyncDisposable {
129
130
}
130
131
} ;
131
132
132
- this . stack . use ( disposable ) ;
133
+ this . resources . push ( disposable ) ;
133
134
}
134
135
135
136
/**
@@ -149,8 +150,20 @@ export class ResourceScope implements Disposable, AsyncDisposable {
149
150
[ Symbol . dispose ] ( ) : void {
150
151
if ( ! this . disposed ) {
151
152
this . disposed = true ;
152
- // Note: This will log warnings for async resources
153
- this . stack [ Symbol . dispose ] ( ) ;
153
+ // Dispose resources in reverse order
154
+ for ( let i = this . resources . length - 1 ; i >= 0 ; i -- ) {
155
+ const resource = this . resources [ i ] ;
156
+ try {
157
+ if ( typeof ( resource as any ) [ Symbol . dispose ] === 'function' ) {
158
+ ( resource as any ) [ Symbol . dispose ] ( ) ;
159
+ } else if ( typeof ( resource as any ) [ Symbol . asyncDispose ] === 'function' ) {
160
+ console . warn ( 'Async resource in sync dispose context' ) ;
161
+ }
162
+ } catch ( error ) {
163
+ console . error ( 'Error disposing resource:' , error ) ;
164
+ }
165
+ }
166
+ this . resources . length = 0 ;
154
167
}
155
168
}
156
169
@@ -160,7 +173,20 @@ export class ResourceScope implements Disposable, AsyncDisposable {
160
173
async [ Symbol . asyncDispose ] ( ) : Promise < void > {
161
174
if ( ! this . disposed ) {
162
175
this . disposed = true ;
163
- await this . stack [ Symbol . asyncDispose ] ( ) ;
176
+ // Dispose resources in reverse order
177
+ for ( let i = this . resources . length - 1 ; i >= 0 ; i -- ) {
178
+ const resource = this . resources [ i ] ;
179
+ try {
180
+ if ( typeof ( resource as any ) [ Symbol . asyncDispose ] === 'function' ) {
181
+ await ( resource as any ) [ Symbol . asyncDispose ] ( ) ;
182
+ } else if ( typeof ( resource as any ) [ Symbol . dispose ] === 'function' ) {
183
+ ( resource as any ) [ Symbol . dispose ] ( ) ;
184
+ }
185
+ } catch ( error ) {
186
+ console . error ( 'Error disposing resource:' , error ) ;
187
+ }
188
+ }
189
+ this . resources . length = 0 ;
164
190
}
165
191
}
166
192
@@ -175,7 +201,7 @@ export class ResourceScope implements Disposable, AsyncDisposable {
175
201
* Get number of resources in scope
176
202
*/
177
203
get size ( ) : number {
178
- return this . stack . size ;
204
+ return this . resources . length ;
179
205
}
180
206
}
181
207
@@ -224,13 +250,13 @@ export class TemporaryResourceManager {
224
250
if ( resource ) {
225
251
this . activeResources . delete ( id ) ;
226
252
227
- if ( 'asyncDispose' in resource && typeof resource [ Symbol . asyncDispose ] === 'function' ) {
228
- resource [ Symbol . asyncDispose ] ( ) . catch ( error => {
253
+ if ( 'asyncDispose' in resource && typeof ( resource as any ) [ Symbol . asyncDispose ] === 'function' ) {
254
+ ( resource as any ) [ Symbol . asyncDispose ] ( ) . catch ( ( error : any ) => {
229
255
console . warn ( `Error disposing async resource ${ id } :` , error ) ;
230
256
} ) ;
231
- } else if ( 'dispose' in resource && typeof resource [ Symbol . dispose ] === 'function' ) {
257
+ } else if ( 'dispose' in resource && typeof ( resource as any ) [ Symbol . dispose ] === 'function' ) {
232
258
try {
233
- resource [ Symbol . dispose ] ( ) ;
259
+ ( resource as any ) [ Symbol . dispose ] ( ) ;
234
260
} catch ( error ) {
235
261
console . warn ( `Error disposing resource ${ id } :` , error ) ;
236
262
}
@@ -288,10 +314,10 @@ export class TemporaryResourceManager {
288
314
// Dispose all resources
289
315
for ( const [ id , resource ] of this . activeResources ) {
290
316
try {
291
- if ( 'asyncDispose' in resource && typeof resource [ Symbol . asyncDispose ] === 'function' ) {
292
- await resource [ Symbol . asyncDispose ] ( ) ;
293
- } else if ( 'dispose' in resource && typeof resource [ Symbol . dispose ] === 'function' ) {
294
- resource [ Symbol . dispose ] ( ) ;
317
+ if ( 'asyncDispose' in resource && typeof ( resource as any ) [ Symbol . asyncDispose ] === 'function' ) {
318
+ await ( resource as any ) [ Symbol . asyncDispose ] ( ) ;
319
+ } else if ( 'dispose' in resource && typeof ( resource as any ) [ Symbol . dispose ] === 'function' ) {
320
+ ( resource as any ) [ Symbol . dispose ] ( ) ;
295
321
}
296
322
} catch ( error ) {
297
323
errors . push ( error instanceof Error ? error : new Error ( `Error disposing ${ id } : ${ error } ` ) ) ;
0 commit comments