package connection import ( "context" "nhooyr.io/websocket" ) type Connection struct { ws *websocket.Conn ctx context.Context buffer MessageBuffer } func NewConnection(options ...func(*Connection)) *Connection { connection := Connection{ buffer: *newMessageBuffer(100), } for _, option := range options { option(&connection) } if connection.ws != nil { go func() { for { _, msg, _ := connection.ws.Read(connection.ctx) connection.buffer.Insert(string(msg)) } }() } return &connection } func WithWebsocket(ws *websocket.Conn) func(*Connection) { return func(c *Connection) { c.ws = ws } } func WithContext(ctx context.Context) func(*Connection) { return func(c *Connection) { c.ctx = ctx } } func (conn *Connection) Write(ctx context.Context, msg []byte) error { return conn.ws.Write(ctx, websocket.MessageText, msg) } func (conn *Connection) Read(ctx context.Context) ([]byte, error) { msg, err := conn.buffer.Get() if err != nil { return nil, err // Tell game-handler that connection was lost } return []byte(msg), err } func (conn *Connection) Close(msg string) { conn.ws.Close(websocket.StatusCode(400), msg) }