telebit/connection.go

106 lines
1.8 KiB
Go
Executable File

package main
import (
"encoding/hex"
"time"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
// Connection track websocket and faciliates in and out data
type Connection struct {
connectionTable *ConnectionTable
// The websocket connection.
conn *websocket.Conn
// Buffered channel of outbound messages.
send chan []byte
// Address of the Remote End Point
source string
// admin flag. Grants access to admin features
admin bool
// bytes in
bytesIn int64
// bytes out
bytesOut int64
}
func (c *Connection) addIn(num int64) {
c.bytesIn = c.bytesIn + num
}
func (c *Connection) addOut(num int64) {
c.bytesOut = c.bytesOut + num
}
func (c *Connection) reader() {
defer func() {
c.connectionTable.unregister <- c
c.conn.Close()
}()
c.conn.SetReadLimit(maxMessageSize)
for {
_, message, err := c.conn.ReadMessage()
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
loginfo.Printf("error: %v", err)
}
break
}
loginfo.Println(hex.Dump(message))
c.addIn(int64(len(message)))
loginfo.Println(c)
}
}
func (c *Connection) writer() {
dwell := time.NewTicker(5 * time.Second)
loginfo.Println("activate timer", dwell)
defer func() {
c.conn.Close()
}()
for {
select {
case message := <-c.send:
w, err := c.conn.NextWriter(websocket.TextMessage)
if err != nil {
return
}
w.Write(message)
if err := w.Close(); err != nil {
return
}
c.addOut(int64(len(message)))
}
}
}
func (c *Connection) sender() {
dwell := time.NewTicker(5 * time.Second)
loginfo.Println("activate timer", dwell)
defer func() {
c.conn.Close()
}()
for {
select {
case <-dwell.C:
loginfo.Println("Dwell Activated")
c.send <- []byte("This is a test")
}
}
}