diff --git a/apps/ssi-abstraction/config/validation.ts b/apps/ssi-abstraction/config/validation.ts index 974089a5198975c6182ee629b0980631b475df23..ac3c85702dd7032aafa99d4f27b904102fcbb9ab 100644 --- a/apps/ssi-abstraction/config/validation.ts +++ b/apps/ssi-abstraction/config/validation.ts @@ -1,4 +1,4 @@ -import * as Joi from 'joi'; +import Joi from 'joi'; const validationSchema = Joi.object({ NATS_URL: Joi.string().required(), diff --git a/apps/ssi-abstraction/src/agent/agentUtils/listener.spec.ts b/apps/ssi-abstraction/src/agent/agentUtils/listener.spec.ts index bb8e99ed1a6e6dd58d054cf9eb7679c6815fbf28..ea1052213b44272156bc3a33526185220f56b0f4 100644 --- a/apps/ssi-abstraction/src/agent/agentUtils/listener.spec.ts +++ b/apps/ssi-abstraction/src/agent/agentUtils/listener.spec.ts @@ -1,11 +1,10 @@ -/* eslint-disable */ - import { subscribe } from './listener'; describe('listener', () => { it('should subscribe agent to available events', async () => { const agent = { events: { + // eslint-disable-next-line @typescript-eslint/no-unused-vars on: (eventName: string, cb: () => void) => {}, }, }; diff --git a/apps/ssi-abstraction/src/agent/agentUtils/listener.ts b/apps/ssi-abstraction/src/agent/agentUtils/listener.ts index 27ee2a349555e21b96a29524f560b10089e1cd0c..5aaed30d85a7c5729e102943aa810825d8ecaa31 100644 --- a/apps/ssi-abstraction/src/agent/agentUtils/listener.ts +++ b/apps/ssi-abstraction/src/agent/agentUtils/listener.ts @@ -9,12 +9,12 @@ import { listenerConfig } from './listenerConfig'; * @param agent - the agent that has been initialized on startup * @param natsClient - the client that specifies how events are published */ -export const subscribe = async ( +export const subscribe = ( agent: Agent, natsClient: NatsClientService, ) => { for (let i = 0; i < listenerConfig.length; i += 1) { - agent.events.on(listenerConfig[i], async ({ payload }: any) => { + agent.events.on(listenerConfig[i], ({ payload }) => { logger.info( `${listenerConfig[i]} called. Payload: ${JSON.stringify(payload)}`, ); diff --git a/apps/ssi-abstraction/src/agent/module.ts b/apps/ssi-abstraction/src/agent/module.ts index 0c78e7379dd656a4d421e7c5fda4c36f3dccbad9..b224084d8457ad641085140be0e549828bf54fdc 100644 --- a/apps/ssi-abstraction/src/agent/module.ts +++ b/apps/ssi-abstraction/src/agent/module.ts @@ -53,18 +53,16 @@ const agentFactory = { } const indyLedgers: LedgerInfo[] = ledgerIds.map((id: LedgerIds) => { - const ledgerId: LedgerIds = id; - - if (!LEDGER_GENESIS?.[ledgerId]) { + if (!LEDGER_GENESIS?.[id]) { throw new Error( - `No pool transaction genesis provided for ledger ${ledgerId}`, + `No pool transaction genesis provided for ledger ${id}`, ); } const ledger: LedgerInfo = { - id: `${ledgerId}_Genesis`, - indyNamespace: `${ledgerNamespaces[ledgerId]}`, - genesisTransactions: LEDGER_GENESIS?.[ledgerId], + id: `${id}_Genesis`, + indyNamespace: `${ledgerNamespaces[id]}`, + genesisTransactions: LEDGER_GENESIS?.[id], isProduction: false, }; @@ -95,7 +93,7 @@ const agentFactory = { agent.registerOutboundTransport(new HttpOutboundTransport()); await agent.initialize(); - await subscribe(agent, natsClient); + subscribe(agent, natsClient); if (agent.isInitialized) { ledgerIds.map(async (id: LedgerIds) => { @@ -160,7 +158,7 @@ const agentFactory = { name: NATSServices.SERVICE_NAME, transport: Transport.NATS, options: { - servers: [config().nats.url as string], + servers: [config().nats.url], }, }, ]), diff --git a/apps/ssi-abstraction/src/app.module.ts b/apps/ssi-abstraction/src/app.module.ts index 5c23be67d6325a75d0bdeb313753821417c46fa3..8410dc5bb0d245f3c00a8408e8e8c6c2e3a980d4 100644 --- a/apps/ssi-abstraction/src/app.module.ts +++ b/apps/ssi-abstraction/src/app.module.ts @@ -28,7 +28,7 @@ import { AgentMid } from './middleware/agentMid.middleware'; ], }) export class AppModule implements NestModule { - // eslint-disable-next-line + // eslint-disable-next-line class-methods-use-this configure(consumer: MiddlewareConsumer) { consumer.apply(AgentMid).forRoutes('agent', '*/agent'); } diff --git a/apps/ssi-abstraction/src/client/nats.client.ts b/apps/ssi-abstraction/src/client/nats.client.ts index 5ba22876627064325cbb5edfba01c0e81564b286..5a4c62abcbb59fc811fd182f0da43112f0f036b5 100644 --- a/apps/ssi-abstraction/src/client/nats.client.ts +++ b/apps/ssi-abstraction/src/client/nats.client.ts @@ -19,9 +19,11 @@ export class NatsClientService { logger.info( `Publish nats event: ${NATSServices.SERVICE_NAME}/${eventName}`, ); + const event = { endpoint: `${NATSServices.SERVICE_NAME}/${eventName}`, }; + this.client.emit(event, data); } } diff --git a/apps/ssi-abstraction/src/didComm/controller/controller.ts b/apps/ssi-abstraction/src/didComm/controller/controller.ts index 241099ddda22e4dce81fa776f51c9db9788ac03a..864b4775a1d70ef0228e144915f54241f683e500 100644 --- a/apps/ssi-abstraction/src/didComm/controller/controller.ts +++ b/apps/ssi-abstraction/src/didComm/controller/controller.ts @@ -44,13 +44,14 @@ export class DidCommController { @All('/:property/:method') async generic(@Param() params: GenericParams, @Body() body: GenericBody) { logger.info( - `Received request ${params.property}/${params.method}, body: ${body}`, + `Received request ${params.property}/${params.method}, body: ${JSON.stringify(body)}`, ); const { property, method } = params; const prop: any = this.agent[property]; - let response = await prop[method].apply(prop, prepareInputData(body.data)); // eslint-disable-line + // eslint-disable-next-line prefer-spread + let response = await prop[method].apply(prop, prepareInputData(body.data)); if (body.subMethod && body.subMethod.name) { const path = body.subMethod.name.split('.'); diff --git a/apps/ssi-abstraction/src/didComm/module.ts b/apps/ssi-abstraction/src/didComm/module.ts index b285420e541e8bb30ab962f3d9213ca429f2299a..76d0684539e47c6806d1fa865590aa56b8f848e1 100644 --- a/apps/ssi-abstraction/src/didComm/module.ts +++ b/apps/ssi-abstraction/src/didComm/module.ts @@ -14,7 +14,7 @@ import config from '@config/config'; name: NATSServices.SERVICE_NAME, transport: Transport.NATS, options: { - servers: [config().nats.url as string], + servers: [config().nats.url], }, }, ]), diff --git a/apps/ssi-abstraction/src/didComm/utils/whitelist.ts b/apps/ssi-abstraction/src/didComm/utils/whitelist.ts index 8560d5f18dc27a64e55879a1076195e210a1b91e..455cd9a2e5d3d3188bdc36532038e8913de9f630 100644 --- a/apps/ssi-abstraction/src/didComm/utils/whitelist.ts +++ b/apps/ssi-abstraction/src/didComm/utils/whitelist.ts @@ -38,53 +38,53 @@ export interface GenericParams { // | 'createOutOfBandRequest' // | 'acceptRequest' | 'declineRequest' - // | 'acceptPresentation' - // | 'getRequestedCredentialsForProofRequest' - // | 'autoSelectCredentialsForProofRequest' - // | 'sendProblemReport' - // | 'sendMessage' - // | 'findAllByQuery' - // | 'registerPublicDid' - // | 'getPublicDid' - // | 'registerSchema' - // | 'getSchema' - // | 'registerCredentialDefinition' - // | 'getCredentialDefinition' - // | 'proposeCredential' - // | 'acceptProposal' - // | 'negotiateProposal' - // | 'offerCredential' - // | 'createOutOfBandOffer' - // | 'acceptOffer' - // | 'declineOffer' - // | 'negotiateOffer' - // | 'acceptCredential' - // | 'initiateMessagePickup' - // | 'pickupMessages' - // | 'setDefaultMediator' - // | 'notifyKeylistUpdate' - // | 'findDefaultMediatorConnection' - // | 'discoverMediation' - // | 'requestMediation' - // | 'findByConnectionId' - // | 'getMediators' - // | 'findDefaultMediator' - // | 'requestAndAwaitGrant' - // | 'provision' - // | 'queueMessage' - // | 'grantRequestedMediation' - // | 'queryFeatures' - // | 'initialize' - // | 'create' - // | 'open' - // | 'close' - // | 'delete' - // | 'initPublicDid' - // | 'createDid' - // | 'pack' - // | 'unpack' - | 'sign' - | 'verify'; + // | 'acceptPresentation' + // | 'getRequestedCredentialsForProofRequest' + // | 'autoSelectCredentialsForProofRequest' + // | 'sendProblemReport' + // | 'sendMessage' + // | 'findAllByQuery' + // | 'registerPublicDid' + // | 'getPublicDid' + // | 'registerSchema' + // | 'getSchema' + // | 'registerCredentialDefinition' + // | 'getCredentialDefinition' + // | 'proposeCredential' + // | 'acceptProposal' + // | 'negotiateProposal' + // | 'offerCredential' + // | 'createOutOfBandOffer' + // | 'acceptOffer' + // | 'declineOffer' + // | 'negotiateOffer' + // | 'acceptCredential' + // | 'initiateMessagePickup' + // | 'pickupMessages' + // | 'setDefaultMediator' + // | 'notifyKeylistUpdate' + // | 'findDefaultMediatorConnection' + // | 'discoverMediation' + // | 'requestMediation' + // | 'findByConnectionId' + // | 'getMediators' + // | 'findDefaultMediator' + // | 'requestAndAwaitGrant' + // | 'provision' + // | 'queueMessage' + // | 'grantRequestedMediation' + // | 'queryFeatures' + // | 'initialize' + // | 'create' + // | 'open' + // | 'close' + // | 'delete' + // | 'initPublicDid' + // | 'createDid' + // | 'pack' + // | 'unpack' + | 'sign' + | 'verify'; // | 'generateNonce'; } @@ -218,9 +218,9 @@ export const checkAll = ( } if ( - body.subMethod && - body.subMethod.name && - subMethodsList.indexOf(body.subMethod.name) <= -1 + body.subMethod + && body.subMethod.name + && subMethodsList.indexOf(body.subMethod.name) <= -1 ) { success = false; messages.push('"subMethod name" either does not exist or is not allowed.'); diff --git a/apps/ssi-abstraction/src/globalUtils/exception.handler.ts b/apps/ssi-abstraction/src/globalUtils/exception.handler.ts index cee8e186c51adb418f0885b119fe8c1cc2f6bb0f..4425a6d4ce11fb0110241b51453285dca6ca2257 100644 --- a/apps/ssi-abstraction/src/globalUtils/exception.handler.ts +++ b/apps/ssi-abstraction/src/globalUtils/exception.handler.ts @@ -27,14 +27,15 @@ export class ExceptionHandler implements ExceptionFilter { const response = ctx.getResponse(); let statusCode = HttpStatus.INTERNAL_SERVER_ERROR; - let message = - exception.message.error || exception.message || 'Something went wrong!'; + let message = exception.message.error || exception.message || 'Something went wrong!'; if (exception instanceof HttpException) { - const errorResponse: any = exception.getResponse(); + const errorResponse = exception.getResponse(); statusCode = exception.getStatus(); - message = errorResponse.error || message; + message = typeof errorResponse === 'object' && 'error' in errorResponse + ? errorResponse.error + : errorResponse || message; } const responseBody: ResponseType = { diff --git a/apps/ssi-abstraction/src/globalUtils/logger.ts b/apps/ssi-abstraction/src/globalUtils/logger.ts index 27a053c3826962fe8010be590465854d2988bca3..cc73b21b3b0b9b591b3651f49c72802456874c70 100644 --- a/apps/ssi-abstraction/src/globalUtils/logger.ts +++ b/apps/ssi-abstraction/src/globalUtils/logger.ts @@ -1,8 +1,7 @@ -import { Logger } from 'winston'; +import winston, { Logger } from 'winston'; import ecsFormat from '@elastic/ecs-winston-format'; -// import { ElasticsearchTransport } from 'winston-elasticsearch'; -import winston = require('winston'); +// import { ElasticsearchTransport } from 'winston-elasticsearch'; // const esTransportOpts = { // clientOpts: { node: process.env.ECSURL }, // }; @@ -21,7 +20,8 @@ const logger: Logger = winston.createLogger({ ], }); -logger.on('error', (error) => { +logger.on('error', (error: Error) => { + // eslint-disable-next-line no-console console.error('Error in logger caught', error); }); diff --git a/apps/ssi-abstraction/src/health/health.controller.ts b/apps/ssi-abstraction/src/health/health.controller.ts index f0a2b9d177e4bac3da34d19a54ee13d7c205aab9..d957968b6e1b9a2802346025489a8438861b30c3 100644 --- a/apps/ssi-abstraction/src/health/health.controller.ts +++ b/apps/ssi-abstraction/src/health/health.controller.ts @@ -1,5 +1,4 @@ import { Controller, Get, HttpStatus } from '@nestjs/common'; -import { ResponseType } from '@common/response'; @Controller('health') export class HealthController { @@ -14,7 +13,7 @@ export class HealthController { return { statusCode: HttpStatus.OK, message: `${new Date()}`, - } as ResponseType; + }; } } diff --git a/apps/ssi-abstraction/src/main.ts b/apps/ssi-abstraction/src/main.ts index 8ebe5c5d4c02d48a632d554a9efc29ae43b79a13..cf7998a29673ea62ffc06bc1fba42d3137d1113f 100644 --- a/apps/ssi-abstraction/src/main.ts +++ b/apps/ssi-abstraction/src/main.ts @@ -18,16 +18,19 @@ async function bootstrap() { await app.startAllMicroservices(); + const afjPort = configService.get('afjExtPort') || 3001; + const servicePort = configService.get('PORT') || 3000; + const afjExtConfig = { - port: configService.get('afjExtPort') || 3001, + port: afjPort, }; + await startServer(agent, afjExtConfig); - logger.info( - `Listening AFJ ext on Port:${configService.get('afjExtPort')}` || 3001, - ); - await app.listen(configService.get('PORT') || 3000, () => { - logger.info(`Listening on Port:${configService.get('PORT')}` || 3000); + logger.info(`Listening AFJ ext on Port: ${afjPort}`); + + await app.listen(servicePort, () => { + logger.info(`Listening on Port: ${servicePort}`); }); } bootstrap(); diff --git a/apps/ssi-abstraction/src/middleware/agentMid.middleware.ts b/apps/ssi-abstraction/src/middleware/agentMid.middleware.ts index c10d5f7aa5d94b0070bed3ded9e0c6ce3b13d7f9..1262257c0ede928a54beb5ff9d181b5cbb673fa5 100644 --- a/apps/ssi-abstraction/src/middleware/agentMid.middleware.ts +++ b/apps/ssi-abstraction/src/middleware/agentMid.middleware.ts @@ -1,7 +1,6 @@ import { Injectable, NestMiddleware, HttpStatus } from '@nestjs/common'; import { Request, NextFunction, Response } from 'express'; import { checkAll } from '../didComm/utils/whitelist'; -import { ResponseType } from '../common/response'; /** * Middleware that checks validity of provided params and body @@ -9,7 +8,7 @@ import { ResponseType } from '../common/response'; */ @Injectable() export class AgentMid implements NestMiddleware { - // eslint-disable-next-line + // eslint-disable-next-line class-methods-use-this use(req: Request, res: Response, next: NextFunction) { const [, prop, method] = req.url.split('/'); if (prop === 'info') { @@ -22,7 +21,7 @@ export class AgentMid implements NestMiddleware { res.send({ statusCode: HttpStatus.BAD_REQUEST, error: whiteListErrors.messages, - } as ResponseType); + }); res.end(); return; } @@ -31,7 +30,7 @@ export class AgentMid implements NestMiddleware { res.send({ statusCode: HttpStatus.BAD_REQUEST, message: 'subMethod.name has to be specified', - } as ResponseType); + }); res.end(); return; } diff --git a/apps/ssi-abstraction/test/health.e2e-spec.ts b/apps/ssi-abstraction/test/health.e2e-spec.ts index 1f685c6552d18d69697207fec9add092ae2cb56d..2969df80680f79d23a13c8bcee01dbdbd7c04edc 100644 --- a/apps/ssi-abstraction/test/health.e2e-spec.ts +++ b/apps/ssi-abstraction/test/health.e2e-spec.ts @@ -18,6 +18,5 @@ describe('HealthController (e2e)', () => { await app.close(); }); - it('/health (GET)', () => - request(app.getHttpServer()).get('/health').expect(200)); + it('/health (GET)', () => request(app.getHttpServer()).get('/health').expect(200)); });