@apollo/client-react-streaming
Version:
This package provides building blocks to create framework-level integration of Apollo Client with React's streaming SSR. See the [@apollo/client-integration-nextjs](https://github.com/apollographql/apollo-client-integrations/tree/main/packages/nextjs) pac
72 lines (65 loc) • 2.57 kB
text/typescript
import { ReactNode } from 'react';
import { ApolloLink, FetchPolicy, ApolloClient, OperationVariables } from '@apollo/client';
import { QueryRef } from '@apollo/client/react';
/**
* @internal
*/
type ReadableStreamLinkEvent = {
type: "next";
value: ApolloLink.Result;
} | {
type: "completed";
} | {
type: "error";
};
type TransportedOptions = {
query: string;
nextFetchPolicy?: FetchPolicy | undefined;
} & Omit<ApolloClient.WatchQueryOptions, "query" | "skipPollAttempt" | "nextFetchPolicy">;
type JsonString<Encoded> = string & {
__jsonString?: [Encoded];
};
type RestrictedPreloadOptions = {
fetchPolicy?: "network-only" | "cache-and-network" | "cache-first";
returnPartialData?: false;
nextFetchPolicy?: undefined;
pollInterval?: undefined;
};
type TransportedQueryRefOptions = TransportedOptions & RestrictedPreloadOptions;
/**
* A `TransportedQueryRef` is an opaque object accessible via renderProp within `PreloadQuery`.
*
* A child client component reading the `TransportedQueryRef` via useReadQuery will suspend until the promise resolves.
*
* @public
*/
interface TransportedQueryRef<TData = unknown, TVariables extends OperationVariables = OperationVariables> extends QueryRef<TData, TVariables> {
/**
* Temporarily disabled - see https://github.com/apollographql/apollo-client-integrations/issues/332
*
* Will now be be `undefined` both in React Server Components and Client Components until we can find a better resolution.
*/
toPromise?: undefined;
/** @internal */
$__apollo_queryRef: {
options: TransportedQueryRefOptions;
stream: ReadableStream<JsonString<ReadableStreamLinkEvent>>;
/**
* A unique key for this query, to ensure it is only hydrated once,
* even if it should get transported over the wire in a way that results
* in multiple objects describing the same queryRef.
* This key will be used to store the queryRef in the suspence cache.
*
* The chances of this happening should be slim (it is handled within
* React thanks to https://github.com/facebook/react/pull/28996), but
* as we use transported queryRefs with multiple frameworks with distinct
* transport mechanisms, this seems like a safe option.
*/
queryKey: string;
};
}
declare function SimulatePreloadedQuery<T>({ queryRef, children, }: {
queryRef: TransportedQueryRef<T>;
children: ReactNode;
}): ReactNode;
export { SimulatePreloadedQuery as default };