mirror of
https://github.com/crystelf/crystelf-core.git
synced 2025-07-04 14:49:19 +00:00
完善注释
This commit is contained in:
parent
48a125d51c
commit
964cc48993
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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) => {
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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 = () => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user