feat: add buffer max to buffer appender
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user