|
|
- package messaging
-
- import (
- "github.com/kataras/neffos"
- "sync"
- )
-
- type Contexts struct {
- locker sync.RWMutex
- connectionOfContexts map[string]*neffos.NSConn
- connectionId2ContextID map[string]string
- callbacksOfAdd []func(string, *neffos.NSConn)
- callbacksOfRemove []func(string)
- authenticator func(map[string]string) (string, error)
- }
-
- func newContexts() *Contexts {
- return &Contexts{
- connectionOfContexts: make(map[string]*neffos.NSConn, 10),
- connectionId2ContextID: make(map[string]string, 10),
- callbacksOfAdd: make([]func(string, *neffos.NSConn), 0, 10),
- callbacksOfRemove: make([]func(string), 0, 10),
- }
- }
-
- func (contexts *Contexts) add(contextID string, connection *neffos.NSConn) {
- locker.Lock()
- defer locker.Unlock()
- contexts.connectionOfContexts[contextID] = connection
- contexts.connectionId2ContextID[connection.Conn.ID()] = contextID
- for _, callback := range contexts.callbacksOfAdd {
- callback(contextID, connection)
- }
- }
-
- func (contexts *Contexts) remove(connectionId string) {
- locker.Lock()
- defer locker.Unlock()
- contextID, has := contexts.connectionId2ContextID[connectionId]
- if !has {
- return
- }
- delete(contexts.connectionId2ContextID, connectionId)
- delete(contexts.connectionOfContexts, contextID)
- for _, callback := range contexts.callbacksOfRemove {
- callback(contextID)
- }
- }
-
- func (contexts *Contexts) Get(contextID string) *neffos.NSConn {
- locker.RLock()
- defer locker.RUnlock()
- connection, ok := contexts.connectionOfContexts[contextID]
- if ok {
- return connection
- } else {
- return nil
- }
- }
-
- func (contexts *Contexts) OnAdd(callback func(string, *neffos.NSConn)) {
- locker.Lock()
- defer locker.Unlock()
- contexts.callbacksOfAdd = append(contexts.callbacksOfAdd, callback)
- }
-
- func (contexts *Contexts) OnRemove(callback func(string)) {
- locker.Lock()
- defer locker.Unlock()
- contexts.callbacksOfRemove = append(contexts.callbacksOfRemove, callback)
- }
-
- func (contexts *Contexts) SetAuthenticator(authenticator func(map[string]string) (string, error)) {
- contexts.authenticator = authenticator
- }
|