From 7d482b5e74217a50b70de5249babeb23e98cc8c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20K=C3=B6nig?= <33655937+jkoenig134@users.noreply.github.com> Date: Thu, 19 Sep 2024 17:52:12 +0200 Subject: [PATCH] Use `correlation-id` package only for testing (#276) * fix: cleanup transport * chore: update package-lock * fix: cleanup runtime * fix: correct DI usage * fix: export abstractCorrelator * fix: handle strange DI behaviour --- package-lock.json | 3 +- packages/runtime/src/Runtime.ts | 16 ++++++-- .../src/useCases/common/AbstractCorrelator.ts | 10 +++++ .../runtime/src/useCases/common/UseCase.ts | 41 +++++++++++-------- packages/runtime/src/useCases/index.ts | 1 + .../test/lib/RuntimeServiceProvider.ts | 12 ++++-- packages/runtime/test/lib/TestRuntime.ts | 7 +++- .../runtime/test/misc/CorrelationId.test.ts | 2 +- packages/transport/package.json | 2 +- packages/transport/src/core/ICorrelator.ts | 8 ++++ packages/transport/src/core/Transport.ts | 4 +- .../src/core/backbone/Authenticator.ts | 15 +++++-- .../transport/src/core/backbone/RESTClient.ts | 17 +++++--- .../core/backbone/RESTClientAuthenticate.ts | 4 +- packages/transport/src/core/index.ts | 1 + .../src/modules/accounts/AccountController.ts | 12 +++--- .../IdentityDeletionProcessController.ts | 2 +- .../BackboneCompatibilityController.ts | 9 ++-- .../modules/challenges/ChallengeController.ts | 4 +- .../src/modules/devices/DevicesController.ts | 2 +- .../src/modules/files/FileController.ts | 2 +- .../src/modules/messages/MessageController.ts | 2 +- .../RelationshipTemplateController.ts | 2 +- .../relationships/RelationshipsController.ts | 2 +- .../src/modules/sync/SyncController.ts | 2 +- .../src/modules/sync/backbone/SyncClient.ts | 6 +-- .../tokens/AnonymousTokenController.ts | 6 +-- .../src/modules/tokens/TokenController.ts | 2 +- .../test/core/backbone/CorrelationId.test.ts | 2 +- .../transport/test/testHelpers/TestUtil.ts | 5 ++- 30 files changed, 135 insertions(+), 68 deletions(-) create mode 100644 packages/runtime/src/useCases/common/AbstractCorrelator.ts create mode 100644 packages/transport/src/core/ICorrelator.ts diff --git a/package-lock.json b/package-lock.json index 44f05b45a..994af96a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3162,6 +3162,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/correlation-id/-/correlation-id-5.2.0.tgz", "integrity": "sha512-qTsYujgBvWIx05qF9HV4+KoezGTelgqJiFnyEfRsEqjpQUZdWnraOGHD+IMep7lPFg6MiI55fvpC4qruKdY5Dw==", + "dev": true, "engines": { "node": ">=14.17.0" } @@ -9419,7 +9420,6 @@ "@nmshd/core-types": "*", "@nmshd/crypto": "2.0.6", "axios": "^1.7.7", - "correlation-id": "^5.2.0", "fast-json-patch": "^3.1.1", "form-data": "^4.0.0", "https-proxy-agent": "^7.0.5", @@ -9441,6 +9441,7 @@ "@types/luxon": "^3.4.2", "@types/qs": "^6.9.16", "@types/uuid": "^10.0.0", + "correlation-id": "^5.2.0", "expect": "^29.7.0", "ts-mockito": "^2.6.1" } diff --git a/packages/runtime/src/Runtime.ts b/packages/runtime/src/Runtime.ts index ad47f2c2d..4b6da8bb2 100644 --- a/packages/runtime/src/Runtime.ts +++ b/packages/runtime/src/Runtime.ts @@ -42,6 +42,7 @@ import { RuntimeConfig } from "./RuntimeConfig"; import { RuntimeLoggerFactory } from "./RuntimeLoggerFactory"; import { RuntimeHealth } from "./types"; import { RuntimeErrors } from "./useCases"; +import { AbstractCorrelator } from "./useCases/common/AbstractCorrelator"; import { SchemaRepository } from "./useCases/common/SchemaRepository"; export interface RuntimeServices { @@ -111,7 +112,8 @@ export abstract class Runtime { public constructor( protected runtimeConfig: TConfig, protected loggerFactory: ILoggerFactory, - eventBus?: EventBus + eventBus?: EventBus, + protected correlator?: AbstractCorrelator ) { this._logger = this.loggerFactory.getLogger(this.constructor.name); @@ -184,7 +186,7 @@ export abstract class Runtime { this.logger.error(`An error was thrown in an event handler of the transport event bus (namespace: '${namespace}'). Root error: ${error}`); }); - this.transport = new Transport(databaseConnection, transportConfig, eventBus, this.loggerFactory); + this.transport = new Transport(databaseConnection, transportConfig, eventBus, this.loggerFactory, this.correlator); this.logger.debug("Initializing Transport Library..."); await this.transport.init(); @@ -202,6 +204,12 @@ export abstract class Runtime { } private async initDIContainer() { + if (this.correlator) { + Container.bind(AbstractCorrelator) + .factory(() => this.correlator!) + .scope(Scope.Request); + } + Container.bind(EventBus) .factory(() => this.eventBus) .scope(Scope.Singleton); @@ -291,11 +299,11 @@ export abstract class Runtime { .scope(Scope.Request); Container.bind(AnonymousTokenController) - .factory(() => new AnonymousTokenController(this.transport.config)) + .factory(() => new AnonymousTokenController(this.transport.config, this.correlator)) .scope(Scope.Singleton); Container.bind(BackboneCompatibilityController) - .factory(() => new BackboneCompatibilityController(this.transport.config)) + .factory(() => new BackboneCompatibilityController(this.transport.config, this.correlator)) .scope(Scope.Singleton); const schemaRepository = new SchemaRepository(); diff --git a/packages/runtime/src/useCases/common/AbstractCorrelator.ts b/packages/runtime/src/useCases/common/AbstractCorrelator.ts new file mode 100644 index 000000000..9109dea84 --- /dev/null +++ b/packages/runtime/src/useCases/common/AbstractCorrelator.ts @@ -0,0 +1,10 @@ +import { ICorrelator } from "@nmshd/transport"; + +export abstract class AbstractCorrelator implements ICorrelator { + public abstract withId(id: string, work: () => R): R; + public abstract withId(work: () => R): R; + public abstract bindId(id: string, work: W): W; + public abstract bindId(work: W): W; + public abstract getId(): string | undefined; + public abstract setId(id: string): undefined; +} diff --git a/packages/runtime/src/useCases/common/UseCase.ts b/packages/runtime/src/useCases/common/UseCase.ts index bac6e67ad..60ff9fd45 100644 --- a/packages/runtime/src/useCases/common/UseCase.ts +++ b/packages/runtime/src/useCases/common/UseCase.ts @@ -2,36 +2,45 @@ import { ParsingError, ServalError, ValidationError } from "@js-soft/ts-serval"; import { ApplicationError, Result } from "@js-soft/ts-utils"; import { CoreError } from "@nmshd/core-types"; import { RequestError } from "@nmshd/transport"; -import correlator from "correlation-id"; import stringifySafe from "json-stringify-safe"; +import { Inject } from "typescript-ioc"; +import { AbstractCorrelator } from "./AbstractCorrelator"; import { PlatformErrorCodes } from "./PlatformErrorCodes"; import { RuntimeErrors } from "./RuntimeErrors"; import { IValidator } from "./validation/IValidator"; import { ValidationResult } from "./validation/ValidationResult"; export abstract class UseCase { + @Inject private readonly correlator?: AbstractCorrelator; + public constructor(private readonly requestValidator?: IValidator) {} public async execute(request: IRequest): Promise> { - const callback = async (): Promise> => { - if (this.requestValidator) { - const validationResult = await this.requestValidator.validate(request); + // if no correlator is defined in the DI a broken one without any methods is injected + // we handle this exactly like no correlator is defined + if (typeof this.correlator?.getId === "undefined") { + return await this._executeCallback(request); + } - if (validationResult.isInvalid()) { - return this.validationFailed(validationResult); - } - } + const correlationId = this.correlator.getId(); + if (correlationId) return await this.correlator.withId(correlationId, () => this._executeCallback(request)); + return await this.correlator.withId(() => this._executeCallback(request)); + } - try { - return await this.executeInternal(request); - } catch (e) { - return this.failingResultFromUnknownError(e); + private async _executeCallback(request: IRequest) { + if (this.requestValidator) { + const validationResult = await this.requestValidator.validate(request); + + if (validationResult.isInvalid()) { + return this.validationFailed(validationResult); } - }; + } - const correlationId = correlator.getId(); - if (correlationId) return await correlator.withId(correlationId, callback); - return await correlator.withId(callback); + try { + return await this.executeInternal(request); + } catch (e) { + return this.failingResultFromUnknownError(e); + } } private failingResultFromUnknownError(error: unknown): Result { diff --git a/packages/runtime/src/useCases/index.ts b/packages/runtime/src/useCases/index.ts index 9c0314910..2e814b146 100644 --- a/packages/runtime/src/useCases/index.ts +++ b/packages/runtime/src/useCases/index.ts @@ -1,4 +1,5 @@ export * from "./anonymous"; +export * from "./common/AbstractCorrelator"; export * from "./common/Base64ForIdPrefix"; export * from "./common/OwnerRestriction"; export * from "./common/RuntimeErrors"; diff --git a/packages/runtime/test/lib/RuntimeServiceProvider.ts b/packages/runtime/test/lib/RuntimeServiceProvider.ts index bbb02d379..3bcde6279 100644 --- a/packages/runtime/test/lib/RuntimeServiceProvider.ts +++ b/packages/runtime/test/lib/RuntimeServiceProvider.ts @@ -1,3 +1,4 @@ +import correlator from "correlation-id"; import { AnonymousServices, ConsumptionServices, DataViewExpander, RuntimeConfig, TransportServices } from "../../src"; import { MockEventBus } from "./MockEventBus"; import { TestRuntime } from "./TestRuntime"; @@ -18,6 +19,7 @@ export interface LaunchConfiguration { enableAttributeListenerModule?: boolean; enableNotificationModule?: boolean; enableDefaultRepositoryAttributes?: boolean; + useCorrelator?: boolean; } export class RuntimeServiceProvider { @@ -84,9 +86,13 @@ export class RuntimeServiceProvider { if (launchConfiguration.enableAttributeListenerModule) config.modules.attributeListener.enabled = true; if (launchConfiguration.enableNotificationModule) config.modules.notification.enabled = true; - const runtime = new TestRuntime(config, { - setDefaultRepositoryAttributes: launchConfiguration.enableDefaultRepositoryAttributes ?? false - }); + const runtime = new TestRuntime( + config, + { + setDefaultRepositoryAttributes: launchConfiguration.enableDefaultRepositoryAttributes ?? false + }, + launchConfiguration.useCorrelator ? correlator : undefined + ); this.runtimes.push(runtime); await runtime.init(); diff --git a/packages/runtime/test/lib/TestRuntime.ts b/packages/runtime/test/lib/TestRuntime.ts index 184671486..fc015a227 100644 --- a/packages/runtime/test/lib/TestRuntime.ts +++ b/packages/runtime/test/lib/TestRuntime.ts @@ -6,6 +6,7 @@ import { ConsumptionConfig, ConsumptionController, GenericRequestItemProcessor } import { ICoreAddress } from "@nmshd/core-types"; import { AccountController } from "@nmshd/transport"; import { ConsumptionServices, DataViewExpander, ModuleConfiguration, Runtime, RuntimeConfig, RuntimeHealth, RuntimeServices, TransportServices } from "../../src"; +import { AbstractCorrelator } from "../../src/useCases/common/AbstractCorrelator"; import { MockEventBus } from "./MockEventBus"; import { TestNotificationItem, TestNotificationItemProcessor } from "./TestNotificationItem"; import { TestRequestItem } from "./TestRequestItem"; @@ -19,7 +20,8 @@ export class TestRuntime extends Runtime { public constructor( runtimeConfig: RuntimeConfig, - private readonly consumptionConfig: ConsumptionConfig + private readonly consumptionConfig: ConsumptionConfig, + correlator?: AbstractCorrelator ) { super( runtimeConfig, @@ -43,7 +45,8 @@ export class TestRuntime extends Runtime { } } }), - new MockEventBus() + new MockEventBus(), + correlator ); } diff --git a/packages/runtime/test/misc/CorrelationId.test.ts b/packages/runtime/test/misc/CorrelationId.test.ts index d3e9b95ea..4b66f0db1 100644 --- a/packages/runtime/test/misc/CorrelationId.test.ts +++ b/packages/runtime/test/misc/CorrelationId.test.ts @@ -13,7 +13,7 @@ describe("CorrelationId", function () { beforeAll(async function () { runtimeServiceProvider = new RuntimeServiceProvider(); - runtime = (await runtimeServiceProvider.launch(1))[0]; + runtime = (await runtimeServiceProvider.launch(1, { useCorrelator: true }))[0]; const accountController = Container.get(AccountController); interceptor = new RequestInterceptor((accountController as any).synchronization.client); diff --git a/packages/transport/package.json b/packages/transport/package.json index 958a9a746..41070b9af 100644 --- a/packages/transport/package.json +++ b/packages/transport/package.json @@ -73,7 +73,6 @@ "@nmshd/core-types": "*", "@nmshd/crypto": "2.0.6", "axios": "^1.7.7", - "correlation-id": "^5.2.0", "fast-json-patch": "^3.1.1", "form-data": "^4.0.0", "https-proxy-agent": "^7.0.5", @@ -95,6 +94,7 @@ "@types/luxon": "^3.4.2", "@types/qs": "^6.9.16", "@types/uuid": "^10.0.0", + "correlation-id": "^5.2.0", "expect": "^29.7.0", "ts-mockito": "^2.6.1" }, diff --git a/packages/transport/src/core/ICorrelator.ts b/packages/transport/src/core/ICorrelator.ts new file mode 100644 index 000000000..74194eb06 --- /dev/null +++ b/packages/transport/src/core/ICorrelator.ts @@ -0,0 +1,8 @@ +export interface ICorrelator { + withId(id: string, work: () => R): R; + withId(work: () => R): R; + bindId(id: string, work: W): W; + bindId(work: W): W; + getId(): string | undefined; + setId(id: string): undefined; +} diff --git a/packages/transport/src/core/Transport.ts b/packages/transport/src/core/Transport.ts index b16010580..378420baf 100644 --- a/packages/transport/src/core/Transport.ts +++ b/packages/transport/src/core/Transport.ts @@ -6,6 +6,7 @@ import { SodiumWrapper } from "@nmshd/crypto"; import { AgentOptions } from "http"; import { AgentOptions as HTTPSAgentOptions } from "https"; import _ from "lodash"; +import { ICorrelator } from "./ICorrelator"; import { TransportCoreErrors } from "./TransportCoreErrors"; import { TransportError } from "./TransportError"; import { TransportLoggerFactory } from "./TransportLoggerFactory"; @@ -85,7 +86,8 @@ export class Transport { databaseConnection: IDatabaseConnection, customConfig: IConfigOverwrite, public readonly eventBus: EventBus, - loggerFactory: ILoggerFactory = new SimpleLoggerFactory() + loggerFactory: ILoggerFactory = new SimpleLoggerFactory(), + public readonly correlator?: ICorrelator ) { this.databaseConnection = databaseConnection; this._config = _.defaultsDeep({}, customConfig, Transport.defaultConfig); diff --git a/packages/transport/src/core/backbone/Authenticator.ts b/packages/transport/src/core/backbone/Authenticator.ts index d95769e47..34049b57d 100644 --- a/packages/transport/src/core/backbone/Authenticator.ts +++ b/packages/transport/src/core/backbone/Authenticator.ts @@ -1,6 +1,7 @@ import { ILogger } from "@js-soft/logging-abstractions"; import { CoreDate } from "@nmshd/core-types"; import { AccountController } from "../../modules"; +import { ICorrelator } from "../ICorrelator"; import { AuthClient } from "./AuthClient"; import { IRESTClientConfig } from "./RESTClient"; import { CredentialsBasic } from "./RESTClientAuthenticate"; @@ -11,8 +12,11 @@ export abstract class AbstractAuthenticator { private token?: string; private readonly authClient: AuthClient; - public constructor(private readonly config: IRESTClientConfig) { - this.authClient = new AuthClient(config); + public constructor( + private readonly config: IRESTClientConfig, + correlator?: ICorrelator + ) { + this.authClient = new AuthClient(config, correlator); } public async getToken(): Promise { @@ -78,8 +82,11 @@ export abstract class AbstractAuthenticator { } export class Authenticator extends AbstractAuthenticator { - public constructor(private readonly accountController: AccountController) { - super(accountController.config); + public constructor( + private readonly accountController: AccountController, + correlator?: ICorrelator + ) { + super(accountController.config, correlator); } public async getCredentials(): Promise { diff --git a/packages/transport/src/core/backbone/RESTClient.ts b/packages/transport/src/core/backbone/RESTClient.ts index 8c591aef2..f86ea54cd 100644 --- a/packages/transport/src/core/backbone/RESTClient.ts +++ b/packages/transport/src/core/backbone/RESTClient.ts @@ -1,12 +1,12 @@ import { ILogger } from "@js-soft/logging-abstractions"; import { CoreBuffer } from "@nmshd/crypto"; import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"; -import correlator from "correlation-id"; import formDataLib from "form-data"; import { AgentOptions } from "http"; import { AgentOptions as HTTPSAgentOptions } from "https"; import _ from "lodash"; import { CoreIdHelper } from "../CoreIdHelper"; +import { ICorrelator } from "../ICorrelator"; import { TransportLoggerFactory } from "../TransportLoggerFactory"; import { ClientResult } from "./ClientResult"; import { IPaginationDataSource, Paginator, PaginatorPercentageCallback } from "./Paginator"; @@ -66,6 +66,7 @@ export class RESTClient { public constructor( protected readonly config: IRESTClientConfig, + private readonly correlator?: ICorrelator, requestConfig: AxiosRequestConfig = {} ) { const defaults: AxiosRequestConfig = { @@ -115,11 +116,15 @@ export class RESTClient { this._logger = TransportLoggerFactory.getLogger(RESTClient); this.axiosInstance = axios.create(resultingRequestConfig); - this.axiosInstance.interceptors.request.use((config) => { - const correlationId = correlator.getId(); - config.headers["x-correlation-id"] = correlationId; - return config; - }); + + if (this.correlator) { + const correlator = this.correlator; + this.axiosInstance.interceptors.request.use((config) => { + const correlationId = correlator.getId(); + config.headers["x-correlation-id"] = correlationId; + return config; + }); + } if (this.config.debug) { this.addAxiosLoggingInterceptors(this.axiosInstance); diff --git a/packages/transport/src/core/backbone/RESTClientAuthenticate.ts b/packages/transport/src/core/backbone/RESTClientAuthenticate.ts index e997be907..61e25e30c 100644 --- a/packages/transport/src/core/backbone/RESTClientAuthenticate.ts +++ b/packages/transport/src/core/backbone/RESTClientAuthenticate.ts @@ -1,5 +1,6 @@ import { AxiosRequestConfig } from "axios"; import _ from "lodash"; +import { ICorrelator } from "../ICorrelator"; import { AbstractAuthenticator } from "./Authenticator"; import { ClientResult } from "./ClientResult"; import { Paginator, PaginatorPercentageCallback } from "./Paginator"; @@ -15,9 +16,10 @@ export class RESTClientAuthenticate extends RESTClient { public constructor( config: IRESTClientConfig, private readonly authenticator: AbstractAuthenticator, + correlator?: ICorrelator, requestConfig: AxiosRequestConfig = {} ) { - super(config, requestConfig); + super(config, correlator, requestConfig); } private async runAuthenticated(restCall: (token: string) => Promise>) { diff --git a/packages/transport/src/core/index.ts b/packages/transport/src/core/index.ts index 8cf36c05e..4a7f35a9f 100644 --- a/packages/transport/src/core/index.ts +++ b/packages/transport/src/core/index.ts @@ -5,6 +5,7 @@ export * from "./CoreSynchronizable"; export * from "./CoreUtil"; export * from "./DbCollectionName"; export * from "./DependencyOverrides"; +export * from "./ICorrelator"; export * from "./Reference"; export * from "./Transport"; export * from "./TransportController"; diff --git a/packages/transport/src/modules/accounts/AccountController.ts b/packages/transport/src/modules/accounts/AccountController.ts index 3286d03e9..40b2592cd 100644 --- a/packages/transport/src/modules/accounts/AccountController.ts +++ b/packages/transport/src/modules/accounts/AccountController.ts @@ -111,7 +111,7 @@ export class AccountController { private readonly _config: IConfig, private readonly dependencyOverrides: DependencyOverrides = {} ) { - this._authenticator = new Authenticator(this); + this._authenticator = new Authenticator(this, _transport.correlator); this._log = TransportLoggerFactory.getLogger(ControllerName.Account); } @@ -120,8 +120,8 @@ export class AccountController { this.info = await this.db.getMap("AccountInfo"); this.unpushedDatawalletModifications = await this.db.getCollection(DbCollectionName.UnpushedDatawalletModifications); - this.deviceClient = new DeviceClient(this.config); - this.identityClient = new IdentityClient(this.config); + this.deviceClient = new DeviceClient(this.config, this._transport.correlator); + this.identityClient = new IdentityClient(this.config, this._transport.correlator); this._identity = new IdentityController(this); this._identityDeletionProcess = new IdentityDeletionProcessController(this); @@ -146,7 +146,7 @@ export class AccountController { identityCreated = true; device = result.device; - this.deviceAuthClient = new DeviceAuthClient(this.config, this.authenticator); + this.deviceAuthClient = new DeviceAuthClient(this.config, this.authenticator, this.transport.correlator); } else { // Device Onboarding device = await this.onboardDevice(deviceSharedSecret); @@ -166,7 +166,7 @@ export class AccountController { await this.identityDeletionProcess.init(); await this.activeDevice.init(availableBaseKey, availableDevice); - this.deviceAuthClient = new DeviceAuthClient(this.config, this.authenticator); + this.deviceAuthClient = new DeviceAuthClient(this.config, this.authenticator, this.transport.correlator); } else { throw new TransportError("The combination of deviceSharedSecret, existing identity or device is not allowed."); } @@ -401,7 +401,7 @@ export class AccountController { await this.activeDevice.secrets.storeSecret(deviceSharedSecret.identityPrivateKey, DeviceSecretType.IdentitySignature); } - this.deviceAuthClient = new DeviceAuthClient(this.config, this.authenticator); + this.deviceAuthClient = new DeviceAuthClient(this.config, this.authenticator, this.transport.correlator); await this.activeDevice.changePassword(devicePwdDn); diff --git a/packages/transport/src/modules/accounts/IdentityDeletionProcessController.ts b/packages/transport/src/modules/accounts/IdentityDeletionProcessController.ts index 0b5fb273b..cf5a28f0a 100644 --- a/packages/transport/src/modules/accounts/IdentityDeletionProcessController.ts +++ b/packages/transport/src/modules/accounts/IdentityDeletionProcessController.ts @@ -17,7 +17,7 @@ export class IdentityDeletionProcessController extends TransportController { public constructor(parent: AccountController) { super(ControllerName.Identity, parent); - this.identityDeletionProcessClient = new IdentityDeletionProcessClient(this.config, this.parent.authenticator); + this.identityDeletionProcessClient = new IdentityDeletionProcessClient(this.config, this.parent.authenticator, this.transport.correlator); } @log() diff --git a/packages/transport/src/modules/backboneCompatibility/BackboneCompatibilityController.ts b/packages/transport/src/modules/backboneCompatibility/BackboneCompatibilityController.ts index b6ee6a16c..cf1a929d2 100644 --- a/packages/transport/src/modules/backboneCompatibility/BackboneCompatibilityController.ts +++ b/packages/transport/src/modules/backboneCompatibility/BackboneCompatibilityController.ts @@ -1,5 +1,5 @@ import { Result } from "@js-soft/ts-utils"; -import { IConfig } from "../../core"; +import { IConfig, ICorrelator } from "../../core"; import { VersionClient } from "./backbone/VersionClient"; export interface BackboneCompatibility { @@ -12,8 +12,11 @@ export interface BackboneCompatibility { export class BackboneCompatibilityController { private readonly client: VersionClient; - public constructor(private readonly config: IConfig) { - this.client = new VersionClient(config); + public constructor( + private readonly config: IConfig, + correlator?: ICorrelator + ) { + this.client = new VersionClient(config, correlator); this.config = config; } diff --git a/packages/transport/src/modules/challenges/ChallengeController.ts b/packages/transport/src/modules/challenges/ChallengeController.ts index 166ed2d5e..fc7b1cfe3 100644 --- a/packages/transport/src/modules/challenges/ChallengeController.ts +++ b/packages/transport/src/modules/challenges/ChallengeController.ts @@ -22,8 +22,8 @@ export class ChallengeController extends TransportController { public override async init(): Promise { await super.init(); - this.client = new ChallengeClient(this.config); - this.authClient = new ChallengeAuthClient(this.config, this.parent.authenticator); + this.client = new ChallengeClient(this.config, this.transport.correlator); + this.authClient = new ChallengeAuthClient(this.config, this.parent.authenticator, this.transport.correlator); return this; } diff --git a/packages/transport/src/modules/devices/DevicesController.ts b/packages/transport/src/modules/devices/DevicesController.ts index 331de15dd..6fdbeb8a7 100644 --- a/packages/transport/src/modules/devices/DevicesController.ts +++ b/packages/transport/src/modules/devices/DevicesController.ts @@ -22,7 +22,7 @@ export class DevicesController extends TransportController { public override async init(): Promise { await super.init(); - this.client = new DeviceAuthClient(this.config, this.parent.authenticator); + this.client = new DeviceAuthClient(this.config, this.parent.authenticator, this.transport.correlator); this.devices = await this.parent.getSynchronizedCollection(DbCollectionName.Devices); return this; } diff --git a/packages/transport/src/modules/files/FileController.ts b/packages/transport/src/modules/files/FileController.ts index 9247c6160..3691e1d99 100644 --- a/packages/transport/src/modules/files/FileController.ts +++ b/packages/transport/src/modules/files/FileController.ts @@ -27,7 +27,7 @@ export class FileController extends TransportController { public override async init(): Promise { await super.init(); - this.client = new FileClient(this.config, this.parent.authenticator); + this.client = new FileClient(this.config, this.parent.authenticator, this.transport.correlator); this.files = await this.parent.getSynchronizedCollection(DbCollectionName.Files); return this; } diff --git a/packages/transport/src/modules/messages/MessageController.ts b/packages/transport/src/modules/messages/MessageController.ts index f6631e618..13d14511f 100644 --- a/packages/transport/src/modules/messages/MessageController.ts +++ b/packages/transport/src/modules/messages/MessageController.ts @@ -48,7 +48,7 @@ export class MessageController extends TransportController { this.secrets = new RelationshipSecretController(this.parent); await this.secrets.init(); - this.client = new MessageClient(this.config, this.parent.authenticator); + this.client = new MessageClient(this.config, this.parent.authenticator, this.transport.correlator); this.messages = await this.parent.getSynchronizedCollection(DbCollectionName.Messages); return this; } diff --git a/packages/transport/src/modules/relationshipTemplates/RelationshipTemplateController.ts b/packages/transport/src/modules/relationshipTemplates/RelationshipTemplateController.ts index 26a4a4c20..22d4e1546 100644 --- a/packages/transport/src/modules/relationshipTemplates/RelationshipTemplateController.ts +++ b/packages/transport/src/modules/relationshipTemplates/RelationshipTemplateController.ts @@ -27,7 +27,7 @@ export class RelationshipTemplateController extends TransportController { public constructor(parent: AccountController, secrets: RelationshipSecretController, controllerName?: ControllerName) { super(controllerName ? controllerName : ControllerName.RelationshipTemplate, parent); this.secrets = secrets; - this.client = new RelationshipTemplateClient(this.config, this.parent.authenticator); + this.client = new RelationshipTemplateClient(this.config, this.parent.authenticator, this.transport.correlator); } public override async init(): Promise { diff --git a/packages/transport/src/modules/relationships/RelationshipsController.ts b/packages/transport/src/modules/relationships/RelationshipsController.ts index 7fe176e67..0cd089823 100644 --- a/packages/transport/src/modules/relationships/RelationshipsController.ts +++ b/packages/transport/src/modules/relationships/RelationshipsController.ts @@ -43,7 +43,7 @@ export class RelationshipsController extends TransportController { public override async init(): Promise { await super.init(); - this.client = new RelationshipClient(this.config, this.parent.authenticator); + this.client = new RelationshipClient(this.config, this.parent.authenticator, this.transport.correlator); this.relationships = await this.parent.getSynchronizedCollection(DbCollectionName.Relationships); return this; diff --git a/packages/transport/src/modules/sync/SyncController.ts b/packages/transport/src/modules/sync/SyncController.ts index dc94ab45f..638bfce7d 100644 --- a/packages/transport/src/modules/sync/SyncController.ts +++ b/packages/transport/src/modules/sync/SyncController.ts @@ -50,7 +50,7 @@ export class SyncController extends TransportController { ) { super(ControllerName.Sync, parent); - this.client = dependencyOverrides.syncClient ?? new SyncClient(this.config, this.parent.authenticator); + this.client = dependencyOverrides.syncClient ?? new SyncClient(this.config, this.parent.authenticator, this.transport.correlator); this.identityMigrations = new IdentityMigrations(this.parent); this.deviceMigrations = new DeviceMigrations(this.parent); diff --git a/packages/transport/src/modules/sync/backbone/SyncClient.ts b/packages/transport/src/modules/sync/backbone/SyncClient.ts index 38e313dff..165ea908b 100644 --- a/packages/transport/src/modules/sync/backbone/SyncClient.ts +++ b/packages/transport/src/modules/sync/backbone/SyncClient.ts @@ -1,4 +1,4 @@ -import { IRESTClientConfig, Paginator, PaginatorPercentageCallback, RESTClientAuthenticate } from "../../../core"; +import { ICorrelator, IRESTClientConfig, Paginator, PaginatorPercentageCallback, RESTClientAuthenticate } from "../../../core"; import { AbstractAuthenticator } from "../../../core/backbone/Authenticator"; import { ClientResult } from "../../../core/backbone/ClientResult"; import { BackboneDatawalletModification } from "./BackboneDatawalletModification"; @@ -36,8 +36,8 @@ export interface ISyncClient { } export class SyncClient extends RESTClientAuthenticate implements ISyncClient { - public constructor(config: IRESTClientConfig & { supportedDatawalletVersion: number }, authenticator: AbstractAuthenticator) { - super(config, authenticator, { + public constructor(config: IRESTClientConfig & { supportedDatawalletVersion: number }, authenticator: AbstractAuthenticator, correlator?: ICorrelator) { + super(config, authenticator, correlator, { headers: { "x-supported-datawallet-version": config.supportedDatawalletVersion.toString() // eslint-disable-line @typescript-eslint/naming-convention } diff --git a/packages/transport/src/modules/tokens/AnonymousTokenController.ts b/packages/transport/src/modules/tokens/AnonymousTokenController.ts index f92588ae5..6f2bd6cff 100644 --- a/packages/transport/src/modules/tokens/AnonymousTokenController.ts +++ b/packages/transport/src/modules/tokens/AnonymousTokenController.ts @@ -1,7 +1,7 @@ import { Serializable } from "@js-soft/ts-serval"; import { CoreAddress, CoreDate, CoreId } from "@nmshd/core-types"; import { CryptoCipher, CryptoSecretKey } from "@nmshd/crypto"; -import { CoreCrypto, IConfig, TransportCoreErrors } from "../../core"; +import { CoreCrypto, IConfig, ICorrelator, TransportCoreErrors } from "../../core"; import { AnonymousTokenClient } from "./backbone/AnonymousTokenClient"; import { CachedToken } from "./local/CachedToken"; import { Token } from "./local/Token"; @@ -9,8 +9,8 @@ import { TokenReference } from "./transmission/TokenReference"; export class AnonymousTokenController { private readonly client: AnonymousTokenClient; - public constructor(config: IConfig) { - this.client = new AnonymousTokenClient(config); + public constructor(config: IConfig, correlator?: ICorrelator) { + this.client = new AnonymousTokenClient(config, correlator); } public async loadPeerTokenByTruncated(truncated: string): Promise { diff --git a/packages/transport/src/modules/tokens/TokenController.ts b/packages/transport/src/modules/tokens/TokenController.ts index 2a9776811..6fe622e07 100644 --- a/packages/transport/src/modules/tokens/TokenController.ts +++ b/packages/transport/src/modules/tokens/TokenController.ts @@ -25,7 +25,7 @@ export class TokenController extends TransportController { public override async init(): Promise { await super.init(); - this.client = new TokenClient(this.config, this.parent.authenticator); + this.client = new TokenClient(this.config, this.parent.authenticator, this.transport.correlator); this.tokens = await this.parent.getSynchronizedCollection(DbCollectionName.Tokens); return this; diff --git a/packages/transport/test/core/backbone/CorrelationId.test.ts b/packages/transport/test/core/backbone/CorrelationId.test.ts index d1dfff7bd..00f96a328 100644 --- a/packages/transport/test/core/backbone/CorrelationId.test.ts +++ b/packages/transport/test/core/backbone/CorrelationId.test.ts @@ -11,7 +11,7 @@ describe("CorrelationId", function () { beforeAll(async function () { connection = await TestUtil.createDatabaseConnection(); - const transport = TestUtil.createTransport(connection); + const transport = TestUtil.createTransport(connection, undefined, correlator); await transport.init(); const accounts = await TestUtil.provideAccounts(transport, 1); testAccount = accounts[0]; diff --git a/packages/transport/test/testHelpers/TestUtil.ts b/packages/transport/test/testHelpers/TestUtil.ts index a92f83254..33b504365 100644 --- a/packages/transport/test/testHelpers/TestUtil.ts +++ b/packages/transport/test/testHelpers/TestUtil.ts @@ -19,6 +19,7 @@ import { File, IChangedItems, IConfigOverwrite, + ICorrelator, IdentityDeletionProcess, IdentityUtil, ISendFileParameters, @@ -172,12 +173,12 @@ export class TestUtil { return dbConnection; } - public static createTransport(connection: IDatabaseConnection, configOverwrite: Partial = {}): Transport { + public static createTransport(connection: IDatabaseConnection, configOverwrite: Partial = {}, correlator?: ICorrelator): Transport { const eventBus = TestUtil.createEventBus(); const config = TestUtil.createConfig(); - return new Transport(connection, { ...config, ...configOverwrite }, eventBus, TestUtil.loggerFactory); + return new Transport(connection, { ...config, ...configOverwrite }, eventBus, TestUtil.loggerFactory, correlator); } public static createEventBus(): EventEmitter2EventBus {