完善注释

This commit is contained in:
Jerry 2025-04-29 18:43:23 +08:00
parent 48a125d51c
commit 964cc48993
4 changed files with 71 additions and 11 deletions

View File

@ -21,7 +21,7 @@ class WSMessageHandler {
async handle(socket: AuthenticatedSocket, clientId: string, msg: any) { async handle(socket: AuthenticatedSocket, clientId: string, msg: any) {
try { try {
//检查是否是 pendingRequests 的回包 //如果是 pendingRequests 的回包
if (msg.requestId && wsClientManager.resolvePendingRequest(msg.requestId, msg)) { if (msg.requestId && wsClientManager.resolvePendingRequest(msg.requestId, msg)) {
return; return;
} }

View File

@ -8,30 +8,54 @@ const pendingRequests = new Map<string, (data: any) => void>();
class WSClientManager { class WSClientManager {
private clients = new Map<ClientID, WebSocket>(); private clients = new Map<ClientID, WebSocket>();
/**
* ws客户端实例
* @param id
* @param socket
*/
public add(id: ClientID, socket: WebSocket) { public add(id: ClientID, socket: WebSocket) {
this.clients.set(id, socket); this.clients.set(id, socket);
} }
/**
* ws客户端实例
* @param id
*/
public remove(id: ClientID) { public remove(id: ClientID) {
this.clients.delete(id); this.clients.delete(id);
} }
/**
* ws客户端实例
* @param id
*/
public get(id: ClientID): WebSocket | undefined { public get(id: ClientID): WebSocket | undefined {
return this.clients.get(id); return this.clients.get(id);
} }
public async send(id: ClientID, payload: any): Promise<boolean> { /**
* ws客户端
* @param id ws客户端标识符
* @param data
*/
public async send(id: ClientID, data: any): Promise<boolean> {
const socket = this.clients.get(id); const socket = this.clients.get(id);
if (!socket || socket.readyState !== WebSocket.OPEN) return false; if (!socket || socket.readyState !== WebSocket.OPEN) return false;
return this.safeSend(socket, payload); return this.safeSend(socket, data);
} }
public async sendAndWait(id: ClientID, payload: any, timeout = 5000): Promise<any> { /**
* ws发送请求&
* @param id ws客户端标识符-id
* @param data
* @param timeout 5
*/
public async sendAndWait(id: ClientID, data: any, timeout = 5000): Promise<any> {
const socket = this.clients.get(id); const socket = this.clients.get(id);
if (!socket) return; if (!socket) return;
payload.requestId = uuidv4(); data.requestId = uuidv4();
const requestId = payload.requestId; const requestId = data.requestId;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const timer = setTimeout(() => { const timer = setTimeout(() => {
@ -45,7 +69,7 @@ class WSClientManager {
resolve(response); resolve(response);
}); });
this.safeSend(socket, payload).catch((err) => { this.safeSend(socket, data).catch((err) => {
clearTimeout(timer); clearTimeout(timer);
pendingRequests.delete(requestId); pendingRequests.delete(requestId);
reject(err); reject(err);
@ -53,6 +77,11 @@ class WSClientManager {
}); });
} }
/**
*
* @param requestId
* @param data
*/
public resolvePendingRequest(requestId: string, data: any): boolean { public resolvePendingRequest(requestId: string, data: any): boolean {
const callback = pendingRequests.get(requestId); const callback = pendingRequests.get(requestId);
if (callback) { if (callback) {
@ -63,10 +92,14 @@ class WSClientManager {
return false; return false;
} }
public async broadcast(payload: any): Promise<void> { /**
* 广ws客户端
* @param data
*/
public async broadcast(data: any): Promise<void> {
const tasks = Array.from(this.clients.values()).map((socket) => { const tasks = Array.from(this.clients.values()).map((socket) => {
if (socket.readyState === WebSocket.OPEN) { if (socket.readyState === WebSocket.OPEN) {
return this.safeSend(socket, payload); return this.safeSend(socket, data);
} else { } else {
return Promise.resolve(); return Promise.resolve();
} }
@ -74,6 +107,12 @@ class WSClientManager {
await Promise.all(tasks); await Promise.all(tasks);
} }
/**
* ws客户端
* @param socket ws客户端
* @param data
* @private
*/
private async safeSend(socket: WebSocket, data: any): Promise<boolean> { private async safeSend(socket: WebSocket, data: any): Promise<boolean> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
socket.send(JSON.stringify(data), (err) => { socket.send(JSON.stringify(data), (err) => {

View File

@ -9,7 +9,12 @@ class Persistence {
return path.join(paths.get('userData'), dataName, `${fileName}.json`); return path.join(paths.get('userData'), dataName, `${fileName}.json`);
} }
private static async ensureUserPath(dataName: string): Promise<void> { /**
*
* @param dataName
* @private
*/
private static async ensureDataPath(dataName: string): Promise<void> {
const dataPath = path.join(paths.get('userData'), dataName); const dataPath = path.join(paths.get('userData'), dataName);
try { try {
await fc.createDir(dataPath, false); await fc.createDir(dataPath, false);
@ -18,12 +23,18 @@ class Persistence {
} }
} }
/**
* json格式存储
* @param dataName
* @param data
* @param fileName
*/
public static async writeDataLocal<T>( public static async writeDataLocal<T>(
dataName: string, dataName: string,
data: T, data: T,
fileName: string fileName: string
): Promise<void> { ): Promise<void> {
await this.ensureUserPath(dataName); await this.ensureDataPath(dataName);
const filePath = this.getDataPath(dataName, fileName); const filePath = this.getDataPath(dataName, fileName);
try { try {
@ -34,6 +45,11 @@ class Persistence {
} }
} }
/**
*
* @param dataName
* @param fileName
*/
public static async readDataLocal<T>(dataName: string, fileName: string): Promise<T | undefined> { public static async readDataLocal<T>(dataName: string, fileName: string): Promise<T | undefined> {
const filePath = this.getDataPath(dataName, fileName); const filePath = this.getDataPath(dataName, fileName);

View File

@ -5,6 +5,8 @@ import { setInterval } from 'node:timers';
class WsTools { class WsTools {
/** /**
* *
* @param socket
* @param data
*/ */
static async send(socket: WebSocket, data: unknown): Promise<boolean> { static async send(socket: WebSocket, data: unknown): Promise<boolean> {
if (socket.readyState !== WebSocket.OPEN) return false; if (socket.readyState !== WebSocket.OPEN) return false;
@ -18,6 +20,7 @@ class WsTools {
/** /**
* *
* @param data
*/ */
static parseMessage<T>(data: WebSocket.RawData): T | null { static parseMessage<T>(data: WebSocket.RawData): T | null {
try { try {
@ -30,6 +33,8 @@ class WsTools {
/** /**
* *
* @param socket
* @param interval
*/ */
static setUpHeartbeat(socket: WebSocket, interval = 30000): NodeJS.Timeout { static setUpHeartbeat(socket: WebSocket, interval = 30000): NodeJS.Timeout {
const heartbeat = () => { const heartbeat = () => {