UNPKG

lightweight-browser-load-tester

Version:

A lightweight load testing tool using real browsers for streaming applications with DRM support

235 lines (217 loc) 5.77 kB
/** * Core type definitions for the lightweight browser load tester */ /** * Configuration for DRM systems */ export interface DRMConfiguration { type: 'widevine' | 'playready' | 'fairplay'; licenseUrl: string; certificateUrl?: string; customHeaders?: Record<string, string>; } /** * Template for parameterizing API requests */ export interface ParameterTemplate { target: 'header' | 'query' | 'body'; name: string; valueTemplate: string; // supports variable substitution scope: 'global' | 'per-session'; urlPattern?: string; // Optional URL pattern to match (supports wildcards and regex) method?: string; // Optional HTTP method to match (GET, POST, etc.) } /** * Resource limits for browser instances */ export interface ResourceLimits { maxMemoryPerInstance: number; // MB maxCpuPercentage: number; maxConcurrentInstances: number; } /** * Prometheus RemoteWrite configuration */ export interface PrometheusConfiguration { enabled: boolean; remoteWriteUrl: string; username?: string; password?: string; headers?: Record<string, string>; batchSize?: number; // Number of metrics to batch before sending flushInterval?: number; // Interval in seconds to flush metrics timeout?: number; // Request timeout in milliseconds retryAttempts?: number; retryDelay?: number; // Delay between retries in milliseconds } /** * OpenTelemetry OTLP configuration */ export interface OpenTelemetryConfiguration { enabled: boolean; endpoint: string; protocol: 'http/protobuf' | 'http/json' | 'grpc'; headers?: Record<string, string>; serviceName?: string; serviceVersion?: string; timeout?: number; // Request timeout in milliseconds compression?: 'gzip' | 'none'; batchTimeout?: number; // Batch timeout in milliseconds maxExportBatchSize?: number; // Maximum batch size maxQueueSize?: number; // Maximum queue size exportTimeout?: number; // Export timeout in milliseconds } /** * Main test configuration interface */ export interface TestConfiguration { concurrentUsers: number; testDuration: number; // seconds rampUpTime: number; // seconds streamingUrl: string; streamingOnly?: boolean; // Block all non-streaming requests to save CPU/memory allowedUrls?: string[]; // URL patterns to always allow (even when streamingOnly is enabled) blockedUrls?: string[]; // URL patterns to always block (even if they're streaming-related) drmConfig?: DRMConfiguration; requestParameters: ParameterTemplate[]; resourceLimits: ResourceLimits; localStorage?: LocalStorageEntry[]; // Pre-populate localStorage for authenticated sessions prometheus?: PrometheusConfiguration; opentelemetry?: OpenTelemetryConfiguration; } /** * Summary of test execution results */ export interface TestSummary { totalRequests: number; successfulRequests: number; failedRequests: number; averageResponseTime: number; peakConcurrentUsers: number; testDuration: number; } /** * Metrics for individual browser instances */ export interface BrowserMetrics { instanceId: string; memoryUsage: number; // MB cpuUsage: number; // percentage requestCount: number; errorCount: number; uptime: number; // seconds } /** * DRM-specific error information */ export interface DRMError { timestamp: Date; errorCode: string; errorMessage: string; licenseUrl: string; drmType: string; } /** * DRM performance metrics */ export interface DRMMetrics { licenseRequestCount: number; averageLicenseTime: number; licenseSuccessRate: number; drmType: string; errors: DRMError[]; } /** * Network request performance metrics */ export interface NetworkMetrics { url: string; method: string; responseTime: number; statusCode: number; timestamp: Date; requestSize: number; responseSize: number; isStreamingRelated?: boolean; streamingType?: 'manifest' | 'segment' | 'license' | 'api' | 'other'; } /** * Streaming-specific request metrics */ export interface StreamingMetrics { manifestRequests: number; segmentRequests: number; licenseRequests: number; apiRequests: number; totalStreamingRequests: number; averageManifestTime: number; averageSegmentTime: number; averageLicenseTime: number; streamingSuccessRate: number; bandwidthUsage: number; // bytes per second errors: StreamingError[]; } /** * Streaming-specific error information */ export interface StreamingError { timestamp: Date; errorType: 'manifest' | 'segment' | 'license' | 'playback' | 'network'; errorCode?: string; errorMessage: string; url?: string; context?: Record<string, any>; } /** * Error log entry */ export interface ErrorLog { timestamp: Date; level: 'error' | 'warning' | 'info'; message: string; stack?: string; context?: Record<string, any>; } /** * Complete test results structure */ export interface TestResults { summary: TestSummary; browserMetrics: BrowserMetrics[]; drmMetrics: DRMMetrics[]; networkMetrics: NetworkMetrics[]; errors: ErrorLog[]; } /** * Local storage entry for a specific domain */ export interface LocalStorageEntry { domain: string; data: Record<string, string>; } /** * Browser pool configuration options */ export interface BrowserPoolConfig { maxInstances: number; minInstances: number; resourceLimits: ResourceLimits; browserOptions?: { headless?: boolean; args?: string[]; }; localStorage?: LocalStorageEntry[]; } /** * Managed browser instance with resource tracking */ export interface ManagedBrowserInstance { id: string; browser: any; // Browser from playwright context: any; // BrowserContext from playwright page: any; // Page from playwright createdAt: Date; lastUsed: Date; isActive: boolean; metrics: BrowserMetrics; }