Skip to content

Commit ae7d162

Browse files
committed
feat(server): add transport mode
1 parent f80e2ae commit ae7d162

18 files changed

+928
-778
lines changed

lib/Server.js

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,29 @@ class Server {
6161

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

64-
if (this.options.serverMode !== undefined) {
65-
this.log.warn(
66-
'serverMode is an experimental option, meaning its usage could potentially change without warning'
67-
);
68-
}
64+
if (this.options.transportMode === undefined) {
65+
this.options.transportMode = {
66+
server: 'sockjs',
67+
client: 'sockjs',
68+
};
69+
} else {
70+
switch (typeof this.options.transportMode) {
71+
case 'string':
72+
this.options.transportMode = {
73+
server: this.options.transportMode,
74+
client: this.options.transportMode,
75+
};
76+
break;
77+
// if not a string, it is an object
78+
default:
79+
this.options.transportMode.server =
80+
this.options.transportMode.server || 'sockjs';
81+
this.options.transportMode.client =
82+
this.options.transportMode.client || 'sockjs';
83+
}
6984

70-
if (this.options.clientMode !== undefined) {
7185
this.log.warn(
72-
'clientMode is an experimental option, meaning its usage could potentially change without warning'
86+
'transportMode is an experimental option, meaning its usage could potentially change without warning'
7387
);
7488
}
7589

@@ -674,7 +688,7 @@ class Server {
674688

675689
if (!headers) {
676690
this.log.warn(
677-
'serverMode implementation must pass headers to the callback of onConnection(f) ' +
691+
'transportMode.server implementation must pass headers to the callback of onConnection(f) ' +
678692
'via f(connection, headers) in order for clients to pass a headers security check'
679693
);
680694
}

lib/options.json

Lines changed: 26 additions & 15 deletions
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,31 @@
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+
},
374+
{
375+
"enum": ["sockjs", "ws"]
376+
}
377+
]
378+
},
367379
"useLocalIp": {
368380
"type": "boolean"
369381
},
@@ -396,7 +408,6 @@
396408
"ca": "should be {String|Buffer}",
397409
"cert": "should be {String|Buffer}",
398410
"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)",
400411
"compress": "should be {Boolean} (https://webpack.js.org/configuration/dev-server/#devservercompress)",
401412
"contentBase": "should be {Number|String|Array} (https://webpack.js.org/configuration/dev-server/#devservercontentbase)",
402413
"disableHostCheck": "should be {Boolean} (https://webpack.js.org/configuration/dev-server/#devserverdisablehostcheck)",
@@ -438,7 +449,6 @@
438449
"reporter": "should be {Function} (https://github.com/webpack/webpack-dev-middleware#reporter)",
439450
"requestCert": "should be {Boolean}",
440451
"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)",
442452
"serverSideRender": "should be {Boolean} (https://github.com/webpack/webpack-dev-middleware#serversiderender)",
443453
"setup": "should be {Function} (https://webpack.js.org/configuration/dev-server/#devserversetup)",
444454
"sockHost": "should be {String|Null} (https://webpack.js.org/configuration/dev-server/#devserversockhost)",
@@ -447,6 +457,7 @@
447457
"socket": "should be {String} (https://webpack.js.org/configuration/dev-server/#devserversocket)",
448458
"staticOptions": "should be {Object} (https://webpack.js.org/configuration/dev-server/#devserverstaticoptions)",
449459
"stats": "should be {Object|Boolean} (https://webpack.js.org/configuration/dev-server/#devserverstats-)",
460+
"transportMode": "should be {String|Object} (https://webpack.js.org/configuration/dev-server/#devservertransportmode)",
450461
"useLocalIp": "should be {Boolean} (https://webpack.js.org/configuration/dev-server/#devserveruselocalip)",
451462
"warn": "should be {Function}",
452463
"watchContentBase": "should be {Boolean} (https://webpack.js.org/configuration/dev-server/#devserverwatchcontentbase)",

lib/utils/getSocketClientPath.js

Lines changed: 5 additions & 5 deletions
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

Lines changed: 6 additions & 6 deletions
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
);

test/e2e/Client.test.js

Lines changed: 3 additions & 4 deletions
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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,7 @@ describe('ProvidePlugin', () => {
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

Lines changed: 10 additions & 8 deletions
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/options.test.js

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,6 @@ describe('options', () => {
147147
],
148148
failure: ['whoops!'],
149149
},
150-
clientMode: {
151-
success: ['sockjs', require.resolve('../client/clients/SockJSClient')],
152-
failure: [false],
153-
},
154150
compress: {
155151
success: [true],
156152
failure: [''],
@@ -361,14 +357,6 @@ describe('options', () => {
361357
success: [true],
362358
failure: [''],
363359
},
364-
serverMode: {
365-
success: [
366-
'sockjs',
367-
require.resolve('../lib/servers/SockJSServer'),
368-
SockJSServer,
369-
],
370-
failure: [false],
371-
},
372360
serverSideRender: {
373361
success: [true],
374362
failure: [''],
@@ -410,6 +398,44 @@ describe('options', () => {
410398
],
411399
failure: ['whoops!', null],
412400
},
401+
transportMode: {
402+
success: [
403+
'ws',
404+
'sockjs',
405+
{
406+
server: 'sockjs',
407+
},
408+
{
409+
server: require.resolve('../lib/servers/SockJSServer'),
410+
},
411+
{
412+
server: SockJSServer,
413+
},
414+
{
415+
client: 'sockjs',
416+
},
417+
{
418+
client: require.resolve('../client/clients/SockJSClient'),
419+
},
420+
{
421+
server: SockJSServer,
422+
client: require.resolve('../client/clients/SockJSClient'),
423+
},
424+
],
425+
failure: [
426+
'nonexistent-implementation',
427+
null,
428+
{
429+
notAnOption: true,
430+
},
431+
{
432+
server: false,
433+
},
434+
{
435+
client: () => {},
436+
},
437+
],
438+
},
413439
useLocalIp: {
414440
success: [false],
415441
failure: [''],

test/ports-map.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,13 @@ const portsList = {
3232
'open-option': 1,
3333
'port-option': 1,
3434
'proxy-option': 4,
35-
'serverMode-option': 1,
35+
'transportMode-option': 1,
3636
'sockPath-option': 1,
3737
'stats-option': 1,
3838
ProvidePlugin: 1,
3939
WebsocketClient: 1,
4040
WebsocketServer: 1,
41-
ClientMode: 1,
42-
'clientMode-option': 1,
41+
TransportMode: 1,
4342
Progress: 1,
4443
'progress-option': 1,
4544
'profile-option': 1,

0 commit comments

Comments
 (0)