package goxy import "net/rpc" type GoXY struct { Server *Server } func Register(s *Server) { rpc.Register(&GoXY{s}) rpc.HandleHTTP() } func DialRPC(server string) (*rpc.Client, error) { if server == "" { server = ":http-alt" } return rpc.DialHTTP("tcp", server) } // Add adds a new route (server) func (s *GoXY) Add(e Entry, _ *struct{}) error { defer s.Server.Save() s.Server.Route[e.ServerName] = e return s.Server.Restore() } // Add new entry (client) func Add(e Entry, server string) error { client, err := DialRPC(server) if err != nil { return err } defer client.Close() return client.Call("GoXY.Add", e, nil) } // Del removes a route (server) func (s *GoXY) Del(serverName string, _ *struct{}) error { defer s.Server.Save() delete(s.Server.Route, serverName) return s.Server.Restore() } // Del removes a route (client) func Del(serverName string, server string) error { client, err := DialRPC(server) if err != nil { return err } defer client.Close() return client.Call("GoXY.Del", serverName, nil) } func (s *GoXY) Get(serverName string, e *Entry) error { *e = s.Server.Route[serverName] return nil } func Get(serverName string, server string) (Entry, error) { client, err := DialRPC(server) if err != nil { return Entry{}, err } defer client.Close() var e Entry err = client.Call("GoXY.Get", serverName, &e) return e, err } // List routes func (s GoXY) List(_ struct{}, r *Route) error { *r = s.Server.Route return nil } func List(server string) (Route, error) { client, err := DialRPC(server) if err != nil { return nil, err } defer client.Close() var r Route if err := client.Call("GoXY.List", struct{}{}, &r); err != nil { return nil, err } return r, nil }