File: heartbeat.go

package info (click to toggle)
golang-github-twstrike-otr3 0.0~git20161015.0.744856d-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,080 kB
  • sloc: ansic: 127; makefile: 76
file content (47 lines) | stat: -rw-r--r-- 1,117 bytes parent folder | download | duplicates (3)
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
package otr3

import "time"

// How long after sending a packet should we wait to send a heartbeat?
const heartbeatInterval = 60 * time.Second

type heartbeatContext struct {
	lastSent time.Time
}

func (c *Conversation) updateLastSent() {
	c.heartbeat.lastSent = time.Now()
}

func (c *Conversation) maybeHeartbeat(plain MessagePlaintext, toSend messageWithHeader, err error) (MessagePlaintext, []messageWithHeader, error) {
	if err != nil {
		return nil, nil, err
	}
	tsExtra, e := c.potentialHeartbeat(plain)
	return plain, compactMessagesWithHeader(toSend, tsExtra), e
}

func (c *Conversation) potentialHeartbeat(plain MessagePlaintext) (toSend messageWithHeader, err error) {
	if plain == nil {
		return
	}

	now := time.Now()
	if !c.heartbeat.lastSent.Before(now.Add(-heartbeatInterval)) {
		return
	}

	dataMsg, _, err := c.genDataMsgWithFlag(nil, messageFlagIgnoreUnreadable)
	if err != nil {
		return nil, err
	}

	toSend, err = c.wrapMessageHeader(msgTypeData, dataMsg.serialize(c.version))
	if err != nil {
		return nil, err
	}

	c.updateLastSent()
	c.messageEvent(MessageEventLogHeartbeatSent)
	return
}