diff --git a/docs/FAQ.md b/docs/FAQ.md index c9c4f7c3a6ef..4951acb9e8e5 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -22,6 +22,7 @@ - [How do I debug issues with code-server?](#how-do-i-debug-issues-with-code-server) - [What is the healthz endpoint?](#what-is-the-healthz-endpoint) - [What is the heartbeat file?](#what-is-the-heartbeat-file) +- [How do I change the reconnection grace time?](#how-do-i-change-the-reconnection-grace-time) - [How do I change the password?](#how-do-i-change-the-password) - [Can I store my password hashed?](#can-i-store-my-password-hashed) - [Is multi-tenancy possible?](#is-multi-tenancy-possible) @@ -326,6 +327,16 @@ If you want to shutdown code-server if there hasn't been an active connection after a predetermined amount of time, you can use the --idle-timeout-seconds flag or set an `CODE_SERVER_IDLE_TIMEOUT_SECONDS` environment variable. +## How do I change the reconnection grace time? + +Pass `--reconnection-grace-time ` to `code-server`, set +`CODE_SERVER_RECONNECTION_GRACE_TIME=`, or add +`reconnection-grace-time: ` to +`~/.config/code-server/config.yaml`. + +The default is `10800` (3 hours). If a client stays disconnected longer than +this, it must reload the window. + ## How do I change the password? Edit the `password` field in the code-server config file at diff --git a/src/node/cli.ts b/src/node/cli.ts index 8b1c9bfd7b5c..ac4ee32f0deb 100644 --- a/src/node/cli.ts +++ b/src/node/cli.ts @@ -52,6 +52,7 @@ export interface UserProvidedCodeArgs { "disable-workspace-trust"?: boolean "disable-getting-started-override"?: boolean "disable-proxy"?: boolean + "reconnection-grace-time"?: string "session-socket"?: string "cookie-suffix"?: string "link-protection-trusted-domains"?: string[] @@ -315,6 +316,12 @@ export const options: Options> = { type: "number", description: "Timeout in seconds to wait before shutting down when idle.", }, + "reconnection-grace-time": { + type: "string", + description: + "Override the reconnection grace time in seconds. Clients who disconnect for longer than this duration will need to \n" + + "reload the window. Defaults to 10800 (3 hours).", + }, } export const optionDescriptions = (opts: Partial>> = options): string[] => { @@ -632,6 +639,10 @@ export async function setDefaults(cliArgs: UserProvidedArgs, configArgs?: Config args["github-auth"] = process.env.GITHUB_TOKEN } + if (process.env.CODE_SERVER_RECONNECTION_GRACE_TIME) { + args["reconnection-grace-time"] = process.env.CODE_SERVER_RECONNECTION_GRACE_TIME + } + if (process.env.CODE_SERVER_IDLE_TIMEOUT_SECONDS) { if (isNaN(Number(process.env.CODE_SERVER_IDLE_TIMEOUT_SECONDS))) { logger.info("CODE_SERVER_IDLE_TIMEOUT_SECONDS must be a number") diff --git a/test/unit/node/cli.test.ts b/test/unit/node/cli.test.ts index 44a0bd1c71a0..1ae2615cbc92 100644 --- a/test/unit/node/cli.test.ts +++ b/test/unit/node/cli.test.ts @@ -48,6 +48,8 @@ describe("parser", () => { delete process.env.PASSWORD delete process.env.CS_DISABLE_FILE_DOWNLOADS delete process.env.CS_DISABLE_GETTING_STARTED_OVERRIDE + delete process.env.CS_RECONNECTION_GRACE_TIME + delete process.env.CODE_SERVER_RECONNECTION_GRACE_TIME delete process.env.VSCODE_PROXY_URI delete process.env.CS_DISABLE_PROXY console.log = jest.fn() @@ -115,6 +117,8 @@ describe("parser", () => { ["--session-socket", "/tmp/override-code-server-ipc-socket"], + ["--reconnection-grace-time", "86400"], + ["--host", "0.0.0.0"], "4", "--", @@ -151,6 +155,7 @@ describe("parser", () => { version: true, "bind-addr": "192.169.0.1:8080", "session-socket": "/tmp/override-code-server-ipc-socket", + "reconnection-grace-time": "86400", "abs-proxy-base-path": "/codeserver/app1", "skip-auth-preflight": true, }) @@ -457,6 +462,20 @@ describe("parser", () => { }) }) + it("should use env var CODE_SERVER_RECONNECTION_GRACE_TIME for reconnection grace time", async () => { + process.env.CODE_SERVER_RECONNECTION_GRACE_TIME = "86400" + const args = parse([]) + expect(args).toEqual({}) + + const defaultArgs = await setDefaults(args) + expect(defaultArgs).toEqual({ + ...defaults, + "reconnection-grace-time": "86400", + }) + delete process.env.CS_RECONNECTION_GRACE_TIME + delete process.env.CODE_SERVER_RECONNECTION_GRACE_TIME + }) + it("should error if password passed in", () => { expect(() => parse(["--password", "supersecret123"])).toThrowError( "--password can only be set in the config file or passed in via $PASSWORD",