diff --git a/websocket/index.js b/websocket/index.js index 9f52464..caccacf 100644 --- a/websocket/index.js +++ b/websocket/index.js @@ -1,5 +1,6 @@ const WebSocket = require("ws"); const url = require("url"); +const db = require("../db/mysql"); const { verifyToken } = require("../utils/jwt"); @@ -77,6 +78,9 @@ function handleMessage(username, data) { case "sendMessage": handleSendMessage(username, data); break; + case "ack": + handleAck(data); + break; default: console.log("未知消息类型:", data.type); @@ -85,14 +89,55 @@ function handleMessage(username, data) { // 处理发送消息 function handleSendMessage(senderName, data) { + const messageId = data.messageId; const receiverName = data.receiverName; const content = data.content; - const createdAt = data.createdAt; console.log( `${senderName} → ${receiverName}:${content}` ); + const sql = ` + INSERT INTO messages + (message_id, sender_name, receiver_name, content) + VALUES (?, ?, ?, ?) + `; + + db.query(sql, [ + messageId, + senderName, + receiverName, + content + ], (error, result) => { + if (error) { + console.error(error); + + const senderWs = getConnection(senderName); + if (senderWs) { + senderWs.send( + JSON.stringify({ + type: "sendError", + messageId: messageId, + message: "消息保存失败" + }) + ); + + } + return; + } + }); + + // 告诉发送者:服务器已经保存成功 + const senderWs = getConnection(senderName); + if (senderWs) { + senderWs.send( + JSON.stringify({ + type: "sendSuccess", + messageId: messageId + }) + ); + } + // 找到接收者的WebSocket const receiverWs = getConnection(receiverName); if (!receiverWs) { @@ -105,13 +150,46 @@ function handleSendMessage(senderName, data) { JSON.stringify({ type: "newMessage", message: { + messageId, senderName, receiverName, - content, - createdAt + content }, }) ); } +function handleAck(receiverName, data) { + const messageId = data.messageId; + const senderName = data.senderName; + + console.log( + `${receiverName} 收到消息 ${messageId},发送 ACK` + ); + + // 找到原发送者 + const senderWs = getConnection(senderName); + + if (!senderWs) { + console.log( + `${senderName} 当前不在线` + ); + return; + } + + // 把 ACK 转给原发送者 + senderWs.send( + JSON.stringify({ + type: "ack", + messageId: + messageId + }) + ); + + console.log( + `ACK ${messageId} 已发送给 ${senderName}` + ); +} + + module.exports = initWebSocket; \ No newline at end of file