| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- // noinspection JSAccessibilityCheck,JSUnresolvedReference
- import { Server as Engine } from "engine.io"
- import { Server } from "socket.io"
- import * as middlewares from "../socketio/middlewares"
- import * as handlers from "../socketio/handlers"
- const LOG_CONNECTIONS = false
- const LOG_EVENTS = false
- export default defineNitroPlugin((nitroApp) => {
- const engine = new Engine()
- const io = new Server({
- serveClient: false
- // connectionStateRecovery: {
- // maxDisconnectionDuration: 2 * 60 * 1000,
- // skipMiddlewares: false
- // }
- })
- io.bind(engine)
- // register middlewares
- _forOwn(middlewares, (middleware) => io.use(middleware))
- // expose server instance
- // noinspection JSUndefinedPropertyAssignment
- nitroApp.hooks.hook("request", (event) => (event.context.io = io))
- io.on("connection", async (socket) => {
- // register handlers
- _forOwn(handlers, (handler) => handler(io, socket))
- if (LOG_CONNECTIONS) {
- // log connection
- console.log(
- "[server socketio] [connection]",
- socket.id,
- socket.data.user?.username ?? "unauthenticated"
- )
- console.log(
- "[server socketio] [# connected]",
- io.of("/").sockets.size
- )
- socket.on("disconnect", (reason) => {
- console.log(
- "[server socketio] [disconnect]",
- reason,
- socket.id,
- socket.data.user?.username ?? "unauthenticated"
- )
- })
- }
- if (LOG_EVENTS) {
- // log all incoming events
- socket.onAny((eventName, ...args) =>
- console.log("[server socketio] [incoming]", eventName, ..._initial(args))
- )
- // log all outgoing events
- socket.onAnyOutgoing((eventName, ...args) =>
- console.log("[server socketio] [outgoing]", eventName, args)
- )
- }
- })
- nitroApp.router.use(
- "/socket.io/",
- defineEventHandler({
- handler: (event) => {
- engine.handleRequest(event.node.req, event.node.res)
- event._handled = true
- },
- websocket: {
- open(peer) {
- engine.prepare(peer._internal.nodeReq)
- engine.onWebSocket(
- peer._internal.nodeReq,
- peer._internal.nodeReq.socket,
- peer.websocket
- )
- }
- }
- })
- )
- })
|