deserialize method

  1. @override
AbstractMessage? deserialize(
  1. Uint8List? message
)
override

Deserialize a given message

Implementation

@override
AbstractMessage? deserialize(Uint8List? message) {
  if (message == null) {
    return null;
  }
  final fastPathMessage = _deserializeFastPathMessage(message);
  if (fastPathMessage != null) {
    return fastPathMessage;
  }
  final decodedMessage = cbor.decode(message.toList());
  if (decodedMessage is CborList) {
    final cborMessageId = decodedMessage[0];
    if (cborMessageId is CborInt) {
      final messageId = cborMessageId.toInt();
      if (messageId == MessageTypes.codeAbort && decodedMessage.length == 3) {
        return Abort(
          (decodedMessage[2] as CborString).toString(),
          message:
              decodedMessage[1] is CborMap &&
                  (decodedMessage[1] as CborMap)[CborString('message')] !=
                      null
              ? ((decodedMessage[1] as CborMap)[CborString('message')]
                        as CborString)
                    .toString()
              : null,
        );
      }
      if (messageId == MessageTypes.codeChallenge &&
          decodedMessage.length == 3) {
        final extraMap = _cborMapToStringMap(decodedMessage[2] as CborMap);
        return Challenge(
          (decodedMessage[1] as CborString).toString(),
          Extra.fromMap(extraMap),
        );
      }
      if (messageId == MessageTypes.codeHello && decodedMessage.length == 3) {
        return Hello(
          (decodedMessage[1] as CborString?)?.toString(),
          _decodeDetailsMap(
            _cborMapToStringMap(decodedMessage[2] as CborMap),
          ),
        );
      }
      if (messageId == MessageTypes.codeAuthenticate &&
          decodedMessage.length == 3) {
        return Authenticate(
            signature: (decodedMessage[1] as CborString?)?.toString(),
          )
          ..extra = decodedMessage[2] is CborMap
              ? Map<String, Object?>.from(
                  _cborMapToStringMap(decodedMessage[2] as CborMap),
                )
              : <String, Object?>{};
      }
      if (messageId == MessageTypes.codeWelcome &&
          decodedMessage.length == 3) {
        return Welcome(
          (decodedMessage[1] as CborInt).toInt(),
          _decodeDetailsMap(
            _cborMapToStringMap(decodedMessage[2] as CborMap),
          ),
        );
      }
      if (messageId == MessageTypes.codeRegister &&
          decodedMessage.length == 4) {
        return Register(
          (decodedMessage[1] as CborInt).toInt(),
          (decodedMessage[3] as CborString).toString(),
          options: _decodeRegisterOptions(
            decodedMessage[2] is CborMap
                ? _cborMapToStringMap(decodedMessage[2] as CborMap)
                : null,
          ),
        );
      }
      if (messageId == MessageTypes.codeUnregister &&
          decodedMessage.length == 3) {
        return Unregister(
          (decodedMessage[1] as CborInt).toInt(),
          (decodedMessage[2] as CborInt).toInt(),
        );
      }
      if (messageId == MessageTypes.codeCall && decodedMessage.length >= 4) {
        return _addPayload(
          Call(
            (decodedMessage[1] as CborInt).toInt(),
            (decodedMessage[3] as CborString).toString(),
            options: _decodeCallOptions(
              decodedMessage[2] is CborMap
                  ? _cborMapToStringMap(decodedMessage[2] as CborMap)
                  : null,
            ),
          ),
          decodedMessage,
          4,
        );
      }
      if (messageId == MessageTypes.codeYield && decodedMessage.length >= 2) {
        return _addPayload(
          Yield(
            (decodedMessage[1] as CborInt).toInt(),
            options: _decodeYieldOptions(
              decodedMessage.length > 2 && decodedMessage[2] is CborMap
                  ? _cborMapToStringMap(decodedMessage[2] as CborMap)
                  : null,
            ),
          ),
          decodedMessage,
          3,
        );
      }
      if (messageId == MessageTypes.codePublish &&
          decodedMessage.length >= 4) {
        return _addPayload(
          Publish(
            (decodedMessage[1] as CborInt).toInt(),
            (decodedMessage[3] as CborString).toString(),
            options: _decodePublishOptions(
              decodedMessage[2] is CborMap
                  ? _cborMapToStringMap(decodedMessage[2] as CborMap)
                  : null,
            ),
          ),
          decodedMessage,
          4,
        );
      }
      if (messageId == MessageTypes.codeInterrupt &&
          decodedMessage.length >= 2) {
        final options =
            decodedMessage.length > 2 && decodedMessage[2] is CborMap
            ? (() {
                final options = InterruptOptions();
                options.mode =
                    ((decodedMessage[2] as CborMap)[CborString('mode')]
                            as CborString?)
                        ?.toString();
                return options;
              })()
            : null;
        return Interrupt(
          (decodedMessage[1] as CborInt).toInt(),
          options: options,
        );
      }
      if (messageId == MessageTypes.codeCancel &&
          decodedMessage.length >= 2) {
        final options =
            decodedMessage.length > 2 && decodedMessage[2] is CborMap
            ? (() {
                final options = CancelOptions();
                options.mode =
                    ((decodedMessage[2] as CborMap)[CborString('mode')]
                            as CborString?)
                        ?.toString();
                return options;
              })()
            : null;
        return Cancel(
          (decodedMessage[1] as CborInt).toInt(),
          options: options,
        );
      }
      if (messageId == MessageTypes.codeRegistered &&
          decodedMessage.length == 3) {
        return Registered(
          (decodedMessage[1] as CborInt).toInt(),
          (decodedMessage[2] as CborInt).toInt(),
        );
      }
      if (messageId == MessageTypes.codeUnregistered &&
          decodedMessage.length == 2) {
        return Unregistered((decodedMessage[1] as CborInt).toInt());
      }
      if (messageId == MessageTypes.codeInvocation &&
          decodedMessage.length > 3) {
        final detailsMap = _cborMapToStringMap(decodedMessage[3] as CborMap);
        final callerValue = detailsMap.remove('caller');
        final int? caller = callerValue is num ? callerValue.toInt() : null;
        final procedureValue = detailsMap.remove('procedure');
        final String? procedure = procedureValue as String?;
        final progressValue = detailsMap.remove('progress');
        final bool? progress = progressValue is bool ? progressValue : null;
        final receiveProgressValue = detailsMap.remove('receive_progress');
        final bool? receiveProgress = receiveProgressValue is bool
            ? receiveProgressValue
            : null;
        final timeoutValue = detailsMap.remove('timeout');
        final int? timeout = timeoutValue is num
            ? timeoutValue.toInt()
            : null;
        final pptSchemeValue = detailsMap.remove('ppt_scheme');
        final String? pptScheme = pptSchemeValue as String?;
        final pptSerializerValue = detailsMap.remove('ppt_serializer');
        final String? pptSerializer = pptSerializerValue as String?;
        final pptCipherValue = detailsMap.remove('ppt_cipher');
        final String? pptCipher = pptCipherValue as String?;
        final pptKeyIdValue = detailsMap.remove('ppt_keyid');
        final String? pptKeyId = pptKeyIdValue as String?;
        return _addPayload(
          Invocation(
            (decodedMessage[1] as CborInt).toInt(),
            (decodedMessage[2] as CborInt).toInt(),
            InvocationDetails(
                caller,
                procedure,
                receiveProgress,
                pptScheme,
                pptSerializer,
                pptCipher,
                pptKeyId,
                detailsMap,
              )
              ..progress = progress
              ..timeout = timeout,
          ),
          decodedMessage,
          4,
        );
      }
      if (messageId == MessageTypes.codeResult && decodedMessage.length > 2) {
        final detailsMap = _cborMapToStringMap(decodedMessage[2] as CborMap);
        final progressValue = detailsMap.remove('progress');
        final bool? progress = progressValue is bool ? progressValue : null;
        final pptSchemeValue = detailsMap.remove('ppt_scheme');
        final String? pptScheme = pptSchemeValue as String?;
        final pptSerializerValue = detailsMap.remove('ppt_serializer');
        final String? pptSerializer = pptSerializerValue as String?;
        final pptCipherValue = detailsMap.remove('ppt_cipher');
        final String? pptCipher = pptCipherValue as String?;
        final pptKeyIdValue = detailsMap.remove('ppt_keyid');
        final String? pptKeyId = pptKeyIdValue as String?;
        return _addPayload(
          Result(
            (decodedMessage[1] as CborInt).toInt(),
            ResultDetails(
              progress: progress,
              pptScheme: pptScheme,
              pptSerializer: pptSerializer,
              pptCipher: pptCipher,
              pptKeyId: pptKeyId,
              custom: detailsMap,
            ),
          ),
          decodedMessage,
          3,
        );
      }
      if (messageId == MessageTypes.codePublished &&
          decodedMessage.length == 3) {
        return Published(
          (decodedMessage[1] as CborInt).toInt(),
          (decodedMessage[2] as CborInt).toInt(),
        );
      }
      if (messageId == MessageTypes.codeSubscribed &&
          decodedMessage.length == 3) {
        return Subscribed(
          (decodedMessage[1] as CborInt).toInt(),
          (decodedMessage[2] as CborInt).toInt(),
        );
      }
      if (messageId == MessageTypes.codeSubscribe &&
          decodedMessage.length == 4) {
        return Subscribe(
          (decodedMessage[1] as CborInt).toInt(),
          (decodedMessage[3] as CborString).toString(),
          options: _decodeSubscribeOptions(
            decodedMessage[2] is CborMap
                ? _cborMapToStringMap(decodedMessage[2] as CborMap)
                : null,
          ),
        );
      }
      if (messageId == MessageTypes.codeUnsubscribe &&
          decodedMessage.length == 3) {
        return Unsubscribe(
          (decodedMessage[1] as CborInt).toInt(),
          (decodedMessage[2] as CborInt).toInt(),
        );
      }
      if (messageId == MessageTypes.codeUnsubscribed &&
          decodedMessage.length > 1) {
        return Unsubscribed(
          (decodedMessage[1] as CborInt).toInt(),
          decodedMessage.length == 2
              ? null
              : UnsubscribedDetails(
                  (decodedMessage[2] as CborMap)[CborString(
                            'subscription',
                          )] ==
                          null
                      ? null
                      : ((decodedMessage[2] as CborMap)[CborString(
                                  'subscription',
                                )]
                                as CborInt)
                            .toInt(),
                  (decodedMessage[2] as CborMap)[CborString('reason')] == null
                      ? null
                      : ((decodedMessage[2] as CborMap)[CborString('reason')]
                                as CborString)
                            .toString(),
                ),
        );
      }
      if (messageId == MessageTypes.codeEvent && decodedMessage.length > 3) {
        final detailsMap = _cborMapToStringMap(decodedMessage[3] as CborMap);
        final publisherValue = detailsMap.remove('publisher');
        final int? publisher = publisherValue is num
            ? publisherValue.toInt()
            : null;
        final trustLevelValue = detailsMap.remove('trustlevel');
        final int? trustLevel = trustLevelValue is num
            ? trustLevelValue.toInt()
            : null;
        final topicValue = detailsMap.remove('topic');
        final String? topic = topicValue as String?;
        final pptSchemeValue = detailsMap.remove('ppt_scheme');
        final String? pptScheme = pptSchemeValue as String?;
        final pptSerializerValue = detailsMap.remove('ppt_serializer');
        final String? pptSerializer = pptSerializerValue as String?;
        final pptCipherValue = detailsMap.remove('ppt_cipher');
        final String? pptCipher = pptCipherValue as String?;
        final pptKeyIdValue = detailsMap.remove('ppt_keyid');
        final String? pptKeyId = pptKeyIdValue as String?;
        return _addPayload(
          Event(
            (decodedMessage[1] as CborInt).toInt(),
            (decodedMessage[2] as CborInt).toInt(),
            EventDetails(
              publisher: publisher,
              trustlevel: trustLevel,
              topic: topic,
              pptScheme: pptScheme,
              pptSerializer: pptSerializer,
              pptCipher: pptCipher,
              pptKeyid: pptKeyId,
              custom: detailsMap,
            ),
          ),
          decodedMessage,
          4,
        );
      }
      if (messageId == MessageTypes.codeError && decodedMessage.length > 4) {
        return _addPayload(
          Error(
            (decodedMessage[1] as CborInt).toInt(),
            (decodedMessage[2] as CborInt).toInt(),
            Map<String, Object>.from(
              (decodedMessage[3] as CborMap).toObject() as Map,
            ),
            (decodedMessage[4] as CborString).toString(),
          ),
          decodedMessage,
          5,
        );
      }
      if (messageId == MessageTypes.codeGoodbye) {
        return Goodbye(
          decodedMessage.length == 1
              ? null
              : GoodbyeMessage(
                  (decodedMessage[1] as CborMap)[CborString('message')] ==
                          null
                      ? null
                      : ((decodedMessage[1] as CborMap)[CborString('message')]
                                as CborString)
                            .toString(),
                ),
          (decodedMessage[2] as CborString).toString(),
        );
      }
    }
  }
  _logger.shout('Could not deserialize the message: $message');
  // TODO respond with an error
  return null;
}