Migration guide for the subscriptions overhaul. Covers the three behavioral changes and the engine WebSocket configuration renames.
The router@0.313.0 subscription overhaul release ships three behavioral changes alongside configuration renames. Each behavioral change is documented in its reference page; this guide links to those and summarizes what an upgrader needs to check.The router’s WebSocket protocol behavior is a strict superset of the graphql-transport-ws and graphql-ws specifications. Spec-compliant clients are unaffected by the spec-fix change below. The other two changes may require adjustments.
Subgraph connection_init payload no longer merges subscribe extensions
Previously the extensions field from each subscribe message was merged into connection_init.payload.extensions on the subgraph WebSocket, overriding any existing extensions set via initial_payload. The router now forwards subscribe-message extensions in the per-operation subscribe.payload.extensions field, where the spec places them.Action for subgraph implementations: if your subgraph reads subscribe-message extensions from connection_init.payload.extensions, update it to read them from subscribe.payload.extensions.See Subscriptions - Using the extensions field for the new behavior.
Upstream connection errors no longer tear down the client WebSocket
Previously, when a subgraph WebSocket died during active subscriptions (TCP drop, EOF, or a close frame from the subgraph), the router sent a WebSocket close frame with code 1001 to the downstream client and tore down the entire client connection. No GraphQL error payload was delivered for the affected subscription.The router now emits a per-subscription GraphQL error and terminates that subscription. The downstream client’s WebSocket stays open and other subscriptions on the same connection continue. The error uses the message "upstream service error" and sets the code extension to subgraph_error_propagation.default_extension_code (default DOWNSTREAM_SERVICE_ERROR). When the failure includes a WebSocket close frame, the router additionally populates closeCode and closeReason extensions.Action for clients: if your client detected upstream subgraph failures by observing a WebSocket close with code 1001, inspect the GraphQL error code extension instead. Reconnect logic that previously operated at the whole-connection level may need to move to individual subscriptions.See Subgraph Error Propagation - Upstream WebSocket errors during subscriptions for the new behavior and example payloads.
Error: This message terminates the operation and no further messages will be sent.Complete (Server → Client): If the server dispatched the Error message relative to the original Subscribe message, no Complete message will be emitted.
Action: none required. Spec-compliant clients ignore messages for operations they consider already completed.
Several websocket_client_* options were named as if they tuned the router’s upstream connections to subgraphs, but were actually used for the server-side WebSocket handler (the router’s downstream endpoint accepting client connections). This release splits those roles cleanly. All changes are listed below.
The old websocket_client_poll_timeout, websocket_client_conn_buffer_size, websocket_client_read_timeout, and websocket_client_frame_timeout router configuration options are no longer available, and their ENGINE_WEBSOCKET_CLIENT_* environment variables are no longer recognized. One option - websocket_client_write_timeout - keeps its name but now applies to a different side of the router. Review each section below before upgrading.
The old websocket_client_read_timeout served two purposes. Both are affected.
The server-side read timeout is now engine.websocket_server_read_timeout / ENGINE_WEBSOCKET_SERVER_READ_TIMEOUT. Default 5s.
The upstream subscription client no longer has a generic read timeout. Use the finer-grained websocket_client_ping_timeout and websocket_client_ack_timeout below.
This option keeps its name but changes scope. Previously it governed the server-side write timeout (router writing to clients). It now governs the upstream write timeout (router writing to subgraphs), matching what its name implies.If you were setting this option in a previous release to tune server-side writes, set engine.websocket_server_write_timeout / ENGINE_WEBSOCKET_SERVER_WRITE_TIMEOUT to the same value on upgrade. Otherwise the server-side falls back to its default of 10s.
engine.websocket_server_write_timeout / ENGINE_WEBSOCKET_SERVER_WRITE_TIMEOUT. Server-side write timeout (router writing to clients). Default 10s. Previously this behavior was governed by websocket_client_write_timeout (see above).
These tune the router’s outbound WebSocket connections to subgraphs.
engine.websocket_client_ack_timeout / ENGINE_WEBSOCKET_CLIENT_ACK_TIMEOUT. Maximum wait for a subgraph connection_ack after the router sends connection_init. Default 30s, minimum 1s.
engine.websocket_client_read_limit / ENGINE_WEBSOCKET_CLIENT_READ_LIMIT. Maximum size of a single incoming WebSocket message from a subgraph. Default 1MB, minimum 1KB.
engine.enable_net_poll (applies to the server-side WebSocket handler only; has no effect on upstream subgraph connections)
Subject to change.enable_net_poll, websocket_server_poll_timeout, and websocket_server_conn_buffer_size may be removed or changed in a future release without a standard deprecation cycle. Avoid depending on them.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"WunderGraph","colors":{"primary":"#ea4899","light":"#ea4899","dark":"#ea4899"},"logo":{"light":"https://mintcdn.com/wundergraphinc/Lko791L3Kvuj3JHY/logo/light.svg?fit=max\u0026auto=format\u0026n=Lko791L3Kvuj3JHY\u0026q=85\u0026s=1877cdae169b31d438adf776ae7087f9","dark":"https://mintcdn.com/wundergraphinc/YDoaRPXJqqOa7ihg/logo/dark.svg?fit=max\u0026auto=format\u0026n=YDoaRPXJqqOa7ihg\u0026q=85\u0026s=2b2590e1246dbcde54be6f257ddc7885","href":"https://cosmo-docs.wundergraph.com/"},"favicon":"https://mintcdn.com/wundergraphinc/urh2bRDxnny5gbfk/favicon.png?fit=max\u0026auto=format\u0026n=urh2bRDxnny5gbfk\u0026q=85\u0026s=5c8f87531fa87214946d81c914c93efc","appearance":{"default":"dark"},"background":{"decoration":"windows"},"navbar":{"links":[{"href":"https://cosmo.wundergraph.com/login","label":"Cloud Login"}],"primary":{"type":"button","label":"Talk to an Expert","href":"https://wundergraph.com/contact/sales"}},"footer":{"socials":{"x":"https://twitter.com/wundergraphcom","discord":"https://wundergraph.com/discord","github":"https://github.com/wundergraph","youtube":"https://www.youtube.com/@wundergraph"},"links":[{"header":"Legal","items":[{"label":"Privacy Policy","href":"https://wundergraph.com/privacy-policy"},{"label":"Cookie Policy","href":"https://wundergraph.com/cookies"},{"label":"Website Terms","href":"https://wundergraph.com/terms"},{"label":"Cosmo Managed Terms","href":"https://wundergraph.com/cosmo-managed-service-terms"}]},{"header":"Trust","items":[{"label":"Trust Center","href":"https://trust.wundergraph.com/"}]}]},"fonts":{"heading":{"family":"Inter"},"body":{"family":"Inter"}},"styling":{"eyebrows":"breadcrumbs","codeblocks":"system","latex":false},"integrations":{"gtm":{"tagId":"GTM-5GPL7DQH"},"koala":{"publicApiKey":"pk_c7477bfbf86479d918562f7add220a2d7098"},"posthog":{"apiKey":"phc_CEnvoyw3KcTuC5E1seDPrgvAamgGRDLfzPi1e7RU1G1","apiHost":"https://eu.i.posthog.com"},"plausible":{"domain":"cosmo-docs.wundergraph.com"}},"banner":{"content":"Help map how teams scale Federated GraphQL in the State of Federation 2026 Survey. We donate $30 to UNICEF per response → [Take the survey](https://8bxwlo3ot55.typeform.com/to/zIJKRQUe).","dismissible":false},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"navigation":{"global":{"anchors":[{"anchor":"Platform Status","icon":"signal","href":"https://status.wundergraph.com/"},{"anchor":"GitHub","icon":"github","href":"https://github.com/wundergraph/cosmo"},{"anchor":"Blog","icon":"newspaper","href":"https://wundergraph.com/blog"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"wundergraphinc","hasAudioNarration":false,"actualSubdomain":"wundergraphinc","customDomains":["cosmo-docs.wundergraph.com"],"gitSource":{"type":"github","owner":"wundergraph","repo":"cosmo","deployBranch":"main","contentDirectory":"docs-website","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae1cf52372d045ef83e6e38","collectionId":"b28fa0be-6b11-4265-85ed-a698ee69dde7","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae1cf52372d045ef83e6e38"},"feedback":{"thumbs":true,"edits":false,"issues":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae1cf52372d045ef83e6e38","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Documentation","count":220},{"language":"default","tag":"CLI","count":214},{"language":"default","tag":"Router","count":124},{"language":"default","tag":"Studio","count":56},{"language":"default","tag":"Tutorials","count":26},{"language":"default","tag":"GraphQL / Federation","count":24},{"language":"default","tag":"Directives","count":17},{"language":"default","tag":"Cosmo Connect","count":15},{"language":"default","tag":"Monograph","count":14},{"language":"default","tag":"Subgraph","count":14}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".osano-cm-dialog--type_box{border-radius:.375rem}.osano-cm-dialog--type_box,.osano-cm-info{--box-shadow:0 10px 15px -3px rgb(248 248 251 / 0.3),\n 0 4px 6px -4px rgb(248 248 251 / 0.3);-webkit-box-shadow:var(--box-shadow);-moz-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}.osano-cm-widget:focus{outline:0}"}],"page":{"pagePath":"router/subscriptions-migration","slug":"/router/subscriptions-migration","pageMetadata":{"title":"Migration: Subscriptions Overhaul","description":"Migration guide for the subscriptions overhaul. Covers the three behavioral changes and the engine WebSocket configuration renames.","icon":"arrows-turn-right","href":"/router/subscriptions-migration"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Migration guide for the subscriptions overhaul. Covers the three behavioral changes and the engine WebSocket configuration renames.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,blockquote:`blockquote`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`The `,_jsx(_components.a,{href:`https://github.com/wundergraph/cosmo/releases/tag/router%400.313.0`,children:`router@0.313.0 subscription overhaul release`}),` ships three behavioral changes alongside configuration renames. Each behavioral change is documented in its reference page; this guide links to those and summarizes what an upgrader needs to check.`]}),`\n`,_jsxs(_components.p,{children:[`The router’s WebSocket protocol behavior is a strict superset of the `,_jsx(_components.code,{children:`graphql-transport-ws`}),` and `,_jsx(_components.code,{children:`graphql-ws`}),` specifications. Spec-compliant clients are unaffected by the spec-fix change below. The other two changes may require adjustments.`]}),`\n`,_jsxs(Heading,{level:`2`,id:`subgraph-connection_init-payload-no-longer-merges-subscribe-extensions`,children:[`Subgraph `,_jsx(_components.code,{children:`connection_init`}),` payload no longer merges subscribe extensions`]}),`\n`,_jsxs(_components.p,{children:[`Previously the `,_jsx(_components.code,{children:`extensions`}),` field from each subscribe message was merged into `,_jsx(_components.code,{children:`connection_init.payload.extensions`}),` on the subgraph WebSocket, overriding any existing extensions set via `,_jsx(_components.code,{children:`initial_payload`}),`. The router now forwards subscribe-message extensions in the per-operation `,_jsx(_components.code,{children:`subscribe.payload.extensions`}),` field, where the spec places them.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Action for subgraph implementations:`}),` if your subgraph reads subscribe-message extensions from `,_jsx(_components.code,{children:`connection_init.payload.extensions`}),`, update it to read them from `,_jsx(_components.code,{children:`subscribe.payload.extensions`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/router/subscriptions#using-the-extensions-field`,children:`Subscriptions - Using the extensions field`}),` for the new behavior.`]}),`\n`,_jsx(Heading,{level:`2`,id:`upstream-connection-errors-no-longer-tear-down-the-client-websocket`,children:`Upstream connection errors no longer tear down the client WebSocket`}),`\n`,_jsxs(_components.p,{children:[`Previously, when a subgraph WebSocket died during active subscriptions (TCP drop, EOF, or a close frame from the subgraph), the router sent a WebSocket close frame with code `,_jsx(_components.code,{children:`1001`}),` to the downstream client and tore down the entire client connection. No GraphQL error payload was delivered for the affected subscription.`]}),`\n`,_jsxs(_components.p,{children:[`The router now emits a per-subscription GraphQL error and terminates that subscription. The downstream client’s WebSocket stays open and other subscriptions on the same connection continue. The error uses the message `,_jsx(_components.code,{children:`\"upstream service error\"`}),` and sets the `,_jsx(_components.code,{children:`code`}),` extension to `,_jsx(_components.code,{children:`subgraph_error_propagation.default_extension_code`}),` (default `,_jsx(_components.code,{children:`DOWNSTREAM_SERVICE_ERROR`}),`). When the failure includes a WebSocket close frame, the router additionally populates `,_jsx(_components.code,{children:`closeCode`}),` and `,_jsx(_components.code,{children:`closeReason`}),` extensions.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Action for clients:`}),` if your client detected upstream subgraph failures by observing a WebSocket close with code `,_jsx(_components.code,{children:`1001`}),`, inspect the GraphQL error `,_jsx(_components.code,{children:`code`}),` extension instead. Reconnect logic that previously operated at the whole-connection level may need to move to individual subscriptions.`]}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/router/subgraph-data-propagation/subgraph-error-propagation#upstream-websocket-errors-during-subscriptions`,children:`Subgraph Error Propagation - Upstream WebSocket errors during subscriptions`}),` for the new behavior and example payloads.`]}),`\n`,_jsxs(Heading,{level:`2`,id:`complete-is-no-longer-sent-after-error-on-graphql-transport-ws`,children:[_jsx(_components.code,{children:`complete`}),` is no longer sent after `,_jsx(_components.code,{children:`error`}),` on `,_jsx(_components.code,{children:`graphql-transport-ws`})]}),`\n`,_jsxs(_components.p,{children:[`Previously, when a subscription’s backing async iterable raised an error, the router sent both `,_jsx(_components.code,{children:`error`}),` and `,_jsx(_components.code,{children:`complete`}),` for the same operation ID:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`{\"id\":\"1\",\"type\":\"error\",\"payload\":[{\"message\":\"...\"}]}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`{\"id\":\"1\",\"type\":\"complete\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`This mirrored a bug in the `,_jsxs(_components.a,{href:`https://github.com/enisdenjo/graphql-ws`,children:[_jsx(_components.code,{children:`graphql-ws`}),` reference implementation`]}),`, accepted upstream as a fix in `,_jsx(_components.a,{href:`https://github.com/enisdenjo/graphql-ws/pull/667`,children:`enisdenjo/graphql-ws#667`}),`. The router now sends only the `,_jsx(_components.code,{children:`error`}),` message, matching the `,_jsx(_components.code,{children:`graphql-transport-ws`}),` spec:`]}),`\n`,_jsxs(_components.blockquote,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Error:`}),` This message terminates the operation and no further messages will be sent.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Complete (Server → Client):`}),` If the server dispatched the `,_jsx(_components.code,{children:`Error`}),` message relative to the original `,_jsx(_components.code,{children:`Subscribe`}),` message, no `,_jsx(_components.code,{children:`Complete`}),` message will be emitted.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Action:`}),` none required. Spec-compliant clients ignore messages for operations they consider already completed.`]}),`\n`,_jsx(Heading,{level:`2`,id:`engine-websocket-configuration`,children:`Engine WebSocket configuration`}),`\n`,_jsxs(_components.p,{children:[`Several `,_jsx(_components.code,{children:`websocket_client_*`}),` options were named as if they tuned the router’s upstream connections to subgraphs, but were actually used for the server-side WebSocket handler (the router’s downstream endpoint accepting client connections). This release splits those roles cleanly. All changes are listed below.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The old `,_jsx(_components.code,{children:`websocket_client_poll_timeout`}),`, `,_jsx(_components.code,{children:`websocket_client_conn_buffer_size`}),`, `,_jsx(_components.code,{children:`websocket_client_read_timeout`}),`, and `,_jsx(_components.code,{children:`websocket_client_frame_timeout`}),` router configuration options are no longer available, and their `,_jsx(_components.code,{children:`ENGINE_WEBSOCKET_CLIENT_*`}),` environment variables are no longer recognized. One option - `,_jsx(_components.code,{children:`websocket_client_write_timeout`}),` - keeps its name but now applies to a different side of the router. Review each section below before upgrading.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`renamed-server-side-options`,children:`Renamed: server-side options`}),`\n`,_jsxs(_components.p,{children:[`These were always server-side despite the `,_jsx(_components.code,{children:`websocket_client_*`}),` name. They are renamed, and the old names are removed entirely.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Old YAML / env var`}),_jsx(_components.th,{children:`New YAML / env var`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`engine.websocket_client_poll_timeout`}),` / `,_jsx(_components.code,{children:`ENGINE_WEBSOCKET_CLIENT_POLL_TIMEOUT`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`engine.websocket_server_poll_timeout`}),` / `,_jsx(_components.code,{children:`ENGINE_WEBSOCKET_SERVER_POLL_TIMEOUT`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`engine.websocket_client_conn_buffer_size`}),` / `,_jsx(_components.code,{children:`ENGINE_WEBSOCKET_CLIENT_CONN_BUFFER_SIZE`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`engine.websocket_server_conn_buffer_size`}),` / `,_jsx(_components.code,{children:`ENGINE_WEBSOCKET_SERVER_CONN_BUFFER_SIZE`})]})]})]})]}),`\n`,_jsxs(Heading,{level:`3`,id:`split-websocket_client_read_timeout`,children:[`Split: `,_jsx(_components.code,{children:`websocket_client_read_timeout`})]}),`\n`,_jsxs(_components.p,{children:[`The old `,_jsx(_components.code,{children:`websocket_client_read_timeout`}),` served two purposes. Both are affected.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The server-side read timeout is now `,_jsx(_components.code,{children:`engine.websocket_server_read_timeout`}),` / `,_jsx(_components.code,{children:`ENGINE_WEBSOCKET_SERVER_READ_TIMEOUT`}),`. Default `,_jsx(_components.code,{children:`5s`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The upstream subscription client no longer has a generic read timeout. Use the finer-grained `,_jsx(_components.code,{children:`websocket_client_ping_timeout`}),` and `,_jsx(_components.code,{children:`websocket_client_ack_timeout`}),` below.`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`3`,id:`scope-change-websocket_client_write_timeout`,children:[`Scope change: `,_jsx(_components.code,{children:`websocket_client_write_timeout`})]}),`\n`,_jsxs(_components.p,{children:[`This option keeps its name but changes scope. Previously it governed the `,_jsx(_components.strong,{children:`server-side`}),` write timeout (router writing to clients). It now governs the `,_jsx(_components.strong,{children:`upstream`}),` write timeout (router writing to subgraphs), matching what its name implies.`]}),`\n`,_jsxs(_components.p,{children:[`If you were setting this option in a previous release to tune server-side writes, set `,_jsx(_components.code,{children:`engine.websocket_server_write_timeout`}),` / `,_jsx(_components.code,{children:`ENGINE_WEBSOCKET_SERVER_WRITE_TIMEOUT`}),` to the same value on upgrade. Otherwise the server-side falls back to its default of `,_jsx(_components.code,{children:`10s`}),`.`]}),`\n`,_jsxs(Heading,{level:`3`,id:`new-websocket_server_write_timeout`,children:[`New: `,_jsx(_components.code,{children:`websocket_server_write_timeout`})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`engine.websocket_server_write_timeout`}),` / `,_jsx(_components.code,{children:`ENGINE_WEBSOCKET_SERVER_WRITE_TIMEOUT`}),`. Server-side write timeout (router writing to clients). Default `,_jsx(_components.code,{children:`10s`}),`. Previously this behavior was governed by `,_jsx(_components.code,{children:`websocket_client_write_timeout`}),` (see above).`]}),`\n`,_jsx(Heading,{level:`3`,id:`new-upstream-client-options`,children:`New: upstream client options`}),`\n`,_jsx(_components.p,{children:`These tune the router’s outbound WebSocket connections to subgraphs.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`engine.websocket_client_ack_timeout`}),` / `,_jsx(_components.code,{children:`ENGINE_WEBSOCKET_CLIENT_ACK_TIMEOUT`}),`. Maximum wait for a subgraph `,_jsx(_components.code,{children:`connection_ack`}),` after the router sends `,_jsx(_components.code,{children:`connection_init`}),`. Default `,_jsx(_components.code,{children:`30s`}),`, minimum `,_jsx(_components.code,{children:`1s`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`engine.websocket_client_read_limit`}),` / `,_jsx(_components.code,{children:`ENGINE_WEBSOCKET_CLIENT_READ_LIMIT`}),`. Maximum size of a single incoming WebSocket message from a subgraph. Default `,_jsx(_components.code,{children:`1MB`}),`, minimum `,_jsx(_components.code,{children:`1KB`}),`.`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`3`,id:`removed-websocket_client_frame_timeout`,children:[`Removed: `,_jsx(_components.code,{children:`websocket_client_frame_timeout`})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`engine.websocket_client_frame_timeout`}),` / `,_jsx(_components.code,{children:`ENGINE_WEBSOCKET_CLIENT_FRAME_TIMEOUT`}),` is removed with no replacement. Remove it from your config.`]}),`\n`,_jsx(Heading,{level:`3`,id:`unchanged`,children:`Unchanged`}),`\n`,_jsx(_components.p,{children:`These keep both their name and their scope:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`engine.websocket_client_ping_interval`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`engine.websocket_client_ping_timeout`})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`engine.enable_net_poll`}),` (applies to the server-side WebSocket handler only; has no effect on upstream subgraph connections)`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Subject to change.`}),` `,_jsx(_components.code,{children:`enable_net_poll`}),`, `,_jsx(_components.code,{children:`websocket_server_poll_timeout`}),`, and `,_jsx(_components.code,{children:`websocket_server_conn_buffer_size`}),` may be removed or changed in a future release without a standard deprecation cycle. Avoid depending on them.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`before-/-after`,children:`Before / after`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`25`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`25`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Before`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`engine`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` enable_net_poll`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_poll_timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`1s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_conn_buffer_size`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`128`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_read_timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`5s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_write_timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`10s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_frame_timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`100ms`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_ping_interval`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`15s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_ping_timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`30s`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# After`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`engine`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` enable_net_poll`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Server-side WebSocket handler (router accepting clients)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_server_read_timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`5s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_server_write_timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`10s`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # previously the misnamed websocket_client_write_timeout`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_server_poll_timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`1s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_server_conn_buffer_size`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`128`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Upstream subscription client (router connecting to subgraphs)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_write_timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`10s`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # same name, now actually upstream-only`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_ping_interval`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`15s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_ping_timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`30s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_ack_timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`30s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` websocket_client_read_limit`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`1MB`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/router/configuration#router-engine-configuration`,children:`Router Engine Configuration`}),` for the full reference.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Migration: Subscriptions Overhaul","description":"Migration guide for the subscriptions overhaul. Covers the three behavioral changes and the engine WebSocket configuration renames.","icon":"arrows-turn-right","href":"/router/subscriptions-migration"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Subgraph connection_init payload no longer merges subscribe extensions","slug":"subgraph-connection_init-payload-no-longer-merges-subscribe-extensions","depth":2,"children":[]},{"title":"Upstream connection errors no longer tear down the client WebSocket","slug":"upstream-connection-errors-no-longer-tear-down-the-client-websocket","depth":2,"children":[]},{"title":"complete is no longer sent after error on graphql-transport-ws","slug":"complete-is-no-longer-sent-after-error-on-graphql-transport-ws","depth":2,"children":[]},{"title":"Engine WebSocket configuration","slug":"engine-websocket-configuration","depth":2,"children":[{"title":"Renamed: server-side options","slug":"renamed-server-side-options","depth":3,"children":[]},{"title":"Split: websocket_client_read_timeout","slug":"split-websocket_client_read_timeout","depth":3,"children":[]},{"title":"Scope change: websocket_client_write_timeout","slug":"scope-change-websocket_client_write_timeout","depth":3,"children":[]},{"title":"New: websocket_server_write_timeout","slug":"new-websocket_server_write_timeout","depth":3,"children":[]},{"title":"New: upstream client options","slug":"new-upstream-client-options","depth":3,"children":[]},{"title":"Removed: websocket_client_frame_timeout","slug":"removed-websocket_client_frame_timeout","depth":3,"children":[]},{"title":"Unchanged","slug":"unchanged","depth":3,"children":[]},{"title":"Before / after","slug":"before-/-after","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/wundergraphinc/c20d56ed2ea5ad45/analytics.js","/_mintlify/custom/wundergraphinc/0a55a31d9c045e90/osano.js"],"subdomain":"wundergraphinc","siteName":"WunderGraph","title":"Migration: Subscriptions Overhaul - WunderGraph","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-05-12T14:44:23.776Z","originalFileLocation":"router/subscriptions-migration.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Migration guide for the subscriptions overhaul. Covers the three behavioral changes and the engine WebSocket configuration renames.\">\u003cmeta data-mint-head name=\"application-name\" content=\"WunderGraph\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/wundergraphinc/lz2f-9ge_mXpMLAt/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/wundergraphinc/lz2f-9ge_mXpMLAt/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/wundergraphinc/lz2f-9ge_mXpMLAt/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/wundergraphinc/lz2f-9ge_mXpMLAt/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/wundergraphinc/lz2f-9ge_mXpMLAt/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/wundergraphinc/lz2f-9ge_mXpMLAt/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/wundergraphinc/lz2f-9ge_mXpMLAt/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/wundergraphinc/lz2f-9ge_mXpMLAt/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/wundergraphinc/lz2f-9ge_mXpMLAt/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Migration: Subscriptions Overhaul - WunderGraph\">\u003cmeta data-mint-head property=\"og:description\" content=\"Migration guide for the subscriptions overhaul. Covers the three behavioral changes and the engine WebSocket configuration renames.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"WunderGraph\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://cosmo-docs.wundergraph.com/router/subscriptions-migration\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://wundergraphinc.mintlify.app/_mintlify/api/og/v2?division=Subscriptions\u0026amp;title=Migration%3A+Subscriptions+Overhaul\u0026amp;description=Migration+guide+for+the+subscriptions+overhaul.+Covers+the+three+behavioral+changes+and+the+engine+WebSocket+configuration+renames.\u0026amp;theme=bec8a9a9f4ab1a77bed38caa\u0026amp;signature=ac31079dcc2359aad9268bd6a1113ef573441b1688f792ec3d1144d2ebef7bb5\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Migration: Subscriptions Overhaul - WunderGraph\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Migration guide for the subscriptions overhaul. Covers the three behavioral changes and the engine WebSocket configuration renames.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://wundergraphinc.mintlify.app/_mintlify/api/og/v2?division=Subscriptions\u0026amp;title=Migration%3A+Subscriptions+Overhaul\u0026amp;description=Migration+guide+for+the+subscriptions+overhaul.+Covers+the+three+behavioral+changes+and+the+engine+WebSocket+configuration+renames.\u0026amp;theme=bec8a9a9f4ab1a77bed38caa\u0026amp;signature=ac31079dcc2359aad9268bd6a1113ef573441b1688f792ec3d1144d2ebef7bb5\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/wundergraphinc/lz2f-9ge_mXpMLAt/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"WunderGraph\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#ea4899\">\u003clink data-mint-head rel=\"canonical\" href=\"https://cosmo-docs.wundergraph.com/router/subscriptions-migration\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/router/subscriptions-migration.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://cosmo-docs.wundergraph.com/#organization\",\"name\":\"WunderGraph\",\"url\":\"https://cosmo-docs.wundergraph.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/wundergraphinc/Lko791L3Kvuj3JHY/logo/light.svg?fit=max\u0026auto=format\u0026n=Lko791L3Kvuj3JHY\u0026q=85\u0026s=1877cdae169b31d438adf776ae7087f9\"}},{\"@type\":\"WebSite\",\"@id\":\"https://cosmo-docs.wundergraph.com#website\",\"name\":\"WunderGraph\",\"url\":\"https://cosmo-docs.wundergraph.com\",\"publisher\":{\"@id\":\"https://cosmo-docs.wundergraph.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://cosmo-docs.wundergraph.com/router/subscriptions-migration#webpage\",\"url\":\"https://cosmo-docs.wundergraph.com/router/subscriptions-migration\",\"name\":\"Migration: Subscriptions Overhaul\",\"description\":\"Migration guide for the subscriptions overhaul. Covers the three behavioral changes and the engine WebSocket configuration renames.\",\"dateModified\":\"2026-05-12T14:44:23.776Z\",\"isPartOf\":{\"@id\":\"https://cosmo-docs.wundergraph.com#website\"},\"breadcrumb\":{\"@id\":\"https://cosmo-docs.wundergraph.com/router/subscriptions-migration#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://cosmo-docs.wundergraph.com/router/subscriptions-migration#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Router\",\"item\":\"https://cosmo-docs.wundergraph.com/router/intro\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Subscriptions\",\"item\":\"https://cosmo-docs.wundergraph.com/router/subscriptions\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Migration: Subscriptions Overhaul\",\"item\":\"https://cosmo-docs.wundergraph.com/router/subscriptions-migration\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://cosmo-docs.wundergraph.com/router/subscriptions-migration#article\",\"headline\":\"Migration: Subscriptions Overhaul\",\"name\":\"Migration: Subscriptions Overhaul\",\"description\":\"Migration guide for the subscriptions overhaul. Covers the three behavioral changes and the engine WebSocket configuration renames.\",\"url\":\"https://cosmo-docs.wundergraph.com/router/subscriptions-migration\",\"mainEntityOfPage\":{\"@id\":\"https://cosmo-docs.wundergraph.com/router/subscriptions-migration#webpage\"},\"dateModified\":\"2026-05-12T14:44:23.776Z\",\"publisher\":{\"@id\":\"https://cosmo-docs.wundergraph.com/#organization\"},\"isPartOf\":{\"@id\":\"https://cosmo-docs.wundergraph.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"WunderGraph\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"WunderGraph","nav":{"global":{"anchors":[{"anchor":"Platform Status","icon":"signal","href":"https://status.wundergraph.com/"},{"anchor":"GitHub","icon":"github","href":"https://github.com/wundergraph/cosmo"},{"anchor":"Blog","icon":"newspaper","href":"https://wundergraph.com/blog"}]},"tabs":[{"tab":"Documentation","icon":"book-open","groups":[{"group":" ","pages":[{"title":"WunderGraph Cosmo","icon":"note","href":"/overview"},{"title":"Architecture","icon":"archway","href":"/architecture"},{"title":"Enterprise","icon":"building-memo","href":"/enterprise"},{"title":"Security \u0026 Compliance","icon":"lock","href":"/security-and-compliance"},{"title":"Self Hosting","icon":"note","href":"/self-hosted"}]},{"group":"Getting Started","pages":[{"title":"Cosmo Cloud Onboarding","icon":"cloud-sun","href":"/getting-started/cosmo-cloud-onboarding"},{"title":"Switch from Apollo to Cosmo","icon":"rotate","href":"/getting-started/switch-from-apollo-to-cosmo"},{"title":"Mastering Local Development for GraphQL Federation","icon":"code","href":"/tutorial/mastering-local-development-for-graphql-federation"}]},{"group":"Concepts","pages":[{"title":"Proposals","icon":"file-circle-plus","href":"/concepts/proposals"},{"title":"Feature Flags","icon":"flag","href":"/concepts/feature-flags"},{"title":"Namespaces","icon":"object-ungroup","href":"/concepts/namespaces"},{"title":"Schema Contracts","icon":"file-signature","href":"/concepts/schema-contracts"},{"title":"Cache Warmer","icon":"fire","href":"/concepts/cache-warmer"},{"title":"Router Compatibility Versions","icon":"handshake","href":"/concepts/router-compatibility-versions"}]},{"group":"Cosmo Connect","pages":[{"title":"Overview","icon":"circle-info","href":"/connect/overview"},{"title":"Router Plugins","icon":"plug","href":"/connect/plugins"},{"title":"gRPC Services","icon":"server","href":"/connect/grpc-services"}]},{"group":"Cosmo ConnectRPC","pages":[{"title":"Overview","icon":"circle-info","href":"/connect-rpc/overview"},{"title":"Define Contracts","icon":"scroll","href":"/connect-rpc/produce-define-contracts"},{"title":"Configure Router","icon":"gears","href":"/connect-rpc/produce-configure-router"},{"title":"Generate \u0026 Distribute SDKs","icon":"wand-magic-sparkles","href":"/connect-rpc/produce-generate-distribute-sdks"},{"title":"Consume SDKs","icon":"brackets-curly","href":"/connect-rpc/consume-via-sdks"},{"title":"Consume REST / OpenAPI","icon":"arrow-right-arrow-left","href":"/connect-rpc/consume-via-rest-openapi"},{"title":"Consume gRPC","icon":"tower-broadcast","href":"/connect-rpc/consume-via-grpc"}]},{"group":"Router","pages":[{"title":"Cosmo Router","icon":"door-open","href":"/router/intro"},{"title":"Download \u0026 Install","icon":"sign-posts-wrench","href":"/router/download-and-install"},{"group":"Configuration","icon":"sliders-up","pages":[{"title":"Router Configuration","icon":"circle-info","sidebarTitle":"Overview","href":"/router/configuration"},{"title":"Configuration Design","icon":"ruler-combined","href":"/router/configuration/config-design"},{"title":"Template Expressions","icon":"brackets-curly","href":"/router/configuration/template-expressions"}]},{"group":"MCP Gateway","icon":"robot","pages":[{"title":"MCP Gateway","icon":"robot","href":"/router/mcp"},{"title":"Quickstart","icon":"rocket","href":"/router/mcp/quickstart"},{"title":"Tools","icon":"wrench","href":"/router/mcp/tools"},{"title":"Configuration","icon":"sliders-up","href":"/router/mcp/configuration"},{"group":"OAuth 2.1","icon":"shield-check","pages":[{"title":"Overview","icon":"shield-check","href":"/router/mcp/oauth/overview"},{"title":"OAuth Quickstart","icon":"rocket","href":"/router/mcp/oauth/quickstart"},{"title":"Scope Enforcement","icon":"layer-group","href":"/router/mcp/oauth/scopes"},{"title":"OAuth Configuration Reference","icon":"sliders-up","href":"/router/mcp/oauth/configuration"}]},{"title":"IDE \u0026 AI Tool Setup","icon":"display-code","href":"/router/mcp/ide-setup"}]},{"group":"Custom Modules","icon":"cubes","pages":[{"title":"Overview","icon":"cubes","href":"/router/custom-modules"},{"title":"Migration: Request Deduplication","icon":"arrows-turn-right","href":"/router/custom-modules-migration"}]},{"group":"Cosmo Connect","icon":"network-wired","pages":[{"title":"Overview","icon":"lightbulb","sidebarTitle":"Overview","href":"/router/gRPC/concepts"},{"group":"Plugins","icon":"plug","pages":[{"title":"Plugins","sidebarTitle":"Overview","icon":"circle-info","href":"/router/gRPC/plugins"},{"title":"Debugging","sidebarTitle":"Debugging","icon":"bug","href":"/router/gRPC/plugins/debugging"},{"group":"Go Plugins","icon":"golang","pages":[{"title":"Go Plugins","icon":"circle-info","sidebarTitle":"Overview","href":"/router/gRPC/plugins/go-plugin/overview"},{"title":"HTTP Client","sidebarTitle":"HTTP Client","icon":"diagram-project","href":"/router/gRPC/plugins/go-plugin/http-client"},{"title":"Telemetry","sidebarTitle":"Telemetry","icon":"binary-circle-check","href":"/router/gRPC/plugins/go-plugin/telemetry"},{"title":"Logging","icon":"file-lines","href":"/router/gRPC/plugins/go-plugin/logging"}]},{"group":"TypeScript Plugins","icon":"t","pages":[{"title":"TypeScript Plugins","icon":"circle-info","sidebarTitle":"Overview","href":"/router/gRPC/plugins/ts-plugin/overview"}]}]},{"title":"gRPC Services","sidebarTitle":"gRPC Services","icon":"server","href":"/router/gRPC/grpc-services"},{"title":"GraphQL Support","icon":"shield-check","href":"/router/gRPC/graphql-support"},{"title":"Field Resolvers","sidebarTitle":"Field Resolvers","icon":"function","href":"/router/gRPC/field-resolvers"},{"title":"@requires","sidebarTitle":"@requires","icon":"link","href":"/router/gRPC/requires"}]},{"title":"Authentication \u0026 Authorization","icon":"camera-cctv","href":"/router/authentication-and-authorization"},{"title":"Advanced Data Privacy","icon":"fingerprint","href":"/router/advanced-data-privacy"},{"group":"Subscriptions","icon":"webhook","pages":[{"title":"Subscriptions","icon":"circle-info","sidebarTitle":"Overview","href":"/router/subscriptions"},{"title":"Server Sent Events (SSE)","icon":"server","href":"/router/subscriptions/server-sent-events-sse"},{"title":"Multipart HTTP Requests","icon":"network-wired","href":"/router/subscriptions/multipart-http-requests"},{"title":"Websocket Subprotocols","icon":"plug","href":"/router/subscriptions/websocket-subprotocols"},{"title":"Subscriptions Configuration","description":"This section explains how you can configure Subscriptions both for local development and using Cosmo Studio.","icon":"router","sidebarTitle":"Configuration","href":"/router/subscriptions/router-configuration-for-subscriptions"},{"title":"Migration: Subscriptions Overhaul","icon":"arrows-turn-right","href":"/router/subscriptions-migration"}]},{"group":"Defer","icon":"forward-step","pages":[{"title":"Defer","description":"Deliver the slow parts of a query response incrementally with the @defer directive.","icon":"forward-step","sidebarTitle":"Overview","href":"/router/defer"},{"title":"Using @defer","icon":"code","sidebarTitle":"Usage and Examples","href":"/router/defer/usage"},{"title":"How the Router Executes @defer","icon":"diagram-project","sidebarTitle":"How It Works","href":"/router/defer/how-it-works"},{"title":"When to Use @defer","icon":"scale-balanced","sidebarTitle":"When to Use","href":"/router/defer/when-to-use"}]},{"group":"Persisted Queries","icon":"cloud-binary","pages":[{"title":"Persisted Queries","icon":"circle-info","sidebarTitle":"Overview","href":"/router/persisted-queries"},{"title":"Persisted Operations","icon":"database","href":"/router/persisted-queries/persisted-operations"},{"title":"Automatic Persisted Queries (APQ)","icon":"bolt","href":"/router/persisted-queries/automatic-persisted-queries-apq"}]},{"group":"Open Telemetry","icon":"binary-circle-check","pages":[{"title":"Open Telemetry","sidebarTitle":"Overview","icon":"circle-info","href":"/router/open-telemetry"},{"title":"Custom Attributes","icon":"globe","href":"/router/open-telemetry/custom-attributes"},{"title":"Prometheus OTLP Ingestion","icon":"gauge-high","href":"/router/open-telemetry/prometheus-otlp-ingestion"},{"title":"Setup OpenTelemetry Collector","icon":"server","href":"/router/open-telemetry/setup-opentelemetry-collector"},{"title":"Dynatrace","icon":"server","href":"/router/open-telemetry/dynatrace"}]},{"group":"Metrics \u0026 Monitoring","icon":"projector","pages":[{"title":"Metrics \u0026 Monitoring","sidebarTitle":"Overview","icon":"circle-info","href":"/router/metrics-and-monitoring"},{"title":"Span Error Status \u0026 Error Metrics","sidebarTitle":"Span Error Status","icon":"triangle-exclamation","href":"/router/metrics-and-monitoring/span-error-status"},{"title":"Exemplars","sidebarTitle":"Exemplars","icon":"crosshairs","href":"/router/metrics-and-monitoring/exemplars"},{"title":"Prometheus Metric Reference","icon":"gauge-high","href":"/router/metrics-and-monitoring/prometheus-metric-reference"},{"title":"Grafana","icon":"chart-line","href":"/router/metrics-and-monitoring/grafana"}]},{"group":"Proxy capabilities","icon":"bridge-circle-check","pages":[{"title":"Proxy Capabilities","icon":"circle-info","sidebarTitle":"Overview","href":"/router/proxy-capabilities"},{"title":"Subgraph Request Headers Operations","icon":"arrow-right-to-bracket","href":"/router/proxy-capabilities/subgraph-request-header-operations"},{"title":"Subgraph Response Header Operations","icon":"arrow-right-from-bracket","href":"/router/proxy-capabilities/subgraph-response-header-operations"},{"title":"Forward Client Extensions","icon":"share-nodes","href":"/router/proxy-capabilities/forward-client-extensions"},{"title":"Adjusting Cache Control","icon":"clock","href":"/router/proxy-capabilities/adjusting-cache-control"},{"title":"Override Subgraph Config","icon":"sliders","href":"/router/proxy-capabilities/override-subgraph-config"},{"title":"Router Response Header Operations","icon":"arrow-right-from-bracket","href":"/router/proxy-capabilities/router-response-header-operations"}]},{"group":"Traffic shaping","icon":"road-circle-check","pages":[{"title":"Traffic Shaping","icon":"circle-info","sidebarTitle":"Overview","href":"/router/traffic-shaping"},{"title":"Retry","icon":"arrow-rotate-left","href":"/router/traffic-shaping/retry"},{"title":"Timeout","icon":"clock","href":"/router/traffic-shaping/timeout"},{"title":"Circuit Breaker","icon":"plug-circle-bolt","href":"/router/traffic-shaping/circuit-breaker"}]},{"title":"Storage Providers","icon":"cabinet-filing","href":"/router/storage-providers"},{"group":"Deployment","icon":"truck-ramp-couch","pages":[{"title":"Deployment","sidebarTitle":"Overview","icon":"circle-info","href":"/router/deployment"},{"title":"Config Hot Reload","icon":"arrows-rotate","href":"/router/deployment/config-hot-reload"}]},{"group":"Security","icon":"shield-quartered","pages":[{"title":"Security","sidebarTitle":"Overview","icon":"circle-info","href":"/router/security"},{"title":"TLS","icon":"shield-halved","href":"/router/security/tls"},{"title":"Config Validation \u0026 Signing","icon":"signature","href":"/router/security/config-validation-and-signing"},{"title":"Hardening Guide","icon":"book","href":"/router/security/hardening-guide"},{"title":"Cost Control","icon":"scale-balanced","href":"/router/security/cost-control"},{"title":"Validate Inline Arguments","icon":"shield-halved","href":"/router/security/validate-inline-arguments"}]},{"group":"Development","icon":"flask-round-potion","pages":[{"title":"Development","icon":"circle-info","sidebarTitle":"Overview","href":"/router/development"},{"title":"Debugging","icon":"bug","href":"/router/development/debugging"},{"title":"Development Mode","icon":"code","href":"/router/development/development-mode"}]},{"title":"Response Cache (Experimental)","icon":"boxes-stacked","href":"/router/response-cache"},{"title":"Request Deduplication","icon":"clone","href":"/router/request-deduplication"},{"title":"Performance Debugging","icon":"gauge-high","href":"/router/performance-debugging"},{"title":"Advanced Request Tracing (ART)","icon":"stars","href":"/router/advanced-request-tracing-art"},{"group":"Query Plan","icon":"file-contract","pages":[{"title":"Query Plan","icon":"circle-info","sidebarTitle":"Overview","href":"/router/query-plan"},{"title":"Batch Generate Query Plans","icon":"layer-group","href":"/router/query-plan/batch-generate-query-plans"}]},{"group":"Cosmo Streams (EDFS)","icon":"wave","pages":[{"title":"Cosmo Streams (EDFS)","icon":"circle-info","sidebarTitle":"Overview","href":"/router/cosmo-streams"},{"group":"NATS","icon":"puzzle-piece","pages":[{"title":"NATS","sidebarTitle":"Overview","icon":"circle-info","href":"/router/cosmo-streams/nats"},{"title":"Stream And Consumer Configuration","icon":"wave","href":"/router/cosmo-streams/nats/stream-and-consumer-configuration"}]},{"title":"Kafka","icon":"sitemap","href":"/router/cosmo-streams/kafka"},{"title":"Redis","icon":"sitemap","href":"/router/cosmo-streams/redis"},{"group":"Custom Modules","icon":"cubes","pages":[{"title":"Custom Modules","sidebarTitle":"Overview","icon":"circle-info","href":"/router/cosmo-streams/custom-modules"},{"title":"SubscriptionOnCreate Handler","icon":"circle-plus","href":"/router/cosmo-streams/custom-modules/subscription-on-create"},{"title":"SubscriptionOnStart Handler","icon":"circle-play","href":"/router/cosmo-streams/custom-modules/subscription-on-start"},{"title":"BeforeEventsDispatch Handler","icon":"split","href":"/router/cosmo-streams/custom-modules/before-events-dispatch"},{"title":"OnReceiveEvents Handler","icon":"arrow-left","href":"/router/cosmo-streams/custom-modules/on-receive-event"},{"title":"OnPublishEvents Handler","icon":"arrow-right","href":"/router/cosmo-streams/custom-modules/on-publish-event"}]}]},{"title":"Compliance and Data Management","icon":"cloud-binary","href":"/router/compliance-and-data-management"},{"title":"Query Batching","icon":"layer-group","sidebarTitle":"Query Batching","href":"/router/query-batching"},{"title":"Feature Flags","icon":"flag","sidebarTitle":"Feature Flags","href":"/router/feature-flags"},{"group":"Subgraph data propagation","icon":"share-from-square","pages":[{"title":"Subgraph Error Propagation","icon":"bug","href":"/router/subgraph-data-propagation/subgraph-error-propagation"},{"title":"Subgraph Extension Propagation","icon":"puzzle-piece","href":"/router/subgraph-data-propagation/subgraph-extension-propagation"}]},{"title":"Relaxed Field Selection Merging Nullability","icon":"merge","href":"/router/relaxed-field-selection-merging-nullability"},{"title":"String Literals for Enums","icon":"quotes","href":"/router/string-literals-for-enums"},{"title":"File Upload","icon":"upload","href":"/router/file-upload"},{"title":"Access Logs","icon":"camera-cctv","href":"/router/access-logs"},{"title":"Profiling","icon":"binoculars","href":"/router/profiling"},{"title":"Upgrading The Router","icon":"arrows-rotate","href":"/router/upgrading-the-router"}]},{"group":"Studio","pages":[{"title":"Cosmo Studio","icon":"door-open","href":"/studio/intro"},{"title":"Overview Page","icon":"map","href":"/studio/overview-page"},{"title":"Schema Explorer","icon":"file-lines","href":"/studio/schema-explorer"},{"title":"Schema Registry","icon":"atom","href":"/studio/schema-registry"},{"title":"Schema Checks","icon":"list-check","href":"/studio/schema-checks"},{"group":"Check Extensions","icon":"puzzle-piece-simple","pages":[{"title":"Subgraph Check Extensions","sidebarTitle":"Overview","icon":"puzzle-piece-simple","href":"/studio/subgraph-check-extensions"},{"title":"Request Payload Structure","sidebarTitle":"Request Payload","icon":"share","href":"/studio/sce/request-payload-structure"},{"title":"Response Payload Structure","sidebarTitle":"Response Payload","icon":"reply","href":"/studio/sce/response-structure"},{"title":"File Structure","sidebarTitle":"File Structure","icon":"file-export","href":"/studio/sce/file-content"},{"title":"Handler example","sidebarTitle":"Handler example","icon":"puzzle-piece-simple","href":"/studio/sce/handler-example"}]},{"title":"Schema Contracts","icon":"file-contract","href":"/studio/schema-contracts"},{"title":"Overrides","icon":"overline","href":"/studio/overrides"},{"title":"Changelog","icon":"file-plus-minus","href":"/studio/changelog"},{"group":"Playground++","icon":"rectangle-code","pages":[{"title":"Playground++","icon":"circle-info","sidebarTitle":"Overview","href":"/studio/playground"},{"title":"Collections","icon":"folder-open","href":"/studio/playground/collections"},{"title":"Custom Scripts","icon":"code","href":"/studio/playground/custom-scripts"},{"title":"Sharing Playground Sessions","icon":"share-nodes","href":"/studio/playground/shared-playground-state"},{"title":"Default Headers","icon":"sliders","href":"/studio/playground/default-headers"}]},{"title":"Graph Documentation","icon":"readme","href":"/studio/studio"},{"title":"Compositions","icon":"books","href":"/studio/compositions"},{"group":"Analytics","icon":"chart-line","pages":[{"title":"Analytics","icon":"circle-info","sidebarTitle":"Overview","href":"/studio/analytics"},{"title":"Metrics","icon":"gauge-high","href":"/studio/analytics/metrics"},{"title":"Traces","icon":"route","href":"/studio/analytics/traces"},{"title":"Distributed Tracing","icon":"network-wired","href":"/studio/analytics/distributed-tracing"},{"title":"Schema Field Usage","icon":"chart-column","href":"/studio/analytics/schema-field-usage"},{"title":"Client Identification","icon":"user-group","href":"/studio/analytics/client-identification"}]},{"title":"Operations","icon":"chart-line","href":"/studio/operations"},{"group":"API Keys","icon":"key","pages":[{"title":"API Keys","icon":"circle-info","sidebarTitle":"Overview","href":"/studio/api-keys"},{"title":"API Key Permissions","icon":"shield-halved","href":"/studio/api-keys/api-key-permissions"},{"title":"API Key Resources","icon":"database","href":"/studio/api-keys/api-key-resources"}]},{"title":"Migrate from Apollo","icon":"swap-arrows","href":"/studio/migrate-from-apollo"},{"group":"Alerts and notifications","icon":"alarm-snooze","pages":[{"title":"Alerts And Notifications","icon":"circle-info","sidebarTitle":"Overview","href":"/studio/alerts-and-notifications"},{"title":"Webhooks","icon":"webhook","href":"/studio/alerts-and-notifications/webhooks"},{"title":"Slack Integration","icon":"slack","href":"/studio/alerts-and-notifications/slack-integration"}]},{"title":"Graph Access Control","icon":"user-secret","href":"/studio/graph-access-control"},{"title":"Cluster Management","icon":"layer-group","href":"/studio/cluster-management"},{"title":"Sessions","icon":"shield-plus","sidebarTitle":"Sessions","href":"/studio/sessions"},{"title":"RBAC","icon":"user-tie","href":"/studio/rbac"},{"group":"Groups","icon":"users-rectangle","pages":[{"title":"Groups","icon":"circle-info","sidebarTitle":"Overview","href":"/studio/groups"},{"title":"Group Rules","icon":"database","href":"/studio/groups/group-rules"}]},{"group":"SSO","icon":"building-lock","pages":[{"title":"SSO","icon":"circle-info","sidebarTitle":"Overview","href":"/studio/sso"},{"title":"Okta","icon":"user-shield","href":"/studio/sso/okta"},{"title":"Auth0","icon":"user-lock","href":"/studio/sso/auth0"},{"title":"Keycloak","icon":"key","href":"/studio/sso/keycloak"},{"title":"Microsoft Entra","icon":"microsoft","href":"/studio/sso/microsoft-entra"}]},{"title":"Namespace Login Methods","icon":"lock-keyhole","href":"/studio/namespace-login-methods"},{"title":"Organization Login Methods","icon":"lock-keyhole","href":"/studio/organization-login-methods"},{"group":"SCIM","icon":"file-user","pages":[{"title":"SCIM","sidebarTitle":"Overview","icon":"circle-info","href":"/studio/scim"},{"title":"Okta","icon":"user-shield","href":"/studio/scim/okta"},{"title":"Okta (OIN version)","icon":"shield-check","href":"/studio/scim/okta-oin-version"}]},{"title":"Audit Log","icon":"people-roof","href":"/studio/audit-log"},{"title":"Cosmo AI","icon":"brain-circuit","href":"/studio/cosmo-ai"},{"group":"Policies","icon":"user-police-tie","pages":[{"title":"Policies","icon":"circle-info","sidebarTitle":"Overview","href":"/studio/policies"},{"title":"Linter Rules","icon":"code","href":"/studio/lint-policy/linter-rules"}]},{"title":"Graph Pruning","icon":"broom-wide","href":"/studio/graph-pruning"},{"title":"Invitations","icon":"envelopes-bulk","href":"/studio/invitations"}]},{"group":"Control Plane","pages":[{"title":"Cosmo Control Plane","icon":"door-open","href":"/control-plane/intro"},{"title":"Configuration","icon":"sliders-up","href":"/control-plane/configuration"},{"title":"Webhooks","icon":"webhook","href":"/control-plane/webhooks"}]},{"group":"GraphQL / Federation","pages":[{"title":"Federation Compatibility Matrix","icon":"person-rifle","href":"/federation/federation-compatibility-matrix"},{"group":"Directives","icon":"sign-post","pages":[{"title":"Directives Reference","icon":"list-check","href":"/federation/federation-directives-index"},{"title":"@authenticated","icon":"lock","href":"/federation/directives/authenticated"},{"title":"@composeDirective","icon":"pen-nib","href":"/federation/directives/composeddirective"},{"title":"@connect__fieldResolver","icon":"function","href":"/federation/directives/connect__fieldresolver"},{"title":"@defer","icon":"forward-step","href":"/federation/directives/defer"},{"title":"@deprecated","icon":"triangle-exclamation","href":"/federation/directives/deprecated"},{"title":"@external","icon":"arrow-right-from-bracket","href":"/federation/directives/external"},{"title":"@key","icon":"fingerprint","href":"/federation/directives/key"},{"title":"@link","icon":"link","href":"/federation/directives/link"},{"title":"@openfed configureDescription","icon":"pen-to-square","href":"/federation/directives/openfed__configuredescription"},{"title":"@openfed requireFetchReasons","icon":"magnifying-glass-chart","href":"/federation/directives/openfed__requirefetchreasons"},{"title":"@openfed subscriptionFilter","icon":"filter","href":"/federation/directives/openfed__subscriptionfilter"},{"title":"@provides","icon":"hand-holding","href":"/federation/directives/provides"},{"title":"@requires","icon":"link","href":"/federation/directives/requires"},{"title":"@shareable","icon":"share-nodes","href":"/federation/directives/shareable"},{"title":"@specifiedBy","icon":"link","href":"/federation/directives/specifiedby"},{"title":"@requiresScopes","icon":"key","href":"/federation/directives/requiresscopes"}]},{"group":"Event-Driven Federated Subscriptions","icon":"conveyor-belt-boxes","pages":[{"title":"Event-Driven Federated Subscriptions","sidebarTitle":"Overview","icon":"circle-info","href":"/federation/event-driven-federated-subscriptions"},{"title":"NATS","icon":"puzzle-piece","href":"/federation/event-driven-federated-subscriptions/nats"},{"title":"Kafka","icon":"sitemap","href":"/federation/event-driven-federated-subscriptions/kafka"},{"title":"Redis","icon":"sitemap","href":"/federation/event-driven-federated-subscriptions/redis"},{"title":"Composition Rules","icon":"network-wired","href":"/federation/event-driven-federated-subscriptions/composition-rules"}]},{"title":"Composition Errors","icon":"triangle-exclamation","sidebarTitle":"Composition errors","href":"/federation/composition-errors"}]},{"group":"Deployments and Hosting","pages":[{"title":"Cosmo","icon":"door-open","href":"/deployments-and-hosting/intro"},{"group":"Kubernetes","icon":"layer-group","pages":[{"title":"Kubernetes","sidebarTitle":"Overview","icon":"circle-info","href":"/deployments-and-hosting/kubernetes"},{"group":"Helm Chart","icon":"chart-line","pages":[{"title":"Helm Chart","sidebarTitle":"Overview","icon":"circle-info","href":"/deployments-and-hosting/kubernetes/helm-chart"},{"title":"Cosmo Platform","icon":"dharmachakra","href":"/deployments-and-hosting/kubernetes/helm-chart/cosmo-platform"},{"title":"Router","icon":"router","href":"/deployments-and-hosting/kubernetes/helm-chart/router"}]}]},{"group":"Terraform","icon":"road-bridge","pages":[{"title":"Terraform","icon":"circle-info","sidebarTitle":"Overview","href":"/deployments-and-hosting/terraform"},{"title":"AWS Fargate","icon":"aws","href":"/deployments-and-hosting/terraform/aws-fargate"}]},{"title":"Docker","icon":"docker","href":"/deployments-and-hosting/docker"},{"title":"Release Management","icon":"memo-circle-check","href":"/deployments-and-hosting/release-management"},{"title":"Cosmo Cloud","icon":"cloud","href":"/deployments-and-hosting/cosmo-cloud"}]}]},{"tab":"CLI","icon":"terminal","pages":[{"title":"CLI","href":"/cli/intro"}]},{"tab":"Tutorials","icon":"newspaper","pages":[{"title":"Tutorials","href":"/tutorial"}]}]},"basePath":"","title":"Migration: Subscriptions Overhaul - WunderGraph","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["10e4515597"],"chunks":["BannerMarkdown-CX_qQQOL.js","dist-BTZUMDnx.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-xpJZXxdP.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js"]}