1 | import { deviceInfo, } from '@casual-simulation/causal-trees';
|
2 | import { fromEventPattern } from 'rxjs';
|
3 | import { map, shareReplay, flatMap, first, tap } from 'rxjs/operators';
|
4 | export class SocketIOConnectionServer {
|
5 | get connection() {
|
6 | return this._connection;
|
7 | }
|
8 | constructor(socketServer) {
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | const onConnection = fromEventPattern(h => socketServer.on('connection', h));
|
21 | const connections = onConnection.pipe(flatMap(s => this._login(s), (socket, info) => ({ info, socket })), map(({ info, socket }) => new SocketIOConnection(socket, info)), shareReplay());
|
22 | this._connection = connections;
|
23 | }
|
24 | _login(socket) {
|
25 | console.log(`[SocketIOConnectionServer] Waiting for login...`);
|
26 | const onLogin = fromEventPattern(h => socket.on('login', h), h => socket.off('login', h));
|
27 | return onLogin.pipe(tap(() => { }), map(token => deviceInfo(token.username, token.username, token.id)), tap(info => socket.emit('login_result', info)), first());
|
28 | }
|
29 | }
|
30 | export class SocketIOConnection {
|
31 | get device() {
|
32 | return this._device;
|
33 | }
|
34 | get disconnect() {
|
35 | return this._socketEvent('disconnect');
|
36 | }
|
37 | event(name) {
|
38 | return this._socketEvent(name);
|
39 | }
|
40 | send(name, data) {
|
41 | this._socket.emit(name, data);
|
42 | }
|
43 | constructor(socket, device) {
|
44 | this._socket = socket;
|
45 | this._device = device;
|
46 | }
|
47 | _socketEvent(name) {
|
48 | return fromEventPattern(h => this._socket.on(name, h), h => this._socket.off(name, h));
|
49 | }
|
50 | }
|
51 |
|
\ | No newline at end of file |