Skip to content

Commit 34996e0

Browse files
committed
Move integration types into code-server
This will be easier to maintain than to have it as a patch.
1 parent 5afb26f commit 34996e0

File tree

5 files changed

+79
-37
lines changed

5 files changed

+79
-37
lines changed

src/node/cli.ts

+39-18
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,40 @@ export enum LogLevel {
3131

3232
export class OptionalString extends Optional<string> {}
3333

34+
/**
35+
* Code flags provided by the user.
36+
*/
37+
export interface UserProvidedCodeArgs {
38+
"disable-telemetry"?: boolean
39+
force?: boolean
40+
"user-data-dir"?: string
41+
"enable-proposed-api"?: string[]
42+
"extensions-dir"?: string
43+
"builtin-extensions-dir"?: string
44+
"install-extension"?: string[]
45+
"uninstall-extension"?: string[]
46+
"list-extensions"?: boolean
47+
"locate-extension"?: string[]
48+
"show-versions"?: boolean
49+
category?: string
50+
"github-auth"?: string
51+
"disable-update-check"?: boolean
52+
}
53+
3454
/**
3555
* Arguments that the user explicitly provided on the command line. All
3656
* arguments must be optional.
3757
*
3858
* For arguments with defaults see DefaultedArgs.
3959
*/
40-
export interface UserProvidedArgs {
60+
export interface UserProvidedArgs extends UserProvidedCodeArgs {
4161
config?: string
4262
auth?: AuthType
4363
password?: string
4464
"hashed-password"?: string
4565
cert?: OptionalString
4666
"cert-host"?: string
4767
"cert-key"?: string
48-
"disable-update-check"?: boolean
4968
enable?: string[]
5069
help?: boolean
5170
host?: string
@@ -66,21 +85,6 @@ export interface UserProvidedArgs {
6685
verbose?: boolean
6786
/* Positional arguments. */
6887
_?: string[]
69-
70-
// VS Code flags.
71-
"disable-telemetry"?: boolean
72-
force?: boolean
73-
"user-data-dir"?: string
74-
"enable-proposed-api"?: string[]
75-
"extensions-dir"?: string
76-
"builtin-extensions-dir"?: string
77-
"install-extension"?: string[]
78-
"uninstall-extension"?: string[]
79-
"list-extensions"?: boolean
80-
"locate-extension"?: string[]
81-
"show-versions"?: boolean
82-
category?: string
83-
"github-auth"?: string
8488
}
8589

8690
interface Option<T> {
@@ -761,10 +765,27 @@ export const shouldOpenInExistingInstance = async (args: UserProvidedArgs): Prom
761765
return undefined
762766
}
763767

768+
/**
769+
* Arguments for running Code's server.
770+
*/
771+
export interface CodeArgs extends UserProvidedCodeArgs {
772+
"accept-server-license-terms"?: boolean
773+
"connection-token"?: string
774+
help: boolean
775+
port: string
776+
version: boolean
777+
"without-browser-env-var"?: boolean
778+
}
779+
780+
/**
781+
* Spawn the Code CLI.
782+
*/
783+
export type SpawnCli = (args: CodeArgs) => Promise<void>
784+
764785
/**
765786
* Convert our arguments to VS Code server arguments.
766787
*/
767-
export const toVsCodeArgs = async (args: DefaultedArgs): Promise<CodeServerLib.ServerParsedArgs> => {
788+
export const toCodeArgs = async (args: DefaultedArgs): Promise<CodeArgs> => {
768789
return {
769790
"connection-token": "0000",
770791
...args,

src/node/entry.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { logger } from "@coder/logger"
22
import { optionDescriptions, parse, readConfigFile, setDefaults, shouldOpenInExistingInstance } from "./cli"
33
import { getVersionString, getVersionJsonString } from "./constants"
4-
import { openInExistingInstance, runCodeServer, runVsCodeCli, shouldSpawnCliProcess } from "./main"
4+
import { openInExistingInstance, runCodeServer, runCodeCli, shouldSpawnCliProcess } from "./main"
55
import { isChild, wrapper } from "./wrapper"
66

77
async function entry(): Promise<void> {
@@ -48,7 +48,7 @@ async function entry(): Promise<void> {
4848

4949
if (shouldSpawnCliProcess(args)) {
5050
logger.debug("Found VS Code arguments; spawning VS Code CLI")
51-
return runVsCodeCli(args)
51+
return runCodeCli(args)
5252
}
5353

5454
const socketPath = await shouldOpenInExistingInstance(cliArgs)

src/node/main.ts

+22-12
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import path from "path"
55
import { Disposable } from "../common/emitter"
66
import { plural } from "../common/util"
77
import { createApp, ensureAddress } from "./app"
8-
import { AuthType, DefaultedArgs, Feature, toVsCodeArgs, UserProvidedArgs } from "./cli"
8+
import { AuthType, DefaultedArgs, Feature, SpawnCli, toCodeArgs, UserProvidedArgs } from "./cli"
99
import { coderCloudBind } from "./coder_cloud"
1010
import { commit, version } from "./constants"
1111
import { register } from "./routes"
@@ -23,28 +23,38 @@ export const shouldSpawnCliProcess = (args: UserProvidedArgs): boolean => {
2323
)
2424
}
2525

26+
export interface OpenCommandPipeArgs {
27+
type: "open"
28+
fileURIs?: string[]
29+
folderURIs: string[]
30+
forceNewWindow?: boolean
31+
diffMode?: boolean
32+
addMode?: boolean
33+
gotoLineMode?: boolean
34+
forceReuseWindow?: boolean
35+
waitMarkerFilePath?: string
36+
}
37+
2638
/**
27-
* This is useful when an CLI arg should be passed to VS Code directly,
28-
* such as when managing extensions.
29-
* @deprecated This should be removed when code-server merges with lib/vscode.
39+
* Run Code's CLI for things like managing extensions.
3040
*/
31-
export const runVsCodeCli = async (args: DefaultedArgs): Promise<void> => {
32-
logger.debug("Running VS Code CLI")
41+
export const runCodeCli = async (args: DefaultedArgs): Promise<void> => {
42+
logger.debug("Running Code CLI")
3343

3444
// See ../../lib/vscode/src/vs/server/node/server.main.js.
35-
const spawnCli = await loadAMDModule<CodeServerLib.SpawnCli>("vs/server/node/server.main", "spawnCli")
45+
const spawnCli = await loadAMDModule<SpawnCli>("vs/server/node/server.main", "spawnCli")
3646

3747
try {
38-
await spawnCli(await toVsCodeArgs(args))
48+
await spawnCli(await toCodeArgs(args))
3949
} catch (error: any) {
40-
logger.error("Got error from VS Code", error)
50+
logger.error("Got error from Code", error)
4151
}
4252

4353
process.exit(0)
4454
}
4555

4656
export const openInExistingInstance = async (args: DefaultedArgs, socketPath: string): Promise<void> => {
47-
const pipeArgs: CodeServerLib.OpenCommandPipeArgs & { fileURIs: string[] } = {
57+
const pipeArgs: OpenCommandPipeArgs & { fileURIs: string[] } = {
4858
type: "open",
4959
folderURIs: [],
5060
fileURIs: [],
@@ -76,12 +86,12 @@ export const openInExistingInstance = async (args: DefaultedArgs, socketPath: st
7686
},
7787
(response) => {
7888
response.on("data", (message) => {
79-
logger.debug("got message from VS Code", field("message", message.toString()))
89+
logger.debug("got message from Code", field("message", message.toString()))
8090
})
8191
},
8292
)
8393
vscode.on("error", (error: unknown) => {
84-
logger.error("got error from VS Code", field("error", error))
94+
logger.error("got error from Code", field("error", error))
8595
})
8696
vscode.write(JSON.stringify(pipeArgs))
8797
vscode.end()

src/node/routes/vscode.ts

+15-4
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,30 @@
11
import { logger } from "@coder/logger"
22
import * as express from "express"
3+
import * as http from "http"
4+
import * as net from "net"
35
import * as path from "path"
46
import { WebsocketRequest } from "../../../typings/pluginapi"
57
import { logError } from "../../common/util"
6-
import { toVsCodeArgs } from "../cli"
8+
import { CodeArgs, toCodeArgs } from "../cli"
79
import { isDevMode } from "../constants"
810
import { authenticated, ensureAuthenticated, redirect, self } from "../http"
911
import { SocketProxyProvider } from "../socket"
1012
import { isFile, loadAMDModule } from "../util"
1113
import { Router as WsRouter } from "../wsRouter"
1214
import { errorHandler } from "./errors"
1315

16+
export interface IServerAPI {
17+
handleRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>
18+
handleUpgrade(req: http.IncomingMessage, socket: net.Socket): void
19+
handleServerError(err: Error): void
20+
dispose(): void
21+
}
22+
23+
export type CreateServer = (address: string | net.AddressInfo | null, args: CodeArgs) => Promise<IServerAPI>
24+
1425
export class CodeServerRouteWrapper {
1526
/** Assigned in `ensureCodeServerLoaded` */
16-
private _codeServerMain!: CodeServerLib.IServerAPI
27+
private _codeServerMain!: IServerAPI
1728
private _wsRouterWrapper = WsRouter()
1829
private _socketProxyProvider = new SocketProxyProvider()
1930
public router = express.Router()
@@ -120,11 +131,11 @@ export class CodeServerRouteWrapper {
120131
/**
121132
* @file ../../../lib/vscode/src/vs/server/node/server.main.js
122133
*/
123-
const createVSServer = await loadAMDModule<CodeServerLib.CreateServer>("vs/server/node/server.main", "createServer")
134+
const createVSServer = await loadAMDModule<CreateServer>("vs/server/node/server.main", "createServer")
124135

125136
try {
126137
this._codeServerMain = await createVSServer(null, {
127-
...(await toVsCodeArgs(args)),
138+
...(await toCodeArgs(args)),
128139
// TODO: Make the browser helper script work.
129140
"without-browser-env-var": true,
130141
})

test/unit/node/cli.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
setDefaults,
1313
shouldOpenInExistingInstance,
1414
splitOnFirstEquals,
15-
toVsCodeArgs,
15+
toCodeArgs,
1616
optionDescriptions,
1717
options,
1818
Options,

0 commit comments

Comments
 (0)