From 5aa64ab5f7fb2a7e8b4c1a67891b565ae6d36699 Mon Sep 17 00:00:00 2001 From: Joe Busillo Date: Thu, 3 Jun 2021 12:44:12 -0500 Subject: [PATCH] #844 fix for SSL HMR websockets (#1517) Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/great-bugs-travel.md | 5 +++++ packages/kit/src/core/dev/index.js | 17 ++++++++++++++--- packages/kit/src/core/server/index.js | 18 ++++++------------ packages/kit/src/core/start/index.js | 6 +++++- packages/kit/test/types.d.ts | 2 +- 5 files changed, 31 insertions(+), 17 deletions(-) create mode 100644 .changeset/great-bugs-travel.md diff --git a/.changeset/great-bugs-travel.md b/.changeset/great-bugs-travel.md new file mode 100644 index 000000000000..539965bc12de --- /dev/null +++ b/.changeset/great-bugs-travel.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: SSL for HMR websockets #844 diff --git a/packages/kit/src/core/dev/index.js b/packages/kit/src/core/dev/index.js index 3e69600b1922..9f3a92c9e55e 100644 --- a/packages/kit/src/core/dev/index.js +++ b/packages/kit/src/core/dev/index.js @@ -79,6 +79,11 @@ class Watcher extends EventEmitter { /** @type {any} */ const user_config = (this.config.kit.vite && this.config.kit.vite()) || {}; + /** @type {(req: import("http").IncomingMessage, res: import("http").ServerResponse) => void} */ + let handler = (req, res) => {}; + + this.server = await get_server(this.https, user_config, (req, res) => handler(req, res)); + /** * @type {vite.ViteDevServer} */ @@ -104,7 +109,11 @@ class Watcher extends EventEmitter { publicDir: this.config.kit.files.assets, server: { ...user_config.server, - middlewareMode: true + middlewareMode: true, + hmr: { + ...(user_config.server && user_config.server.hmr), + ...(this.https ? { server: this.server, port: this.port } : {}) + } }, optimizeDeps: { ...user_config.optimizeDeps, @@ -131,7 +140,7 @@ class Watcher extends EventEmitter { } }; - this.server = await get_server(this.port, this.host, this.https, user_config, (req, res) => { + handler = (req, res) => { this.vite.middlewares(req, res, async () => { try { const parsed = parse(req.url); @@ -317,7 +326,9 @@ class Watcher extends EventEmitter { res.end(e.stack); } }); - }); + }; + + await this.server.listen(this.port, this.host || '0.0.0.0'); } update() { diff --git a/packages/kit/src/core/server/index.js b/packages/kit/src/core/server/index.js index 0a80eb2bdb0f..4463f840d673 100644 --- a/packages/kit/src/core/server/index.js +++ b/packages/kit/src/core/server/index.js @@ -2,14 +2,12 @@ import http from 'http'; import https from 'https'; /** * - * @param {number} port - * @param {string} host * @param {boolean} use_https * @param {any} user_config * @param {(req: http.IncomingMessage, res: http.ServerResponse) => void} handler - * @returns {Promise} + * @returns {Promise} */ -export async function get_server(port, host, use_https, user_config, handler) { +export async function get_server(use_https, user_config, handler) { /** @type {https.ServerOptions} */ const https_options = {}; @@ -27,13 +25,9 @@ export async function get_server(port, host, use_https, user_config, handler) { } } - return new Promise((fulfil) => { - const server = use_https + return Promise.resolve( + use_https ? https.createServer(/** @type {https.ServerOptions} */ (https_options), handler) - : http.createServer(handler); - - server.listen(port, host || '0.0.0.0', () => { - fulfil(server); - }); - }); + : http.createServer(handler) + ); } diff --git a/packages/kit/src/core/start/index.js b/packages/kit/src/core/start/index.js index e0682cdd8043..ff0c1d711a9e 100644 --- a/packages/kit/src/core/start/index.js +++ b/packages/kit/src/core/start/index.js @@ -48,7 +48,7 @@ export async function start({ port, host, config, https: use_https = false, cwd read: (file) => fs.readFileSync(join(config.kit.files.assets, file)) }); - return get_server(port, host, use_https, config.kit, (req, res) => { + const server = await get_server(use_https, config.kit, (req, res) => { const parsed = parse(req.url || ''); assets_handler(req, res, () => { @@ -83,4 +83,8 @@ export async function start({ port, host, config, https: use_https = false, cwd }); }); }); + + await server.listen(port, host || '0.0.0.0'); + + return Promise.resolve(server); } diff --git a/packages/kit/test/types.d.ts b/packages/kit/test/types.d.ts index f612487e9d2e..b4bdba40e239 100644 --- a/packages/kit/test/types.d.ts +++ b/packages/kit/test/types.d.ts @@ -31,7 +31,7 @@ export type TestContext = { }; watcher: any; // watcher type is not exposed - server: import('http').Server; + server: import('net').Server; reset: () => Promise; unpatch: () => void; };