Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
8.4.0
8.7.0
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,15 @@ $ yarn add @hapiness/core rxjs

```javascript
"dependencies": {
"@hapiness/core": "^1.0.0",
"@hapiness/core": "^1.1.0",
//...
}
//...
```

### Use Hapiness API

Actually, we're in : **v1.0.0**
Actually, we're in : **v1.1.0**

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

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

## Change History
* v1.1.0 (2017-10-16)
* `Websocket` Server: Secure configuration
* Documentation
* v1.0.0 (2017-10-05)
* Publish all features of API
* First stable version
Expand Down
48 changes: 24 additions & 24 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@hapiness/core",
"version": "1.0.0",
"version": "1.1.0",
"description": "Project to have a HapiJS (https://hapijs.com/) based framework to create easier NodeJS back-end with some awesome features",
"main": "index.js",
"types": "index.d.ts",
Expand Down Expand Up @@ -76,7 +76,7 @@
"@types/hapi": "^16.1.10",
"@types/hoek": "^4.1.3",
"@types/joi": "^10.4.3",
"@types/node": "^8.0.32",
"@types/node": "^8.0.34",
"@types/websocket": "^0.0.34",
"debug": "^3.1.0",
"hapi": "^16.6.2",
Expand All @@ -88,12 +88,12 @@
"coveralls": "^3.0.0",
"fs-extra": "^4.0.2",
"istanbul": "^1.1.0-alpha.1",
"mocha": "^3.5.0",
"mocha-typescript": "^1.1.9",
"mocha": "^3.5.3",
"mocha-typescript": "^1.1.11",
"rimraf": "^2.6.2",
"rxjs": "^5.4.3",
"ts-node": "^3.3.0",
"tslint": "^5.5.0",
"tslint": "^5.7.0",
"typescript": "^2.5.3",
"unit.js": "^2.0.0"
},
Expand Down
34 changes: 26 additions & 8 deletions src/extensions/socket-server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,18 @@ Configuration:
```
Allow to get the hapi server instance

## Extension service
```javascript
...
constructor(private server: SocketServerService) {}
...
```

## Socket
Socket object provided when a new connection comes in the ServerSocket

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

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

```javascript
@HapinessModule({
version: 'x.x.x'
version: 'x.x.x',
providers: [ SocketServerService ]
})
class SocketServerModule implements OnStart {

constructor(@Inject(SocketServerExt) private server: WebSocketServer) {}
constructor(private server: SocketServerService) {}

onStart() {
this.server.onRequest((socket: Socket) => {
socket.on('message', _ => console.log(_));
socket.emit('message', 'Hello World!');
this.server.broadcast('join', 'Hello World!');
this
.server
.configure(req => Observable.of(true)) // accept requests
.subscribe(
socket => {
socket.on('message', _ => console.log(_));
socket.emit('message', 'Hello World!');
this.server.broadcast('join', 'Hello World!')
}
);
});
}

Expand Down
37 changes: 28 additions & 9 deletions src/extensions/socket-server/server.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Observable, Subject } from 'rxjs/Rx';
import { server, request } from 'websocket';
import { Socket } from './socket';
import { SocketConfig } from './extension';
Expand All @@ -7,10 +8,11 @@ import { WebSocketRooms } from './rooms';

export class WebSocketServer {
private server: server;
private subscribers: Array<(socket: Socket) => void>;
private connections$ = new Subject<Socket>();
private sockets: Socket[];
private httpServer: http.Server | https.Server;
private rooms: WebSocketRooms;
private secure: ((request: request) => Observable<boolean>) = () => Observable.of(true);

constructor(config: SocketConfig) {
/* istanbul ignore next */
Expand All @@ -28,9 +30,14 @@ export class WebSocketServer {
const _config = Object.assign({ httpServer: <any>this.httpServer }, config);
this.server = new server(_config);
this.sockets = [];
this.subscribers = [];
this.server.on('request', _request => {
this.onRequestHandler(_request);
this
.secure(_request)
.subscribe(
_ => !!_ ?
this.onRequestHandler(_request) :
_request.reject(403, 'Forbidden')
);
});
this.rooms = new WebSocketRooms();
}
Expand All @@ -41,23 +48,35 @@ export class WebSocketServer {
*
* @param {request} _request
*/
private onRequestHandler(_request: request) {
private onRequestHandler(_request: request): void {
const connection = _request.accept(null, _request.origin);
const socket = new Socket(_request, connection, this.rooms);
const index = this.sockets.push(socket) - 1;
this.subscribers.forEach(sub => sub.apply(this, [socket]));
connection.on('close', conn => {
this.sockets.splice(index, 1);
});
this.connections$.next(socket);
}

/**
* Subscribe to new socket connections
* Configure a secure callback
* to accept/reject requests
*
* @param {(socket:Socket)=>void} callback
* @param {(request:request)=>Observable<boolean>} secure
* @returns Subject
*/
public onRequest(callback: (socket: Socket) => void) {
this.subscribers.push(callback);
public configure(secure: (request: request) => Observable<boolean>): Subject<Socket> {
this.secure = (!!secure ? secure : this.secure);
return this.connections$;
}

/**
* Get connections Subject
*
* @returns Subject
*/
public connections(): Subject<Socket> {
return this.connections$;
}

/**
Expand Down
Loading