Browse Source

feat: Add keepalive interval to websocket module

Owen Diffey 1 năm trước cách đây
mục cha
commit
6fcaafa78c
1 tập tin đã thay đổi với 32 bổ sung0 xóa
  1. 32 0
      backend/src/modules/WebSocketModule.ts

+ 32 - 0
backend/src/modules/WebSocketModule.ts

@@ -14,6 +14,8 @@ export default class WebSocketModule extends BaseModule {
 
 	private jobQueue: JobQueue;
 
+	private keepAliveInterval?: NodeJS.Timer;
+
 	/**
 	 * WebSocket Module
 	 */
@@ -45,9 +47,39 @@ export default class WebSocketModule extends BaseModule {
 				this.handleConnection(socket, request)
 		);
 
+		this.keepAliveInterval = setInterval(() => this.keepAlive(), 45000);
+
+		this.wsServer.on("close", async () =>
+			clearInterval(this.keepAliveInterval)
+		);
+
 		await super.started();
 	}
 
+	/**
+	 * keepAlive - Ping open clients and terminate closed
+	 */
+	private async keepAlive() {
+		if (!this.wsServer) return;
+
+		for await (const clients of this.wsServer.clients.entries()) {
+			await Promise.all(
+				clients.map(async socket => {
+					switch (socket.readyState) {
+						case socket.OPEN:
+							socket.ping();
+							break;
+						case socket.CLOSED:
+							socket.terminate();
+							break;
+						default:
+							break;
+					}
+				})
+			);
+		}
+	}
+
 	/**
 	 * handleConnection - Handle websocket connection
 	 */