Skip to content

Commit 7d02f34

Browse files
authored
Merge pull request #1934 from cdr/plugin
Add plugin system for adding http endpoints
2 parents 2fad8a2 + 934c8d4 commit 7d02f34

16 files changed

+188
-136
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ release-gcp/
1010
release-images/
1111
node_modules
1212
node-*
13+
/plugins

ci/build/build-code-server.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ main() {
1818
fi
1919

2020
parcel build \
21-
--public-url "/static/$(git rev-parse HEAD)/dist" \
21+
--public-url "." \
2222
--out-dir dist \
2323
$([[ $MINIFY ]] || echo --no-minify) \
2424
src/browser/register.ts \

ci/build/build-release.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ main() {
2121
rsync README.md "$RELEASE_PATH"
2222
rsync LICENSE.txt "$RELEASE_PATH"
2323
rsync ./lib/vscode/ThirdPartyNotices.txt "$RELEASE_PATH"
24+
25+
# code-server exports types which can be imported and used by plugins. Those
26+
# types import ipc.d.ts but it isn't included in the final vscode build so
27+
# we'll copy it ourselves here.
28+
mkdir -p "$RELEASE_PATH/lib/vscode/src/vs/server"
29+
rsync ./lib/vscode/src/vs/server/ipc.d.ts "$RELEASE_PATH/lib/vscode/src/vs/server"
2430
}
2531

2632
bundle_code_server() {

ci/dev/vscode.patch

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -722,10 +722,10 @@ index eab8591492..26668701f7 100644
722722
options.logService.error(`${logPrefix} socketFactory.connect() failed. Error:`);
723723
diff --git a/src/vs/server/browser/client.ts b/src/vs/server/browser/client.ts
724724
new file mode 100644
725-
index 0000000000..8fb2a87303
725+
index 0000000000..3c0703b717
726726
--- /dev/null
727727
+++ b/src/vs/server/browser/client.ts
728-
@@ -0,0 +1,208 @@
728+
@@ -0,0 +1,189 @@
729729
+import { Emitter } from 'vs/base/common/event';
730730
+import { URI } from 'vs/base/common/uri';
731731
+import { localize } from 'vs/nls';
@@ -761,31 +761,12 @@ index 0000000000..8fb2a87303
761761
+};
762762
+
763763
+/**
764-
+ * Get options embedded in the HTML from the server.
764+
+ * Get options embedded in the HTML.
765765
+ */
766766
+export const getOptions = <T extends Options>(): T => {
767-
+ if (typeof document === "undefined") {
768-
+ return {} as T;
769-
+ }
770-
+ const el = document.getElementById("coder-options");
771767
+ try {
772-
+ if (!el) {
773-
+ throw new Error("no options element");
774-
+ }
775-
+ const value = el.getAttribute("data-settings");
776-
+ if (!value) {
777-
+ throw new Error("no options value");
778-
+ }
779-
+ const options = JSON.parse(value);
780-
+ const parts = window.location.pathname.replace(/^\//g, "").split("/");
781-
+ parts[parts.length - 1] = options.base;
782-
+ const url = new URL(window.location.origin + "/" + parts.join("/"));
783-
+ return {
784-
+ ...options,
785-
+ base: normalize(url.pathname, true),
786-
+ };
768+
+ return JSON.parse(document.getElementById("coder-options")!.getAttribute("data-settings")!);
787769
+ } catch (error) {
788-
+ console.warn(error);
789770
+ return {} as T;
790771
+ }
791772
+};
@@ -1306,17 +1287,15 @@ index 0000000000..56331ff1fc
13061287
+require('../../bootstrap-amd').load('vs/server/entry');
13071288
diff --git a/src/vs/server/ipc.d.ts b/src/vs/server/ipc.d.ts
13081289
new file mode 100644
1309-
index 0000000000..0a9c95d50e
1290+
index 0000000000..7e1cd270c8
13101291
--- /dev/null
13111292
+++ b/src/vs/server/ipc.d.ts
1312-
@@ -0,0 +1,117 @@
1293+
@@ -0,0 +1,115 @@
13131294
+/**
13141295
+ * External interfaces for integration into code-server over IPC. No vs imports
13151296
+ * should be made in this file.
13161297
+ */
13171298
+export interface Options {
1318-
+ base: string
1319-
+ commit: string
13201299
+ disableTelemetry: boolean
13211300
+}
13221301
+

ci/dev/watch.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class Watcher {
3737

3838
const vscode = cp.spawn("yarn", ["watch"], { cwd: this.vscodeSourcePath })
3939
const tsc = cp.spawn("tsc", ["--watch", "--pretty", "--preserveWatchOutput"], { cwd: this.rootPath })
40+
const plugin = cp.spawn("yarn", ["build", "--watch"], { cwd: process.env.PLUGIN_DIR })
4041
const bundler = this.createBundler()
4142

4243
const cleanup = (code?: number | null): void => {
@@ -48,6 +49,10 @@ class Watcher {
4849
tsc.removeAllListeners()
4950
tsc.kill()
5051

52+
Watcher.log("killing plugin")
53+
plugin.removeAllListeners()
54+
plugin.kill()
55+
5156
if (server) {
5257
Watcher.log("killing server")
5358
server.removeAllListeners()
@@ -69,6 +74,10 @@ class Watcher {
6974
Watcher.log("tsc terminated unexpectedly")
7075
cleanup(code)
7176
})
77+
plugin.on("exit", (code) => {
78+
Watcher.log("plugin terminated unexpectedly")
79+
cleanup(code)
80+
})
7281
const bundle = bundler.bundle().catch(() => {
7382
Watcher.log("parcel watcher terminated unexpectedly")
7483
cleanup(1)
@@ -82,6 +91,7 @@ class Watcher {
8291

8392
vscode.stderr.on("data", (d) => process.stderr.write(d))
8493
tsc.stderr.on("data", (d) => process.stderr.write(d))
94+
plugin.stderr.on("data", (d) => process.stderr.write(d))
8595

8696
// From https://github.com/chalk/ansi-regex
8797
const pattern = [
@@ -140,6 +150,16 @@ class Watcher {
140150
bundle.then(restartServer)
141151
}
142152
})
153+
154+
onLine(plugin, (line, original) => {
155+
// tsc outputs blank lines; skip them.
156+
if (line !== "") {
157+
console.log("[plugin]", original)
158+
}
159+
if (line.includes("Watching for file changes")) {
160+
bundle.then(restartServer)
161+
}
162+
})
143163
}
144164

145165
private createBundler(out = "dist"): Bundler {
@@ -150,7 +170,7 @@ class Watcher {
150170
cacheDir: path.join(this.rootPath, ".cache"),
151171
minify: !!process.env.MINIFY,
152172
logLevel: 1,
153-
publicUrl: "/static/development/dist",
173+
publicUrl: ".",
154174
},
155175
)
156176
}

src/browser/media/manifest.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,32 @@
77
"description": "Run editors on a remote server.",
88
"icons": [
99
{
10-
"src": "{{BASE}}/static/{{COMMIT}}/src/browser/media/pwa-icon-96.png",
10+
"src": "{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-96.png",
1111
"type": "image/png",
1212
"sizes": "96x96"
1313
},
1414
{
15-
"src": "{{BASE}}/static/{{COMMIT}}/src/browser/media/pwa-icon-128.png",
15+
"src": "{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-128.png",
1616
"type": "image/png",
1717
"sizes": "128x128"
1818
},
1919
{
20-
"src": "{{BASE}}/static/{{COMMIT}}/src/browser/media/pwa-icon-192.png",
20+
"src": "{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-192.png",
2121
"type": "image/png",
2222
"sizes": "192x192"
2323
},
2424
{
25-
"src": "{{BASE}}/static/{{COMMIT}}/src/browser/media/pwa-icon-256.png",
25+
"src": "{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-256.png",
2626
"type": "image/png",
2727
"sizes": "256x256"
2828
},
2929
{
30-
"src": "{{BASE}}/static/{{COMMIT}}/src/browser/media/pwa-icon-384.png",
30+
"src": "{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-384.png",
3131
"type": "image/png",
3232
"sizes": "384x384"
3333
},
3434
{
35-
"src": "{{BASE}}/static/{{COMMIT}}/src/browser/media/pwa-icon-512.png",
35+
"src": "{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-512.png",
3636
"type": "image/png",
3737
"sizes": "512x512"
3838
}

src/browser/pages/error.html

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,10 @@
1111
content="style-src 'self'; manifest-src 'self'; img-src 'self' data:; font-src 'self' data:;"
1212
/>
1313
<title>{{ERROR_TITLE}} - code-server</title>
14-
<link rel="icon" href="{{BASE}}/static/{{COMMIT}}/src/browser/media/favicon.ico" type="image/x-icon" />
15-
<link
16-
rel="manifest"
17-
href="{{BASE}}/static/{{COMMIT}}/src/browser/media/manifest.json"
18-
crossorigin="use-credentials"
19-
/>
20-
<link rel="apple-touch-icon" href="{{BASE}}/static/{{COMMIT}}/src/browser/media/pwa-icon-384.png" />
21-
<link href="{{BASE}}/static/{{COMMIT}}/dist/register.css" rel="stylesheet" />
14+
<link rel="icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon.ico" type="image/x-icon" />
15+
<link rel="manifest" href="{{CS_STATIC_BASE}}/src/browser/media/manifest.json" crossorigin="use-credentials" />
16+
<link rel="apple-touch-icon" href="{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-384.png" />
17+
<link href="{{CS_STATIC_BASE}}/dist/register.css" rel="stylesheet" />
2218
<meta id="coder-options" data-settings="{{OPTIONS}}" />
2319
</head>
2420
<body>
@@ -33,6 +29,6 @@ <h2 class="header">{{ERROR_HEADER}}</h2>
3329
</div>
3430
</div>
3531
</div>
36-
<script data-cfasync="false" src="{{BASE}}/static/{{COMMIT}}/dist/register.js"></script>
32+
<script data-cfasync="false" src="{{CS_STATIC_BASE}}/dist/register.js"></script>
3733
</body>
3834
</html>

src/browser/pages/login.html

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,10 @@
1111
content="style-src 'self'; script-src 'self' 'unsafe-inline'; manifest-src 'self'; img-src 'self' data:; font-src 'self' data:;"
1212
/>
1313
<title>code-server login</title>
14-
<link rel="icon" href="{{BASE}}/static/{{COMMIT}}/src/browser/media/favicon.ico" type="image/x-icon" />
15-
<link
16-
rel="manifest"
17-
href="{{BASE}}/static/{{COMMIT}}/src/browser/media/manifest.json"
18-
crossorigin="use-credentials"
19-
/>
20-
<link rel="apple-touch-icon" href="{{BASE}}/static/{{COMMIT}}/src/browser/media/pwa-icon-384.png" />
21-
<link href="{{BASE}}/static/{{COMMIT}}/dist/register.css" rel="stylesheet" />
14+
<link rel="icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon.ico" type="image/x-icon" />
15+
<link rel="manifest" href="{{CS_STATIC_BASE}}/src/browser/media/manifest.json" crossorigin="use-credentials" />
16+
<link rel="apple-touch-icon" href="{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-384.png" />
17+
<link href="{{CS_STATIC_BASE}}/dist/register.css" rel="stylesheet" />
2218
<meta id="coder-options" data-settings="{{OPTIONS}}" />
2319
</head>
2420
<body>
@@ -50,7 +46,7 @@ <h1 class="main">Welcome to code-server</h1>
5046
</div>
5147
</div>
5248
</body>
53-
<script data-cfasync="false" src="{{BASE}}/static/{{COMMIT}}/dist/register.js"></script>
49+
<script data-cfasync="false" src="{{CS_STATIC_BASE}}/dist/register.js"></script>
5450
<script>
5551
const parts = window.location.pathname.replace(/^\//g, "").split("/")
5652
parts[parts.length - 1] = "{{BASE}}"

src/browser/pages/vscode.html

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,17 @@
2424
<meta id="vscode-remote-nls-configuration" data-settings="{{NLS_CONFIGURATION}}" />
2525

2626
<!-- Workbench Icon/Manifest/CSS -->
27-
<link rel="icon" href="{{BASE}}/static/{{COMMIT}}/src/browser/media/favicon.ico" type="image/x-icon" />
28-
<link
29-
rel="manifest"
30-
href="{{BASE}}/static/{{COMMIT}}/src/browser/media/manifest.json"
31-
crossorigin="use-credentials"
32-
/>
27+
<link rel="icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon.ico" type="image/x-icon" />
28+
<link rel="manifest" href="{{CS_STATIC_BASE}}/src/browser/media/manifest.json" crossorigin="use-credentials" />
3329
<!-- PROD_ONLY
34-
<link data-name="vs/workbench/workbench.web.api" rel="stylesheet" href="{{BASE}}/static/{{COMMIT}}/lib/vscode/out/vs/workbench/workbench.web.api.css">
30+
<link data-name="vs/workbench/workbench.web.api" rel="stylesheet" href="{{CS_STATIC_BASE}}/lib/vscode/out/vs/workbench/workbench.web.api.css">
3531
END_PROD_ONLY -->
36-
<link rel="apple-touch-icon" href="{{BASE}}/static/{{COMMIT}}/src/browser/media/pwa-icon-384.png" />
32+
<link rel="apple-touch-icon" href="{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-384.png" />
3733
<meta name="apple-mobile-web-app-capable" content="yes" />
3834

3935
<!-- Prefetch to avoid waterfall -->
4036
<!-- PROD_ONLY
41-
<link rel="prefetch" href="{{BASE}}/static/{{COMMIT}}/lib/vscode/node_modules/semver-umd/lib/semver-umd.js">
37+
<link rel="prefetch" href="{{CS_STATIC_BASE}}/lib/vscode/node_modules/semver-umd/lib/semver-umd.js">
4238
END_PROD_ONLY -->
4339

4440
<meta id="coder-options" data-settings="{{OPTIONS}}" />
@@ -48,10 +44,6 @@
4844

4945
<!-- Startup (do not modify order of script tags!) -->
5046
<script>
51-
const parts = window.location.pathname.replace(/^\//g, "").split("/")
52-
parts[parts.length - 1] = "{{BASE}}"
53-
const url = new URL(window.location.origin + "/" + parts.join("/"))
54-
const staticBase = url.href.replace(/\/+$/, "") + "/static/{{COMMIT}}/lib/vscode"
5547
let nlsConfig
5648
try {
5749
nlsConfig = JSON.parse(document.getElementById("vscode-remote-nls-configuration").getAttribute("data-settings"))
@@ -64,7 +56,7 @@
6456
}
6557
// FIXME: Only works if path separators are /.
6658
const path = nlsConfig._resolvedLanguagePackCoreLocation + "/" + bundle.replace(/\//g, "!") + ".nls.json"
67-
fetch(`${url.href}/resource/?path=${encodeURIComponent(path)}`)
59+
fetch(`{{BASE}}/resource/?path=${encodeURIComponent(path)}`)
6860
.then((response) => response.json())
6961
.then((json) => {
7062
bundles[bundle] = json
@@ -77,26 +69,26 @@
7769
/* Probably fine. */
7870
}
7971
self.require = {
80-
baseUrl: `${staticBase}/out`,
72+
baseUrl: "{{CS_STATIC_BASE}}/lib/vscode/out",
8173
paths: {
82-
"vscode-textmate": `${staticBase}/node_modules/vscode-textmate/release/main`,
83-
"vscode-oniguruma": `${staticBase}/node_modules/vscode-oniguruma/release/main`,
84-
xterm: `${staticBase}/node_modules/xterm/lib/xterm.js`,
85-
"xterm-addon-search": `${staticBase}/node_modules/xterm-addon-search/lib/xterm-addon-search.js`,
86-
"xterm-addon-unicode11": `${staticBase}/node_modules/xterm-addon-unicode11/lib/xterm-addon-unicode11.js`,
87-
"xterm-addon-webgl": `${staticBase}/node_modules/xterm-addon-webgl/lib/xterm-addon-webgl.js`,
88-
"semver-umd": `${staticBase}/node_modules/semver-umd/lib/semver-umd.js`,
89-
"iconv-lite-umd": `${staticBase}/node_modules/iconv-lite-umd/lib/iconv-lite-umd.js`,
90-
jschardet: `${staticBase}/node_modules/jschardet/dist/jschardet.min.js`,
74+
"vscode-textmate": `../node_modules/vscode-textmate/release/main`,
75+
"vscode-oniguruma": `../node_modules/vscode-oniguruma/release/main`,
76+
xterm: `../node_modules/xterm/lib/xterm.js`,
77+
"xterm-addon-search": `../node_modules/xterm-addon-search/lib/xterm-addon-search.js`,
78+
"xterm-addon-unicode11": `../node_modules/xterm-addon-unicode11/lib/xterm-addon-unicode11.js`,
79+
"xterm-addon-webgl": `../node_modules/xterm-addon-webgl/lib/xterm-addon-webgl.js`,
80+
"semver-umd": `../node_modules/semver-umd/lib/semver-umd.js`,
81+
"iconv-lite-umd": `../node_modules/iconv-lite-umd/lib/iconv-lite-umd.js`,
82+
jschardet: `../node_modules/jschardet/dist/jschardet.min.js`,
9183
},
9284
"vs/nls": nlsConfig,
9385
}
9486
</script>
95-
<script data-cfasync="false" src="{{BASE}}/static/{{COMMIT}}/dist/register.js"></script>
96-
<script data-cfasync="false" src="{{BASE}}/static/{{COMMIT}}/lib/vscode/out/vs/loader.js"></script>
87+
<script data-cfasync="false" src="{{CS_STATIC_BASE}}/dist/register.js"></script>
88+
<script data-cfasync="false" src="{{CS_STATIC_BASE}}/lib/vscode/out/vs/loader.js"></script>
9789
<!-- PROD_ONLY
98-
<script data-cfasync="false" src="{{BASE}}/static/{{COMMIT}}/lib/vscode/out/vs/workbench/workbench.web.api.nls.js"></script>
99-
<script data-cfasync="false" src="{{BASE}}/static/{{COMMIT}}/lib/vscode/out/vs/workbench/workbench.web.api.js"></script>
90+
<script data-cfasync="false" src="{{CS_STATIC_BASE}}/lib/vscode/out/vs/workbench/workbench.web.api.nls.js"></script>
91+
<script data-cfasync="false" src="{{CS_STATIC_BASE}}/lib/vscode/out/vs/workbench/workbench.web.api.js"></script>
10092
END_PROD_ONLY -->
10193
<script>
10294
require(["vs/code/browser/workbench/workbench"], function () {})

src/browser/register.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import "./pages/global.css"
77
import "./pages/login.css"
88

99
if ("serviceWorker" in navigator) {
10-
const path = normalize(`${options.base}/static/${options.commit}/dist/serviceWorker.js`)
10+
const path = normalize(`${options.csStaticBase}/dist/serviceWorker.js`)
1111
navigator.serviceWorker
1212
.register(path, {
1313
scope: options.base || "/",

0 commit comments

Comments
 (0)