/** * Server Log Stream 类型定义 * * 这些类型与 @lark-apaas/nestjs-logger 保持一致 * 用于 iframe 端的日志转发功能 */ /** * 后端日志级别 * 与 NestJS LogLevel 对齐,但增加了 fatal */ export type ServerLogLevel = 'fatal' | 'error' | 'warn' | 'log' | 'debug' | 'verbose'; /** * 日志来源 */ export type ServerLogSource = 'server' | 'trace' | 'server-std' | 'client-std' | 'browser'; /** * 日志元数据 */ export interface ServerLogMeta { pid?: number; hostname?: string; service?: string; path?: string; method?: string; statusCode?: number; durationMs?: number; ip?: string; requestBody?: any; responseBody?: any; [key: string]: unknown; } /** * 后端日志对象 * 用于实时推送给前端展示 */ export interface ServerLog { /** * 唯一标识符(UUID) * 用于前端去重和引用 */ id: string; /** * 日志级别 */ level: ServerLogLevel; /** * 时间戳(毫秒) */ timestamp: number; /** * 日志消息 */ message: string; /** * 日志上下文(如 Controller 名称、Service 名称) */ context?: string; /** * 请求追踪 ID * 用于关联同一个请求的所有日志 */ traceId?: string; /** * 用户 ID */ userId?: string; /** * 应用 ID */ appId?: string; /** * 租户 ID */ tenantId?: string; /** * 错误堆栈(仅 ERROR/FATAL 级别) */ stack?: string; /** * 额外的元数据 */ meta?: ServerLogMeta; /** * 自定义标签 * 如 ['server', 'bootstrap'] 或 ['trace', 'http'] */ tags?: string[]; } /** * WebSocket 消息类型(客户端 → 服务端) */ export type ClientToServerMessage = { type: 'SUBSCRIBE'; payload: { levels?: ServerLogLevel[]; tags?: string[]; sources?: ServerLogSource[]; }; } | { type: 'UNSUBSCRIBE'; } | { type: 'GET_HISTORY'; payload: { limit?: number; offset?: number; levels?: ServerLogLevel[]; sources?: ServerLogSource[]; }; } | { type: 'CLEAR_LOGS'; }; /** * WebSocket 消息类型(服务端 → 客户端) */ export type ServerToClientMessage = { type: 'CONNECTED'; payload: { clientId: string; timestamp: number; }; } | { type: 'LOG'; payload: ServerLog; } | { type: 'LOGS_BATCH'; payload: ServerLog[]; } | { type: 'HISTORY'; payload: { logs: ServerLog[]; total: number; hasMore: boolean; }; } | { type: 'LOGS_CLEARED'; } | { type: 'SUBSCRIBED'; payload: { levels?: ServerLogLevel[]; tags?: string[]; sources?: ServerLogSource[]; }; } | { type: 'UNSUBSCRIBED'; } | { type: 'ERROR'; payload: { message: string; code?: string; }; }; /** * PostMessage 类型(iframe → parent) * * iframe 端通过 postMessage 将接收到的 WebSocket 消息转发给父窗口 */ export type ServerLogPostMessage = { type: 'SERVER_LOG'; payload: string; } | { type: 'SERVER_LOG_CONNECTION'; status: 'connected' | 'disconnected' | 'error' | 'connecting'; error?: string; } | { type: 'SERVER_LOG_CLEARED'; }; /** * PostMessage 控制类型(parent → iframe) * * 父窗口可以通过 postMessage 控制 iframe 内的 SSE 客户端 */ export type ServerLogControlMessage = { type: 'SERVER_LOG_CONTROL'; action: 'pause' | 'resume' | 'stop' | 'reconnect'; };