@@ -47,7 +47,34 @@ func (rm RecentMessage) IsEmpty() bool {
4747 return rm .wa == nil && rm .fb == nil
4848}
4949
50- func (cli * Client ) addRecentMessage (to types.JID , id types.MessageID , wa * waE2E.Message , fb * waMsgApplication.MessageApplication ) {
50+ func (cli * Client ) addRecentMessage (ctx context.Context , to types.JID , id types.MessageID , wa * waE2E.Message , fb * waMsgApplication.MessageApplication ) error {
51+ if cli .UseRetryMessageStore {
52+ var buf []byte
53+ var format string
54+ var err error
55+ if wa != nil {
56+ buf , err = proto .Marshal (wa )
57+ format = "wa"
58+ } else if fb != nil {
59+ buf , err = proto .Marshal (fb )
60+ format = "fb"
61+ }
62+ if err != nil {
63+ return fmt .Errorf ("failed to marshal message for retry store: %w" , err )
64+ }
65+ if buf != nil {
66+ err = cli .Store .EventBuffer .AddOutgoingEvent (ctx , to , id , format , buf )
67+ if err != nil {
68+ return fmt .Errorf ("failed to add message to retry store: %w" , err )
69+ }
70+ if time .Since (cli .lastRetryStoreClear ) > 12 * time .Hour {
71+ err = cli .Store .EventBuffer .DeleteOldOutgoingEvents (ctx )
72+ if err != nil {
73+ return fmt .Errorf ("failed to clear old messages from retry store: %w" , err )
74+ }
75+ }
76+ }
77+ }
5178 cli .recentMessagesLock .Lock ()
5279 key := recentMessageKey {to , id }
5380 if cli .recentMessagesList [cli .recentMessagesPtr ].ID != "" {
@@ -60,6 +87,7 @@ func (cli *Client) addRecentMessage(to types.JID, id types.MessageID, wa *waE2E.
6087 cli .recentMessagesPtr = 0
6188 }
6289 cli .recentMessagesLock .Unlock ()
90+ return nil
6391}
6492
6593func (cli * Client ) getRecentMessage (to types.JID , id types.MessageID ) RecentMessage {
@@ -91,6 +119,13 @@ func (cli *Client) getMessageForRetry(ctx context.Context, receipt *events.Recei
91119 return & msg , nil
92120 }
93121 }
122+ if cli .UseRetryMessageStore {
123+ format , buf , err := cli .Store .EventBuffer .GetOutgoingEvent (ctx , receipt .Chat , altChat , messageID )
124+ if err != nil {
125+ return nil , fmt .Errorf ("failed to get message from retry store: %w" , err )
126+ }
127+ return parseRecentMessage (format , buf )
128+ }
94129 waMsg := cli .GetMessageForRetry (receipt .Sender , receipt .Chat , messageID )
95130 if waMsg != nil {
96131 cli .Log .Debugf ("Found message in GetMessageForRetry to accept retry receipt for %s/%s from %s" , receipt .Chat , messageID , receipt .Sender )
@@ -99,6 +134,25 @@ func (cli *Client) getMessageForRetry(ctx context.Context, receipt *events.Recei
99134 return nil , nil
100135}
101136
137+ func parseRecentMessage (format string , buf []byte ) (* RecentMessage , error ) {
138+ var rm RecentMessage
139+ var err error
140+ switch format {
141+ case "wa" :
142+ rm .wa = & waE2E.Message {}
143+ err = proto .Unmarshal (buf , rm .wa )
144+ case "fb" :
145+ rm .fb = & waMsgApplication.MessageApplication {}
146+ err = proto .Unmarshal (buf , rm .fb )
147+ default :
148+ err = fmt .Errorf ("unknown format in retry store: %s" , format )
149+ }
150+ if err != nil {
151+ return nil , fmt .Errorf ("failed to unmarshal payload in retry store: %w" , err )
152+ }
153+ return & rm , nil
154+ }
155+
102156const recreateSessionTimeout = 1 * time .Hour
103157
104158func (cli * Client ) shouldRecreateSession (ctx context.Context , retryCount int , jid types.JID ) (reason string , recreate bool ) {
0 commit comments