fix warnings

This commit is contained in:
afrokick 2019-12-15 14:17:37 +03:00
parent ed6379c160
commit 7c23ed8351
23 changed files with 83 additions and 87 deletions

View File

@ -8,10 +8,12 @@ exports.default = ({ realm, messageHandler }) => {
const app = express_1.default.Router(); const app = express_1.default.Router();
const handle = (req, res, next) => { const handle = (req, res, next) => {
const { id } = req.params; const { id } = req.params;
if (!id) { if (!id)
return next(); return next();
}
const client = realm.getClientById(id); const client = realm.getClientById(id);
if (!client) {
throw new Error(`client not found:${id}`);
}
const { type, dst, payload } = req.body; const { type, dst, payload } = req.body;
const message = { const message = {
type, type,

7
dist/src/index.js vendored
View File

@ -95,12 +95,7 @@ function PeerServer(options = {}, callback) {
} }
const peerjs = ExpressPeerServer(server, newOptions); const peerjs = ExpressPeerServer(server, newOptions);
app.use(peerjs); app.use(peerjs);
if (callback) { server.listen(port, () => { var _a; return (_a = callback) === null || _a === void 0 ? void 0 : _a(server); });
server.listen(port, () => callback(server));
}
else {
server.listen(port);
}
return peerjs; return peerjs;
} }
exports.PeerServer = PeerServer; exports.PeerServer = PeerServer;

View File

@ -1,7 +1,9 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.HeartbeatHandler = (client) => { exports.HeartbeatHandler = (client) => {
const nowTime = new Date().getTime(); if (client) {
client.setLastPing(nowTime); const nowTime = new Date().getTime();
client.setLastPing(nowTime);
}
return true; return true;
}; };

View File

@ -9,10 +9,11 @@ exports.TransmissionHandler = ({ realm }) => {
const destinationClient = realm.getClientById(dstId); const destinationClient = realm.getClientById(dstId);
// User is connected! // User is connected!
if (destinationClient) { if (destinationClient) {
const socket = destinationClient.getSocket();
try { try {
if (destinationClient.getSocket()) { if (socket) {
const data = JSON.stringify(message); const data = JSON.stringify(message);
destinationClient.getSocket().send(data); socket.send(data);
} }
else { else {
// Neither socket no res available. Peer dead? // Neither socket no res available. Peer dead?
@ -23,8 +24,8 @@ exports.TransmissionHandler = ({ realm }) => {
// This happens when a peer disconnects without closing connections and // This happens when a peer disconnects without closing connections and
// the associated WebSocket has not closed. // the associated WebSocket has not closed.
// Tell other side to stop trying. // Tell other side to stop trying.
if (destinationClient.getSocket()) { if (socket) {
destinationClient.getSocket().close(); socket.close();
} }
else { else {
realm.removeClientById(destinationClient.getId()); realm.removeClientById(destinationClient.getId());

View File

@ -5,17 +5,15 @@ class MessageHandlers {
this.handlers = new Map(); this.handlers = new Map();
} }
registerHandler(messageType, handler) { registerHandler(messageType, handler) {
if (this.handlers.has(messageType)) { if (this.handlers.has(messageType))
return; return;
}
this.handlers.set(messageType, handler); this.handlers.set(messageType, handler);
} }
handle(client, message) { handle(client, message) {
const { type } = message; const { type } = message;
const handler = this.handlers.get(type); const handler = this.handlers.get(type);
if (!handler) { if (!handler)
return false; return false;
}
return handler(client, message); return handler(client, message);
} }
} }

View File

@ -26,7 +26,8 @@ class Client {
this.lastPing = lastPing; this.lastPing = lastPing;
} }
send(data) { send(data) {
this.socket.send(JSON.stringify(data)); var _a;
(_a = this.socket) === null || _a === void 0 ? void 0 : _a.send(JSON.stringify(data));
} }
} }
exports.Client = Client; exports.Client = Client;

View File

@ -24,9 +24,8 @@ class Realm {
} }
removeClientById(id) { removeClientById(id) {
const client = this.getClientById(id); const client = this.getClientById(id);
if (!client) { if (!client)
return false; return false;
}
this.clients.delete(id); this.clients.delete(id);
return true; return true;
} }

View File

@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
const DEFAULT_CHECK_INTERVAL = 300; const DEFAULT_CHECK_INTERVAL = 300;
class CheckBrokenConnections { class CheckBrokenConnections {
constructor({ realm, config, checkInterval = DEFAULT_CHECK_INTERVAL, onClose }) { constructor({ realm, config, checkInterval = DEFAULT_CHECK_INTERVAL, onClose }) {
this.timeoutId = null;
this.realm = realm; this.realm = realm;
this.config = config; this.config = config;
this.onClose = onClose; this.onClose = onClose;
@ -25,30 +26,23 @@ class CheckBrokenConnections {
} }
} }
checkConnections() { checkConnections() {
var _a, _b, _c;
const clientsIds = this.realm.getClientsIds(); const clientsIds = this.realm.getClientsIds();
const now = new Date().getTime(); const now = new Date().getTime();
const { alive_timeout: aliveTimeout } = this.config; const { alive_timeout: aliveTimeout } = this.config;
for (const clientId of clientsIds) { for (const clientId of clientsIds) {
const client = this.realm.getClientById(clientId); const client = this.realm.getClientById(clientId);
const timeSinceLastPing = now - client.getLastPing(); const timeSinceLastPing = now - client.getLastPing();
if (timeSinceLastPing < aliveTimeout) { if (timeSinceLastPing < aliveTimeout)
continue; continue;
}
try { try {
if (client.getSocket()) { (_a = client.getSocket()) === null || _a === void 0 ? void 0 : _a.close();
client.getSocket().close();
}
}
catch (e) {
// @ts-nocheck
} }
finally { finally {
this.realm.clearMessageQueue(clientId); this.realm.clearMessageQueue(clientId);
this.realm.removeClientById(clientId); this.realm.removeClientById(clientId);
client.setSocket(null); client.setSocket(null);
if (this.onClose) { (_c = (_b = this).onClose) === null || _c === void 0 ? void 0 : _c.call(_b, client);
this.onClose(client);
}
} }
} }
} }

View File

@ -33,13 +33,12 @@ class MessagesExpire {
for (const destinationClientId of destinationClientsIds) { for (const destinationClientId of destinationClientsIds) {
const messageQueue = this.realm.getMessageQueueById(destinationClientId); const messageQueue = this.realm.getMessageQueueById(destinationClientId);
const lastReadDiff = now - messageQueue.getLastReadAt(); const lastReadDiff = now - messageQueue.getLastReadAt();
if (lastReadDiff < maxDiff) { if (lastReadDiff < maxDiff)
continue; continue;
}
const messages = messageQueue.getMessages(); const messages = messageQueue.getMessages();
for (const message of messages) { for (const message of messages) {
if (!seen[message.src]) { if (!seen[message.src]) {
this.messageHandler.handle(null, { this.messageHandler.handle(undefined, {
type: enums_1.MessageType.EXPIRE, type: enums_1.MessageType.EXPIRE,
src: message.dst, src: message.dst,
dst: message.src dst: message.src

View File

@ -3,16 +3,20 @@ import { IMessageHandler } from "../../../messageHandler";
import { IMessage } from "../../../models/message"; import { IMessage } from "../../../models/message";
import { IRealm } from "../../../models/realm"; import { IRealm } from "../../../models/realm";
export default ({ realm, messageHandler }: { realm: IRealm, messageHandler: IMessageHandler }): express.Router => { export default ({ realm, messageHandler }: { realm: IRealm, messageHandler: IMessageHandler; }): express.Router => {
const app = express.Router(); const app = express.Router();
const handle = (req: express.Request, res: express.Response, next: express.NextFunction): any => { const handle = (req: express.Request, res: express.Response, next: express.NextFunction): any => {
const { id } = req.params; const { id } = req.params;
if (!id) { return next(); } if (!id) return next();
const client = realm.getClientById(id); const client = realm.getClientById(id);
if (!client) {
throw new Error(`client not found:${id}`);
}
const { type, dst, payload } = req.body; const { type, dst, payload } = req.body;
const message: IMessage = { const message: IMessage = {

View File

@ -18,7 +18,7 @@ import { IWebSocketServer, WebSocketServer } from "./services/webSocketServer";
const init = ({ app, server, options }: { const init = ({ app, server, options }: {
app: express.Express, app: express.Express,
server: Server, server: Server,
options: IConfig options: IConfig;
}) => { }) => {
const config = options; const config = options;
const realm: IRealm = new Realm(); const realm: IRealm = new Realm();
@ -125,7 +125,7 @@ function PeerServer(options: Optional<IConfig> = {}, callback?: (server: Server)
let server: Server; let server: Server;
if (newOptions.ssl && newOptions.ssl.key && newOptions.ssl.cert) { if (newOptions.ssl && newOptions.ssl.key && newOptions.ssl.cert) {
server = https.createServer(options.ssl, app); server = https.createServer(options.ssl!, app);
// @ts-ignore // @ts-ignore
delete newOptions.ssl; delete newOptions.ssl;
} else { } else {
@ -135,11 +135,7 @@ function PeerServer(options: Optional<IConfig> = {}, callback?: (server: Server)
const peerjs = ExpressPeerServer(server, newOptions); const peerjs = ExpressPeerServer(server, newOptions);
app.use(peerjs); app.use(peerjs);
if (callback) { server.listen(port, () => callback?.(server));
server.listen(port, () => callback(server));
} else {
server.listen(port);
}
return peerjs; return peerjs;
} }

View File

@ -1,4 +1,4 @@
import { IClient } from "../models/client"; import { IClient } from "../models/client";
import { IMessage } from "../models/message"; import { IMessage } from "../models/message";
export type Handler = (client: IClient, message: IMessage) => boolean; export type Handler = (client: IClient | undefined, message: IMessage) => boolean;

View File

@ -1,7 +1,10 @@
import { IClient } from "../../../models/client"; import { IClient } from "../../../models/client";
export const HeartbeatHandler = (client: IClient): boolean => { export const HeartbeatHandler = (client: IClient | undefined): boolean => {
const nowTime = new Date().getTime(); if (client) {
client.setLastPing(nowTime); const nowTime = new Date().getTime();
client.setLastPing(nowTime);
}
return true; return true;
}; };

View File

@ -3,8 +3,8 @@ import { IClient } from "../../../models/client";
import { IMessage } from "../../../models/message"; import { IMessage } from "../../../models/message";
import { IRealm } from "../../../models/realm"; import { IRealm } from "../../../models/realm";
export const TransmissionHandler = ({ realm }: { realm: IRealm }): (client: IClient, message: IMessage) => boolean => { export const TransmissionHandler = ({ realm }: { realm: IRealm; }): (client: IClient | undefined, message: IMessage) => boolean => {
const handle = (client: IClient, message: IMessage) => { const handle = (client: IClient | undefined, message: IMessage) => {
const type = message.type; const type = message.type;
const srcId = message.src; const srcId = message.src;
const dstId = message.dst; const dstId = message.dst;
@ -13,11 +13,12 @@ export const TransmissionHandler = ({ realm }: { realm: IRealm }): (client: ICli
// User is connected! // User is connected!
if (destinationClient) { if (destinationClient) {
const socket = destinationClient.getSocket();
try { try {
if (destinationClient.getSocket()) { if (socket) {
const data = JSON.stringify(message); const data = JSON.stringify(message);
destinationClient.getSocket().send(data); socket.send(data);
} else { } else {
// Neither socket no res available. Peer dead? // Neither socket no res available. Peer dead?
throw new Error("Peer dead"); throw new Error("Peer dead");
@ -26,8 +27,8 @@ export const TransmissionHandler = ({ realm }: { realm: IRealm }): (client: ICli
// This happens when a peer disconnects without closing connections and // This happens when a peer disconnects without closing connections and
// the associated WebSocket has not closed. // the associated WebSocket has not closed.
// Tell other side to stop trying. // Tell other side to stop trying.
if (destinationClient.getSocket()) { if (socket) {
destinationClient.getSocket().close(); socket.close();
} else { } else {
realm.removeClientById(destinationClient.getId()); realm.removeClientById(destinationClient.getId());
} }

View File

@ -7,7 +7,7 @@ import { HeartbeatHandler, TransmissionHandler } from "./handlers";
import { IMessageHandlers, MessageHandlers } from "./messageHandlers"; import { IMessageHandlers, MessageHandlers } from "./messageHandlers";
export interface IMessageHandler { export interface IMessageHandler {
handle(client: IClient, message: IMessage): boolean; handle(client: IClient | undefined, message: IMessage): boolean;
} }
export class MessageHandler implements IMessageHandler { export class MessageHandler implements IMessageHandler {
@ -17,7 +17,7 @@ export class MessageHandler implements IMessageHandler {
const transmissionHandler: Handler = TransmissionHandler({ realm }); const transmissionHandler: Handler = TransmissionHandler({ realm });
const heartbeatHandler: Handler = HeartbeatHandler; const heartbeatHandler: Handler = HeartbeatHandler;
const handleTransmission: Handler = (client: IClient, message: IMessage): boolean => { const handleTransmission: Handler = (client: IClient | undefined, message: IMessage): boolean => {
return transmissionHandler(client, { return transmissionHandler(client, {
type: message.type, type: message.type,
src: message.src, src: message.src,
@ -26,7 +26,7 @@ export class MessageHandler implements IMessageHandler {
}); });
}; };
const handleHeartbeat = (client: IClient, message: IMessage) => heartbeatHandler(client, message); const handleHeartbeat = (client: IClient | undefined, message: IMessage) => heartbeatHandler(client, message);
this.messageHandlers.registerHandler(MessageType.HEARTBEAT, handleHeartbeat); this.messageHandlers.registerHandler(MessageType.HEARTBEAT, handleHeartbeat);
this.messageHandlers.registerHandler(MessageType.OFFER, handleTransmission); this.messageHandlers.registerHandler(MessageType.OFFER, handleTransmission);
@ -36,7 +36,7 @@ export class MessageHandler implements IMessageHandler {
this.messageHandlers.registerHandler(MessageType.EXPIRE, handleTransmission); this.messageHandlers.registerHandler(MessageType.EXPIRE, handleTransmission);
} }
public handle(client: IClient, message: IMessage): boolean { public handle(client: IClient | undefined, message: IMessage): boolean {
return this.messageHandlers.handle(client, message); return this.messageHandlers.handle(client, message);
} }
} }

View File

@ -5,24 +5,24 @@ import { Handler } from "./handler";
export interface IMessageHandlers { export interface IMessageHandlers {
registerHandler(messageType: MessageType, handler: Handler): void; registerHandler(messageType: MessageType, handler: Handler): void;
handle(client: IClient, message: IMessage): boolean; handle(client: IClient | undefined, message: IMessage): boolean;
} }
export class MessageHandlers implements IMessageHandlers { export class MessageHandlers implements IMessageHandlers {
private readonly handlers: Map<MessageType, Handler> = new Map(); private readonly handlers: Map<MessageType, Handler> = new Map();
public registerHandler(messageType: MessageType, handler: Handler): void { public registerHandler(messageType: MessageType, handler: Handler): void {
if (this.handlers.has(messageType)) { return; } if (this.handlers.has(messageType)) return;
this.handlers.set(messageType, handler); this.handlers.set(messageType, handler);
} }
public handle(client: IClient, message: IMessage): boolean { public handle(client: IClient | undefined, message: IMessage): boolean {
const { type } = message; const { type } = message;
const handler = this.handlers.get(type); const handler = this.handlers.get(type);
if (!handler) { return false; } if (!handler) return false;
return handler(client, message); return handler(client, message);
} }

View File

@ -7,7 +7,7 @@ export interface IClient {
getSocket(): MyWebSocket | null; getSocket(): MyWebSocket | null;
setSocket(socket: MyWebSocket): void; setSocket(socket: MyWebSocket | null): void;
getLastPing(): number; getLastPing(): number;
@ -19,10 +19,10 @@ export interface IClient {
export class Client implements IClient { export class Client implements IClient {
private readonly id: string; private readonly id: string;
private readonly token: string; private readonly token: string;
private socket: MyWebSocket = null; private socket: MyWebSocket | null = null;
private lastPing: number = new Date().getTime(); private lastPing: number = new Date().getTime();
constructor({ id, token }: { id: string, token: string }) { constructor({ id, token }: { id: string, token: string; }) {
this.id = id; this.id = id;
this.token = token; this.token = token;
} }
@ -39,7 +39,7 @@ export class Client implements IClient {
return this.socket; return this.socket;
} }
public setSocket(socket: MyWebSocket): void { public setSocket(socket: MyWebSocket | null): void {
this.socket = socket; this.socket = socket;
} }
@ -52,6 +52,6 @@ export class Client implements IClient {
} }
public send(data: any): void { public send(data: any): void {
this.socket.send(JSON.stringify(data)); this.socket?.send(JSON.stringify(data));
} }
} }

View File

@ -25,7 +25,7 @@ export class MessageQueue implements IMessageQueue {
public readMessage(): IMessage | null { public readMessage(): IMessage | null {
if (this.messages.length > 0) { if (this.messages.length > 0) {
this.lastReadAt = new Date().getTime(); this.lastReadAt = new Date().getTime();
return this.messages.shift(); return this.messages.shift()!;
} }
return null; return null;

View File

@ -46,7 +46,7 @@ export class Realm implements IRealm {
public removeClientById(id: string): boolean { public removeClientById(id: string): boolean {
const client = this.getClientById(id); const client = this.getClientById(id);
if (!client) { return false; } if (!client) return false;
this.clients.delete(id); this.clients.delete(id);
@ -62,7 +62,7 @@ export class Realm implements IRealm {
this.messageQueues.set(id, new MessageQueue()); this.messageQueues.set(id, new MessageQueue());
} }
this.getMessageQueueById(id).addMessage(message); this.getMessageQueueById(id)!.addMessage(message);
} }
public clearMessageQueue(id: string): void { public clearMessageQueue(id: string): void {

View File

@ -9,7 +9,7 @@ type CustomConfig = Pick<IConfig, 'alive_timeout'>;
export class CheckBrokenConnections { export class CheckBrokenConnections {
public readonly checkInterval: number; public readonly checkInterval: number;
private timeoutId: NodeJS.Timeout; private timeoutId: NodeJS.Timeout | null = null;
private readonly realm: IRealm; private readonly realm: IRealm;
private readonly config: CustomConfig; private readonly config: CustomConfig;
private readonly onClose?: (client: IClient) => void; private readonly onClose?: (client: IClient) => void;
@ -18,7 +18,7 @@ export class CheckBrokenConnections {
realm: IRealm, realm: IRealm,
config: CustomConfig, config: CustomConfig,
checkInterval?: number, checkInterval?: number,
onClose?: (client: IClient) => void onClose?: (client: IClient) => void;
}) { }) {
this.realm = realm; this.realm = realm;
this.config = config; this.config = config;
@ -54,23 +54,20 @@ export class CheckBrokenConnections {
const { alive_timeout: aliveTimeout } = this.config; const { alive_timeout: aliveTimeout } = this.config;
for (const clientId of clientsIds) { for (const clientId of clientsIds) {
const client = this.realm.getClientById(clientId); const client = this.realm.getClientById(clientId)!;
const timeSinceLastPing = now - client.getLastPing(); const timeSinceLastPing = now - client.getLastPing();
if (timeSinceLastPing < aliveTimeout) { continue; } if (timeSinceLastPing < aliveTimeout) continue;
try { try {
if (client.getSocket()) { client.getSocket()?.close();
client.getSocket().close();
}
} catch (e) {
// @ts-nocheck
} finally { } finally {
this.realm.clearMessageQueue(clientId); this.realm.clearMessageQueue(clientId);
this.realm.removeClientById(clientId); this.realm.removeClientById(clientId);
client.setSocket(null); client.setSocket(null);
if (this.onClose) { this.onClose(client); } this.onClose?.(client);
} }
} }
} }

View File

@ -13,7 +13,7 @@ export class MessagesExpire implements IMessagesExpire {
private readonly config: IConfig; private readonly config: IConfig;
private readonly messageHandler: IMessageHandler; private readonly messageHandler: IMessageHandler;
private timeoutId: NodeJS.Timeout = null; private timeoutId: NodeJS.Timeout | null = null;
constructor({ realm, config, messageHandler }: { constructor({ realm, config, messageHandler }: {
realm: IRealm; realm: IRealm;
@ -53,19 +53,19 @@ export class MessagesExpire implements IMessagesExpire {
const now = new Date().getTime(); const now = new Date().getTime();
const maxDiff = this.config.expire_timeout; const maxDiff = this.config.expire_timeout;
const seen: { [id: string]: boolean } = {}; const seen: Record<string, boolean> = {};
for (const destinationClientId of destinationClientsIds) { for (const destinationClientId of destinationClientsIds) {
const messageQueue = this.realm.getMessageQueueById(destinationClientId); const messageQueue = this.realm.getMessageQueueById(destinationClientId)!;
const lastReadDiff = now - messageQueue.getLastReadAt(); const lastReadDiff = now - messageQueue.getLastReadAt();
if (lastReadDiff < maxDiff) { continue; } if (lastReadDiff < maxDiff) continue;
const messages = messageQueue.getMessages(); const messages = messageQueue.getMessages();
for (const message of messages) { for (const message of messages) {
if (!seen[message.src]) { if (!seen[message.src]) {
this.messageHandler.handle(null, { this.messageHandler.handle(undefined, {
type: MessageType.EXPIRE, type: MessageType.EXPIRE,
src: message.dst, src: message.dst,
dst: message.src dst: message.src

View File

@ -25,7 +25,7 @@ export class WebSocketServer extends EventEmitter implements IWebSocketServer {
private readonly config: IConfig; private readonly config: IConfig;
private readonly webSocketServer: WebSocketLib.Server; private readonly webSocketServer: WebSocketLib.Server;
constructor({ server, realm, config }: { server: any, realm: IRealm, config: IConfig }) { constructor({ server, realm, config }: { server: any, realm: IRealm, config: IConfig; }) {
super(); super();
this.setMaxListeners(0); this.setMaxListeners(0);
this.realm = realm; this.realm = realm;
@ -41,7 +41,7 @@ export class WebSocketServer extends EventEmitter implements IWebSocketServer {
} }
private _onSocketConnection(socket: MyWebSocket, req: IncomingMessage): void { private _onSocketConnection(socket: MyWebSocket, req: IncomingMessage): void {
const { query = {} } = url.parse(req.url, true); const { query = {} } = url.parse(req.url!, true);
const { id, token, key }: IAuthParams = query; const { id, token, key }: IAuthParams = query;

View File

@ -5,6 +5,7 @@
], ],
"target": "es2016", "target": "es2016",
"module": "commonjs", "module": "commonjs",
"strict": true,
"esModuleInterop": true, "esModuleInterop": true,
"downlevelIteration": true, "downlevelIteration": true,
"moduleResolution": "node", "moduleResolution": "node",
@ -16,6 +17,9 @@
"sourceMap": false, "sourceMap": false,
"outDir": "dist" "outDir": "dist"
}, },
"include": [
"./src/**/*",
],
"exclude": [ "exclude": [
"test", "test",
"bin", "bin",