Skip to content

Commit a732303

Browse files
knagaitsevevilebottnawi
authored andcommitted
feat(experimentally): WebsocketServer implementation and tests (#2056)
1 parent 7542f18 commit a732303

File tree

4 files changed

+107
-4
lines changed

4 files changed

+107
-4
lines changed

lib/servers/WebsocketServer.js

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,34 @@
11
'use strict';
22

3-
// const ws = require('ws');
3+
/* eslint-disable
4+
class-methods-use-this
5+
*/
6+
const ws = require('ws');
47
const BaseServer = require('./BaseServer');
58

6-
// ws server implementation under construction
7-
// will need changes in the client as well to function
8-
module.exports = class WebsocketServer extends BaseServer {};
9+
module.exports = class WebsocketServer extends BaseServer {
10+
constructor(server) {
11+
super(server);
12+
this.wsServer = new ws.Server({
13+
server: this.server.listeningApp,
14+
path: this.server.sockPath,
15+
});
16+
17+
this.wsServer.on('error', (err) => {
18+
this.server.log.error(err.message);
19+
});
20+
}
21+
22+
send(connection, message) {
23+
connection.send(message);
24+
}
25+
26+
close(connection) {
27+
connection.close();
28+
}
29+
30+
// f should return the resulting connection
31+
onConnection(f) {
32+
this.wsServer.on('connection', f);
33+
}
34+
};

test/ports-map.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const portsList = {
3636
'stats-option': 1,
3737
ProvidePlugin: 1,
3838
WebsocketClient: 1,
39+
WebsocketServer: 1,
3940
};
4041

4142
let startPort = 8079;
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
'use strict';
2+
3+
const http = require('http');
4+
const express = require('express');
5+
const ws = require('ws');
6+
const WebsocketServer = require('../../../lib/servers/WebsocketServer');
7+
const port = require('../../ports-map').WebsocketServer;
8+
9+
describe('WebsocketServer', () => {
10+
let socketServer;
11+
let listeningApp;
12+
13+
beforeAll((done) => {
14+
// eslint-disable-next-line new-cap
15+
const app = new express();
16+
17+
listeningApp = http.createServer(app);
18+
listeningApp.listen(port, 'localhost', () => {
19+
const server = {
20+
log: {
21+
error: () => {},
22+
debug: () => {},
23+
},
24+
sockPath: '/ws-server',
25+
listeningApp,
26+
};
27+
28+
socketServer = new WebsocketServer(server);
29+
30+
done();
31+
});
32+
});
33+
34+
describe('server', () => {
35+
it('should recieve connection, send message, and close client', (done) => {
36+
const data = [];
37+
38+
socketServer.onConnection((connection) => {
39+
data.push('open');
40+
socketServer.send(connection, 'hello world');
41+
setTimeout(() => {
42+
socketServer.close(connection);
43+
}, 1000);
44+
});
45+
46+
// eslint-disable-next-line new-cap
47+
const client = new ws(`http://localhost:${port}/ws-server`);
48+
49+
client.onmessage = (e) => {
50+
data.push(e.data);
51+
};
52+
53+
client.onclose = () => {
54+
data.push('close');
55+
};
56+
57+
setTimeout(() => {
58+
expect(data).toMatchSnapshot();
59+
done();
60+
}, 3000);
61+
});
62+
});
63+
64+
afterAll((done) => {
65+
listeningApp.close(done);
66+
});
67+
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`WebsocketServer server should recieve connection, send message, and close client 1`] = `
4+
Array [
5+
"open",
6+
"hello world",
7+
"close",
8+
]
9+
`;

0 commit comments

Comments
 (0)