diff --git a/packages/backend-common/src/cache/CacheManager.test.ts b/packages/backend-common/src/cache/CacheManager.test.ts index ece4687ee6..05f94d51ec 100644 --- a/packages/backend-common/src/cache/CacheManager.test.ts +++ b/packages/backend-common/src/cache/CacheManager.test.ts @@ -86,6 +86,17 @@ describe('CacheManager', () => { expect(client).toHaveBeenCalledTimes(1); }); + it('attaches error handler to client', () => { + const pluginId = 'error-test'; + const handler = jest.fn(); + manager.forPlugin(pluginId).getClient({ onError: handler }); + + const client = DefaultCacheClient as jest.Mock; + const mockCalls = client.mock.calls.splice(-1); + const realClient = mockCalls[0][0].client as Keyv; + expect(realClient.on).toHaveBeenCalledWith('error', handler); + }); + it('provides different plugins different cache clients', async () => { const plugin1Id = 'test1'; const plugin2Id = 'test2'; diff --git a/packages/backend-common/src/cache/CacheManager.ts b/packages/backend-common/src/cache/CacheManager.ts index 50788be56c..ba736d6121 100644 --- a/packages/backend-common/src/cache/CacheManager.ts +++ b/packages/backend-common/src/cache/CacheManager.ts @@ -73,6 +73,12 @@ export class CacheManager { return { getClient: (opts = {}): CacheClient => { const concreteClient = this.getClientWithTtl(pluginId, opts.defaultTtl); + + // Attach error handler if provided. + if (typeof opts?.onError === 'function') { + concreteClient.on('error', opts.onError); + } + return new DefaultCacheClient({ client: concreteClient, }); diff --git a/packages/backend-common/src/cache/types.ts b/packages/backend-common/src/cache/types.ts index 4dd3cf7d1b..cfd78eddda 100644 --- a/packages/backend-common/src/cache/types.ts +++ b/packages/backend-common/src/cache/types.ts @@ -23,6 +23,12 @@ type ClientOptions = { * can be configured per entry at set-time). */ defaultTtl?: number; + + /** + * An optional handler for connection errors emitted from the underlying data + * store. + */ + onError?: (err: Error) => void }; /**