Initial Commit

This commit is contained in:
2026-05-27 23:29:53 +01:00
commit fbc70f96e6
10000 changed files with 1102152 additions and 0 deletions

View File

@@ -0,0 +1,679 @@
# Phase 9: Middleware and Serialization
## Overview
Phase 9 focuses on implementing the middleware system and serialization strategies. The middleware system provides a way to intercept and modify messages as they flow through the network, enabling features like logging, validation, and transformation. The serialization strategies handle converting messages between in-memory objects and transmissible formats, supporting different encodings for various use cases.
## Key Components
### 1. MiddlewareManager Implementation (`src/middleware/middleware-manager.ts`)
The `MiddlewareManager` class orchestrates the middleware chain. It should:
- Register and manage middleware components
- Execute middleware in the correct order
- Handle middleware failures gracefully
- Support middleware priority and ordering
- Enable dynamic middleware configuration
#### Core Features
- **Middleware Registration**: Add middleware to the processing chain
- **Priority-Based Ordering**: Execute middleware in priority order
- **Direction Handling**: Process both incoming and outgoing messages
- **Error Management**: Handle middleware exceptions
- **Chain Execution**: Pass messages through the complete middleware chain
#### Implementation Requirements
- Support middleware addition and removal at runtime
- Implement middleware prioritization
- Handle conditional middleware execution
- Provide hooks for middleware monitoring
- Support middleware chain bypassing for special messages
#### Edge Cases
- Handle middleware throwing exceptions
- Manage circular dependencies between middleware
- Deal with middleware changing message properties
- Support middleware timeouts
- Handle middleware chain interruption
### 2. Core Middleware Implementations (`src/middleware/core-middleware.ts`)
Implement a set of core middleware components. These should include:
- **Logging Middleware**: Record message details
- **Validation Middleware**: Ensure message correctness
- **Transformation Middleware**: Modify message structure
- **Metrics Middleware**: Collect performance data
- **Throttling Middleware**: Control message flow rates
#### Core Features
- **Configurable Behavior**: Each middleware should be customizable
- **Minimal Overhead**: Efficient processing with low performance impact
- **Selective Processing**: Apply only to relevant messages
- **Stateful/Stateless Options**: Support both approaches as needed
- **Composability**: Ability to combine middleware in useful ways
#### Implementation Requirements
- Implement the IMiddleware interface for all components
- Provide default configurations for common use cases
- Include clear documentation on middleware effects
- Support asynchronous processing where appropriate
- Enable middleware disabling without removal
#### Edge Cases
- Handle middleware state restoration after failures
- Support partial application to message subsets
- Deal with middleware version compatibility
- Manage middleware resource consumption
- Handle middleware deadlocks
### 3. Middleware Interface (`src/middleware/types.ts`)
Define a clear interface for middleware components:
```typescript
interface IMiddleware {
// Unique identifier for the middleware
readonly id: string;
// Priority determines execution order (lower runs first)
readonly priority: number;
// Process an outgoing message before it's sent
processOutgoing(message: NetworkMessage): Promise<NetworkMessage | null>;
// Process an incoming message after it's received
processIncoming(message: NetworkMessage): Promise<NetworkMessage | null>;
// Determine if this middleware should process the given message
shouldProcess(message: NetworkMessage): boolean;
}
```
### 4. Serialization Strategies (`src/serialization/`)
Implement various serialization strategies to convert between in-memory objects and transmissible formats:
- **JSON Serializer**: Human-readable, widely compatible
- **Binary Serializer**: Compact, efficient for large data
- **Protocol Buffers**: Schema-based, versioning support
- **MessagePack**: Compact binary format with good performance
#### Core Features
- **Format Conversion**: Transform between objects and serialized data
- **Schema Support**: Enforce data structure where appropriate
- **Versioning**: Handle format evolution gracefully
- **Optimization**: Balance between size, speed, and compatibility
- **Type Safety**: Preserve type information where possible
#### Implementation Requirements
- Implement the ISerializer interface for all strategies
- Support both browser and Node.js environments
- Handle circular references appropriately
- Provide schema validation where applicable
- Include performance optimizations
#### Edge Cases
- Handle unsupported data types
- Manage version mismatches
- Deal with malformed data
- Support partial deserialization
- Handle very large messages
## Middleware System Design
### Middleware Chain Execution
The middleware chain should be executed in this sequence:
1. **Outgoing Messages**:
- Application generates message
- Message enters middleware chain
- Each middleware processes in priority order
- If any middleware returns null, message is dropped
- Final processed message is passed to transport layer
2. **Incoming Messages**:
- Transport layer receives message
- Message enters middleware chain
- Each middleware processes in priority order
- If any middleware returns null, message is dropped
- Final processed message is delivered to application
### Middleware Priority Levels
Middleware should be organized into standard priority levels:
1. **Critical (0-99)**: Essential system middleware
- Security validation
- Message integrity checks
- System health filters
2. **High (100-199)**: Important processing
- Encryption/decryption
- Authentication
- Rate limiting
3. **Normal (200-299)**: Standard processing
- Logging
- Metrics collection
- Transformations
4. **Low (300-399)**: Optional enhancements
- Content enrichment
- Non-critical validations
- Debug information
5. **Background (400+)**: Observability and analysis
- Performance monitoring
- Analytics
- Diagnostic data collection
### Middleware Configuration
Middleware should be configurable for flexibility:
```typescript
interface MiddlewareConfig {
// Whether middleware is enabled
enabled: boolean;
// Custom middleware options
options: Record<string, any>;
// Message filtering criteria
filters?: {
types?: string[] | RegExp;
sources?: string[] | RegExp;
destinations?: string[] | RegExp;
properties?: Record<string, any>;
};
// Error handling policy
errorPolicy?: 'continue' | 'stop' | 'retry';
}
```
## Core Middleware Components
### 1. Logging Middleware
This middleware logs message details for monitoring and debugging:
```typescript
class LoggingMiddleware implements IMiddleware {
readonly id = 'core:logging';
readonly priority = 250;
constructor(private options: {
logLevel?: LogLevel;
includeBodies?: boolean;
bodyMaxSize?: number;
formatter?: (message: NetworkMessage) => string;
}) {}
async processIncoming(message: NetworkMessage): Promise<NetworkMessage> {
// Log incoming message details
return message;
}
async processOutgoing(message: NetworkMessage): Promise<NetworkMessage> {
// Log outgoing message details
return message;
}
shouldProcess(message: NetworkMessage): boolean {
// Determine if this message should be logged
return true;
}
}
```
### 2. Validation Middleware
This middleware ensures messages conform to expected formats:
```typescript
class ValidationMiddleware implements IMiddleware {
readonly id = 'core:validation';
readonly priority = 50;
constructor(private options: {
schemas: Record<string, any>;
strictMode?: boolean;
errorHandler?: (error: any, message: NetworkMessage) => void;
}) {}
async processIncoming(message: NetworkMessage): Promise<NetworkMessage | null> {
// Validate incoming message structure
return message;
}
async processOutgoing(message: NetworkMessage): Promise<NetworkMessage | null> {
// Validate outgoing message structure
return message;
}
shouldProcess(message: NetworkMessage): boolean {
// Check if we have a schema for this message type
return this.options.schemas.hasOwnProperty(message.type);
}
}
```
### 3. Metrics Middleware
This middleware collects performance metrics:
```typescript
class MetricsMiddleware implements IMiddleware {
readonly id = 'core:metrics';
readonly priority = 300;
constructor(private options: {
trackSizes?: boolean;
trackTiming?: boolean;
detailedMetrics?: boolean;
metricsCallback?: (metrics: MessageMetrics) => void;
}) {}
async processIncoming(message: NetworkMessage): Promise<NetworkMessage> {
// Record incoming message metrics
return message;
}
async processOutgoing(message: NetworkMessage): Promise<NetworkMessage> {
// Record outgoing message metrics
return message;
}
shouldProcess(message: NetworkMessage): boolean {
// Usually process all messages
return true;
}
}
```
### 4. Transformation Middleware
This middleware transforms message structure:
```typescript
class TransformationMiddleware implements IMiddleware {
readonly id = 'core:transformation';
readonly priority = 200;
constructor(private options: {
transformations: Record<string, (message: NetworkMessage) => NetworkMessage>;
}) {}
async processIncoming(message: NetworkMessage): Promise<NetworkMessage> {
// Apply transformations to incoming message
return message;
}
async processOutgoing(message: NetworkMessage): Promise<NetworkMessage> {
// Apply transformations to outgoing message
return message;
}
shouldProcess(message: NetworkMessage): boolean {
// Check if we have a transformation for this message type
return this.options.transformations.hasOwnProperty(message.type);
}
}
```
### 5. Throttling Middleware
This middleware controls message flow rates:
```typescript
class ThrottlingMiddleware implements IMiddleware {
readonly id = 'core:throttling';
readonly priority = 150;
constructor(private options: {
messagesPerSecond?: number;
byteLimit?: number;
burstSize?: number;
typeSpecificLimits?: Record<string, { messagesPerSecond: number }>;
}) {}
async processOutgoing(message: NetworkMessage): Promise<NetworkMessage | null> {
// Apply rate limiting to outgoing messages
return message;
}
async processIncoming(message: NetworkMessage): Promise<NetworkMessage> {
// Just pass through incoming messages
return message;
}
shouldProcess(message: NetworkMessage): boolean {
// Usually only throttle outgoing messages
return true;
}
}
```
## Serialization Strategies
### 1. JSON Serializer
The JSON serializer provides human-readable serialization:
```typescript
class JsonSerializer implements ISerializer {
constructor(private options: {
pretty?: boolean;
replacer?: (key: string, value: any) => any;
reviver?: (key: string, value: any) => any;
circularHandling?: 'error' | 'ignore' | 'serialize';
}) {}
serialize(message: NetworkMessage): string {
// Convert message to JSON string
// Handle circular references
// Apply replacer function
return '...';
}
deserialize(data: string): NetworkMessage {
// Parse JSON string to message object
// Apply reviver function
return {} as NetworkMessage;
}
getContentType(): string {
return 'application/json';
}
}
```
### 2. Binary Serializer
The binary serializer provides efficient binary encoding:
```typescript
class BinarySerializer implements ISerializer {
constructor(private options: {
compression?: boolean;
schema?: any;
serializeBigInt?: boolean;
}) {}
serialize(message: NetworkMessage): Uint8Array {
// Convert message to binary format
// Apply compression if configured
return new Uint8Array();
}
deserialize(data: Uint8Array): NetworkMessage {
// Parse binary data to message object
// Decompress if needed
return {} as NetworkMessage;
}
getContentType(): string {
return 'application/octet-stream';
}
}
```
### 3. MessagePack Serializer
The MessagePack serializer provides compact, efficient serialization:
```typescript
class MessagePackSerializer implements ISerializer {
constructor(private options: {
useExtensions?: boolean;
extensionCodecs?: any;
useBigInt64?: boolean;
}) {}
serialize(message: NetworkMessage): Uint8Array {
// Convert message to MessagePack format
return new Uint8Array();
}
deserialize(data: Uint8Array): NetworkMessage {
// Parse MessagePack data to message object
return {} as NetworkMessage;
}
getContentType(): string {
return 'application/x-msgpack';
}
}
```
## Implementation Details
### MiddlewareManager
The MiddlewareManager should implement:
```typescript
class MiddlewareManager implements IMiddlewareManager {
private _middleware: Map<string, IMiddleware> = new Map();
private _enabledMiddleware: Set<string> = new Set();
private _sortedMiddleware: IMiddleware[] = [];
constructor() {
// Initialize manager
}
addMiddleware(middleware: IMiddleware): void {
// Add middleware to the registry
// Update sorted middleware array
// Enable by default
}
removeMiddleware(id: string): void {
// Remove middleware from registry
// Update sorted middleware array
}
async processMessage(message: NetworkMessage, direction: 'incoming' | 'outgoing'): Promise<NetworkMessage | null> {
// Copy message to prevent mutation issues
// Get appropriate processor method based on direction
// Process through middleware chain
// Return final message or null if dropped
}
getMiddlewares(): IMiddleware[] {
// Return all registered middleware
}
setMiddlewareEnabled(id: string, enabled: boolean): void {
// Enable or disable middleware
// Update sorted middleware array if needed
}
private _sortMiddleware(): void {
// Sort middleware by priority
// Filter to only enabled middleware
}
}
```
### SerializerFactory
A factory pattern can be used to select the appropriate serializer:
```typescript
class SerializerFactory {
private _serializers: Map<string, ISerializer> = new Map();
private _defaultSerializer: ISerializer;
constructor(defaultSerializer?: ISerializer) {
// Initialize with default (JSON if not specified)
}
registerSerializer(contentType: string, serializer: ISerializer): void {
// Register serializer for content type
}
getSerializer(contentType?: string): ISerializer {
// Return serializer for content type or default
}
setDefaultSerializer(contentType: string): void {
// Set default serializer by content type
}
}
```
## Testing Strategy
### Middleware Manager Tests
1. **Registration Tests**:
- Test adding middleware
- Test removing middleware
- Test duplicate ID handling
- Test priority ordering
2. **Processing Tests**:
- Test message processing chain
- Test direction-specific processing
- Test middleware that modifies messages
- Test middleware that drops messages
3. **Error Handling Tests**:
- Test middleware that throws exceptions
- Test error propagation
- Test chain recovery after errors
- Test timeout handling
### Core Middleware Tests
1. **Logging Middleware Tests**:
- Test log output format
- Test filtering by message type
- Test body inclusion/exclusion
- Test custom formatting
2. **Validation Middleware Tests**:
- Test schema validation
- Test handling valid messages
- Test handling invalid messages
- Test strict vs. lenient modes
3. **Other Middleware Tests**:
- Similar tests for each middleware component
- Test middleware-specific functionality
- Test configuration options
- Test performance characteristics
### Serializer Tests
1. **JSON Serializer Tests**:
- Test basic serialization/deserialization
- Test handling complex objects
- Test handling circular references
- Test custom replacers/revivers
2. **Binary Serializer Tests**:
- Test binary format correctness
- Test compression effectiveness
- Test handling various data types
- Test performance characteristics
3. **Format Compatibility Tests**:
- Test cross-version compatibility
- Test partial object serialization
- Test schema evolution
- Test with real messages from the system
## Edge Cases and Considerations
### 1. Message Transformation Issues
Handle middleware that transforms messages:
- Track message changes for debugging
- Validate transformed messages for consistency
- Detect transformation loops
- Support reverting transformations if needed
### 2. Middleware Performance Impact
Monitor and optimize middleware performance:
- Measure processing time per middleware
- Provide bypass mechanisms for critical paths
- Support conditional execution based on load
- Optimize frequently used middleware components
### 3. Serialization Compatibility
Ensure serialization works across different environments:
- Handle browser vs. Node.js differences
- Support backward/forward compatibility
- Provide graceful fallbacks for unsupported features
- Test with real-world message patterns
### 4. Large Message Handling
Handle very large messages efficiently:
- Support streaming serialization/deserialization
- Implement size limits with configurable policies
- Provide chunking for large messages
- Optimize memory usage during processing
### 5. Error Recovery
Implement robust error handling:
- Provide clear error diagnostics
- Support partial processing where appropriate
- Include middleware-specific error handling
- Allow custom error policies
## Integration Points
The middleware and serialization systems integrate with:
1. **NetworkNode**: For message processing
2. **TransportLayer**: For message serialization
3. **Plugin System**: For extensibility
4. **Monitoring**: For performance metrics
## Performance Considerations
Optimize middleware and serialization for:
1. **Processing Efficiency**: Minimize CPU usage per message
2. **Memory Usage**: Avoid unnecessary copies and allocations
3. **Scalability**: Maintain performance under increasing load
4. **Selective Processing**: Skip unnecessary work when possible
## Success Criteria
This phase is complete when:
1. The MiddlewareManager correctly processes messages through the middleware chain
2. Core middleware components are implemented and working correctly
3. All serialization strategies are implemented and functional
4. Middleware priority ordering works as expected
5. Middleware can be dynamically added, removed, and configured
6. Serializers correctly handle all supported message formats
7. Error cases are properly handled
8. All tests pass with 100% code coverage
The middleware and serialization systems provide critical infrastructure for message processing and transport, enabling features like logging, validation, and efficient message transmission across different environments and transport mechanisms.