广汽安道拓Acura项目MES后台
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

  1. package messaging
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. gorilla_websocket "github.com/gorilla/websocket"
  6. "github.com/kataras/iris/v12/core/router"
  7. "github.com/kataras/iris/v12/websocket"
  8. "github.com/kataras/neffos"
  9. "github.com/kataras/neffos/gorilla"
  10. "net/http"
  11. "sync"
  12. )
  13. var locker sync.RWMutex
  14. var namespaces = make(neffos.Namespaces, 10)
  15. func wrapError(errorText string) []byte {
  16. if errorText == "" {
  17. jsonText, _ := json.Marshal(map[string]string{})
  18. return jsonText
  19. } else {
  20. jsonText, _ := json.Marshal(map[string]string{"err": errorText})
  21. return jsonText
  22. }
  23. }
  24. func BindRoutes(party router.Party) {
  25. party.Get("/ws", websocket.Handler(neffos.New(gorilla.Upgrader(gorilla_websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }}), namespaces)))
  26. }
  27. func Register(namespaceName string, eventMapping neffos.Events) *Contexts {
  28. contexts := newContexts()
  29. eventMapping["_OnNamespaceConnected"] = func(connection *neffos.NSConn, message neffos.Message) error {
  30. fmt.Println("_OnNamespaceConnected")
  31. return nil
  32. }
  33. eventMapping["_OnNamespaceDisconnect"] = func(connection *neffos.NSConn, message neffos.Message) error {
  34. fmt.Println("_OnNamespaceConnected")
  35. contexts.remove(connection.Conn.ID())
  36. return nil
  37. }
  38. eventMapping["login"] = func(connection *neffos.NSConn, message neffos.Message) error {
  39. var headers map[string]string
  40. if err := json.Unmarshal(message.Body, &headers); err != nil {
  41. connection.Emit("onLogin", wrapError(err.Error()))
  42. return nil
  43. }
  44. token, ok := headers["token"]
  45. if !ok {
  46. connection.Emit("onLogin", wrapError("未找到token!"))
  47. return nil
  48. }
  49. delete(headers, "token")
  50. fmt.Println(token)
  51. contextID := connection.Conn.ID() // Todo 需要根据 token 解析出 user id
  52. if contexts.authenticator != nil {
  53. newContextID, err := contexts.authenticator(headers)
  54. if err != nil {
  55. connection.Emit("onLogin", wrapError(err.Error()))
  56. return nil
  57. }
  58. if newContextID != "" {
  59. contextID = newContextID
  60. }
  61. }
  62. contexts.add(contextID, connection)
  63. connection.Emit("onLogin", wrapError(""))
  64. return nil
  65. }
  66. namespaces[namespaceName] = eventMapping
  67. return contexts
  68. }