@navios/di 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +87 -0
- package/README.md +117 -17
- package/lib/browser/container/abstract-container.d.mts +112 -0
- package/lib/browser/container/abstract-container.d.mts.map +1 -0
- package/lib/browser/container/abstract-container.mjs +100 -0
- package/lib/browser/container/abstract-container.mjs.map +1 -0
- package/lib/browser/container/container.d.mts +100 -0
- package/lib/browser/container/container.d.mts.map +1 -0
- package/lib/browser/container/container.mjs +424 -0
- package/lib/browser/container/container.mjs.map +1 -0
- package/lib/browser/container/scoped-container.d.mts +93 -0
- package/lib/browser/container/scoped-container.d.mts.map +1 -0
- package/lib/browser/container/scoped-container.mjs +119 -0
- package/lib/browser/container/scoped-container.mjs.map +1 -0
- package/lib/browser/decorators/factory.decorator.d.mts +26 -0
- package/lib/browser/decorators/factory.decorator.d.mts.map +1 -0
- package/lib/browser/decorators/factory.decorator.mjs +20 -0
- package/lib/browser/decorators/factory.decorator.mjs.map +1 -0
- package/lib/browser/decorators/injectable.decorator.d.mts +38 -0
- package/lib/browser/decorators/injectable.decorator.d.mts.map +1 -0
- package/lib/browser/decorators/injectable.decorator.mjs +21 -0
- package/lib/browser/decorators/injectable.decorator.mjs.map +1 -0
- package/lib/browser/enums/injectable-scope.enum.d.mts +18 -0
- package/lib/browser/enums/injectable-scope.enum.d.mts.map +1 -0
- package/lib/browser/enums/injectable-scope.enum.mjs +20 -0
- package/lib/browser/enums/injectable-scope.enum.mjs.map +1 -0
- package/lib/browser/enums/injectable-type.enum.d.mts +8 -0
- package/lib/browser/enums/injectable-type.enum.d.mts.map +1 -0
- package/lib/browser/enums/injectable-type.enum.mjs +10 -0
- package/lib/browser/enums/injectable-type.enum.mjs.map +1 -0
- package/lib/browser/errors/di-error.d.mts +43 -0
- package/lib/browser/errors/di-error.d.mts.map +1 -0
- package/lib/browser/errors/di-error.mjs +98 -0
- package/lib/browser/errors/di-error.mjs.map +1 -0
- package/lib/browser/event-emitter.d.mts +16 -0
- package/lib/browser/event-emitter.d.mts.map +1 -0
- package/lib/browser/event-emitter.mjs +320 -0
- package/lib/browser/event-emitter.mjs.map +1 -0
- package/lib/browser/index.d.mts +37 -1558
- package/lib/browser/index.mjs +29 -2749
- package/lib/browser/interfaces/container.interface.d.mts +59 -0
- package/lib/browser/interfaces/container.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/factory.interface.d.mts +14 -0
- package/lib/browser/interfaces/factory.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/on-service-destroy.interface.d.mts +7 -0
- package/lib/browser/interfaces/on-service-destroy.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/on-service-init.interface.d.mts +7 -0
- package/lib/browser/interfaces/on-service-init.interface.d.mts.map +1 -0
- package/lib/browser/internal/context/async-local-storage.browser.mjs +20 -0
- package/lib/browser/internal/context/async-local-storage.browser.mjs.map +1 -0
- package/lib/browser/internal/context/async-local-storage.d.mts +9 -0
- package/lib/browser/internal/context/async-local-storage.d.mts.map +1 -0
- package/lib/browser/internal/context/async-local-storage.types.d.mts +11 -0
- package/lib/browser/internal/context/async-local-storage.types.d.mts.map +1 -0
- package/lib/browser/internal/context/factory-context.d.mts +23 -0
- package/lib/browser/internal/context/factory-context.d.mts.map +1 -0
- package/lib/browser/internal/context/resolution-context.d.mts +43 -0
- package/lib/browser/internal/context/resolution-context.d.mts.map +1 -0
- package/lib/browser/internal/context/resolution-context.mjs +56 -0
- package/lib/browser/internal/context/resolution-context.mjs.map +1 -0
- package/lib/browser/internal/context/service-initialization-context.d.mts +48 -0
- package/lib/browser/internal/context/service-initialization-context.d.mts.map +1 -0
- package/lib/browser/internal/context/sync-local-storage.mjs +53 -0
- package/lib/browser/internal/context/sync-local-storage.mjs.map +1 -0
- package/lib/browser/internal/core/instance-resolver.d.mts +119 -0
- package/lib/browser/internal/core/instance-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/instance-resolver.mjs +306 -0
- package/lib/browser/internal/core/instance-resolver.mjs.map +1 -0
- package/lib/browser/internal/core/name-resolver.d.mts +52 -0
- package/lib/browser/internal/core/name-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/name-resolver.mjs +118 -0
- package/lib/browser/internal/core/name-resolver.mjs.map +1 -0
- package/lib/browser/internal/core/scope-tracker.d.mts +65 -0
- package/lib/browser/internal/core/scope-tracker.d.mts.map +1 -0
- package/lib/browser/internal/core/scope-tracker.mjs +120 -0
- package/lib/browser/internal/core/scope-tracker.mjs.map +1 -0
- package/lib/browser/internal/core/service-initializer.d.mts +44 -0
- package/lib/browser/internal/core/service-initializer.d.mts.map +1 -0
- package/lib/browser/internal/core/service-initializer.mjs +109 -0
- package/lib/browser/internal/core/service-initializer.mjs.map +1 -0
- package/lib/browser/internal/core/service-invalidator.d.mts +81 -0
- package/lib/browser/internal/core/service-invalidator.d.mts.map +1 -0
- package/lib/browser/internal/core/service-invalidator.mjs +142 -0
- package/lib/browser/internal/core/service-invalidator.mjs.map +1 -0
- package/lib/browser/internal/core/token-resolver.d.mts +54 -0
- package/lib/browser/internal/core/token-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/token-resolver.mjs +77 -0
- package/lib/browser/internal/core/token-resolver.mjs.map +1 -0
- package/lib/browser/internal/holder/holder-storage.interface.d.mts +99 -0
- package/lib/browser/internal/holder/holder-storage.interface.d.mts.map +1 -0
- package/lib/browser/internal/holder/instance-holder.d.mts +101 -0
- package/lib/browser/internal/holder/instance-holder.d.mts.map +1 -0
- package/lib/browser/internal/holder/instance-holder.mjs +19 -0
- package/lib/browser/internal/holder/instance-holder.mjs.map +1 -0
- package/lib/browser/internal/holder/unified-storage.d.mts +53 -0
- package/lib/browser/internal/holder/unified-storage.d.mts.map +1 -0
- package/lib/browser/internal/holder/unified-storage.mjs +144 -0
- package/lib/browser/internal/holder/unified-storage.mjs.map +1 -0
- package/lib/browser/internal/lifecycle/circular-detector.d.mts +39 -0
- package/lib/browser/internal/lifecycle/circular-detector.d.mts.map +1 -0
- package/lib/browser/internal/lifecycle/circular-detector.mjs +55 -0
- package/lib/browser/internal/lifecycle/circular-detector.mjs.map +1 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.d.mts +18 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.d.mts.map +1 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.mjs +43 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.mjs.map +1 -0
- package/lib/browser/internal/stub-factory-class.d.mts +14 -0
- package/lib/browser/internal/stub-factory-class.d.mts.map +1 -0
- package/lib/browser/internal/stub-factory-class.mjs +18 -0
- package/lib/browser/internal/stub-factory-class.mjs.map +1 -0
- package/lib/browser/symbols/injectable-token.d.mts +5 -0
- package/lib/browser/symbols/injectable-token.d.mts.map +1 -0
- package/lib/browser/symbols/injectable-token.mjs +6 -0
- package/lib/browser/symbols/injectable-token.mjs.map +1 -0
- package/lib/browser/token/injection-token.d.mts +55 -0
- package/lib/browser/token/injection-token.d.mts.map +1 -0
- package/lib/browser/token/injection-token.mjs +100 -0
- package/lib/browser/token/injection-token.mjs.map +1 -0
- package/lib/browser/token/registry.d.mts +37 -0
- package/lib/browser/token/registry.d.mts.map +1 -0
- package/lib/browser/token/registry.mjs +86 -0
- package/lib/browser/token/registry.mjs.map +1 -0
- package/lib/browser/utils/default-injectors.d.mts +12 -0
- package/lib/browser/utils/default-injectors.d.mts.map +1 -0
- package/lib/browser/utils/default-injectors.mjs +13 -0
- package/lib/browser/utils/default-injectors.mjs.map +1 -0
- package/lib/browser/utils/get-injectable-token.d.mts +9 -0
- package/lib/browser/utils/get-injectable-token.d.mts.map +1 -0
- package/lib/browser/utils/get-injectable-token.mjs +13 -0
- package/lib/browser/utils/get-injectable-token.mjs.map +1 -0
- package/lib/browser/utils/get-injectors.d.mts +55 -0
- package/lib/browser/utils/get-injectors.d.mts.map +1 -0
- package/lib/browser/utils/get-injectors.mjs +121 -0
- package/lib/browser/utils/get-injectors.mjs.map +1 -0
- package/lib/browser/utils/types.d.mts +23 -0
- package/lib/browser/utils/types.d.mts.map +1 -0
- package/lib/{container-DAKOvAgr.mjs → container-8-z89TyQ.mjs} +1325 -1462
- package/lib/container-8-z89TyQ.mjs.map +1 -0
- package/lib/{container-Bp1W-pWJ.d.mts → container-CNiqesCL.d.mts} +598 -617
- package/lib/container-CNiqesCL.d.mts.map +1 -0
- package/lib/{container-DENMeJ87.cjs → container-CaY2fDuk.cjs} +1369 -1512
- package/lib/container-CaY2fDuk.cjs.map +1 -0
- package/lib/{container-YPwvmlK2.d.cts → container-D-0Ho3qL.d.cts} +598 -612
- package/lib/container-D-0Ho3qL.d.cts.map +1 -0
- package/lib/index.cjs +13 -15
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +58 -223
- package/lib/index.d.cts.map +1 -1
- package/lib/index.d.mts +62 -222
- package/lib/index.d.mts.map +1 -1
- package/lib/index.mjs +5 -6
- package/lib/index.mjs.map +1 -1
- package/lib/testing/index.cjs +569 -311
- package/lib/testing/index.cjs.map +1 -1
- package/lib/testing/index.d.cts +370 -41
- package/lib/testing/index.d.cts.map +1 -1
- package/lib/testing/index.d.mts +370 -41
- package/lib/testing/index.d.mts.map +1 -1
- package/lib/testing/index.mjs +568 -305
- package/lib/testing/index.mjs.map +1 -1
- package/package.json +2 -1
- package/src/__tests__/circular-detector.spec.mts +193 -0
- package/src/__tests__/concurrent.spec.mts +368 -0
- package/src/__tests__/container.spec.mts +32 -30
- package/src/__tests__/di-error.spec.mts +351 -0
- package/src/__tests__/e2e.browser.spec.mts +0 -4
- package/src/__tests__/e2e.spec.mts +10 -19
- package/src/__tests__/event-emitter.spec.mts +232 -109
- package/src/__tests__/get-injectors.spec.mts +250 -39
- package/src/__tests__/injection-token.spec.mts +293 -349
- package/src/__tests__/library-findings.spec.mts +8 -8
- package/src/__tests__/registry.spec.mts +358 -210
- package/src/__tests__/resolution-context.spec.mts +255 -0
- package/src/__tests__/scope-tracker.spec.mts +598 -0
- package/src/__tests__/scope-upgrade.spec.mts +808 -0
- package/src/__tests__/scoped-container.spec.mts +595 -0
- package/src/__tests__/test-container.spec.mts +293 -0
- package/src/__tests__/token-resolver.spec.mts +207 -0
- package/src/__tests__/unified-storage.spec.mts +535 -0
- package/src/__tests__/unit-test-container.spec.mts +405 -0
- package/src/__type-tests__/container.spec-d.mts +180 -0
- package/src/__type-tests__/factory.spec-d.mts +15 -3
- package/src/__type-tests__/inject.spec-d.mts +115 -20
- package/src/__type-tests__/injectable.spec-d.mts +69 -52
- package/src/__type-tests__/injection-token.spec-d.mts +176 -0
- package/src/__type-tests__/scoped-container.spec-d.mts +212 -0
- package/src/container/abstract-container.mts +327 -0
- package/src/container/container.mts +142 -170
- package/src/container/scoped-container.mts +126 -208
- package/src/decorators/factory.decorator.mts +16 -11
- package/src/decorators/injectable.decorator.mts +20 -16
- package/src/enums/index.mts +2 -2
- package/src/enums/injectable-scope.enum.mts +1 -0
- package/src/enums/injectable-type.enum.mts +1 -0
- package/src/errors/di-error.mts +96 -0
- package/src/event-emitter.mts +3 -27
- package/src/index.mts +6 -153
- package/src/interfaces/container.interface.mts +13 -0
- package/src/interfaces/factory.interface.mts +1 -1
- package/src/interfaces/index.mts +1 -1
- package/src/internal/context/async-local-storage.mts +3 -2
- package/src/internal/context/async-local-storage.types.mts +1 -0
- package/src/internal/context/factory-context.mts +1 -0
- package/src/internal/context/index.mts +3 -1
- package/src/internal/context/resolution-context.mts +1 -0
- package/src/internal/context/service-initialization-context.mts +43 -0
- package/src/internal/core/index.mts +5 -4
- package/src/internal/core/instance-resolver.mts +460 -302
- package/src/internal/core/name-resolver.mts +196 -0
- package/src/internal/core/scope-tracker.mts +242 -0
- package/src/internal/core/{instantiator.mts → service-initializer.mts} +51 -29
- package/src/internal/core/service-invalidator.mts +290 -0
- package/src/internal/core/token-resolver.mts +122 -0
- package/src/internal/holder/holder-storage.interface.mts +11 -5
- package/src/internal/holder/index.mts +2 -5
- package/src/internal/holder/instance-holder.mts +1 -3
- package/src/internal/holder/unified-storage.mts +245 -0
- package/src/internal/index.mts +2 -1
- package/src/internal/lifecycle/circular-detector.mts +1 -0
- package/src/internal/lifecycle/index.mts +1 -1
- package/src/internal/lifecycle/lifecycle-event-bus.mts +1 -0
- package/src/internal/stub-factory-class.mts +16 -0
- package/src/symbols/injectable-token.mts +3 -1
- package/src/testing/index.mts +2 -0
- package/src/testing/test-container.mts +546 -85
- package/src/testing/types.mts +117 -0
- package/src/testing/unit-test-container.mts +509 -0
- package/src/token/injection-token.mts +41 -4
- package/src/token/registry.mts +75 -9
- package/src/utils/default-injectors.mts +16 -0
- package/src/utils/get-injectable-token.mts +2 -3
- package/src/utils/get-injectors.mts +26 -15
- package/src/utils/index.mts +3 -1
- package/src/utils/types.mts +1 -0
- package/tsdown.config.mts +11 -1
- package/lib/browser/index.d.mts.map +0 -1
- package/lib/browser/index.mjs.map +0 -1
- package/lib/container-Bp1W-pWJ.d.mts.map +0 -1
- package/lib/container-DAKOvAgr.mjs.map +0 -1
- package/lib/container-DENMeJ87.cjs.map +0 -1
- package/lib/container-YPwvmlK2.d.cts.map +0 -1
- package/src/__tests__/async-local-storage.browser.spec.mts +0 -166
- package/src/__tests__/async-local-storage.spec.mts +0 -333
- package/src/__tests__/errors.spec.mts +0 -87
- package/src/__tests__/factory.spec.mts +0 -137
- package/src/__tests__/injectable.spec.mts +0 -246
- package/src/__tests__/request-scope.spec.mts +0 -416
- package/src/__tests__/service-instantiator.spec.mts +0 -410
- package/src/__tests__/service-locator-event-bus.spec.mts +0 -242
- package/src/__tests__/service-locator-manager.spec.mts +0 -300
- package/src/__tests__/service-locator.spec.mts +0 -966
- package/src/__tests__/unified-api.spec.mts +0 -130
- package/src/browser.mts +0 -11
- package/src/injectors.mts +0 -18
- package/src/internal/context/request-context.mts +0 -225
- package/src/internal/core/invalidator.mts +0 -437
- package/src/internal/core/service-locator.mts +0 -202
- package/src/internal/core/token-processor.mts +0 -252
- package/src/internal/holder/base-holder-manager.mts +0 -334
- package/src/internal/holder/holder-manager.mts +0 -85
- package/src/internal/holder/request-storage.mts +0 -127
- package/src/internal/holder/singleton-storage.mts +0 -92
- package/src/testing/README.md +0 -80
- package/src/testing/__tests__/test-container.spec.mts +0 -173
|
@@ -1,41 +1,57 @@
|
|
|
1
1
|
import type { z, ZodType } from 'zod/v4'
|
|
2
2
|
|
|
3
|
+
import type { Factorable } from '../interfaces/factory.interface.mjs'
|
|
3
4
|
import type {
|
|
4
5
|
ClassType,
|
|
5
6
|
ClassTypeWithArgument,
|
|
6
|
-
InjectionToken,
|
|
7
7
|
InjectionTokenSchemaType,
|
|
8
8
|
} from '../token/injection-token.mjs'
|
|
9
|
-
import type { IContainer } from '../interfaces/container.interface.mjs'
|
|
10
|
-
import type { Factorable } from '../interfaces/factory.interface.mjs'
|
|
11
9
|
import type { Registry } from '../token/registry.mjs'
|
|
12
|
-
import type {
|
|
13
|
-
import type { Injectors } from '../utils/index.mjs'
|
|
10
|
+
import type { Injectors } from '../utils/get-injectors.mjs'
|
|
14
11
|
import type { Join, UnionToArray } from '../utils/types.mjs'
|
|
15
12
|
|
|
16
13
|
import { Injectable } from '../decorators/injectable.decorator.mjs'
|
|
17
14
|
import { InjectableScope, InjectableType } from '../enums/index.mjs'
|
|
18
15
|
import { DIError } from '../errors/index.mjs'
|
|
16
|
+
import { InstanceResolver } from '../internal/core/instance-resolver.mjs'
|
|
17
|
+
import { NameResolver } from '../internal/core/name-resolver.mjs'
|
|
18
|
+
import { ScopeTracker } from '../internal/core/scope-tracker.mjs'
|
|
19
|
+
import { ServiceInitializer } from '../internal/core/service-initializer.mjs'
|
|
20
|
+
import { ServiceInvalidator } from '../internal/core/service-invalidator.mjs'
|
|
21
|
+
import { TokenResolver } from '../internal/core/token-resolver.mjs'
|
|
22
|
+
import { UnifiedStorage } from '../internal/holder/unified-storage.mjs'
|
|
23
|
+
import { LifecycleEventBus } from '../internal/lifecycle/lifecycle-event-bus.mjs'
|
|
19
24
|
import {
|
|
20
25
|
BoundInjectionToken,
|
|
21
26
|
FactoryInjectionToken,
|
|
27
|
+
InjectionToken,
|
|
22
28
|
} from '../token/injection-token.mjs'
|
|
23
|
-
import { defaultInjectors } from '../injectors.mjs'
|
|
24
29
|
import { globalRegistry } from '../token/registry.mjs'
|
|
30
|
+
import { defaultInjectors } from '../utils/default-injectors.mjs'
|
|
31
|
+
import { getInjectableToken } from '../utils/index.mjs'
|
|
32
|
+
import { AbstractContainer } from './abstract-container.mjs'
|
|
25
33
|
import { ScopedContainer } from './scoped-container.mjs'
|
|
26
|
-
import { ServiceLocator } from '../internal/core/service-locator.mjs'
|
|
27
|
-
import { getInjectableToken } from '../utils/get-injectable-token.mjs'
|
|
28
34
|
|
|
29
35
|
/**
|
|
30
36
|
* Main dependency injection container.
|
|
31
37
|
*
|
|
32
|
-
* Provides a simplified public API for dependency injection
|
|
33
|
-
*
|
|
38
|
+
* Provides a simplified public API for dependency injection.
|
|
39
|
+
* Handles singleton and transient services directly,
|
|
34
40
|
* while request-scoped services require using beginRequest() to create a ScopedContainer.
|
|
35
41
|
*/
|
|
36
42
|
@Injectable()
|
|
37
|
-
export class Container
|
|
38
|
-
|
|
43
|
+
export class Container extends AbstractContainer {
|
|
44
|
+
protected readonly defaultScope = InjectableScope.Singleton
|
|
45
|
+
protected readonly requestId = undefined
|
|
46
|
+
|
|
47
|
+
private readonly storage: UnifiedStorage
|
|
48
|
+
private readonly serviceInitializer: ServiceInitializer
|
|
49
|
+
private readonly serviceInvalidator: ServiceInvalidator
|
|
50
|
+
private readonly tokenResolver: TokenResolver
|
|
51
|
+
private readonly nameResolver: NameResolver
|
|
52
|
+
private readonly scopeTracker: ScopeTracker
|
|
53
|
+
private readonly eventBus: LifecycleEventBus
|
|
54
|
+
private readonly instanceResolver: InstanceResolver
|
|
39
55
|
private readonly activeRequestIds = new Set<string>()
|
|
40
56
|
|
|
41
57
|
constructor(
|
|
@@ -43,27 +59,48 @@ export class Container implements IContainer {
|
|
|
43
59
|
protected readonly logger: Console | null = null,
|
|
44
60
|
protected readonly injectors: Injectors = defaultInjectors,
|
|
45
61
|
) {
|
|
46
|
-
|
|
62
|
+
super()
|
|
63
|
+
// Initialize components
|
|
64
|
+
this.storage = new UnifiedStorage(InjectableScope.Singleton)
|
|
65
|
+
this.eventBus = new LifecycleEventBus(logger)
|
|
66
|
+
this.nameResolver = new NameResolver(logger)
|
|
67
|
+
this.tokenResolver = new TokenResolver(logger)
|
|
68
|
+
this.scopeTracker = new ScopeTracker(registry, this.nameResolver, logger)
|
|
69
|
+
this.serviceInitializer = new ServiceInitializer(injectors)
|
|
70
|
+
this.serviceInvalidator = new ServiceInvalidator(this.eventBus, logger)
|
|
71
|
+
this.instanceResolver = new InstanceResolver(
|
|
72
|
+
registry,
|
|
73
|
+
this.storage,
|
|
74
|
+
this.serviceInitializer,
|
|
75
|
+
this.tokenResolver,
|
|
76
|
+
this.nameResolver,
|
|
77
|
+
this.scopeTracker,
|
|
78
|
+
this.serviceInvalidator,
|
|
79
|
+
this.eventBus,
|
|
80
|
+
logger,
|
|
81
|
+
)
|
|
47
82
|
this.registerSelf()
|
|
48
83
|
}
|
|
49
84
|
|
|
50
85
|
private registerSelf() {
|
|
51
86
|
const token = getInjectableToken(Container)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
87
|
+
this.registry.set(
|
|
88
|
+
token,
|
|
89
|
+
InjectableScope.Singleton,
|
|
90
|
+
Container,
|
|
91
|
+
InjectableType.Class,
|
|
92
|
+
)
|
|
93
|
+
const instanceName = this.nameResolver.generateInstanceName(
|
|
94
|
+
token,
|
|
95
|
+
undefined,
|
|
96
|
+
undefined,
|
|
97
|
+
InjectableScope.Singleton,
|
|
98
|
+
)
|
|
99
|
+
this.storage.storeInstance(instanceName, this)
|
|
61
100
|
}
|
|
62
101
|
|
|
63
102
|
/**
|
|
64
103
|
* Gets an instance from the container.
|
|
65
|
-
* This method has the same type signature as the inject method from get-injectors.mts
|
|
66
|
-
*
|
|
67
104
|
* NOTE: Request-scoped services cannot be resolved directly from Container.
|
|
68
105
|
* Use beginRequest() to create a ScopedContainer for request-scoped services.
|
|
69
106
|
*/
|
|
@@ -78,7 +115,6 @@ export class Container implements IContainer {
|
|
|
78
115
|
token: T,
|
|
79
116
|
args: R,
|
|
80
117
|
): Promise<InstanceType<T>>
|
|
81
|
-
|
|
82
118
|
// #2 Token with required Schema
|
|
83
119
|
get<T, S extends InjectionTokenSchemaType>(
|
|
84
120
|
token: InjectionToken<T, S>,
|
|
@@ -109,211 +145,147 @@ export class Container implements IContainer {
|
|
|
109
145
|
args?: unknown,
|
|
110
146
|
) {
|
|
111
147
|
// Check if this is a request-scoped service
|
|
112
|
-
|
|
113
|
-
const tokenProcessor = this.serviceLocator.getTokenProcessor()
|
|
114
|
-
const realToken = tokenProcessor.getRegistryToken(token)
|
|
148
|
+
const realToken = this.tokenResolver.getRegistryToken(token)
|
|
115
149
|
|
|
116
150
|
if (this.registry.has(realToken)) {
|
|
117
151
|
const record = this.registry.get(realToken)
|
|
118
152
|
if (record.scope === InjectableScope.Request) {
|
|
119
|
-
throw DIError.
|
|
120
|
-
|
|
121
|
-
|
|
153
|
+
throw DIError.scopeMismatchError(
|
|
154
|
+
realToken.name,
|
|
155
|
+
'ScopedContainer',
|
|
156
|
+
'Container',
|
|
122
157
|
)
|
|
123
158
|
}
|
|
124
159
|
}
|
|
125
160
|
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Gets an instance with a specific container context.
|
|
131
|
-
* Used by ScopedContainer to delegate singleton/transient resolution
|
|
132
|
-
* while maintaining the correct container context for nested inject() calls.
|
|
133
|
-
*
|
|
134
|
-
* @internal
|
|
135
|
-
*/
|
|
136
|
-
async getWithContext(
|
|
137
|
-
token:
|
|
138
|
-
| ClassType
|
|
139
|
-
| InjectionToken<any>
|
|
140
|
-
| BoundInjectionToken<any, any>
|
|
141
|
-
| FactoryInjectionToken<any, any>,
|
|
142
|
-
args: unknown,
|
|
143
|
-
contextContainer: IContainer,
|
|
144
|
-
): Promise<any> {
|
|
145
|
-
return this.serviceLocator.getOrThrowInstance(
|
|
161
|
+
const [error, instance] = await this.instanceResolver.resolveInstance(
|
|
146
162
|
token,
|
|
147
|
-
args
|
|
148
|
-
|
|
149
|
-
)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Resolves a request-scoped service for a ScopedContainer.
|
|
154
|
-
* The service will be stored in the ScopedContainer's request context.
|
|
155
|
-
*
|
|
156
|
-
* @internal
|
|
157
|
-
*/
|
|
158
|
-
async resolveForRequest(
|
|
159
|
-
token:
|
|
160
|
-
| ClassType
|
|
161
|
-
| InjectionToken<any>
|
|
162
|
-
| BoundInjectionToken<any, any>
|
|
163
|
-
| FactoryInjectionToken<any, any>,
|
|
164
|
-
args: unknown,
|
|
165
|
-
scopedContainer: ScopedContainer,
|
|
166
|
-
): Promise<any> {
|
|
167
|
-
return this.serviceLocator.resolveRequestScoped(
|
|
168
|
-
token,
|
|
169
|
-
args as any,
|
|
170
|
-
scopedContainer,
|
|
163
|
+
args,
|
|
164
|
+
this,
|
|
171
165
|
)
|
|
172
|
-
}
|
|
173
166
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
getServiceLocator(): ServiceLocator {
|
|
178
|
-
return this.serviceLocator
|
|
179
|
-
}
|
|
167
|
+
if (error) {
|
|
168
|
+
throw error
|
|
169
|
+
}
|
|
180
170
|
|
|
181
|
-
|
|
182
|
-
* Gets the registry
|
|
183
|
-
*/
|
|
184
|
-
getRegistry(): Registry {
|
|
185
|
-
return this.registry
|
|
171
|
+
return instance
|
|
186
172
|
}
|
|
187
173
|
|
|
188
174
|
/**
|
|
189
|
-
* Invalidates a service and its dependencies
|
|
175
|
+
* Invalidates a service and its dependencies.
|
|
190
176
|
*/
|
|
191
177
|
async invalidate(service: unknown): Promise<void> {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
178
|
+
// Find the service by instance
|
|
179
|
+
const holder = this.storage.findByInstance(service)
|
|
180
|
+
if (!holder) {
|
|
181
|
+
this.logger?.warn(
|
|
182
|
+
`[Container] Service instance not found for invalidation`,
|
|
183
|
+
)
|
|
184
|
+
return
|
|
195
185
|
}
|
|
196
|
-
}
|
|
197
186
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
private getHolderByInstance(
|
|
202
|
-
instance: unknown,
|
|
203
|
-
): InstanceHolder | null {
|
|
204
|
-
const holderMap = Array.from(
|
|
205
|
-
this.serviceLocator
|
|
206
|
-
.getManager()
|
|
207
|
-
.filter((holder) => holder.instance === instance)
|
|
208
|
-
.values(),
|
|
187
|
+
await this.serviceInvalidator.invalidateWithStorage(
|
|
188
|
+
holder.name,
|
|
189
|
+
this.storage,
|
|
209
190
|
)
|
|
210
|
-
|
|
211
|
-
return holderMap.length > 0 ? holderMap[0] : null
|
|
212
191
|
}
|
|
213
192
|
|
|
214
193
|
/**
|
|
215
|
-
*
|
|
216
|
-
*/
|
|
217
|
-
isRegistered(token: any): boolean {
|
|
218
|
-
try {
|
|
219
|
-
return this.serviceLocator.getInstanceIdentifier(token) !== null
|
|
220
|
-
} catch {
|
|
221
|
-
return false
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Disposes the container and cleans up all resources
|
|
194
|
+
* Disposes the container and cleans up all resources.
|
|
227
195
|
*/
|
|
228
196
|
async dispose(): Promise<void> {
|
|
229
|
-
await this.
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Waits for all pending operations to complete
|
|
234
|
-
*/
|
|
235
|
-
async ready(): Promise<void> {
|
|
236
|
-
await this.serviceLocator.ready()
|
|
197
|
+
await this.serviceInvalidator.clearAllWithStorage(this.storage)
|
|
237
198
|
}
|
|
238
199
|
|
|
239
200
|
/**
|
|
240
201
|
* @internal
|
|
241
202
|
* Attempts to get an instance synchronously if it already exists.
|
|
242
|
-
*
|
|
203
|
+
* Overrides base class to support requestId parameter for ScopedContainer compatibility.
|
|
243
204
|
*/
|
|
244
|
-
tryGetSync<T>(token: any, args?: any): T | null {
|
|
245
|
-
return this.
|
|
205
|
+
override tryGetSync<T>(token: any, args?: any, requestId?: string): T | null {
|
|
206
|
+
return this.tryGetSyncFromStorage(
|
|
207
|
+
token,
|
|
208
|
+
args,
|
|
209
|
+
this.storage,
|
|
210
|
+
requestId ?? this.requestId,
|
|
211
|
+
)
|
|
246
212
|
}
|
|
247
213
|
|
|
248
|
-
// ============================================================================
|
|
249
|
-
// REQUEST CONTEXT MANAGEMENT
|
|
250
|
-
// ============================================================================
|
|
251
|
-
|
|
252
214
|
/**
|
|
253
215
|
* Begins a new request context and returns a ScopedContainer.
|
|
254
|
-
*
|
|
255
|
-
* The ScopedContainer provides isolated request-scoped service resolution
|
|
256
|
-
* while delegating singleton and transient services to this Container.
|
|
257
|
-
*
|
|
258
|
-
* @param requestId Unique identifier for this request
|
|
259
|
-
* @param metadata Optional metadata for the request
|
|
260
|
-
* @param priority Priority for resolution (higher = more priority)
|
|
261
|
-
* @returns A ScopedContainer for this request
|
|
262
216
|
*/
|
|
263
217
|
beginRequest(
|
|
264
218
|
requestId: string,
|
|
265
219
|
metadata?: Record<string, any>,
|
|
266
|
-
priority: number = 100,
|
|
267
220
|
): ScopedContainer {
|
|
268
221
|
if (this.activeRequestIds.has(requestId)) {
|
|
269
|
-
throw
|
|
270
|
-
`Request context "${requestId}" already exists. Use a unique request ID.`,
|
|
271
|
-
)
|
|
222
|
+
throw new Error(`Request with ID ${requestId} already exists`)
|
|
272
223
|
}
|
|
273
224
|
|
|
274
225
|
this.activeRequestIds.add(requestId)
|
|
275
226
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
return new ScopedContainer(
|
|
279
|
-
this,
|
|
280
|
-
this.registry,
|
|
281
|
-
requestId,
|
|
282
|
-
metadata,
|
|
283
|
-
priority,
|
|
284
|
-
)
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* Removes a request ID from the active set.
|
|
289
|
-
* Called by ScopedContainer when the request ends.
|
|
290
|
-
*
|
|
291
|
-
* @internal
|
|
292
|
-
*/
|
|
293
|
-
removeActiveRequest(requestId: string): void {
|
|
294
|
-
this.activeRequestIds.delete(requestId)
|
|
295
|
-
this.logger?.log(`[Container] Ended request context: ${requestId}`)
|
|
227
|
+
return new ScopedContainer(this, this.registry, requestId, metadata)
|
|
296
228
|
}
|
|
297
229
|
|
|
298
230
|
/**
|
|
299
|
-
* Gets
|
|
231
|
+
* Gets all active request IDs.
|
|
300
232
|
*/
|
|
301
233
|
getActiveRequestIds(): ReadonlySet<string> {
|
|
302
234
|
return this.activeRequestIds
|
|
303
235
|
}
|
|
304
236
|
|
|
305
237
|
/**
|
|
306
|
-
* Checks if a request
|
|
238
|
+
* Checks if a request is active.
|
|
307
239
|
*/
|
|
308
240
|
hasActiveRequest(requestId: string): boolean {
|
|
309
241
|
return this.activeRequestIds.has(requestId)
|
|
310
242
|
}
|
|
311
243
|
|
|
312
244
|
/**
|
|
313
|
-
*
|
|
314
|
-
*
|
|
245
|
+
* Removes a request ID from active requests.
|
|
246
|
+
* Called by ScopedContainer when request ends.
|
|
315
247
|
*/
|
|
316
|
-
|
|
317
|
-
|
|
248
|
+
removeRequestId(requestId: string): void {
|
|
249
|
+
this.activeRequestIds.delete(requestId)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// ============================================================================
|
|
253
|
+
// INTERNAL METHODS FOR COMPONENT ACCESS
|
|
254
|
+
// ============================================================================
|
|
255
|
+
|
|
256
|
+
getStorage(): UnifiedStorage {
|
|
257
|
+
return this.storage
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
getServiceInitializer(): ServiceInitializer {
|
|
261
|
+
return this.serviceInitializer
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
getServiceInvalidator(): ServiceInvalidator {
|
|
265
|
+
return this.serviceInvalidator
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
getTokenResolver(): TokenResolver {
|
|
269
|
+
return this.tokenResolver
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
getNameResolver(): NameResolver {
|
|
273
|
+
return this.nameResolver
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
getScopeTracker(): ScopeTracker {
|
|
277
|
+
return this.scopeTracker
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
getEventBus(): LifecycleEventBus {
|
|
281
|
+
return this.eventBus
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
getRegistry(): Registry {
|
|
285
|
+
return this.registry
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
getInstanceResolver(): InstanceResolver {
|
|
289
|
+
return this.instanceResolver
|
|
318
290
|
}
|
|
319
291
|
}
|