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 }