code: func (s *SessionClient) Who(ctx context.Context) (*Session, error) {
  	raw := &rawSelf{}
  	err := s.client.DaemonRoundTrip(ctx, "GET", "/self", nil, nil, raw, nil)
  	if err != nil {
  		return nil, err
  	}
  
  	self := raw.Self
  	switch raw.Type {
  	case apitypes.UserSession:
  		self.Identity = &envelope.User{}
  		self.Auth = &envelope.User{}
  	case apitypes.MachineSession:
  		self.Identity = &envelope.Machine{}
  		self.Auth = &envelope.MachineToken{}
  	default:
  		return nil, errUnknownSessionType
  	}
  
  	err = json.Unmarshal(raw.Identity, self.Identity)
  	if err != nil {
  		return nil, err
  	}
  
  	err = json.Unmarshal(raw.Auth, self.Auth)
  	if err != nil {
  		return nil, err
  	}
  
  	return NewSession(self)
  }
docs: // Who returns the Session object for the current authenticated user or machine