84 lines
2.1 KiB
JavaScript
84 lines
2.1 KiB
JavaScript
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 };
|