diff --git a/packages/consumption/src/consumption/ConsumptionConfig.ts b/packages/consumption/src/consumption/ConsumptionConfig.ts index e0cad820b..586bd4c2d 100644 --- a/packages/consumption/src/consumption/ConsumptionConfig.ts +++ b/packages/consumption/src/consumption/ConsumptionConfig.ts @@ -1,3 +1,4 @@ export interface ConsumptionConfig { setDefaultOwnIdentityAttributes: boolean; + fetchInstance?: typeof fetch; } diff --git a/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts index 5049ba53e..78424427f 100644 --- a/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts +++ b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts @@ -11,8 +11,12 @@ export class OpenId4VcController extends ConsumptionBaseController { super(ConsumptionControllerName.OpenId4VcController, parent); } + private get fetchInstance(): typeof fetch { + return this.parent.consumptionConfig.fetchInstance ?? fetch; + } + public async fetchCredentialOffer(credentialOfferUrl: string): Promise<{ data: string }> { - const holder = new Holder(this.parent.accountController, this.parent.attributes); + const holder = new Holder(this.parent.accountController, this.parent.attributes, this.fetchInstance); await holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); const res = await holder.resolveCredentialOffer(credentialOfferUrl); return { @@ -25,7 +29,7 @@ export class OpenId4VcController extends ConsumptionBaseController { requestedCredentialOffers: string[], pinCode?: string ): Promise<{ data: string; id: string; type: string; displayInformation: string | undefined }> { - const holder = new Holder(this.parent.accountController, this.parent.attributes); + const holder = new Holder(this.parent.accountController, this.parent.attributes, this.fetchInstance); await holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); const credentialOffer = JSON.parse(fetchedCredentialOffer); const credentials = await holder.requestAndStoreCredentials(credentialOffer, { credentialsToRequest: requestedCredentialOffers, txCode: pinCode }); @@ -43,7 +47,7 @@ export class OpenId4VcController extends ConsumptionBaseController { } public async processCredentialOffer(credentialOffer: string): Promise<{ data: string; id: string; type: string; displayInformation: string | undefined }> { - const holder = new Holder(this.parent.accountController, this.parent.attributes); + const holder = new Holder(this.parent.accountController, this.parent.attributes, this.fetchInstance); await holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); const res = await holder.resolveCredentialOffer(credentialOffer); const credentials = await holder.requestAndStoreCredentials(res, { credentialsToRequest: Object.keys(res.offeredCredentialConfigurations) }); @@ -63,7 +67,7 @@ export class OpenId4VcController extends ConsumptionBaseController { public async resolveAuthorizationRequest( requestUrl: string ): Promise<{ authorizationRequest: OpenId4VpResolvedAuthorizationRequest; usedCredentials: { id: string; data: string; type: string; displayInformation?: string }[] }> { - const holder = new Holder(this.parent.accountController, this.parent.attributes); + const holder = new Holder(this.parent.accountController, this.parent.attributes, this.fetchInstance); await holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); const authorizationRequest = await holder.resolveAuthorizationRequest(requestUrl); @@ -90,7 +94,7 @@ export class OpenId4VcController extends ConsumptionBaseController { public async acceptAuthorizationRequest( authorizationRequest: OpenId4VpResolvedAuthorizationRequest ): Promise<{ status: number; message: string | Record | null }> { - const holder = new Holder(this.parent.accountController, this.parent.attributes); + const holder = new Holder(this.parent.accountController, this.parent.attributes, this.fetchInstance); await holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); // parse the credential type to be sdjwt @@ -101,7 +105,7 @@ export class OpenId4VcController extends ConsumptionBaseController { } public async getVerifiableCredentials(ids?: string[]): Promise<{ id: string; data: string; type: string; displayInformation?: string }[]> { - const holder = new Holder(this.parent.accountController, this.parent.attributes); + const holder = new Holder(this.parent.accountController, this.parent.attributes, this.fetchInstance); await holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); const credentials = await holder.getVerifiableCredentials(ids); diff --git a/packages/consumption/src/modules/openid4vc/index.ts b/packages/consumption/src/modules/openid4vc/index.ts index 84f71eb01..1f9d59bac 100644 --- a/packages/consumption/src/modules/openid4vc/index.ts +++ b/packages/consumption/src/modules/openid4vc/index.ts @@ -3,5 +3,4 @@ export * from "./local/EnmeshedHolderFileSystem"; export * from "./local/EnmeshedHolderKeyManagmentService"; export * from "./local/EnmeshedStorageService"; export * from "./local/Holder"; -export * from "./local/LocalAgentDependencies"; export * from "./OpenId4VcController"; diff --git a/packages/consumption/src/modules/openid4vc/local/BaseAgent.ts b/packages/consumption/src/modules/openid4vc/local/BaseAgent.ts index 8188c87ea..0b565f9a1 100644 --- a/packages/consumption/src/modules/openid4vc/local/BaseAgent.ts +++ b/packages/consumption/src/modules/openid4vc/local/BaseAgent.ts @@ -12,10 +12,12 @@ import { } from "@credo-ts/core"; import { KeyManagementModuleConfig } from "@credo-ts/core/build/modules/kms"; import { AccountController } from "@nmshd/transport"; +import { EventEmitter } from "events"; +import webSocket from "ws"; import { AttributesController } from "../../attributes"; +import { EnmeshedHolderFileSystem } from "./EnmeshedHolderFileSystem"; import { EnmshedHolderKeyManagmentService } from "./EnmeshedHolderKeyManagmentService"; import { EnmeshedStorageService } from "./EnmeshedStorageService"; -import { agentDependencies } from "./LocalAgentDependencies"; export class BaseAgent { public config: InitConfig; @@ -30,7 +32,8 @@ export class BaseAgent { public readonly name: string, public readonly modules: AgentModules, public readonly accountController: AccountController, - public readonly attributeController: AttributesController + public readonly attributeController: AttributesController, + fetchInstance: typeof fetch ) { this.name = name; this.port = port; @@ -49,7 +52,15 @@ export class BaseAgent { this.agent = new Agent( { config, - dependencies: agentDependencies, + dependencies: { + // eslint-disable-next-line @typescript-eslint/naming-convention + FileSystem: EnmeshedHolderFileSystem, + // eslint-disable-next-line @typescript-eslint/naming-convention + EventEmitterClass: EventEmitter, + fetch: fetchInstance, + // eslint-disable-next-line @typescript-eslint/naming-convention + WebSocketClass: webSocket + }, modules }, dependencyManager diff --git a/packages/consumption/src/modules/openid4vc/local/Holder.ts b/packages/consumption/src/modules/openid4vc/local/Holder.ts index 633d908c9..53a0d1406 100644 --- a/packages/consumption/src/modules/openid4vc/local/Holder.ts +++ b/packages/consumption/src/modules/openid4vc/local/Holder.ts @@ -46,8 +46,8 @@ export class Holder extends BaseAgent> redirectUri: "http://localhost:3000/redirect" }; - public constructor(accountController: AccountController, attributeController: AttributesController) { - super(3000, `OpenId4VcHolder ${Math.random().toString()}`, getOpenIdHolderModules(), accountController, attributeController); + public constructor(accountController: AccountController, attributeController: AttributesController, fetchInstance: typeof fetch) { + super(3000, `OpenId4VcHolder ${Math.random().toString()}`, getOpenIdHolderModules(), accountController, attributeController, fetchInstance); } public async getVerifiableCredentials(ids: string[] | undefined): Promise { diff --git a/packages/consumption/src/modules/openid4vc/local/LocalAgentDependencies.ts b/packages/consumption/src/modules/openid4vc/local/LocalAgentDependencies.ts deleted file mode 100644 index bbe2f0140..000000000 --- a/packages/consumption/src/modules/openid4vc/local/LocalAgentDependencies.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AgentDependencies } from "@credo-ts/core"; -import { EventEmitter } from "events"; -import { Agent, fetch as undiciFetch } from "undici"; -import webSocket from "ws"; -import { EnmeshedHolderFileSystem } from "./EnmeshedHolderFileSystem"; - -export const agentDependencies: AgentDependencies = { - // eslint-disable-next-line @typescript-eslint/naming-convention - FileSystem: EnmeshedHolderFileSystem, - // eslint-disable-next-line @typescript-eslint/naming-convention - EventEmitterClass: EventEmitter, - fetch: (async (input, init) => { - const response = await undiciFetch(input as any, { - ...(init as any), - dispatcher: new Agent({}) - }); - - return response; - }) as typeof fetch, - // eslint-disable-next-line @typescript-eslint/naming-convention - WebSocketClass: webSocket -}; diff --git a/packages/consumption/test/modules/requests/RequestsIntegrationTest.ts b/packages/consumption/test/modules/requests/RequestsIntegrationTest.ts index d2d2c7945..665e9214c 100644 --- a/packages/consumption/test/modules/requests/RequestsIntegrationTest.ts +++ b/packages/consumption/test/modules/requests/RequestsIntegrationTest.ts @@ -50,6 +50,7 @@ import { ValidationResult } from "../../../src"; +import { NodeLoggerFactory } from "@js-soft/node-logger"; import { TestUtil } from "../../core/TestUtil"; import { MockEventBus } from "../MockEventBus"; import { TestObjectFactory } from "./testHelpers/TestObjectFactory"; @@ -78,6 +79,26 @@ export class RequestsTestsContext { config, new EventEmitter2EventBus(() => { // noop + }), + new NodeLoggerFactory({ + appenders: { + consoleAppender: { + type: "stdout", + layout: { type: "pattern", pattern: "%[[%p] %c - %m%]" } + }, + console: { + type: "logLevelFilter", + level: "Warn", + appender: "consoleAppender" + } + }, + + categories: { + default: { + appenders: ["console"], + level: "TRACE" + } + } }) ).init(); diff --git a/packages/runtime/test/consumption/openid4vc.test.ts b/packages/runtime/test/consumption/openid4vc.test.ts index 92b9acbb4..651b2fa31 100644 --- a/packages/runtime/test/consumption/openid4vc.test.ts +++ b/packages/runtime/test/consumption/openid4vc.test.ts @@ -2,10 +2,16 @@ import { OpenId4VpResolvedAuthorizationRequest } from "@credo-ts/openid4vc"; import axios, { AxiosInstance } from "axios"; import path from "path"; import { DockerComposeEnvironment, StartedDockerComposeEnvironment, Wait } from "testcontainers"; +import { Agent as UndiciAgent, fetch as undiciFetch } from "undici"; import { ConsumptionServices } from "../../src"; import { RuntimeServiceProvider } from "../lib"; -const runtimeServiceProvider = new RuntimeServiceProvider(); +const fetchInstance: typeof fetch = (async (input, init) => { + const response = await undiciFetch(input as any, { ...(init as any), dispatcher: new UndiciAgent({}) }); + return response; +}) as typeof fetch; + +const runtimeServiceProvider = new RuntimeServiceProvider(fetchInstance); let consumptionServices: ConsumptionServices; let axiosInstance: AxiosInstance; let dockerComposeStack: StartedDockerComposeEnvironment | undefined; diff --git a/packages/runtime/test/lib/RuntimeServiceProvider.ts b/packages/runtime/test/lib/RuntimeServiceProvider.ts index c0b4b79cd..d0791894b 100644 --- a/packages/runtime/test/lib/RuntimeServiceProvider.ts +++ b/packages/runtime/test/lib/RuntimeServiceProvider.ts @@ -24,6 +24,8 @@ export interface LaunchConfiguration { } export class RuntimeServiceProvider { + public constructor(private readonly fetchInstance?: typeof fetch) {} + private readonly runtimes: TestRuntime[] = []; public static get transportConfig(): Omit { @@ -75,7 +77,8 @@ export class RuntimeServiceProvider { const runtime = new TestRuntime( config, { - setDefaultOwnIdentityAttributes: launchConfiguration.enableDefaultOwnIdentityAttributes ?? false + setDefaultOwnIdentityAttributes: launchConfiguration.enableDefaultOwnIdentityAttributes ?? false, + fetchInstance: this.fetchInstance }, launchConfiguration.useCorrelator ? correlator : undefined ); diff --git a/packages/transport/src/core/Transport.ts b/packages/transport/src/core/Transport.ts index 1f122a702..8356dc372 100644 --- a/packages/transport/src/core/Transport.ts +++ b/packages/transport/src/core/Transport.ts @@ -1,5 +1,4 @@ import { ILogger, ILoggerFactory } from "@js-soft/logging-abstractions"; -import { NodeLoggerFactory } from "@js-soft/node-logger"; import { EventBus } from "@js-soft/ts-utils"; import { SodiumWrapper } from "@nmshd/crypto"; import { AgentOptions } from "http"; @@ -85,26 +84,7 @@ export class Transport { public constructor( customConfig: IConfigOverwrite, public readonly eventBus: EventBus, - loggerFactory: ILoggerFactory = new NodeLoggerFactory({ - appenders: { - consoleAppender: { - type: "stdout", - layout: { type: "pattern", pattern: "%[[%p] %c - %m%]" } - }, - console: { - type: "logLevelFilter", - level: "Warn", - appender: "consoleAppender" - } - }, - - categories: { - default: { - appenders: ["console"], - level: "TRACE" - } - } - }), + loggerFactory: ILoggerFactory, public readonly correlator?: ICorrelator ) { this._config = _.defaultsDeep({}, customConfig, Transport.defaultConfig);