func EncodeAkkaMessage()

in internal/remoting/codec/akka_codec.go [48:126]


func EncodeAkkaMessage(rawMsg proto.Message, recipientPath, senderPath, manifest string, opts ...Option) (*akka.AkkaProtocolMessage, error) {
	var (
		payloadData []byte
		err         error
	)

	options := new(Options)
	for _, opt := range opts {
		opt(options)
	}

	marshaledMsg, err := proto.Marshal(rawMsg)
	if err != nil {
		return nil, err
	}

	if options.isMessageContainerSerializer {
		selectionEnvelope := &akka.SelectionEnvelope{
			EnclosedMessage: marshaledMsg,
			// use ProtobufSerializer
			// ref: https://github.com/akka/akka/blob/main/akka-remote/src/main/resources/reference.conf#L110
			SerializerId:    proto.Int32(2),
			Pattern:         options.selectionEnvelopePattern,
			MessageManifest: []byte(manifest),
			WildcardFanOut:  proto.Bool(false),
		}
		selectionEnvelopeData, err := proto.Marshal(selectionEnvelope)
		if err != nil {
			return nil, fmt.Errorf("Marshal SelectionEnvelope failed, err=%s ", err.Error())
		}
		serializedMessage := &akka.SerializedMessage{
			Message: selectionEnvelopeData,
			// use MessageContainerSerializer
			// ref: https://github.com/akka/akka/blob/main/akka-remote/src/main/resources/reference.conf#L112
			SerializerId: proto.Int32(6),
		}
		envelopeContainer := &akka.AckAndEnvelopeContainer{
			Envelope: &akka.RemoteEnvelope{
				Recipient: &akka.ActorRefData{
					Path: proto.String(recipientPath),
				},
				Message: serializedMessage,
				Sender: &akka.ActorRefData{
					Path: proto.String(senderPath),
				},
			},
		}
		payloadData, err = proto.Marshal(envelopeContainer)
		if err != nil {
			return nil, fmt.Errorf("Marshal AckAndEnvelopeContainer failed, err=%s ", err.Error())
		}
	} else {
		envelopeContainer := &akka.AckAndEnvelopeContainer{
			Envelope: &akka.RemoteEnvelope{
				Recipient: &akka.ActorRefData{
					Path: proto.String(recipientPath),
				},
				Message: &akka.SerializedMessage{
					Message: marshaledMsg,
					// use ProtobufSerializer
					// ref: https://github.com/akka/akka/blob/main/akka-remote/src/main/resources/reference.conf#L110
					SerializerId:    proto.Int32(2),
					MessageManifest: []byte(manifest),
				},
				Sender: &akka.ActorRefData{
					Path: proto.String(senderPath),
				},
			},
		}
		payloadData, err = proto.Marshal(envelopeContainer)
		if err != nil {
			return nil, fmt.Errorf("Marshal AckAndEnvelopeContainer failed, err=%s ", err.Error())
		}
	}

	return &akka.AkkaProtocolMessage{
		Payload: payloadData,
	}, nil
}