From aa14660c2ac8665c66274398cec37cfec79e0056 Mon Sep 17 00:00:00 2001 From: "Maheiah (AI Assistant)" <7+mahseiah_ai@noreply.localhost> Date: Wed, 6 May 2026 17:41:00 -0400 Subject: [PATCH] feat: add buffer max to buffer appender --- package.json | 2 +- src/buffer-log-appender.ts | 11 ++++++++++- test/buffer-log-appender.test.ts | 30 ++++++++++++++++++++++++++++++ tsconfig.json | 1 + 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 603eafe..02d4965 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jdbernard/logging", - "version": "2.3.3", + "version": "2.4.0", "description": "Simple Javascript logging service.", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/buffer-log-appender.ts b/src/buffer-log-appender.ts index c802722..0313db0 100644 --- a/src/buffer-log-appender.ts +++ b/src/buffer-log-appender.ts @@ -4,6 +4,7 @@ import { LogLevel, type LogMessage } from './log-message' export class BufferLogAppender implements LogAppender { public threshold: LogLevel public buffer: LogMessage[] + public bufferMax?: number constructor(buffer?: LogMessage[], threshold?: LogLevel) { this.buffer = buffer ?? [] @@ -12,7 +13,15 @@ export class BufferLogAppender implements LogAppender { public appendMessage(msg: LogMessage): void { if (this.threshold && msg.level < this.threshold) return - else this.buffer.push(msg) + + this.buffer.push(msg) + + if (this.bufferMax !== undefined) { + const max = Math.max(0, this.bufferMax) + while (this.buffer.length > max) { + this.buffer.shift() + } + } } public clearBuffer(): void { diff --git a/test/buffer-log-appender.test.ts b/test/buffer-log-appender.test.ts index ad1feea..f6a7a22 100644 --- a/test/buffer-log-appender.test.ts +++ b/test/buffer-log-appender.test.ts @@ -39,6 +39,36 @@ describe("BufferLogAppender", () => { expect(appender.buffer[1].msg).toBe("second"); }); + test("defaults to an unbounded buffer", () => { + const appender = new BufferLogAppender(); + + appender.appendMessage(makeMsg({ msg: "first" })); + appender.appendMessage(makeMsg({ msg: "second" })); + appender.appendMessage(makeMsg({ msg: "third" })); + + expect(appender.buffer.length).toBe(3); + expect(appender.buffer.map((message) => message.msg)).toEqual([ + "first", + "second", + "third", + ]); + }); + + test("trims oldest messages when bufferMax is exceeded", () => { + const appender = new BufferLogAppender(); + appender.bufferMax = 2; + + appender.appendMessage(makeMsg({ msg: "first" })); + appender.appendMessage(makeMsg({ msg: "second" })); + appender.appendMessage(makeMsg({ msg: "third" })); + + expect(appender.buffer.length).toBe(2); + expect(appender.buffer.map((message) => message.msg)).toEqual([ + "second", + "third", + ]); + }); + test("respects threshold", () => { const appender = new BufferLogAppender(undefined, LogLevel.WARN); diff --git a/tsconfig.json b/tsconfig.json index 68a7856..65d9ee4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,7 @@ "module": "commonjs", "target": "es2016", "declaration": true, + "rootDir": "./src", "outDir": "./dist", "strict": true, "skipLibCheck": true