server.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import Connect from 'connect'
  2. import { ServerResponse } from 'node:http';
  3. import { parse } from 'cookie'
  4. interface Massage {
  5. type: string;
  6. value: string;
  7. time: number;
  8. }
  9. let sessionList: {[session: string]: Set<ServerResponse<Connect.IncomingMessage>>} = {}
  10. export default async function SseMid(req: Connect.IncomingMessage, res: ServerResponse<Connect.IncomingMessage>, next: Connect.NextFunction) {
  11. const BaseUrl = process.env.BASE_URL
  12. // 检查session_id
  13. let session_id: string | undefined = undefined
  14. const cookies = parse(req.headers.cookie ?? '')
  15. if (!cookies.session_id) {
  16. session_id = crypto.randomUUID()
  17. res.setHeader('Set-Cookie', `session_id=${session_id}; HttpOnly; Path=/`)
  18. } else {
  19. session_id = cookies.session_id
  20. }
  21. // 处理SSE
  22. if (req.url === BaseUrl + 'api/sse') {
  23. console.log(`recv SSE ${req.url}`)
  24. res.writeHead(200, {
  25. 'Content-Type': 'text/event-stream',
  26. 'Cache-Control': 'no-cache',
  27. Connection: 'keep-alive',
  28. })
  29. const interval = setInterval(() => {
  30. const msg = {
  31. type: 'pending',
  32. value: session_id,
  33. time: Date.now()
  34. }
  35. res.write(`data: ${JSON.stringify(msg)}\n\n`)
  36. }, 60 * 1000)
  37. req.on('close', () => {
  38. clearInterval(interval)
  39. res.end()
  40. if (sessionList[session_id]) {
  41. sessionList[session_id].delete(res)
  42. }
  43. })
  44. // 插入res
  45. if (!sessionList[session_id]) {
  46. sessionList[session_id] = new Set<ServerResponse<Connect.IncomingMessage>>
  47. }
  48. sessionList[session_id].add(res)
  49. return
  50. }
  51. // 继续执行下一个中间件
  52. await next();
  53. }
  54. export function sendReLogin(session_id: string): boolean {
  55. if (!sessionList[session_id]) return false
  56. console.log("send relogin: ", session_id)
  57. sessionList[session_id].forEach(res => {
  58. const msg: Massage = {
  59. type: 'command',
  60. value: 'Re-login',
  61. time: Date.now()
  62. }
  63. res.write(`data: ${JSON.stringify(msg)}\n\n`)
  64. });
  65. return true
  66. }