{"version":3,"file":"makeNetworkRequest.mjs","names":["status:\n    | NetworkRequestStatusUndisposedComplete\n    | NetworkRequestStatusDisposed","status: NetworkRequestStatus","readerWithRefetchQueries","encounteredIds: EncounteredIds","fragment: FragmentReference<TReadFromStore, TClientFieldValue>","retainedQuery: RetainedQuery","normalizeData"],"sources":["../../src/core/makeNetworkRequest.ts"],"sourcesContent":["import type { ItemCleanupPair } from '@isograph/disposable-types';\nimport {\n  normalizeData,\n  type EncounteredIds,\n  type NetworkResponseObject,\n} from './cache';\nimport type { FetchOptions } from './check';\nimport { check, DEFAULT_SHOULD_FETCH_VALUE } from './check';\nimport { getOrCreateCachedComponent } from './componentCache';\nimport type {\n  IsographEntrypoint,\n  NormalizationAst,\n  NormalizationAstLoader,\n  ReaderWithRefetchQueries,\n  RefetchQueryNormalizationArtifact,\n} from './entrypoint';\nimport type {\n  ExtractParameters,\n  FragmentReference,\n  UnknownTReadFromStore,\n} from './FragmentReference';\nimport type { RetainedQuery } from './garbageCollection';\nimport {\n  garbageCollectEnvironment,\n  retainQuery,\n  unretainQuery,\n} from './garbageCollection';\nimport type { IsographEnvironment, StoreLink } from './IsographEnvironment';\nimport { ROOT_ID } from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport {\n  addNetworkResponseStoreLayer,\n  addOptimisticNetworkResponseStoreLayer,\n  revertOptimisticStoreLayerAndMaybeReplace,\n  type OptimisticStoreLayer,\n  type StoreLayerWithData,\n} from './optimisticProxy';\nimport type { AnyError, PromiseWrapper } from './PromiseWrapper';\nimport { wrapPromise, wrapResolvedValue } from './PromiseWrapper';\nimport { readButDoNotEvaluate } from './read';\nimport { getOrCreateCachedStartUpdate } from './startUpdate';\nimport { callSubscriptions } from './subscribe';\n\nlet networkRequestId = 0;\n\nexport function maybeMakeNetworkRequest<\n  TReadFromStore extends UnknownTReadFromStore,\n  TClientFieldValue,\n  TNormalizationAst extends NormalizationAst | NormalizationAstLoader,\n  TRawResponseType extends NetworkResponseObject,\n>(\n  environment: IsographEnvironment,\n  artifact:\n    | RefetchQueryNormalizationArtifact\n    | IsographEntrypoint<\n        TReadFromStore,\n        TClientFieldValue,\n        TNormalizationAst,\n        TRawResponseType\n      >,\n  variables: ExtractParameters<TReadFromStore>,\n  readerWithRefetchQueries: PromiseWrapper<\n    ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>\n  > | null,\n  fetchOptions: FetchOptions<TClientFieldValue, TRawResponseType> | null,\n): ItemCleanupPair<PromiseWrapper<void, AnyError>> {\n  switch (fetchOptions?.shouldFetch ?? DEFAULT_SHOULD_FETCH_VALUE) {\n    case 'Yes': {\n      return makeNetworkRequest(\n        environment,\n        artifact,\n        variables,\n        readerWithRefetchQueries,\n        fetchOptions,\n      );\n    }\n    case 'No': {\n      return retainQueryWithoutMakingNetworkRequest(\n        environment,\n        artifact,\n        variables,\n      );\n    }\n    case 'IfNecessary': {\n      if (\n        artifact.networkRequestInfo.normalizationAst.kind ===\n        'NormalizationAstLoader'\n      ) {\n        throw new Error(\n          'Using lazy loaded normalizationAst with shouldFetch: \"IfNecessary\" is ' +\n            'not supported as it will lead to a network waterfall.',\n        );\n      }\n      const result = check(\n        environment,\n        artifact.networkRequestInfo.normalizationAst.selections,\n        variables,\n        {\n          __link: ROOT_ID,\n          __typename: artifact.concreteType,\n        },\n      );\n\n      if (result.kind === 'EnoughData') {\n        return retainQueryWithoutMakingNetworkRequest(\n          environment,\n          artifact,\n          variables,\n        );\n      } else {\n        return makeNetworkRequest(\n          environment,\n          artifact,\n          variables,\n          readerWithRefetchQueries,\n          fetchOptions,\n        );\n      }\n    }\n  }\n}\n\nexport function retainQueryWithoutMakingNetworkRequest<\n  TReadFromStore extends UnknownTReadFromStore,\n  TClientFieldValue,\n  TRawResponseType extends NetworkResponseObject,\n>(\n  environment: IsographEnvironment,\n  artifact:\n    | RefetchQueryNormalizationArtifact\n    | IsographEntrypoint<\n        TReadFromStore,\n        TClientFieldValue,\n        NormalizationAst | NormalizationAstLoader,\n        TRawResponseType\n      >,\n  variables: ExtractParameters<TReadFromStore>,\n): ItemCleanupPair<PromiseWrapper<void, AnyError>> {\n  let status:\n    | NetworkRequestStatusUndisposedComplete\n    | NetworkRequestStatusDisposed = {\n    kind: 'UndisposedComplete',\n    retainedQuery: fetchNormalizationAstAndRetainArtifact(\n      environment,\n      artifact,\n      variables,\n    ),\n  };\n  return [\n    wrapResolvedValue(undefined),\n    () => {\n      if (status.kind !== 'Disposed') {\n        status = unretainAndGarbageCollect(environment, status);\n      }\n    },\n  ];\n}\n\nexport function makeNetworkRequest<\n  TReadFromStore extends UnknownTReadFromStore,\n  TClientFieldValue,\n  TNormalizationAst extends NormalizationAst | NormalizationAstLoader,\n  TRawResponseType extends NetworkResponseObject,\n>(\n  environment: IsographEnvironment,\n  artifact:\n    | RefetchQueryNormalizationArtifact\n    | IsographEntrypoint<\n        TReadFromStore,\n        TClientFieldValue,\n        TNormalizationAst,\n        TRawResponseType\n      >,\n  variables: ExtractParameters<TReadFromStore>,\n  readerWithRefetchQueries: PromiseWrapper<\n    ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>\n  > | null,\n  fetchOptions: FetchOptions<TClientFieldValue, TRawResponseType> | null,\n): ItemCleanupPair<PromiseWrapper<void, AnyError>> {\n  // TODO this should be a DataId and stored in the store\n  const myNetworkRequestId = networkRequestId + '';\n  networkRequestId++;\n  let status: NetworkRequestStatus = {\n    kind: 'UndisposedIncomplete',\n    retainedQuery: fetchNormalizationAstAndRetainArtifact(\n      environment,\n      artifact,\n      variables,\n    ),\n    optimistic:\n      fetchOptions?.optimisticNetworkResponse != null\n        ? makeOptimisticUpdate(\n            environment,\n            artifact,\n            variables,\n            fetchOptions?.optimisticNetworkResponse,\n          )\n        : null,\n  };\n\n  logMessage(environment, () => ({\n    kind: 'MakeNetworkRequest',\n    artifact,\n    variables,\n    networkRequestId: myNetworkRequestId,\n  }));\n\n  // This should be an observable, not a promise\n  const promise = Promise.all([\n    environment.networkFunction(\n      artifact.networkRequestInfo.operation,\n      variables,\n    ),\n    status.retainedQuery.normalizationAst.promise,\n    readerWithRefetchQueries?.promise,\n  ])\n    .then(([networkResponse, normalizationAst, readerWithRefetchQueries]) => {\n      logMessage(environment, () => ({\n        kind: 'ReceivedNetworkResponse',\n        networkResponse,\n        networkRequestId: myNetworkRequestId,\n      }));\n\n      if (networkResponse.errors != null) {\n        try {\n          fetchOptions?.onError?.();\n        } catch {}\n        throw new Error('Network response had errors', {\n          cause: networkResponse,\n        });\n      }\n\n      const root = { __link: ROOT_ID, __typename: artifact.concreteType };\n\n      if (status.kind === 'UndisposedIncomplete') {\n        if (status.optimistic != null) {\n          status =\n            revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(\n              environment,\n              status,\n              (storeLayer) =>\n                normalizeData(\n                  environment,\n                  storeLayer,\n                  normalizationAst.selections,\n                  networkResponse.data ?? {},\n                  variables,\n                  root,\n                  new Map(),\n                ),\n            );\n        } else {\n          const encounteredIds: EncounteredIds = new Map();\n          environment.store = addNetworkResponseStoreLayer(environment.store);\n          normalizeData(\n            environment,\n            environment.store,\n            normalizationAst.selections,\n            networkResponse.data ?? {},\n            variables,\n            root,\n            encounteredIds,\n          );\n\n          logMessage(environment, () => ({\n            kind: 'AfterNormalization',\n            store: environment.store,\n            encounteredIds: encounteredIds,\n          }));\n\n          callSubscriptions(environment, encounteredIds);\n\n          status = {\n            kind: 'UndisposedComplete',\n            retainedQuery: status.retainedQuery,\n          };\n        }\n      }\n\n      const onComplete = fetchOptions?.onComplete;\n      if (onComplete != null) {\n        let data = readDataForOnComplete(\n          artifact,\n          environment,\n          root,\n          variables,\n          readerWithRefetchQueries,\n        );\n\n        try {\n          // @ts-expect-error this problem will be fixed when we remove RefetchQueryNormalizationArtifact\n          // (or we can fix this by having a single param of type { kind: 'Entrypoint', entrypoint,\n          // fetchOptions: FetchOptions<TReadFromStore> } | { kind: 'RefetchQuery', refetchQuery,\n          // fetchOptions: FetchOptions<void> }).\n          onComplete(data);\n        } catch {}\n      }\n    })\n    .catch((e) => {\n      logMessage(environment, () => ({\n        kind: 'ReceivedNetworkError',\n        networkRequestId: myNetworkRequestId,\n        error: e,\n      }));\n      try {\n        fetchOptions?.onError?.();\n      } catch {}\n\n      if (status.kind === 'UndisposedIncomplete') {\n        status =\n          revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(\n            environment,\n            status,\n            null,\n          );\n      }\n\n      throw e;\n    });\n\n  const wrapper = wrapPromise(promise);\n\n  const response: ItemCleanupPair<PromiseWrapper<void, AnyError>> = [\n    wrapper,\n    () => {\n      if (status.kind === 'UndisposedIncomplete') {\n        status =\n          revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(\n            environment,\n            status,\n            null,\n          );\n      }\n      if (status.kind !== 'Disposed') {\n        status = unretainAndGarbageCollect(environment, status);\n      }\n    },\n  ];\n  return response;\n}\n\ntype NetworkRequestStatusUndisposedIncomplete = {\n  readonly kind: 'UndisposedIncomplete';\n  readonly retainedQuery: RetainedQuery;\n  readonly optimistic: OptimisticStoreLayer | null;\n};\n\ntype NetworkRequestStatusUndisposedComplete = {\n  readonly kind: 'UndisposedComplete';\n  readonly retainedQuery: RetainedQuery;\n};\n\ntype NetworkRequestStatusDisposed = {\n  readonly kind: 'Disposed';\n};\n\ntype NetworkRequestStatus =\n  | NetworkRequestStatusUndisposedIncomplete\n  | NetworkRequestStatusUndisposedComplete\n  | NetworkRequestStatusDisposed;\n\nfunction readDataForOnComplete<\n  TReadFromStore extends UnknownTReadFromStore,\n  TClientFieldValue,\n  TNormalizationAst extends NormalizationAst | NormalizationAstLoader,\n  TRawResponseType extends NetworkResponseObject,\n>(\n  artifact:\n    | RefetchQueryNormalizationArtifact\n    | IsographEntrypoint<\n        TReadFromStore,\n        TClientFieldValue,\n        TNormalizationAst,\n        TRawResponseType\n      >,\n  environment: IsographEnvironment,\n  root: StoreLink,\n  variables: ExtractParameters<TReadFromStore>,\n  readerWithRefetchQueries:\n    | ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>\n    | undefined,\n): TClientFieldValue | null {\n  // An entrypoint, but not a RefetchQueryNormalizationArtifact, has a reader ASTs.\n  // So, we can only pass data to onComplete if makeNetworkRequest was passed an entrypoint.\n  // This is awkward, since we don't express that in the types of the parameters\n  // (i.e. FetchOptions could be passed, along with a RefetchQueryNormalizationArtifact).\n  //\n  // However, this isn't a big deal: RefetchQueryNormalizationArtifact is going away.\n  if (artifact.kind === 'Entrypoint') {\n    // TODO this is a smell!\n    const fakeNetworkRequest = wrapResolvedValue(undefined);\n    // TODO this is a smell — we know the network response is not in flight,\n    // so we don't really care!\n    const fakeNetworkRequestOptions = {\n      suspendIfInFlight: false,\n      throwOnNetworkError: false,\n    };\n    const resolvedReaderWithRefetchQueries =\n      readerWithRefetchQueries as ReaderWithRefetchQueries<\n        TReadFromStore,\n        TClientFieldValue\n      >;\n\n    const fragment: FragmentReference<TReadFromStore, TClientFieldValue> = {\n      kind: 'FragmentReference',\n      // TODO this smells.\n      readerWithRefetchQueries: wrapResolvedValue(\n        resolvedReaderWithRefetchQueries,\n      ),\n      fieldName: resolvedReaderWithRefetchQueries.readerArtifact.fieldName,\n      readerArtifactKind: resolvedReaderWithRefetchQueries.readerArtifact.kind,\n      root,\n      variables,\n      networkRequest: fakeNetworkRequest,\n    };\n    const fragmentResult = readButDoNotEvaluate(\n      environment,\n      fragment,\n      fakeNetworkRequestOptions,\n    ).item;\n    const readerArtifact = resolvedReaderWithRefetchQueries.readerArtifact;\n    switch (readerArtifact.kind) {\n      case 'ComponentReaderArtifact': {\n        // @ts-expect-error We should find a way to encode this in the type system:\n        // if we have a ComponentReaderArtifact, we will necessarily have a\n        // TClientFieldValue which is a React.FC<...>\n        return getOrCreateCachedComponent(\n          environment,\n          {\n            kind: 'FragmentReference',\n            readerWithRefetchQueries: wrapResolvedValue({\n              kind: 'ReaderWithRefetchQueries',\n              readerArtifact: readerArtifact,\n              nestedRefetchQueries:\n                resolvedReaderWithRefetchQueries.nestedRefetchQueries,\n            }),\n            fieldName: readerArtifact.fieldName,\n            readerArtifactKind: readerArtifact.kind,\n            root,\n            variables,\n            networkRequest: fakeNetworkRequest,\n          } as const,\n          fakeNetworkRequestOptions,\n        );\n      }\n      case 'EagerReaderArtifact': {\n        return readerArtifact.resolver({\n          data: fragmentResult,\n          parameters: variables,\n          ...(readerArtifact.hasUpdatable\n            ? {\n                startUpdate: getOrCreateCachedStartUpdate(\n                  environment,\n                  fragment,\n                  fakeNetworkRequestOptions,\n                ),\n              }\n            : undefined),\n        });\n      }\n    }\n  }\n  return null;\n}\n\nfunction fetchNormalizationAstAndRetainArtifact<\n  TReadFromStore extends UnknownTReadFromStore,\n  TClientFieldValue,\n  TRawResponseType extends NetworkResponseObject,\n>(\n  environment: IsographEnvironment,\n  artifact:\n    | RefetchQueryNormalizationArtifact\n    | IsographEntrypoint<\n        TReadFromStore,\n        TClientFieldValue,\n        NormalizationAst | NormalizationAstLoader,\n        TRawResponseType\n      >,\n  variables: ExtractParameters<TReadFromStore>,\n): RetainedQuery {\n  const normalizationAst =\n    artifact.networkRequestInfo.normalizationAst.kind === 'NormalizationAst'\n      ? wrapResolvedValue(artifact.networkRequestInfo.normalizationAst)\n      : wrapPromise(artifact.networkRequestInfo.normalizationAst.loader());\n\n  const root = { __link: ROOT_ID, __typename: artifact.concreteType };\n  const retainedQuery: RetainedQuery = {\n    normalizationAst: normalizationAst,\n    variables,\n    root,\n  };\n  retainQuery(environment, retainedQuery);\n  return retainedQuery;\n}\n\nfunction makeOptimisticUpdate<\n  TReadFromStore extends UnknownTReadFromStore,\n  TClientFieldValue,\n  TNormalizationAst extends NormalizationAst | NormalizationAstLoader,\n  TRawResponseType extends NetworkResponseObject,\n>(\n  environment: IsographEnvironment,\n  artifact:\n    | RefetchQueryNormalizationArtifact\n    | IsographEntrypoint<\n        TReadFromStore,\n        TClientFieldValue,\n        TNormalizationAst,\n        TRawResponseType\n      >,\n  variables: ExtractParameters<TReadFromStore>,\n  optimisticNetworkResponse: TRawResponseType,\n): OptimisticStoreLayer {\n  const root = { __link: ROOT_ID, __typename: artifact.concreteType };\n\n  if (\n    artifact.networkRequestInfo.normalizationAst.kind ===\n    'NormalizationAstLoader'\n  ) {\n    throw new Error(\n      'Using lazy loaded normalizationAst with optimisticNetworkResponse is not supported.',\n    );\n  }\n  const encounteredIds: EncounteredIds = new Map();\n  const optimistic = (environment.store =\n    addOptimisticNetworkResponseStoreLayer(environment.store));\n  normalizeData(\n    environment,\n    environment.store,\n    artifact.networkRequestInfo.normalizationAst.selections,\n    optimisticNetworkResponse,\n    variables,\n    root,\n    encounteredIds,\n  );\n\n  logMessage(environment, () => ({\n    kind: 'AfterNormalization',\n    store: environment.store,\n    encounteredIds: encounteredIds,\n  }));\n\n  callSubscriptions(environment, encounteredIds);\n  return optimistic;\n}\n\nfunction revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(\n  environment: IsographEnvironment,\n  status: NetworkRequestStatusUndisposedIncomplete,\n  normalizeData: null | ((storeLayer: StoreLayerWithData) => void),\n): NetworkRequestStatusUndisposedComplete {\n  if (status.optimistic != null) {\n    revertOptimisticStoreLayerAndMaybeReplace(\n      environment,\n      status.optimistic,\n      normalizeData,\n    );\n  }\n\n  return {\n    kind: 'UndisposedComplete',\n    retainedQuery: status.retainedQuery,\n  };\n}\n\nfunction unretainAndGarbageCollect(\n  environment: IsographEnvironment,\n  status: NetworkRequestStatusUndisposedComplete,\n): NetworkRequestStatusDisposed {\n  const didUnretainSomeQuery = unretainQuery(environment, status.retainedQuery);\n  if (didUnretainSomeQuery) {\n    garbageCollectEnvironment(environment);\n  }\n\n  return {\n    kind: 'Disposed',\n  };\n}\n"],"mappings":"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"}