Skip to content

Commit d8dc0ae

Browse files
authored
Merge pull request #63 from hapinessjs/next
v1.1.0
2 parents 2fb6360 + 960cc61 commit d8dc0ae

File tree

11 files changed

+208
-114
lines changed

11 files changed

+208
-114
lines changed

.nvmrc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8.4.0
1+
8.7.0

README.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,15 @@ $ yarn add @hapiness/core rxjs
8787

8888
```javascript
8989
"dependencies": {
90-
"@hapiness/core": "^1.0.0",
90+
"@hapiness/core": "^1.1.0",
9191
//...
9292
}
9393
//...
9494
```
9595

9696
### Use Hapiness API
9797

98-
Actually, we're in : **v1.0.0**
98+
Actually, we're in : **v1.1.0**
9999

100100
See [API](https://github.com/hapinessjs/hapiness/blob/master/API.md) Reference to know what's already implemented.
101101

@@ -115,6 +115,9 @@ To set up your development environment:
115115
[Back to top](#table-of-contents)
116116

117117
## Change History
118+
* v1.1.0 (2017-10-16)
119+
* `Websocket` Server: Secure configuration
120+
* Documentation
118121
* v1.0.0 (2017-10-05)
119122
* Publish all features of API
120123
* First stable version

package-lock.json

+24-24
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@hapiness/core",
3-
"version": "1.0.0",
3+
"version": "1.1.0",
44
"description": "Project to have a HapiJS (https://hapijs.com/) based framework to create easier NodeJS back-end with some awesome features",
55
"main": "index.js",
66
"types": "index.d.ts",
@@ -76,7 +76,7 @@
7676
"@types/hapi": "^16.1.10",
7777
"@types/hoek": "^4.1.3",
7878
"@types/joi": "^10.4.3",
79-
"@types/node": "^8.0.32",
79+
"@types/node": "^8.0.34",
8080
"@types/websocket": "^0.0.34",
8181
"debug": "^3.1.0",
8282
"hapi": "^16.6.2",
@@ -88,12 +88,12 @@
8888
"coveralls": "^3.0.0",
8989
"fs-extra": "^4.0.2",
9090
"istanbul": "^1.1.0-alpha.1",
91-
"mocha": "^3.5.0",
92-
"mocha-typescript": "^1.1.9",
91+
"mocha": "^3.5.3",
92+
"mocha-typescript": "^1.1.11",
9393
"rimraf": "^2.6.2",
9494
"rxjs": "^5.4.3",
9595
"ts-node": "^3.3.0",
96-
"tslint": "^5.5.0",
96+
"tslint": "^5.7.0",
9797
"typescript": "^2.5.3",
9898
"unit.js": "^2.0.0"
9999
},

src/extensions/socket-server/README.md

+26-8
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,18 @@ Configuration:
3030
```
3131
Allow to get the hapi server instance
3232

33+
## Extension service
34+
```javascript
35+
...
36+
constructor(private server: SocketServerService) {}
37+
...
38+
```
39+
3340
## Socket
3441
Socket object provided when a new connection comes in the ServerSocket
3542

3643
- methods
44+
- `on$` - Listen new event with an Observable
3745
- `on` - Add listener on a new event coming from the socket
3846
- `onBytes` - Add listener on a new binary data coming from the socket
3947
- `emit` - Send data into the socket
@@ -47,8 +55,11 @@ Socket object provided when a new connection comes in the ServerSocket
4755
WebSocket server
4856

4957
- methods
50-
- `onRequest` - Callback called at each new socket connection
51-
- arguments: ((socket: Socket) => void)
58+
- `configure` - Allow to configure a secure callback to accept new request
59+
- arguments: request => Observable\<boolean\>
60+
- return: connections()
61+
- `connections` - Observable providing accepted requests
62+
- return: Subject\<Socket\>
5263
- `getSockets` - Return all active sockets
5364
- return: Socket[]
5465
- `broadcast` - Broadcast data to all active sockets
@@ -60,17 +71,24 @@ WebSocket server
6071

6172
```javascript
6273
@HapinessModule({
63-
version: 'x.x.x'
74+
version: 'x.x.x',
75+
providers: [ SocketServerService ]
6476
})
6577
class SocketServerModule implements OnStart {
6678

67-
constructor(@Inject(SocketServerExt) private server: WebSocketServer) {}
79+
constructor(private server: SocketServerService) {}
6880

6981
onStart() {
70-
this.server.onRequest((socket: Socket) => {
71-
socket.on('message', _ => console.log(_));
72-
socket.emit('message', 'Hello World!');
73-
this.server.broadcast('join', 'Hello World!');
82+
this
83+
.server
84+
.configure(req => Observable.of(true)) // accept requests
85+
.subscribe(
86+
socket => {
87+
socket.on('message', _ => console.log(_));
88+
socket.emit('message', 'Hello World!');
89+
this.server.broadcast('join', 'Hello World!')
90+
}
91+
);
7492
});
7593
}
7694

src/extensions/socket-server/server.ts

+28-9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Observable, Subject } from 'rxjs/Rx';
12
import { server, request } from 'websocket';
23
import { Socket } from './socket';
34
import { SocketConfig } from './extension';
@@ -7,10 +8,11 @@ import { WebSocketRooms } from './rooms';
78

89
export class WebSocketServer {
910
private server: server;
10-
private subscribers: Array<(socket: Socket) => void>;
11+
private connections$ = new Subject<Socket>();
1112
private sockets: Socket[];
1213
private httpServer: http.Server | https.Server;
1314
private rooms: WebSocketRooms;
15+
private secure: ((request: request) => Observable<boolean>) = () => Observable.of(true);
1416

1517
constructor(config: SocketConfig) {
1618
/* istanbul ignore next */
@@ -28,9 +30,14 @@ export class WebSocketServer {
2830
const _config = Object.assign({ httpServer: <any>this.httpServer }, config);
2931
this.server = new server(_config);
3032
this.sockets = [];
31-
this.subscribers = [];
3233
this.server.on('request', _request => {
33-
this.onRequestHandler(_request);
34+
this
35+
.secure(_request)
36+
.subscribe(
37+
_ => !!_ ?
38+
this.onRequestHandler(_request) :
39+
_request.reject(403, 'Forbidden')
40+
);
3441
});
3542
this.rooms = new WebSocketRooms();
3643
}
@@ -41,23 +48,35 @@ export class WebSocketServer {
4148
*
4249
* @param {request} _request
4350
*/
44-
private onRequestHandler(_request: request) {
51+
private onRequestHandler(_request: request): void {
4552
const connection = _request.accept(null, _request.origin);
4653
const socket = new Socket(_request, connection, this.rooms);
4754
const index = this.sockets.push(socket) - 1;
48-
this.subscribers.forEach(sub => sub.apply(this, [socket]));
4955
connection.on('close', conn => {
5056
this.sockets.splice(index, 1);
5157
});
58+
this.connections$.next(socket);
5259
}
5360

5461
/**
55-
* Subscribe to new socket connections
62+
* Configure a secure callback
63+
* to accept/reject requests
5664
*
57-
* @param {(socket:Socket)=>void} callback
65+
* @param {(request:request)=>Observable<boolean>} secure
66+
* @returns Subject
5867
*/
59-
public onRequest(callback: (socket: Socket) => void) {
60-
this.subscribers.push(callback);
68+
public configure(secure: (request: request) => Observable<boolean>): Subject<Socket> {
69+
this.secure = (!!secure ? secure : this.secure);
70+
return this.connections$;
71+
}
72+
73+
/**
74+
* Get connections Subject
75+
*
76+
* @returns Subject
77+
*/
78+
public connections(): Subject<Socket> {
79+
return this.connections$;
6180
}
6281

6382
/**

0 commit comments

Comments
 (0)