serialize method
Serialize a given message, should return a String or a UInt8List. The return type is dynamic, because the socket class takes a dynamic type to send either a string or a binary message.
Implementation
@override
Uint8List serialize(AbstractMessage message) {
if (message is Hello) {
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codeHello,
message.realm,
_serializeDetails(message.details)!,
]),
),
);
}
if (message is Challenge) {
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codeChallenge,
message.authMethod,
_challengeExtraToMap(message.extra),
]),
),
);
}
if (message is Authenticate) {
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codeAuthenticate,
message.signature ?? '',
message.extra ?? {},
]),
),
);
}
if (message is Welcome) {
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codeWelcome,
message.sessionId,
_serializeDetails(message.details)!,
]),
),
);
}
if (message is Register) {
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codeRegister,
message.requestId,
_serializeRegisterOptions(message.options),
message.procedure,
]),
),
);
}
if (message is Unregister) {
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codeUnregister,
message.requestId,
message.registrationId,
]),
),
);
}
if (message is Call) {
return _serializeCborPayloadMessage(4, [
MessageTypes.codeCall,
message.requestId,
_serializeCallOptions(message.options),
message.procedure,
], message) ??
(() {
var structuredMessage = [
MessageTypes.codeCall,
message.requestId,
_serializeCallOptions(message.options),
message.procedure,
];
_appendPayloadToList(structuredMessage, message);
return Uint8List.fromList(
cbor.encode(CborValue(structuredMessage)),
);
})();
}
if (message is Yield) {
return _serializeCborPayloadMessage(3, [
MessageTypes.codeYield,
message.invocationRequestId,
_serializeYieldOptions(message.options),
], message) ??
(() {
var structuredMessage = [
MessageTypes.codeYield,
message.invocationRequestId,
_serializeYieldOptions(message.options),
];
_appendPayloadToList(structuredMessage, message);
return Uint8List.fromList(
cbor.encode(CborValue(structuredMessage)),
);
})();
}
if (message is Cancel) {
final details = <String, Object?>{};
if (message.options?.mode != null) {
details['mode'] = message.options!.mode;
}
return Uint8List.fromList(
cbor.encode(
CborValue([MessageTypes.codeCancel, message.requestId, details]),
),
);
}
if (message is Interrupt) {
final details = <String, Object?>{};
if (message.options?.mode != null) {
details['mode'] = message.options!.mode;
}
return Uint8List.fromList(
cbor.encode(
CborValue([MessageTypes.codeInterrupt, message.requestId, details]),
),
);
}
if (message is Invocation) {
return _serializeCborPayloadMessage(4, [
MessageTypes.codeInvocation,
message.requestId,
message.registrationId,
_serializeInvocationDetails(message.details),
], message) ??
(() {
var structuredMessage = [
MessageTypes.codeInvocation,
message.requestId,
message.registrationId,
_serializeInvocationDetails(message.details),
];
_appendPayloadToList(structuredMessage, message);
return Uint8List.fromList(
cbor.encode(CborValue(structuredMessage)),
);
})();
}
if (message is Publish) {
return _serializeCborPayloadMessage(4, [
MessageTypes.codePublish,
message.requestId,
_serializePublish(message.options),
message.topic,
], message) ??
(() {
var structuredMessage = [
MessageTypes.codePublish,
message.requestId,
_serializePublish(message.options),
message.topic,
];
_appendPayloadToList(structuredMessage, message);
return Uint8List.fromList(
cbor.encode(CborValue(structuredMessage)),
);
})();
}
if (message is Published) {
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codePublished,
message.publishRequestId,
message.publicationId,
]),
),
);
}
if (message is Event) {
return _serializeCborPayloadMessage(4, [
MessageTypes.codeEvent,
message.subscriptionId,
message.publicationId,
_serializeEventDetails(message.details),
], message) ??
(() {
var structuredMessage = [
MessageTypes.codeEvent,
message.subscriptionId,
message.publicationId,
_serializeEventDetails(message.details),
];
_appendPayloadToList(structuredMessage, message);
return Uint8List.fromList(
cbor.encode(CborValue(structuredMessage)),
);
})();
}
if (message is Subscribe) {
var structuredMessage = [
MessageTypes.codeSubscribe,
message.requestId,
_serializeSubscribeOptions(message.options),
message.topic,
];
return Uint8List.fromList(cbor.encode(CborValue(structuredMessage)));
}
if (message is Subscribed) {
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codeSubscribed,
message.subscribeRequestId,
message.subscriptionId,
]),
),
);
}
if (message is Unsubscribe) {
var structuredMessage = [
MessageTypes.codeUnsubscribe,
message.requestId,
message.subscriptionId,
];
return Uint8List.fromList(cbor.encode(CborValue(structuredMessage)));
}
if (message is Unsubscribed) {
final details = message.details;
if (details != null) {
final map = <String, Object?>{};
if (details.subscription != null) {
map['subscription'] = details.subscription;
}
if (details.reason != null) {
map['reason'] = details.reason;
}
if (map.isNotEmpty) {
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codeUnsubscribed,
message.unsubscribeRequestId,
map,
]),
),
);
}
}
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codeUnsubscribed,
message.unsubscribeRequestId,
]),
),
);
}
if (message is Result) {
final details = <String, Object?>{};
final resultDetails = message.details;
if (resultDetails.progress != null) {
details['progress'] = resultDetails.progress;
}
if (resultDetails.pptScheme != null) {
details['ppt_scheme'] = resultDetails.pptScheme;
}
if (resultDetails.pptSerializer != null) {
details['ppt_serializer'] = resultDetails.pptSerializer;
}
if (resultDetails.pptCipher != null) {
details['ppt_cipher'] = resultDetails.pptCipher;
}
if (resultDetails.pptKeyId != null) {
details['ppt_keyid'] = resultDetails.pptKeyId;
}
if (resultDetails.custom.isNotEmpty) {
details.addAll(resultDetails.custom);
}
return _serializeCborPayloadMessage(3, [
MessageTypes.codeResult,
message.callRequestId,
details,
], message) ??
(() {
final structuredMessage = [
MessageTypes.codeResult,
message.callRequestId,
details,
];
_appendPayloadToList(structuredMessage, message);
return Uint8List.fromList(
cbor.encode(CborValue(structuredMessage)),
);
})();
}
if (message is Error) {
return _serializeCborPayloadMessage(5, [
MessageTypes.codeError,
message.requestTypeId,
message.requestId,
message.details,
message.error,
], message) ??
(() {
var structuredMessage = [
MessageTypes.codeError,
message.requestTypeId,
message.requestId,
message.details,
message.error,
];
_appendPayloadToList(structuredMessage, message);
return Uint8List.fromList(
cbor.encode(CborValue(structuredMessage)),
);
})();
}
if (message is Abort) {
var structuredMessage = [
MessageTypes.codeAbort,
message.message != null ? {'message': message.message!.message} : {},
message.reason,
];
return Uint8List.fromList(cbor.encode(CborValue(structuredMessage)));
}
if (message is Goodbye) {
var structuredMessage = [
MessageTypes.codeGoodbye,
message.message?.message != null
? {'message': message.message!.message}
: {},
message.reason,
];
return Uint8List.fromList(cbor.encode(CborValue(structuredMessage)));
}
if (message is Registered) {
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codeRegistered,
message.registerRequestId,
message.registrationId,
]),
),
);
}
if (message is Unregistered) {
return Uint8List.fromList(
cbor.encode(
CborValue([
MessageTypes.codeUnregistered,
message.unregisterRequestId,
]),
),
);
}
_logger.shout('Could not serialize the message of type: $message');
throw UnsupportedError(
'CBOR serializer does not support ${message.runtimeType}',
);
}