@@ -9,18 +9,41 @@ export interface ObjectWithLifetime {
99 cleanup ( ) : Promise < void > | void ;
1010}
1111
12+ type PromiseResolver = ( value : Lifetime | PromiseLike < Lifetime > ) => void ;
1213const _globalLifetimes : Record < string , Lifetime > = { } ;
14+ const _globalAwaitQueues : Record < string , PromiseResolver [ ] > = { } ;
15+
16+ export function waitUntilNamedLifetime ( name : string ) : Promise < Lifetime > {
17+ const lt = getNamedLifetime ( name ) ;
18+ if ( lt === undefined ) {
19+ return Promise . resolve ( createNamedLifetime ( name ) ) ;
20+ }
21+
22+ // let reject: any; FIXME figure out what to do with rejects
23+ const promise = new Promise < Lifetime > ( ( resolve ) => {
24+ if ( _globalAwaitQueues [ name ] === undefined ) {
25+ _globalAwaitQueues [ name ] = [ ] ;
26+ }
27+ _globalAwaitQueues [ name ] . push ( resolve ) ;
28+ } ) ;
29+ return promise ;
30+ }
1331
1432export function createNamedLifetime ( name : string ) : Lifetime {
1533 if ( _globalLifetimes [ name ] !== undefined ) {
1634 throw new Error (
17- `Internal Error: cannot recreate existing named lifetime ${ name } ` ,
35+ `Internal Error: lifetime ${ name } already exists. This is a bug in Quarto. ` ,
1836 ) ;
1937 }
2038 const lifetime = new Lifetime ( ) ;
2139 lifetime . attach ( {
2240 cleanup : ( ) => {
2341 delete _globalLifetimes [ name ] ;
42+ if ( _globalAwaitQueues [ name ] && _globalAwaitQueues [ name ] . length ) {
43+ const resolver = _globalAwaitQueues [ name ] . shift ( ) ! ;
44+ const newLifetime = createNamedLifetime ( name ) ;
45+ resolver ( newLifetime ) ;
46+ }
2447 } ,
2548 } ) ;
2649 _globalLifetimes [ name ] = lifetime ;
0 commit comments