serialize method

  1. @override
Uint8List serialize(
  1. AbstractMessage message
)
override

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