package main import ( "bufio" "log" "net" "runtime/debug" "badat.dev/maeqtt/v2/mqtt/packets" "badat.dev/maeqtt/v2/session" ) func main() { listen_addr := ":1883" listener, err := net.Listen("tcp", listen_addr) if err != nil { log.Fatal(err) } for { conn, err := listener.Accept() if err != nil { log.Println("Failed accepting connection ", err) } go handleConnection(conn) } } func handleConnection(con net.Conn) { defer handlePanic(con) reader := bufio.NewReader(con) packet, err := packets.ReadPacket(reader) if err != nil { log.Println("Error reading packet ", err) return } connect, isConn := (*packet).(packets.ConnectPacket) if !isConn { log.Println("Didn't recieve a connect packet") err := packets.DisconnectPacket{ ReasonCode: packets.DisconnectReasonCodeProtocolError, }.Write(con) if err != nil { log.Println("Failed to disconnect after not recieving a connect packet", err) } return } conn := session.NewConnection(connect, con) sess := session.NewSession(&conn, connect) sess.HandlerLoop() } func handlePanic(con net.Conn) { if r := recover(); r != nil { log.Println("Recovering from panic:", r) log.Println("Stack Trace:") debug.PrintStack() err := packets.DisconnectPacket{ ReasonCode: packets.DisconnectReasonCodeImplErorr, }.Write(con) if err != nil { log.Println("Failed to send a disconnect packet after recovering from panic", err) } } }