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

Lines changed: 1085 additions & 800 deletions

‎lib/Server.js‎

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

Lines changed: 27 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,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‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
functiongetSocketClientPath(options){
44
letClientImplementation;
55
letclientImplFound=true;
6-
switch(typeofoptions.clientMode){
6+
switch(typeofoptions.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-
}elseif(options.clientMode==='ws'){
11+
}elseif(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
thrownewError(
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
functiongetSocketServerImplementation(options){
44
letServerImplementation;
55
letserverImplFound=true;
6-
switch(typeofoptions.serverMode){
6+
switch(typeofoptions.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-
}elseif(options.serverMode==='ws'){
11+
}elseif(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
thrownewError(
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‎

Lines changed: 19 additions & 8 deletions
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(typeofoptions.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‎

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
constmodes=[
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: 3 additions & 4 deletions
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
constoptions={
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
constoptions={
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
},
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,35 @@
33
consttestServer=require('../helpers/test-server');
44
constconfig=require('../fixtures/client-config/webpack.config');
55
construnBrowser=require('../helpers/run-browser');
6-
constport=require('../ports-map').ClientMode;
6+
constport=require('../ports-map').TransportMode;
77
const{
88
initConsoleDelay,
99
awaitServerCloseDelay,
1010
}=require('../helpers/puppeteer-constants');
1111

12-
describe('clientMode',()=>{
12+
describe('transportMode client',()=>{
1313
constmodes=[
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

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