Skip to content

Commit b5b9cb4

Browse files
knagaitsevhiroppy
authored andcommitted
feat(server): add transportMode (#2116)
* feat(server): add transport mode * fix(transport): update transport e2e test and rename tests * test(options): fixed options test * refactor(server): move transport mode default setting into helper
1 parent 460f15a commit b5b9cb4

21 files changed

+1085
-800
lines changed

lib/Server.js

+3-9
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,9 @@ class Server {
6161

6262
this.log = _log || createLogger(options);
6363

64-
if (this.options.serverMode !== undefined) {
64+
if (this.options.transportMode !== undefined) {
6565
this.log.warn(
66-
'serverMode is an experimental option, meaning its usage could potentially change without warning'
67-
);
68-
}
69-
70-
if (this.options.clientMode !== undefined) {
71-
this.log.warn(
72-
'clientMode is an experimental option, meaning its usage could potentially change without warning'
66+
'transportMode is an experimental option, meaning its usage could potentially change without warning'
7367
);
7468
}
7569

@@ -672,7 +666,7 @@ class Server {
672666

673667
if (!headers) {
674668
this.log.warn(
675-
'serverMode implementation must pass headers to the callback of onConnection(f) ' +
669+
'transportMode.server implementation must pass headers to the callback of onConnection(f) ' +
676670
'via f(connection, headers) in order for clients to pass a headers security check'
677671
);
678672
}

lib/options.json

+27-15
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,6 @@
4848
"warning"
4949
]
5050
},
51-
"clientMode": {
52-
"type": "string"
53-
},
5451
"compress": {
5552
"type": "boolean"
5653
},
@@ -303,16 +300,6 @@
303300
"serveIndex": {
304301
"type": "boolean"
305302
},
306-
"serverMode": {
307-
"anyOf": [
308-
{
309-
"type": "string"
310-
},
311-
{
312-
"instanceof": "Function"
313-
}
314-
]
315-
},
316303
"serverSideRender": {
317304
"type": "boolean"
318305
},
@@ -364,6 +351,32 @@
364351
}
365352
]
366353
},
354+
"transportMode": {
355+
"anyOf": [
356+
{
357+
"type": "object",
358+
"properties": {
359+
"client": {
360+
"type": "string"
361+
},
362+
"server": {
363+
"anyOf": [
364+
{
365+
"type": "string"
366+
},
367+
{
368+
"instanceof": "Function"
369+
}
370+
]
371+
}
372+
},
373+
"additionalProperties": false
374+
},
375+
{
376+
"enum": ["sockjs", "ws"]
377+
}
378+
]
379+
},
367380
"useLocalIp": {
368381
"type": "boolean"
369382
},
@@ -396,7 +409,6 @@
396409
"ca": "should be {String|Buffer}",
397410
"cert": "should be {String|Buffer}",
398411
"clientLogLevel": "should be {String} and equal to one of the allowed values\n\n [ 'none', 'silent', 'info', 'debug', 'trace', 'error', 'warning', 'warn' ]\n\n (https://webpack.js.org/configuration/dev-server/#devserverclientloglevel)",
399-
"clientMode": "should be {String} (https://webpack.js.org/configuration/dev-server/#devserverclientmode)",
400412
"compress": "should be {Boolean} (https://webpack.js.org/configuration/dev-server/#devservercompress)",
401413
"contentBase": "should be {Number|String|Array} (https://webpack.js.org/configuration/dev-server/#devservercontentbase)",
402414
"disableHostCheck": "should be {Boolean} (https://webpack.js.org/configuration/dev-server/#devserverdisablehostcheck)",
@@ -438,7 +450,6 @@
438450
"reporter": "should be {Function} (https://github.com./webpack/webpack-dev-middleware#reporter)",
439451
"requestCert": "should be {Boolean}",
440452
"serveIndex": "should be {Boolean} (https://webpack.js.org/configuration/dev-server/#devserverserveindex)",
441-
"serverMode": "should be {String|Function} (https://webpack.js.org/configuration/dev-server/#devserverservermode)",
442453
"serverSideRender": "should be {Boolean} (https://github.com./webpack/webpack-dev-middleware#serversiderender)",
443454
"setup": "should be {Function} (https://webpack.js.org/configuration/dev-server/#devserversetup)",
444455
"sockHost": "should be {String|Null} (https://webpack.js.org/configuration/dev-server/#devserversockhost)",
@@ -447,6 +458,7 @@
447458
"socket": "should be {String} (https://webpack.js.org/configuration/dev-server/#devserversocket)",
448459
"staticOptions": "should be {Object} (https://webpack.js.org/configuration/dev-server/#devserverstaticoptions)",
449460
"stats": "should be {Object|Boolean} (https://webpack.js.org/configuration/dev-server/#devserverstats-)",
461+
"transportMode": "should be {String|Object} (https://webpack.js.org/configuration/dev-server/#devservertransportmode)",
450462
"useLocalIp": "should be {Boolean} (https://webpack.js.org/configuration/dev-server/#devserveruselocalip)",
451463
"warn": "should be {Function}",
452464
"watchContentBase": "should be {Boolean} (https://webpack.js.org/configuration/dev-server/#devserverwatchcontentbase)",

