]> Sergey Matveev's repositories - vors.git/blob - cmd/server/peer.go
Noising
[vors.git] / cmd / server / peer.go
1 package main
2
3 import (
4         "log/slog"
5         "net"
6         "sync"
7
8         "github.com/flynn/noise"
9         vors "go.stargrave.org/vors/internal"
10 )
11
12 type Peer struct {
13         name  string
14         sid   byte
15         addr  *net.UDPAddr
16         key   []byte
17         stats *Stats
18
19         logger     *slog.Logger
20         conn       net.Conn
21         rx, tx     chan []byte
22         rxCS, txCS *noise.CipherState
23         alive      chan struct{}
24         aliveOnce  sync.Once
25 }
26
27 func (peer *Peer) Close() {
28         peer.aliveOnce.Do(func() {
29                 close(peer.rx)
30                 close(peer.tx)
31                 close(peer.alive)
32                 peer.conn.Close()
33         })
34 }
35
36 func (peer *Peer) Rx() {
37         for {
38                 buf, err := vors.PktRead(peer.conn)
39                 if err != nil {
40                         peer.logger.Error("rx", "err", err)
41                         break
42                 }
43                 buf, err = peer.rxCS.Decrypt(buf[:0], nil, buf)
44                 if err != nil {
45                         peer.logger.Error("rx decrypt", "err", err)
46                         break
47                 }
48                 peer.rx <- buf
49         }
50         peer.Close()
51 }
52
53 func (peer *Peer) Tx() {
54         for buf := range peer.tx {
55                 if peer.txCS == nil {
56                         continue
57                 }
58                 buf, err := peer.txCS.Encrypt(buf[:0], nil, buf)
59                 if err != nil {
60                         peer.logger.Error("tx encrypt", "err", err)
61                         break
62                 }
63                 err = vors.PktWrite(peer.conn, buf)
64                 if err != nil {
65                         peer.logger.Error("tx", "err", err)
66                         break
67                 }
68         }
69         peer.Close()
70 }