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