summaryrefslogtreecommitdiff
path: root/vendor/github.com/pion/turn/v2/internal/allocation/channel_bind.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/pion/turn/v2/internal/allocation/channel_bind.go')
-rw-r--r--vendor/github.com/pion/turn/v2/internal/allocation/channel_bind.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/vendor/github.com/pion/turn/v2/internal/allocation/channel_bind.go b/vendor/github.com/pion/turn/v2/internal/allocation/channel_bind.go
new file mode 100644
index 0000000..6216369
--- /dev/null
+++ b/vendor/github.com/pion/turn/v2/internal/allocation/channel_bind.go
@@ -0,0 +1,43 @@
+package allocation
+
+import (
+ "net"
+ "time"
+
+ "github.com/pion/logging"
+ "github.com/pion/turn/v2/internal/proto"
+)
+
+// ChannelBind represents a TURN Channel
+// https://tools.ietf.org/html/rfc5766#section-2.5
+type ChannelBind struct {
+ Peer net.Addr
+ Number proto.ChannelNumber
+
+ allocation *Allocation
+ lifetimeTimer *time.Timer
+ log logging.LeveledLogger
+}
+
+// NewChannelBind creates a new ChannelBind
+func NewChannelBind(number proto.ChannelNumber, peer net.Addr, log logging.LeveledLogger) *ChannelBind {
+ return &ChannelBind{
+ Number: number,
+ Peer: peer,
+ log: log,
+ }
+}
+
+func (c *ChannelBind) start(lifetime time.Duration) {
+ c.lifetimeTimer = time.AfterFunc(lifetime, func() {
+ if !c.allocation.RemoveChannelBind(c.Number) {
+ c.log.Errorf("Failed to remove ChannelBind for %v %x %v", c.Number, c.Peer, c.allocation.fiveTuple)
+ }
+ })
+}
+
+func (c *ChannelBind) refresh(lifetime time.Duration) {
+ if !c.lifetimeTimer.Reset(lifetime) {
+ c.log.Errorf("Failed to reset ChannelBind timer for %v %x %v", c.Number, c.Peer, c.allocation.fiveTuple)
+ }
+}