{"version":3,"file":"index.cjs","names":["LoggerTransport"],"sources":["../../src/file/index.ts"],"sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createWriteStream, existsSync, readFileSync } from 'node:fs';\nimport { LoggerTransport } from '@mastra/core/logger';\nimport type { BaseLogMessage, LogLevel } from '@mastra/core/logger';\n\nexport class FileTransport extends LoggerTransport {\n  path: string;\n  fileStream: WriteStream;\n  constructor({ path }: { path: string }) {\n    super({ objectMode: true });\n    this.path = path;\n\n    if (!existsSync(this.path)) {\n      console.info(this.path);\n      throw new Error('File path does not exist');\n    }\n\n    this.fileStream = createWriteStream(this.path, { flags: 'a' });\n  }\n\n  _transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk: any) => void) {\n    try {\n      this.fileStream.write(chunk);\n    } catch (error) {\n      console.error('Error parsing log entry:', error);\n    }\n    callback(null, chunk);\n  }\n\n  _flush(callback: Function) {\n    // End the file stream when transform stream ends\n    this.fileStream.end(() => {\n      callback();\n    });\n  }\n\n  _write(chunk: any, encoding?: string, callback?: (error?: Error | null) => void): boolean {\n    if (typeof callback === 'function') {\n      this._transform(chunk, encoding || 'utf8', callback);\n      return true;\n    }\n\n    this._transform(chunk, encoding || 'utf8', (error: Error | null) => {\n      if (error) console.error('Transform error in write:', error);\n    });\n    return true;\n  }\n\n  // Clean up resources\n  _destroy(error: Error, callback: Function) {\n    if (this.fileStream) {\n      this.fileStream.destroy(error);\n    }\n    callback(error);\n  }\n\n  async listLogs(params?: {\n    fromDate?: Date;\n    toDate?: Date;\n    logLevel?: LogLevel;\n    filters?: Record<string, any>;\n    returnPaginationResults?: boolean; // default true\n    page?: number;\n    perPage?: number;\n  }): Promise<{\n    logs: BaseLogMessage[];\n    total: number;\n    page: number;\n    perPage: number;\n    hasMore: boolean;\n  }> {\n    try {\n      const {\n        fromDate,\n        toDate,\n        logLevel,\n        filters,\n        returnPaginationResults: returnPaginationResultsInput,\n        page: pageInput,\n        perPage: perPageInput,\n      } = params || {};\n\n      const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n      const perPage = perPageInput ?? 100;\n      const returnPaginationResults = returnPaginationResultsInput ?? true;\n\n      const logs = readFileSync(this.path, 'utf8')\n        .split('\\n')\n        .filter(Boolean)\n        .map(log => JSON.parse(log));\n\n      let filteredLogs = logs.filter(record => record !== null && typeof record === 'object');\n\n      if (filters) {\n        filteredLogs = filteredLogs.filter(log =>\n          Object.entries(filters || {}).every(([key, value]) => log[key as keyof BaseLogMessage] === value),\n        );\n      }\n\n      if (logLevel) {\n        filteredLogs = filteredLogs.filter(log => log.level === logLevel);\n      }\n\n      if (fromDate) {\n        filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() >= fromDate!.getTime());\n      }\n\n      if (toDate) {\n        filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() <= toDate!.getTime());\n      }\n\n      if (!returnPaginationResults) {\n        return {\n          logs: filteredLogs,\n          total: filteredLogs.length,\n          page,\n          perPage: filteredLogs.length,\n          hasMore: false,\n        };\n      }\n\n      const total = filteredLogs.length;\n      const resolvedPerPage = perPage || 100;\n      const start = (page - 1) * resolvedPerPage;\n      const end = start + resolvedPerPage;\n      const paginatedLogs = filteredLogs.slice(start, end);\n      const hasMore = end < total;\n\n      return {\n        logs: paginatedLogs,\n        total,\n        page,\n        perPage: resolvedPerPage,\n        hasMore,\n      };\n    } catch (error) {\n      console.error('Error getting logs from file:', error);\n      return {\n        logs: [],\n        total: 0,\n        page: 0,\n        perPage: 0,\n        hasMore: false,\n      };\n    }\n  }\n\n  async listLogsByRunId({\n    runId,\n    fromDate,\n    toDate,\n    logLevel,\n    filters,\n    page: pageInput,\n    perPage: perPageInput,\n  }: {\n    runId: string;\n    fromDate?: Date;\n    toDate?: Date;\n    logLevel?: LogLevel;\n    filters?: Record<string, any>;\n    page?: number;\n    perPage?: number;\n  }): Promise<{\n    logs: BaseLogMessage[];\n    total: number;\n    page: number;\n    perPage: number;\n    hasMore: boolean;\n  }> {\n    try {\n      const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n      const perPage = perPageInput ?? 100;\n      const allLogs = await this.listLogs({ fromDate, toDate, logLevel, filters });\n      const logs = (allLogs?.logs?.filter(log => log?.runId === runId) || []) as BaseLogMessage[];\n      const total = logs.length;\n      const resolvedPerPage = perPage || 100;\n      const start = (page - 1) * resolvedPerPage;\n      const end = start + resolvedPerPage;\n      const paginatedLogs = logs.slice(start, end);\n      const hasMore = end < total;\n\n      return {\n        logs: paginatedLogs,\n        total,\n        page,\n        perPage: resolvedPerPage,\n        hasMore,\n      };\n    } catch (error) {\n      console.error('Error getting logs by runId from file:', error);\n      return {\n        logs: [],\n        total: 0,\n        page: 0,\n        perPage: 0,\n        hasMore: false,\n      };\n    }\n  }\n}\n"],"mappings":"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"}