feat: add buffer max to buffer appender
Validate / test (pull_request) Successful in 9s

This commit is contained in:
2026-05-06 17:41:00 -04:00
parent 90d7798791
commit aa14660c2a
4 changed files with 42 additions and 2 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@jdbernard/logging", "name": "@jdbernard/logging",
"version": "2.3.3", "version": "2.4.0",
"description": "Simple Javascript logging service.", "description": "Simple Javascript logging service.",
"main": "dist/index.js", "main": "dist/index.js",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
+10 -1
View File
@@ -4,6 +4,7 @@ import { LogLevel, type LogMessage } from './log-message'
export class BufferLogAppender implements LogAppender { export class BufferLogAppender implements LogAppender {
public threshold: LogLevel public threshold: LogLevel
public buffer: LogMessage[] public buffer: LogMessage[]
public bufferMax?: number
constructor(buffer?: LogMessage[], threshold?: LogLevel) { constructor(buffer?: LogMessage[], threshold?: LogLevel) {
this.buffer = buffer ?? [] this.buffer = buffer ?? []
@@ -12,7 +13,15 @@ export class BufferLogAppender implements LogAppender {
public appendMessage(msg: LogMessage): void { public appendMessage(msg: LogMessage): void {
if (this.threshold && msg.level < this.threshold) return 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 { public clearBuffer(): void {
+30
View File
@@ -39,6 +39,36 @@ describe("BufferLogAppender", () => {
expect(appender.buffer[1].msg).toBe("second"); 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", () => { test("respects threshold", () => {
const appender = new BufferLogAppender(undefined, LogLevel.WARN); const appender = new BufferLogAppender(undefined, LogLevel.WARN);
+1
View File
@@ -3,6 +3,7 @@
"module": "commonjs", "module": "commonjs",
"target": "es2016", "target": "es2016",
"declaration": true, "declaration": true,
"rootDir": "./src",
"outDir": "./dist", "outDir": "./dist",
"strict": true, "strict": true,
"skipLibCheck": true "skipLibCheck": true