diff --git a/src/server/notifications/ListeningActivityHandler.ts b/src/server/notifications/ListeningActivityHandler.ts index be1e8ae9f..422dfda2a 100644 --- a/src/server/notifications/ListeningActivityHandler.ts +++ b/src/server/notifications/ListeningActivityHandler.ts @@ -57,9 +57,18 @@ export class ListeningActivityHandler extends StaticHandler { // No need to wait on this to resolve before going to the next channel. // Prevent failed notification from blocking other notifications. - this.handler.handleSafe({ channel, activity, topic }).catch((error): void => { - this.logger.error(`Error trying to handle notification for ${id}: ${createErrorMessage(error)}`); - }); + this.handler.handleSafe({ channel, activity, topic }) + .then((): Promise => { + // Update the `lastEmit` value if the channel has a rate limit + if (channel.rate) { + channel.lastEmit = Date.now(); + return this.storage.update(channel); + } + return Promise.resolve(); + }) + .catch((error): void => { + this.logger.error(`Error trying to handle notification for ${id}: ${createErrorMessage(error)}`); + }); } } } diff --git a/test/unit/server/notifications/ListeningActivityHandler.test.ts b/test/unit/server/notifications/ListeningActivityHandler.test.ts index 467da7c6d..99fa68536 100644 --- a/test/unit/server/notifications/ListeningActivityHandler.test.ts +++ b/test/unit/server/notifications/ListeningActivityHandler.test.ts @@ -38,6 +38,7 @@ describe('A ListeningActivityHandler', (): void => { storage = { getAll: jest.fn().mockResolvedValue([ channel.id ]), get: jest.fn().mockResolvedValue(channel), + update: jest.fn(), } as any; emitter = new EventEmitter() as any; @@ -58,6 +59,25 @@ describe('A ListeningActivityHandler', (): void => { expect(notificationHandler.handleSafe).toHaveBeenCalledTimes(1); expect(notificationHandler.handleSafe).toHaveBeenLastCalledWith({ channel, activity, topic }); expect(logger.error).toHaveBeenCalledTimes(0); + expect(storage.update).toHaveBeenCalledTimes(0); + }); + + it('updates the lastEmit value of the channel if it has a rate limit.', async(): Promise => { + jest.useFakeTimers(); + channel.rate = 10 * 1000; + emitter.emit('changed', topic, activity); + + await flushPromises(); + + expect(notificationHandler.handleSafe).toHaveBeenCalledTimes(1); + expect(notificationHandler.handleSafe).toHaveBeenLastCalledWith({ channel, activity, topic }); + expect(logger.error).toHaveBeenCalledTimes(0); + expect(storage.update).toHaveBeenCalledTimes(1); + expect(storage.update).toHaveBeenLastCalledWith({ + ...channel, + lastEmit: Date.now(), + }); + jest.useRealTimers(); }); it('does not emit an event on channels if their rate does not yet allow it.', async(): Promise => {