code: func (sc *syncClient) runOnce() {
  	if err := sc.dial(); err != nil {
  		log.Warningf("Sync client dial failed: %v", err)
  		return
  	}
  	defer sc.close()
  
  	var sid SyncSessionID
  	self := sc.engine.config.Node.IPv4Addr
  
  	// Register for synchronisation events.
  	// TODO(jsing): Implement timeout on RPC?
  	if err := sc.client.Call("SeesawSync.Register", self, &sid); err != nil {
  		log.Warningf("Sync registration failed: %v", err)
  		return
  	}
  	log.Infof("Registered for synchronisation notifications (ID %d)", sid)
  
  	// TODO(jsing): Export synchronisation data to ECU/CLI.
  
  	sc.poll(sid)
  
  	// Attempt to deregister for notifications.
  	// TODO(jsing): Implement timeout on RPC?
  	if err := sc.client.Call("SeesawSync.Deregister", sid, nil); err != nil {
  		log.Warningf("Sync deregistration failed: %v", err)
  	}
  }
docs: // runOnce establishes a connection to the synchronisation server, registers
  // for notifications, polls for notifications, then deregisters.