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 _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeHello),
      msgpack_dart.serialize(message.realm),
      _serializeDetails(message.details)!,
    ]);
  }
  if (message is Challenge) {
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeChallenge),
      msgpack_dart.serialize(message.authMethod),
      msgpack_dart.serialize(_challengeExtraToMap(message.extra)),
    ]);
  }
  if (message is Authenticate) {
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeAuthenticate),
      msgpack_dart.serialize(message.signature ?? ''),
      msgpack_dart.serialize(message.extra ?? const <String, Object?>{}),
    ]);
  }
  if (message is Welcome) {
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeWelcome),
      msgpack_dart.serialize(message.sessionId),
      _serializeDetails(message.details)!,
    ]);
  }
  if (message is Register) {
    return _buildMessage(4, [
      msgpack_dart.serialize(MessageTypes.codeRegister),
      msgpack_dart.serialize(message.requestId),
      _serializeRegisterOptions(message.options),
      msgpack_dart.serialize(message.procedure),
    ]);
  }
  if (message is Unregister) {
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeUnregister),
      msgpack_dart.serialize(message.requestId),
      msgpack_dart.serialize(message.registrationId),
    ]);
  }
  if (message is Call) {
    return _buildPayloadMessage(4, [
      msgpack_dart.serialize(MessageTypes.codeCall),
      msgpack_dart.serialize(message.requestId),
      _serializeCallOptions(message.options),
      msgpack_dart.serialize(message.procedure),
    ], _serializePayload(message));
  }
  if (message is Yield) {
    return _buildPayloadMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeYield),
      msgpack_dart.serialize(message.invocationRequestId),
      _serializeYieldOptions(message.options),
    ], _serializePayload(message));
  }
  if (message is cancel_msg.Cancel) {
    final options = <String, Object?>{};
    if (message.options?.mode != null) {
      options['mode'] = message.options!.mode;
    }
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeCancel),
      msgpack_dart.serialize(message.requestId),
      msgpack_dart.serialize(options),
    ]);
  }
  if (message is interrupt_msg.Interrupt) {
    final options = <String, Object?>{};
    if (message.options?.mode != null) {
      options['mode'] = message.options!.mode;
    }
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeInterrupt),
      msgpack_dart.serialize(message.requestId),
      msgpack_dart.serialize(options),
    ]);
  }
  if (message is Invocation) {
    return _buildPayloadMessage(4, [
      msgpack_dart.serialize(MessageTypes.codeInvocation),
      msgpack_dart.serialize(message.requestId),
      msgpack_dart.serialize(message.registrationId),
      _serializeInvocationDetails(message.details),
    ], _serializePayload(message));
  }
  if (message is Publish) {
    return _buildPayloadMessage(4, [
      msgpack_dart.serialize(MessageTypes.codePublish),
      msgpack_dart.serialize(message.requestId),
      _serializePublish(message.options),
      msgpack_dart.serialize(message.topic),
    ], _serializePayload(message));
  }
  if (message is Published) {
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codePublished),
      msgpack_dart.serialize(message.publishRequestId),
      msgpack_dart.serialize(message.publicationId),
    ]);
  }
  if (message is Event) {
    final detailsBytes = _serializeEventDetails(message.details);
    return _buildPayloadMessage(4, [
      msgpack_dart.serialize(MessageTypes.codeEvent),
      msgpack_dart.serialize(message.subscriptionId),
      msgpack_dart.serialize(message.publicationId),
      detailsBytes,
    ], _serializePayload(message));
  }
  if (message is Subscribe) {
    return _buildMessage(4, [
      msgpack_dart.serialize(MessageTypes.codeSubscribe),
      msgpack_dart.serialize(message.requestId),
      _serializeSubscribeOptions(message.options),
      msgpack_dart.serialize(message.topic),
    ]);
  }
  if (message is Subscribed) {
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeSubscribed),
      msgpack_dart.serialize(message.subscribeRequestId),
      msgpack_dart.serialize(message.subscriptionId),
    ]);
  }
  if (message is Unsubscribe) {
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeUnsubscribe),
      msgpack_dart.serialize(message.requestId),
      msgpack_dart.serialize(message.subscriptionId),
    ]);
  }
  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 _buildMessage(3, [
          msgpack_dart.serialize(MessageTypes.codeUnsubscribed),
          msgpack_dart.serialize(message.unsubscribeRequestId),
          msgpack_dart.serialize(map),
        ]);
      }
    }
    return _buildMessage(2, [
      msgpack_dart.serialize(MessageTypes.codeUnsubscribed),
      msgpack_dart.serialize(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 _buildPayloadMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeResult),
      msgpack_dart.serialize(message.callRequestId),
      msgpack_dart.serialize(details),
    ], _serializePayload(message));
  }
  if (message is Error) {
    return _buildPayloadMessage(5, [
      msgpack_dart.serialize(MessageTypes.codeError),
      msgpack_dart.serialize(message.requestTypeId),
      msgpack_dart.serialize(message.requestId),
      msgpack_dart.serialize(message.details),
      msgpack_dart.serialize(message.error),
    ], _serializePayload(message));
  }
  if (message is Abort) {
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeAbort),
      msgpack_dart.serialize(
        message.message != null ? {'message': message.message!.message} : {},
      ),
      msgpack_dart.serialize(message.reason),
    ]);
  }
  if (message is Goodbye) {
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeGoodbye),
      msgpack_dart.serialize(
        message.message?.message != null
            ? {'message': message.message!.message}
            : {},
      ),
      msgpack_dart.serialize(message.reason),
    ]);
  }
  if (message is Registered) {
    return _buildMessage(3, [
      msgpack_dart.serialize(MessageTypes.codeRegistered),
      msgpack_dart.serialize(message.registerRequestId),
      msgpack_dart.serialize(message.registrationId),
    ]);
  }
  if (message is Unregistered) {
    return _buildMessage(2, [
      msgpack_dart.serialize(MessageTypes.codeUnregistered),
      msgpack_dart.serialize(message.unregisterRequestId),
    ]);
  }

  _logger.shout('Could not serialize the message of type: $message');
  throw UnsupportedError(
    'MsgPack serializer does not support ${message.runtimeType}',
  );
}