parseSignalMessage function
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;
}