socketio.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // noinspection JSAccessibilityCheck,JSUnresolvedReference
  2. import { Server as Engine } from "engine.io"
  3. import { Server } from "socket.io"
  4. import * as middlewares from "../socketio/middlewares"
  5. import * as handlers from "../socketio/handlers"
  6. const LOG_CONNECTIONS = false
  7. const LOG_EVENTS = false
  8. export default defineNitroPlugin((nitroApp) => {
  9. const engine = new Engine()
  10. const io = new Server({
  11. serveClient: false
  12. // connectionStateRecovery: {
  13. // maxDisconnectionDuration: 2 * 60 * 1000,
  14. // skipMiddlewares: false
  15. // }
  16. })
  17. io.bind(engine)
  18. // register middlewares
  19. _forOwn(middlewares, (middleware) => io.use(middleware))
  20. // expose server instance
  21. // noinspection JSUndefinedPropertyAssignment
  22. nitroApp.hooks.hook("request", (event) => (event.context.io = io))
  23. io.on("connection", async (socket) => {
  24. // register handlers
  25. _forOwn(handlers, (handler) => handler(io, socket))
  26. if (LOG_CONNECTIONS) {
  27. // log connection
  28. console.log(
  29. "[server socketio] [connection]",
  30. socket.id,
  31. socket.data.user?.username ?? "unauthenticated"
  32. )
  33. console.log(
  34. "[server socketio] [# connected]",
  35. io.of("/").sockets.size
  36. )
  37. socket.on("disconnect", (reason) => {
  38. console.log(
  39. "[server socketio] [disconnect]",
  40. reason,
  41. socket.id,
  42. socket.data.user?.username ?? "unauthenticated"
  43. )
  44. })
  45. }
  46. if (LOG_EVENTS) {
  47. // log all incoming events
  48. socket.onAny((eventName, ...args) =>
  49. console.log("[server socketio] [incoming]", eventName, ..._initial(args))
  50. )
  51. // log all outgoing events
  52. socket.onAnyOutgoing((eventName, ...args) =>
  53. console.log("[server socketio] [outgoing]", eventName, args)
  54. )
  55. }
  56. })
  57. nitroApp.router.use(
  58. "/socket.io/",
  59. defineEventHandler({
  60. handler: (event) => {
  61. engine.handleRequest(event.node.req, event.node.res)
  62. event._handled = true
  63. },
  64. websocket: {
  65. open(peer) {
  66. engine.prepare(peer._internal.nodeReq)
  67. engine.onWebSocket(
  68. peer._internal.nodeReq,
  69. peer._internal.nodeReq.socket,
  70. peer.websocket
  71. )
  72. }
  73. }
  74. })
  75. )
  76. })