function nodeUpdater()

in packages/relay-runtime/handlers/connection/MutationHandlers.js [166:235]


function nodeUpdater(
  insertFn: (RecordProxy, RecordProxy, ?string) => void,
): (RecordSourceProxy, HandleFieldPayload) => void {
  return (store: RecordSourceProxy, payload: HandleFieldPayload) => {
    const record = store.get(payload.dataID);
    if (record == null) {
      return;
    }
    const {connections, edgeTypeName} = payload.handleArgs;
    invariant(
      connections != null,
      'MutationHandlers: Expected connection IDs to be specified.',
    );
    invariant(
      edgeTypeName != null,
      'MutationHandlers: Expected edge typename to be specified.',
    );
    let singleServerNode;
    let serverNodes;
    try {
      singleServerNode = record.getLinkedRecord(payload.fieldKey, payload.args);
    } catch {}
    if (!singleServerNode) {
      try {
        serverNodes = record.getLinkedRecords(payload.fieldKey, payload.args);
      } catch {}
    }
    if (singleServerNode == null && serverNodes == null) {
      warning(false, 'MutationHandlers: Expected target node to exist.');
      return;
    }
    const {NODE, EDGES} = ConnectionInterface.get();
    const serverNodeList = serverNodes ?? [singleServerNode];
    for (const serverNode of serverNodeList) {
      if (serverNode == null) {
        continue;
      }
      const serverNodeId = serverNode.getDataID();
      for (const connectionID of connections) {
        const connection = store.get(connectionID);
        if (connection == null) {
          warning(
            false,
            `[Relay][Mutation] The connection with id '${connectionID}' doesn't exist.`,
          );
          continue;
        }
        const nodeAlreadyExistsInConnection = connection
          .getLinkedRecords(EDGES)
          ?.some(
            edge => edge?.getLinkedRecord(NODE)?.getDataID() === serverNodeId,
          );
        if (nodeAlreadyExistsInConnection) {
          continue;
        }
        const clientEdge = ConnectionHandler.createEdge(
          store,
          connection,
          serverNode,
          edgeTypeName,
        );
        invariant(
          clientEdge != null,
          'MutationHandlers: Failed to build the edge.',
        );
        insertFn(connection, clientEdge);
      }
    }
  };
}