code: func (c *Client) processSuback(suback *packet.Suback) error {
  	// remove packet from store
  	err := c.Session.DeletePacket(session.Outgoing, suback.ID)
  	if err != nil {
  		return err
  	}
  
  	// get future
  	subscribeFuture := c.futureStore.Get(suback.ID)
  	if subscribeFuture == nil {
  		return nil // ignore a wrongly sent Suback packet
  	}
  
  	// remove future from store
  	c.futureStore.Delete(suback.ID)
  
  	// validate subscriptions if requested
  	if c.config.ValidateSubs {
  		for _, code := range suback.ReturnCodes {
  			if code == packet.QOSFailure {
  				subscribeFuture.Cancel()
  				return ErrFailedSubscription
  			}
  		}
  	}
  
  	// complete future
  	subscribeFuture.Data.Store(returnCodesKey, suback.ReturnCodes)
  	subscribeFuture.Complete()
  
  	return nil
  }
docs: // handle an incoming Suback packet