feat: 实现消息分发推送确认撤回与启动恢复
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user