1 | 'use strict';
|
2 |
|
3 | var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
|
4 |
|
5 | function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
|
6 |
|
7 | const http = require('http');
|
8 | const https = require('https');
|
9 | const WebSocket = require('ws');
|
10 | const prettyError = require('./utils/prettyError');
|
11 | const generateCertificate = require('./utils/generateCertificate');
|
12 | const getCertificate = require('./utils/getCertificate');
|
13 | const logger = require('./Logger');
|
14 |
|
15 | class HMRServer {
|
16 | start(options = {}) {
|
17 | var _this = this;
|
18 |
|
19 | return _asyncToGenerator(function* () {
|
20 | yield new Promise((() => {
|
21 | var _ref = _asyncToGenerator(function* (resolve) {
|
22 | if (!options.https) {
|
23 | _this.server = http.createServer();
|
24 | } else if (typeof options.https === 'boolean') {
|
25 | _this.server = https.createServer(generateCertificate(options));
|
26 | } else {
|
27 | _this.server = https.createServer((yield getCertificate(options.https)));
|
28 | }
|
29 |
|
30 | _this.wss = new WebSocket.Server({ server: _this.server });
|
31 | _this.server.listen(options.hmrPort, resolve);
|
32 | });
|
33 |
|
34 | return function (_x) {
|
35 | return _ref.apply(this, arguments);
|
36 | };
|
37 | })());
|
38 |
|
39 | _this.wss.on('connection', function (ws) {
|
40 | ws.onerror = _this.handleSocketError;
|
41 | if (_this.unresolvedError) {
|
42 | ws.send(JSON.stringify(_this.unresolvedError));
|
43 | }
|
44 | });
|
45 |
|
46 | _this.wss.on('error', _this.handleSocketError);
|
47 |
|
48 | return _this.wss._server.address().port;
|
49 | })();
|
50 | }
|
51 |
|
52 | stop() {
|
53 | this.wss.close();
|
54 | this.server.close();
|
55 | }
|
56 |
|
57 | emitError(err) {
|
58 | var _prettyError = prettyError(err);
|
59 |
|
60 | let message = _prettyError.message,
|
61 | stack = _prettyError.stack;
|
62 |
|
63 |
|
64 |
|
65 |
|
66 | this.unresolvedError = {
|
67 | type: 'error',
|
68 | error: {
|
69 | message,
|
70 | stack
|
71 | }
|
72 | };
|
73 |
|
74 | this.broadcast(this.unresolvedError);
|
75 | }
|
76 |
|
77 | emitUpdate(assets) {
|
78 | if (this.unresolvedError) {
|
79 | this.unresolvedError = null;
|
80 | this.broadcast({
|
81 | type: 'error-resolved'
|
82 | });
|
83 | }
|
84 |
|
85 | const containsHtmlAsset = assets.some(asset => asset.type === 'html');
|
86 | if (containsHtmlAsset) {
|
87 | this.broadcast({
|
88 | type: 'reload'
|
89 | });
|
90 | } else {
|
91 | this.broadcast({
|
92 | type: 'update',
|
93 | assets: assets.map(asset => {
|
94 | let deps = {};
|
95 | var _iteratorNormalCompletion = true;
|
96 | var _didIteratorError = false;
|
97 | var _iteratorError = undefined;
|
98 |
|
99 | try {
|
100 | for (var _iterator = asset.depAssets[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
101 | let _ref2 = _step.value;
|
102 |
|
103 | var _ref3 = _slicedToArray(_ref2, 2);
|
104 |
|
105 | let dep = _ref3[0];
|
106 | let depAsset = _ref3[1];
|
107 |
|
108 | deps[dep.name] = depAsset.id;
|
109 | }
|
110 | } catch (err) {
|
111 | _didIteratorError = true;
|
112 | _iteratorError = err;
|
113 | } finally {
|
114 | try {
|
115 | if (!_iteratorNormalCompletion && _iterator.return) {
|
116 | _iterator.return();
|
117 | }
|
118 | } finally {
|
119 | if (_didIteratorError) {
|
120 | throw _iteratorError;
|
121 | }
|
122 | }
|
123 | }
|
124 |
|
125 | return {
|
126 | id: asset.id,
|
127 | generated: asset.generated,
|
128 | deps: deps
|
129 | };
|
130 | })
|
131 | });
|
132 | }
|
133 | }
|
134 |
|
135 | handleSocketError(err) {
|
136 | if (err.error.code === 'ECONNRESET') {
|
137 |
|
138 | return;
|
139 | }
|
140 | logger.warn(err);
|
141 | }
|
142 |
|
143 | broadcast(msg) {
|
144 | const json = JSON.stringify(msg);
|
145 | var _iteratorNormalCompletion2 = true;
|
146 | var _didIteratorError2 = false;
|
147 | var _iteratorError2 = undefined;
|
148 |
|
149 | try {
|
150 | for (var _iterator2 = this.wss.clients[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
151 | let ws = _step2.value;
|
152 |
|
153 | ws.send(json);
|
154 | }
|
155 | } catch (err) {
|
156 | _didIteratorError2 = true;
|
157 | _iteratorError2 = err;
|
158 | } finally {
|
159 | try {
|
160 | if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
161 | _iterator2.return();
|
162 | }
|
163 | } finally {
|
164 | if (_didIteratorError2) {
|
165 | throw _iteratorError2;
|
166 | }
|
167 | }
|
168 | }
|
169 | }
|
170 | }
|
171 |
|
172 | module.exports = HMRServer; |
\ | No newline at end of file |