addValue method

void addValue(
  1. ValueUpdate? val
)

Implementation

void addValue(ValueUpdate? val) {
  val = val?.cloneForAckQueue();
  if (_caching && _isCacheValid) {
    lastValues.add(val!);
    var needClearQueue =
        (lastValues.length > response.responder.maxCacheLength);
    if (!needClearQueue &&
        !cachingQueue &&
        response._sendingAfterAck &&
        lastValues.length > 1) {
      needClearQueue = true;
    }
    if (needClearQueue) {
      // cache is no longer valid, fallback to rollup mode
      _isCacheValid = false;
      lastValue = ValueUpdate(null, ts: '');
      for (var update in lastValues) {
        lastValue?.mergeAdd(update);
      }
      lastValues.length = 0;
      if (_qosLevel > 0) {
        if (_storage != null) {
          _storage?.setValue(waitingValues!, lastValue!);
        }
        waitingValues
          ?..clear()
          ..add(lastValue!);
      }
    } else {
      lastValue = val;
      if (_qosLevel > 0) {
        waitingValues?.add(lastValue!);
        if (_storage != null) {
          _storage?.addValue(lastValue!);
        }
      }
    }
  } else {
    if (lastValue != null) {
      lastValue = ValueUpdate.merge(lastValue!, val!);
    } else {
      lastValue = val;
    }
    if (_qosLevel > 0) {
      if (_storage != null) {
        _storage?.setValue(waitingValues!, lastValue!);
      }
      waitingValues
        ?..clear()
        ..add(lastValue!);
    }
  }
  // TODO, don't allow this to be called from same controller more often than 100ms
  // the first response can happen ASAP, but
  if (_permitted && sid > -1) {
    response.subscriptionChanged(this);
  }
}