mira-app-server
Version:
Mira Server - standalone server application using mira-app-core
64 lines • 1.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.logRingBuffer = exports.LogRingBuffer = void 0;
class LogRingBuffer {
constructor(capacity = 100) {
this.capacity = capacity;
this.buffer = [];
this.subscribers = new Set();
}
/** 追加一条日志并通知订阅者 */
push(level, args) {
const line = args.map(arg => formatArg(arg)).join(' ');
const entry = {
timestamp: new Date().toISOString(),
level,
line,
};
this.buffer.push(entry);
if (this.buffer.length > this.capacity) {
// 丢弃最旧条目,保持容量
this.buffer.splice(0, this.buffer.length - this.capacity);
}
// 复制一份再遍历,避免订阅者中再触发 push 造成迭代异常
for (const subscriber of [...this.subscribers]) {
try {
subscriber(entry);
}
catch {
// 订阅者异常不应影响日志主流程
}
}
}
/** 返回当前缓冲区快照(按时间正序) */
recent() {
return [...this.buffer];
}
/** 订阅新增日志,返回反订阅函数 */
subscribe(fn) {
this.subscribers.add(fn);
return () => this.subscribers.delete(fn);
}
/** 当前条目数(测试 / 诊断用) */
size() {
return this.buffer.length;
}
}
exports.LogRingBuffer = LogRingBuffer;
function formatArg(arg) {
if (arg instanceof Error) {
return arg.stack || `${arg.name}: ${arg.message}`;
}
if (typeof arg === 'object' && arg !== null) {
try {
return JSON.stringify(arg);
}
catch {
return String(arg);
}
}
return String(arg);
}
/** 全进程共享单例 */
exports.logRingBuffer = new LogRingBuffer(100);
//# sourceMappingURL=LogRingBuffer.js.map