package main import ( "encoding/binary" "fmt" "io" "net" ) type GrainHandler struct { listener net.Listener pool *GrainLocalPool } func (h *GrainHandler) GetState(id CartId, reply *Grain) error { grain, err := h.pool.GetGrain(id) if err != nil { return err } *reply = grain return nil } func NewGrainHandler(pool *GrainLocalPool, listen string) (*GrainHandler, error) { handler := &GrainHandler{ pool: pool, } l, err := net.Listen("tcp", listen) handler.listener = l return handler, err } func (h *GrainHandler) Serve() { for { conn, err := h.listener.Accept() if err != nil { fmt.Println("Error accepting connection:", err) continue } go h.handleClient(conn) } } func (h *GrainHandler) handleClient(conn net.Conn) { var err error fmt.Println("Handling client connection") defer conn.Close() var packet CartPacket for { for { err = binary.Read(conn, binary.LittleEndian, &packet) if err != nil { if err == io.EOF { break } fmt.Println("Error in connection:", err) } if packet.Version != 2 { fmt.Printf("Unknown version %d", packet.Version) break } switch packet.MessageType { case RemoteHandleMessage: var msg Message err = ReadMessage(conn, &msg) if err != nil { fmt.Println("Error reading message:", err) } data, err := h.pool.Process(packet.Id, msg) if err != nil { fmt.Println("Error handling message:", err) } SendRawResponse(conn, data) case RemoteGetState: data, err := h.pool.Get(packet.Id) if err != nil { fmt.Println("Error getting grain:", err) } SendRawResponse(conn, data) } } } }