mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-04-30 11:23:24 +08:00
209 lines
4.2 KiB
Markdown
209 lines
4.2 KiB
Markdown
# StreamLoader API 文档
|
|
|
|
本文档由 `DeepSeek R1` 模型生成并微调。
|
|
|
|
```mermaid
|
|
graph LR
|
|
StreamLoader --> EventEmitter
|
|
|
|
click EventEmitter "https://nodejs.org/api/events.html#class-eventemitter"
|
|
```
|
|
|
|
## 类描述
|
|
|
|
`StreamLoader` 是流式加载大文件的核心类,支持分块读取网络资源并通过事件机制传递数据。继承自 `EventEmitter`,实现 `IStreamController` 接口,提供流传输控制能力。
|
|
|
|
---
|
|
|
|
## 属性说明
|
|
|
|
| 属性名 | 类型 | 描述 |
|
|
| --------- | --------- | ---------------------- |
|
|
| `url` | `string` | 只读,要加载的资源 URL |
|
|
| `loading` | `boolean` | 当前是否处于加载状态 |
|
|
|
|
---
|
|
|
|
## 构造方法
|
|
|
|
```typescript
|
|
function constructor(url: string): StreamLoader;
|
|
```
|
|
|
|
- **参数**
|
|
- `url`: 要加载的资源地址
|
|
|
|
**示例**
|
|
|
|
```typescript
|
|
const loader = new StreamLoader('/api/large-file');
|
|
```
|
|
|
|
---
|
|
|
|
## 方法说明
|
|
|
|
### `pipe`
|
|
|
|
```typescript
|
|
function pipe(reader: IStreamReader): this;
|
|
```
|
|
|
|
将流数据管道传递给读取器对象。
|
|
|
|
- **参数**
|
|
- `reader`: 实现 `IStreamReader` 接口的对象
|
|
|
|
**示例**
|
|
|
|
```typescript
|
|
class MyReader implements IStreamReader {
|
|
async pump(data, done) {
|
|
console.log('收到数据块:', data);
|
|
}
|
|
// ... 还有一些其他需要实现的方法,参考总是用示例
|
|
}
|
|
loader.pipe(new MyReader());
|
|
```
|
|
|
|
---
|
|
|
|
### `start`
|
|
|
|
```typescript
|
|
function start(): Promise<void>;
|
|
```
|
|
|
|
启动流传输流程(自动处理分块读取与分发)。
|
|
|
|
---
|
|
|
|
### `cancel`
|
|
|
|
```typescript
|
|
function cancel(reason?: string): void;
|
|
```
|
|
|
|
终止当前流传输。
|
|
|
|
- **参数**
|
|
- `reason`: 终止原因描述(可选)
|
|
|
|
**示例**
|
|
|
|
```typescript
|
|
// 用户取消加载
|
|
loader.cancel('用户手动取消');
|
|
```
|
|
|
|
---
|
|
|
|
## 事件说明
|
|
|
|
| 事件名 | 参数类型 | 触发时机 |
|
|
| ------ | --------------------------------- | ------------------------ |
|
|
| `data` | `data: Uint8Array, done: boolean` | 每接收到一个数据块时触发 |
|
|
|
|
**事件监听示例**
|
|
|
|
```typescript
|
|
loader.on('data', (data, done) => {
|
|
if (done) console.log('传输完成');
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
## 相关接口说明
|
|
|
|
### IStreamReader
|
|
|
|
```typescript
|
|
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`: 流传输结束时调用
|
|
|
|
---
|
|
|
|
## 总使用示例
|
|
|
|
```typescript
|
|
// 创建流加载器
|
|
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('视频解码错误');
|
|
```
|