/** * socket.io * 自动绑定io文件夹内js文件 * 参考文档: * 1.https://socket.io/docs/v4/server-api * 2.https://juejin.cn/post/6844903810050031630 */ const config = require("./config") const path = require('path') const uuid = require("uuid"); module.exports = async (app) => { const parameter = app.parameter const server = require('http').createServer(app.callback()); const io = require('socket.io')(server, {cors: true}); // let leaveRoom = () => { // } let list = await app.load(config.path) app.io = io app.alias["$io"] = app.io //等待所有插件载入完成后 app.willReadyList.push(async () => { //默认命名空间 io.on('connection', socket => { //通知客户端已连接 socket.emit('open', { msg : "ok", data: { id: socket.id } }); console.log('连接=>', "id:" + socket.id); //监听disconnect事件 // socket.on('disconnect', (eventName, callback) => { // console.log('断开=X', "id:" + socket.id) // leaveRoom(socket, {msg: '', onname: 'leaveRoom', callback}) // }) for (let el of list) { //空间名称 // const namespace = path.basename(path.resolve(el.parse.dir, '..')) //事件名称 const onname = el.parse.name // if (onname === 'leaveRoom') { // //离开房间处理 // leaveRoom = (socket, {msg, onname, callback}) => el.res.fun(socket, {msg, onname, callback}) // } socket.on(onname, (msg, callback, anotherSocketId) => { console.log('anotherSocketId', socket.id); const validate = parameter.validate(el.res.params, msg); if (validate) { socket.emit('error', { event: onname, res : app.res.error(validate, "参数验证不通过", 204) }) console.error('socket', socket.id, msg, onname, app.res.error(validate, "参数验证不通过", 204)); // ctx.body = app.res.error(validate, "参数验证不通过", 204) } else { el.res.fun(socket, {msg, onname, callback}) } }) } }); }) //覆盖启动方法 app.startServer = () => { // 监听端口 const port = (process.env.NODE_ENV === 'test' && config.test_port) || config.port || 3000 const baseURL = "http://127.0.0.1" app.config.port = port app.config.baseURL = baseURL app.server = server.listen(port, () => { console.log(`http 服务: ${baseURL}:${port}`); console.log(`socket 服务: ${baseURL}:${port}`); }); } }