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