delivery ack added
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
ycc
2026-03-04 10:44:17 +01:00
parent fab5818ec7
commit 14a07dcb5c
2 changed files with 70 additions and 16 deletions

View File

@@ -2,6 +2,7 @@ package helpers
import (
"errors"
"fmt"
"os"
"path/filepath"
"strconv"
@@ -179,8 +180,15 @@ func ConsumeInboxFile(messageFilename string) ([]string, []string, string, error
}
filenames = []string{}
// Send delivery ack if the peer requested it
if peer.SendDeliveryAck && usermsg.Status != nil && usermsg.Status.Uuid != "" {
storagePath := filepath.Join(client.GetConfig().StoragePath, identity.Uuid)
if ackErr := sendDeliveryAck(storagePath, peer, usermsg.Status.Uuid); ackErr != nil {
logger.Warn().Err(ackErr).Str("peer", peer.Uid).Msg("ConsumeInboxFile: sendDeliveryAck")
}
}
}
}
err = os.Remove(messageFilename)
if err != nil {
@@ -240,3 +248,45 @@ func LongPollAllServerJobs(storage_path string, jobs []client.RequestsJob, timeo
}
}
// sendDeliveryAck builds a delivery acknowledgment for messageUuid and enqueues
// it for sending to the peer's contact pull servers.
func sendDeliveryAck(storagePath string, peer *client.Peer, messageUuid string) error {
packedMsg, _, err := BuildReceivedMessage(messageUuid, peer.Uid, time.Now().UTC().Unix())
if err != nil {
return fmt.Errorf("sendDeliveryAck: BuildReceivedMessage: %w", err)
}
data, err := proto.Marshal(packedMsg)
if err != nil {
return fmt.Errorf("sendDeliveryAck: proto.Marshal: %w", err)
}
outboxDir := filepath.Join(storagePath, "outbox")
if err := os.MkdirAll(outboxDir, 0700); err != nil {
return fmt.Errorf("sendDeliveryAck: MkdirAll: %w", err)
}
outboxFile := filepath.Join(outboxDir, "ack_"+uuid.New().String())
if err := os.WriteFile(outboxFile, data, 0600); err != nil {
return fmt.Errorf("sendDeliveryAck: WriteFile: %w", err)
}
var servers []client.Server
for _, srvUid := range peer.ContactPullServers {
srv, loadErr := client.GetConfig().GetIdentity().MessageServers.LoadServer(srvUid)
if loadErr == nil && srv != nil {
servers = append(servers, *srv)
}
}
if len(servers) == 0 {
os.Remove(outboxFile)
return errors.New("sendDeliveryAck: no contact servers found")
}
return client.PushSendJob(storagePath, &client.SendJob{
Queue: peer.Uid,
File: outboxFile,
Servers: servers,
})
}