UNPKG

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