func processConnection(s *Server, connection network.Connection, session string) { user, err := s.api.GetUser(session) if user == nil || err != nil { return } complete := false notify := make(chan bool, 2) output := make(chan protocol.Message, 3) go func() { log.Printf("write run for session: %s\n", session) for message := range output { if protocol.GameCompleteMessageType == message.GetType() { complete = true break } // rewrite empty message.SetSession(session) err := connection.WriteMessage(message) if err != nil && connection.IsCloseError(err) { break } if err != nil { log.Printf("websocket write: %v", err) } } log.Printf("write done for session: %s\n", session) notify <- true }() controller := NewGameController(user.Name, s, output) go func() { log.Printf("read run for session: %s\n", session) for { err := controller.process(connection, session) if complete { break } if controller.HaveLogicError() { break } if err != nil && connection.IsCloseError(err) { break } if err != nil { log.Printf("websocket read: %v", err) } } log.Printf("read done for session: %s\n", session) notify <- true }() <-notify controller.Clear() connection.Close() close(output) }