@reldens/server-utils
Version:
Reldens - Server Utils
178 lines (144 loc) • 5.5 kB
Markdown
# Package Architecture
## Design Philosophy
**@reldens/server-utils** is an independent utility package that provides server infrastructure without coupling to other Reldens packages (like @reldens/utils).
## Core Principles
### 1. Independence
- No dependencies on @reldens/utils or other Reldens packages
- Self-contained utility classes
- Can be used standalone or integrated into Reldens
### 2. Callback-Based Extensibility
The package provides **hooks via callbacks** instead of direct implementations.
**Pattern:**
- Package provides callback properties
- Package calls these callbacks at specific points
- Application provides callback implementations
- Application wires callbacks to their own logging/monitoring systems
### 3. Separation of Concerns
- **reldens-server-utils**: Provides server infrastructure and callback hooks
- **Application**: Provides implementations (logging, monitoring, error handling)
- **@reldens/utils**: Provides shared utilities (Logger, Shortcuts, etc.)
The package does NOT import Logger. Applications import Logger and wire it to package callbacks.
## Available Callbacks
### onError
Custom error handler for server errors.
**Called by:** ServerErrorHandler static class
**Data structure:**
- `instanceName` - Which server component had the error
- `instance` - The component instance
- `key` - Error type identifier
- `error` - The error object
- `context` - Additional contextual data
**Error points:**
- Virtual host resolution errors
- SNI certificate loading errors
- Server creation errors
- Stream errors
- TLS client errors
- Session errors
- HTTP/1 fallback errors
- Reverse proxy errors
**Example:**
```javascript
let config = {
onError: (errorData) => {
Logger.error('Server error:', errorData.key, errorData.error.message);
}
};
```
### onRequestSuccess
Called for successful HTTP requests (status code < 400).
**Called by:** RequestLogger middleware
**Data structure:**
- `method` - HTTP method (GET, POST, etc.)
- `path` - Request path
- `statusCode` - HTTP status code
- `responseTime` - Response time in milliseconds
- `ip` - Client IP address
- `userAgent` - Client user agent
- `timestamp` - ISO timestamp
**Example:**
```javascript
let config = {
onRequestSuccess: (requestData) => {
Logger.info('Request:', requestData.method, requestData.path, requestData.statusCode, requestData.responseTime+'ms');
}
};
```
### onRequestError
Called for failed HTTP requests (status code >= 400).
**Called by:** RequestLogger middleware
**Data structure:**
- `method` - HTTP method
- `path` - Request path
- `statusCode` - HTTP status code
- `responseTime` - Response time in milliseconds
- `ip` - Client IP address
- `userAgent` - Client user agent
- `timestamp` - ISO timestamp
**Example:**
```javascript
let config = {
onRequestError: (errorData) => {
Logger.error('Request error:', errorData.method, errorData.path, errorData.statusCode);
}
};
```
### onEvent
Generic lifecycle event callback for server initialization and configuration events.
**Called by:** EventDispatcher static class
**Data structure:**
- `eventType` - Event type identifier
- `instanceName` - Which component dispatched the event
- `instance` - The component instance
- `data` - Event-specific data
- `timestamp` - ISO timestamp
**Event types:**
- `app-server-created` - Express app server created
- `http2-cdn-created` - HTTP/2 CDN server created
- `app-server-listening` - Server started listening
- `http-server-created` - HTTP server created
- `https-server-created` - HTTPS server created
- `sni-server-created` - SNI server created
- `domain-added` - Virtual host domain added
- `protocol-enforcement-enabled` - Protocol enforcement configured
- `helmet-configured` - Helmet security configured
- `xss-protection-enabled` - XSS protection configured
- `cors-configured` - CORS configured
- `rate-limiting-configured` - Rate limiting configured
- `reverse-proxy-configured` - Reverse proxy configured
- `development-mode-detected` - Development mode detected
- `cdn-server-created` - CDN server instance created
- `cdn-handlers-setup` - CDN event handlers configured
- `cdn-server-listening` - CDN server started listening
**Example:**
```javascript
let config = {
onEvent: (eventData) => {
Logger.debug('Event:', eventData.eventType, eventData.instanceName);
}
};
```
## Integration Pattern
**Application Setup:**
```javascript
const { AppServerFactory } = require('@reldens/server-utils');
const { Logger } = require('@reldens/utils');
let factory = new AppServerFactory();
let config = {
port: 8080,
onError: (errorData) => {
Logger.error('Server error:', errorData.key, errorData.error.message);
},
onRequestSuccess: (requestData) => {
Logger.info('Request:', requestData.method, requestData.path, requestData.statusCode);
},
onRequestError: (errorData) => {
Logger.error('Request error:', errorData.method, errorData.path, errorData.statusCode);
},
onEvent: (eventData) => {
Logger.debug('Event:', eventData.eventType);
}
};
let serverResult = factory.createAppServer(config);
```
This pattern keeps the utility package independent while allowing full integration with application-specific logging and monitoring systems.