package transport import ( "encoding/json" "fmt" ) // ExtractMessage extracts a message from a byte buffer with length prefix format // Format: "length\nmessage_data" func ExtractMessage(buffer []byte) (*Message, []byte, error) { // Look for length prefix (format: "length\nmessage_data") newlineIndex := -1 for i, b := range buffer { if b == '\n' { newlineIndex = i break } } if newlineIndex == -1 { return nil, buffer, nil // No complete length prefix yet } // Parse length lengthStr := string(buffer[:newlineIndex]) var messageLength int if _, err := fmt.Sscanf(lengthStr, "%d", &messageLength); err != nil { return nil, nil, fmt.Errorf("invalid length prefix: %s", lengthStr) } // Check if we have the complete message messageStart := newlineIndex + 1 messageEnd := messageStart + messageLength if len(buffer) < messageEnd { return nil, buffer, nil // Incomplete message } // Extract and parse message messageData := buffer[messageStart:messageEnd] var msg Message if err := json.Unmarshal(messageData, &msg); err != nil { return nil, nil, fmt.Errorf("failed to unmarshal message: %w", err) } // Return message and remaining buffer remaining := buffer[messageEnd:] return &msg, remaining, nil }