/* Conn.performHandshake Responsible for performing handshake with service */ func (c *Conn) performHandshake() (err error) { var sh skynet.ServiceHandshake decoder := bsonrpc.NewDecoder(c.conn) err = decoder.Decode(&sh) if err != nil { log.Println(log.ERROR, "Failed to decode ServiceHandshake", err) c.conn.Close() return HandshakeFailed } ch := skynet.ClientHandshake{} encoder := bsonrpc.NewEncoder(c.conn) err = encoder.Encode(ch) if err != nil { log.Println(log.ERROR, "Failed to encode ClientHandshake", err) c.conn.Close() return HandshakeFailed } if !sh.Registered { return ServiceUnregistered } c.rpcClient = bsonrpc.NewClient(c.conn) c.clientID = sh.ClientID return }
func getConnectionFactory(s *skynet.ServiceInfo) (factory pools.Factory) { factory = func() (pools.Resource, error) { conn, err := net.Dial("tcp", s.ServiceAddr.String()) if err != nil { // TODO: handle failure here and attempt to connect to a different instance return nil, errors.New("Failed to connect to service: " + s.ServiceAddr.String()) } // get the service handshake var sh skynet.ServiceHandshake decoder := bsonrpc.NewDecoder(conn) err = decoder.Decode(&sh) if err != nil { conn.Close() return nil, err } ch := skynet.ClientHandshake{} encoder := bsonrpc.NewEncoder(conn) err = encoder.Encode(ch) if err != nil { conn.Close() return nil, err } if !sh.Registered { // this service has unregistered itself, look elsewhere conn.Close() return factory() } resource := ServiceResource{ rpcClient: bsonrpc.NewClient(conn), service: s, clientID: sh.ClientID, } return resource, nil } return }