高级排程
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. "github.com/kataras/neffos"
  4. "sync"
  5. )
  6. type Contexts struct {
  7. locker sync.RWMutex
  8. connectionOfContexts map[string]*neffos.NSConn
  9. connectionId2ContextID map[string]string
  10. callbacksOfAdd []func(string, *neffos.NSConn)
  11. callbacksOfRemove []func(string)
  12. authenticator func(map[string]string) (string, error)
  13. }
  14. func newContexts() *Contexts {
  15. return &Contexts{
  16. connectionOfContexts: make(map[string]*neffos.NSConn, 10),
  17. connectionId2ContextID: make(map[string]string, 10),
  18. callbacksOfAdd: make([]func(string, *neffos.NSConn), 0, 10),
  19. callbacksOfRemove: make([]func(string), 0, 10),
  20. }
  21. }
  22. func (contexts *Contexts) add(contextID string, connection *neffos.NSConn) {
  23. locker.Lock()
  24. defer locker.Unlock()
  25. contexts.connectionOfContexts[contextID] = connection
  26. contexts.connectionId2ContextID[connection.Conn.ID()] = contextID
  27. for _, callback := range contexts.callbacksOfAdd {
  28. callback(contextID, connection)
  29. }
  30. }
  31. func (contexts *Contexts) remove(connectionId string) {
  32. locker.Lock()
  33. defer locker.Unlock()
  34. contextID, has := contexts.connectionId2ContextID[connectionId]
  35. if !has {
  36. return
  37. }
  38. delete(contexts.connectionId2ContextID, connectionId)
  39. delete(contexts.connectionOfContexts, contextID)
  40. for _, callback := range contexts.callbacksOfRemove {
  41. callback(contextID)
  42. }
  43. }
  44. func (contexts *Contexts) Get(contextID string) *neffos.NSConn {
  45. locker.RLock()
  46. defer locker.RUnlock()
  47. connection, ok := contexts.connectionOfContexts[contextID]
  48. if ok {
  49. return connection
  50. } else {
  51. return nil
  52. }
  53. }
  54. func (contexts *Contexts) OnAdd(callback func(string, *neffos.NSConn)) {
  55. locker.Lock()
  56. defer locker.Unlock()
  57. contexts.callbacksOfAdd = append(contexts.callbacksOfAdd, callback)
  58. }
  59. func (contexts *Contexts) OnRemove(callback func(string)) {
  60. locker.Lock()
  61. defer locker.Unlock()
  62. contexts.callbacksOfRemove = append(contexts.callbacksOfRemove, callback)
  63. }
  64. func (contexts *Contexts) SetAuthenticator(authenticator func(map[string]string) (string, error)) {
  65. contexts.authenticator = authenticator
  66. }