5.9 KiB
5.9 KiB
Package Structure
This document explains the organization and responsibilities of all packages in the Hash of Wisdom project.
Directory Structure
/
├── cmd/ # Application entry points
│ ├── server/ # Server application
│ └── client/ # Client application
├── internal/ # Private application packages
│ ├── application/ # Application layer (message handling)
│ ├── config/ # Configuration management
│ ├── lib/ # Shared utilities
│ ├── metrics/ # Prometheus metrics
│ ├── pow/ # Proof-of-Work implementation
│ ├── protocol/ # Binary protocol codec
│ ├── quotes/ # Quote service
│ ├── server/ # TCP server implementation
│ └── service/ # Business logic layer
├── test/ # Integration tests
└── docs/ # Documentation
Package Responsibilities
cmd/server
Entry point for the TCP server application
- Parses command-line flags and configuration
- Initializes all components with dependency injection
- Starts TCP server and metrics endpoints
- Handles graceful shutdown signals
cmd/client
Entry point for the client application
- Command-line interface for connecting to server
- Handles proof-of-work solving on client side
- Manages TCP connection lifecycle
internal/config
Configuration management with cleanenv
- Defines configuration structures with YAML/env tags
- Loads configuration from files and environment variables
- Provides sensible defaults for all settings
- Supports both development and production configurations
internal/lib/sl
Shared logging utilities
- Structured logging helpers for consistent log formatting
- Error attribute helpers for slog integration
internal/metrics
Prometheus metrics collection
- Defines application-specific metrics (requests, errors, duration)
- Provides simple counters and histograms for monitoring
- Integrated at the infrastructure layer (TCP server)
internal/pow
Proof-of-Work implementation
internal/pow/challenge
- Challenge Generation: Creates HMAC-signed stateless challenges
- Verification: Validates solutions against original challenges
- Security: HMAC authentication prevents tampering
- Configuration: Difficulty scaling, TTL management, secrets
internal/pow/solver
- Solution Finding: Brute-force nonce search with SHA-256
- Optimization: Efficient bit counting for difficulty verification
- Client-side: Used by client to solve server challenges
internal/protocol
Binary protocol codec
- Message Types: Challenge requests/responses, solution requests/responses, errors
- Encoding/Decoding: JSON-based message serialization
- Streaming: MessageDecoder for reading from TCP connections
- Validation: Message structure and field validation
- See Protocol Specification for detailed message flow and format
internal/quotes
Quote service implementation
- HTTP Client: Fetches quotes from external APIs using resty
- Interface: Clean abstraction for quote retrieval
- Error Handling: Graceful degradation for network issues
- Timeout Management: Configurable request timeouts
internal/server
TCP server implementation
internal/server/tcp.go
- Connection Management: Accept, handle, cleanup TCP connections
- Protocol Integration: Uses protocol package for message handling
- Security: Connection timeouts, slowloris protection
- Metrics: Request tracking at infrastructure layer
- Lifecycle: Graceful startup/shutdown with context
internal/server/config.go
- Server Configuration: Network settings, timeouts
- Functional Options: Builder pattern for server customization
internal/application
Application layer (message handling and coordination)
- WisdomApplication: Protocol message handler and coordinator
- Message Processing: Handles challenge and solution requests from protocol layer
- Response Generation: Creates appropriate protocol responses
- Service Coordination: Orchestrates calls to business logic layer
- Error Handling: Converts service errors to protocol error responses
internal/service
Business logic layer (core domain services)
- WisdomService: Main business logic coordinator
- Challenge Workflow: Manages challenge generation and validation
- Solution Workflow: Handles solution verification and quote retrieval
- Clean Architecture: Pure business logic, no I/O dependencies
- Testing: Easily mockable interfaces for unit testing
Service Dependencies:
ChallengeGenerator- Creates new challengesChallengeVerifier- Validates submitted solutionsQuoteService- Retrieves quotes after successful validation
test/integration
End-to-end integration tests
- Slowloris Protection: Tests server resilience against slow attacks
- Connection Timeouts: Validates timeout configurations
- Full Workflow: Tests complete client-server interaction
- Real Components: Uses actual TCP connections and protocol
Dependency Flow
cmd/server
↓
internal/config → internal/server → internal/application → internal/service
↓ ↓ ↓
internal/protocol internal/protocol internal/pow
internal/metrics internal/quotes
Architecture Benefits
This package structure provides:
- Clear Separation: Each package has a single, well-defined responsibility
- Testability: Dependencies are injected, making testing straightforward
- Maintainability: Changes are isolated to specific layers
- Scalability: Clean interfaces allow for easy implementation swapping