mirror of
https://github.com/HDT3213/godis.git
synced 2025-10-05 08:46:56 +08:00
86 lines
1.3 KiB
Go
86 lines
1.3 KiB
Go
package server
|
|
|
|
import (
|
|
"github.com/hdt3213/godis/lib/sync/wait"
|
|
"net"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// abstract of active client
|
|
type Client struct {
|
|
conn net.Conn
|
|
|
|
// waiting util reply finished
|
|
waitingReply wait.Wait
|
|
|
|
// lock while server sending response
|
|
mu sync.Mutex
|
|
|
|
// subscribing channels
|
|
subs map[string]bool
|
|
}
|
|
|
|
func (c *Client) Close() error {
|
|
c.waitingReply.WaitWithTimeout(10 * time.Second)
|
|
_ = c.conn.Close()
|
|
return nil
|
|
}
|
|
|
|
func MakeClient(conn net.Conn) *Client {
|
|
return &Client{
|
|
conn: conn,
|
|
}
|
|
}
|
|
|
|
func (c *Client) Write(b []byte) error {
|
|
if b == nil || len(b) == 0 {
|
|
return nil
|
|
}
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
_, err := c.conn.Write(b)
|
|
return err
|
|
}
|
|
|
|
func (c *Client) SubsChannel(channel string) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
if c.subs == nil {
|
|
c.subs = make(map[string]bool)
|
|
}
|
|
c.subs[channel] = true
|
|
}
|
|
|
|
func (c *Client) UnSubsChannel(channel string) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
if c.subs == nil {
|
|
return
|
|
}
|
|
delete(c.subs, channel)
|
|
}
|
|
|
|
func (c *Client) SubsCount() int {
|
|
if c.subs == nil {
|
|
return 0
|
|
}
|
|
return len(c.subs)
|
|
}
|
|
|
|
func (c *Client) GetChannels() []string {
|
|
if c.subs == nil {
|
|
return make([]string, 0)
|
|
}
|
|
channels := make([]string, len(c.subs))
|
|
i := 0
|
|
for channel := range c.subs {
|
|
channels[i] = channel
|
|
i++
|
|
}
|
|
return channels
|
|
}
|