func onNewSocketConnection(bs backend.BackendSocket) { // Close the socket if incomming connections should be blocked. if block { bs.Close() return } // Create a new socket value. // The goroutines are started automatically. newSocket(bs) }
func (s *Server) handleOnNewSocketConnection(bs backend.BackendSocket) { // Close the socket if incomming connections should be blocked. if s.IsBlocked() { bs.Close() return } // Create a new socket value. // The goroutines are started automatically. newSocket(s, bs) }
// newSocket creates a new socket and initializes it. func newSocket(bs backend.BackendSocket) *Socket { // Create a new socket value. s := &Socket{ bs: bs, writeChan: bs.WriteChan(), readChan: bs.ReadChan(), finalReadChan: make(chan string, readChanBuffer), isClosedChan: make(chan struct{}), pingTimer: time.NewTimer(pingPeriod), pingTimeout: time.NewTimer(pingResponseTimeout), } // Set the event functions. bs.OnClose(s.onClose) // Stop the timeout again. It will be started by the ping timer. s.pingTimeout.Stop() // Start the loops and handlers in new goroutines. go s.pingTimeoutHandler() go s.readLoop() go s.pingLoop() return s }
// newSocket creates a new socket and initializes it. func newSocket(bs backend.BackendSocket) *Socket { // Create a new socket value. s := &Socket{ bs: bs, writeChan: bs.WriteChan(), readChan: bs.ReadChan(), // Set a dummy function to not always // check if the method is not set. onRead: func(string) {}, pingTimer: time.NewTimer(pingPeriod), pingTimeout: time.NewTimer(pingResponseTimeout), isClosedChan: make(chan struct{}), } // Set the event functions. bs.OnClose(s.onClose) // Stop the timeout again. It will be started by the ping timer. s.pingTimeout.Stop() // Start the loops and handlers in new goroutines. go s.pingTimeoutHandler() go s.readLoop() go s.pingLoop() return s }
// newSocket creates a new socket and initializes it. func newSocket(bs backend.BackendSocket) *Socket { // Create a new socket value. s := &Socket{ id: utils.UUID(), bs: bs, channels: newChannels(), writeChan: bs.WriteChan(), readChan: bs.ReadChan(), isClosedChan: make(chan struct{}), pingTimer: time.NewTimer(pingPeriod), pingTimeout: time.NewTimer(pingResponseTimeout), } // Create the main channel. s.mainChannel = s.Channel(mainChannelName) // Set the event functions. bs.OnClose(s.onClose) // Stop the timeout again. It will be started by the ping timer. s.pingTimeout.Stop() // Start the loops and handlers in new goroutines. go s.pingTimeoutHandler() go s.readLoop() go s.pingLoop() return s }
func onNewSocketConnection(bs backend.BackendSocket) { // Close the socket if incomming connections should be blocked. if block { bs.Close() return } // Create a new socket value. s := newSocket(bs) func() { // Recover panics and log the error. defer func() { if e := recover(); e != nil { log.L.Errorf("glue: panic while calling on new socket function: %v\n%s", e, debug.Stack()) } }() // Trigger the on new socket event function. onNewSocket(s) }() }
// newSocket creates a new socket and initializes it. func newSocket(server *Server, bs backend.BackendSocket) *Socket { // Create a new socket value. s := &Socket{ server: server, bs: bs, id: utils.RandomString(socketIDLength), channels: newChannels(), writeChan: bs.WriteChan(), readChan: bs.ReadChan(), isClosedChan: make(chan struct{}), pingTimer: time.NewTimer(pingPeriod), pingTimeout: time.NewTimer(pingResponseTimeout), } // Create the main channel. s.mainChannel = s.Channel(mainChannelName) // Set the event functions. bs.OnClose(s.onClose) // Stop the timeout again. It will be started by the ping timer. s.pingTimeout.Stop() // Add the new socket to the active sockets map. // If the ID is already present, then generate a new one. func() { // Lock the mutex. s.server.socketsMutex.Lock() defer s.server.socketsMutex.Unlock() // Be sure that the ID is unique. for { if _, ok := s.server.sockets[s.id]; !ok { break } s.id = utils.RandomString(socketIDLength) } // Add the socket to the map. s.server.sockets[s.id] = s }() // Start the loops and handlers in new goroutines. go s.pingTimeoutHandler() go s.readLoop() go s.pingLoop() return s }