diff --git a/lib/models/terminal_models.dart b/lib/models/terminal_models.dart new file mode 100644 index 00000000..8c42874a --- /dev/null +++ b/lib/models/terminal_models.dart @@ -0,0 +1,164 @@ +import 'package:apidash_core/apidash_core.dart' show APIType, HTTPVerb; + +/// Source category of a terminal entry +enum TerminalSource { network, js, system } + +/// Severity level of a terminal entry +enum TerminalLevel { debug, info, warn, error } + +/// Phase of a network log lifecycle +enum NetworkPhase { started, progress, completed, failed } + +class BodyChunk { + BodyChunk({required this.ts, required this.text, required this.sizeBytes}); + + final DateTime ts; + final String text; // preview text (could be partial) + final int sizeBytes; +} + +class NetworkLogData { + NetworkLogData({ + required this.phase, + required this.apiType, + required this.method, + required this.url, + this.requestHeaders, + this.requestBodyPreview, + this.responseStatus, + this.responseHeaders, + this.responseBodyPreview, + this.duration, + this.isStreaming = false, + this.sentAt, + this.completedAt, + this.errorMessage, + List? chunks, + }) : chunks = chunks ?? []; + + final NetworkPhase phase; + final APIType apiType; + final HTTPVerb method; + final String url; + final Map? requestHeaders; + final String? requestBodyPreview; + final int? responseStatus; + final Map? responseHeaders; + final String? responseBodyPreview; + final Duration? duration; + final bool isStreaming; + final DateTime? sentAt; + final DateTime? completedAt; + final String? errorMessage; + final List chunks; + + NetworkLogData copyWith({ + NetworkPhase? phase, + APIType? apiType, + HTTPVerb? method, + String? url, + Map? requestHeaders, + String? requestBodyPreview, + int? responseStatus, + Map? responseHeaders, + String? responseBodyPreview, + Duration? duration, + bool? isStreaming, + DateTime? sentAt, + DateTime? completedAt, + String? errorMessage, + List? chunks, + }) { + return NetworkLogData( + phase: phase ?? this.phase, + apiType: apiType ?? this.apiType, + method: method ?? this.method, + url: url ?? this.url, + requestHeaders: requestHeaders ?? this.requestHeaders, + requestBodyPreview: requestBodyPreview ?? this.requestBodyPreview, + responseStatus: responseStatus ?? this.responseStatus, + responseHeaders: responseHeaders ?? this.responseHeaders, + responseBodyPreview: responseBodyPreview ?? this.responseBodyPreview, + duration: duration ?? this.duration, + isStreaming: isStreaming ?? this.isStreaming, + sentAt: sentAt ?? this.sentAt, + completedAt: completedAt ?? this.completedAt, + errorMessage: errorMessage ?? this.errorMessage, + chunks: chunks ?? this.chunks, + ); + } +} + +class JsLogData { + JsLogData({ + required this.level, + required this.args, + this.stack, + this.context, + this.contextRequestId, + }); + + final String level; // log | warn | error | fatal + final List args; + final String? stack; + final String? context; // preRequest | postResponse | global + final String? contextRequestId; +} + +class SystemLogData { + SystemLogData({required this.category, required this.message, this.stack}); + final String category; // ui | provider | io | storage | unknown + final String message; + final String? stack; +} + +class TerminalEntry { + TerminalEntry({ + required this.id, + required this.ts, + required this.source, + required this.level, + this.requestId, + this.correlationId, + this.tags = const [], + this.network, + this.js, + this.system, + }); + + final String id; + final DateTime ts; + final TerminalSource source; + final TerminalLevel level; + final String? requestId; // App request id for correlation + final String? correlationId; // Additional correlation if any + final List tags; + final NetworkLogData? network; + final JsLogData? js; + final SystemLogData? system; + + TerminalEntry copyWith({ + DateTime? ts, + TerminalSource? source, + TerminalLevel? level, + String? requestId, + String? correlationId, + List? tags, + NetworkLogData? network, + JsLogData? js, + SystemLogData? system, + }) { + return TerminalEntry( + id: id, + ts: ts ?? this.ts, + source: source ?? this.source, + level: level ?? this.level, + requestId: requestId ?? this.requestId, + correlationId: correlationId ?? this.correlationId, + tags: tags ?? this.tags, + network: network ?? this.network, + js: js ?? this.js, + system: system ?? this.system, + ); + } +}