You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
1.8 KiB
Go
103 lines
1.8 KiB
Go
package starmap
|
|
|
|
import (
|
|
"encoding/gob"
|
|
"os"
|
|
"time"
|
|
|
|
"b612.me/notify"
|
|
)
|
|
|
|
func init() {
|
|
notify.Register(kvMsg{})
|
|
notify.Register(starMapErr{})
|
|
}
|
|
|
|
type starMapErr struct {
|
|
Err string
|
|
}
|
|
|
|
func (s starMapErr) Error() string {
|
|
return s.Err
|
|
}
|
|
func newStarMapErr(err error) error {
|
|
if err == nil {
|
|
return nil
|
|
}
|
|
return starMapErr{Err: err.Error()}
|
|
}
|
|
|
|
type kvMsg struct {
|
|
Key interface{}
|
|
Value interface{}
|
|
Err error
|
|
}
|
|
|
|
type RemoteKv struct {
|
|
server notify.Server
|
|
client notify.Client
|
|
kvmap StarMapKV
|
|
addr string
|
|
network string
|
|
readTimeout time.Duration
|
|
timeout time.Duration
|
|
}
|
|
|
|
func NewServer(network, addr string) (*RemoteKv, error) {
|
|
var err error
|
|
kv := RemoteKv{
|
|
server: notify.NewServer(),
|
|
kvmap: NewStarMap(),
|
|
addr: addr,
|
|
network: network,
|
|
}
|
|
err = kv.server.Listen(network, addr)
|
|
if err == nil {
|
|
kv.bind()
|
|
}
|
|
return &kv, err
|
|
}
|
|
|
|
func NewClient(network, addr string, dialTimeout time.Duration) (*RemoteKv, error) {
|
|
var err error
|
|
kv := RemoteKv{
|
|
client: notify.NewClient(),
|
|
kvmap: NewStarMap(),
|
|
addr: addr,
|
|
network: network,
|
|
timeout: dialTimeout,
|
|
readTimeout: time.Second * 5,
|
|
}
|
|
err = kv.client.ConnectTimeout(network, addr, dialTimeout)
|
|
return &kv, err
|
|
}
|
|
|
|
func (kv *RemoteKv) Register(data interface{}) {
|
|
gob.Register(data)
|
|
}
|
|
|
|
func (kv *RemoteKv) RegisterAll(data []interface{}) {
|
|
for _, v := range data {
|
|
gob.Register(v)
|
|
}
|
|
}
|
|
|
|
func (kv *RemoteKv) bind() {
|
|
//for server
|
|
kv.server.SetDefaultLink(kv.dispatch)
|
|
//for client
|
|
}
|
|
|
|
func (kv *RemoteKv) reconnect() error {
|
|
if kv.server != nil {
|
|
return nil
|
|
}
|
|
if kv.client != nil {
|
|
if kv.client.Status().Alive {
|
|
return nil
|
|
}
|
|
return kv.client.ConnectTimeout(kv.network, kv.addr, kv.timeout)
|
|
}
|
|
return os.ErrInvalid
|
|
}
|