|
|
- 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
- }
|