onUpdate method

  1. @override
void onUpdate(
  1. String streamStatus,
  2. List? updates,
  3. List? columns,
  4. Map? meta,
  5. DSError? error,
)
override

Implementation

@override
void onUpdate(
  String streamStatus,
  List? updates,
  List? columns,
  Map? meta,
  DSError? error,
) {
  var reseted = false;
  // TODO implement error handling
  if (updates != null) {
    for (Object update in updates) {
      String name;
      late Object value;
      var removed = false;
      if (update is Map) {
        if (update['name'] is String) {
          name = update['name'];
        } else {
          continue; // invalid response
        }
        if (update['change'] == 'remove') {
          removed = true;
        } else {
          value = update['value'];
        }
      } else if (update is List) {
        if (update.isNotEmpty && update[0] is String) {
          name = update[0];
          if (update.length > 1) {
            value = update[1];
          }
        } else {
          continue; // invalid response
        }
      } else {
        continue; // invalid response
      }
      if (name.startsWith(r'$')) {
        if (!reseted &&
            (name == r'$is' ||
                name == r'$base' ||
                (name == r'$disconnectedTs' && value is String))) {
          reseted = true;
          node.resetNodeCache();
        }
        if (name == r'$is') {
          loadProfile(value as String);
        }
        changes.add(name);
        if (removed) {
          node.configs.remove(name);
        } else {
          node.configs[name] = value;
        }
      } else if (name.startsWith('@')) {
        changes.add(name);
        if (removed) {
          node.attributes.remove(name);
        } else {
          node.attributes[name] = value;
        }
      } else {
        changes.add(name);
        if (removed) {
          node.children.remove(name);
        } else if (value is Map) {
          // TODO, also wait for children $is
          node.children[name] =
              requester.nodeCache.updateRemoteChildNode(node, name, value)!;
        }
      }
    }
    if (request?.streamStatus != StreamStatus.initialize) {
      node.listed = true;
    }
    if (_pendingRemoveDef) {
      _checkRemoveDef();
    }
    onProfileUpdated();
  }
}