improve ws handling & ws authentification

This commit is contained in:
srgooglo 2022-10-28 22:07:11 +00:00
parent 966bbdf419
commit af52c21a34

View File

@ -3,6 +3,49 @@ import config from "config"
import { Bridge } from "linebridge/dist/client" import { Bridge } from "linebridge/dist/client"
import { Session } from "models" import { Session } from "models"
function generateWSFunctionHandler(socket, type = "listen") {
if (!socket) {
return null
}
return (to, fn) => {
if (typeof to === "undefined") {
console.error("handleWSListener: to must be defined")
return false
}
if (typeof fn !== "function") {
console.error("handleWSListener: fn must be function")
return false
}
let ns = "main"
let event = null
if (typeof to === "string") {
event = to
} else if (typeof to === "object") {
ns = to.ns
event = to.event
}
switch (type) {
case "listen": {
return socket.sockets[ns].on(event, async (...context) => {
return await fn(...context)
})
}
case "unlisten": {
return socket.sockets[ns].removeListener(event)
}
default: {
return null
}
}
}
}
export default class ApiCore extends Core { export default class ApiCore extends Core {
constructor(props) { constructor(props) {
super(props) super(props)
@ -190,6 +233,7 @@ export default class ApiCore extends Core {
mainWSSocket.on("connect", () => { mainWSSocket.on("connect", () => {
this.ctx.eventBus.emit(`api.ws.main.connect`) this.ctx.eventBus.emit(`api.ws.main.connect`)
this.autenticateWS(mainWSSocket)
}) })
mainWSSocket.on("disconnect", (...context) => { mainWSSocket.on("disconnect", (...context) => {
@ -201,62 +245,20 @@ export default class ApiCore extends Core {
}) })
// generate functions // generate functions
bridge.listenEvent = this.generateMainWSEventListener(bridge.wsInterface) bridge.listenEvent = generateWSFunctionHandler(bridge.wsInterface, "listen")
bridge.unlistenEvent = this.generateMainWSEventUnlistener(bridge.wsInterface) bridge.unlistenEvent = generateWSFunctionHandler(bridge.wsInterface, "unlisten")
// return bridge // return bridge
return bridge return bridge
} }
generateMainWSEventListener(obj) { autenticateWS = async (socket) => {
return (to, fn) => { const token = await Session.token
if (typeof to === "undefined") {
console.error("handleWSListener: to must be defined")
return false
}
if (typeof fn !== "function") {
console.error("handleWSListener: fn must be function")
return false
}
let ns = "main" if (token) {
let event = null socket.emit("authenticate", {
token,
if (typeof to === "string") {
event = to
} else if (typeof to === "object") {
ns = to.ns
event = to.event
}
return obj.sockets[ns].on(event, async (...context) => {
return await fn(...context)
}) })
} }
} }
generateMainWSEventUnlistener(obj) {
return (to, fn) => {
if (typeof to === "undefined") {
console.error("handleWSListener: to must be defined")
return false
}
if (typeof fn !== "function") {
console.error("handleWSListener: fn must be function")
return false
}
let ns = "main"
let event = null
if (typeof to === "string") {
event = to
} else if (typeof to === "object") {
ns = to.ns
event = to.event
}
return obj.sockets[ns].removeListener(event, fn)
}
}
} }