2024-08-04 00:55:28 -04:00
|
|
|
package nexus
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
"dynatron.me/x/stillbox/pkg/pb"
|
|
|
|
|
|
|
|
"github.com/rs/zerolog/log"
|
|
|
|
"google.golang.org/protobuf/proto"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Client interface {
|
|
|
|
sync.Locker
|
|
|
|
|
|
|
|
Connection
|
|
|
|
|
|
|
|
Conn() Connection
|
|
|
|
HandleCommand(*pb.Command)
|
|
|
|
HandleMessage([]byte)
|
|
|
|
}
|
|
|
|
|
|
|
|
type client struct {
|
|
|
|
sync.RWMutex
|
|
|
|
|
|
|
|
Connection
|
|
|
|
|
|
|
|
nexus *Nexus
|
|
|
|
}
|
|
|
|
|
|
|
|
type Connection interface {
|
|
|
|
io.Closer
|
2024-08-04 10:56:46 -04:00
|
|
|
CloseCh()
|
2024-08-04 00:55:28 -04:00
|
|
|
|
2024-08-04 14:55:15 -04:00
|
|
|
Send(*pb.Message) (closed bool)
|
2024-08-04 00:55:28 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
func (n *Nexus) NewClient(conn Connection) Client {
|
|
|
|
sess := &client{
|
|
|
|
Connection: conn,
|
|
|
|
nexus: n,
|
|
|
|
}
|
|
|
|
|
|
|
|
return sess
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *client) Registry() Registry {
|
|
|
|
return c.nexus
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *client) Conn() Connection {
|
|
|
|
return c.Connection
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *client) HandleMessage(mesgBytes []byte) {
|
|
|
|
var msg pb.Command
|
|
|
|
err := proto.Unmarshal(mesgBytes, &msg)
|
|
|
|
if err != nil {
|
|
|
|
log.Error().Err(err).Msg("command unmarshal")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
c.HandleCommand(&msg)
|
|
|
|
}
|