diff --git a/apps/ssi-abstraction/src/agent/dids/dids.service.ts b/apps/ssi-abstraction/src/agent/dids/dids.service.ts index 873054efbd4e9c495c72a7ff6b109489b8e1a7dc..2aad3dd5cd8e08239e465d8b554d84cdfdad82ef 100644 --- a/apps/ssi-abstraction/src/agent/dids/dids.service.ts +++ b/apps/ssi-abstraction/src/agent/dids/dids.service.ts @@ -137,12 +137,17 @@ export class DidsService { keyType: KeyType.Ed25519, }; - await this.agentService.agent.wallet.createKey(privKey); + try { + await this.agentService.agent.wallet.createKey(privKey); + } catch { + // Key already exists, but we don't care + } for (const indyDid of indyDids) { await this.agentService.agent.dids.import({ did: indyDid.did, privateKeys: [privKey], + overwrite: true, }); } diff --git a/apps/ssi-abstraction/src/application.ts b/apps/ssi-abstraction/src/application.ts index b3b95ea1c95bb8968def6e92735028afc97b48f9..271d8cb5ef5ab477ef70b194304db46f4dc7482b 100644 --- a/apps/ssi-abstraction/src/application.ts +++ b/apps/ssi-abstraction/src/application.ts @@ -1,9 +1,12 @@ +import type { OnApplicationBootstrap } from '@nestjs/common'; import type { ConfigType } from '@nestjs/config'; -import { Module } from '@nestjs/common'; +import { Inject, Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { RouterModule } from '@nestjs/core'; -import { HealthModule } from '@ocm/shared'; +import { ClientProxy, ClientsModule, Transport } from '@nestjs/microservices'; +import { EventDidsRegisterEndorserDid, HealthModule } from '@ocm/shared'; +import { firstValueFrom } from 'rxjs'; import { AgentModule } from './agent/agent.module.js'; import { AnonCredsCredentialsModule } from './agent/anoncredsCredentials/anoncredsCredentials.module.js'; @@ -14,6 +17,7 @@ import { DidsModule } from './agent/dids/dids.module.js'; import { RevocationModule } from './agent/revocation/revocation.module.js'; import { SchemasModule } from './agent/schemas/schemas.module.js'; import { TenantsModule } from './agent/tenants/tenants.module.js'; +import { NATS_CLIENT } from './common/constants.js'; import { agentConfig } from './config/agent.config.js'; import { httpConfig } from './config/http.config.js'; import { natsConfig } from './config/nats.config.js'; @@ -35,6 +39,23 @@ import { validationSchema } from './config/validation.js'; }, }), + ClientsModule.registerAsync({ + clients: [ + { + name: NATS_CLIENT, + inject: [natsConfig.KEY], + useFactory: (config: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { + servers: [config.url], + user: config.user as string, + pass: config.password as string, + }, + }), + }, + ], + }), + HealthModule.registerAsync({ inject: [natsConfig.KEY], useFactory: (config: ConfigType<typeof natsConfig>) => { @@ -64,4 +85,20 @@ import { validationSchema } from './config/validation.js'; RouterModule.register([{ module: HealthModule, path: '/health' }]), ], }) -export class Application {} +export class Application implements OnApplicationBootstrap { + public constructor( + @Inject(NATS_CLIENT) private readonly natsClient: ClientProxy, + ) {} + + public async onApplicationBootstrap() { + await this.natsClient.connect(); + + try { + await firstValueFrom( + this.natsClient.send(EventDidsRegisterEndorserDid.token, {}), + ); + } catch { + // If there was an error, we don't want to crash the application + } + } +} diff --git a/apps/ssi-abstraction/src/common/constants.ts b/apps/ssi-abstraction/src/common/constants.ts index 1e67c0f2320b146813897916d7c0ef0455dded7f..4b69d62dbdfa32b976e9363d1d48a23446fb42a4 100644 --- a/apps/ssi-abstraction/src/common/constants.ts +++ b/apps/ssi-abstraction/src/common/constants.ts @@ -9,3 +9,5 @@ export enum MetadataTokens { export enum GenericRecordTokens { REVOCATION = 'revocation_generic_record', } + +export const NATS_CLIENT = Symbol('NATS_CLIENT');