Add a service worker To test try installing code-server as a PWA. Index: code-server/lib/vscode/src/vs/base/common/product.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/base/common/product.ts +++ code-server/lib/vscode/src/vs/base/common/product.ts @@ -60,6 +60,10 @@ export interface IProductConfiguration { readonly updateEndpoint?: string readonly logoutEndpoint?: string readonly proxyEndpointTemplate?: string + readonly serviceWorker?: { + readonly path: string; + readonly scope: string; + } readonly version: string; readonly date?: string; Index: code-server/lib/vscode/src/vs/workbench/browser/client.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/workbench/browser/client.ts +++ code-server/lib/vscode/src/vs/workbench/browser/client.ts @@ -89,6 +89,10 @@ export class CodeServerClient extends Di if (this.productService.logoutEndpoint) { this.addLogoutCommand(this.productService.logoutEndpoint); } + + if (this.productService.serviceWorker) { + await this.registerServiceWorker(this.productService.serviceWorker); + } } private checkUpdates(updateEndpoint: string) { @@ -161,4 +165,17 @@ export class CodeServerClient extends Di }); } } + + private async registerServiceWorker(serviceWorker: { path: string; scope: string }) { + if (typeof navigator !== 'undefined' && 'serviceWorker' in navigator) { + try { + await navigator.serviceWorker.register(serviceWorker.path, { + scope: serviceWorker.scope, + }); + this.logService.info('[Service Worker] registered'); + } catch (error: any) { + this.logService.error('[Service Worker] registration', error as Error); + } + } + } } Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts @@ -314,6 +314,10 @@ export class WebClientServer { updateEndpoint: !this._environmentService.args['disable-update-check'] ? base + '/update/check' : undefined, logoutEndpoint: this._environmentService.args['auth'] && this._environmentService.args['auth'] !== "none" ? base + '/logout' : undefined, proxyEndpointTemplate: process.env.VSCODE_PROXY_URI ?? base + '/proxy/{{port}}/', + serviceWorker: { + scope: vscodeBase + '/', + path: base + '/_static/out/browser/serviceWorker.js', + }, embedderIdentifier: 'server-distro', extensionsGallery: this._productService.extensionsGallery, } satisfies Partial;