--reconnection-grace-time does not survive closing the browser tab

Open
#7,955 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
55/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Active
Tech stack
typescript
Domain
backend, web-dev

Research direction

Trace BrowserLifecycleService's pagehide/beforeunload handling and ManagementConnection's graceful-dispose cleanup first. Then inspect RemoteExtensionHostAgentServer's connection-shortening path; done means a configured grace period survives tab closure and a second connection, while installations using the default retain stock behavior.

Written by the indexing model from the issue text.

Description

bug needs-investigation

Problem

--reconnection-grace-time (added in #7678) is documented as "Override the reconnection grace time in seconds. Clients who disconnect for longer than this duration will need to reload the window."

In practice the setting cannot deliver that, for two independent reasons.

1. Closing the tab bypasses the grace time entirely.

BrowserLifecycleService listens on pagehide/beforeunload and runs the workbench shutdown, which disposes the remote connection gracefully. On the server, ManagementConnection treats a graceful dispose as a finished client:

Event.once(this.protocol.onDidDispose)(() => {
    this._log(`The client has disconnected gracefully, so the connection will be disposed.`);
    this._cleanResources();
});

_cleanResources() runs immediately — the grace time is never consulted. So closing the tab kills the session regardless of the configured value.

2. A second connection cuts the grace time to 5 minutes.

RemoteExtensionHostAgentServer shortens every disconnected connection on each new connection:

for (const key in this._managementConnections) {
    this._managementConnections[key].shortenReconnectionGraceTimeIfNecessary();
}

which schedules ProtocolConstants.ReconnectionShortGraceTime (5 min). Opening a second tab is enough to cut a deliberately long grace time back down.

Impact

The use case the flag exists for — leave a long-running task (a build, a CLI, an agent session) running and come back to it later — does not work. The session is gone as soon as the browser is closed.

Expected

When an operator raises --reconnection-grace-time above the default, a disconnected session should survive for the configured duration, including across a closed browser. Installations that never set the flag should keep Code's stock behaviour.

Environment

Reproduced on code-server 4.128.0 and confirmed present in main (4.133.0 / Code 1.133.0).

Dominant language
TypeScript
Stars
79.4k
Forks
6.9k
Avg merge
2d 13h
Merged PRs (30d)
39

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from coder/code-server

All issues in coder/code-server

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.