parseMessages method
Creates an array of HubMessage objects from the specified serialized representation.
input
A string containing the serialized representation.
logger
A logger that will be used to log messages that occur during parsing.
Implementation
@override
List<HubMessage> parseMessages(Object input, Logger logger) {
if (input is String) {
final hubMessages = <HubMessage>[];
// Parse the messages
final messages = TextMessageFormat.parse(input);
for (final message in messages) {
final obj = json.decode(message) as Map<String, dynamic>;
final type = obj['type'];
if (type is int) {
final value = MessageType.fromJSON(type);
HubMessage parsedMessage;
switch (value) {
case MessageType.invocation:
try {
parsedMessage = InvocationMessage.fromJSON(obj);
_isInvocationMessage(parsedMessage as InvocationMessage);
} catch (_) {
throw Exception('Invalid payload for Invocation message.');
}
break;
case MessageType.streamItem:
try {
parsedMessage = StreamItemMessage.fromJSON(obj);
_isStreamItemMessage(parsedMessage as StreamItemMessage);
} catch (_) {
throw Exception('Invalid payload for StreamItem message.');
}
break;
case MessageType.completion:
try {
parsedMessage = CompletionMessage.fromJSON(obj);
_isCompletionMessage(parsedMessage as CompletionMessage);
} catch (_) {
throw Exception('Invalid payload for Completion message.');
}
break;
case MessageType.ping:
parsedMessage = PingMessage.fromJSON(obj);
// Single value, no need to validate
break;
case MessageType.close:
parsedMessage = CloseMessage.fromJSON(obj);
// All optional values, no need to validate
break;
default:
// Future protocol changes can add message types, old clients can ignore them
logger.log(LogLevel.information,
"Unknown message type '$value' ignored.");
continue;
}
hubMessages.add(parsedMessage);
} else {
throw Exception('Invalid payload.');
}
}
return hubMessages;
} else {
throw Exception(
'Invalid input for JSON hub protocol. Expected a string.');
}
}