fenghuo/packages/tus/src/utils/models/StreamLimiter.ts

54 lines
1.9 KiB
TypeScript

import { Transform, type TransformCallback } from 'node:stream'
import { ERRORS } from '../constants'
// TODO: create HttpError and use it everywhere instead of throwing objects
/**
* MaxFileExceededError 类用于表示文件大小超出限制的错误。
* 继承自 Error 类,包含状态码和错误信息体。
*/
export class MaxFileExceededError extends Error {
status_code: number
body: string
constructor() {
super(ERRORS.ERR_MAX_SIZE_EXCEEDED.body)
this.status_code = ERRORS.ERR_MAX_SIZE_EXCEEDED.status_code
this.body = ERRORS.ERR_MAX_SIZE_EXCEEDED.body
Object.setPrototypeOf(this, MaxFileExceededError.prototype)
}
}
/**
* StreamLimiter 类用于限制流的大小,确保流的大小不超过指定的最大值。
* 继承自 Transform 类,用于对流进行转换操作。
*/
export class StreamLimiter extends Transform {
private maxSize: number // 允许的最大流大小
private currentSize = 0 // 当前流的大小
/**
* 构造函数,初始化 StreamLimiter 实例。
* @param maxSize 允许的最大流大小。
*/
constructor(maxSize: number) {
super()
this.maxSize = maxSize
}
/**
* _transform 方法是 Transform 类的核心方法,用于处理流中的数据块。
* 每次接收到数据块时,更新当前流的大小,并检查是否超出最大限制。
* 如果超出限制,则抛出 MaxFileExceededError 错误。
* @param chunk 当前处理的数据块。
* @param encoding 数据块的编码格式。
* @param callback 回调函数,用于处理完成后的操作。
*/
_transform(chunk: Buffer, encoding: BufferEncoding, callback: TransformCallback): void {
this.currentSize += chunk.length // 更新当前流的大小
if (this.currentSize > this.maxSize) {
callback(new MaxFileExceededError()) // 如果超出最大限制,抛出错误
} else {
callback(null, chunk) // 否则,继续处理数据块
}
}
}