Repository navigation
Conversation
Keep the shared HTTP handle and RPC group when WebSocket is disabled. Return instance connection metadata while retaining transport JSON encoding hints. Cover SSE-only startup and disposal, returned-descriptor RPC over both transports, nested and renamed routes, and transport-disabled controls.
|
@SaKaNa-Y is attempting to deploy a commit to the NuxtLabs Team on Vercel. A member of the Team first needs to authorize it. |
|
👁️🗨️ Review this pull request with grouped, summarized diffs at: raw result💭 analyzed by {
"headSha": "fd48a7c228b9b6d2ad062e5d42c83c9e284bc1ad",
"result": {
"overallSummary": "Fixes `createDevServer()` so it always returns a usable, closable handle regardless of transport configuration, and aligns `handle.connectionMeta()` with HTTP discovery (`__connection.json`) in both path resolution and strict JSON method advertisement, preventing 404s on nested mounts and unsafe RPC calls to JSON-only methods.",
"groups": [
{
"key": "core-fix",
"label": "Dev server handle & discovery fix",
"summary": "Fixes `createDevServer()` to always return a closable handle (even with WebSocket disabled), make `handle.connectionMeta()` produce the same JSON snapshot as HTTP discovery (resolving paths against the base path), and have both discovery paths read strict JSON-serializable method names live from the RPC registry.",
"category": "api",
"filePaths": [
"packages/devframe/src/adapters/dev.ts",
"packages/devframe/src/node/instance-shell.ts"
],
"critical": true,
"fileNotes": [
{
"path": "packages/devframe/src/node/instance-shell.ts",
"text": "`startServerTier()` is now also used when WS is disabled but a shared HTTP server was supplied, so the handle/RPC group are always available for `close()`. `addLocalMethodHints` lazily reads the registry via a getter so later-registered methods are reflected without re-snapshotting."
},
{
"path": "packages/devframe/src/adapters/dev.ts",
"text": "`connectionMeta()` now deep-clones via JSON round-trip (matching HTTP discovery's serialization, including custom `toJSON`) and rewrites local websocket/sse/mcp paths with `joinURL(basePath, ...)` so nested mounts resolve correctly against `handle.origin`."
}
]
},
{
"key": "tests",
"label": "Transport & discovery tests",
"summary": "Adds a new regression suite covering SSE-only/HTTP-only handles, nested-mount MCP discovery, static-config JSON parity, and port reuse on close; updates existing discovery assertions to expect `jsonSerializableMethods` and late-registered methods.",
"category": "tests",
"filePaths": [
"packages/devframe/src/adapters/__tests__/dev-transports.test.ts",
"packages/devframe/src/adapters/__tests__/dev.test.ts",
"packages/devframe/src/adapters/__tests__/initiate.test.ts",
"packages/hub/src/node/__tests__/initiate.test.ts",
"examples/custom-hub-next/tests/next-devframe-hub.test.ts"
],
"fileNotes": [
{
"path": "packages/devframe/src/adapters/__tests__/dev-transports.test.ts",
"text": "New end-to-end suite exercising real WS/SSE RPC calls through both `handle.connectionMeta()` and `__connection.json`, including strict-JSON rejection of `Map` values and handle close/port-release behavior."
}
]
},
{
"key": "docs",
"label": "Dev adapter docs",
"summary": "Documents the fuller `StartedServer` shape, clarifies that `close()` releases the HTTP listener even with WebSocket disabled, and explains that `connectionMeta()` returns fresh JSON snapshots resolved against `handle.origin`.",
"category": "docs",
"filePaths": [
"docs/content/2.adapters/3.dev.md"
]
}
],
"schemaVersion": 1,
"source": "llm",
"generatedAt": "2026-11-08T06:31:27.532Z",
"model": "vercel-ai-gateway/anthropic/claude-sonnet-5",
"locale": "en"
}
} |
Read method flags from the current RPC registry when a client requests the instance descriptor. This gives SSE-only handles and HTTP discovery the same encoding hints as WebSocket handles, including methods registered after startup.
SaKaNa-Y
force-pushed
the
fix/dev-server-sse-handle
branch
from
November 7, 2026 07:53
85e31b1 to
70282fa
Compare
Return a fresh connection descriptor for each handle call so a viewer can edit its copy without changing HTTP discovery. Resolve local RPC paths from the mount so viewers can connect from the server origin.
Serialize connection metadata using the discovery JSON format so static configuration can supply values with toJSON methods. Resolve same-origin MCP paths against the mount base for callers that receive the handle. Exercise both discovery paths with a real MCP initialize request and compare the published representation of a URL in static configuration.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
With WebSocket disabled,
createDevServer()opens an HTTP listener and then throws before returning the handle needed to close it. With WebSocket and SSE enabled, the handle advertises only WebSocket. HTTP discovery also omits the names of strict JSON methods, so an RPC client can send aMapto a handler that expects JSON.Return a closable handle for each transport configuration. Both discovery paths read the strict JSON method names from the current RPC registry, including methods registered after startup. Each call to
handle.connectionMeta()returns a fresh JSON snapshot, so static configuration values such asURLhave the same representation as in HTTP discovery.For a devframe mounted at
/nested/tool/, callers can reach the same MCP route from either descriptor. Local WebSocket and SSE paths follow the same rule.handle.connectionMeta()/nested/tool/tools/mcphandle.origin__connection.jsontools/mcpEvidence
Mapbefore the handler runs. An unflagged method round-trips the sameMap.URLin its static configuration threwDataCloneError. The regression tests now initialize MCP through both descriptors and read the same URL string from both. Mutating a handle snapshot leaves subsequent snapshots and HTTP discovery intact.Local lint, documentation lint, Knip, typecheck and build passed. The full Vitest run passed 1,843 tests with 14 skipped on Node 26.13.0.
Merge Danger
Door: Two-way. The patch can be reverted without a data migration.
Blast Radius: Live connection discovery. RPC clients using a strict JSON method now reject unsupported values before dispatch. An incorrect path or method list can prevent a connection or select the wrong encoding.