// pollServer will keep trying until either we get a result or the timeout expires func (p *Poll) pollServer(transport api.Transport, node api.Node, host string, pubsrv bc.PubKey) (bool, error) { // Pickup Local rpubkey, err := transport.RPC(host, "ID") if err != nil { return false, err } rpk := pubsrv.Clone() if err := rpk.FromB64(string(rpubkey)); err != nil { return false, err } toRemoteRaw, err := node.Pickup(rpk, p.lastPollLocal) if err != nil { return false, err } // Pickup Remote toLocalRaw, err := transport.RPC(host, "Pickup", pubsrv.ToB64(), strconv.FormatInt(p.lastPollRemote, 10)) if err != nil { return false, err } var toLocal api.Bundle if err := json.Unmarshal(toLocalRaw, &toLocal); err != nil { return false, err } p.lastPollLocal = toRemoteRaw.Time p.lastPollRemote = toLocal.Time toRemote, err := json.Marshal(toRemoteRaw) if err != nil { return false, err } // Dropoff Remote if len(toRemoteRaw.Data) > 0 { if _, err := transport.RPC(host, "Dropoff", string(toRemote)); err != nil { return false, err } } // Dropoff Local if len(toLocal.Data) > 0 { if err := node.Dropoff(toLocal); err != nil { return false, err } } return true, nil }