deserialize method
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;
}