parallel-file-uploader
Version:
高性能并行文件上传工具,支持大文件分片上传、断点续传、Web Worker多线程处理
103 lines • 2.85 kB
JavaScript
/**
* 速度限制器
* 使用令牌桶算法控制上传速度
*/
export class SpeedLimiter {
constructor(maxBytesPerSecond = 0, enabled = false) {
this.maxBytesPerSecond = maxBytesPerSecond;
this.bucket = maxBytesPerSecond;
this.lastRefill = Date.now();
this.enabled = enabled;
}
/**
* 启用/禁用速度限制
*/
setEnabled(enabled) {
this.enabled = enabled;
}
/**
* 检查是否启用
*/
isEnabled() {
return this.enabled;
}
/**
* 设置最大上传速度
*/
setMaxBytesPerSecond(maxBytesPerSecond) {
this.maxBytesPerSecond = maxBytesPerSecond;
this.bucket = Math.min(this.bucket, maxBytesPerSecond);
}
/**
* 获取当前速度限制
*/
getMaxBytesPerSecond() {
return this.maxBytesPerSecond;
}
/**
* 请求发送指定字节数的数据
* 返回需要等待的毫秒数
*/
async requestBytes(bytes) {
if (!this.enabled || this.maxBytesPerSecond <= 0) {
return 0;
}
// 重新填充令牌桶
this.refillBucket();
if (bytes <= this.bucket) {
// 有足够的令牌,直接消费
this.bucket -= bytes;
return 0;
}
else {
// 令牌不足,计算需要等待的时间
const deficit = bytes - this.bucket;
const waitTime = Math.ceil((deficit / this.maxBytesPerSecond) * 1000);
// 等待后消费所有令牌
this.bucket = 0;
return waitTime;
}
}
/**
* 等待指定的延迟时间
*/
async wait(delayMs) {
if (delayMs > 0) {
await new Promise(resolve => setTimeout(resolve, delayMs));
}
}
/**
* 重新填充令牌桶
*/
refillBucket() {
const now = Date.now();
const timePassed = (now - this.lastRefill) / 1000; // 转换为秒
if (timePassed > 0) {
const tokensToAdd = timePassed * this.maxBytesPerSecond;
this.bucket = Math.min(this.bucket + tokensToAdd, this.maxBytesPerSecond);
this.lastRefill = now;
}
}
/**
* 重置令牌桶
*/
reset() {
this.bucket = this.maxBytesPerSecond;
this.lastRefill = Date.now();
}
/**
* 获取当前令牌桶状态
*/
getStatus() {
this.refillBucket();
return {
bucket: this.bucket,
maxBytesPerSecond: this.maxBytesPerSecond,
enabled: this.enabled,
utilizationPercent: this.maxBytesPerSecond > 0
? Math.round(((this.maxBytesPerSecond - this.bucket) / this.maxBytesPerSecond) * 100)
: 0
};
}
}
//# sourceMappingURL=SpeedLimiter.js.map