Files
2022-07-07 22:16:39 +08:00

83 lines
2.4 KiB
JavaScript

/**
* 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}`);
});
}
}