Appendix A: API Reference
Core Classes
HypermodernServer
The main server class that handles multi-protocol communication.
class HypermodernServer {
// Constructor
HypermodernServer({
ServerConfig? config,
ModuleContainer? container,
});
// Configuration
void configure(ServerConfig config);
void configureTcp(TcpServerConfig config);
void configureHttp(HttpServerConfig config);
void configureWebSocket(WebSocketServerConfig config);
// Lifecycle
Future<void> listen({
int? httpPort,
int? wsPort,
int? tcpPort,
String? bindAddress,
});
Future<void> stop();
Future<void> restart();
// Endpoint Registration
void registerEndpoint<TRequest, TResponse>(
String name,
Future<TResponse> Function(TRequest) handler,
);
void registerStreamingEndpoint<TRequest, TResponse>(
String name,
Stream<TResponse> Function(TRequest) handler,
);
void registerBidirectionalStreamingEndpoint<TRequest, TResponse>(
String name,
Future<void> Function(
Stream<TRequest> incoming,
StreamSink<TResponse> outgoing,
) handler,
);
// Middleware
MiddlewareStack get middleware;
void addMiddleware(Middleware middleware);
void removeMiddleware(Middleware middleware);
// Module Management
Future<void> installModule(HypermodernModule module);
Future<void> uninstallModule(String moduleName);
List<HypermodernModule> get installedModules;
// Events
Stream<ServerEvent> get events;
// Metrics
ServerMetrics get metrics;
}
HypermodernClient
The client class for connecting to Hypermodern servers.
class HypermodernClient {
// Constructors
HypermodernClient(String url, {ClientConfig? config});
HypermodernClient.http(String url, {ClientConfig? config});
HypermodernClient.websocket(String url, {ClientConfig? config});
HypermodernClient.tcp(String url, {ClientConfig? config});
// Connection Management
Future<void> connect();
Future<void> disconnect();
Future<void> reconnect();
bool get isConnected;
// Authentication
void setAuthToken(String token);
void setAuthProvider(AuthProvider provider);
void clearAuth();
// Request/Response
Future<TResponse> request<TResponse>(
String endpoint,
dynamic request, {
Duration? timeout,
CancellationToken? cancellationToken,
});
// Streaming
Stream<TResponse> stream<TResponse>(
String endpoint,
dynamic request,
);
StreamController<TRequest> getStreamController<TRequest>(String endpoint);
// Events
Stream<ClientEvent> get events;
Stream<ConnectionState> get connectionState;
// Configuration
ClientConfig get config;
void updateConfig(ClientConfig config);
}
Database
Database abstraction layer for ORM operations.
class Database {
// Constructor
Database(ConnectionPool pool);
// Query Operations
Future<List<Map<String, dynamic>>> query(
String sql, [
List<dynamic>? parameters,
]);
Future<void> execute(
String sql, [
List<dynamic>? parameters,
]);
Future<PreparedStatement> prepare(String sql);
// Transactions
Future<T> transaction<T>(
Future<T> Function(Transaction) callback,
);
// Connection Management
Future<void> close();
ConnectionPoolStats get poolStats;
// Migration Support
Future<void> runMigrations(List<Migration> migrations);
Future<List<String>> getExecutedMigrations();
}
Configuration Classes
ServerConfig
class ServerConfig {
final int httpPort;
final int wsPort;
final int tcpPort;
final String bindAddress;
final int maxConnections;
final Duration requestTimeout;
final Duration keepAliveTimeout;
final bool corsEnabled;
final List<String> corsOrigins;
final bool rateLimitEnabled;
final int rateLimitRequests;
final Duration rateLimitWindow;
final LogLevel logLevel;
final bool metricsEnabled;
const ServerConfig({
this.httpPort = 8080,
this.wsPort = 8082,
this.tcpPort = 8081,
this.bindAddress = '0.0.0.0',
this.maxConnections = 1000,
this.requestTimeout = const Duration(seconds: 30),
this.keepAliveTimeout = const Duration(seconds: 60),
this.corsEnabled = false,
this.corsOrigins = const [],
this.rateLimitEnabled = false,
this.rateLimitRequests = 100,
this.rateLimitWindow = const Duration(minutes: 1),
this.logLevel = LogLevel.info,
this.metricsEnabled = false,
});
}
ClientConfig
class ClientConfig {
final Duration connectionTimeout;
final Duration requestTimeout;
final int maxRetries;
final Duration retryDelay;
final double retryBackoffMultiplier;
final bool autoReconnect;
final int reconnectAttempts;
final Duration reconnectDelay;
final bool binaryMode;
final bool compressionEnabled;
final bool keepAlive;
final bool validateCertificates;
final Map<String, String> customHeaders;
const ClientConfig({
this.connectionTimeout = const Duration(seconds: 10),
this.requestTimeout = const Duration(seconds: 30),
this.maxRetries = 3,
this.retryDelay = const Duration(seconds: 1),
this.retryBackoffMultiplier = 2.0,
this.autoReconnect = true,
this.reconnectAttempts = 5,
this.reconnectDelay = const Duration(seconds: 2),
this.binaryMode = true,
this.compressionEnabled = true,
this.keepAlive = true,
this.validateCertificates = true,
this.customHeaders = const {},
});
}
Middleware Classes
Middleware Interface
abstract class Middleware {
Future<dynamic> handle(
dynamic request,
Future<dynamic> Function(dynamic) next,
);
}
Built-in Middleware
AuthenticationMiddleware
class AuthenticationMiddleware implements Middleware {
AuthenticationMiddleware({
required JWTService jwtService,
required TokenBlacklistService blacklistService,
Set<String> publicEndpoints = const {},
Set<String> optionalAuthEndpoints = const {},
});
@override
Future<dynamic> handle(dynamic request, Future<dynamic> Function(dynamic) next);
}
RateLimitMiddleware
class RateLimitMiddleware implements Middleware {
RateLimitMiddleware({
required RateLimiter rateLimiter,
Map<String, RateLimit> endpointLimits = const {},
RateLimit defaultLimit = const RateLimit(requests: 100, window: Duration(minutes: 1)),
});
@override
Future<dynamic> handle(dynamic request, Future<dynamic> Function(dynamic) next);
}
CORSMiddleware
class CORSMiddleware implements Middleware {
CORSMiddleware({
List<String> allowedOrigins = const ['*'],
List<String> allowedMethods = const ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
List<String> allowedHeaders = const ['Content-Type', 'Authorization'],
bool allowCredentials = false,
Duration maxAge = const Duration(hours: 24),
});
@override
Future<dynamic> handle(dynamic request, Future<dynamic> Function(dynamic) next);
}
Module System
HypermodernModule
abstract class HypermodernModule {
ModuleManifest get manifest;
List<Migration> get migrations => [];
Future<void> register(ModuleContainer container);
Future<void> boot(ModuleContainer container);
Future<void> onInstall(ModuleContext context) async {}
Future<void> onUninstall(ModuleContext context) async {}
Future<void> onUpdate(ModuleContext context, String fromVersion) async {}
Future<void> onConfigurationChange(
ModuleContext context,
Map<String, dynamic> oldConfig,
) async {}
}
ModuleManifest
class ModuleManifest {
final String name;
final String version;
final String description;
final String? author;
final String? homepage;
final String? license;
final String hypermodernVersion;
final Map<String, String> dependencies;
final Map<String, String> devDependencies;
final Map<String, List<String>> exports;
final Map<String, dynamic> configuration;
final List<String> permissions;
final List<String> databaseTables;
final List<String> tags;
final List<String> keywords;
ModuleManifest({
required this.name,
required this.version,
required this.description,
this.author,
this.homepage,
this.license,
required this.hypermodernVersion,
this.dependencies = const {},
this.devDependencies = const {},
this.exports = const {},
this.configuration = const {},
this.permissions = const [],
this.databaseTables = const [],
this.tags = const [],
this.keywords = const [],
});
factory ModuleManifest.fromJson(Map<String, dynamic> json);
Map<String, dynamic> toJson();
}
Exception Classes
Core Exceptions
class HypermodernException implements Exception {
final String message;
final String? code;
final Map<String, dynamic>? details;
HypermodernException(this.message, {this.code, this.details});
@override
String toString() => 'HypermodernException: $message';
}
class ValidationException extends HypermodernException {
final Map<String, String> fieldErrors;
ValidationException(
String message, {
this.fieldErrors = const {},
String? code,
Map<String, dynamic>? details,
}) : super(message, code: code, details: details);
}
class NotFoundException extends HypermodernException {
NotFoundException(
String message, {
String? code,
Map<String, dynamic>? details,
}) : super(message, code: code ?? 'NOT_FOUND', details: details);
}
class UnauthorizedException extends HypermodernException {
UnauthorizedException(
String message, {
String? code,
Map<String, dynamic>? details,
}) : super(message, code: code ?? 'UNAUTHORIZED', details: details);
}
class ForbiddenException extends HypermodernException {
ForbiddenException(
String message, {
String? code,
Map<String, dynamic>? details,
}) : super(message, code: code ?? 'FORBIDDEN', details: details);
}
class ConflictException extends HypermodernException {
ConflictException(
String message, {
String? code,
Map<String, dynamic>? details,
}) : super(message, code: code ?? 'CONFLICT', details: details);
}
class RateLimitExceededException extends HypermodernException {
final int retryAfter;
RateLimitExceededException(
String message, {
required this.retryAfter,
String? code,
Map<String, dynamic>? details,
}) : super(message, code: code ?? 'RATE_LIMIT_EXCEEDED', details: details);
}
class ServerException extends HypermodernException {
final int statusCode;
ServerException(
String message, {
this.statusCode = 500,
String? code,
Map<String, dynamic>? details,
}) : super(message, code: code ?? 'SERVER_ERROR', details: details);
}
Network Exceptions
class NetworkException extends HypermodernException {
NetworkException(
String message, {
String? code,
Map<String, dynamic>? details,
}) : super(message, code: code ?? 'NETWORK_ERROR', details: details);
}
class TimeoutException extends NetworkException {
final Duration timeout;
TimeoutException(
String message, {
required this.timeout,
String? code,
Map<String, dynamic>? details,
}) : super(message, code: code ?? 'TIMEOUT', details: details);
}
class ConnectionException extends NetworkException {
ConnectionException(
String message, {
String? code,
Map<String, dynamic>? details,
}) : super(message, code: code ?? 'CONNECTION_ERROR', details: details);
}
Utility Classes
Logger
class Logger {
static Logger get instance => _instance;
static Logger _instance = Logger._();
Logger._();
void debug(String message, {dynamic error, Map<String, dynamic>? extra});
void info(String message, {dynamic error, Map<String, dynamic>? extra});
void warning(String message, {dynamic error, Map<String, dynamic>? extra});
void error(String message, {dynamic error, Map<String, dynamic>? extra});
void critical(String message, {dynamic error, Map<String, dynamic>? extra});
void setLevel(LogLevel level);
void addHandler(LogHandler handler);
void removeHandler(LogHandler handler);
}
enum LogLevel {
debug,
info,
warning,
error,
critical,
}
Metrics
class MetricsCollector {
void recordRequest({
required String route,
required String method,
required int statusCode,
required Duration duration,
String? backendService,
});
void recordError({
required String route,
required String method,
required String error,
required Duration duration,
});
void incrementCounter(String name, {Map<String, String>? labels});
void recordGauge(String name, double value, {Map<String, String>? labels});
void recordHistogram(String name, double value, {Map<String, String>? labels});
Map<String, dynamic> getMetrics();
void reset();
}
Version
class Version implements Comparable<Version> {
final int major;
final int minor;
final int patch;
final String? preRelease;
final String? build;
Version(this.major, this.minor, this.patch, {this.preRelease, this.build});
factory Version.parse(String version);
@override
int compareTo(Version other);
@override
String toString();
bool operator >(Version other);
bool operator <(Version other);
bool operator >=(Version other);
bool operator <=(Version other);
}
Constants
Protocol Types
class ProtocolType {
static const String http = 'http';
static const String websocket = 'websocket';
static const String tcp = 'tcp';
}
Content Types
class ContentType {
static const String json = 'application/json';
static const String binary = 'application/x-hypermodern-binary';
static const String text = 'text/plain';
static const String html = 'text/html';
}
Status Codes
class StatusCode {
// Success
static const int ok = 200;
static const int created = 201;
static const int accepted = 202;
static const int noContent = 204;
// Client Errors
static const int badRequest = 400;
static const int unauthorized = 401;
static const int forbidden = 403;
static const int notFound = 404;
static const int conflict = 409;
static const int unprocessableEntity = 422;
static const int tooManyRequests = 429;
// Server Errors
static const int internalServerError = 500;
static const int badGateway = 502;
static const int serviceUnavailable = 503;
static const int gatewayTimeout = 504;
}
Type Definitions
Function Types
typedef RequestHandler<TRequest, TResponse> = Future<TResponse> Function(TRequest request);
typedef StreamingHandler<TRequest, TResponse> = Stream<TResponse> Function(TRequest request);
typedef MiddlewareHandler = Future<dynamic> Function(dynamic request, Future<dynamic> Function(dynamic) next);
typedef ErrorHandler = Future<dynamic> Function(dynamic error, dynamic request);
Callback Types
typedef ConnectionCallback = void Function();
typedef DisconnectionCallback = void Function();
typedef ErrorCallback = void Function(dynamic error);
typedef MessageCallback<T> = void Function(T message);
This API reference provides a comprehensive overview of the core Hypermodern classes, methods, and types. Use this as a quick reference when developing with the platform.