fix warnings
This commit is contained in:
parent
ed6379c160
commit
7c23ed8351
6
dist/src/api/v1/calls/index.js
vendored
6
dist/src/api/v1/calls/index.js
vendored
@ -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
7
dist/src/index.js
vendored
@ -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;
|
||||||
|
@ -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) => {
|
||||||
|
if (client) {
|
||||||
const nowTime = new Date().getTime();
|
const nowTime = new Date().getTime();
|
||||||
client.setLastPing(nowTime);
|
client.setLastPing(nowTime);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
@ -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());
|
||||||
|
6
dist/src/messageHandler/messageHandlers.js
vendored
6
dist/src/messageHandler/messageHandlers.js
vendored
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
3
dist/src/models/client.js
vendored
3
dist/src/models/client.js
vendored
@ -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;
|
||||||
|
3
dist/src/models/realm.js
vendored
3
dist/src/models/realm.js
vendored
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
5
dist/src/services/messagesExpire/index.js
vendored
5
dist/src/services/messagesExpire/index.js
vendored
@ -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
|
||||||
|
@ -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 = {
|
||||||
|
10
src/index.ts
10
src/index.ts
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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 => {
|
||||||
|
if (client) {
|
||||||
const nowTime = new Date().getTime();
|
const nowTime = new Date().getTime();
|
||||||
client.setLastPing(nowTime);
|
client.setLastPing(nowTime);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user