relay-runtime
Version:
A core runtime for building GraphQL-driven applications.
268 lines (241 loc) • 8.34 kB
Flow
/**
* 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.
*
* @flow strict-local
* @format
* @oncall relay
*/
'use strict';
import type {GraphQLResponse, PayloadData} from '../network/RelayNetworkTypes';
import type RelayObservable from '../network/RelayObservable';
import type RelayPublishQueue from '../store/RelayPublishQueue';
import type {
ExecuteMutationConfig,
IEnvironment,
MutationParameters,
OperationAvailability,
OperationDescriptor,
OptimisticResponseConfig,
OptimisticUpdateFunction,
RecordSourceProxy,
SelectorStoreUpdater,
SingularReaderSelector,
Snapshot,
StoreUpdater,
TaskScheduler,
} from '../store/RelayStoreTypes';
import type {Disposable} from '../util/RelayRuntimeTypes';
import type {ActorIdentifier} from './ActorIdentifier';
export type MultiActorStoreUpdater = (
actorIdentifier: ActorIdentifier,
environment: IActorEnvironment,
store: RecordSourceProxy,
) => void;
/**
* Interface of actor specific sub-environment
*/
export interface IActorEnvironment extends IEnvironment {
/**
* Reference to the main MultiActorEnvironment that handles
* the network execution/and responsible for network integration
*/
+multiActorEnvironment: IMultiActorEnvironment;
/**
* Identifier of the actor for the current active environment
*/
+actorIdentifier: ActorIdentifier;
/**
* TODO: this needs to move the the MultiActorEnvironment with different API.
*/
getPublishQueue(): RelayPublishQueue;
/**
* Optional. A human-readable identifier of the environment.
* This value should be visible in the dev tools.
*/
+configName: ?string;
}
/**
* Interface for the main (or parent) multi-actor environment that contains
* the map of individual actor-specific sub-environments. These sub-environments
* implement the Relay IEnvironment interface.
*/
export interface IMultiActorEnvironment {
/**
* A factory of actor-specific environments.
*/
forActor(actorIdentifier: ActorIdentifier): IActorEnvironment;
/**
* Determine if the operation can be resolved with data in the store (i.e. no
* fields are missing).
*
* Note that this operation effectively "executes" the selector against the
* cache and therefore takes time proportional to the size/complexity of the
* selector.
*/
check(
actorEnvironment: IActorEnvironment,
operation: OperationDescriptor,
): OperationAvailability;
/**
* Subscribe to changes to the results of a selector. The callback is called
* when data has been committed to the store that would cause the results of
* the snapshot's selector to change.
*/
subscribe(
actorEnvironment: IActorEnvironment,
snapshot: Snapshot,
callback: (snapshot: Snapshot) => void,
): Disposable;
/**
* Ensure that all the records necessary to fulfill the given selector are
* retained in-memory. The records will not be eligible for garbage collection
* until the returned reference is disposed.
*/
retain(
actorEnvironment: IActorEnvironment,
operation: OperationDescriptor,
): Disposable;
/**
* Apply an optimistic update to the environment. The mutation can be reverted
* by calling `dispose()` on the returned value.
*/
applyUpdate(
actorEnvironment: IActorEnvironment,
optimisticUpdate: OptimisticUpdateFunction,
): Disposable;
/**
* Revert updates for the `update` function.
*/
revertUpdate(
actorEnvironment: IActorEnvironment,
update: OptimisticUpdateFunction,
): void;
/**
* Revert updates for the `update` function, and apply the `replacement` update.
*/
replaceUpdate(
actorEnvironment: IActorEnvironment,
update: OptimisticUpdateFunction,
replacement: OptimisticUpdateFunction,
): void;
/**
* Apply an optimistic mutation response and/or updater. The mutation can be
* reverted by calling `dispose()` on the returned value.
*/
applyMutation<TMutation: MutationParameters>(
actorEnvironment: IActorEnvironment,
optimisticConfig: OptimisticResponseConfig<TMutation>,
): Disposable;
/**
* Commit an updater to the environment. This mutation cannot be reverted and
* should therefore not be used for optimistic updates. This is mainly
* intended for updating fields from client schema extensions.
*/
commitUpdate(
actorEnvironment: IActorEnvironment,
updater: StoreUpdater,
): void;
/**
* Commit store updates for each actor-specific environment known to MultiActorEnvironment
*/
commitMultiActorUpdate(updater: MultiActorStoreUpdater): void;
/**
* Commit a payload to the environment using the given operation selector.
*/
commitPayload(
actorEnvironment: IActorEnvironment,
operationDescriptor: OperationDescriptor,
payload: PayloadData,
): void;
/**
* Read the results of a selector from in-memory records in the store.
*/
lookup(
actorEnvironment: IActorEnvironment,
selector: SingularReaderSelector,
): Snapshot;
/**
* Send a query to the server with Observer semantics: one or more
* responses may be returned (via `next`) over time followed by either
* the request completing (`completed`) or an error (`error`).
*
* Note: Observables are lazy, so calling this method will do nothing until
* the result is subscribed to: environment.execute({...}).subscribe({...}).
*/
execute(
actorEnvironment: IActorEnvironment,
config: {
operation: OperationDescriptor,
},
): RelayObservable<GraphQLResponse>;
/**
* Send a subscription to the server with Observer semantics: one or more
* responses may be returned (via `next`) over time followed by either
* the request completing (`completed`) or an error (`error`).
*
* Networks/servers that support subscriptions may choose to hold the
* subscription open indefinitely such that `complete` is not called.
*
* Note: Observables are lazy, so calling this method will do nothing until
* the result is subscribed to: environment.executeSubscription({...}).subscribe({...}).
*/
executeSubscription<TMutation: MutationParameters>(
actorEnvironment: IActorEnvironment,
config: {
operation: OperationDescriptor,
updater?: ?SelectorStoreUpdater<TMutation['response']>,
},
): RelayObservable<GraphQLResponse>;
/**
* Returns an Observable of GraphQLResponse resulting from executing the
* provided Mutation operation, the result of which is then normalized and
* committed to the publish queue along with an optional optimistic response
* or updater.
*
* Note: Observables are lazy, so calling this method will do nothing until
* the result is subscribed to:
* environment.executeMutation({...}).subscribe({...}).
*/
executeMutation<TMutation: MutationParameters>(
actorEnvironment: IActorEnvironment,
config: ExecuteMutationConfig<TMutation>,
): RelayObservable<GraphQLResponse>;
/**
* Returns an Observable of GraphQLResponse resulting from executing the
* provided Query or Subscription operation responses, the result of which is
* then normalized and committed to the publish queue.
*
* Note: Observables are lazy, so calling this method will do nothing until
* the result is subscribed to:
* environment.executeWithSource({...}).subscribe({...}).
*/
executeWithSource(
actorEnvironment: IActorEnvironment,
{
operation: OperationDescriptor,
source: RelayObservable<GraphQLResponse>,
},
): RelayObservable<GraphQLResponse>;
/**
* Returns true if a request is currently "active", meaning it's currently
* actively receiving payloads or downloading modules, and has not received
* a final payload yet. Note that a request might still be pending (or "in flight")
* without actively receiving payload, for example a live query or an
* active GraphQL subscription
*/
isRequestActive(
actorEnvironment: IActorEnvironment,
requestIdentifier: string,
): boolean;
/**
* Returns `true` if execute in the server environment
*/
isServer(): boolean;
/**
* Returns the environment's scheduler
*/
getScheduler(): ?TaskScheduler;
}