download
raw
2.54 kB
import { ErrorDetails } from '../errors';
import type { LoaderConfig, LoadPolicy, RetryConfig } from '../config';
import type { ErrorData } from '../types/events';
import type { LoaderResponse } from '../types/loader';
export function isTimeoutError(error: ErrorData): boolean {
switch (error.details) {
case ErrorDetails.FRAG_LOAD_TIMEOUT:
case ErrorDetails.KEY_LOAD_TIMEOUT:
case ErrorDetails.LEVEL_LOAD_TIMEOUT:
case ErrorDetails.MANIFEST_LOAD_TIMEOUT:
return true;
}
return false;
}
export function isKeyError(error: ErrorData): boolean {
return error.details.startsWith('key');
}
export function isUnusableKeyError(error: ErrorData): boolean {
return isKeyError(error) && !!error.frag && !error.frag.decryptdata;
}
export function getRetryConfig(
loadPolicy: LoadPolicy,
error: ErrorData,
): RetryConfig | null {
const isTimeout = isTimeoutError(error);
return loadPolicy.default[`${isTimeout ? 'timeout' : 'error'}Retry`];
}
export function getRetryDelay(
retryConfig: RetryConfig,
retryCount: number,
): number {
// exponential backoff capped to max retry delay
const backoffFactor =
retryConfig.backoff === 'linear' ? 1 : Math.pow(2, retryCount);
return Math.min(
backoffFactor * retryConfig.retryDelayMs,
retryConfig.maxRetryDelayMs,
);
}
export function getLoaderConfigWithoutReties(
loderConfig: LoaderConfig,
): LoaderConfig {
return {
...loderConfig,
...{
errorRetry: null,
timeoutRetry: null,
},
};
}
export function shouldRetry(
retryConfig: RetryConfig | null | undefined,
retryCount: number,
isTimeout: boolean,
loaderResponse?: LoaderResponse | undefined,
): retryConfig is RetryConfig & boolean {
if (!retryConfig) {
return false;
}
const httpStatus = loaderResponse?.code;
const retry =
retryCount < retryConfig.maxNumRetry &&
(retryForHttpStatus(httpStatus) || !!isTimeout);
return retryConfig.shouldRetry
? retryConfig.shouldRetry(
retryConfig,
retryCount,
isTimeout,
loaderResponse,
retry,
)
: retry;
}
export function retryForHttpStatus(httpStatus: number | undefined): boolean {
// Do not retry on status 4xx, status 0 (CORS error), or undefined (decrypt/gap/parse error)
return (
offlineHttpStatus(httpStatus) ||
(!!httpStatus && (httpStatus < 400 || httpStatus > 499))
);
}
export function offlineHttpStatus(httpStatus: number | undefined): boolean {
return httpStatus === 0 && navigator.onLine === false;
}

Xet Storage Details

Size:
2.54 kB
·
Xet hash:
f7b458eefa48dc73f0e39b698e18fc2685c6778d2c1f96a3db44acdd4a499f51

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.