addNode method
Adds (or replaces) a node. Completes when the model or texture is loaded.
Implementation
Future<UArNodeInfo> addNode(UArNode node) async {
final Completer<UArNodeInfo> completer = Completer<UArNodeInfo>();
_pendingNodes[node.id] = completer;
value = value.copyWith(nodes: <String, UArNode>{...value.nodes, node.id: node});
try {
final Map<Object?, Object?>? raw = await _invoke<Map<Object?, Object?>>("addNode", <String, Object?>{"node": node.toMap()});
if (raw != null && raw["loaded"] == true) {
_pendingNodes.remove(node.id);
if (!completer.isCompleted) completer.complete(UArNodeInfo.fromMap(raw));
}
} on UArException catch (error) {
_pendingNodes.remove(node.id);
if (!completer.isCompleted) completer.completeError(error);
}
return completer.future.timeout(
const Duration(seconds: 90),
onTimeout: () {
_pendingNodes.remove(node.id);
throw const UArException(code: UArErrorCode.timeout, message: "Loading the node timed out");
},
);
}