From d73f619f96072f2095589119251830202e60e6da Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Mon, 17 Feb 2025 13:13:20 +0100 Subject: [PATCH 1/2] Remove configure empty config requirement for NoConfig modules --- packages/common/src/config/ModuleContainer.ts | 69 ++++++++++++++++--- .../test/config/ModuleContainer.test.ts | 4 ++ 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/packages/common/src/config/ModuleContainer.ts b/packages/common/src/config/ModuleContainer.ts index 8d46c99a9..aa305539b 100644 --- a/packages/common/src/config/ModuleContainer.ts +++ b/packages/common/src/config/ModuleContainer.ts @@ -85,18 +85,39 @@ export interface ModulesRecord< [name: string]: ModuleType; } -// config record derived from the provided modules and their config types -export type ModulesConfig = { - // this will translate into = key: module name, value: module.config - [ConfigKey in StringKeyOf]: InstanceType< - Modules[ConfigKey] - > extends Configurable +type ExtractConfig = + InstanceType extends Configurable ? Config extends NoConfig ? Config | undefined : Config : never; + +type OnlyDefined> = { + [Key in keyof R as NoConfig extends R[Key] ? never : Key]: R[Key]; +}; +type OptionalUndefined> = { + [Key in keyof R as NoConfig extends R[Key] ? Key : never]?: R[Key]; +}; + +type MakeNoConfigOptional> = OnlyDefined & + OptionalUndefined; + +export type CompletedModulesConfig = { + // this will translate into = key: module name, value: module.config + [ConfigKey in StringKeyOf]: ExtractConfig; }; +// config record derived from the provided modules and their config types +export type ModulesConfig = MakeNoConfigOptional< + CompletedModulesConfig +>; + +// export type MakeNeeded + +// export type ShortConfig = +// ModulesConfig +// >; + /** * This type make any config partial (i.e. optional) up to the first level * So { Module: { a: { b: string } } } @@ -287,6 +308,26 @@ export class ModuleContainer }); } + private completeConfig( + config: ModulesConfig + ): ModulesConfig { + const keys = Object.keys(config); + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const moduleNames = this.moduleNames as StringKeyOf[]; + const noConfigParts = moduleNames + .filter((moduleName) => !keys.includes(moduleName)) + .reduce>((obj, moduleName) => { + obj[moduleName] = {}; + return obj; + }, {}); + + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + return { + ...config, + ...noConfigParts, + } as unknown as ModulesConfig; + } + /** * Provide additional configuration after the ModuleContainer was created. * @@ -296,7 +337,7 @@ export class ModuleContainer * @param config */ public configure(config: ModulesConfig) { - this.config = config; + this.config = this.completeConfig(config); } public configurePartial(config: RecursivePartial>) { @@ -314,8 +355,14 @@ export class ModuleContainer super.config = merge< ModulesConfig | NoConfig, ModulesConfig - >(this.currentConfig ?? {}, config); + >(this.currentConfig ?? {}, this.completeConfig(config)); } + // public set config(config: ShortConfig) { + // super.config = merge | NoConfig, ShortConfig>( + // this.currentConfig ?? {}, + // config + // ); + // } /** * Resolves a module from the current module container @@ -364,7 +411,11 @@ export class ModuleContainer moduleName: StringKeyOf, containedModule: InstanceType]> ) { - const config = super.config?.[moduleName]; + const config = + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + (super.config as unknown as CompletedModulesConfig)?.[ + moduleName + ]; // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (!config) { throw errors.configNotSetInContainer(moduleName.toString()); diff --git a/packages/common/test/config/ModuleContainer.test.ts b/packages/common/test/config/ModuleContainer.test.ts index 669ca0591..cb1d6232f 100644 --- a/packages/common/test/config/ModuleContainer.test.ts +++ b/packages/common/test/config/ModuleContainer.test.ts @@ -50,6 +50,8 @@ class TestModule } } +class NoConfigModule extends BaseTestModule {} + interface OtherTestModuleConfig { otherTestConfigProperty: number; } @@ -79,6 +81,7 @@ describe("moduleContainer", () => { let container: TestModuleContainer<{ TestModule: typeof TestModule; OtherTestModule: typeof OtherTestModule; + NoConfigModule: typeof NoConfigModule; }>; const testConfigProperty = 0; @@ -88,6 +91,7 @@ describe("moduleContainer", () => { OtherTestModule, // this module would not be assignable to TestModuleContainer // WrongTestModule, + NoConfigModule, }); }); From 90083c43325a3c393f2a2d1566fea2f69b301e70 Mon Sep 17 00:00:00 2001 From: Raphael Panic Date: Mon, 17 Feb 2025 13:13:54 +0100 Subject: [PATCH 2/2] Made OpenTelemetryServer closeable --- packages/api/src/metrics/OpenTelemetryServer.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/api/src/metrics/OpenTelemetryServer.ts b/packages/api/src/metrics/OpenTelemetryServer.ts index f76f850fd..5ae060966 100644 --- a/packages/api/src/metrics/OpenTelemetryServer.ts +++ b/packages/api/src/metrics/OpenTelemetryServer.ts @@ -1,4 +1,6 @@ import { + closeable, + Closeable, Sequencer, SequencerModule, sequencerModule, @@ -32,7 +34,13 @@ export type OpenTelemetryServerConfig = { }; @sequencerModule() -export class OpenTelemetryServer extends SequencerModule { +@closeable() +export class OpenTelemetryServer + extends SequencerModule + implements Closeable +{ + private sdk?: NodeSDK; + public constructor( @inject("Sequencer") private readonly sequencer: Sequencer ) { @@ -89,12 +97,17 @@ export class OpenTelemetryServer extends SequencerModule