54 lines
1.9 KiB
TypeScript
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) // 否则,继续处理数据块
|
|
}
|
|
}
|
|
} |