mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-18 01:06:39 +08:00
62 lines
937 B
Go
62 lines
937 B
Go
package core
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/gorilla/websocket"
|
|
"sync"
|
|
)
|
|
|
|
var ErrConClosed = errors.New("connection closed")
|
|
|
|
type Client interface {
|
|
Close()
|
|
}
|
|
|
|
// WsClient websocket client
|
|
type WsClient struct {
|
|
Conn *websocket.Conn
|
|
lock sync.Mutex
|
|
mt int
|
|
closed bool
|
|
}
|
|
|
|
func NewWsClient(conn *websocket.Conn) *WsClient {
|
|
return &WsClient{
|
|
Conn: conn,
|
|
lock: sync.Mutex{},
|
|
mt: 2, // fixed bug for 'Invalid UTF-8 in text frame'
|
|
closed: false,
|
|
}
|
|
}
|
|
|
|
func (wc *WsClient) Send(message []byte) error {
|
|
wc.lock.Lock()
|
|
defer wc.lock.Unlock()
|
|
|
|
if wc.closed {
|
|
return ErrConClosed
|
|
}
|
|
|
|
return wc.Conn.WriteMessage(wc.mt, message)
|
|
}
|
|
|
|
func (wc *WsClient) Receive() (int, []byte, error) {
|
|
if wc.closed {
|
|
return 0, nil, ErrConClosed
|
|
}
|
|
|
|
return wc.Conn.ReadMessage()
|
|
}
|
|
|
|
func (wc *WsClient) Close() {
|
|
wc.lock.Lock()
|
|
defer wc.lock.Unlock()
|
|
|
|
if wc.closed {
|
|
return
|
|
}
|
|
|
|
_ = wc.Conn.Close()
|
|
wc.closed = true
|
|
}
|