addNode method

Future<UArNodeInfo> addNode(
  1. UArNode node
)

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");
    },
  );
}