artplayer-plugin-p2p 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +198 -0
- package/dist/artplayer-plugin-p2p.iife.js +80 -0
- package/dist/chunk-IX2RPNML.mjs +279 -0
- package/dist/index.d.mts +202 -0
- package/dist/index.d.ts +202 -0
- package/dist/index.js +969 -0
- package/dist/index.mjs +677 -0
- package/dist/pure.d.mts +48 -0
- package/dist/pure.d.ts +48 -0
- package/dist/pure.js +309 -0
- package/dist/pure.mjs +24 -0
- package/dist/stats-CFbDXEsi.d.mts +294 -0
- package/dist/stats-CFbDXEsi.d.ts +294 -0
- package/package.json +84 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 iuk-ink
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# artplayer-plugin-p2p
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/artplayer-plugin-p2p)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](https://github.com/zhw2590582/ArtPlayer)
|
|
6
|
+
[](https://github.com/video-dev/hls.js)
|
|
7
|
+
|
|
8
|
+
[在线演示](https://iuk-ink.github.io/artplayer-plugin-p2p/demo/) · [报告问题](https://github.com/iuk-ink/artplayer-plugin-p2p/issues)
|
|
9
|
+
|
|
10
|
+
[ArtPlayer](https://github.com/zhw2590582/ArtPlayer) 的 P2P 流媒体加速插件,基于 [p2p-media-loader](https://github.com/Novage/p2p-media-loader)(hls.js 引擎)。
|
|
11
|
+
|
|
12
|
+
观众之间互相分享分片数据,降低源站与 CDN 带宽成本,提升弱网环境下的播放体验。
|
|
13
|
+
|
|
14
|
+
## 特性
|
|
15
|
+
|
|
16
|
+
- **无损动态开关**:运行时切换 P2P / 仅上传模式,不销毁 hls.js 实例、不断流、不重新缓冲
|
|
17
|
+
|
|
18
|
+
- **模式保持**:换源、重连、fatal 自愈重建后开关状态不丢失
|
|
19
|
+
|
|
20
|
+
- **三级自愈**:网络级重启加载 → 媒体级软恢复 → 有界销毁重建;重试上限可配置,耗尽后发出 `p2p:fatalError` 交由宿主决策
|
|
21
|
+
|
|
22
|
+
- **统计可观测**:速率 / 占比 / Peers / 累计流量,面板与 `getStats()` 双通道
|
|
23
|
+
|
|
24
|
+
- **全量透传**:p2p-media-loader 与 hls.js 配置原样透传,无私有黑盒
|
|
25
|
+
|
|
26
|
+
- **类型完备**:全部选项、句柄与 15 个引擎 `p2p:*` 事件均有 TypeScript 类型
|
|
27
|
+
|
|
28
|
+
- **UI 可选**:统计面板 / 设置开关组 / 单项开关均可独立开关
|
|
29
|
+
|
|
30
|
+
## 安装
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install artplayer-plugin-p2p
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
或通过 CDN(自包含 IIFE,内含 hls.js 与 p2p-media-loader):
|
|
37
|
+
|
|
38
|
+
```html
|
|
39
|
+
<script src="https://cdn.jsdelivr.net/npm/artplayer-plugin-p2p/dist/artplayer-plugin-p2p.iife.js"></script>
|
|
40
|
+
<!-- 全局暴露 artplayerPluginP2P -->
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
> ESM/CJS 接入时 hls.js 与 artplayer 为 peerDependency,与宿主共享实例;
|
|
44
|
+
> 需要确保宿主环境已安装 `hls.js@^1.7.0` 与 `artplayer@>=5.0.0`。
|
|
45
|
+
|
|
46
|
+
## 快速开始
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
import Artplayer from 'artplayer'
|
|
50
|
+
import artplayerPluginP2P from 'artplayer-plugin-p2p'
|
|
51
|
+
|
|
52
|
+
const art = new Artplayer({
|
|
53
|
+
container: '.player',
|
|
54
|
+
url: 'https://example.com/stream.m3u8',
|
|
55
|
+
type: 'm3u8',
|
|
56
|
+
setting: true,
|
|
57
|
+
plugins: [artplayerPluginP2P()],
|
|
58
|
+
})
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
无需任何配置即可工作(公共 tracker + WebRTC)。带配置示例:
|
|
62
|
+
|
|
63
|
+
```js
|
|
64
|
+
artplayerPluginP2P({
|
|
65
|
+
enabled: true,
|
|
66
|
+
uploadEnabled: true,
|
|
67
|
+
stats: true,
|
|
68
|
+
ui: { setting: true },
|
|
69
|
+
core: {
|
|
70
|
+
swarmId: 'my-channel-1080p',
|
|
71
|
+
},
|
|
72
|
+
tracker: {
|
|
73
|
+
announceTrackers: ['wss://tracker.openwebtorrent.com'],
|
|
74
|
+
rtcConfig: {
|
|
75
|
+
iceServers: [{ urls: 'stun:stun.l.google.com:19302' }],
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
hls: { maxBufferLength: 30, capLevelToPlayerSize: true },
|
|
79
|
+
})
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 配置项
|
|
83
|
+
|
|
84
|
+
### 插件选项 `P2POptions`
|
|
85
|
+
|
|
86
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
87
|
+
| ------------------- | ------------------------- | -------- | ----------------------------------------------------------- |
|
|
88
|
+
| `type` | `string` | `'m3u8'` | customType 注册的格式名(换源重入的识别键) |
|
|
89
|
+
| `enabled` | `boolean` | `true` | P2P 加速初始状态 |
|
|
90
|
+
| `uploadEnabled` | `boolean` | `true` | 上传开关初始状态(false = 仅下载) |
|
|
91
|
+
| `stats` | `boolean` | `true` | 统计面板 + 右键「P2P 统计」入口;false 时仅可编程读取 |
|
|
92
|
+
| `fatalRetryMax` | `number` | `2` | fatal 错误销毁重建的最大次数 |
|
|
93
|
+
| `core` | `Partial<CoreConfig>` | — | p2p-media-loader core 配置,原样透传;`isP2PDisabled` / `isP2PUploadDisabled` 由插件开关状态接管 |
|
|
94
|
+
| `tracker` | `P2PTrackerOptions` | — | 信令服务器快捷配置组(字段与 core 同名),与 `core` 浅合并且优先 |
|
|
95
|
+
| `hls` | `Partial<HlsConfig>` | — | hls.js 配置,原样透传 |
|
|
96
|
+
| `ui` | `boolean \| P2PUIOptions` | `true` | UI 总闸;`false` 关闭全部 UI 组件 |
|
|
97
|
+
|
|
98
|
+
> `core` 的动态子集(时间窗 / 超时 / 并发数 / 开关等)可经句柄 `applyDynamicConfig()` 在播放中调整;
|
|
99
|
+
> `swarmId` 等静态属性由 p2p-media-loader 防篡改,hls.js 配置仅在实例创建时生效。
|
|
100
|
+
|
|
101
|
+
### UI 选项 `P2PUIOptions`
|
|
102
|
+
|
|
103
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
104
|
+
| --------- | ----------------------------------- | ------ | --------- |
|
|
105
|
+
| `setting` | `boolean \| P2PSettingItemsOptions` | `true` | 设置开关组显示配置 |
|
|
106
|
+
|
|
107
|
+
设置开关组支持**按项选择性显示**:
|
|
108
|
+
|
|
109
|
+
- `true` / 省略:三项全显
|
|
110
|
+
|
|
111
|
+
- `false`:整组不挂载
|
|
112
|
+
|
|
113
|
+
- 对象:按项控制,未指定的项默认显示
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
interface P2PSettingItemsOptions {
|
|
117
|
+
/** 「P2P 加速」开关 */
|
|
118
|
+
p2pEnabled?: boolean
|
|
119
|
+
/** 「仅上传模式」开关 */
|
|
120
|
+
uploadOnly?: boolean
|
|
121
|
+
/** 「P2P 统计」开关(stats: false 时无面板可开,此项不生效) */
|
|
122
|
+
stats?: boolean
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
示例:
|
|
127
|
+
|
|
128
|
+
```js
|
|
129
|
+
artplayerPluginP2P({
|
|
130
|
+
// 只显示「P2P 加速」一个开关
|
|
131
|
+
ui: { setting: { uploadOnly: false, stats: false } },
|
|
132
|
+
})
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
门控优先级:`ui: false` > `stats: false` > `ui.setting` >
|
|
136
|
+
宿主 `option.setting`(宿主未开启设置面板时插件自动跳过挂载)。
|
|
137
|
+
|
|
138
|
+
## 插件句柄
|
|
139
|
+
|
|
140
|
+
```js
|
|
141
|
+
const handle = art.plugins.artplayerPluginP2P
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
| 成员 | 说明 |
|
|
145
|
+
| -------------------------------------- | ------------------------------------------------ |
|
|
146
|
+
| `setP2PEnabled(value)` | 无损切换 P2P 加速(不断流、不重建实例) |
|
|
147
|
+
| `setUploadEnabled(value)` | 无损切换上传开关 |
|
|
148
|
+
| `isP2PEnabled()` / `isUploadEnabled()` | 读取当前开关状态 |
|
|
149
|
+
| `applyDynamicConfig(config)` | 运行时调整 p2p-media-loader 动态配置 |
|
|
150
|
+
| `getStats()` | 统计快照(速率 / 占比 / 峰值 / 累计流量) |
|
|
151
|
+
| `reload()` | 按当前配置重建(保持开关状态与原始 URL) |
|
|
152
|
+
| `destroy()` | 销毁当前播放实例(播放器销毁时引擎随之自动释放) |
|
|
153
|
+
| `hls` | 当前 hls.js 实例(可与 artplayer-plugin-hls-control 协作) |
|
|
154
|
+
| `engine` | 当前 p2p-media-loader 引擎实例 |
|
|
155
|
+
|
|
156
|
+
## 事件
|
|
157
|
+
|
|
158
|
+
引擎事件命名与 p2p-media-loader 4.0 官方 `CoreEventMap` 一一对应(编译期穷尽校验),全部带 `p2p:` 前缀:
|
|
159
|
+
|
|
160
|
+
```js
|
|
161
|
+
// p2pml 4.0 事件为单参数对象:PeerDetails { peerId, infoHash, streamType, trackerUrl }
|
|
162
|
+
art.on('p2p:peerConnect', (details) => { /* ... */ })
|
|
163
|
+
art.on('p2p:stateChange', ({ p2pEnabled, uploadEnabled }) => { /* ... */ })
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
| 分类 | 事件 |
|
|
167
|
+
| ------ | -------------------------------------------------------------------------------------------------------------------------- |
|
|
168
|
+
| 流注册 | `p2p:streamAdded` `p2p:streamRegistrationError` |
|
|
169
|
+
| 分片生命周期 | `p2p:segmentStart` `p2p:segmentLoaded` `p2p:segmentError` `p2p:segmentAbort` |
|
|
170
|
+
| 下载计数 | `p2p:chunkDownloaded` `p2p:chunkUploaded` |
|
|
171
|
+
| 对等网络 | `p2p:peerConnect` `p2p:peerConnectError` `p2p:peerClose` `p2p:peerError` `p2p:peerWarning` |
|
|
172
|
+
| 信令 | `p2p:trackerError` `p2p:trackerWarning` |
|
|
173
|
+
| 插件自身 | `p2p:stateChange`(开关切换)`p2p:fatalError`(fatal 通知与重建耗尽) |
|
|
174
|
+
|
|
175
|
+
## 纯逻辑入口
|
|
176
|
+
|
|
177
|
+
```js
|
|
178
|
+
import { resolveOptions, applyRuntimeToggle, P2PStatsEngine } from 'artplayer-plugin-p2p/pure'
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
不引入 hls.js / DOM 依赖,可在 Node 环境直接使用(统计引擎、带宽计算、选项解析)。
|
|
182
|
+
|
|
183
|
+
## 开发
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
npm install
|
|
187
|
+
npm run build # 构建(IIFE 产物自动同步至 demo/vendor)
|
|
188
|
+
npm test # 聚合测试(pure 单测 + 产物冒烟;需先 npm run build)
|
|
189
|
+
npm run typecheck # 类型检查
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
`demo/` 为自包含演示页:插件产物随仓库提交至 `demo/vendor/`,
|
|
193
|
+
克隆仓库后直接双击 `demo/index.html` 即可体验;重新执行 `npm run build`
|
|
194
|
+
会自动同步最新产物(构建钩子复制,无需手动维护)。
|
|
195
|
+
|
|
196
|
+
## License
|
|
197
|
+
|
|
198
|
+
[MIT](LICENSE)
|