server.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 + 'sse') {
  23. res.writeHead(200, {
  24. 'Content-Type': 'text/event-stream',
  25. 'Cache-Control': 'no-cache',
  26. Connection: 'keep-alive',
  27. })
  28. const interval = setInterval(() => {
  29. const msg = {
  30. type: 'pending',
  31. value: session_id,
  32. time: Date.now()
  33. }
  34. res.write(`data: ${JSON.stringify(msg)}\n\n`)
  35. }, 60 * 1000)
  36. req.on('close', () => {
  37. clearInterval(interval)
  38. res.end()
  39. if (sessionList[session_id]) {
  40. sessionList[session_id].delete(res)
  41. }
  42. })
  43. // 插入res
  44. if (!sessionList[session_id]) {
  45. sessionList[session_id] = new Set<ServerResponse<Connect.IncomingMessage>>
  46. }
  47. sessionList[session_id].add(res)
  48. return
  49. }
  50. // 继续执行下一个中间件
  51. next();
  52. }
  53. export function sendReLogin(session_id: string): boolean {
  54. if (!sessionList[session_id]) return false
  55. console.log("send relogin: ", session_id)
  56. sessionList[session_id].forEach(res => {
  57. const msg: Massage = {
  58. type: 'command',
  59. value: 'Re-login',
  60. time: Date.now()
  61. }
  62. res.write(`data: ${JSON.stringify(msg)}\n\n`)
  63. });
  64. return true
  65. }