| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import { evaluateFirstAllowed, evaluateRequest, PolicyEngine } from "../domain/policyEngine"; |
| import { getDbInstance } from "./db/core"; |
| import { |
| decrypt, |
| decryptConnectionFields, |
| encrypt, |
| encryptConnectionFields, |
| } from "./db/encryption"; |
| import { getSettings } from "./localDb"; |
| import { getCircuitBreaker } from "../shared/utils/circuitBreaker"; |
| import { recordTelemetry, RequestTelemetry } from "../shared/utils/requestTelemetry"; |
|
|
| type Factory<T = any> = () => T; |
|
|
| class Container { |
| private _factories = new Map<string, Factory>(); |
| private _instances = new Map<string, any>(); |
|
|
| |
| |
| |
| register<T>(name: string, factory: Factory<T>): void { |
| this._factories.set(name, factory); |
| |
| this._instances.delete(name); |
| } |
|
|
| |
| |
| |
| |
| resolve<T = any>(name: string): T { |
| if (this._instances.has(name)) { |
| return this._instances.get(name) as T; |
| } |
|
|
| const factory = this._factories.get(name); |
| if (!factory) { |
| throw new Error(`[Container] No factory registered for "${name}"`); |
| } |
|
|
| const instance = factory(); |
| this._instances.set(name, instance); |
| return instance as T; |
| } |
|
|
| |
| |
| |
| has(name: string): boolean { |
| return this._factories.has(name); |
| } |
|
|
| |
| |
| |
| list(): string[] { |
| return Array.from(this._factories.keys()); |
| } |
|
|
| |
| |
| |
| reset(): void { |
| this._factories.clear(); |
| this._instances.clear(); |
| } |
| } |
|
|
| |
| export const container = new Container(); |
|
|
| |
| |
|
|
| container.register("settings", () => { |
| return { get: getSettings }; |
| }); |
|
|
| container.register("db", () => { |
| return getDbInstance(); |
| }); |
|
|
| container.register("encryption", () => { |
| return { |
| encrypt, |
| decrypt, |
| encryptConnectionFields, |
| decryptConnectionFields, |
| }; |
| }); |
|
|
| container.register("policyEngine", () => { |
| return { evaluateRequest, evaluateFirstAllowed, PolicyEngine }; |
| }); |
|
|
| container.register("circuitBreaker", () => { |
| return { get: getCircuitBreaker }; |
| }); |
|
|
| container.register("telemetry", () => { |
| return { RequestTelemetry, recordTelemetry }; |
| }); |
|
|
| export default container; |
|
|