forked from openiap/opencore
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWebSocketServer.ts
More file actions
68 lines (65 loc) · 2.91 KB
/
Copy pathWebSocketServer.ts
File metadata and controls
68 lines (65 loc) · 2.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import * as winston from "winston";
import * as http from "http";
import * as WebSocket from "ws";
import { WebSocketClient } from "./WebSocketClient";
import { DatabaseConnection } from "./DatabaseConnection";
import { Crypt } from "./Crypt";
import { SigninMessage } from "./Messages/SigninMessage";
import { SocketMessage } from "./SocketMessage";
import { Message } from "./Messages/Message";
export class WebSocketServer {
private static _logger: winston.Logger;
private static _socketserver: WebSocket.Server;
private static _server: http.Server;
private static _clients: WebSocketClient[];
private static _db: DatabaseConnection;
static configure(logger: winston.Logger, server: http.Server): void {
this._clients = [];
this._logger = logger;
this._server = server;
this._socketserver = new WebSocket.Server({ server: server });
this._socketserver.on("connection", (socketObject: WebSocket): void => {
this._clients.push(new WebSocketClient(logger, socketObject));
});
this._socketserver.on("error", (error: Error): void => {
this._logger.error(error);
});
// this._socketserver.on("listening", (cb: () => void):void => {
// this._logger.debug("WebSocketServer is listening");
// });
// this._socketserver.on("headers", (headers: string[], request: http.IncomingMessage):void => {
// this._logger.debug("headers" + headers.join(","));
// });
setInterval(this.pingClients, 3000);
}
private static pingClients(): void {
let count: number = WebSocketServer._clients.length;
WebSocketServer._clients = WebSocketServer._clients.filter(function (cli: WebSocketClient): boolean {
try {
if (cli.jwt !== null && cli.jwt !== undefined) {
var tuser = Crypt.verityToken(cli.jwt);
var payload = Crypt.decryptToken(cli.jwt);
var clockTimestamp = Math.floor(Date.now() / 1000);
if ((clockTimestamp - payload.iat) > 180) {
WebSocketServer._logger.silly("Send new jwt to client");
var l: SigninMessage = new SigninMessage();
cli.jwt = Crypt.createToken(tuser);
l.jwt = cli.jwt;
l.user = tuser;
var m: Message = new Message(); m.command = "refreshtoken";
m.data = JSON.stringify(l);
cli.Send(m);
}
}
} catch (error) {
console.error(error);
}
// if cli.jwt
// SigninMessage
return cli.ping();
});
if (count !== WebSocketServer._clients.length) {
WebSocketServer._logger.info("new client count: " + WebSocketServer._clients.length);
}
}
}