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

54 lines
1.9 KiB
TypeScript
Raw Normal View History

2025-05-27 16:56:50 +08:00
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) // 否则,继续处理数据块
}
}
}