You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

75 lines
2.1 KiB

package messaging
import (
"encoding/json"
"fmt"
gorilla_websocket "github.com/gorilla/websocket"
"github.com/kataras/iris/v12/core/router"
"github.com/kataras/iris/v12/websocket"
"github.com/kataras/neffos"
"github.com/kataras/neffos/gorilla"
"net/http"
"sync"
)
var locker sync.RWMutex
var namespaces = make(neffos.Namespaces, 10)
func wrapError(errorText string) []byte {
if errorText == "" {
jsonText, _ := json.Marshal(map[string]string{})
return jsonText
} else {
jsonText, _ := json.Marshal(map[string]string{"err": errorText})
return jsonText
}
}
func BindRoutes(party router.Party) {
party.Get("/ws", websocket.Handler(neffos.New(gorilla.Upgrader(gorilla_websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }}), namespaces)))
}
func Register(namespaceName string, eventMapping neffos.Events) *Contexts {
contexts := newContexts()
eventMapping["_OnNamespaceConnected"] = func(connection *neffos.NSConn, message neffos.Message) error {
fmt.Println("_OnNamespaceConnected")
return nil
}
eventMapping["_OnNamespaceDisconnect"] = func(connection *neffos.NSConn, message neffos.Message) error {
fmt.Println("_OnNamespaceConnected")
contexts.remove(connection.Conn.ID())
return nil
}
eventMapping["login"] = func(connection *neffos.NSConn, message neffos.Message) error {
var headers map[string]string
if err := json.Unmarshal(message.Body, &headers); err != nil {
connection.Emit("onLogin", wrapError(err.Error()))
return nil
}
token, ok := headers["token"]
if !ok {
connection.Emit("onLogin", wrapError("未找到token!"))
return nil
}
delete(headers, "token")
fmt.Println(token)
contextID := connection.Conn.ID() // Todo 需要根据 token 解析出 user id
if contexts.authenticator != nil {
newContextID, err := contexts.authenticator(headers)
if err != nil {
connection.Emit("onLogin", wrapError(err.Error()))
return nil
}
if newContextID != "" {
contextID = newContextID
}
}
contexts.add(contextID, connection)
connection.Emit("onLogin", wrapError(""))
return nil
}
namespaces[namespaceName] = eventMapping
return contexts
}