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
}