@gati-framework/runtime
Version:
Gati runtime execution engine for running handler-based applications
307 lines • 8.34 kB
TypeScript
/**
* @module runtime/enhanced-route-manager
* @description Enhanced Route Manager with version resolution and Timescape integration
*
* This implements Task 9 from the runtime architecture spec:
* - Version resolution using Timescape
* - Manifest, GType, and health status caching
* - Handler instance selection and routing
* - Policy enforcement (rate limiting, authentication)
* - Warm pool management
* - Usage tracking for auto-decommissioning
*/
import type { Handler } from './types/handler.js';
import type { HttpMethod } from './types/request.js';
import type { TSV } from './timescape/types.js';
import { VersionRegistry } from './timescape/registry.js';
import { VersionResolver } from './timescape/resolver.js';
import { TransformerEngine, type TransformerPair, type TransformResult } from './timescape/transformer.js';
/**
* Handler manifest containing metadata and policies
*/
export interface HandlerManifest {
handlerId: string;
path: string;
method: HttpMethod | HttpMethod[];
version: TSV;
gtypes: {
request?: string;
response?: string;
params?: string;
headers?: string;
};
hooks?: {
before?: string[];
after?: string[];
catch?: string[];
};
policies?: {
roles?: string[];
rateLimit?: {
limit: number;
window: number;
};
};
dependencies?: {
modules?: string[];
plugins?: string[];
};
hash: string;
}
/**
* Handler instance representing a deployed handler version
*/
export interface HandlerInstance {
id: string;
handlerId: string;
version: TSV;
handler: Handler;
manifest: HandlerManifest;
health: HealthStatus;
createdAt: number;
lastAccessed: number;
}
/**
* Health status for handler instances
*/
export interface HealthStatus {
status: 'healthy' | 'degraded' | 'unhealthy';
lastCheck: number;
consecutiveFailures: number;
message?: string;
}
/**
* Authentication context for policy enforcement
*/
export interface AuthContext {
userId?: string;
roles: string[];
token?: string;
}
/**
* Request descriptor for routing
*/
export interface RequestDescriptor {
requestId: string;
path: string;
method: HttpMethod;
headers: Record<string, string | string[] | undefined>;
query: Record<string, string | string[] | undefined>;
body?: unknown;
authContext?: AuthContext;
clientId: string;
}
/**
* Routing result
*/
export interface RoutingResult {
instance: HandlerInstance;
manifest: HandlerManifest;
version: TSV;
cached: boolean;
transformedRequest?: TransformResult;
requiresResponseTransform?: boolean;
originalVersion?: TSV;
}
/**
* Routing error
*/
export interface RoutingError {
code: 'NO_HANDLER' | 'NO_VERSION' | 'RATE_LIMITED' | 'UNAUTHORIZED' | 'UNHEALTHY';
message: string;
details?: unknown;
}
/**
* Warm pool configuration
*/
export interface WarmPoolConfig {
minInstances: number;
maxInstances: number;
targetUtilization: number;
}
/**
* Usage metrics for tracking
*/
export interface UsageMetrics {
requestCount: number;
errorCount: number;
avgLatency: number;
lastAccessed: number;
}
/**
* Enhanced Route Manager with version resolution and Timescape integration
*/
export declare class EnhancedRouteManager {
private registry;
private resolver;
private transformerEngine;
private instances;
private manifestCache;
private gtypeCache;
private healthCache;
private rateLimitState;
private warmPools;
private usageMetrics;
private readonly maxCacheSize;
private readonly healthCheckInterval;
private readonly rateLimitCleanupInterval;
constructor(registry?: VersionRegistry, transformerEngine?: TransformerEngine);
/**
* Register a handler instance
*/
registerHandler(path: string, version: TSV, handler: Handler, manifest: HandlerManifest): void;
/**
* Resolve handler version using Timescape
*/
resolveVersion(path: string, query?: Record<string, string | string[] | undefined>, headers?: Record<string, string | string[] | undefined>): TSV | RoutingError;
/**
* Route a request to the appropriate handler instance
*/
routeRequest(descriptor: RequestDescriptor): Promise<RoutingResult | RoutingError>;
/**
* Enforce rate limiting policies
*/
enforceRateLimit(manifest: HandlerManifest, clientId: string): RoutingError | null;
/**
* Verify authentication requirements
*/
verifyAuthentication(manifest: HandlerManifest, authContext?: AuthContext): RoutingError | null;
/**
* Get handler instance
*/
private getInstance;
/**
* Cache manifest
*/
private cacheManifest;
/**
* Get cached manifest
*/
getManifest(handlerId: string): HandlerManifest | undefined;
/**
* Cache GType schema
*/
cacheGType(ref: string, schema: unknown): void;
/**
* Get cached GType schema
*/
getGType(ref: string): unknown | undefined;
/**
* Maintain warm pool for critical versions
*/
maintainWarmPool(handlerId: string, config: WarmPoolConfig): void;
/**
* Get warm pool configuration
*/
getWarmPoolConfig(handlerId: string): WarmPoolConfig | undefined;
/**
* Track usage metrics
*/
trackUsage(instanceId: string, metrics: Partial<UsageMetrics>): void;
/**
* Get usage metrics
*/
getUsageMetrics(instanceId: string): UsageMetrics | undefined;
/**
* Get all instances for a path
*/
getInstances(path: string): HandlerInstance[];
/**
* Get all registered paths
*/
getPaths(): string[];
/**
* Update health status
*/
updateHealth(path: string, version: TSV, health: HealthStatus): void;
/**
* Get health status
*/
getHealth(path: string, version: TSV): HealthStatus | undefined;
/**
* Start health check loop
*/
private startHealthCheckLoop;
/**
* Perform health checks on all instances
*/
private performHealthChecks;
/**
* Start rate limit cleanup
*/
private startRateLimitCleanup;
/**
* Clean up expired rate limit entries
*/
private cleanupRateLimits;
/**
* Get registry for external access
*/
getRegistry(): VersionRegistry;
/**
* Get resolver for external access
*/
getResolver(): VersionResolver;
/**
* Clear all caches
*/
clearCaches(): void;
/**
* Get cache statistics
*/
getCacheStats(): {
manifests: number;
gtypes: number;
health: number;
rateLimits: number;
};
/**
* Register a transformer pair
*/
registerTransformer(transformer: TransformerPair): void;
/**
* Get transformer between two versions
*/
getTransformer(from: TSV, to: TSV): TransformerPair | undefined;
/**
* Check if transformer exists
*/
hasTransformer(from: TSV, to: TSV): boolean;
/**
* Transform request data from one version to another
*/
transformRequest(data: unknown, fromVersion: TSV, toVersion: TSV, path: string): Promise<TransformResult>;
/**
* Transform response data from one version to another
*/
transformResponse(data: unknown, fromVersion: TSV, toVersion: TSV, path: string): Promise<TransformResult>;
/**
* Get all versions for a path (sorted by timestamp)
*/
private getVersionsForPath;
/**
* Extract timestamp from TSV
*/
private extractTimestamp;
/**
* Extract requested version from headers
*/
private extractRequestedVersion;
/**
* Get transformer engine for external access
*/
getTransformerEngine(): TransformerEngine;
/**
* Get all registered transformers
*/
getAllTransformers(): TransformerPair[];
/**
* Get transformer count
*/
getTransformerCount(): number;
}
/**
* Create an enhanced route manager instance
*/
export declare function createEnhancedRouteManager(registry?: VersionRegistry, transformerEngine?: TransformerEngine): EnhancedRouteManager;
//# sourceMappingURL=enhanced-route-manager.d.ts.map