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