onUpdate method
void
onUpdate()
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();
}
}