diff --git a/packages/websockets/src/Domain/Handler/WebSocketMessageRequestedEventHandler.ts b/packages/websockets/src/Domain/Handler/WebSocketMessageRequestedEventHandler.ts index ae0e9b468..a72245c02 100644 --- a/packages/websockets/src/Domain/Handler/WebSocketMessageRequestedEventHandler.ts +++ b/packages/websockets/src/Domain/Handler/WebSocketMessageRequestedEventHandler.ts @@ -1,14 +1,20 @@ import { DomainEventHandlerInterface, WebSocketMessageRequestedEvent } from '@standardnotes/domain-events' import { inject, injectable } from 'inversify' +import { Logger } from 'winston' import TYPES from '../../Bootstrap/Types' import { ClientMessengerInterface } from '../../Client/ClientMessengerInterface' @injectable() export class WebSocketMessageRequestedEventHandler implements DomainEventHandlerInterface { - constructor(@inject(TYPES.WebSocketsClientMessenger) private webSocketsClientMessenger: ClientMessengerInterface) {} + constructor( + @inject(TYPES.WebSocketsClientMessenger) private webSocketsClientMessenger: ClientMessengerInterface, + @inject(TYPES.Logger) private logger: Logger, + ) {} async handle(event: WebSocketMessageRequestedEvent): Promise { + this.logger.debug(`Sending message to user ${event.payload.userUuid}`) + await this.webSocketsClientMessenger.send(event.payload.userUuid, event.payload.message) } } diff --git a/packages/websockets/src/Infra/WebSockets/WebSocketsClientMessenger.ts b/packages/websockets/src/Infra/WebSockets/WebSocketsClientMessenger.ts index 86b969a62..88d6e6515 100644 --- a/packages/websockets/src/Infra/WebSockets/WebSocketsClientMessenger.ts +++ b/packages/websockets/src/Infra/WebSockets/WebSocketsClientMessenger.ts @@ -1,4 +1,5 @@ import { AxiosInstance } from 'axios' +import { Logger } from 'winston' import { inject, injectable } from 'inversify' import TYPES from '../../Bootstrap/Types' @@ -12,13 +13,15 @@ export class WebSocketsClientMessenger implements ClientMessengerInterface { private webSocketsConnectionRepository: WebSocketsConnectionRepositoryInterface, @inject(TYPES.HTTPClient) private httpClient: AxiosInstance, @inject(TYPES.WEBSOCKETS_API_URL) private webSocketsApiUrl: string, + @inject(TYPES.Logger) private logger: Logger, ) {} async send(userUuid: string, message: string): Promise { const userConnections = await this.webSocketsConnectionRepository.findAllByUserUuid(userUuid) for (const connectionUuid of userConnections) { - await this.httpClient.request({ + this.logger.debug(`Sending message to connection ${connectionUuid} for user ${userUuid}`) + const response = await this.httpClient.request({ method: 'POST', url: `${this.webSocketsApiUrl}/${connectionUuid}`, headers: { @@ -30,6 +33,9 @@ export class WebSocketsClientMessenger implements ClientMessengerInterface { /* istanbul ignore next */ (status: number) => status >= 200 && status < 500, }) + if (response.status !== 200) { + this.logger.error(`Could not send message to connection ${connectionUuid} for user ${userUuid}`) + } } } } diff --git a/packages/websockets/src/Infra/WebSockets/WebSocketsClientService.spec.ts b/packages/websockets/src/Infra/WebSockets/WebSocketsClientService.spec.ts index fa9120957..c772a2558 100644 --- a/packages/websockets/src/Infra/WebSockets/WebSocketsClientService.spec.ts +++ b/packages/websockets/src/Infra/WebSockets/WebSocketsClientService.spec.ts @@ -2,6 +2,7 @@ import 'reflect-metadata' import { WebSocketsConnectionRepositoryInterface } from '../../Domain/WebSockets/WebSocketsConnectionRepositoryInterface' import { AxiosInstance } from 'axios' +import { Logger } from 'winston' import { WebSocketsClientMessenger } from './WebSocketsClientMessenger' @@ -9,11 +10,12 @@ describe('WebSocketsClientMessenger', () => { let connectionIds: string[] let webSocketsConnectionRepository: WebSocketsConnectionRepositoryInterface let httpClient: AxiosInstance + let logger: Logger const webSocketsApiUrl = 'http://test-websockets' const createService = () => - new WebSocketsClientMessenger(webSocketsConnectionRepository, httpClient, webSocketsApiUrl) + new WebSocketsClientMessenger(webSocketsConnectionRepository, httpClient, webSocketsApiUrl, logger) beforeEach(() => { connectionIds = ['1', '2'] @@ -22,7 +24,11 @@ describe('WebSocketsClientMessenger', () => { webSocketsConnectionRepository.findAllByUserUuid = jest.fn().mockReturnValue(connectionIds) httpClient = {} as jest.Mocked - httpClient.request = jest.fn() + httpClient.request = jest.fn().mockReturnValue({ status: 200 }) + + logger = {} as jest.Mocked + logger.debug = jest.fn() + logger.error = jest.fn() }) it('should send a message to all user connections', async () => { @@ -40,4 +46,12 @@ describe('WebSocketsClientMessenger', () => { ) }) }) + + it('should log an error if message could not be sent', async () => { + httpClient.request = jest.fn().mockReturnValue({ status: 400 }) + + await createService().send('1-2-3', 'message') + + expect(logger.error).toHaveBeenCalledTimes(connectionIds.length) + }) })