forked from coyim/otr3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
resend.go
76 lines (57 loc) · 1.7 KB
/
resend.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package otr3
import "time"
const resendInterval = 60 * time.Second
type retransmitFlag int
var defaultResentPrefix = []byte("[resent] ")
const (
noRetransmit retransmitFlag = iota
retransmitWithPrefix
retransmitExact
)
type resendContext struct {
lastMessage MessagePlaintext
mayRetransmit retransmitFlag
messageTransform func([]byte) []byte
}
func defaultResendMessageTransform(msg []byte) []byte {
return append(defaultResentPrefix, msg...)
}
func (c *Conversation) resendMessageTransformer() func([]byte) []byte {
if c.resend.messageTransform == nil {
return defaultResendMessageTransform
}
return c.resend.messageTransform
}
func (c *Conversation) lastMessage(msg MessagePlaintext) {
c.resend.lastMessage = msg
}
func (c *Conversation) updateMayRetransmitTo(f retransmitFlag) {
c.resend.mayRetransmit = f
}
func (c *Conversation) shouldRetransmit() bool {
return c.resend.lastMessage != nil &&
c.resend.mayRetransmit != noRetransmit &&
c.heartbeat.lastSent.After(time.Now().Add(-resendInterval))
}
func (c *Conversation) maybeRetransmit() (messageWithHeader, error) {
if !c.shouldRetransmit() {
return nil, nil
}
msg := c.resend.lastMessage
resending := c.resend.mayRetransmit == retransmitWithPrefix
if resending {
msg = c.resendMessageTransformer()(msg)
}
dataMsg, _, err := c.genDataMsg(msg)
if err != nil {
return nil, err
}
// It is actually safe to ignore this error, since the only possible error
// here is a problem with generating the message header, which we already do once in genDataMsg
toSend, _ := c.wrapMessageHeader(msgTypeData, dataMsg.serialize())
if resending {
c.messageEvent(MessageEventMessageResent)
}
c.updateLastSent()
return toSend, nil
}