packages/relay-runtime/util/getPendingOperationsForFragment.js (40 lines of code) (raw):

/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @emails oncall+relay * @flow strict-local * @format */ // flowlint ambiguous-object-type:error 'use strict'; import type {IEnvironment, RequestDescriptor} from '../store/RelayStoreTypes'; import type {ReaderFragment} from './ReaderNode'; const {getPromiseForActiveRequest} = require('../query/fetchQueryInternal'); function getPendingOperationsForFragment( environment: IEnvironment, fragmentNode: ReaderFragment, fragmentOwner: RequestDescriptor, ): {| promise: Promise<void>, pendingOperations: $ReadOnlyArray<RequestDescriptor>, |} | null { let pendingOperations: $ReadOnlyArray<RequestDescriptor> = []; let promise = getPromiseForActiveRequest(environment, fragmentOwner); if (promise != null) { pendingOperations = [fragmentOwner]; } else { const result = environment .getOperationTracker() .getPendingOperationsAffectingOwner(fragmentOwner); pendingOperations = result?.pendingOperations ?? []; promise = result?.promise ?? null; } if (!promise) { return null; } let pendingOperationName = pendingOperations?.map(op => op.node.params.name).join(',') ?? null; if (pendingOperationName == null || pendingOperationName.length === 0) { pendingOperationName = 'Unknown pending operation'; } const fragmentName = fragmentNode.name; const promiseDisplayName = pendingOperationName === fragmentName ? `Relay(${pendingOperationName})` : `Relay(${pendingOperationName}:${fragmentName})`; // $FlowExpectedError[prop-missing] Expando to annotate Promises. promise.displayName = promiseDisplayName; return {promise, pendingOperations}; } module.exports = getPendingOperationsForFragment;