parseMessages method

  1. @override
List<HubMessage> parseMessages(
  1. Object input,
  2. Logger logger
)
override

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.');
  }
}