code: func GetDeviceSession(p *redis.Pool, devEUI lorawan.EUI64) (DeviceSession, error) {
  	var dsPB DeviceSessionPB
  
  	c := p.Get()
  	defer c.Close()
  
  	val, err := redis.Bytes(c.Do("GET", fmt.Sprintf(deviceSessionKeyTempl, devEUI)))
  	if err != nil {
  		if err == redis.ErrNil {
  			return DeviceSession{}, ErrDoesNotExist
  		}
  		return DeviceSession{}, errors.Wrap(err, "get error")
  	}
  
  	err = proto.Unmarshal(val, &dsPB)
  	if err != nil {
  		// fallback on old gob encoding
  		var dsOld DeviceSessionOld
  		err = gob.NewDecoder(bytes.NewReader(val)).Decode(&dsOld)
  		if err != nil {
  			return DeviceSession{}, errors.Wrap(err, "gob decode error")
  		}
  
  		return migrateDeviceSessionOld(dsOld), nil
  	}
  
  	return deviceSessionFromPB(dsPB), nil
  }
docs: // GetDeviceSession returns the device-session for the given DevEUI.