@@ -7,7 +7,7 @@ export class Container {
77 readonly app : App ;
88 private providers : ProviderFactory ;
99 private services = { } as ServiceMap ;
10- private initPromises = new Map < string , Promise < Service > > ( ) ;
10+ private pendingServices = new Map < string , Promise < Service > > ( ) ;
1111
1212 constructor ( app : App , providers : ProviderFactory ) {
1313 this . app = app ;
@@ -27,40 +27,43 @@ export class Container {
2727 service = await service ;
2828 }
2929 this . services [ service . name ] = service ;
30- }
3130
32- async getService < T extends keyof ServiceMap > ( name : T ) : Promise < ServiceMap [ T ] > {
33- const service = this . services [ name ] ;
34- if ( service ) {
35- return service as ServiceMap [ T ] ;
31+ // Resolve any pending waiters
32+ const pendingPromise = this . pendingServices . get ( service . name ) ;
33+ if ( pendingPromise ) {
34+ this . pendingServices . delete ( service . name ) ;
3635 }
36+ }
3737
38- // If already initializing, wait for it
39- if ( this . initPromises . has ( String ( name ) ) ) {
40- return this . initPromises . get ( String ( name ) ) as Promise < ServiceMap [ T ] > ;
38+ async getService < Name extends string > (
39+ type : Name ,
40+ timeoutMs = 30000
41+ ) : Promise < ServiceMap [ Name ] > {
42+ if ( this . services [ type ] ) {
43+ return this . services [ type ] ;
4144 }
4245
43- // Find the provider
44- const provider = this . providers . find ( p => {
45- const temp = p ( this ) ;
46- if ( temp instanceof Promise ) {
47- return temp . then ( s => s . name === name ) ;
48- }
49- return temp . name === name ;
50- } ) ;
46+ // Create or return existing promise for this service
47+ if ( ! this . pendingServices . has ( type ) ) {
48+ this . pendingServices . set (
49+ type ,
50+ new Promise ( ( resolve , reject ) => {
51+ const timeoutId = setTimeout ( ( ) => {
52+ this . pendingServices . delete ( type ) ;
53+ reject ( new Error ( `Timeout waiting for service: ${ type } ` ) ) ;
54+ } , timeoutMs ) ;
5155
52- if ( ! provider ) {
53- throw new Error ( `Service ${ String ( name ) } not found` ) ;
56+ const checkInterval = setInterval ( ( ) => {
57+ if ( this . services [ type ] ) {
58+ clearTimeout ( timeoutId ) ;
59+ clearInterval ( checkInterval ) ;
60+ resolve ( this . services [ type ] ) ;
61+ }
62+ } , 100 ) ;
63+ } )
64+ ) ;
5465 }
5566
56- // Initialize the service
57- const promise = Promise . resolve ( provider ( this ) ) . then ( service => {
58- this . services [ name ] = service ;
59- this . initPromises . delete ( String ( name ) ) ;
60- return service as ServiceMap [ T ] ;
61- } ) ;
62-
63- this . initPromises . set ( String ( name ) , promise ) ;
64- return promise ;
67+ return this . pendingServices . get ( type ) as Promise < ServiceMap [ Name ] > ;
6568 }
6669}
0 commit comments