report method

Future<void> report(
  1. Object error,
  2. StackTrace stackTrace, {
  3. String category = 'app.error',
  4. bool fatal = false,
  5. String? message,
  6. Map<String, String>? metadata,
  7. bool present = false,
  8. MeshErrorSeverity severity = MeshErrorSeverity.error,
})

Implementation

Future<void> report(
  Object error,
  StackTrace stackTrace, {
  String category = 'app.error',
  bool fatal = false,
  String? message,
  Map<String, String>? metadata,
  bool present = false,
  MeshErrorSeverity severity = MeshErrorSeverity.error,
}) async {
  if (_isDuplicate(error, stackTrace, category)) {
    return;
  }
  final entry = <String, Object?>{
    'level': 'ERROR',
    'category': category,
    'fatal': fatal,
    'error': error.toString(),
    'message': message,
    'stackTrace': stackTrace.toString(),
    'timestamp': DateTime.now().toIso8601String(),
    if (metadata != null && metadata.isNotEmpty) 'metadata': metadata,
  };
  debugPrint(jsonEncode(entry));

  if (present) {
    _notices.add(
      MeshErrorNotice(
        category: category,
        message: message ?? _resolveUserMessage(error, stackTrace, category),
        severity: fatal ? MeshErrorSeverity.fatal : severity,
        timestamp: DateTime.now(),
        error: error,
        stackTrace: stackTrace,
      ),
    );
  }

  if (!_remoteReportingEnabled) {
    return;
  }

  try {
    await Proxy.mpi<DataHouse>().write(
      Document(
        metadata: <String, String>{
          'kind': 'flutter_error',
          'category': category,
          'fatal': fatal.toString(),
          if (metadata != null) ...metadata,
        },
        content: jsonEncode(entry),
        timestamp: DateTime.now().millisecondsSinceEpoch,
      ),
    );
  } catch (reportingError, reportingStackTrace) {
    debugPrint(
      jsonEncode(<String, Object?>{
        'level': 'ERROR',
        'category': 'app.error_report_failed',
        'error': reportingError.toString(),
        'stackTrace': reportingStackTrace.toString(),
        'timestamp': DateTime.now().toIso8601String(),
      }),
    );
  }
}