first commit
This commit is contained in:
83
src/wsHandler.js
Normal file
83
src/wsHandler.js
Normal file
@@ -0,0 +1,83 @@
|
||||
const jwt = require("jsonwebtoken");
|
||||
const config = require("./config");
|
||||
const store = require("./store");
|
||||
const { streamDreamInterpretation } = require("./services/deepseek");
|
||||
|
||||
function handleConnection(ws, req) {
|
||||
// 从 url 参数或 header 中提取 token
|
||||
const url = new URL(req.url, "http://localhost");
|
||||
const token = url.searchParams.get("token") || req.headers["authorization"];
|
||||
|
||||
let userId = null;
|
||||
try {
|
||||
const payload = jwt.verify(token, config.jwtSecret);
|
||||
userId = payload.openid;
|
||||
} catch {
|
||||
ws.send(
|
||||
JSON.stringify({ act: "error", message: "请先登录后再解梦" })
|
||||
);
|
||||
ws.close(4001, "未授权");
|
||||
return;
|
||||
}
|
||||
|
||||
let fullInterpretation = "";
|
||||
|
||||
ws.on("message", async (raw) => {
|
||||
let msg;
|
||||
try {
|
||||
msg = JSON.parse(raw.toString());
|
||||
} catch {
|
||||
ws.send(JSON.stringify({ act: "error", message: "消息格式错误" }));
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.act !== "start_generate") return;
|
||||
|
||||
const { message: dream, template_name } = msg.payload || {};
|
||||
if (!dream || !dream.trim()) {
|
||||
ws.send(JSON.stringify({ act: "error", message: "请填写梦境内容" }));
|
||||
return;
|
||||
}
|
||||
|
||||
if (template_name !== "jiemeng") {
|
||||
ws.send(JSON.stringify({ act: "error", message: "不支持的模板" }));
|
||||
return;
|
||||
}
|
||||
|
||||
fullInterpretation = "";
|
||||
|
||||
try {
|
||||
for await (const chunk of streamDreamInterpretation(dream.trim())) {
|
||||
fullInterpretation += chunk;
|
||||
ws.send(JSON.stringify({ act: "answer", message: chunk }));
|
||||
}
|
||||
|
||||
const recordId = store.saveRecord(
|
||||
userId,
|
||||
dream.trim(),
|
||||
fullInterpretation
|
||||
);
|
||||
|
||||
ws.send(
|
||||
JSON.stringify({
|
||||
act: "answer_finish",
|
||||
payload: { record_id: recordId },
|
||||
})
|
||||
);
|
||||
} catch (err) {
|
||||
console.error("DeepSeek 调用失败:", err.message);
|
||||
ws.send(
|
||||
JSON.stringify({
|
||||
act: "error",
|
||||
message: "AI 解析服务暂时不可用,请稍后重试",
|
||||
})
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
ws.on("close", () => {
|
||||
// 清理工作(如有需要)
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = { handleConnection };
|
||||
Reference in New Issue
Block a user