ToWireMsg translates a ComposedMsg into a multipart ZMQ message ready to send, and signs it. This does not add the return identities or the delimiter.
(signkey []byte)
| 95 | // ToWireMsg translates a ComposedMsg into a multipart ZMQ message ready to send, and |
| 96 | // signs it. This does not add the return identities or the delimiter. |
| 97 | func (msg ComposedMsg) ToWireMsg(signkey []byte) ([][]byte, error) { |
| 98 | |
| 99 | msgparts := make([][]byte, 5) |
| 100 | |
| 101 | header, err := json.Marshal(msg.Header) |
| 102 | if err != nil { |
| 103 | return msgparts, err |
| 104 | } |
| 105 | msgparts[1] = header |
| 106 | |
| 107 | parentHeader, err := json.Marshal(msg.ParentHeader) |
| 108 | if err != nil { |
| 109 | return msgparts, err |
| 110 | } |
| 111 | msgparts[2] = parentHeader |
| 112 | |
| 113 | if msg.Metadata == nil { |
| 114 | msg.Metadata = make(map[string]interface{}) |
| 115 | } |
| 116 | |
| 117 | metadata, err := json.Marshal(msg.Metadata) |
| 118 | if err != nil { |
| 119 | return msgparts, err |
| 120 | } |
| 121 | msgparts[3] = metadata |
| 122 | |
| 123 | content, err := json.Marshal(msg.Content) |
| 124 | if err != nil { |
| 125 | return msgparts, err |
| 126 | } |
| 127 | msgparts[4] = content |
| 128 | |
| 129 | // Sign the message. |
| 130 | if len(signkey) != 0 { |
| 131 | mac := hmac.New(sha256.New, signkey) |
| 132 | for _, msgpart := range msgparts[1:] { |
| 133 | mac.Write(msgpart) |
| 134 | } |
| 135 | msgparts[0] = make([]byte, hex.EncodedLen(mac.Size())) |
| 136 | hex.Encode(msgparts[0], mac.Sum(nil)) |
| 137 | } |
| 138 | |
| 139 | return msgparts, nil |
| 140 | } |
| 141 | |
| 142 | // SendResponse sends a message back to return identities of the received message. |
| 143 | func (receipt *msgReceipt) SendResponse(socket zmq4.Socket, msg ComposedMsg) error { |