{"record":{"id":"abcef50a019efc21","repo":"facebook/relay","slug":"requestsubscription-must-use-subscription-operati","errorCode":null,"errorMessage":"requestSubscription: Must use Subscription operation","messagePattern":"requestSubscription: Must use Subscription operation","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/relay-runtime/subscription/requestSubscription.js","lineNumber":62,"sourceCode":"export type GraphQLSubscriptionConfig<TVariables, TData, TRawResponse> =\n  Readonly<{\n    configs?: Array<DeclarativeMutationConfig>,\n    cacheConfig?: CacheConfig,\n    subscription: GraphQLSubscription<TVariables, TData, TRawResponse>,\n    variables: NoInfer<TVariables>,\n    onCompleted?: ?() => void,\n    onError?: ?(error: Error) => void,\n    onNext?: ?(response: ?TData) => void,\n    updater?: ?SelectorStoreUpdater<TData>,\n  }>;\n\nfunction requestSubscription<TVariables extends Variables, TData, TRawResponse>(\n  environment: IEnvironment,\n  config: GraphQLSubscriptionConfig<TVariables, TData, TRawResponse>,\n): Disposable {\n  const subscription = getRequest(config.subscription);\n  if (subscription.params.operationKind !== 'subscription') {\n    throw new Error('requestSubscription: Must use Subscription operation');\n  }\n  const {configs, onCompleted, onError, onNext, variables, cacheConfig} =\n    config;\n  const operation = createOperationDescriptor(\n    subscription,\n    variables,\n    cacheConfig,\n  );\n\n  warning(\n    !(config.updater && configs),\n    'requestSubscription: Expected only one of `updater` and `configs` to be provided',\n  );\n\n  const {updater} = configs\n    ? RelayDeclarativeMutationConfig.convert<$FlowFixMe>(\n        configs,\n        subscription,","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/facebook/relay/blob/668b1b85e06261aa3b58dabfc51f8b5524a70955/packages/relay-runtime/subscription/requestSubscription.js#L44-L80","documentation":"requestSubscription requires the tagged node passed in config.subscription to be a subscription operation. It checks subscription.params.operationKind and throws for queries or mutations, since only subscriptions support the long-lived executor/streaming semantics.","triggerScenarios":"Calling requestSubscription(env, {subscription: graphql`query ...` or `mutation ...`}) — the operation kind check fails.","commonSituations":"Reusing a query/mutation tag in a subscription config after refactoring; copy-pasting requestSubscription boilerplate without changing the operation; TypeScript not catching it because the tag is loosely typed.","solutions":["Pass an operation declared with graphql`subscription ... {...}`","Use commitMutation for mutations or fetchQuery for queries instead","Verify operationKind at the call site if the tag comes from a shared constant","Enable Relay's typed graphql (relay-compiler) so mismatched kinds are caught at build time"],"exampleFix":"// before\nrequestSubscription(env, {subscription: graphql`query R { ... }`, variables});\n// after\nrequestSubscription(env, {subscription: graphql`subscription S { ... }`, variables});","handlingStrategy":"validation","validationCode":"const sub = getRequest(config.subscription);\nif (sub.params.operationKind !== 'subscription') {\n  throw new TypeError('requestSubscription requires a subscription operation, got ' + sub.params.operationKind);\n}","typeGuard":"const isSubscriptionOp = (tag) => getRequest(tag).params.operationKind === 'subscription';","tryCatchPattern":"try {\n  requestSubscription(env, config);\n} catch (e) {\n  if (e.message === 'requestSubscription: Must use Subscription operation') {\n    throw new Error('config.subscription must be a graphql`subscription ...` operation');\n  }\n  throw e;\n}","preventionTips":["Use relay-compiler typed graphql so kinds are enforced at compile time","Name subscription tags consistently (xxxSubscription)","Route mutations to commitMutation and queries to fetchQuery","Review shared fragment exports before wiring subscription configs"],"tags":["relay","subscription","wrong-operation-kind","graphql"],"backgroundTag":"wrong-operation-kind","analyzedSha":"668b1b85e06261aa3b58dabfc51f8b5524a70955","analyzedAt":"2026-09-02T19:57:20.783Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}