-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
ServerReporter.js
131 lines (124 loc) Β· 4.25 KB
/
ServerReporter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// @flow
import {Reporter} from '@parcel/plugin';
import HMRServer from './HMRServer';
import Server from './Server';
let servers: Map<number, Server> = new Map();
let hmrServers: Map<number, HMRServer> = new Map();
export default (new Reporter({
async report({event, options, logger}) {
let {serveOptions, hmrOptions} = options;
let server = serveOptions ? servers.get(serveOptions.port) : undefined;
let hmrPort =
(hmrOptions && hmrOptions.port) || (serveOptions && serveOptions.port);
let hmrServer = hmrPort ? hmrServers.get(hmrPort) : undefined;
switch (event.type) {
case 'watchStart': {
if (serveOptions) {
// If there's already a server when watching has just started, something
// is wrong.
if (server) {
return logger.warn({
message: 'Trying to create the devserver but it already exists.',
});
}
let serverOptions = {
...serveOptions,
projectRoot: options.projectRoot,
cacheDir: options.cacheDir,
// Override the target's publicUrl as that is likely meant for production.
// This could be configurable in the future.
publicUrl: serveOptions.publicUrl ?? '/',
inputFS: options.inputFS,
outputFS: options.outputFS,
packageManager: options.packageManager,
logger,
hmrOptions,
};
server = new Server(serverOptions);
servers.set(serveOptions.port, server);
const devServer = await server.start();
if (hmrOptions && hmrOptions.port === serveOptions.port) {
let hmrServerOptions = {
port: serveOptions.port,
host: hmrOptions.host,
devServer,
addMiddleware: handler => {
server?.middleware.push(handler);
},
logger,
};
hmrServer = new HMRServer(hmrServerOptions);
hmrServers.set(serveOptions.port, hmrServer);
await hmrServer.start();
return;
}
}
let port = hmrOptions?.port;
if (typeof port === 'number') {
let hmrServerOptions = {port, host: hmrOptions?.host, logger};
hmrServer = new HMRServer(hmrServerOptions);
hmrServers.set(port, hmrServer);
await hmrServer.start();
}
break;
}
case 'watchEnd':
if (serveOptions) {
if (!server) {
return logger.warn({
message:
'Could not shutdown devserver because it does not exist.',
});
}
await server.stop();
servers.delete(server.options.port);
}
if (hmrOptions && hmrServer) {
await hmrServer.stop();
// $FlowFixMe[prop-missing]
hmrServers.delete(hmrServer.wss.options.port);
}
break;
case 'buildStart':
if (server) {
server.buildStart();
}
break;
case 'buildProgress':
if (
event.phase === 'bundled' &&
hmrServer &&
// Only send HMR updates before packaging if the built in dev server is used to ensure that
// no stale bundles are served. Otherwise emit it for 'buildSuccess'.
options.serveOptions !== false
) {
await hmrServer.emitUpdate(event);
}
break;
case 'buildSuccess':
if (serveOptions) {
if (!server) {
return logger.warn({
message:
'Could not send success event to devserver because it does not exist.',
});
}
server.buildSuccess(event.bundleGraph, event.requestBundle);
}
if (hmrServer && options.serveOptions === false) {
await hmrServer.emitUpdate(event);
}
break;
case 'buildFailure':
// On buildFailure watchStart sometimes has not been called yet
// do not throw an additional warning here
if (server) {
await server.buildError(options, event.diagnostics);
}
if (hmrServer) {
await hmrServer.emitError(options, event.diagnostics);
}
break;
}
},
}): Reporter);