socketio.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // noinspection JSAccessibilityCheck,JSUndefinedPropertyAssignment,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. nitroApp.hooks.hook("request", (event) => (event.context.io = io))
  22. io.on("connection", async (socket) => {
  23. // register handlers
  24. _forOwn(handlers, (handler) => handler(io, socket))
  25. if (LOG_CONNECTIONS) {
  26. // log connection
  27. console.log(
  28. "[server socketio] [connection]",
  29. socket.id,
  30. // socket.data.user?.username ?? "unauthenticated"
  31. )
  32. console.log(
  33. "[server socketio] [# connected]",
  34. io.of("/").sockets.size
  35. )
  36. socket.on("disconnect", (reason) => {
  37. console.log(
  38. "[server socketio] [disconnect]",
  39. reason,
  40. socket.id,
  41. // socket.data.user?.username ?? "unauthenticated"
  42. )
  43. })
  44. }
  45. if (LOG_EVENTS) {
  46. // log all incoming events
  47. socket.onAny((eventName, ...args) =>
  48. console.log("[server socketio] [incoming]", eventName, ..._initial(args))
  49. )
  50. // log all outgoing events
  51. socket.onAnyOutgoing((eventName, ...args) =>
  52. console.log("[server socketio] [outgoing]", eventName, args)
  53. )
  54. }
  55. })
  56. nitroApp.router.use(
  57. "/socket.io/",
  58. defineEventHandler({
  59. handler: (event) => {
  60. engine.handleRequest(event.node.req, event.node.res)
  61. event._handled = true
  62. },
  63. websocket: {
  64. open(peer) {
  65. engine.prepare(peer._internal.nodeReq)
  66. engine.onWebSocket(
  67. peer._internal.nodeReq,
  68. peer._internal.nodeReq.socket,
  69. peer.websocket
  70. )
  71. }
  72. }
  73. })
  74. )
  75. })