lib/utils/getSocketClientPath.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
function getSocketClientPath(options) {
44
let ClientImplementation;
55
let clientImplFound = true;
6-
switch (typeof options.clientMode) {
6+
switch (typeof options.transportMode.client) {
77
case 'string':
88
// could be 'sockjs', 'ws', or a path that should be required
9-
if (options.clientMode === 'sockjs') {
9+
if (options.transportMode.client === 'sockjs') {
1010
ClientImplementation = require('../../client/clients/SockJSClient');
11-
} else if (options.clientMode === 'ws') {
11+
} else if (options.transportMode.client === 'ws') {
1212
ClientImplementation = require('../../client/clients/WebsocketClient');
1313
} else {
1414
try {
1515
// eslint-disable-next-line import/no-dynamic-require
16-
ClientImplementation = require(options.clientMode);
16+
ClientImplementation = require(options.transportMode.client);
1717
} catch (e) {
1818
clientImplFound = false;
1919
}
@@ -25,7 +25,7 @@ function getSocketClientPath(options) {
2525

2626
if (!clientImplFound) {
2727
throw new Error(
28-
"clientMode must be a string denoting a default implementation (e.g. 'sockjs', 'ws') or a full path to " +
28+
"transportMode.client must be a string denoting a default implementation (e.g. 'sockjs', 'ws') or a full path to " +
2929
'a JS file which exports a class extending BaseClient (webpack-dev-server/client-src/clients/BaseClient) ' +
3030
'via require.resolve(...)'
3131
);

lib/utils/getSocketServerImplementation.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
function getSocketServerImplementation(options) {
44
let ServerImplementation;
55
let serverImplFound = true;
6-
switch (typeof options.serverMode) {
6+
switch (typeof options.transportMode.server) {
77
case 'string':
88
// could be 'sockjs', in the future 'ws', or a path that should be required
9-
if (options.serverMode === 'sockjs') {
9+
if (options.transportMode.server === 'sockjs') {
1010
ServerImplementation = require('../servers/SockJSServer');
11-
} else if (options.serverMode === 'ws') {
11+
} else if (options.transportMode.server === 'ws') {
1212
ServerImplementation = require('../servers/WebsocketServer');
1313
} else {
1414
try {
1515
// eslint-disable-next-line import/no-dynamic-require
16-
ServerImplementation = require(options.serverMode);
16+
ServerImplementation = require(options.transportMode.server);
1717
} catch (e) {
1818
serverImplFound = false;
1919
}
@@ -22,15 +22,15 @@ function getSocketServerImplementation(options) {
2222
case 'function':
2323
// potentially do more checks here to confirm that the user implemented this properlly
2424
// since errors could be difficult to understand
25-
ServerImplementation = options.serverMode;
25+
ServerImplementation = options.transportMode.server;
2626
break;
2727
default:
2828
serverImplFound = false;
2929
}
3030

3131
if (!serverImplFound) {
3232
throw new Error(
33-
"serverMode must be a string denoting a default implementation (e.g. 'sockjs', 'ws'), a full path to " +
33+
"transportMode.server must be a string denoting a default implementation (e.g. 'sockjs', 'ws'), a full path to " +
3434
'a JS file which exports a class extending BaseServer (webpack-dev-server/lib/servers/BaseServer) ' +
3535
'via require.resolve(...), or the class itself which extends BaseServer'
3636
);

lib/utils/normalizeOptions.js

+19-8
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,25 @@ function normalizeOptions(compiler, options) {
99
options.contentBase =
1010
options.contentBase !== undefined ? options.contentBase : process.cwd();
1111

12-
// set serverMode default
13-
if (options.serverMode === undefined) {
14-
options.serverMode = 'sockjs';
15-
}
16-
17-
// set clientMode default
18-
if (options.clientMode === undefined) {
19-
options.clientMode = 'sockjs';
12+
// normalize transportMode option
13+
if (options.transportMode === undefined) {
14+
options.transportMode = {
15+
server: 'sockjs',
16+
client: 'sockjs',
17+
};
18+
} else {
19+
switch (typeof options.transportMode) {
20+
case 'string':
21+
options.transportMode = {
22+
server: options.transportMode,
23+
client: options.transportMode,
24+
};
25+
break;
26+
// if not a string, it is an object
27+
default:
28+
options.transportMode.server = options.transportMode.server || 'sockjs';
29+
options.transportMode.client = options.transportMode.client || 'sockjs';
30+
}
2031
}
2132

2233
if (!options.watchOptions) {

test/e2e/Client.test.js

+3-4
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,17 @@ const cssFilePath = resolve(__dirname, '../fixtures/reload-config/main.css');
2323
describe('reload', () => {
2424
const modes = [
2525
{
26-
title: 'hot with default clientMode (sockjs)',
26+
title: 'hot with default transportMode.client (sockjs)',
2727
options: {
2828
hot: true,
2929
},
3030
shouldRefresh: false,
3131
},
3232
{
33-
title: 'hot with clientMode ws',
33+
title: 'hot with transportMode.client ws',
3434
options: {
3535
hot: true,
36-
clientMode: 'ws',
37-
serverMode: require.resolve('../../lib/servers/WebsocketServer'),
36+
transportMode: 'ws',
3837
},
3938
shouldRefresh: false,
4039
},

test/e2e/ProvidePlugin.test.js

+3-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const port = require('../ports-map').ProvidePlugin;
88
const { beforeBrowserCloseDelay } = require('../helpers/puppeteer-constants');
99

1010
describe('ProvidePlugin', () => {
11-
describe('inline with default clientMode (sockjs)', () => {
11+
describe('inline with default transportMode.client (sockjs)', () => {
1212
beforeAll((done) => {
1313
const options = {
1414
port,
@@ -46,14 +46,13 @@ describe('ProvidePlugin', () => {
4646
});
4747
});
4848

49-
describe('inline with clientMode ws', () => {
49+
describe('inline with transportMode.client ws', () => {
5050
beforeAll((done) => {
5151
const options = {
5252
port,
5353
host: '0.0.0.0',
5454
inline: true,
55-
clientMode: 'ws',
56-
serverMode: require.resolve('../../lib/servers/WebsocketServer'),
55+
transportMode: 'ws',
5756
watchOptions: {
5857
poll: true,
5958
},

test/e2e/ClientMode.test.js renamed to test/e2e/TransportMode.test.js

+10-8
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,35 @@
33
const testServer = require('../helpers/test-server');
44
const config = require('../fixtures/client-config/webpack.config');
55
const runBrowser = require('../helpers/run-browser');
6-
const port = require('../ports-map').ClientMode;
6+
const port = require('../ports-map').TransportMode;
77
const {
88
initConsoleDelay,
99
awaitServerCloseDelay,
1010
} = require('../helpers/puppeteer-constants');
1111

12-
describe('clientMode', () => {
12+
describe('transportMode client', () => {
1313
const modes = [
1414
{
1515
title: 'sockjs',
1616
options: {
17-
clientMode: 'sockjs',
17+
transportMode: 'sockjs',
1818
},
1919
},
2020
{
2121
title: 'ws',
2222
options: {
23-
clientMode: 'ws',
24-
serverMode: require.resolve('../../lib/servers/WebsocketServer'),
23+
transportMode: 'ws',
2524
},
2625
},
2726
{
2827
title: 'custom client',
2928
options: {
30-
clientMode: require.resolve(
31-
'../fixtures/custom-client/CustomSockJSClient'
32-
),
29+
transportMode: {
30+
server: 'sockjs',
31+
client: require.resolve(
32+
'../fixtures/custom-client/CustomSockJSClient'
33+
),
34+
},
3335
},
3436
},
3537
];

test/e2e/__snapshots__/ClientMode.test.js.snap renamed to test/e2e/__snapshots__/TransportMode.test.js.snap

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3-
exports[`clientMode custom client on browser client logs correctly 1`] = `
3+
exports[`transportMode client custom client on browser client logs correctly 1`] = `
44
Array [
55
"Hey.",
66
"open",
@@ -13,15 +13,15 @@ Array [
1313
]
1414
`;
1515

16-
exports[`clientMode sockjs on browser client logs correctly 1`] = `
16+
exports[`transportMode client sockjs on browser client logs correctly 1`] = `
1717
Array [
1818
"Hey.",
1919
"[WDS] Live Reloading enabled.",
2020
"[WDS] Disconnected!",
2121
]
2222
`;
2323

24-
exports[`clientMode ws on browser client logs correctly 1`] = `
24+
exports[`transportMode client ws on browser client logs correctly 1`] = `
2525
Array [
2626
"Hey.",
2727
"[WDS] Live Reloading enabled.",

0 commit comments

Comments
 (0)