mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-04-30 11:23:24 +08:00
4.2 KiB
4.2 KiB
StreamLoader API 文档
本文档由 DeepSeek R1
模型生成并微调。
graph LR
StreamLoader --> EventEmitter
click EventEmitter "https://nodejs.org/api/events.html#class-eventemitter"
类描述
StreamLoader
是流式加载大文件的核心类,支持分块读取网络资源并通过事件机制传递数据。继承自 EventEmitter
,实现 IStreamController
接口,提供流传输控制能力。
属性说明
属性名 | 类型 | 描述 |
---|---|---|
url |
string |
只读,要加载的资源 URL |
loading |
boolean |
当前是否处于加载状态 |
构造方法
function constructor(url: string): StreamLoader;
- 参数
url
: 要加载的资源地址
示例
const loader = new StreamLoader('/api/large-file');
方法说明
pipe
function pipe(reader: IStreamReader): this;
将流数据管道传递给读取器对象。
- 参数
reader
: 实现IStreamReader
接口的对象
示例
class MyReader implements IStreamReader {
async pump(data, done) {
console.log('收到数据块:', data);
}
// ... 还有一些其他需要实现的方法,参考总是用示例
}
loader.pipe(new MyReader());
start
function start(): Promise<void>;
启动流传输流程(自动处理分块读取与分发)。
cancel
function cancel(reason?: string): void;
终止当前流传输。
- 参数
reason
: 终止原因描述(可选)
示例
// 用户取消加载
loader.cancel('用户手动取消');
事件说明
事件名 | 参数类型 | 触发时机 |
---|---|---|
data |
data: Uint8Array, done: boolean |
每接收到一个数据块时触发 |
事件监听示例
loader.on('data', (data, done) => {
if (done) console.log('传输完成');
});
相关接口说明
IStreamReader
export interface IStreamReader<T = any> {
/**
* 接受字节流流传输的数据
* @param data 传入的字节流数据,只包含本分块的内容
* @param done 是否传输完成
*/
pump(
data: Uint8Array | undefined,
done: boolean,
response: Response
): Promise<void>;
/**
* 当前对象被传递给加载流时执行的函数
* @param controller 传输流控制对象
*/
piped(controller: IStreamController<T>): void;
/**
* 开始流传输
* @param stream 传输流对象
* @param controller 传输流控制对象
*/
start(
stream: ReadableStream,
controller: IStreamController<T>,
response: Response
): Promise<void>;
/**
* 结束流传输
* @param done 是否传输完成,如果为 false 的话,说明可能是由于出现错误导致的终止
* @param reason 如果没有传输完成,那么表示失败的原因
*/
end(done: boolean, reason?: string): void;
}
pump
: 处理每个数据块piped
: 当读取器被绑定到流时调用start
: 流传输开始时调用end
: 流传输结束时调用
总使用示例
// 创建流加载器
const loader = new StreamLoader('/api/video-stream');
const videoElement = document.createElement('video');
// 实现自定义读取器
class VideoStreamReader implements IStreamReader {
async pump(data, done) {
if (data) videoElement.appendBuffer(data);
if (done) videoElement.play();
}
piped(controller) {
console.log('流传输管道连接成功');
}
start() {
console.log('开始流式加载');
}
end() {
console.log('流式加载结束');
}
}
const reader = new VideoStreamReader();
// 绑定读取器并启动
loader.pipe(reader);
loader.start();
// 监听进度
loader.on('data', (_, done) => {
if (!done) updateProgressBar();
});
// 错误处理
videoElement.onerror = () => loader.cancel('视频解码错误');