feat: 实现消息分发推送确认撤回与启动恢复

This commit is contained in:
Nixevol
2026-09-30 07:32:53 +08:00
parent 34e7c2827f
commit bdd1d9e9f4
12 changed files with 2395 additions and 119 deletions
+24 -2
View File
@@ -12,7 +12,7 @@ import (
"git.asio.asia/nixevol/NixMsg/internal/protocol"
)
// Submit 处理发送提交(DEVELOPMENT 7.3):防重 → 校验/配额/授权 → 写入 → 到点则最小分发。
// Submit 处理发送提交(DEVELOPMENT 7.3):防重 → 校验/配额/授权 → 写入 → 到点则完整分发。
func (a *App) Submit(ctx context.Context, senderID string, conn port.ConnInfo, req *protocol.Send) (SubmitResult, error) {
if req == nil {
return SubmitResult{}, errCode(protocol.CodeBadRequest, "nil send")
@@ -250,10 +250,12 @@ INSERT INTO messages(
finalState := state
if sendAt <= nowMs {
finalState, e = dispatchMinimalTx(tx, seq, senderID, req.To.Kind, req.To.ID, sendAt, keepInt, nowMs)
var claimed bool
finalState, claimed, e = a.dispatchFullTx(tx, seq, senderID, req.To.Kind, req.To.ID, sendAt, keepInt, ttl, receipt, nowMs)
if e != nil {
return e
}
_ = claimed
}
result = SubmitResult{ID: req.ID, SendAtMs: sendAt, State: finalState}
return nil
@@ -261,9 +263,29 @@ INSERT INTO messages(
if err != nil {
return SubmitResult{}, err
}
if result.State == StateDispatched {
a.wakeReceivers(ctx, result.ID, senderID)
}
return result, nil
}
func (a *App) wakeReceivers(ctx context.Context, msgID, senderID string) {
rows, err := a.db.Read.QueryContext(ctx, `
SELECT d.endpoint_id FROM deliveries d
JOIN messages m ON m.seq = d.seq
WHERE m.sender_id = ? AND m.id = ? AND d.state = 'pending'`, senderID, msgID)
if err != nil {
return
}
defer func() { _ = rows.Close() }()
for rows.Next() {
var ep string
if rows.Scan(&ep) == nil {
a.WakePush(ep)
}
}
}
func (a *App) computeSendAt(req *protocol.Send, defaultDelayMs, nowMs int64) (int64, error) {
if req.SendAtMs != nil && req.DelayMs != nil {
return 0, errCode(protocol.CodeBadRequest, "send_at_ms and delay_ms are mutually exclusive")