{"version":3,"file":"ng-speed-test.mjs","sources":["../../../src/models/speed-test-file.model.ts","../../../src/models/speed-test-results.model.ts","../../../src/models/speed-test-settings.model.ts","../../../src/services/speed-test.service.ts","../../../src/speed-test.module.ts","../../../src/ng-speed-test.ts"],"sourcesContent":["export interface SpeedTestFile {\n  path: string;\n  shouldBustCache: boolean;\n  size: number;\n}\n\nexport class SpeedTestFileModel implements SpeedTestFile {\n  public path: string = 'https://raw.githubusercontent.com/jrquick17/ng-speed-test/02c59e4afde67c35a5ba74014b91d44b33c0b3fe/demo/src/assets/5mb.jpg';\n  public shouldBustCache: boolean = true;\n  public size: number = 4952221;\n\n  constructor(file?: Partial<SpeedTestFile>) {\n    if (file) {\n      if (file.path !== undefined) {\n        this.path = file.path;\n      }\n      if (file.size !== undefined) {\n        this.size = file.size;\n      }\n      if (file.shouldBustCache !== undefined) {\n        this.shouldBustCache = file.shouldBustCache;\n      }\n    }\n  }\n}\n","export interface SpeedTestResults {\n    duration: number;\n    hasEnded: boolean;\n    startTime: number | null;\n    endTime: number | null;\n    speedBps: number;\n    speedKbps: number;\n    speedMbps: number;\n}\n\nexport class SpeedTestResultsModel implements SpeedTestResults {\n    public duration: number = 0;\n    public hasEnded: boolean = false;\n    public startTime: number | null = null;\n    public endTime: number | null = null;\n    public speedBps: number = 0;\n\n    constructor(private fileSize: number) {}\n\n    get speedKbps(): number {\n        return this.speedBps / 1024;\n    }\n\n    get speedMbps(): number {\n        return this.speedKbps / 1024;\n    }\n\n    private _update(): void {\n        if (this.endTime !== null && this.startTime !== null) {\n            const milliseconds = this.endTime - this.startTime;\n            if (milliseconds !== 0) {\n                this.duration = milliseconds / 1000;\n            }\n            const bitsLoaded = this.fileSize * 8;\n            this.speedBps = bitsLoaded / this.duration;\n        }\n    }\n\n    end(): void {\n        if (!this.hasEnded) {\n            this.hasEnded = true;\n            this.endTime = Date.now();\n            this._update();\n        }\n    }\n\n    error(): void {\n        if (!this.hasEnded) {\n            this.hasEnded = true;\n            this.endTime = null;\n            this._update();\n        }\n    }\n\n    start(): void {\n        this.startTime = Date.now();\n    }\n}\n","import {SpeedTestFile, SpeedTestFileModel} from './speed-test-file.model';\n\nexport interface SpeedTestSettings {\n  iterations?: number;\n  file?: SpeedTestFile;\n  retryDelay?: number;\n}\n\nexport class SpeedTestSettingsModel implements SpeedTestSettings {\n  public iterations?: number = 3;\n  public file?: SpeedTestFileModel = new SpeedTestFileModel();\n  public retryDelay?: number = 500;\n\n  constructor(settings?: Partial<SpeedTestSettings>) {\n    if (settings) {\n      if (settings.iterations !== undefined) {\n        this.iterations = settings.iterations;\n      }\n      if (settings.retryDelay !== undefined) {\n        this.retryDelay = settings.retryDelay;\n      }\n      if (settings.file) {\n        this.file = new SpeedTestFileModel();\n        if (settings.file.path !== undefined) {\n          this.file.path = settings.file.path;\n        }\n        if (settings.file.size !== undefined) {\n          this.file.size = settings.file.size;\n        }\n        if (settings.file.shouldBustCache !== undefined) {\n          this.file.shouldBustCache = settings.file.shouldBustCache;\n        }\n      }\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { fromEvent, merge, Observable, of, throwError } from 'rxjs';\nimport { map, mergeMap, catchError, timeout, switchMap, startWith } from 'rxjs/operators';\n\nimport { SpeedTestFileModel } from '../models/speed-test-file.model';\nimport { SpeedTestSettingsModel } from '../models/speed-test-settings.model';\nimport { SpeedTestResultsModel } from '../models/speed-test-results.model';\n\nexport interface SpeedTestResult {\n    bps: number;\n    kbps: number;\n    mbps: number;\n    duration: number;\n}\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class SpeedTestService {\n    private readonly DEFAULT_TIMEOUT = 15000; // Reduced from 30s to 15s\n    private readonly OFFLINE_CHECK_TIMEOUT = 3000; // Quick offline check\n\n    constructor() {}\n\n    private applyCacheBuster(path: string): string {\n        const separator = path.includes('?') ? '&' : '?';\n        return `${path}${separator}cache_bust=${Date.now()}_${Math.random()}`;\n    }\n\n    /**\n     * Quick connectivity check before running speed test\n     */\n    private checkConnectivity(): Observable<boolean> {\n        // First check navigator.onLine\n        if (!navigator.onLine) {\n            return of(false);\n        }\n\n        // Then do a quick network request to verify actual connectivity\n        return new Observable<boolean>(observer => {\n            const controller = new AbortController();\n            const timeoutId = setTimeout(() => {\n                controller.abort();\n                observer.next(false);\n                observer.complete();\n            }, this.OFFLINE_CHECK_TIMEOUT);\n\n            // Use a small, fast endpoint for connectivity check\n            fetch('https://httpbin.org/get?minimal=true', {\n                method: 'HEAD',\n                mode: 'no-cors',\n                signal: controller.signal,\n                cache: 'no-cache'\n            })\n                .then(() => {\n                    clearTimeout(timeoutId);\n                    observer.next(true);\n                    observer.complete();\n                })\n                .catch(() => {\n                    clearTimeout(timeoutId);\n                    observer.next(false);\n                    observer.complete();\n                });\n\n            return () => {\n                clearTimeout(timeoutId);\n                controller.abort();\n            };\n        });\n    }\n\n    private downloadTest(settings: SpeedTestSettingsModel, allResults: SpeedTestResultsModel[] = []): Observable<number> {\n        // Quick connectivity check first\n        return this.checkConnectivity().pipe(\n            switchMap(isConnected => {\n                if (!isConnected) {\n                    return throwError(() => new Error('No internet connection available'));\n                }\n\n                return new Observable<SpeedTestResultsModel>(observer => {\n                    const testResult = new SpeedTestResultsModel(settings.file!.size);\n                    const abortController = new AbortController();\n\n                    let filePath = settings.file!.path;\n                    if (settings.file!.shouldBustCache) {\n                        filePath = this.applyCacheBuster(filePath);\n                    }\n\n                    testResult.start();\n\n                    // Set a more aggressive timeout for the fetch request\n                    const fetchTimeout = setTimeout(() => {\n                        abortController.abort();\n                        testResult.error();\n                        observer.next(testResult);\n                        observer.complete();\n                    }, this.DEFAULT_TIMEOUT);\n\n                    fetch(filePath, {\n                        method: 'GET',\n                        signal: abortController.signal,\n                        cache: 'no-cache'\n                    })\n                        .then(response => {\n                            clearTimeout(fetchTimeout);\n                            if (!response.ok) {\n                                throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n                            }\n                            return response.blob();\n                        })\n                        .then(() => {\n                            testResult.end();\n                            observer.next(testResult);\n                            observer.complete();\n                        })\n                        .catch(error => {\n                            clearTimeout(fetchTimeout);\n                            console.warn('Speed test download failed:', error);\n                            testResult.error();\n\n                            const delay = settings.iterations !== 1 ? settings.retryDelay! : 0;\n\n                            setTimeout(() => {\n                                observer.next(testResult);\n                                observer.complete();\n                            }, delay);\n                        });\n\n                    // Cleanup function\n                    return () => {\n                        clearTimeout(fetchTimeout);\n                        abortController.abort();\n                    };\n                });\n            }),\n            mergeMap((testResult: SpeedTestResultsModel) => {\n                allResults.push(testResult);\n\n                if (settings.iterations === 1) {\n                    // Calculate average speed from all valid results\n                    const validResults = allResults.filter(result => result.speedBps > 0);\n\n                    if (validResults.length === 0) {\n                        return throwError(() => new Error('All speed test iterations failed - no internet connection or server unreachable'));\n                    }\n\n                    const totalSpeed = validResults.reduce((sum, result) => sum + result.speedBps, 0);\n                    const averageSpeed = totalSpeed / validResults.length;\n\n                    return of(averageSpeed);\n                } else {\n                    settings.iterations!--;\n                    return this.downloadTest(settings, allResults);\n                }\n            })\n        );\n    }\n\n    private validateSettings(settings: SpeedTestSettingsModel): void {\n        if (!settings.file?.path) {\n            throw new Error('ng-speed-test: File path is required');\n        }\n\n        if (!settings.file?.size || settings.file.size <= 0) {\n            throw new Error('ng-speed-test: Valid file size is required');\n        }\n\n        if (settings.iterations && settings.iterations < 1) {\n            throw new Error('ng-speed-test: Iterations must be at least 1');\n        }\n    }\n\n    /**\n     * Get internet speed in bits per second (bps)\n     * Fails fast if no internet connection is available\n     */\n    getBps(customSettings?: Partial<SpeedTestSettingsModel>): Observable<number> {\n        return new Observable(observer => {\n            // Check connectivity immediately\n            if (!navigator.onLine) {\n                observer.error(new Error('No internet connection - browser reports offline'));\n                return;\n            }\n\n            // Small delay to ensure proper initialization\n            setTimeout(() => {\n                // Create settings with proper merging\n                const defaultSettings = new SpeedTestSettingsModel();\n                const settings = this.mergeSettings(defaultSettings, customSettings);\n\n                try {\n                    this.validateSettings(settings);\n\n                    this.downloadTest(settings).subscribe({\n                        next: (speedBps) => {\n                            observer.next(speedBps);\n                            observer.complete();\n                        },\n                        error: (error) => {\n                            observer.error(error);\n                        }\n                    });\n                } catch (error) {\n                    observer.error(error);\n                }\n            }, 1);\n        });\n    }\n\n    /**\n     * Properly merge custom settings with defaults\n     */\n    private mergeSettings(defaultSettings: SpeedTestSettingsModel, customSettings?: Partial<SpeedTestSettingsModel>): SpeedTestSettingsModel {\n        if (!customSettings) {\n            return defaultSettings;\n        }\n\n        const mergedSettings = new SpeedTestSettingsModel();\n\n        // Merge iterations\n        mergedSettings.iterations = customSettings.iterations !== undefined\n            ? customSettings.iterations\n            : defaultSettings.iterations;\n\n        // Merge retryDelay\n        mergedSettings.retryDelay = customSettings.retryDelay !== undefined\n            ? customSettings.retryDelay\n            : defaultSettings.retryDelay;\n\n        // Merge file settings\n        if (customSettings.file) {\n            mergedSettings.file = new SpeedTestFileModel();\n\n            // Merge file path\n            mergedSettings.file.path = customSettings.file.path !== undefined\n                ? customSettings.file.path\n                : defaultSettings.file!.path;\n\n            // Merge file size\n            mergedSettings.file.size = customSettings.file.size !== undefined\n                ? customSettings.file.size\n                : defaultSettings.file!.size;\n\n            // Merge shouldBustCache\n            mergedSettings.file.shouldBustCache = customSettings.file.shouldBustCache !== undefined\n                ? customSettings.file.shouldBustCache\n                : defaultSettings.file!.shouldBustCache;\n        } else {\n            mergedSettings.file = defaultSettings.file;\n        }\n\n        return mergedSettings;\n    }\n\n    /**\n     * Get internet speed in kilobits per second (Kbps)\n     */\n    getKbps(settings?: Partial<SpeedTestSettingsModel>): Observable<number> {\n        return this.getBps(settings).pipe(\n            map(bps => bps / 1024)\n        );\n    }\n\n    /**\n     * Get internet speed in megabits per second (Mbps)\n     */\n    getMbps(settings?: Partial<SpeedTestSettingsModel>): Observable<number> {\n        return this.getKbps(settings).pipe(\n            map(kbps => kbps / 1024)\n        );\n    }\n\n    /**\n     * Get comprehensive speed test results with fast failure for offline scenarios\n     */\n    getSpeedTestResult(settings?: Partial<SpeedTestSettingsModel>): Observable<SpeedTestResult> {\n        const startTime = Date.now();\n\n        return this.getBps(settings).pipe(\n            map(bps => ({\n                bps,\n                kbps: bps / 1024,\n                mbps: bps / (1024 * 1024),\n                duration: (Date.now() - startTime) / 1000\n            })),\n            timeout(this.DEFAULT_TIMEOUT + 5000), // Overall timeout slightly longer than individual request timeout\n            catchError(error => {\n                if (error.name === 'TimeoutError') {\n                    return throwError(() => new Error('Speed test timed out - please check your internet connection'));\n                }\n                return throwError(() => error);\n            })\n        );\n    }\n\n    /**\n     * Check if the browser is online with enhanced detection\n     */\n    isOnline(): Observable<boolean> {\n        return merge(\n            fromEvent(window, 'offline').pipe(map(() => false)),\n            fromEvent(window, 'online').pipe(map(() => true)),\n            of(navigator.onLine)\n        ).pipe(\n            startWith(navigator.onLine),\n            // Verify actual connectivity for online state\n            switchMap(browserOnline => {\n                if (!browserOnline) {\n                    return of(false);\n                }\n                // Quick connectivity verification\n                return this.checkConnectivity();\n            })\n        );\n    }\n\n    /**\n     * Monitor network connection status with enhanced detection\n     */\n    getNetworkStatus(): Observable<{ isOnline: boolean; effectiveType?: string; downlink?: number }> {\n        const getConnectionInfo = () => {\n            const connection = (navigator as any).connection ||\n                (navigator as any).mozConnection ||\n                (navigator as any).webkitConnection;\n\n            return {\n                isOnline: navigator.onLine,\n                effectiveType: connection?.effectiveType,\n                downlink: connection?.downlink\n            };\n        };\n\n        return merge(\n            fromEvent(window, 'offline').pipe(\n                map(() => ({ ...getConnectionInfo(), isOnline: false }))\n            ),\n            fromEvent(window, 'online').pipe(\n                map(() => getConnectionInfo()),\n                // Verify actual connectivity when browser reports online\n                switchMap(info =>\n                    this.checkConnectivity().pipe(\n                        map(actuallyOnline => ({ ...info, isOnline: actuallyOnline }))\n                    )\n                )\n            ),\n            of(getConnectionInfo()).pipe(\n                switchMap(info =>\n                    info.isOnline\n                        ? this.checkConnectivity().pipe(\n                            map(actuallyOnline => ({ ...info, isOnline: actuallyOnline }))\n                        )\n                        : of(info)\n                )\n            )\n        );\n    }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { SpeedTestService } from './services/speed-test.service';\n\n@NgModule({\n  imports: [CommonModule, FormsModule],\n  providers: [SpeedTestService]\n})\nexport class SpeedTestModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}