@@ -45,6 +45,7 @@ func (n *OpenBazaarNode) sendMessage(peerID string, k *libp2p.PubKey, message pb
4545 return err
4646 }
4747 ctx , cancel := context .WithTimeout (context .Background (), n .OfflineMessageFailoverTimeout )
48+ n .SendRelayedMessage (p , k , & message ) // send relayed message immediately
4849 defer cancel ()
4950 err = n .Service .SendMessage (ctx , p , & message )
5051 if err != nil {
@@ -57,25 +58,11 @@ func (n *OpenBazaarNode) sendMessage(peerID string, k *libp2p.PubKey, message pb
5758 return nil
5859}
5960
60- // SendOfflineMessage Supply of a public key is optional, if nil is instead provided n.EncryptMessage does a lookup
61- func (n * OpenBazaarNode ) SendOfflineMessage (p peer.ID , k * libp2p.PubKey , m * pb.Message ) error {
62- pubKeyBytes , err := n .IpfsNode .PrivateKey .GetPublic ().Bytes ()
63- if err != nil {
64- return err
65- }
66- ser , err := proto .Marshal (m )
67- if err != nil {
68- return err
69- }
70- sig , err := n .IpfsNode .PrivateKey .Sign (ser )
61+ func (n * OpenBazaarNode ) SendRelayedMessage (p peer.ID , k * libp2p.PubKey , m * pb.Message ) error {
62+ messageBytes , err := n .getMessageBytes (m )
7163 if err != nil {
7264 return err
7365 }
74- env := pb.Envelope {Message : m , Pubkey : pubKeyBytes , Signature : sig }
75- messageBytes , merr := proto .Marshal (& env )
76- if merr != nil {
77- return merr
78- }
7966
8067 ctx , cancel := context .WithTimeout (context .Background (), n .OfflineMessageFailoverTimeout )
8168 defer cancel ()
@@ -108,6 +95,38 @@ func (n *OpenBazaarNode) SendOfflineMessage(p peer.ID, k *libp2p.PubKey, m *pb.M
10895
10996 n .WebRelayManager .SendRelayMessage (encodedCipherText , p .Pretty ())
11097
98+ return nil
99+ }
100+
101+ func (n * OpenBazaarNode ) getMessageBytes (m * pb.Message ) ([]byte , error ) {
102+ pubKeyBytes , err := n .IpfsNode .PrivateKey .GetPublic ().Bytes ()
103+ if err != nil {
104+ return nil , err
105+ }
106+ ser , err := proto .Marshal (m )
107+ if err != nil {
108+ return nil , err
109+ }
110+ sig , err := n .IpfsNode .PrivateKey .Sign (ser )
111+ if err != nil {
112+ return nil , err
113+ }
114+
115+ env := pb.Envelope {Message : m , Pubkey : pubKeyBytes , Signature : sig }
116+ messageBytes , merr := proto .Marshal (& env )
117+ if merr != nil {
118+ return nil , merr
119+ }
120+ return messageBytes , nil
121+ }
122+
123+ // SendOfflineMessage Supply of a public key is optional, if nil is instead provided n.EncryptMessage does a lookup
124+ func (n * OpenBazaarNode ) SendOfflineMessage (p peer.ID , k * libp2p.PubKey , m * pb.Message ) error {
125+ messageBytes , err := n .getMessageBytes (m )
126+ if err != nil {
127+ return err
128+ }
129+
111130 // TODO: this function blocks if the recipient's public key is not on the local machine
112131 ciphertext , cerr := n .EncryptMessage (p , k , messageBytes )
113132 if cerr != nil {
@@ -319,6 +338,8 @@ func (n *OpenBazaarNode) ResendCachedOrderMessage(orderID string, msgType pb.Mes
319338 return fmt .Errorf ("unable to decode invalid peer ID for order (%s) and message type (%s)" , orderID , msgType .String ())
320339 }
321340
341+ n .SendRelayedMessage (p , nil , & msg .Msg ) // send relayed message immediately
342+
322343 ctx , cancel := context .WithTimeout (context .Background (), n .OfflineMessageFailoverTimeout )
323344 defer cancel ()
324345
@@ -614,6 +635,7 @@ func (n *OpenBazaarNode) SendChat(peerID string, chatMessage *pb.Chat) error {
614635 return err
615636 }
616637 ctx , cancel := context .WithTimeout (context .Background (), n .OfflineMessageFailoverTimeout )
638+ n .SendRelayedMessage (p , nil , & m ) // send relayed message immediately
617639 defer cancel ()
618640 err = n .Service .SendMessage (ctx , p , & m )
619641 if err != nil && chatMessage .Flag != pb .Chat_TYPING {
@@ -834,6 +856,9 @@ func (n *OpenBazaarNode) SendOrderPayment(peerID string, paymentMessage *pb.Orde
834856 if err != nil {
835857 return err
836858 }
859+
860+ n .SendRelayedMessage (p , nil , & m ) // send relayed message immediately
861+
837862 ctx , cancel := context .WithTimeout (context .Background (), n .OfflineMessageFailoverTimeout )
838863 err = n .Service .SendMessage (ctx , p , & m )
839864 cancel ()
0 commit comments