UNPKG

4.98 kBJavaScriptView Raw
1"use strict";exports.__esModule=true;exports.WebpackHotMiddleware=void 0;// Based on https://github.com/webpack-contrib/webpack-hot-middleware/blob/9708d781ae0e46179cf8ea1a94719de4679aaf53/middleware.js
2// Included License below
3// Copyright JS Foundation and other contributors
4// Permission is hereby granted, free of charge, to any person obtaining
5// a copy of this software and associated documentation files (the
6// 'Software'), to deal in the Software without restriction, including
7// without limitation the rights to use, copy, modify, merge, publish,
8// distribute, sublicense, and/or sell copies of the Software, and to
9// permit persons to whom the Software is furnished to do so, subject to
10// the following conditions:
11// The above copyright notice and this permission notice shall be
12// included in all copies or substantial portions of the Software.
13// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
14// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
17// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
18// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
19// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20class WebpackHotMiddleware{constructor(compilers){this.eventStream=void 0;this.latestStats=void 0;this.clientLatestStats=void 0;this.closed=void 0;this.serverError=void 0;this.onServerInvalid=()=>{if(!this.serverError)return;this.serverError=false;if(this.clientLatestStats){this.latestStats=this.clientLatestStats;this.publishStats('built',this.latestStats);}};this.onClientInvalid=()=>{if(this.closed||this.serverError)return;this.latestStats=null;this.eventStream.publish({action:'building'});};this.onServerDone=statsResult=>{if(this.closed)return;// Keep hold of latest stats so they can be propagated to new clients
21// this.latestStats = statsResult
22// this.publishStats('built', this.latestStats)
23this.serverError=statsResult.hasErrors();if(this.serverError){this.latestStats=statsResult;this.publishStats('built',this.latestStats);}};this.onClientDone=statsResult=>{this.clientLatestStats=statsResult;if(this.closed||this.serverError)return;// Keep hold of latest stats so they can be propagated to new clients
24this.latestStats=statsResult;this.publishStats('built',this.latestStats);};this.middleware=(req,res,next)=>{var _req$url;if(this.closed)return next();if(!((_req$url=req.url)!=null&&_req$url.startsWith('/_next/webpack-hmr')))return next();this.eventStream.handler(req,res);if(this.latestStats){// Explicitly not passing in `log` fn as we don't want to log again on
25// the server
26this.publishStats('sync',this.latestStats);}};this.publishStats=(action,statsResult)=>{const stats=statsResult.toJson({all:false,hash:true,warnings:true,errors:true});this.eventStream.publish({action:action,hash:stats.hash,warnings:stats.warnings||[],errors:stats.errors||[]});};this.publish=payload=>{if(this.closed)return;this.eventStream.publish(payload);};this.close=()=>{if(this.closed)return;// Can't remove compiler plugins, so we just set a flag and noop if closed
27// https://github.com/webpack/tapable/issues/32#issuecomment-350644466
28this.closed=true;this.eventStream.close();};this.eventStream=new EventStream();this.latestStats=null;this.clientLatestStats=null;this.serverError=false;this.closed=false;compilers[0].hooks.invalid.tap('webpack-hot-middleware',this.onClientInvalid);compilers[0].hooks.done.tap('webpack-hot-middleware',this.onClientDone);compilers[1].hooks.invalid.tap('webpack-hot-middleware',this.onServerInvalid);compilers[1].hooks.done.tap('webpack-hot-middleware',this.onServerDone);}}exports.WebpackHotMiddleware=WebpackHotMiddleware;class EventStream{constructor(){this.clients=void 0;this.interval=void 0;this.heartbeatTick=()=>{this.everyClient(client=>{client.write('data: \uD83D\uDC93\n\n');});};this.clients=new Set();this.interval=setInterval(this.heartbeatTick,2500).unref();}everyClient(fn){for(const client of this.clients){fn(client);}}close(){clearInterval(this.interval);this.everyClient(client=>{if(!client.finished)client.end();});this.clients.clear();}handler(req,res){const headers={'Access-Control-Allow-Origin':'*','Content-Type':'text/event-stream;charset=utf-8','Cache-Control':'no-cache, no-transform',// While behind nginx, event stream should not be buffered:
29// http://nginx.org/docs/http/ngx_http_proxy_module.html#proxy_buffering
30'X-Accel-Buffering':'no'};const isHttp1=!(parseInt(req.httpVersion)>=2);if(isHttp1){req.socket.setKeepAlive(true);Object.assign(headers,{Connection:'keep-alive'});}res.writeHead(200,headers);res.write('\n');this.clients.add(res);req.on('close',()=>{if(!res.finished)res.end();this.clients.delete(res);});}publish(payload){this.everyClient(client=>{client.write('data: '+JSON.stringify(payload)+'\n\n');});}}
31//# sourceMappingURL=hot-middleware.js.map
\No newline at end of file