parseSignalMessage function

SignalMessage? parseSignalMessage(
  1. Map<String, dynamic> json
)

Helper function to parse signal messages from JSON

Implementation

SignalMessage? parseSignalMessage(Map<String, dynamic> json) {
  final typeStr = json['type'] as String?;
  final id = json['id'] as String?;

  if (typeStr == null || id == null) return null;

  switch (typeStr) {
    case 'ack':
      return SignalMessageAck(id: id);
    case 'ping':
      return SignalMessagePing(id: id);
    case 'pong':
      return SignalMessagePong(id: id);
    case 'data':
      final topic = json['topic'] as String?;
      final data = json['data'] as Map<String, dynamic>?;
      final eventType = json['eventType'] as String?;

      if (topic == null) return null;

      // Handle database-specific events
      if (eventType != null) {
        switch (eventType) {
          case 'insert':
            final rows = (json['rows'] as List?)?.cast<Map<String, dynamic>>();
            if (rows != null) {
              return SignalDatabaseInsert(id: id, topic: topic, rows: rows);
            }
            break;
          case 'update':
            final rows = (json['rows'] as List?)?.cast<Map<String, dynamic>>();
            if (rows != null) {
              return SignalDatabaseUpdate(id: id, topic: topic, rows: rows);
            }
            break;
          case 'delete':
            final rowIds = (json['rowIds'] as List?)?.cast<int>();
            if (rowIds != null) {
              return SignalDatabaseDelete(id: id, topic: topic, rowIds: rowIds);
            }
            break;
        }
      }

      // Regular data message
      if (data != null) {
        return SignalMessageData(id: id, topic: topic, data: data);
      }
      break;
    case 'error':
      final codeStr = json['code'] as String?;
      final message = json['message'] as String?;
      if (codeStr != null && message != null) {
        final code = SignalErrorCode.values.firstWhere(
          (e) => e.value == codeStr,
          orElse: () => SignalErrorCode.internalError,
        );
        return SignalMessageError(id: id, code: code, message: message);
      }
      break;
  }

  return null;
}