Files
PrivyDrop/frontend/lib/receive/ReceptionConfig.ts
T
2025-09-26 14:02:55 +08:00

83 lines
2.4 KiB
TypeScript

/**
* 🚀 Reception configuration management
* Centralized configuration for file reception parameters
*/
export class ReceptionConfig {
// File size thresholds
static readonly FILE_CONFIG = {
LARGE_FILE_THRESHOLD: 1 * 1024 * 1024 * 1024, // 1GB - files larger than this will be saved to disk
CHUNK_SIZE: 65536, // 64KB standard chunk size
};
// Buffer management
static readonly BUFFER_CONFIG = {
MAX_BUFFER_SIZE: 100, // Buffer up to 100 chunks (approximately 6.4MB)
SEQUENTIAL_FLUSH_THRESHOLD: 10, // Start flushing when this many sequential chunks are available
};
// Performance and debugging
static readonly DEBUG_CONFIG = {
ENABLE_CHUNK_LOGGING: process.env.NODE_ENV === "development",
ENABLE_PROGRESS_LOGGING: process.env.NODE_ENV === "development",
PROGRESS_LOG_INTERVAL: 500, // Log progress every N chunks
COMPLETION_CHECK_INTERVAL: 100, // Check completion every N ms
};
// Network and timing
static readonly NETWORK_CONFIG = {
FIREFOX_COMPATIBILITY_DELAY: 10, // ms delay for Firefox compatibility
FINALIZATION_TIMEOUT: 30020, // 30s timeout for file finalization
GRACEFUL_SHUTDOWN_TIMEOUT: 5000, // 5s timeout for graceful shutdown
};
// Validation thresholds
static readonly VALIDATION_CONFIG = {
MAX_SIZE_DIFFERENCE_BYTES: 1024, // Allow up to 1KB size difference for validation
MIN_PACKET_SIZE: 4, // Minimum embedded packet size (4 bytes for length header)
};
/**
* Get chunk index from file offset
*/
static getChunkIndexFromOffset(offset: number): number {
return Math.floor(offset / this.FILE_CONFIG.CHUNK_SIZE);
}
/**
* Get file offset from chunk index
*/
static getOffsetFromChunkIndex(chunkIndex: number): number {
return chunkIndex * this.FILE_CONFIG.CHUNK_SIZE;
}
/**
* Calculate expected chunks count for file size and offset
*/
static calculateExpectedChunks(
fileSize: number,
startOffset: number = 0
): number {
return Math.ceil((fileSize - startOffset) / this.FILE_CONFIG.CHUNK_SIZE);
}
/**
* Calculate total chunks in file
*/
static calculateTotalChunks(fileSize: number): number {
return Math.ceil(fileSize / this.FILE_CONFIG.CHUNK_SIZE);
}
/**
* Check if file should be saved to disk
*/
static shouldSaveToDisk(
fileSize: number,
hasSaveDirectory: boolean
): boolean {
return (
hasSaveDirectory || fileSize >= this.FILE_CONFIG.LARGE_FILE_THRESHOLD
);
}
}