Skip to content

Commit

Permalink
fixed lint + tweaked EsmHmrEngine
Browse files Browse the repository at this point in the history
  • Loading branch information
Chris Thomas committed Jan 16, 2021
1 parent 19e64cf commit a16d560
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 14 deletions.
4 changes: 3 additions & 1 deletion snowpack/src/commands/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,9 @@ export async function build(commandOptions: CommandOptions): Promise<SnowpackBui
path.resolve(internalFilesBuildLoc, 'hmr-error-overlay.js'),
HMR_OVERLAY_CODE,
);
hmrEngine = new EsmHmrEngine({port: config.devOptions.hmrPort});
hmrEngine = new EsmHmrEngine({
port: config.devOptions.hmrPort,
});
}

logger.info(colors.yellow('! building source files...'));
Expand Down
5 changes: 4 additions & 1 deletion snowpack/src/commands/dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1207,7 +1207,10 @@ export async function startServer(commandOptions: CommandOptions): Promise<Snowp

return new EsmHmrEngine({
delay: config.devOptions.hmrDelay ?? 0,
server: createServer(() => {}).listen(hmrPort),
server: createServer((_, res) => {
res.writeHead(426);
res.end('Upgrade Required');
}),
port: hmrPort
})
}
Expand Down
37 changes: 25 additions & 12 deletions snowpack/src/hmr-server-engine.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import WebSocket from 'ws';
import stripAnsi from 'strip-ansi';
import type http from 'http';
import http from 'http';
import type http2 from 'http2';

interface Dependency {
Expand All @@ -27,9 +27,9 @@ const DEFAULT_CONNECT_DELAY = 2000;
const DEFAULT_PORT = 12321;

type EsmHmrEngineOptions = {
delay: number,
server: http.Server | http2.Http2SecureServer,
port: number
delay?: number
server?: http.Server | http2.Http2SecureServer
port?: number
};

export interface IEsmHmrEngine {
Expand Down Expand Up @@ -68,15 +68,23 @@ export class EsmHmrEngine implements IEsmHmrEngine {
private cachedConnectErrors: Set<HMRMessage> = new Set();
readonly port: number = 0;
readonly enabled = true;
readonly server: http.Server | http2.Http2SecureServer;
readonly server?: http.Server | http2.Http2SecureServer;

constructor(options: EsmHmrEngineOptions) {
this.port = options.port || DEFAULT_PORT;
this.delay = options.delay;
this.delay = options.delay ?? 0;
this.server = options.server;
const wss = new WebSocket.Server({noServer: true});
const wss = options.server
? new WebSocket.Server({noServer: true})
: new WebSocket.Server({port: options.port ?? DEFAULT_PORT });

options.server.on('upgrade', (req, socket, head) => {
// @ts-ignore - if address is a string, then the fallbacks will still return the proper value
this.port = wss.address()?.port
// @ts-ignore - if address is a string, then the fallbacks will still return the proper value
?? this.server?.address()?.port
?? options.port
?? DEFAULT_PORT;

options.server?.on('upgrade', (req, socket, head) => {
// Only handle upgrades to ESM-HMR requests, ignore others.
if (req.headers['sec-websocket-protocol'] !== 'esm-hmr') {
return;
Expand All @@ -99,16 +107,21 @@ export class EsmHmrEngine implements IEsmHmrEngine {
}

listen(): Promise<number> {
if (this.server.listening) {
const server = this.server;
if (!server) {
return Promise.resolve(this.port);
}

if (server.listening) {
return Promise.resolve(this.port);
}

return new Promise((resolve, reject) => {
const errorHandler = (e: Error) => reject(e);
this.server
server
.addListener('error', errorHandler)
.listen(this.port, () => {
this.server.removeListener('error', errorHandler);
server.removeListener('error', errorHandler);
resolve(this.port);
});
});
Expand Down

0 comments on commit a16d560

Please sign in to comment.