@video-supply/dahua-player 0.1.1 → 0.1.3

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/README.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # @video-supply/dahua-player
2
2
 
3
- [English](#api) | [中文](#中文文档)
3
+ - [English](#english)
4
+ - [中文](#zh)
5
+
6
+ <a id="english"></a>
7
+
8
+ ## English
4
9
 
5
10
  Dahua (WSPlayer) browser player wrapper. It provides a single entry API:
6
11
 
@@ -8,17 +13,13 @@ Dahua (WSPlayer) browser player wrapper. It provides a single entry API:
8
13
 
9
14
  This package includes Dahua static assets (`wsplayer-gov/`) and copies them into your app's static directory on install.
10
15
 
11
- ## Install
16
+ ### Install
12
17
 
13
18
  ```bash
14
19
  npm i @video-supply/dahua-player
15
20
  ```
16
21
 
17
- ## 中文文档
18
-
19
- - [README.zh-CN.md](./README.zh-CN.md)
20
-
21
- ## Quick Start
22
+ ### Quick Start
22
23
 
23
24
  ```ts
24
25
  import { DahuaPlayer } from '@video-supply/dahua-player';
@@ -36,7 +37,7 @@ const player = DahuaPlayer.init({
36
37
  await player.ready;
37
38
  ```
38
39
 
39
- ### Multi-window / Record helpers
40
+ #### Multi-window / Record helpers
40
41
 
41
42
  ```ts
42
43
  const player = DahuaPlayer.init({
@@ -61,9 +62,9 @@ player.sdk.jumpPlayByDateTime('2026-03-01 12:00:00', 0);
61
62
  player.sdk.setFullScreen();
62
63
  ```
63
64
 
64
- ## API
65
+ ### API
65
66
 
66
- ### DahuaPlayer.init(options)
67
+ #### DahuaPlayer.init(options)
67
68
 
68
69
  Required:
69
70
 
@@ -94,7 +95,7 @@ Optional:
94
95
 
95
96
  Returns: `DahuaPlayerInstance`
96
97
 
97
- ### Instance methods
98
+ #### Instance methods
98
99
 
99
100
  - `ready: Promise<void>`
100
101
  - Resolves when WSPlayer initialization is completed (initializationCompleted).
@@ -109,7 +110,7 @@ Returns: `DahuaPlayerInstance`
109
110
  - Subscribe/unsubscribe events: `ready` / `play` / `pause` / `error` / `destroy`.
110
111
  - `play` payload: `{ mode?: 'real' | 'record' }`.
111
112
 
112
- ### SDK methods (`instance.sdk`)
113
+ #### SDK methods (`instance.sdk`)
113
114
 
114
115
  - `getRaw(): any`
115
116
  - Returns the underlying WSPlayer/PlayerManager instance (debugging or unwrapped methods).
@@ -150,7 +151,7 @@ Returns: `DahuaPlayerInstance`
150
151
  - Fallback to call an underlying WSPlayer method by name.
151
152
  - Throws if method is missing.
152
153
 
153
- ### Events
154
+ #### Events
154
155
 
155
156
  - `ready`
156
157
  - `play` (payload: `{ mode?: 'real' | 'record' }`)
@@ -158,11 +159,11 @@ Returns: `DahuaPlayerInstance`
158
159
  - `error` (payload: `unknown`)
159
160
  - `destroy`
160
161
 
161
- ## Static assets
162
+ ### Static assets
162
163
 
163
164
  By default, on installation this package copies:
164
165
 
165
- - `node_modules/@company/dahua-player/wsplayer-gov`
166
+ - `node_modules/@video-supply/dahua-player/wsplayer-gov`
166
167
 
167
168
  to your project:
168
169
 
@@ -172,27 +173,231 @@ Then the SDK is loaded from:
172
173
 
173
174
  - `/wsplayer-gov/wsplayer.min.js`
174
175
 
175
- ### Disable postinstall copy
176
+ #### Disable postinstall copy
176
177
 
177
178
  ```bash
178
179
  set DAHUA_PLAYER_SKIP_POSTINSTALL=1
179
- npm i @company/dahua-player --registry <PRIVATE_REGISTRY>
180
+ npm i @video-supply/dahua-player
180
181
  ```
181
182
 
182
183
  Then manually copy:
183
184
 
184
- - `node_modules/@company/dahua-player/wsplayer-gov` → `public/wsplayer-gov`
185
+ - `node_modules/@video-supply/dahua-player/wsplayer-gov` → `public/wsplayer-gov`
185
186
 
186
- ### Change public dir
187
+ #### Change public dir
187
188
 
188
189
  ```bash
189
190
  set DAHUA_PLAYER_PUBLIC_DIR=static
190
- npm i @company/dahua-player --registry <PRIVATE_REGISTRY>
191
+ npm i @video-supply/dahua-player
191
192
  ```
192
193
 
193
- ## Release (private registry)
194
+ <a id="zh"></a>
195
+
196
+ ## 中文
197
+
198
+ 这是对大华 WSPlayer 的轻量封装,提供单入口初始化:
199
+
200
+ - `DahuaPlayer.init(options)`
201
+
202
+ 并对外暴露常用的播放/回放/倍速/跳转/全屏/布局切换等能力。
203
+
204
+ ### 安装
194
205
 
195
206
  ```bash
196
- set NPM_REGISTRY=<PRIVATE_REGISTRY>
197
- npm run release:private
207
+ npm i @video-supply/dahua-player
208
+ ```
209
+
210
+ ### 快速开始
211
+
212
+ ```ts
213
+ import { DahuaPlayer } from '@video-supply/dahua-player';
214
+
215
+ const player = DahuaPlayer.init({
216
+ container: 'player',
217
+ auth: {
218
+ token: 'YOUR_DAHUA_TOKEN',
219
+ ip: '10.3.156.238',
220
+ port: 8320,
221
+ },
222
+ cameraId: 'YOUR_CAMERA_ID',
223
+ autoPlay: true,
224
+ width: 'auto',
225
+ height: 'auto',
226
+ });
227
+
228
+ await player.ready;
229
+ ```
230
+
231
+ ### 初始化参数(DahuaPlayer.init)
232
+
233
+ 必填:
234
+
235
+ - `container: HTMLElement | string`
236
+ - `auth: { token: string; ip?: string; port?: number; protocol?: 'http' | 'https' }`
237
+
238
+ 字段解释:
239
+
240
+ - `container`
241
+ - 播放器挂载容器
242
+ - `string`:按 DOM id 查找
243
+ - `HTMLElement`:直接使用该元素
244
+ - `auth.token`
245
+ - 鉴权 token(必填)
246
+ - 仅做非空校验;内部通过 sessionStorage shim 注入给 WSPlayer 使用,避免 token 落盘
247
+ - `auth.ip`
248
+ - 现场部署的大华平台 IP(可选)
249
+ - 用于内部拼装 `targetOrigin`,写入 `sessionStorage.wsplayer_origin`,可在网关/nginx 侧用于代理转发
250
+ - `auth.port`
251
+ - 现场部署的大华平台端口(可选)
252
+ - 同上,用于拼装 `targetOrigin`
253
+ - `auth.protocol`
254
+ - 协议(可选):`http` 或 `https`(默认 `https`)
255
+
256
+ 播放相关:
257
+
258
+ - `mode?: 'real' | 'record'`
259
+ - 播放模式:实时预览 / 录像回放(默认 `real`)
260
+ - `cameraId?: string`
261
+ - 单通道编码(可选)
262
+ - `cameraIds?: string[]`
263
+ - 多通道编码(可选)
264
+ - 最终实际播放数量会按“当前路数 num”裁剪
265
+ - `autoPlay?: boolean`
266
+ - `true` 时在 `ready` 后自动触发一次播放(默认 `false`)
267
+ - `mode=real` 需要 `cameraId/cameraIds` 至少一个存在
268
+ - `mode=record` 需要 `recordStartTime/recordEndTime` 且 `cameraId/cameraIds` 至少一个存在
269
+ - `recordStartTime?: number`
270
+ - 录像回放开始时间(Unix 秒)
271
+ - 仅 `mode=record + autoPlay=true` 使用
272
+ - `recordEndTime?: number`
273
+ - 录像回放结束时间(Unix 秒)
274
+ - 仅 `mode=record + autoPlay=true` 使用
275
+ - `recordSource?: number`
276
+ - 录像来源(透传给 WSPlayer)
277
+ - 仅 `mode=record + autoPlay=true` 使用
278
+ - `streamType?: 1 | 2 | 3`
279
+ - 码流类型:1 主码流 / 2 辅码流1 / 3 辅码流2(默认 `2`)
280
+ - `searchOnline?: boolean`
281
+ - 是否由组件内部查询在线状态(默认 `false`)
282
+
283
+ 布局/显示:
284
+
285
+ - `num?: number`
286
+ - 初始显示路数(默认 `1`)
287
+ - 常用值:`1/4/9/16/25`
288
+ - `maxNum?: number`
289
+ - 最大支持路数(默认 `1`)
290
+ - 上限仍受 WSPlayer 内核与浏览器性能影响
291
+ - `showRecordProgressBar?: boolean`
292
+ - 是否展示录像回放时间轴
293
+ - 未传时:`record` 默认 `true`,`real` 默认 `false`
294
+ - `dblClickFullscreen?: boolean`
295
+ - 是否启用双击切换全屏/退出全屏(默认 `true`)
296
+
297
+ 高级:
298
+
299
+ - `staticPath?: string`
300
+ - 静态资源根路径(默认 `/wsplayer-gov`)
301
+ - `sdkUrl?: string`
302
+ - WSPlayer 脚本地址(默认 `/wsplayer-gov/wsplayer.min.js`)
303
+ - `playerOptions?: Record<string, unknown>`
304
+ - 透传给底层 `PlayerManager` 的原始配置(与内部默认配置合并)
305
+ - `debug?: boolean`
306
+ - 是否打印库内部调试日志
307
+ - 回调
308
+ - `onReady`:内核初始化完成(不等同于播放成功)
309
+ - `onPlay`:播放成功(包含 real/record)
310
+ - `onPause`:暂停
311
+ - `onError`:初始化/播放等错误
312
+ - `onDestroy`:销毁
313
+ - `onSdkMessage`:透出 WSPlayer 原始消息(排障用)
314
+
315
+ ### 实例与 SDK 方法
316
+
317
+ ```ts
318
+ const instance = DahuaPlayer.init(...);
319
+ await instance.ready;
320
+ ```
321
+
322
+ - `instance.ready: Promise<void>`
323
+ - 初始化完成后 resolve(对应 WSPlayer 的 initializationCompleted)
324
+ - 只代表内核初始化完成,不代表已经播放成功
325
+ - `instance.pause(): void`
326
+ - 暂停当前播放窗口(默认窗口 0)
327
+ - 语义等价于调用 `instance.sdk.pause()`(库内部做了兼容处理)
328
+ - `instance.destroy(): void`
329
+ - 销毁播放器实例并释放资源
330
+ - 会移除 DOM、清理定时器、释放 sessionStorage shim
331
+ - `instance.on(event, handler) / instance.off(event, handler)`
332
+ - 订阅/取消订阅事件:`ready` / `play` / `pause` / `error` / `destroy`
333
+ - `play` 事件 payload:`{ mode?: 'real' | 'record' }`
334
+
335
+ `instance.sdk`:
336
+
337
+ - `getRaw(): any`
338
+ - 获取底层 WSPlayer/PlayerManager 实例(用于排障或调用未封装能力)
339
+ - `playRealVideo(opt: any): void`
340
+ - 实时预览播放
341
+ - `opt` 透传给底层,同时支持以下通道入参(优先级从高到低):
342
+ - `opt.channelList`(数组:`[{ channelCode: string }, ...]`)
343
+ - `opt.cameraIds` / `opt.cameraId`(内部会转为 channelList)
344
+ - 初始化时的 `cameraIds/cameraId`
345
+ - 多通道时会按当前路数 `num` 自动裁剪(最多播放 `num` 路)
346
+ - `playRecordVideo(opt: any): void`
347
+ - 录像回放播放
348
+ - 通道入参与裁剪规则同 `playRealVideo`
349
+ - 常用字段(透传底层):`startTime/endTime/recordSource`
350
+ - `pause(windowIndex?): void`
351
+ - 暂停指定窗口
352
+ - `windowIndex` 不传时默认暂停当前窗口(底层实现可能按 0 处理)
353
+ - `play(windowIndex?): void`
354
+ - 继续播放指定窗口
355
+ - `close(windowIndex?): void`
356
+ - 关闭指定窗口播放
357
+ - `setPlayerNum(num: number): void`
358
+ - 切换布局路数(例如 1/4/9/16)
359
+ - 变更后多通道播放的最大数量会随之变化(按新路数裁剪)
360
+ - `jumpPlayByDateTime(datetime: string | Date | number, index?: number): void`
361
+ - 录像跳转播放(仅 `mode=record` 可用)
362
+ - `datetime` 支持:
363
+ - `string`:推荐 `YYYY-MM-DD HH:mm:ss`
364
+ - `Date`
365
+ - `number`:时间戳(秒或毫秒,内部会自动兼容)
366
+ - `index`:窗口索引(默认窗口 0)
367
+ - `playSpeed(speed: number, index: number): void`
368
+ - 设置录像回放倍速(仅 `mode=record` 可用)
369
+ - `speed` 支持:`0.125/0.25/0.5/1/1.25/1.5/2/4/8`
370
+ - `index`:窗口索引(通常传 0)
371
+ - `setFullScreen(): void`
372
+ - 设置播放器全屏
373
+ - 优先调用 WSPlayer 内核全屏;如内核不支持,则回退浏览器 Fullscreen API
374
+ - `setExitFullScreen(): void`
375
+ - 退出全屏
376
+ - 优先调用 WSPlayer 内核;如内核不支持,则回退浏览器 Fullscreen API
377
+ - `callRaw(method: string, ...args: any[]): any`
378
+ - 兜底调用底层实例的方法
379
+ - `method` 为底层方法名字符串(不存在会抛出错误)
380
+
381
+ ### 录像回放示例(多路 + 跳转 + 倍速)
382
+
383
+ ```ts
384
+ const player = DahuaPlayer.init({
385
+ container: 'player',
386
+ auth: { token: 'YOUR_DAHUA_TOKEN' },
387
+ mode: 'record',
388
+ cameraIds: ['ID_1', 'ID_2', 'ID_3', 'ID_4'],
389
+ num: 4,
390
+ maxNum: 16,
391
+ });
392
+
393
+ await player.ready;
394
+
395
+ player.sdk.playRecordVideo({
396
+ startTime: Math.floor(Date.now() / 1000) - 60,
397
+ endTime: Math.floor(Date.now() / 1000),
398
+ recordSource: 2,
399
+ });
400
+
401
+ player.sdk.playSpeed(2, 0);
402
+ player.sdk.jumpPlayByDateTime('2026-03-01 12:00:00', 0);
198
403
  ```
package/README.zh-CN.md CHANGED
@@ -1,4 +1,4 @@
1
- # @company/dahua-player(base-player)中文接入文档
1
+ # @video-supply/dahua-player 中文文档
2
2
 
3
3
  这是对大华 WSPlayer 的轻量封装,提供单入口初始化:
4
4
 
package/dist/index.cjs CHANGED
@@ -250,6 +250,7 @@ var PlayerAdapter = class {
250
250
  this.playerManager = null;
251
251
  this.destroyed = false;
252
252
  this.readyResolved = false;
253
+ this.lastStatus = null;
253
254
  this.currentNum = 1;
254
255
  this.currentMaxNum = 1;
255
256
  this.opts = opts;
@@ -356,8 +357,17 @@ var PlayerAdapter = class {
356
357
  return;
357
358
  }
358
359
  case "statusChanged": {
359
- if (data && typeof data === "object" && (data.status === "pause" || data.status === "paused")) {
360
- this.opts.emit("pause");
360
+ const status = data && typeof data === "object" ? data.status : void 0;
361
+ if (typeof status === "string" && status && status !== this.lastStatus) {
362
+ this.lastStatus = status;
363
+ if (status === "pause" || status === "paused") {
364
+ this.opts.emit("pause");
365
+ return;
366
+ }
367
+ if (status === "playing") {
368
+ this.opts.emit("play", { mode: this.opts.mode });
369
+ return;
370
+ }
361
371
  }
362
372
  return;
363
373
  }
@@ -676,8 +686,8 @@ var PlayerAdapter = class {
676
686
  this.playerManager.pause(0);
677
687
  } else if (typeof this.playerManager.close === "function") {
678
688
  this.playerManager.close(0);
689
+ this.opts.emit("pause");
679
690
  }
680
- this.opts.emit("pause");
681
691
  } catch {
682
692
  }
683
693
  }
@@ -690,8 +700,8 @@ var PlayerAdapter = class {
690
700
  this.playerManager.pause(idx);
691
701
  } else if (typeof this.playerManager.close === "function") {
692
702
  this.playerManager.close(idx);
703
+ this.opts.emit("pause");
693
704
  }
694
- this.opts.emit("pause");
695
705
  } catch {
696
706
  }
697
707
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/sdk/SdkLoader.ts","../src/sdk/TokenVault.ts","../src/sdk/SelfTargetOriginShim.ts","../src/sdk/PlayerAdapter.ts","../src/DahuaPlayer.ts"],"sourcesContent":["export { DahuaPlayer } from './DahuaPlayer';\nexport { ErrorCode, DahuaPlayerError } from './errors';\nexport type { DahuaPlayerInitOptions, DahuaPlayerInstance, DahuaPlayerEventMap, DahuaPlayerEventName } from './types';\n\n","export enum ErrorCode {\n CONTAINER_NOT_FOUND = 'CONTAINER_NOT_FOUND',\n INVALID_TOKEN = 'INVALID_TOKEN',\n SDK_LOAD_FAILED = 'SDK_LOAD_FAILED',\n SDK_LOAD_TIMEOUT = 'SDK_LOAD_TIMEOUT',\n SDK_INIT_FAILED = 'SDK_INIT_FAILED',\n PLAY_FAILED = 'PLAY_FAILED',\n NETWORK_DISCONNECTED = 'NETWORK_DISCONNECTED',\n DESTROYED = 'DESTROYED',\n}\n\nexport class DahuaPlayerError extends Error {\n code: ErrorCode;\n userMessage: string;\n cause?: unknown;\n\n constructor(params: { code: ErrorCode; message: string; userMessage: string; cause?: unknown }) {\n super(params.message);\n this.name = 'DahuaPlayerError';\n this.code = params.code;\n this.userMessage = params.userMessage;\n this.cause = params.cause;\n }\n}\n\nexport function toDahuaError(e: unknown, fallback: { code: ErrorCode; message: string; userMessage: string }) {\n if (e instanceof DahuaPlayerError) return e;\n const cause = e;\n return new DahuaPlayerError({ ...fallback, cause });\n}\n","type LoadScriptType = 'module' | 'text/javascript';\n\ntype SdkLoaderState = {\n scripts: Map<string, Promise<void>>;\n styles: Map<string, Promise<void>>;\n};\n\nconst state: SdkLoaderState = {\n scripts: new Map(),\n styles: new Map(),\n};\n\nfunction loadStyleOnce(href: string): Promise<void> {\n const url = href.trim();\n if (!url) return Promise.resolve();\n const existing = state.styles.get(url);\n if (existing) return existing;\n\n const p = new Promise<void>((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n link.onload = () => resolve();\n link.onerror = (e) => reject(e);\n document.head.appendChild(link);\n });\n\n state.styles.set(url, p);\n return p;\n}\n\nfunction loadScriptOnce(src: string, type: LoadScriptType): Promise<void> {\n const url = src.trim();\n if (!url) return Promise.resolve();\n const existing = state.scripts.get(url);\n if (existing) return existing;\n\n const p = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.type = type;\n script.src = url;\n script.onload = () => resolve();\n script.onerror = (e) => reject(e);\n document.head.appendChild(script);\n });\n\n state.scripts.set(url, p);\n return p;\n}\n\nfunction waitFor<T>(fn: () => T | null | undefined, timeoutMs: number): Promise<T> {\n const start = Date.now();\n return new Promise<T>((resolve, reject) => {\n const tick = () => {\n try {\n const v = fn();\n if (v) return resolve(v);\n } catch {}\n if (Date.now() - start >= timeoutMs) return reject(new Error('timeout'));\n setTimeout(tick, 50);\n };\n tick();\n });\n}\n\nexport async function ensureDahuaSdkLoaded(opts: { sdkUrl: string; cssUrl?: string; timeoutMs?: number }) {\n const sdkUrl = opts.sdkUrl;\n const cssUrl = opts.cssUrl;\n const timeoutMs = opts.timeoutMs ?? 20_000;\n\n if (cssUrl) {\n try {\n await loadStyleOnce(cssUrl);\n } catch {}\n }\n\n await loadScriptOnce(sdkUrl, 'module').catch(async () => {\n await loadScriptOnce(sdkUrl, 'text/javascript');\n });\n\n const PlayerManager = await waitFor(\n () => (window as any).PlayerManager as unknown,\n timeoutMs,\n );\n\n if (typeof PlayerManager !== 'function') {\n throw new Error('PlayerManager not available after SDK load');\n }\n}\n\n","type TokenShimState = {\n refCount: number;\n token: string | null;\n};\n\nconst state: TokenShimState = {\n refCount: 0,\n token: null,\n};\n\n/**\n * 将 token 同步到 sessionStorage。\n *\n * 背景:wsplayer 内部会从 `sessionStorage[tokenStorageKey] || localStorage[tokenStorageKey]`\n * 读取 token,并将其写入请求头 `X-Subject-Token`。因此这里需要保证 sessionStorage 中存在 psi_token。\n *\n * 注意:写入 sessionStorage 意味着 token 会在当前 tab 生命周期内可被同域脚本读取,\n * 请确保页面环境可信并注意 XSS 风险。\n */\nfunction syncToSessionStorage() {\n try {\n const ss = window.sessionStorage;\n if (!ss) return;\n if (state.token) {\n ss.setItem('psi_token', state.token);\n } else {\n ss.removeItem('psi_token');\n }\n } catch {}\n}\n\n/**\n * 设置当前 token。\n *\n * - 存入内存\n * - 若 shim 已启用,则立即同步到 sessionStorage.psi_token\n */\nexport function setToken(token: string | null) {\n state.token = token;\n if (state.refCount > 0) syncToSessionStorage();\n}\n\n/**\n * 获取当前内存 token。\n */\n/**\n * 启用 token 同步。\n *\n * - 使用 refCount 支持多个实例共存\n * - 只在第一次 acquire 时写入 sessionStorage\n */\nexport function acquireTokenShim() {\n state.refCount++;\n if (state.refCount !== 1) return;\n syncToSessionStorage();\n}\n\n/**\n * 释放 token 同步。\n *\n * - refCount 归零时清理 sessionStorage.psi_token\n */\nexport function releaseTokenShim() {\n if (state.refCount <= 0) return;\n state.refCount--;\n if (state.refCount !== 0) return;\n try {\n window.sessionStorage?.removeItem('psi_token');\n } catch {}\n}\n","type SelfTargetOriginShimState = {\n refCount: number;\n origin: string | null;\n originalXhrOpen: XMLHttpRequest['open'] | null;\n originalXhrSend: XMLHttpRequest['send'] | null;\n originalXhrSetRequestHeader: XMLHttpRequest['setRequestHeader'] | null;\n};\n\nconst state: SelfTargetOriginShimState = {\n refCount: 0,\n origin: null,\n originalXhrOpen: null,\n originalXhrSend: null,\n originalXhrSetRequestHeader: null,\n};\n\nfunction shouldAttachOrigin(url: unknown) {\n if (typeof url !== 'string') return false;\n return url.includes('/videoService/') || url.includes('videoService/');\n}\n\nfunction normalizeHeaderName(name: unknown) {\n return typeof name === 'string' ? name.trim().toLowerCase() : '';\n}\n\nexport function setSelfTargetOrigin(origin: string | null) {\n state.origin = typeof origin === 'string' ? origin.trim() || null : null;\n}\n\nexport function acquireSelfTargetOriginShim() {\n state.refCount++;\n if (state.refCount !== 1) return;\n\n try {\n const proto = XMLHttpRequest.prototype as any;\n if (typeof proto.open !== 'function' || typeof proto.send !== 'function' || typeof proto.setRequestHeader !== 'function') {\n return;\n }\n\n state.originalXhrOpen = proto.open;\n state.originalXhrSend = proto.send;\n state.originalXhrSetRequestHeader = proto.setRequestHeader;\n\n proto.open = function (...args: any[]) {\n try {\n (this as any).__dahua_request_url = args[1];\n (this as any).__dahua_has_self_target_origin = false;\n } catch {}\n return state.originalXhrOpen!.apply(this, args as any);\n };\n\n proto.setRequestHeader = function (name: string, value: string) {\n try {\n if (normalizeHeaderName(name) === 'self-targetorigin') {\n (this as any).__dahua_has_self_target_origin = true;\n }\n } catch {}\n return state.originalXhrSetRequestHeader!.call(this, name, value);\n };\n\n proto.send = function (...args: any[]) {\n try {\n const origin =\n state.origin ||\n window.sessionStorage?.getItem('wsplayer_origin') ||\n window.localStorage?.getItem('wsplayer_origin') ||\n null;\n const url = (this as any).__dahua_request_url;\n const alreadySet = Boolean((this as any).__dahua_has_self_target_origin);\n\n if (!alreadySet && origin && shouldAttachOrigin(url)) {\n state.originalXhrSetRequestHeader!.call(this, 'Self-TargetOrigin', origin);\n }\n } catch {}\n return state.originalXhrSend!.apply(this, args as any);\n };\n } catch {}\n}\n\nexport function releaseSelfTargetOriginShim() {\n if (state.refCount <= 0) return;\n state.refCount--;\n if (state.refCount !== 0) return;\n\n try {\n const proto = XMLHttpRequest.prototype as any;\n if (state.originalXhrOpen) proto.open = state.originalXhrOpen;\n if (state.originalXhrSend) proto.send = state.originalXhrSend;\n if (state.originalXhrSetRequestHeader) proto.setRequestHeader = state.originalXhrSetRequestHeader;\n } catch {}\n\n state.origin = null;\n state.originalXhrOpen = null;\n state.originalXhrSend = null;\n state.originalXhrSetRequestHeader = null;\n}\n","import { ErrorCode, DahuaPlayerError } from '../errors';\nimport type { DahuaPlayerMode, DahuaPlayerPlayerOptions } from '../types';\n\ntype ReceiveFn = (type: string, data: any) => void;\n\ntype PlayerAdapterOptions = {\n containerId: string;\n staticPath: string;\n mode: DahuaPlayerMode;\n cameraId?: string;\n cameraIds?: string[];\n streamType: 1 | 2 | 3;\n searchOnline: boolean;\n useNginxProxy?: boolean;\n nginxProxyHost?: string;\n useWSS?: boolean;\n num?: number;\n maxNum?: number;\n showRecordProgressBar?: boolean;\n playerOptions?: DahuaPlayerPlayerOptions;\n debug?: boolean;\n onMessage?: ReceiveFn;\n emit: (event: 'ready' | 'play' | 'pause' | 'error', payload?: any) => void;\n};\n\nexport class PlayerAdapter {\n private opts: PlayerAdapterOptions;\n private playerManager: any | null = null;\n private destroyed = false;\n private readyResolved = false;\n private currentNum = 1;\n private currentMaxNum = 1;\n\n constructor(opts: PlayerAdapterOptions) {\n this.opts = opts;\n }\n\n getRaw() {\n return this.playerManager;\n }\n\n init() {\n if (this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const PM = (window as any).PlayerManager;\n if (typeof PM !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'PlayerManager is not available',\n userMessage: '播放器内核未加载',\n });\n }\n\n const userReceive = this.opts.onMessage;\n const showRecordProgressBar =\n typeof this.opts.showRecordProgressBar === 'boolean'\n ? this.opts.showRecordProgressBar\n : this.opts.mode === 'record';\n const initialNum = this.normalizePositiveInt(\n this.opts.num ?? (this.opts.playerOptions as any)?.num ?? 1,\n 1,\n );\n const initialMaxNum = this.normalizePositiveInt(\n this.opts.maxNum ?? (this.opts.playerOptions as any)?.maxNum ?? initialNum,\n initialNum,\n );\n const defaultOptions: Record<string, unknown> = {\n type: this.opts.mode,\n num: initialNum,\n maxNum: initialMaxNum,\n showControl: false,\n showIcons: { hidden: true },\n showRecordProgressBar,\n useNginxProxy: this.opts.useNginxProxy ?? false,\n nginxProxyHost: this.opts.nginxProxyHost ?? '',\n useWSS: this.opts.useWSS ?? false,\n };\n const merged = {\n ...defaultOptions,\n ...(this.opts.playerOptions ?? {}),\n el: this.opts.containerId,\n STATIC_PATH: this.opts.staticPath,\n receiveMessageFromWSPlayer: (type: string, data: any) => {\n if (this.destroyed) return;\n\n try {\n userReceive?.(type, data);\n } catch {}\n\n this.handleSdkMessage(type, data);\n },\n };\n this.playerManager = new PM(merged);\n this.currentNum = this.normalizePositiveInt((merged as any).num, 1);\n this.currentMaxNum = this.normalizePositiveInt((merged as any).maxNum, this.currentNum);\n }\n\n private log(...args: any[]) {\n if (!this.opts.debug) return;\n try {\n console.log('[dahua-player]', ...args);\n } catch {}\n }\n\n private summarizeSdkMessage(type: string, data: any) {\n if (type === 'statusChanged') {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n return { status };\n }\n if (type === 'realError' || type === 'recordError') {\n const reason = data && typeof data === 'object' ? (data as any).reason : undefined;\n return { reason };\n }\n if (type === 'errorInfo') {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n const code = data && typeof data === 'object' ? (data as any).code : undefined;\n return { status, code };\n }\n return undefined;\n }\n\n private handleSdkMessage(type: string, data: any) {\n this.log('sdk', type, this.summarizeSdkMessage(type, data));\n switch (type) {\n case 'initializationCompleted': {\n if (!this.readyResolved) {\n this.readyResolved = true;\n this.opts.emit('ready');\n }\n return;\n }\n case 'realSuccess': {\n this.opts.emit('play', { mode: 'real' });\n return;\n }\n case 'recordSuccess': {\n this.opts.emit('play', { mode: 'record' });\n return;\n }\n case 'statusChanged': {\n if (data && typeof data === 'object' && (data.status === 'pause' || data.status === 'paused')) {\n this.opts.emit('pause');\n }\n return;\n }\n case 'windowNumChanged': {\n const n =\n typeof data === 'number'\n ? data\n : data && typeof data === 'object'\n ? ((data as any).num ?? (data as any).number ?? (data as any).windowNum)\n : undefined;\n const v = this.normalizePositiveInt(n, this.currentNum);\n this.currentNum = v;\n return;\n }\n case 'realError': {\n this.opts.emit(\n 'error',\n new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'Real play failed',\n userMessage: '实时预览失败',\n cause: data,\n }),\n );\n return;\n }\n case 'recordError': {\n this.opts.emit(\n 'error',\n new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'Record play failed',\n userMessage: '录像回放失败',\n cause: data,\n }),\n );\n return;\n }\n default:\n return;\n }\n }\n\n private normalizeChannelList(opt: any) {\n const fromOpt = opt && typeof opt === 'object' ? (opt as any).channelList : undefined;\n if (Array.isArray(fromOpt) && fromOpt.length > 0) return this.limitByCurrentNum(fromOpt);\n\n const idsFromOpt = this.normalizeCameraIds(\n opt && typeof opt === 'object' ? ((opt as any).cameraIds ?? (opt as any).cameraId) : undefined,\n );\n if (idsFromOpt.length > 0) return this.limitByCurrentNum(idsFromOpt.map((id) => ({ channelCode: id })));\n\n const initIds = this.normalizeCameraIds(this.opts.cameraIds);\n if (initIds.length > 0) return this.limitByCurrentNum(initIds.map((id) => ({ channelCode: id })));\n if (this.opts.cameraId) return [{ channelCode: this.opts.cameraId }];\n return null;\n }\n\n private normalizeCameraIds(input: unknown): string[] {\n const list: string[] = [];\n if (typeof input === 'string') {\n const v = input.trim();\n if (v) list.push(v);\n } else if (Array.isArray(input)) {\n for (const it of input) {\n if (typeof it !== 'string') continue;\n const v = it.trim();\n if (v) list.push(v);\n }\n }\n const uniq = Array.from(new Set(list));\n return uniq;\n }\n\n private limitByCurrentNum<T>(list: T[]): T[] {\n const cap = this.normalizePositiveInt(this.currentNum, 1);\n if (list.length <= cap) return list;\n const sliced = list.slice(0, cap);\n this.log('channelList truncated by layout', { cap, original: list.length });\n return sliced;\n }\n\n private normalizePositiveInt(input: unknown, fallback: number) {\n const n = typeof input === 'number' ? input : typeof input === 'string' ? Number(input) : NaN;\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.floor(n);\n }\n\n playRealVideo(opt: any) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const channelList = this.normalizeChannelList(opt);\n if (!channelList) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'channelList is required for real play',\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\n });\n }\n if (typeof this.playerManager.playRealVideo !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playRealVideo is not available',\n userMessage: '当前内核不支持实时预览播放',\n });\n }\n this.log('playRealVideo');\n this.playerManager.playRealVideo({ ...(opt ?? {}), channelList });\n }\n\n playRecordVideo(opt: any) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const channelList = this.normalizeChannelList(opt);\n if (!channelList) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'channelList is required for record play',\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\n });\n }\n if (typeof this.playerManager.playRecordVideo !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playRecordVideo is not available',\n userMessage: '当前内核不支持录像回放播放',\n });\n }\n this.log('playRecordVideo');\n this.playerManager.playRecordVideo({ ...(opt ?? {}), channelList });\n }\n\n setPlayerNum(num: number) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const v = this.normalizePositiveInt(num, this.currentNum);\n const fn = this.playerManager?.setPlayerNum;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setPlayerNum is not available',\n userMessage: '当前内核不支持切换布局路数',\n });\n }\n this.log('setPlayerNum', v);\n fn.call(this.playerManager, v);\n this.currentNum = v;\n }\n\n jumpPlayByDateTime(datetime: string | Date | number, index?: number) {\n if (this.opts.mode !== 'record') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime only supports record mode',\n userMessage: '实时预览不支持跳转播放',\n });\n }\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const dt = this.formatDateTime(datetime);\n const fn = this.pickMethod(['jumpPlayByDateTime', 'jumpPlayByDatetime']);\n if (!fn) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime is not available',\n userMessage: '当前内核不支持录像跳转播放',\n });\n }\n const idx = typeof index === 'number' ? Math.floor(index) : undefined;\n this.log('jumpPlayByDateTime', { dt, index: idx });\n fn(dt, idx);\n }\n\n playSpeed(speed: number, index: number) {\n if (this.opts.mode !== 'record') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed only supports record mode',\n userMessage: '实时预览不支持倍速播放',\n });\n }\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const allowed = new Set([0.125, 0.25, 0.5, 1, 1.25, 1.5, 2, 4, 8]);\n if (!allowed.has(speed)) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'invalid speed',\n userMessage: '倍速参数不合法',\n cause: { speed },\n });\n }\n const idx = this.normalizePositiveInt(index, 0);\n const fn = this.playerManager?.playSpeed;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed is not available',\n userMessage: '当前内核不支持倍速播放',\n });\n }\n this.log('playSpeed', { speed, index: idx });\n fn.call(this.playerManager, speed, idx);\n }\n\n setFullScreen() {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const fn = this.playerManager?.setFullScreen;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setFullScreen is not available',\n userMessage: '当前内核不支持全屏',\n });\n }\n this.log('setFullScreen');\n fn.call(this.playerManager);\n }\n\n setExitFullScreen() {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const fn = this.playerManager?.setExitFullScreen;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setExitFullScreen is not available',\n userMessage: '当前内核不支持退出全屏',\n });\n }\n this.log('setExitFullScreen');\n fn.call(this.playerManager);\n }\n\n callRaw(method: string, ...args: any[]) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const name = typeof method === 'string' ? method.trim() : '';\n if (!name) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'method is required',\n userMessage: '缺少 method 参数',\n });\n }\n const fn = (this.playerManager as any)[name];\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: `method not found: ${name}`,\n userMessage: `底层方法不存在:${name}`,\n });\n }\n this.log('callRaw', name);\n return fn.apply(this.playerManager, args);\n }\n\n private pickMethod(names: string[]) {\n for (const n of names) {\n const fn = (this.playerManager as any)?.[n];\n if (typeof fn === 'function') return fn.bind(this.playerManager);\n }\n return null;\n }\n\n private formatDateTime(input: string | Date | number) {\n if (typeof input === 'string') return input.trim();\n const d =\n typeof input === 'number'\n ? new Date(input > 1_000_000_000_000 ? input : input * 1000)\n : input instanceof Date\n ? input\n : new Date(NaN);\n if (!Number.isFinite(d.getTime())) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'invalid datetime',\n userMessage: '跳转时间格式不合法',\n });\n }\n const pad2 = (n: number) => String(n).padStart(2, '0');\n const y = d.getFullYear();\n const m = pad2(d.getMonth() + 1);\n const day = pad2(d.getDate());\n const hh = pad2(d.getHours());\n const mm = pad2(d.getMinutes());\n const ss = pad2(d.getSeconds());\n return `${y}-${m}-${day} ${hh}:${mm}:${ss}`;\n }\n\n pause() {\n if (!this.playerManager || this.destroyed) return;\n try {\n this.log('pause');\n if (typeof this.playerManager.pause === 'function') {\n this.playerManager.pause(0);\n } else if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(0);\n }\n this.opts.emit('pause');\n } catch {}\n }\n\n pauseWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('pauseWindow', idx);\n if (typeof this.playerManager.pause === 'function') {\n this.playerManager.pause(idx);\n } else if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(idx);\n }\n this.opts.emit('pause');\n } catch {}\n }\n\n playWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('playWindow', idx);\n if (typeof this.playerManager.play === 'function') {\n this.playerManager.play(idx);\n }\n } catch {}\n }\n\n closeWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('closeWindow', idx);\n if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(idx);\n }\n } catch {}\n }\n\n destroy() {\n if (this.destroyed) return;\n this.destroyed = true;\n this.log('destroy');\n\n if (this.playerManager) {\n try {\n this.playerManager.destroy();\n } catch {}\n this.playerManager = null;\n }\n }\n}\n","import { ErrorCode, DahuaPlayerError, toDahuaError } from './errors';\nimport type {\n DahuaPlayerEventName,\n DahuaPlayerAuth,\n DahuaPlayerInitOptions,\n DahuaPlayerInstance,\n DahuaPlayerMode,\n} from './types';\nimport { ensureDahuaSdkLoaded } from './sdk/SdkLoader';\nimport { acquireTokenShim, releaseTokenShim, setToken } from './sdk/TokenVault';\nimport { acquireSelfTargetOriginShim, releaseSelfTargetOriginShim, setSelfTargetOrigin } from './sdk/SelfTargetOriginShim';\nimport { PlayerAdapter } from './sdk/PlayerAdapter';\n\ntype ListenerMap = Map<DahuaPlayerEventName, Set<(payload: any) => void>>;\n\n/**\n * 规范化大华静态资源根路径。\n *\n * - 允许传入 \"/wsplayer-gov\" 或 \"wsplayer-gov\"\n * - 会去掉末尾多余的 \"/\"\n */\nfunction normalizeStaticPath(path: string) {\n const raw = (path || '').trim();\n if (!raw) return '/wsplayer-gov';\n const v = raw.replace(/\\/+$/, '');\n return v.startsWith('/') ? v : `/${v}`;\n}\n\nfunction buildTargetOriginFromAuth(auth: DahuaPlayerAuth | undefined) {\n if (!auth) return '';\n const ip = typeof auth.ip === 'string' ? auth.ip.trim() : '';\n const port = typeof auth.port === 'number' ? auth.port : typeof auth.port === 'string' ? Number(auth.port) : NaN;\n if (!ip || !Number.isFinite(port) || port <= 0) return '';\n const protocol = auth.protocol === 'http' ? 'http' : 'https';\n return `${protocol}://${ip}:${port}`;\n}\n\n/**\n * 解析播放器挂载容器。\n *\n * - string:按 id 查找元素\n * - HTMLElement:直接使用\n */\nfunction resolveContainer(container: HTMLElement | string): HTMLElement {\n if (typeof container === 'string') {\n const el = document.getElementById(container);\n if (!el) {\n throw new DahuaPlayerError({\n code: ErrorCode.CONTAINER_NOT_FOUND,\n message: `container not found: ${container}`,\n userMessage: '未找到播放器挂载节点',\n });\n }\n return el;\n }\n if (container && typeof container === 'object') return container;\n throw new DahuaPlayerError({\n code: ErrorCode.CONTAINER_NOT_FOUND,\n message: 'container is invalid',\n userMessage: '播放器挂载节点无效',\n });\n}\n\nfunction createListeners(): ListenerMap {\n return new Map();\n}\n\nfunction emit(listeners: ListenerMap, event: DahuaPlayerEventName, payload?: any) {\n const set = listeners.get(event);\n if (!set || set.size === 0) return;\n for (const cb of set) {\n try {\n cb(payload);\n } catch {}\n }\n}\n\n/**\n * 大华播放器核心入口。\n *\n * 设计目标:\n *\n * - 对外只暴露一个初始化方法:`DahuaPlayer.init(options)`\n * - 自动加载大华 SDK 脚本与 CSS(默认从 `/wsplayer-gov` 下加载)\n * - 不在浏览器持久化保存 token(通过 sessionStorage shim 仅在内存注入)\n * - 统一事件与错误码:ready/play/pause/error/destroy + ErrorCode\n *\n * 注意:\n *\n * - 本类不负责登录鉴权;需要外部提供已获取到的 `token`\n */\nexport class DahuaPlayer {\n /**\n * 初始化播放器并返回实例。\n *\n * 生命周期:\n *\n * - 立即创建 DOM 结构并开始异步加载 SDK\n * - `instance.ready` 会在 SDK 触发 `initializationCompleted` 后 resolve\n * - `destroy()` 会销毁 SDK 实例、移除 DOM,并释放 token shim\n *\n * @throws DahuaPlayerError 当 container/token 不合法时抛出\n */\n static init(options: DahuaPlayerInitOptions): DahuaPlayerInstance {\n const opts = options || ({} as any);\n const container = resolveContainer(opts.container);\n\n const mode: DahuaPlayerMode = opts.mode ?? 'real';\n\n const token = typeof opts.auth?.token === 'string' ? opts.auth.token.trim() : '';\n if (!token) {\n throw new DahuaPlayerError({\n code: ErrorCode.INVALID_TOKEN,\n message: 'token is required',\n userMessage: '缺少 token,请先完成鉴权登录',\n });\n }\n\n const cameraId = typeof opts.cameraId === 'string' ? opts.cameraId.trim() : '';\n const cameraIds = Array.isArray(opts.cameraIds) ? opts.cameraIds.map((v) => v.trim()).filter(Boolean) : [];\n const targetOrigin = buildTargetOriginFromAuth(opts.auth);\n\n const id = `dahua-player-${Math.random().toString(36).slice(2, 10)}`;\n const wrapper = document.createElement('div');\n wrapper.id = id;\n wrapper.style.position = 'relative';\n wrapper.style.width = opts.width === 'auto' || opts.width == null ? '100%' : `${opts.width}px`;\n wrapper.style.height = opts.height === 'auto' || opts.height == null ? '100%' : `${opts.height}px`;\n container.appendChild(wrapper);\n\n const innerId = `${id}-inner`;\n const inner = document.createElement('div');\n inner.id = innerId;\n inner.style.width = '100%';\n inner.style.height = '100%';\n wrapper.appendChild(inner);\n\n const loading = document.createElement('div');\n loading.style.position = 'absolute';\n loading.style.left = '0';\n loading.style.top = '0';\n loading.style.right = '0';\n loading.style.bottom = '0';\n loading.style.display = 'flex';\n loading.style.alignItems = 'center';\n loading.style.justifyContent = 'center';\n loading.style.background = 'rgba(0,0,0,0.35)';\n loading.style.color = '#fff';\n loading.style.fontSize = '12px';\n loading.style.pointerEvents = 'none';\n loading.style.zIndex = '10';\n loading.style.visibility = 'hidden';\n\n const loadingText = document.createElement('div');\n loadingText.textContent = '';\n loading.appendChild(loadingText);\n wrapper.appendChild(loading);\n\n const setLoading = (visible: boolean, text?: string) => {\n loadingText.textContent = text || '';\n loading.style.visibility = visible ? 'visible' : 'hidden';\n };\n\n let transientOverlayTimer: any = null;\n let stickyOverlayVisible = false;\n\n /**\n * 开始一个“加载中”覆盖层展示,并清理可能存在的错误提示计时器。\n */\n const showLoading = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = false;\n setLoading(true, text);\n };\n\n /**\n * 以短暂覆盖层的方式提示错误,给用户一个可见反馈。\n */\n const showTransientError = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = false;\n setLoading(true, text);\n transientOverlayTimer = setTimeout(() => {\n transientOverlayTimer = null;\n setLoading(false);\n }, 3000);\n };\n\n /**\n * 以常驻覆盖层的方式提示错误,直到下一次显式加载/销毁。\n */\n const showStickyError = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = true;\n setLoading(true, text);\n };\n\n /**\n * 将 error payload 格式化为可读文案;尽量带上状态码等关键信息。\n */\n const formatUserMessage = (payload: unknown, fallback: string) => {\n if (payload instanceof DahuaPlayerError) {\n const base = payload.userMessage || fallback;\n const cause: any = (payload as any).cause;\n const status = cause && typeof cause === 'object' ? (cause.status ?? cause.code) : undefined;\n if (typeof status === 'number' || typeof status === 'string') {\n return `${base}(${status})`;\n }\n return base;\n }\n return typeof payload === 'string' ? payload : fallback;\n };\n\n const listeners = createListeners();\n const staticPath = normalizeStaticPath(opts.staticPath ?? '/wsplayer-gov');\n const sdkUrl = (opts.sdkUrl || `${staticPath}/wsplayer.min.js`).trim();\n const cssUrl = `${staticPath}/WSPlayer/player.css`;\n\n const autoPlay = opts.autoPlay === true;\n const streamType = (opts.streamType ?? 2) as 1 | 2 | 3;\n const searchOnline = Boolean(opts.searchOnline);\n const num = Number.isFinite(opts.num as any) ? Math.floor(Number(opts.num)) : undefined;\n const maxNum = Number.isFinite(opts.maxNum as any) ? Math.floor(Number(opts.maxNum)) : undefined;\n const showRecordProgressBar =\n typeof opts.showRecordProgressBar === 'boolean' ? opts.showRecordProgressBar : undefined;\n const dblClickFullscreen = opts.dblClickFullscreen !== false;\n\n let destroyed = false;\n let adapter: PlayerAdapter | null = null;\n let readyResolve: () => void = () => {};\n let readyReject: (e: unknown) => void = () => {};\n\n const safeOnError = (e: unknown) => {\n try {\n opts.onError?.(e);\n } catch {}\n emit(listeners, 'error', e);\n };\n\n /**\n * autoPlay:根据 init 参数在 ready 后触发一次自动播放。\n *\n * 触发条件:\n * - 实时预览(mode=real):需要 cameraId + autoPlay=true\n * - 录像回放(mode=record):需要 recordStartTime/recordEndTime(Unix 秒)+ autoPlay=true\n */\n const tryAutoPlay = () => {\n if (!autoPlay) return;\n if (mode === 'real') {\n if (!cameraId && cameraIds.length === 0) return;\n try {\n showLoading('加载视频中…');\n adapter?.playRealVideo({});\n } catch (e) {\n safeOnError(e);\n }\n return;\n }\n if (mode === 'record') {\n if (!Number.isFinite(opts.recordStartTime as any)) return;\n if (!Number.isFinite(opts.recordEndTime as any)) return;\n if (!cameraId && cameraIds.length === 0) return;\n const startTime = Math.floor(Number(opts.recordStartTime));\n const endTime = Math.floor(Number(opts.recordEndTime));\n const recordSource = Number.isFinite(opts.recordSource as any)\n ? Math.floor(Number(opts.recordSource))\n : undefined;\n try {\n showLoading('加载录像中…');\n adapter?.playRecordVideo(recordSource == null ? { startTime, endTime } : { startTime, endTime, recordSource });\n } catch (e) {\n safeOnError(e);\n }\n }\n };\n\n /**\n * ready:仅代表播放器“初始化完成”,不等价于“已成功播放”。\n * 播放成功/失败通过 play/error 事件体现。\n */\n const ready = new Promise<void>((resolve, reject) => {\n readyResolve = resolve;\n readyReject = reject;\n });\n\n /**\n * 初始化兜底超时:避免 SDK 资源或初始化流程异常导致 ready 永远 pending。\n */\n const readyTimer = setTimeout(() => {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_LOAD_TIMEOUT,\n message: 'SDK ready timeout',\n userMessage: '播放器初始化超时',\n });\n showStickyError(`初始化失败:${err.userMessage}`);\n safeOnError(err);\n readyReject(err);\n }, 20_000);\n\n showLoading('初始化中…');\n\n void (async () => {\n try {\n /**\n * 大华 SDK 内部会从 sessionStorage 读取 psi_token。\n * 这里通过 shim 仅在内存提供 token,避免 token 落盘。\n */\n setToken(token);\n acquireTokenShim();\n if (targetOrigin) {\n try {\n window.sessionStorage?.setItem('wsplayer_origin', targetOrigin);\n } catch {}\n }\n setSelfTargetOrigin(targetOrigin || null);\n acquireSelfTargetOriginShim();\n\n await ensureDahuaSdkLoaded({ sdkUrl, cssUrl, timeoutMs: 20_000 });\n\n adapter = new PlayerAdapter({\n containerId: innerId,\n staticPath,\n mode,\n cameraId,\n cameraIds,\n streamType,\n searchOnline,\n useNginxProxy: opts.useNginxProxy,\n nginxProxyHost: opts.nginxProxyHost,\n useWSS: opts.useWSS,\n num,\n maxNum,\n showRecordProgressBar,\n playerOptions: opts.playerOptions,\n debug: opts.debug,\n onMessage: (type, data) => {\n try {\n opts.onSdkMessage?.(type, data);\n } catch {}\n },\n emit: (event, payload) => {\n if (event === 'ready') {\n clearTimeout(readyTimer);\n readyResolve();\n setLoading(false);\n stickyOverlayVisible = false;\n try {\n opts.onReady?.();\n } catch {}\n emit(listeners, 'ready');\n tryAutoPlay();\n return;\n }\n if (event === 'play') {\n setLoading(false);\n try {\n opts.onPlay?.(payload);\n } catch {}\n emit(listeners, 'play', payload);\n return;\n }\n if (event === 'pause') {\n setLoading(false);\n try {\n opts.onPause?.();\n } catch {}\n emit(listeners, 'pause');\n return;\n }\n if (event === 'error') {\n const msg = formatUserMessage(payload, '播放失败');\n if (payload instanceof DahuaPlayerError) {\n const initCodes = new Set<ErrorCode>([\n ErrorCode.SDK_INIT_FAILED,\n ErrorCode.SDK_LOAD_FAILED,\n ErrorCode.SDK_LOAD_TIMEOUT,\n ]);\n if (initCodes.has(payload.code)) {\n showStickyError(`初始化失败:${msg}`);\n safeOnError(payload);\n return;\n }\n }\n if (stickyOverlayVisible) return;\n showTransientError(msg);\n safeOnError(payload);\n }\n },\n });\n\n adapter.init();\n } catch (e) {\n clearTimeout(readyTimer);\n const err = toDahuaError(e, {\n code: ErrorCode.SDK_LOAD_FAILED,\n message: 'SDK load/init failed',\n userMessage: '播放器初始化失败',\n });\n showStickyError(`初始化失败:${err.userMessage}`);\n safeOnError(err);\n readyReject(err);\n }\n })();\n\n const instance: DahuaPlayerInstance = {\n id,\n ready,\n /**\n * 暂停播放。\n *\n * 注意:部分 SDK 版本 pause/close 的行为差异由内部适配处理。\n */\n pause: () => {\n if (!adapter) return;\n adapter.pause();\n },\n /**\n * 销毁播放器实例并释放资源。\n *\n * - 移除创建的 DOM 节点\n * - 调用 SDK destroy(若存在)\n * - 释放 token shim,清理内存 token\n * - 触发 destroy 事件\n */\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n clearTimeout(readyTimer);\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n setLoading(false);\n try {\n adapter?.destroy();\n } catch {}\n adapter = null;\n try {\n wrapper.remove();\n } catch {\n try {\n container.innerHTML = '';\n } catch {}\n }\n try {\n releaseTokenShim();\n } catch {}\n try {\n releaseSelfTargetOriginShim();\n } catch {}\n try {\n setToken(null);\n } catch {}\n try {\n opts.onDestroy?.();\n } catch {}\n emit(listeners, 'destroy');\n listeners.clear();\n },\n sdk: {\n getRaw: () => adapter?.getRaw(),\n callRaw: (method: string, ...args: any[]) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n return adapter.callRaw(method, ...args);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'callRaw failed',\n userMessage: '调用底层方法失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playRealVideo: (opt: any) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('加载视频中…');\n try {\n adapter.playRealVideo(opt);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playRealVideo failed',\n userMessage: '实时预览播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playRecordVideo: (opt: any) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('加载录像中…');\n try {\n adapter.playRecordVideo(opt);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playRecordVideo failed',\n userMessage: '录像回放播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n pause: (windowIndex?: number) => adapter?.pauseWindow(windowIndex),\n play: (windowIndex?: number) => adapter?.playWindow(windowIndex),\n close: (windowIndex?: number) => adapter?.closeWindow(windowIndex),\n setPlayerNum: (n: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setPlayerNum(n);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'setPlayerNum failed',\n userMessage: '切换布局路数失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n jumpPlayByDateTime: (datetime: string | Date | number, index?: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('跳转中…');\n try {\n adapter.jumpPlayByDateTime(datetime, index);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime failed',\n userMessage: '录像跳转播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playSpeed: (speed: number, index: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.playSpeed(speed, index);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed failed',\n userMessage: '设置倍速失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n setFullScreen: () => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setFullScreen();\n return;\n } catch {}\n const el: any = wrapper as any;\n const req = el?.requestFullscreen;\n if (typeof req !== 'function') {\n const err = new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'fullscreen is not supported',\n userMessage: '当前环境不支持全屏',\n });\n safeOnError(err);\n throw err;\n }\n void req.call(el);\n },\n setExitFullScreen: () => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setExitFullScreen();\n return;\n } catch {}\n const doc: any = document as any;\n const exit = doc?.exitFullscreen;\n if (typeof exit === 'function') {\n void exit.call(doc);\n return;\n }\n const err = new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'exitFullscreen is not supported',\n userMessage: '当前环境不支持退出全屏',\n });\n safeOnError(err);\n throw err;\n },\n destroy: () => instance.destroy(),\n },\n /**\n * 订阅事件(ready/play/pause/error/destroy)。\n */\n on: (event, handler) => {\n const set = listeners.get(event) ?? new Set();\n set.add(handler as any);\n listeners.set(event, set);\n },\n /**\n * 取消订阅事件。\n */\n off: (event, handler) => {\n const set = listeners.get(event);\n if (!set) return;\n set.delete(handler as any);\n if (set.size === 0) listeners.delete(event);\n },\n };\n\n if (dblClickFullscreen) {\n const onDblClick = () => {\n try {\n const doc: any = document as any;\n if (doc?.fullscreenElement) {\n instance.sdk.setExitFullScreen();\n return;\n }\n instance.sdk.setFullScreen();\n } catch {}\n };\n try {\n wrapper.addEventListener('dblclick', onDblClick);\n } catch {}\n const originDestroy = instance.destroy;\n instance.destroy = () => {\n try {\n wrapper.removeEventListener('dblclick', onDblClick);\n } catch {}\n originDestroy();\n };\n }\n\n return instance;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAK,YAAL,kBAAKA,eAAL;AACL,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,eAAY;AARF,SAAAA;AAAA,GAAA;AAWL,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAK1C,YAAY,QAAoF;AAC9F,UAAM,OAAO,OAAO;AACpB,SAAK,OAAO;AACZ,SAAK,OAAO,OAAO;AACnB,SAAK,cAAc,OAAO;AAC1B,SAAK,QAAQ,OAAO;AAAA,EACtB;AACF;AAEO,SAAS,aAAa,GAAY,UAAqE;AAC5G,MAAI,aAAa,iBAAkB,QAAO;AAC1C,QAAM,QAAQ;AACd,SAAO,IAAI,iBAAiB,EAAE,GAAG,UAAU,MAAM,CAAC;AACpD;;;ACtBA,IAAM,QAAwB;AAAA,EAC5B,SAAS,oBAAI,IAAI;AAAA,EACjB,QAAQ,oBAAI,IAAI;AAClB;AAEA,SAAS,cAAc,MAA6B;AAClD,QAAM,MAAM,KAAK,KAAK;AACtB,MAAI,CAAC,IAAK,QAAO,QAAQ,QAAQ;AACjC,QAAM,WAAW,MAAM,OAAO,IAAI,GAAG;AACrC,MAAI,SAAU,QAAO;AAErB,QAAM,IAAI,IAAI,QAAc,CAAC,SAAS,WAAW;AAC/C,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,SAAS,MAAM,QAAQ;AAC5B,SAAK,UAAU,CAAC,MAAM,OAAO,CAAC;AAC9B,aAAS,KAAK,YAAY,IAAI;AAAA,EAChC,CAAC;AAED,QAAM,OAAO,IAAI,KAAK,CAAC;AACvB,SAAO;AACT;AAEA,SAAS,eAAe,KAAa,MAAqC;AACxE,QAAM,MAAM,IAAI,KAAK;AACrB,MAAI,CAAC,IAAK,QAAO,QAAQ,QAAQ;AACjC,QAAM,WAAW,MAAM,QAAQ,IAAI,GAAG;AACtC,MAAI,SAAU,QAAO;AAErB,QAAM,IAAI,IAAI,QAAc,CAAC,SAAS,WAAW;AAC/C,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,OAAO;AACd,WAAO,MAAM;AACb,WAAO,SAAS,MAAM,QAAQ;AAC9B,WAAO,UAAU,CAAC,MAAM,OAAO,CAAC;AAChC,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC,CAAC;AAED,QAAM,QAAQ,IAAI,KAAK,CAAC;AACxB,SAAO;AACT;AAEA,SAAS,QAAW,IAAgC,WAA+B;AACjF,QAAM,QAAQ,KAAK,IAAI;AACvB,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,UAAM,OAAO,MAAM;AACjB,UAAI;AACF,cAAM,IAAI,GAAG;AACb,YAAI,EAAG,QAAO,QAAQ,CAAC;AAAA,MACzB,QAAQ;AAAA,MAAC;AACT,UAAI,KAAK,IAAI,IAAI,SAAS,UAAW,QAAO,OAAO,IAAI,MAAM,SAAS,CAAC;AACvE,iBAAW,MAAM,EAAE;AAAA,IACrB;AACA,SAAK;AAAA,EACP,CAAC;AACH;AAEA,eAAsB,qBAAqB,MAA+D;AAjE1G;AAkEE,QAAM,SAAS,KAAK;AACpB,QAAM,SAAS,KAAK;AACpB,QAAM,aAAY,UAAK,cAAL,YAAkB;AAEpC,MAAI,QAAQ;AACV,QAAI;AACF,YAAM,cAAc,MAAM;AAAA,IAC5B,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,QAAM,eAAe,QAAQ,QAAQ,EAAE,MAAM,YAAY;AACvD,UAAM,eAAe,QAAQ,iBAAiB;AAAA,EAChD,CAAC;AAED,QAAM,gBAAgB,MAAM;AAAA,IAC1B,MAAO,OAAe;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,OAAO,kBAAkB,YAAY;AACvC,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACF;;;ACnFA,IAAMC,SAAwB;AAAA,EAC5B,UAAU;AAAA,EACV,OAAO;AACT;AAWA,SAAS,uBAAuB;AAC9B,MAAI;AACF,UAAM,KAAK,OAAO;AAClB,QAAI,CAAC,GAAI;AACT,QAAIA,OAAM,OAAO;AACf,SAAG,QAAQ,aAAaA,OAAM,KAAK;AAAA,IACrC,OAAO;AACL,SAAG,WAAW,WAAW;AAAA,IAC3B;AAAA,EACF,QAAQ;AAAA,EAAC;AACX;AAQO,SAAS,SAAS,OAAsB;AAC7C,EAAAA,OAAM,QAAQ;AACd,MAAIA,OAAM,WAAW,EAAG,sBAAqB;AAC/C;AAWO,SAAS,mBAAmB;AACjC,EAAAA,OAAM;AACN,MAAIA,OAAM,aAAa,EAAG;AAC1B,uBAAqB;AACvB;AAOO,SAAS,mBAAmB;AA9DnC;AA+DE,MAAIA,OAAM,YAAY,EAAG;AACzB,EAAAA,OAAM;AACN,MAAIA,OAAM,aAAa,EAAG;AAC1B,MAAI;AACF,iBAAO,mBAAP,mBAAuB,WAAW;AAAA,EACpC,QAAQ;AAAA,EAAC;AACX;;;AC7DA,IAAMC,SAAmC;AAAA,EACvC,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,6BAA6B;AAC/B;AAEA,SAAS,mBAAmB,KAAc;AACxC,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,SAAO,IAAI,SAAS,gBAAgB,KAAK,IAAI,SAAS,eAAe;AACvE;AAEA,SAAS,oBAAoB,MAAe;AAC1C,SAAO,OAAO,SAAS,WAAW,KAAK,KAAK,EAAE,YAAY,IAAI;AAChE;AAEO,SAAS,oBAAoB,QAAuB;AACzD,EAAAA,OAAM,SAAS,OAAO,WAAW,WAAW,OAAO,KAAK,KAAK,OAAO;AACtE;AAEO,SAAS,8BAA8B;AAC5C,EAAAA,OAAM;AACN,MAAIA,OAAM,aAAa,EAAG;AAE1B,MAAI;AACF,UAAM,QAAQ,eAAe;AAC7B,QAAI,OAAO,MAAM,SAAS,cAAc,OAAO,MAAM,SAAS,cAAc,OAAO,MAAM,qBAAqB,YAAY;AACxH;AAAA,IACF;AAEA,IAAAA,OAAM,kBAAkB,MAAM;AAC9B,IAAAA,OAAM,kBAAkB,MAAM;AAC9B,IAAAA,OAAM,8BAA8B,MAAM;AAE1C,UAAM,OAAO,YAAa,MAAa;AACrC,UAAI;AACF,QAAC,KAAa,sBAAsB,KAAK,CAAC;AAC1C,QAAC,KAAa,iCAAiC;AAAA,MACjD,QAAQ;AAAA,MAAC;AACT,aAAOA,OAAM,gBAAiB,MAAM,MAAM,IAAW;AAAA,IACvD;AAEA,UAAM,mBAAmB,SAAU,MAAc,OAAe;AAC9D,UAAI;AACF,YAAI,oBAAoB,IAAI,MAAM,qBAAqB;AACrD,UAAC,KAAa,iCAAiC;AAAA,QACjD;AAAA,MACF,QAAQ;AAAA,MAAC;AACT,aAAOA,OAAM,4BAA6B,KAAK,MAAM,MAAM,KAAK;AAAA,IAClE;AAEA,UAAM,OAAO,YAAa,MAAa;AA5D3C;AA6DM,UAAI;AACF,cAAM,SACJA,OAAM,YACN,YAAO,mBAAP,mBAAuB,QAAQ,yBAC/B,YAAO,iBAAP,mBAAqB,QAAQ,uBAC7B;AACF,cAAM,MAAO,KAAa;AAC1B,cAAM,aAAa,QAAS,KAAa,8BAA8B;AAEvE,YAAI,CAAC,cAAc,UAAU,mBAAmB,GAAG,GAAG;AACpD,UAAAA,OAAM,4BAA6B,KAAK,MAAM,qBAAqB,MAAM;AAAA,QAC3E;AAAA,MACF,QAAQ;AAAA,MAAC;AACT,aAAOA,OAAM,gBAAiB,MAAM,MAAM,IAAW;AAAA,IACvD;AAAA,EACF,QAAQ;AAAA,EAAC;AACX;AAEO,SAAS,8BAA8B;AAC5C,MAAIA,OAAM,YAAY,EAAG;AACzB,EAAAA,OAAM;AACN,MAAIA,OAAM,aAAa,EAAG;AAE1B,MAAI;AACF,UAAM,QAAQ,eAAe;AAC7B,QAAIA,OAAM,gBAAiB,OAAM,OAAOA,OAAM;AAC9C,QAAIA,OAAM,gBAAiB,OAAM,OAAOA,OAAM;AAC9C,QAAIA,OAAM,4BAA6B,OAAM,mBAAmBA,OAAM;AAAA,EACxE,QAAQ;AAAA,EAAC;AAET,EAAAA,OAAM,SAAS;AACf,EAAAA,OAAM,kBAAkB;AACxB,EAAAA,OAAM,kBAAkB;AACxB,EAAAA,OAAM,8BAA8B;AACtC;;;ACtEO,IAAM,gBAAN,MAAoB;AAAA,EAQzB,YAAY,MAA4B;AANxC,SAAQ,gBAA4B;AACpC,SAAQ,YAAY;AACpB,SAAQ,gBAAgB;AACxB,SAAQ,aAAa;AACrB,SAAQ,gBAAgB;AAGtB,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,SAAS;AACP,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO;AAzCT;AA0CI,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,KAAM,OAAe;AAC3B,QAAI,OAAO,OAAO,YAAY;AAC5B,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,UAAM,cAAc,KAAK,KAAK;AAC9B,UAAM,wBACJ,OAAO,KAAK,KAAK,0BAA0B,YACvC,KAAK,KAAK,wBACV,KAAK,KAAK,SAAS;AACzB,UAAM,aAAa,KAAK;AAAA,OACtB,gBAAK,KAAK,QAAV,aAAkB,UAAK,KAAK,kBAAV,mBAAiC,QAAnD,YAA0D;AAAA,MAC1D;AAAA,IACF;AACA,UAAM,gBAAgB,KAAK;AAAA,OACzB,gBAAK,KAAK,WAAV,aAAqB,UAAK,KAAK,kBAAV,mBAAiC,WAAtD,YAAgE;AAAA,MAChE;AAAA,IACF;AACA,UAAM,iBAA0C;AAAA,MAC9C,MAAM,KAAK,KAAK;AAAA,MAChB,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,WAAW,EAAE,QAAQ,KAAK;AAAA,MAC1B;AAAA,MACA,gBAAe,UAAK,KAAK,kBAAV,YAA2B;AAAA,MAC1C,iBAAgB,UAAK,KAAK,mBAAV,YAA4B;AAAA,MAC5C,SAAQ,UAAK,KAAK,WAAV,YAAoB;AAAA,IAC9B;AACA,UAAM,SAAS;AAAA,MACb,GAAG;AAAA,MACH,IAAI,UAAK,KAAK,kBAAV,YAA2B,CAAC;AAAA,MAChC,IAAI,KAAK,KAAK;AAAA,MACd,aAAa,KAAK,KAAK;AAAA,MACvB,4BAA4B,CAAC,MAAc,SAAc;AACvD,YAAI,KAAK,UAAW;AAEpB,YAAI;AACF,qDAAc,MAAM;AAAA,QACtB,QAAQ;AAAA,QAAC;AAET,aAAK,iBAAiB,MAAM,IAAI;AAAA,MAClC;AAAA,IACF;AACA,SAAK,gBAAgB,IAAI,GAAG,MAAM;AAClC,SAAK,aAAa,KAAK,qBAAsB,OAAe,KAAK,CAAC;AAClE,SAAK,gBAAgB,KAAK,qBAAsB,OAAe,QAAQ,KAAK,UAAU;AAAA,EACxF;AAAA,EAEQ,OAAO,MAAa;AAC1B,QAAI,CAAC,KAAK,KAAK,MAAO;AACtB,QAAI;AACF,cAAQ,IAAI,kBAAkB,GAAG,IAAI;AAAA,IACvC,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEQ,oBAAoB,MAAc,MAAW;AACnD,QAAI,SAAS,iBAAiB;AAC5B,YAAM,SAAS,QAAQ,OAAO,SAAS,WAAY,KAAa,SAAS;AACzE,aAAO,EAAE,OAAO;AAAA,IAClB;AACA,QAAI,SAAS,eAAe,SAAS,eAAe;AAClD,YAAM,SAAS,QAAQ,OAAO,SAAS,WAAY,KAAa,SAAS;AACzE,aAAO,EAAE,OAAO;AAAA,IAClB;AACA,QAAI,SAAS,aAAa;AACxB,YAAM,SAAS,QAAQ,OAAO,SAAS,WAAY,KAAa,SAAS;AACzE,YAAM,OAAO,QAAQ,OAAO,SAAS,WAAY,KAAa,OAAO;AACrE,aAAO,EAAE,QAAQ,KAAK;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,MAAc,MAAW;AA9HpD;AA+HI,SAAK,IAAI,OAAO,MAAM,KAAK,oBAAoB,MAAM,IAAI,CAAC;AAC1D,YAAQ,MAAM;AAAA,MACZ,KAAK,2BAA2B;AAC9B,YAAI,CAAC,KAAK,eAAe;AACvB,eAAK,gBAAgB;AACrB,eAAK,KAAK,KAAK,OAAO;AAAA,QACxB;AACA;AAAA,MACF;AAAA,MACA,KAAK,eAAe;AAClB,aAAK,KAAK,KAAK,QAAQ,EAAE,MAAM,OAAO,CAAC;AACvC;AAAA,MACF;AAAA,MACA,KAAK,iBAAiB;AACpB,aAAK,KAAK,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC;AAAA,MACF;AAAA,MACA,KAAK,iBAAiB;AACpB,YAAI,QAAQ,OAAO,SAAS,aAAa,KAAK,WAAW,WAAW,KAAK,WAAW,WAAW;AAC7F,eAAK,KAAK,KAAK,OAAO;AAAA,QACxB;AACA;AAAA,MACF;AAAA,MACA,KAAK,oBAAoB;AACvB,cAAM,IACJ,OAAO,SAAS,WACZ,OACA,QAAQ,OAAO,SAAS,YACpB,gBAAa,QAAb,YAAqB,KAAa,WAAlC,YAA6C,KAAa,YAC5D;AACR,cAAM,IAAI,KAAK,qBAAqB,GAAG,KAAK,UAAU;AACtD,aAAK,aAAa;AAClB;AAAA,MACF;AAAA,MACA,KAAK,aAAa;AAChB,aAAK,KAAK;AAAA,UACR;AAAA,UACA,IAAI,iBAAiB;AAAA,YACnB;AAAA,YACA,SAAS;AAAA,YACT,aAAa;AAAA,YACb,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,MACA,KAAK,eAAe;AAClB,aAAK,KAAK;AAAA,UACR;AAAA,UACA,IAAI,iBAAiB;AAAA,YACnB;AAAA,YACA,SAAS;AAAA,YACT,aAAa;AAAA,YACb,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,MACA;AACE;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,qBAAqB,KAAU;AA9LzC;AA+LI,UAAM,UAAU,OAAO,OAAO,QAAQ,WAAY,IAAY,cAAc;AAC5E,QAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,EAAG,QAAO,KAAK,kBAAkB,OAAO;AAEvF,UAAM,aAAa,KAAK;AAAA,MACtB,OAAO,OAAO,QAAQ,YAAa,SAAY,cAAZ,YAA0B,IAAY,WAAY;AAAA,IACvF;AACA,QAAI,WAAW,SAAS,EAAG,QAAO,KAAK,kBAAkB,WAAW,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,EAAE,CAAC;AAEtG,UAAM,UAAU,KAAK,mBAAmB,KAAK,KAAK,SAAS;AAC3D,QAAI,QAAQ,SAAS,EAAG,QAAO,KAAK,kBAAkB,QAAQ,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,EAAE,CAAC;AAChG,QAAI,KAAK,KAAK,SAAU,QAAO,CAAC,EAAE,aAAa,KAAK,KAAK,SAAS,CAAC;AACnE,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,OAA0B;AACnD,UAAM,OAAiB,CAAC;AACxB,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,IAAI,MAAM,KAAK;AACrB,UAAI,EAAG,MAAK,KAAK,CAAC;AAAA,IACpB,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,iBAAW,MAAM,OAAO;AACtB,YAAI,OAAO,OAAO,SAAU;AAC5B,cAAM,IAAI,GAAG,KAAK;AAClB,YAAI,EAAG,MAAK,KAAK,CAAC;AAAA,MACpB;AAAA,IACF;AACA,UAAM,OAAO,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC;AACrC,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAqB,MAAgB;AAC3C,UAAM,MAAM,KAAK,qBAAqB,KAAK,YAAY,CAAC;AACxD,QAAI,KAAK,UAAU,IAAK,QAAO;AAC/B,UAAM,SAAS,KAAK,MAAM,GAAG,GAAG;AAChC,SAAK,IAAI,mCAAmC,EAAE,KAAK,UAAU,KAAK,OAAO,CAAC;AAC1E,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,OAAgB,UAAkB;AAC7D,UAAM,IAAI,OAAO,UAAU,WAAW,QAAQ,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAC1F,QAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG,QAAO;AAC1C,WAAO,KAAK,MAAM,CAAC;AAAA,EACrB;AAAA,EAEA,cAAc,KAAU;AACtB,QAAI,CAAC,KAAK,iBAAiB,KAAK,WAAW;AACzC,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,cAAc,KAAK,qBAAqB,GAAG;AACjD,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,QAAI,OAAO,KAAK,cAAc,kBAAkB,YAAY;AAC1D,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,SAAK,IAAI,eAAe;AACxB,SAAK,cAAc,cAAc,EAAE,GAAI,oBAAO,CAAC,GAAI,YAAY,CAAC;AAAA,EAClE;AAAA,EAEA,gBAAgB,KAAU;AACxB,QAAI,CAAC,KAAK,iBAAiB,KAAK,WAAW;AACzC,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,cAAc,KAAK,qBAAqB,GAAG;AACjD,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,QAAI,OAAO,KAAK,cAAc,oBAAoB,YAAY;AAC5D,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,SAAK,IAAI,iBAAiB;AAC1B,SAAK,cAAc,gBAAgB,EAAE,GAAI,oBAAO,CAAC,GAAI,YAAY,CAAC;AAAA,EACpE;AAAA,EAEA,aAAa,KAAa;AAjS5B;AAkSI,QAAI,CAAC,KAAK,iBAAiB,KAAK,WAAW;AACzC,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,IAAI,KAAK,qBAAqB,KAAK,KAAK,UAAU;AACxD,UAAM,MAAK,UAAK,kBAAL,mBAAoB;AAC/B,QAAI,OAAO,OAAO,YAAY;AAC5B,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,SAAK,IAAI,gBAAgB,CAAC;AAC1B,OAAG,KAAK,KAAK,eAAe,CAAC;AAC7B,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,mBAAmB,UAAkC,OAAgB;AACnE,QAAI,KAAK,KAAK,SAAS,UAAU;AAC/B,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,QAAI,CAAC,KAAK,iBAAiB,KAAK,WAAW;AACzC,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,KAAK,KAAK,eAAe,QAAQ;AACvC,UAAM,KAAK,KAAK,WAAW,CAAC,sBAAsB,oBAAoB,CAAC;AACvE,QAAI,CAAC,IAAI;AACP,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,MAAM,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;AAC5D,SAAK,IAAI,sBAAsB,EAAE,IAAI,OAAO,IAAI,CAAC;AACjD,OAAG,IAAI,GAAG;AAAA,EACZ;AAAA,EAEA,UAAU,OAAe,OAAe;AApV1C;AAqVI,QAAI,KAAK,KAAK,SAAS,UAAU;AAC/B,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,QAAI,CAAC,KAAK,iBAAiB,KAAK,WAAW;AACzC,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,UAAU,oBAAI,IAAI,CAAC,OAAO,MAAM,KAAK,GAAG,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC;AACjE,QAAI,CAAC,QAAQ,IAAI,KAAK,GAAG;AACvB,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,QACb,OAAO,EAAE,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AACA,UAAM,MAAM,KAAK,qBAAqB,OAAO,CAAC;AAC9C,UAAM,MAAK,UAAK,kBAAL,mBAAoB;AAC/B,QAAI,OAAO,OAAO,YAAY;AAC5B,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,SAAK,IAAI,aAAa,EAAE,OAAO,OAAO,IAAI,CAAC;AAC3C,OAAG,KAAK,KAAK,eAAe,OAAO,GAAG;AAAA,EACxC;AAAA,EAEA,gBAAgB;AAzXlB;AA0XI,QAAI,CAAC,KAAK,iBAAiB,KAAK,WAAW;AACzC,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,MAAK,UAAK,kBAAL,mBAAoB;AAC/B,QAAI,OAAO,OAAO,YAAY;AAC5B,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,SAAK,IAAI,eAAe;AACxB,OAAG,KAAK,KAAK,aAAa;AAAA,EAC5B;AAAA,EAEA,oBAAoB;AA7YtB;AA8YI,QAAI,CAAC,KAAK,iBAAiB,KAAK,WAAW;AACzC,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,MAAK,UAAK,kBAAL,mBAAoB;AAC/B,QAAI,OAAO,OAAO,YAAY;AAC5B,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,SAAK,IAAI,mBAAmB;AAC5B,OAAG,KAAK,KAAK,aAAa;AAAA,EAC5B;AAAA,EAEA,QAAQ,WAAmB,MAAa;AACtC,QAAI,CAAC,KAAK,iBAAiB,KAAK,WAAW;AACzC,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,OAAO,OAAO,WAAW,WAAW,OAAO,KAAK,IAAI;AAC1D,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,KAAM,KAAK,cAAsB,IAAI;AAC3C,QAAI,OAAO,OAAO,YAAY;AAC5B,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS,qBAAqB,IAAI;AAAA,QAClC,aAAa,mDAAW,IAAI;AAAA,MAC9B,CAAC;AAAA,IACH;AACA,SAAK,IAAI,WAAW,IAAI;AACxB,WAAO,GAAG,MAAM,KAAK,eAAe,IAAI;AAAA,EAC1C;AAAA,EAEQ,WAAW,OAAiB;AA7btC;AA8bI,eAAW,KAAK,OAAO;AACrB,YAAM,MAAM,UAAK,kBAAL,mBAA6B;AACzC,UAAI,OAAO,OAAO,WAAY,QAAO,GAAG,KAAK,KAAK,aAAa;AAAA,IACjE;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,OAA+B;AACpD,QAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK;AACjD,UAAM,IACJ,OAAO,UAAU,WACb,IAAI,KAAK,QAAQ,OAAoB,QAAQ,QAAQ,GAAI,IACzD,iBAAiB,OACf,QACA,oBAAI,KAAK,GAAG;AACpB,QAAI,CAAC,OAAO,SAAS,EAAE,QAAQ,CAAC,GAAG;AACjC,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,OAAO,CAAC,MAAc,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,UAAM,IAAI,EAAE,YAAY;AACxB,UAAM,IAAI,KAAK,EAAE,SAAS,IAAI,CAAC;AAC/B,UAAM,MAAM,KAAK,EAAE,QAAQ,CAAC;AAC5B,UAAM,KAAK,KAAK,EAAE,SAAS,CAAC;AAC5B,UAAM,KAAK,KAAK,EAAE,WAAW,CAAC;AAC9B,UAAM,KAAK,KAAK,EAAE,WAAW,CAAC;AAC9B,WAAO,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,EAC3C;AAAA,EAEA,QAAQ;AACN,QAAI,CAAC,KAAK,iBAAiB,KAAK,UAAW;AAC3C,QAAI;AACF,WAAK,IAAI,OAAO;AAChB,UAAI,OAAO,KAAK,cAAc,UAAU,YAAY;AAClD,aAAK,cAAc,MAAM,CAAC;AAAA,MAC5B,WAAW,OAAO,KAAK,cAAc,UAAU,YAAY;AACzD,aAAK,cAAc,MAAM,CAAC;AAAA,MAC5B;AACA,WAAK,KAAK,KAAK,OAAO;AAAA,IACxB,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,YAAY,aAAsB;AAChC,QAAI,CAAC,KAAK,iBAAiB,KAAK,UAAW;AAC3C,QAAI;AACF,YAAM,MAAM,OAAO,gBAAgB,WAAW,cAAc;AAC5D,WAAK,IAAI,eAAe,GAAG;AAC3B,UAAI,OAAO,KAAK,cAAc,UAAU,YAAY;AAClD,aAAK,cAAc,MAAM,GAAG;AAAA,MAC9B,WAAW,OAAO,KAAK,cAAc,UAAU,YAAY;AACzD,aAAK,cAAc,MAAM,GAAG;AAAA,MAC9B;AACA,WAAK,KAAK,KAAK,OAAO;AAAA,IACxB,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,WAAW,aAAsB;AAC/B,QAAI,CAAC,KAAK,iBAAiB,KAAK,UAAW;AAC3C,QAAI;AACF,YAAM,MAAM,OAAO,gBAAgB,WAAW,cAAc;AAC5D,WAAK,IAAI,cAAc,GAAG;AAC1B,UAAI,OAAO,KAAK,cAAc,SAAS,YAAY;AACjD,aAAK,cAAc,KAAK,GAAG;AAAA,MAC7B;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,YAAY,aAAsB;AAChC,QAAI,CAAC,KAAK,iBAAiB,KAAK,UAAW;AAC3C,QAAI;AACF,YAAM,MAAM,OAAO,gBAAgB,WAAW,cAAc;AAC5D,WAAK,IAAI,eAAe,GAAG;AAC3B,UAAI,OAAO,KAAK,cAAc,UAAU,YAAY;AAClD,aAAK,cAAc,MAAM,GAAG;AAAA,MAC9B;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY;AACjB,SAAK,IAAI,SAAS;AAElB,QAAI,KAAK,eAAe;AACtB,UAAI;AACF,aAAK,cAAc,QAAQ;AAAA,MAC7B,QAAQ;AAAA,MAAC;AACT,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AACF;;;ACtgBA,SAAS,oBAAoB,MAAc;AACzC,QAAM,OAAO,QAAQ,IAAI,KAAK;AAC9B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,IAAI,QAAQ,QAAQ,EAAE;AAChC,SAAO,EAAE,WAAW,GAAG,IAAI,IAAI,IAAI,CAAC;AACtC;AAEA,SAAS,0BAA0B,MAAmC;AACpE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,GAAG,KAAK,IAAI;AAC1D,QAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,OAAO,KAAK,SAAS,WAAW,OAAO,KAAK,IAAI,IAAI;AAC7G,MAAI,CAAC,MAAM,CAAC,OAAO,SAAS,IAAI,KAAK,QAAQ,EAAG,QAAO;AACvD,QAAM,WAAW,KAAK,aAAa,SAAS,SAAS;AACrD,SAAO,GAAG,QAAQ,MAAM,EAAE,IAAI,IAAI;AACpC;AAQA,SAAS,iBAAiB,WAA8C;AACtE,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,KAAK,SAAS,eAAe,SAAS;AAC5C,QAAI,CAAC,IAAI;AACP,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS,wBAAwB,SAAS;AAAA,QAC1C,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACA,MAAI,aAAa,OAAO,cAAc,SAAU,QAAO;AACvD,QAAM,IAAI,iBAAiB;AAAA,IACzB;AAAA,IACA,SAAS;AAAA,IACT,aAAa;AAAA,EACf,CAAC;AACH;AAEA,SAAS,kBAA+B;AACtC,SAAO,oBAAI,IAAI;AACjB;AAEA,SAAS,KAAK,WAAwB,OAA6B,SAAe;AAChF,QAAM,MAAM,UAAU,IAAI,KAAK;AAC/B,MAAI,CAAC,OAAO,IAAI,SAAS,EAAG;AAC5B,aAAW,MAAM,KAAK;AACpB,QAAI;AACF,SAAG,OAAO;AAAA,IACZ,QAAQ;AAAA,IAAC;AAAA,EACX;AACF;AAgBO,IAAM,cAAN,MAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYvB,OAAO,KAAK,SAAsD;AAvGpE;AAwGI,UAAM,OAAO,WAAY,CAAC;AAC1B,UAAM,YAAY,iBAAiB,KAAK,SAAS;AAEjD,UAAM,QAAwB,UAAK,SAAL,YAAa;AAE3C,UAAM,QAAQ,SAAO,UAAK,SAAL,mBAAW,WAAU,WAAW,KAAK,KAAK,MAAM,KAAK,IAAI;AAC9E,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,OAAO,KAAK,aAAa,WAAW,KAAK,SAAS,KAAK,IAAI;AAC5E,UAAM,YAAY,MAAM,QAAQ,KAAK,SAAS,IAAI,KAAK,UAAU,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IAAI,CAAC;AACzG,UAAM,eAAe,0BAA0B,KAAK,IAAI;AAExD,UAAM,KAAK,gBAAgB,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAClE,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,KAAK;AACb,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,QAAQ,KAAK,UAAU,UAAU,KAAK,SAAS,OAAO,SAAS,GAAG,KAAK,KAAK;AAC1F,YAAQ,MAAM,SAAS,KAAK,WAAW,UAAU,KAAK,UAAU,OAAO,SAAS,GAAG,KAAK,MAAM;AAC9F,cAAU,YAAY,OAAO;AAE7B,UAAM,UAAU,GAAG,EAAE;AACrB,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,KAAK;AACX,UAAM,MAAM,QAAQ;AACpB,UAAM,MAAM,SAAS;AACrB,YAAQ,YAAY,KAAK;AAEzB,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,OAAO;AACrB,YAAQ,MAAM,MAAM;AACpB,YAAQ,MAAM,QAAQ;AACtB,YAAQ,MAAM,SAAS;AACvB,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,aAAa;AAC3B,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,MAAM,aAAa;AAC3B,YAAQ,MAAM,QAAQ;AACtB,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,gBAAgB;AAC9B,YAAQ,MAAM,SAAS;AACvB,YAAQ,MAAM,aAAa;AAE3B,UAAM,cAAc,SAAS,cAAc,KAAK;AAChD,gBAAY,cAAc;AAC1B,YAAQ,YAAY,WAAW;AAC/B,YAAQ,YAAY,OAAO;AAE3B,UAAM,aAAa,CAAC,SAAkB,SAAkB;AACtD,kBAAY,cAAc,QAAQ;AAClC,cAAQ,MAAM,aAAa,UAAU,YAAY;AAAA,IACnD;AAEA,QAAI,wBAA6B;AACjC,QAAI,uBAAuB;AAK3B,UAAM,cAAc,CAAC,SAAiB;AACpC,UAAI,uBAAuB;AACzB,qBAAa,qBAAqB;AAClC,gCAAwB;AAAA,MAC1B;AACA,6BAAuB;AACvB,iBAAW,MAAM,IAAI;AAAA,IACvB;AAKA,UAAM,qBAAqB,CAAC,SAAiB;AAC3C,UAAI,uBAAuB;AACzB,qBAAa,qBAAqB;AAClC,gCAAwB;AAAA,MAC1B;AACA,6BAAuB;AACvB,iBAAW,MAAM,IAAI;AACrB,8BAAwB,WAAW,MAAM;AACvC,gCAAwB;AACxB,mBAAW,KAAK;AAAA,MAClB,GAAG,GAAI;AAAA,IACT;AAKA,UAAM,kBAAkB,CAAC,SAAiB;AACxC,UAAI,uBAAuB;AACzB,qBAAa,qBAAqB;AAClC,gCAAwB;AAAA,MAC1B;AACA,6BAAuB;AACvB,iBAAW,MAAM,IAAI;AAAA,IACvB;AAKA,UAAM,oBAAoB,CAAC,SAAkB,aAAqB;AAjNtE,UAAAC;AAkNM,UAAI,mBAAmB,kBAAkB;AACvC,cAAM,OAAO,QAAQ,eAAe;AACpC,cAAM,QAAc,QAAgB;AACpC,cAAM,SAAS,SAAS,OAAO,UAAU,YAAYA,MAAA,MAAM,WAAN,OAAAA,MAAgB,MAAM,OAAQ;AACnF,YAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;AAC5D,iBAAO,GAAG,IAAI,SAAI,MAAM;AAAA,QAC1B;AACA,eAAO;AAAA,MACT;AACA,aAAO,OAAO,YAAY,WAAW,UAAU;AAAA,IACjD;AAEA,UAAM,YAAY,gBAAgB;AAClC,UAAM,aAAa,qBAAoB,UAAK,eAAL,YAAmB,eAAe;AACzE,UAAM,UAAU,KAAK,UAAU,GAAG,UAAU,oBAAoB,KAAK;AACrE,UAAM,SAAS,GAAG,UAAU;AAE5B,UAAM,WAAW,KAAK,aAAa;AACnC,UAAM,cAAc,UAAK,eAAL,YAAmB;AACvC,UAAM,eAAe,QAAQ,KAAK,YAAY;AAC9C,UAAM,MAAM,OAAO,SAAS,KAAK,GAAU,IAAI,KAAK,MAAM,OAAO,KAAK,GAAG,CAAC,IAAI;AAC9E,UAAM,SAAS,OAAO,SAAS,KAAK,MAAa,IAAI,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC,IAAI;AACvF,UAAM,wBACJ,OAAO,KAAK,0BAA0B,YAAY,KAAK,wBAAwB;AACjF,UAAM,qBAAqB,KAAK,uBAAuB;AAEvD,QAAI,YAAY;AAChB,QAAI,UAAgC;AACpC,QAAI,eAA2B,MAAM;AAAA,IAAC;AACtC,QAAI,cAAoC,MAAM;AAAA,IAAC;AAE/C,UAAM,cAAc,CAAC,MAAe;AAjPxC,UAAAA;AAkPM,UAAI;AACF,SAAAA,MAAA,KAAK,YAAL,gBAAAA,IAAA,WAAe;AAAA,MACjB,QAAQ;AAAA,MAAC;AACT,WAAK,WAAW,SAAS,CAAC;AAAA,IAC5B;AASA,UAAM,cAAc,MAAM;AACxB,UAAI,CAAC,SAAU;AACf,UAAI,SAAS,QAAQ;AACnB,YAAI,CAAC,YAAY,UAAU,WAAW,EAAG;AACzC,YAAI;AACF,sBAAY,sCAAQ;AACpB,6CAAS,cAAc,CAAC;AAAA,QAC1B,SAAS,GAAG;AACV,sBAAY,CAAC;AAAA,QACf;AACA;AAAA,MACF;AACA,UAAI,SAAS,UAAU;AACrB,YAAI,CAAC,OAAO,SAAS,KAAK,eAAsB,EAAG;AACnD,YAAI,CAAC,OAAO,SAAS,KAAK,aAAoB,EAAG;AACjD,YAAI,CAAC,YAAY,UAAU,WAAW,EAAG;AACzC,cAAM,YAAY,KAAK,MAAM,OAAO,KAAK,eAAe,CAAC;AACzD,cAAM,UAAU,KAAK,MAAM,OAAO,KAAK,aAAa,CAAC;AACrD,cAAM,eAAe,OAAO,SAAS,KAAK,YAAmB,IACzD,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,IACpC;AACJ,YAAI;AACF,sBAAY,sCAAQ;AACpB,6CAAS,gBAAgB,gBAAgB,OAAO,EAAE,WAAW,QAAQ,IAAI,EAAE,WAAW,SAAS,aAAa;AAAA,QAC9G,SAAS,GAAG;AACV,sBAAY,CAAC;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAMA,UAAM,QAAQ,IAAI,QAAc,CAAC,SAAS,WAAW;AACnD,qBAAe;AACf,oBAAc;AAAA,IAChB,CAAC;AAKD,UAAM,aAAa,WAAW,MAAM;AAClC,YAAM,MAAM,IAAI,iBAAiB;AAAA,QAC/B;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AACD,sBAAgB,uCAAS,IAAI,WAAW,EAAE;AAC1C,kBAAY,GAAG;AACf,kBAAY,GAAG;AAAA,IACjB,GAAG,GAAM;AAET,gBAAY,gCAAO;AAEnB,UAAM,YAAY;AAtTtB,UAAAA;AAuTM,UAAI;AAKF,iBAAS,KAAK;AACd,yBAAiB;AACjB,YAAI,cAAc;AAChB,cAAI;AACF,aAAAA,MAAA,OAAO,mBAAP,gBAAAA,IAAuB,QAAQ,mBAAmB;AAAA,UACpD,QAAQ;AAAA,UAAC;AAAA,QACX;AACA,4BAAoB,gBAAgB,IAAI;AACxC,oCAA4B;AAE5B,cAAM,qBAAqB,EAAE,QAAQ,QAAQ,WAAW,IAAO,CAAC;AAEhE,kBAAU,IAAI,cAAc;AAAA,UAC1B,aAAa;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe,KAAK;AAAA,UACpB,gBAAgB,KAAK;AAAA,UACrB,QAAQ,KAAK;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe,KAAK;AAAA,UACpB,OAAO,KAAK;AAAA,UACZ,WAAW,CAAC,MAAM,SAAS;AAxVrC,gBAAAA;AAyVY,gBAAI;AACF,eAAAA,MAAA,KAAK,iBAAL,gBAAAA,IAAA,WAAoB,MAAM;AAAA,YAC5B,QAAQ;AAAA,YAAC;AAAA,UACX;AAAA,UACA,MAAM,CAAC,OAAO,YAAY;AA7VpC,gBAAAA,KAAAC,KAAAC;AA8VY,gBAAI,UAAU,SAAS;AACrB,2BAAa,UAAU;AACvB,2BAAa;AACb,yBAAW,KAAK;AAChB,qCAAuB;AACvB,kBAAI;AACF,iBAAAF,MAAA,KAAK,YAAL,gBAAAA,IAAA;AAAA,cACF,QAAQ;AAAA,cAAC;AACT,mBAAK,WAAW,OAAO;AACvB,0BAAY;AACZ;AAAA,YACF;AACA,gBAAI,UAAU,QAAQ;AACpB,yBAAW,KAAK;AAChB,kBAAI;AACF,iBAAAC,MAAA,KAAK,WAAL,gBAAAA,IAAA,WAAc;AAAA,cAChB,QAAQ;AAAA,cAAC;AACT,mBAAK,WAAW,QAAQ,OAAO;AAC/B;AAAA,YACF;AACA,gBAAI,UAAU,SAAS;AACrB,yBAAW,KAAK;AAChB,kBAAI;AACF,iBAAAC,MAAA,KAAK,YAAL,gBAAAA,IAAA;AAAA,cACF,QAAQ;AAAA,cAAC;AACT,mBAAK,WAAW,OAAO;AACvB;AAAA,YACF;AACA,gBAAI,UAAU,SAAS;AACrB,oBAAM,MAAM,kBAAkB,SAAS,0BAAM;AAC7C,kBAAI,mBAAmB,kBAAkB;AACvC,sBAAM,YAAY,oBAAI,IAAe;AAAA;AAAA;AAAA;AAAA,gBAIrC,CAAC;AACD,oBAAI,UAAU,IAAI,QAAQ,IAAI,GAAG;AAC/B,kCAAgB,uCAAS,GAAG,EAAE;AAC9B,8BAAY,OAAO;AACnB;AAAA,gBACF;AAAA,cACF;AACA,kBAAI,qBAAsB;AAC1B,iCAAmB,GAAG;AACtB,0BAAY,OAAO;AAAA,YACrB;AAAA,UACF;AAAA,QACF,CAAC;AAED,gBAAQ,KAAK;AAAA,MACf,SAAS,GAAG;AACV,qBAAa,UAAU;AACvB,cAAM,MAAM,aAAa,GAAG;AAAA,UAC1B;AAAA,UACA,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AACD,wBAAgB,uCAAS,IAAI,WAAW,EAAE;AAC1C,oBAAY,GAAG;AACf,oBAAY,GAAG;AAAA,MACjB;AAAA,IACF,GAAG;AAEH,UAAM,WAAgC;AAAA,MACpC;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAO,MAAM;AACX,YAAI,CAAC,QAAS;AACd,gBAAQ,MAAM;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,SAAS,MAAM;AAjbrB,YAAAF;AAkbQ,YAAI,UAAW;AACf,oBAAY;AACZ,qBAAa,UAAU;AACvB,YAAI,uBAAuB;AACzB,uBAAa,qBAAqB;AAClC,kCAAwB;AAAA,QAC1B;AACA,mBAAW,KAAK;AAChB,YAAI;AACF,6CAAS;AAAA,QACX,QAAQ;AAAA,QAAC;AACT,kBAAU;AACV,YAAI;AACF,kBAAQ,OAAO;AAAA,QACjB,QAAQ;AACN,cAAI;AACF,sBAAU,YAAY;AAAA,UACxB,QAAQ;AAAA,UAAC;AAAA,QACX;AACA,YAAI;AACF,2BAAiB;AAAA,QACnB,QAAQ;AAAA,QAAC;AACT,YAAI;AACF,sCAA4B;AAAA,QAC9B,QAAQ;AAAA,QAAC;AACT,YAAI;AACF,mBAAS,IAAI;AAAA,QACf,QAAQ;AAAA,QAAC;AACT,YAAI;AACF,WAAAA,MAAA,KAAK,cAAL,gBAAAA,IAAA;AAAA,QACF,QAAQ;AAAA,QAAC;AACT,aAAK,WAAW,SAAS;AACzB,kBAAU,MAAM;AAAA,MAClB;AAAA,MACA,KAAK;AAAA,QACH,QAAQ,MAAM,mCAAS;AAAA,QACvB,SAAS,CAAC,WAAmB,SAAgB;AAC3C,cAAI,WAAW;AACb,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,cAAI,CAAC,SAAS;AACZ,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,cAAI;AACF,mBAAO,QAAQ,QAAQ,QAAQ,GAAG,IAAI;AAAA,UACxC,SAAS,GAAG;AACV,kBAAM,MAAM,aAAa,GAAG;AAAA,cAC1B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,QACA,eAAe,CAAC,QAAa;AAC3B,cAAI,WAAW;AACb,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,cAAI,CAAC,SAAS;AACZ,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,sBAAY,sCAAQ;AACpB,cAAI;AACF,oBAAQ,cAAc,GAAG;AAAA,UAC3B,SAAS,GAAG;AACV,uBAAW,KAAK;AAChB,kBAAM,MAAM,aAAa,GAAG;AAAA,cAC1B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,QACA,iBAAiB,CAAC,QAAa;AAC7B,cAAI,WAAW;AACb,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,cAAI,CAAC,SAAS;AACZ,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,sBAAY,sCAAQ;AACpB,cAAI;AACF,oBAAQ,gBAAgB,GAAG;AAAA,UAC7B,SAAS,GAAG;AACV,uBAAW,KAAK;AAChB,kBAAM,MAAM,aAAa,GAAG;AAAA,cAC1B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,QACA,OAAO,CAAC,gBAAyB,mCAAS,YAAY;AAAA,QACtD,MAAM,CAAC,gBAAyB,mCAAS,WAAW;AAAA,QACpD,OAAO,CAAC,gBAAyB,mCAAS,YAAY;AAAA,QACtD,cAAc,CAAC,MAAc;AAC3B,cAAI,WAAW;AACb,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,cAAI,CAAC,SAAS;AACZ,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,cAAI;AACF,oBAAQ,aAAa,CAAC;AAAA,UACxB,SAAS,GAAG;AACV,kBAAM,MAAM,aAAa,GAAG;AAAA,cAC1B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,QACA,oBAAoB,CAAC,UAAkC,UAAmB;AACxE,cAAI,WAAW;AACb,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,cAAI,CAAC,SAAS;AACZ,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,sBAAY,0BAAM;AAClB,cAAI;AACF,oBAAQ,mBAAmB,UAAU,KAAK;AAAA,UAC5C,SAAS,GAAG;AACV,uBAAW,KAAK;AAChB,kBAAM,MAAM,aAAa,GAAG;AAAA,cAC1B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,QACA,WAAW,CAAC,OAAe,UAAkB;AAC3C,cAAI,WAAW;AACb,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,cAAI,CAAC,SAAS;AACZ,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,cAAI;AACF,oBAAQ,UAAU,OAAO,KAAK;AAAA,UAChC,SAAS,GAAG;AACV,kBAAM,MAAM,aAAa,GAAG;AAAA,cAC1B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,QACA,eAAe,MAAM;AACnB,cAAI,WAAW;AACb,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,cAAI,CAAC,SAAS;AACZ,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,cAAI;AACF,oBAAQ,cAAc;AACtB;AAAA,UACF,QAAQ;AAAA,UAAC;AACT,gBAAM,KAAU;AAChB,gBAAM,MAAM,yBAAI;AAChB,cAAI,OAAO,QAAQ,YAAY;AAC7B,kBAAM,MAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAY,GAAG;AACf,kBAAM;AAAA,UACR;AACA,eAAK,IAAI,KAAK,EAAE;AAAA,QAClB;AAAA,QACA,mBAAmB,MAAM;AACvB,cAAI,WAAW;AACb,kBAAMG,OAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAYA,IAAG;AACf,kBAAMA;AAAA,UACR;AACA,cAAI,CAAC,SAAS;AACZ,kBAAMA,OAAM,IAAI,iBAAiB;AAAA,cAC/B;AAAA,cACA,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AACD,wBAAYA,IAAG;AACf,kBAAMA;AAAA,UACR;AACA,cAAI;AACF,oBAAQ,kBAAkB;AAC1B;AAAA,UACF,QAAQ;AAAA,UAAC;AACT,gBAAM,MAAW;AACjB,gBAAM,OAAO,2BAAK;AAClB,cAAI,OAAO,SAAS,YAAY;AAC9B,iBAAK,KAAK,KAAK,GAAG;AAClB;AAAA,UACF;AACA,gBAAM,MAAM,IAAI,iBAAiB;AAAA,YAC/B;AAAA,YACA,SAAS;AAAA,YACT,aAAa;AAAA,UACf,CAAC;AACD,sBAAY,GAAG;AACf,gBAAM;AAAA,QACR;AAAA,QACA,SAAS,MAAM,SAAS,QAAQ;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA,MAIA,IAAI,CAAC,OAAO,YAAY;AAvuB9B,YAAAH;AAwuBQ,cAAM,OAAMA,MAAA,UAAU,IAAI,KAAK,MAAnB,OAAAA,MAAwB,oBAAI,IAAI;AAC5C,YAAI,IAAI,OAAc;AACtB,kBAAU,IAAI,OAAO,GAAG;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAIA,KAAK,CAAC,OAAO,YAAY;AACvB,cAAM,MAAM,UAAU,IAAI,KAAK;AAC/B,YAAI,CAAC,IAAK;AACV,YAAI,OAAO,OAAc;AACzB,YAAI,IAAI,SAAS,EAAG,WAAU,OAAO,KAAK;AAAA,MAC5C;AAAA,IACF;AAEA,QAAI,oBAAoB;AACtB,YAAM,aAAa,MAAM;AACvB,YAAI;AACF,gBAAM,MAAW;AACjB,cAAI,2BAAK,mBAAmB;AAC1B,qBAAS,IAAI,kBAAkB;AAC/B;AAAA,UACF;AACA,mBAAS,IAAI,cAAc;AAAA,QAC7B,QAAQ;AAAA,QAAC;AAAA,MACX;AACA,UAAI;AACF,gBAAQ,iBAAiB,YAAY,UAAU;AAAA,MACjD,QAAQ;AAAA,MAAC;AACT,YAAM,gBAAgB,SAAS;AAC/B,eAAS,UAAU,MAAM;AACvB,YAAI;AACF,kBAAQ,oBAAoB,YAAY,UAAU;AAAA,QACpD,QAAQ;AAAA,QAAC;AACT,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;","names":["ErrorCode","state","state","_a","_b","_c","err"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/sdk/SdkLoader.ts","../src/sdk/TokenVault.ts","../src/sdk/SelfTargetOriginShim.ts","../src/sdk/PlayerAdapter.ts","../src/DahuaPlayer.ts"],"sourcesContent":["export { DahuaPlayer } from './DahuaPlayer';\nexport { ErrorCode, DahuaPlayerError } from './errors';\nexport type { DahuaPlayerInitOptions, DahuaPlayerInstance, DahuaPlayerEventMap, DahuaPlayerEventName } from './types';\n\n","export enum ErrorCode {\n CONTAINER_NOT_FOUND = 'CONTAINER_NOT_FOUND',\n INVALID_TOKEN = 'INVALID_TOKEN',\n SDK_LOAD_FAILED = 'SDK_LOAD_FAILED',\n SDK_LOAD_TIMEOUT = 'SDK_LOAD_TIMEOUT',\n SDK_INIT_FAILED = 'SDK_INIT_FAILED',\n PLAY_FAILED = 'PLAY_FAILED',\n NETWORK_DISCONNECTED = 'NETWORK_DISCONNECTED',\n DESTROYED = 'DESTROYED',\n}\n\nexport class DahuaPlayerError extends Error {\n code: ErrorCode;\n userMessage: string;\n cause?: unknown;\n\n constructor(params: { code: ErrorCode; message: string; userMessage: string; cause?: unknown }) {\n super(params.message);\n this.name = 'DahuaPlayerError';\n this.code = params.code;\n this.userMessage = params.userMessage;\n this.cause = params.cause;\n }\n}\n\nexport function toDahuaError(e: unknown, fallback: { code: ErrorCode; message: string; userMessage: string }) {\n if (e instanceof DahuaPlayerError) return e;\n const cause = e;\n return new DahuaPlayerError({ ...fallback, cause });\n}\n","type LoadScriptType = 'module' | 'text/javascript';\n\ntype SdkLoaderState = {\n scripts: Map<string, Promise<void>>;\n styles: Map<string, Promise<void>>;\n};\n\nconst state: SdkLoaderState = {\n scripts: new Map(),\n styles: new Map(),\n};\n\nfunction loadStyleOnce(href: string): Promise<void> {\n const url = href.trim();\n if (!url) return Promise.resolve();\n const existing = state.styles.get(url);\n if (existing) return existing;\n\n const p = new Promise<void>((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n link.onload = () => resolve();\n link.onerror = (e) => reject(e);\n document.head.appendChild(link);\n });\n\n state.styles.set(url, p);\n return p;\n}\n\nfunction loadScriptOnce(src: string, type: LoadScriptType): Promise<void> {\n const url = src.trim();\n if (!url) return Promise.resolve();\n const existing = state.scripts.get(url);\n if (existing) return existing;\n\n const p = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.type = type;\n script.src = url;\n script.onload = () => resolve();\n script.onerror = (e) => reject(e);\n document.head.appendChild(script);\n });\n\n state.scripts.set(url, p);\n return p;\n}\n\nfunction waitFor<T>(fn: () => T | null | undefined, timeoutMs: number): Promise<T> {\n const start = Date.now();\n return new Promise<T>((resolve, reject) => {\n const tick = () => {\n try {\n const v = fn();\n if (v) return resolve(v);\n } catch {}\n if (Date.now() - start >= timeoutMs) return reject(new Error('timeout'));\n setTimeout(tick, 50);\n };\n tick();\n });\n}\n\nexport async function ensureDahuaSdkLoaded(opts: { sdkUrl: string; cssUrl?: string; timeoutMs?: number }) {\n const sdkUrl = opts.sdkUrl;\n const cssUrl = opts.cssUrl;\n const timeoutMs = opts.timeoutMs ?? 20_000;\n\n if (cssUrl) {\n try {\n await loadStyleOnce(cssUrl);\n } catch {}\n }\n\n await loadScriptOnce(sdkUrl, 'module').catch(async () => {\n await loadScriptOnce(sdkUrl, 'text/javascript');\n });\n\n const PlayerManager = await waitFor(\n () => (window as any).PlayerManager as unknown,\n timeoutMs,\n );\n\n if (typeof PlayerManager !== 'function') {\n throw new Error('PlayerManager not available after SDK load');\n }\n}\n\n","type TokenShimState = {\n refCount: number;\n token: string | null;\n};\n\nconst state: TokenShimState = {\n refCount: 0,\n token: null,\n};\n\n/**\n * 将 token 同步到 sessionStorage。\n *\n * 背景:wsplayer 内部会从 `sessionStorage[tokenStorageKey] || localStorage[tokenStorageKey]`\n * 读取 token,并将其写入请求头 `X-Subject-Token`。因此这里需要保证 sessionStorage 中存在 psi_token。\n *\n * 注意:写入 sessionStorage 意味着 token 会在当前 tab 生命周期内可被同域脚本读取,\n * 请确保页面环境可信并注意 XSS 风险。\n */\nfunction syncToSessionStorage() {\n try {\n const ss = window.sessionStorage;\n if (!ss) return;\n if (state.token) {\n ss.setItem('psi_token', state.token);\n } else {\n ss.removeItem('psi_token');\n }\n } catch {}\n}\n\n/**\n * 设置当前 token。\n *\n * - 存入内存\n * - 若 shim 已启用,则立即同步到 sessionStorage.psi_token\n */\nexport function setToken(token: string | null) {\n state.token = token;\n if (state.refCount > 0) syncToSessionStorage();\n}\n\n/**\n * 获取当前内存 token。\n */\n/**\n * 启用 token 同步。\n *\n * - 使用 refCount 支持多个实例共存\n * - 只在第一次 acquire 时写入 sessionStorage\n */\nexport function acquireTokenShim() {\n state.refCount++;\n if (state.refCount !== 1) return;\n syncToSessionStorage();\n}\n\n/**\n * 释放 token 同步。\n *\n * - refCount 归零时清理 sessionStorage.psi_token\n */\nexport function releaseTokenShim() {\n if (state.refCount <= 0) return;\n state.refCount--;\n if (state.refCount !== 0) return;\n try {\n window.sessionStorage?.removeItem('psi_token');\n } catch {}\n}\n","type SelfTargetOriginShimState = {\n refCount: number;\n origin: string | null;\n originalXhrOpen: XMLHttpRequest['open'] | null;\n originalXhrSend: XMLHttpRequest['send'] | null;\n originalXhrSetRequestHeader: XMLHttpRequest['setRequestHeader'] | null;\n};\n\nconst state: SelfTargetOriginShimState = {\n refCount: 0,\n origin: null,\n originalXhrOpen: null,\n originalXhrSend: null,\n originalXhrSetRequestHeader: null,\n};\n\nfunction shouldAttachOrigin(url: unknown) {\n if (typeof url !== 'string') return false;\n return url.includes('/videoService/') || url.includes('videoService/');\n}\n\nfunction normalizeHeaderName(name: unknown) {\n return typeof name === 'string' ? name.trim().toLowerCase() : '';\n}\n\nexport function setSelfTargetOrigin(origin: string | null) {\n state.origin = typeof origin === 'string' ? origin.trim() || null : null;\n}\n\nexport function acquireSelfTargetOriginShim() {\n state.refCount++;\n if (state.refCount !== 1) return;\n\n try {\n const proto = XMLHttpRequest.prototype as any;\n if (typeof proto.open !== 'function' || typeof proto.send !== 'function' || typeof proto.setRequestHeader !== 'function') {\n return;\n }\n\n state.originalXhrOpen = proto.open;\n state.originalXhrSend = proto.send;\n state.originalXhrSetRequestHeader = proto.setRequestHeader;\n\n proto.open = function (...args: any[]) {\n try {\n (this as any).__dahua_request_url = args[1];\n (this as any).__dahua_has_self_target_origin = false;\n } catch {}\n return state.originalXhrOpen!.apply(this, args as any);\n };\n\n proto.setRequestHeader = function (name: string, value: string) {\n try {\n if (normalizeHeaderName(name) === 'self-targetorigin') {\n (this as any).__dahua_has_self_target_origin = true;\n }\n } catch {}\n return state.originalXhrSetRequestHeader!.call(this, name, value);\n };\n\n proto.send = function (...args: any[]) {\n try {\n const origin =\n state.origin ||\n window.sessionStorage?.getItem('wsplayer_origin') ||\n window.localStorage?.getItem('wsplayer_origin') ||\n null;\n const url = (this as any).__dahua_request_url;\n const alreadySet = Boolean((this as any).__dahua_has_self_target_origin);\n\n if (!alreadySet && origin && shouldAttachOrigin(url)) {\n state.originalXhrSetRequestHeader!.call(this, 'Self-TargetOrigin', origin);\n }\n } catch {}\n return state.originalXhrSend!.apply(this, args as any);\n };\n } catch {}\n}\n\nexport function releaseSelfTargetOriginShim() {\n if (state.refCount <= 0) return;\n state.refCount--;\n if (state.refCount !== 0) return;\n\n try {\n const proto = XMLHttpRequest.prototype as any;\n if (state.originalXhrOpen) proto.open = state.originalXhrOpen;\n if (state.originalXhrSend) proto.send = state.originalXhrSend;\n if (state.originalXhrSetRequestHeader) proto.setRequestHeader = state.originalXhrSetRequestHeader;\n } catch {}\n\n state.origin = null;\n state.originalXhrOpen = null;\n state.originalXhrSend = null;\n state.originalXhrSetRequestHeader = null;\n}\n","import { ErrorCode, DahuaPlayerError } from '../errors';\nimport type { DahuaPlayerMode, DahuaPlayerPlayerOptions } from '../types';\n\ntype ReceiveFn = (type: string, data: any) => void;\n\ntype PlayerAdapterOptions = {\n containerId: string;\n staticPath: string;\n mode: DahuaPlayerMode;\n cameraId?: string;\n cameraIds?: string[];\n streamType: 1 | 2 | 3;\n searchOnline: boolean;\n useNginxProxy?: boolean;\n nginxProxyHost?: string;\n useWSS?: boolean;\n num?: number;\n maxNum?: number;\n showRecordProgressBar?: boolean;\n playerOptions?: DahuaPlayerPlayerOptions;\n debug?: boolean;\n onMessage?: ReceiveFn;\n emit: (event: 'ready' | 'play' | 'pause' | 'error', payload?: any) => void;\n};\n\nexport class PlayerAdapter {\n private opts: PlayerAdapterOptions;\n private playerManager: any | null = null;\n private destroyed = false;\n private readyResolved = false;\n private lastStatus: string | null = null;\n private currentNum = 1;\n private currentMaxNum = 1;\n\n constructor(opts: PlayerAdapterOptions) {\n this.opts = opts;\n }\n\n getRaw() {\n return this.playerManager;\n }\n\n init() {\n if (this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const PM = (window as any).PlayerManager;\n if (typeof PM !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'PlayerManager is not available',\n userMessage: '播放器内核未加载',\n });\n }\n\n const userReceive = this.opts.onMessage;\n const showRecordProgressBar =\n typeof this.opts.showRecordProgressBar === 'boolean'\n ? this.opts.showRecordProgressBar\n : this.opts.mode === 'record';\n const initialNum = this.normalizePositiveInt(\n this.opts.num ?? (this.opts.playerOptions as any)?.num ?? 1,\n 1,\n );\n const initialMaxNum = this.normalizePositiveInt(\n this.opts.maxNum ?? (this.opts.playerOptions as any)?.maxNum ?? initialNum,\n initialNum,\n );\n const defaultOptions: Record<string, unknown> = {\n type: this.opts.mode,\n num: initialNum,\n maxNum: initialMaxNum,\n showControl: false,\n showIcons: { hidden: true },\n showRecordProgressBar,\n useNginxProxy: this.opts.useNginxProxy ?? false,\n nginxProxyHost: this.opts.nginxProxyHost ?? '',\n useWSS: this.opts.useWSS ?? false,\n };\n const merged = {\n ...defaultOptions,\n ...(this.opts.playerOptions ?? {}),\n el: this.opts.containerId,\n STATIC_PATH: this.opts.staticPath,\n receiveMessageFromWSPlayer: (type: string, data: any) => {\n if (this.destroyed) return;\n\n try {\n userReceive?.(type, data);\n } catch {}\n\n this.handleSdkMessage(type, data);\n },\n };\n this.playerManager = new PM(merged);\n this.currentNum = this.normalizePositiveInt((merged as any).num, 1);\n this.currentMaxNum = this.normalizePositiveInt((merged as any).maxNum, this.currentNum);\n }\n\n private log(...args: any[]) {\n if (!this.opts.debug) return;\n try {\n console.log('[dahua-player]', ...args);\n } catch {}\n }\n\n private summarizeSdkMessage(type: string, data: any) {\n if (type === 'statusChanged') {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n return { status };\n }\n if (type === 'realError' || type === 'recordError') {\n const reason = data && typeof data === 'object' ? (data as any).reason : undefined;\n return { reason };\n }\n if (type === 'errorInfo') {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n const code = data && typeof data === 'object' ? (data as any).code : undefined;\n return { status, code };\n }\n return undefined;\n }\n\n private handleSdkMessage(type: string, data: any) {\n this.log('sdk', type, this.summarizeSdkMessage(type, data));\n switch (type) {\n case 'initializationCompleted': {\n if (!this.readyResolved) {\n this.readyResolved = true;\n this.opts.emit('ready');\n }\n return;\n }\n case 'realSuccess': {\n this.opts.emit('play', { mode: 'real' });\n return;\n }\n case 'recordSuccess': {\n this.opts.emit('play', { mode: 'record' });\n return;\n }\n case 'statusChanged': {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n if (typeof status === 'string' && status && status !== this.lastStatus) {\n this.lastStatus = status;\n if (status === 'pause' || status === 'paused') {\n this.opts.emit('pause');\n return;\n }\n if (status === 'playing') {\n this.opts.emit('play', { mode: this.opts.mode });\n return;\n }\n }\n return;\n }\n case 'windowNumChanged': {\n const n =\n typeof data === 'number'\n ? data\n : data && typeof data === 'object'\n ? ((data as any).num ?? (data as any).number ?? (data as any).windowNum)\n : undefined;\n const v = this.normalizePositiveInt(n, this.currentNum);\n this.currentNum = v;\n return;\n }\n case 'realError': {\n this.opts.emit(\n 'error',\n new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'Real play failed',\n userMessage: '实时预览失败',\n cause: data,\n }),\n );\n return;\n }\n case 'recordError': {\n this.opts.emit(\n 'error',\n new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'Record play failed',\n userMessage: '录像回放失败',\n cause: data,\n }),\n );\n return;\n }\n default:\n return;\n }\n }\n\n private normalizeChannelList(opt: any) {\n const fromOpt = opt && typeof opt === 'object' ? (opt as any).channelList : undefined;\n if (Array.isArray(fromOpt) && fromOpt.length > 0) return this.limitByCurrentNum(fromOpt);\n\n const idsFromOpt = this.normalizeCameraIds(\n opt && typeof opt === 'object' ? ((opt as any).cameraIds ?? (opt as any).cameraId) : undefined,\n );\n if (idsFromOpt.length > 0) return this.limitByCurrentNum(idsFromOpt.map((id) => ({ channelCode: id })));\n\n const initIds = this.normalizeCameraIds(this.opts.cameraIds);\n if (initIds.length > 0) return this.limitByCurrentNum(initIds.map((id) => ({ channelCode: id })));\n if (this.opts.cameraId) return [{ channelCode: this.opts.cameraId }];\n return null;\n }\n\n private normalizeCameraIds(input: unknown): string[] {\n const list: string[] = [];\n if (typeof input === 'string') {\n const v = input.trim();\n if (v) list.push(v);\n } else if (Array.isArray(input)) {\n for (const it of input) {\n if (typeof it !== 'string') continue;\n const v = it.trim();\n if (v) list.push(v);\n }\n }\n const uniq = Array.from(new Set(list));\n return uniq;\n }\n\n private limitByCurrentNum<T>(list: T[]): T[] {\n const cap = this.normalizePositiveInt(this.currentNum, 1);\n if (list.length <= cap) return list;\n const sliced = list.slice(0, cap);\n this.log('channelList truncated by layout', { cap, original: list.length });\n return sliced;\n }\n\n private normalizePositiveInt(input: unknown, fallback: number) {\n const n = typeof input === 'number' ? input : typeof input === 'string' ? Number(input) : NaN;\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.floor(n);\n }\n\n playRealVideo(opt: any) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const channelList = this.normalizeChannelList(opt);\n if (!channelList) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'channelList is required for real play',\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\n });\n }\n if (typeof this.playerManager.playRealVideo !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playRealVideo is not available',\n userMessage: '当前内核不支持实时预览播放',\n });\n }\n this.log('playRealVideo');\n this.playerManager.playRealVideo({ ...(opt ?? {}), channelList });\n }\n\n playRecordVideo(opt: any) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const channelList = this.normalizeChannelList(opt);\n if (!channelList) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'channelList is required for record play',\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\n });\n }\n if (typeof this.playerManager.playRecordVideo !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playRecordVideo is not available',\n userMessage: '当前内核不支持录像回放播放',\n });\n }\n this.log('playRecordVideo');\n this.playerManager.playRecordVideo({ ...(opt ?? {}), channelList });\n }\n\n setPlayerNum(num: number) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const v = this.normalizePositiveInt(num, this.currentNum);\n const fn = this.playerManager?.setPlayerNum;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setPlayerNum is not available',\n userMessage: '当前内核不支持切换布局路数',\n });\n }\n this.log('setPlayerNum', v);\n fn.call(this.playerManager, v);\n this.currentNum = v;\n }\n\n jumpPlayByDateTime(datetime: string | Date | number, index?: number) {\n if (this.opts.mode !== 'record') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime only supports record mode',\n userMessage: '实时预览不支持跳转播放',\n });\n }\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const dt = this.formatDateTime(datetime);\n const fn = this.pickMethod(['jumpPlayByDateTime', 'jumpPlayByDatetime']);\n if (!fn) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime is not available',\n userMessage: '当前内核不支持录像跳转播放',\n });\n }\n const idx = typeof index === 'number' ? Math.floor(index) : undefined;\n this.log('jumpPlayByDateTime', { dt, index: idx });\n fn(dt, idx);\n }\n\n playSpeed(speed: number, index: number) {\n if (this.opts.mode !== 'record') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed only supports record mode',\n userMessage: '实时预览不支持倍速播放',\n });\n }\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const allowed = new Set([0.125, 0.25, 0.5, 1, 1.25, 1.5, 2, 4, 8]);\n if (!allowed.has(speed)) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'invalid speed',\n userMessage: '倍速参数不合法',\n cause: { speed },\n });\n }\n const idx = this.normalizePositiveInt(index, 0);\n const fn = this.playerManager?.playSpeed;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed is not available',\n userMessage: '当前内核不支持倍速播放',\n });\n }\n this.log('playSpeed', { speed, index: idx });\n fn.call(this.playerManager, speed, idx);\n }\n\n setFullScreen() {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const fn = this.playerManager?.setFullScreen;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setFullScreen is not available',\n userMessage: '当前内核不支持全屏',\n });\n }\n this.log('setFullScreen');\n fn.call(this.playerManager);\n }\n\n setExitFullScreen() {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const fn = this.playerManager?.setExitFullScreen;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setExitFullScreen is not available',\n userMessage: '当前内核不支持退出全屏',\n });\n }\n this.log('setExitFullScreen');\n fn.call(this.playerManager);\n }\n\n callRaw(method: string, ...args: any[]) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const name = typeof method === 'string' ? method.trim() : '';\n if (!name) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'method is required',\n userMessage: '缺少 method 参数',\n });\n }\n const fn = (this.playerManager as any)[name];\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: `method not found: ${name}`,\n userMessage: `底层方法不存在:${name}`,\n });\n }\n this.log('callRaw', name);\n return fn.apply(this.playerManager, args);\n }\n\n private pickMethod(names: string[]) {\n for (const n of names) {\n const fn = (this.playerManager as any)?.[n];\n if (typeof fn === 'function') return fn.bind(this.playerManager);\n }\n return null;\n }\n\n private formatDateTime(input: string | Date | number) {\n if (typeof input === 'string') return input.trim();\n const d =\n typeof input === 'number'\n ? new Date(input > 1_000_000_000_000 ? input : input * 1000)\n : input instanceof Date\n ? input\n : new Date(NaN);\n if (!Number.isFinite(d.getTime())) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'invalid datetime',\n userMessage: '跳转时间格式不合法',\n });\n }\n const pad2 = (n: number) => String(n).padStart(2, '0');\n const y = d.getFullYear();\n const m = pad2(d.getMonth() + 1);\n const day = pad2(d.getDate());\n const hh = pad2(d.getHours());\n const mm = pad2(d.getMinutes());\n const ss = pad2(d.getSeconds());\n return `${y}-${m}-${day} ${hh}:${mm}:${ss}`;\n }\n\n pause() {\n if (!this.playerManager || this.destroyed) return;\n try {\n this.log('pause');\n if (typeof this.playerManager.pause === 'function') {\n this.playerManager.pause(0);\n } else if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(0);\n this.opts.emit('pause');\n }\n } catch {}\n }\n\n pauseWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('pauseWindow', idx);\n if (typeof this.playerManager.pause === 'function') {\n this.playerManager.pause(idx);\n } else if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(idx);\n this.opts.emit('pause');\n }\n } catch {}\n }\n\n playWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('playWindow', idx);\n if (typeof this.playerManager.play === 'function') {\n this.playerManager.play(idx);\n }\n } catch {}\n }\n\n closeWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('closeWindow', idx);\n if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(idx);\n }\n } catch {}\n }\n\n destroy() {\n if (this.destroyed) return;\n this.destroyed = true;\n this.log('destroy');\n\n if (this.playerManager) {\n try {\n this.playerManager.destroy();\n } catch {}\n this.playerManager = null;\n }\n }\n}\n","import { ErrorCode, DahuaPlayerError, toDahuaError } from './errors';\nimport type {\n DahuaPlayerEventName,\n DahuaPlayerAuth,\n DahuaPlayerInitOptions,\n DahuaPlayerInstance,\n DahuaPlayerMode,\n} from './types';\nimport { ensureDahuaSdkLoaded } from './sdk/SdkLoader';\nimport { acquireTokenShim, releaseTokenShim, setToken } from './sdk/TokenVault';\nimport { acquireSelfTargetOriginShim, releaseSelfTargetOriginShim, setSelfTargetOrigin } from './sdk/SelfTargetOriginShim';\nimport { PlayerAdapter } from './sdk/PlayerAdapter';\n\ntype ListenerMap = Map<DahuaPlayerEventName, Set<(payload: any) => void>>;\n\n/**\n * 规范化大华静态资源根路径。\n *\n * - 允许传入 \"/wsplayer-gov\" 或 \"wsplayer-gov\"\n * - 会去掉末尾多余的 \"/\"\n */\nfunction normalizeStaticPath(path: string) {\n const raw = (path || '').trim();\n if (!raw) return '/wsplayer-gov';\n const v = raw.replace(/\\/+$/, '');\n return v.startsWith('/') ? v : `/${v}`;\n}\n\nfunction buildTargetOriginFromAuth(auth: DahuaPlayerAuth | undefined) {\n if (!auth) return '';\n const ip = typeof auth.ip === 'string' ? auth.ip.trim() : '';\n const port = typeof auth.port === 'number' ? auth.port : typeof auth.port === 'string' ? Number(auth.port) : NaN;\n if (!ip || !Number.isFinite(port) || port <= 0) return '';\n const protocol = auth.protocol === 'http' ? 'http' : 'https';\n return `${protocol}://${ip}:${port}`;\n}\n\n/**\n * 解析播放器挂载容器。\n *\n * - string:按 id 查找元素\n * - HTMLElement:直接使用\n */\nfunction resolveContainer(container: HTMLElement | string): HTMLElement {\n if (typeof container === 'string') {\n const el = document.getElementById(container);\n if (!el) {\n throw new DahuaPlayerError({\n code: ErrorCode.CONTAINER_NOT_FOUND,\n message: `container not found: ${container}`,\n userMessage: '未找到播放器挂载节点',\n });\n }\n return el;\n }\n if (container && typeof container === 'object') return container;\n throw new DahuaPlayerError({\n code: ErrorCode.CONTAINER_NOT_FOUND,\n message: 'container is invalid',\n userMessage: '播放器挂载节点无效',\n });\n}\n\nfunction createListeners(): ListenerMap {\n return new Map();\n}\n\nfunction emit(listeners: ListenerMap, event: DahuaPlayerEventName, payload?: any) {\n const set = listeners.get(event);\n if (!set || set.size === 0) return;\n for (const cb of set) {\n try {\n cb(payload);\n } catch {}\n }\n}\n\n/**\n * 大华播放器核心入口。\n *\n * 设计目标:\n *\n * - 对外只暴露一个初始化方法:`DahuaPlayer.init(options)`\n * - 自动加载大华 SDK 脚本与 CSS(默认从 `/wsplayer-gov` 下加载)\n * - 不在浏览器持久化保存 token(通过 sessionStorage shim 仅在内存注入)\n * - 统一事件与错误码:ready/play/pause/error/destroy + ErrorCode\n *\n * 注意:\n *\n * - 本类不负责登录鉴权;需要外部提供已获取到的 `token`\n */\nexport class DahuaPlayer {\n /**\n * 初始化播放器并返回实例。\n *\n * 生命周期:\n *\n * - 立即创建 DOM 结构并开始异步加载 SDK\n * - `instance.ready` 会在 SDK 触发 `initializationCompleted` 后 resolve\n * - `destroy()` 会销毁 SDK 实例、移除 DOM,并释放 token shim\n *\n * @throws DahuaPlayerError 当 container/token 不合法时抛出\n */\n static init(options: DahuaPlayerInitOptions): DahuaPlayerInstance {\n const opts = options || ({} as any);\n const container = resolveContainer(opts.container);\n\n const mode: DahuaPlayerMode = opts.mode ?? 'real';\n\n const token = typeof opts.auth?.token === 'string' ? opts.auth.token.trim() : '';\n if (!token) {\n throw new DahuaPlayerError({\n code: ErrorCode.INVALID_TOKEN,\n message: 'token is required',\n userMessage: '缺少 token,请先完成鉴权登录',\n });\n }\n\n const cameraId = typeof opts.cameraId === 'string' ? opts.cameraId.trim() : '';\n const cameraIds = Array.isArray(opts.cameraIds) ? opts.cameraIds.map((v) => v.trim()).filter(Boolean) : [];\n const targetOrigin = buildTargetOriginFromAuth(opts.auth);\n\n const id = `dahua-player-${Math.random().toString(36).slice(2, 10)}`;\n const wrapper = document.createElement('div');\n wrapper.id = id;\n wrapper.style.position = 'relative';\n wrapper.style.width = opts.width === 'auto' || opts.width == null ? '100%' : `${opts.width}px`;\n wrapper.style.height = opts.height === 'auto' || opts.height == null ? '100%' : `${opts.height}px`;\n container.appendChild(wrapper);\n\n const innerId = `${id}-inner`;\n const inner = document.createElement('div');\n inner.id = innerId;\n inner.style.width = '100%';\n inner.style.height = '100%';\n wrapper.appendChild(inner);\n\n const loading = document.createElement('div');\n loading.style.position = 'absolute';\n loading.style.left = '0';\n loading.style.top = '0';\n loading.style.right = '0';\n loading.style.bottom = '0';\n loading.style.display = 'flex';\n loading.style.alignItems = 'center';\n loading.style.justifyContent = 'center';\n loading.style.background = 'rgba(0,0,0,0.35)';\n loading.style.color = '#fff';\n loading.style.fontSize = '12px';\n loading.style.pointerEvents = 'none';\n loading.style.zIndex = '10';\n loading.style.visibility = 'hidden';\n\n const loadingText = document.createElement('div');\n loadingText.textContent = '';\n loading.appendChild(loadingText);\n wrapper.appendChild(loading);\n\n const setLoading = (visible: boolean, text?: string) => {\n loadingText.textContent = text || '';\n loading.style.visibility = visible ? 'visible' : 'hidden';\n };\n\n let transientOverlayTimer: any = null;\n let stickyOverlayVisible = false;\n\n /**\n * 开始一个“加载中”覆盖层展示,并清理可能存在的错误提示计时器。\n */\n const showLoading = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = false;\n setLoading(true, text);\n };\n\n /**\n * 以短暂覆盖层的方式提示错误,给用户一个可见反馈。\n */\n const showTransientError = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = false;\n setLoading(true, text);\n transientOverlayTimer = setTimeout(() => {\n transientOverlayTimer = null;\n setLoading(false);\n }, 3000);\n };\n\n /**\n * 以常驻覆盖层的方式提示错误,直到下一次显式加载/销毁。\n */\n const showStickyError = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = true;\n setLoading(true, text);\n };\n\n /**\n * 将 error payload 格式化为可读文案;尽量带上状态码等关键信息。\n */\n const formatUserMessage = (payload: unknown, fallback: string) => {\n if (payload instanceof DahuaPlayerError) {\n const base = payload.userMessage || fallback;\n const cause: any = (payload as any).cause;\n const status = cause && typeof cause === 'object' ? (cause.status ?? cause.code) : undefined;\n if (typeof status === 'number' || typeof status === 'string') {\n return `${base}(${status})`;\n }\n return base;\n }\n return typeof payload === 'string' ? payload : fallback;\n };\n\n const listeners = createListeners();\n const staticPath = normalizeStaticPath(opts.staticPath ?? '/wsplayer-gov');\n const sdkUrl = (opts.sdkUrl || `${staticPath}/wsplayer.min.js`).trim();\n const cssUrl = `${staticPath}/WSPlayer/player.css`;\n\n const autoPlay = opts.autoPlay === true;\n const streamType = (opts.streamType ?? 2) as 1 | 2 | 3;\n const searchOnline = Boolean(opts.searchOnline);\n const num = Number.isFinite(opts.num as any) ? Math.floor(Number(opts.num)) : undefined;\n const maxNum = Number.isFinite(opts.maxNum as any) ? Math.floor(Number(opts.maxNum)) : undefined;\n const showRecordProgressBar =\n typeof opts.showRecordProgressBar === 'boolean' ? opts.showRecordProgressBar : undefined;\n const dblClickFullscreen = opts.dblClickFullscreen !== false;\n\n let destroyed = false;\n let adapter: PlayerAdapter | null = null;\n let readyResolve: () => void = () => {};\n let readyReject: (e: unknown) => void = () => {};\n\n const safeOnError = (e: unknown) => {\n try {\n opts.onError?.(e);\n } catch {}\n emit(listeners, 'error', e);\n };\n\n /**\n * autoPlay:根据 init 参数在 ready 后触发一次自动播放。\n *\n * 触发条件:\n * - 实时预览(mode=real):需要 cameraId + autoPlay=true\n * - 录像回放(mode=record):需要 recordStartTime/recordEndTime(Unix 秒)+ autoPlay=true\n */\n const tryAutoPlay = () => {\n if (!autoPlay) return;\n if (mode === 'real') {\n if (!cameraId && cameraIds.length === 0) return;\n try {\n showLoading('加载视频中…');\n adapter?.playRealVideo({});\n } catch (e) {\n safeOnError(e);\n }\n return;\n }\n if (mode === 'record') {\n if (!Number.isFinite(opts.recordStartTime as any)) return;\n if (!Number.isFinite(opts.recordEndTime as any)) return;\n if (!cameraId && cameraIds.length === 0) return;\n const startTime = Math.floor(Number(opts.recordStartTime));\n const endTime = Math.floor(Number(opts.recordEndTime));\n const recordSource = Number.isFinite(opts.recordSource as any)\n ? Math.floor(Number(opts.recordSource))\n : undefined;\n try {\n showLoading('加载录像中…');\n adapter?.playRecordVideo(recordSource == null ? { startTime, endTime } : { startTime, endTime, recordSource });\n } catch (e) {\n safeOnError(e);\n }\n }\n };\n\n /**\n * ready:仅代表播放器“初始化完成”,不等价于“已成功播放”。\n * 播放成功/失败通过 play/error 事件体现。\n */\n const ready = new Promise<void>((resolve, reject) => {\n readyResolve = resolve;\n readyReject = reject;\n });\n\n /**\n * 初始化兜底超时:避免 SDK 资源或初始化流程异常导致 ready 永远 pending。\n */\n const readyTimer = setTimeout(() => {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_LOAD_TIMEOUT,\n message: 'SDK ready timeout',\n userMessage: '播放器初始化超时',\n });\n showStickyError(`初始化失败:${err.userMessage}`);\n safeOnError(err);\n readyReject(err);\n }, 20_000);\n\n showLoading('初始化中…');\n\n void (async () => {\n try {\n /**\n * 大华 SDK 内部会从 sessionStorage 读取 psi_token。\n * 这里通过 shim 仅在内存提供 token,避免 token 落盘。\n */\n setToken(token);\n acquireTokenShim();\n if (targetOrigin) {\n try {\n window.sessionStorage?.setItem('wsplayer_origin', targetOrigin);\n } catch {}\n }\n setSelfTargetOrigin(targetOrigin || null);\n acquireSelfTargetOriginShim();\n\n await ensureDahuaSdkLoaded({ sdkUrl, cssUrl, timeoutMs: 20_000 });\n\n adapter = new PlayerAdapter({\n containerId: innerId,\n staticPath,\n mode,\n cameraId,\n cameraIds,\n streamType,\n searchOnline,\n useNginxProxy: opts.useNginxProxy,\n nginxProxyHost: opts.nginxProxyHost,\n useWSS: opts.useWSS,\n num,\n maxNum,\n showRecordProgressBar,\n playerOptions: opts.playerOptions,\n debug: opts.debug,\n onMessage: (type, data) => {\n try {\n opts.onSdkMessage?.(type, data);\n } catch {}\n },\n emit: (event, payload) => {\n if (event === 'ready') {\n clearTimeout(readyTimer);\n readyResolve();\n setLoading(false);\n stickyOverlayVisible = false;\n try {\n opts.onReady?.();\n } catch {}\n emit(listeners, 'ready');\n tryAutoPlay();\n return;\n }\n if (event === 'play') {\n setLoading(false);\n try {\n opts.onPlay?.(payload);\n } catch {}\n emit(listeners, 'play', payload);\n return;\n }\n if (event === 'pause') {\n setLoading(false);\n try {\n opts.onPause?.();\n } catch {}\n emit(listeners, 'pause');\n return;\n }\n if (event === 'error') {\n const msg = formatUserMessage(payload, '播放失败');\n if (payload instanceof DahuaPlayerError) {\n const initCodes = new Set<ErrorCode>([\n ErrorCode.SDK_INIT_FAILED,\n ErrorCode.SDK_LOAD_FAILED,\n ErrorCode.SDK_LOAD_TIMEOUT,\n ]);\n if (initCodes.has(payload.code)) {\n showStickyError(`初始化失败:${msg}`);\n safeOnError(payload);\n return;\n }\n }\n if (stickyOverlayVisible) return;\n showTransientError(msg);\n safeOnError(payload);\n }\n },\n });\n\n adapter.init();\n } catch (e) {\n clearTimeout(readyTimer);\n const err = toDahuaError(e, {\n code: ErrorCode.SDK_LOAD_FAILED,\n message: 'SDK load/init failed',\n userMessage: '播放器初始化失败',\n });\n showStickyError(`初始化失败:${err.userMessage}`);\n safeOnError(err);\n readyReject(err);\n }\n })();\n\n const instance: DahuaPlayerInstance = {\n id,\n ready,\n /**\n * 暂停播放。\n *\n * 注意:部分 SDK 版本 pause/close 的行为差异由内部适配处理。\n */\n pause: () => {\n if (!adapter) return;\n adapter.pause();\n },\n /**\n * 销毁播放器实例并释放资源。\n *\n * - 移除创建的 DOM 节点\n * - 调用 SDK destroy(若存在)\n * - 释放 token shim,清理内存 token\n * - 触发 destroy 事件\n */\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n clearTimeout(readyTimer);\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n setLoading(false);\n try {\n adapter?.destroy();\n } catch {}\n adapter = null;\n try {\n wrapper.remove();\n } catch {\n try {\n container.innerHTML = '';\n } catch {}\n }\n try {\n releaseTokenShim();\n } catch {}\n try {\n releaseSelfTargetOriginShim();\n } catch {}\n try {\n setToken(null);\n } catch {}\n try {\n opts.onDestroy?.();\n } catch {}\n emit(listeners, 'destroy');\n listeners.clear();\n },\n sdk: {\n getRaw: () => adapter?.getRaw(),\n callRaw: (method: string, ...args: any[]) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n return adapter.callRaw(method, ...args);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'callRaw failed',\n userMessage: '调用底层方法失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playRealVideo: (opt: any) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('加载视频中…');\n try {\n adapter.playRealVideo(opt);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playRealVideo failed',\n userMessage: '实时预览播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playRecordVideo: (opt: any) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('加载录像中…');\n try {\n adapter.playRecordVideo(opt);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playRecordVideo failed',\n userMessage: '录像回放播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n pause: (windowIndex?: number) => adapter?.pauseWindow(windowIndex),\n play: (windowIndex?: number) => adapter?.playWindow(windowIndex),\n close: (windowIndex?: number) => adapter?.closeWindow(windowIndex),\n setPlayerNum: (n: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setPlayerNum(n);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'setPlayerNum failed',\n userMessage: '切换布局路数失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n jumpPlayByDateTime: (datetime: string | Date | number, index?: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('跳转中…');\n try {\n adapter.jumpPlayByDateTime(datetime, index);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime failed',\n userMessage: '录像跳转播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playSpeed: (speed: number, index: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.playSpeed(speed, index);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed failed',\n userMessage: '设置倍速失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n setFullScreen: () => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setFullScreen();\n return;\n } catch {}\n const el: any = wrapper as any;\n const req = el?.requestFullscreen;\n if (typeof req !== 'function') {\n const err = new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'fullscreen is not supported',\n userMessage: '当前环境不支持全屏',\n });\n safeOnError(err);\n throw err;\n }\n void req.call(el);\n },\n setExitFullScreen: () => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setExitFullScreen();\n return;\n } catch {}\n const doc: any = document as any;\n const exit = doc?.exitFullscreen;\n if (typeof exit === 'function') {\n void exit.call(doc);\n return;\n }\n const err = new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'exitFullscreen is not supported',\n userMessage: '当前环境不支持退出全屏',\n });\n safeOnError(err);\n throw err;\n },\n destroy: () => instance.destroy(),\n },\n /**\n * 订阅事件(ready/play/pause/error/destroy)。\n */\n on: (event, handler) => {\n const set = listeners.get(event) ?? new Set();\n set.add(handler as any);\n listeners.set(event, set);\n },\n /**\n * 取消订阅事件。\n */\n off: (event, handler) => {\n const set = listeners.get(event);\n if (!set) return;\n set.delete(handler as any);\n if (set.size === 0) listeners.delete(event);\n },\n };\n\n if (dblClickFullscreen) {\n const onDblClick = () => {\n try {\n const doc: any = document as any;\n if (doc?.fullscreenElement) {\n instance.sdk.setExitFullScreen();\n return;\n }\n instance.sdk.setFullScreen();\n } catch {}\n };\n try {\n wrapper.addEventListener('dblclick', onDblClick);\n } catch {}\n const originDestroy = instance.destroy;\n instance.destroy = () => {\n try {\n wrapper.removeEventListener('dblclick', onDblClick);\n } catch {}\n originDestroy();\n };\n }\n\n return instance;\n }\n}\n"],"mappings":"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","names":["ErrorCode","state","state","_a","_b","_c","err"]}
package/dist/index.js CHANGED
@@ -222,6 +222,7 @@ var PlayerAdapter = class {
222
222
  this.playerManager = null;
223
223
  this.destroyed = false;
224
224
  this.readyResolved = false;
225
+ this.lastStatus = null;
225
226
  this.currentNum = 1;
226
227
  this.currentMaxNum = 1;
227
228
  this.opts = opts;
@@ -328,8 +329,17 @@ var PlayerAdapter = class {
328
329
  return;
329
330
  }
330
331
  case "statusChanged": {
331
- if (data && typeof data === "object" && (data.status === "pause" || data.status === "paused")) {
332
- this.opts.emit("pause");
332
+ const status = data && typeof data === "object" ? data.status : void 0;
333
+ if (typeof status === "string" && status && status !== this.lastStatus) {
334
+ this.lastStatus = status;
335
+ if (status === "pause" || status === "paused") {
336
+ this.opts.emit("pause");
337
+ return;
338
+ }
339
+ if (status === "playing") {
340
+ this.opts.emit("play", { mode: this.opts.mode });
341
+ return;
342
+ }
333
343
  }
334
344
  return;
335
345
  }
@@ -648,8 +658,8 @@ var PlayerAdapter = class {
648
658
  this.playerManager.pause(0);
649
659
  } else if (typeof this.playerManager.close === "function") {
650
660
  this.playerManager.close(0);
661
+ this.opts.emit("pause");
651
662
  }
652
- this.opts.emit("pause");
653
663
  } catch {
654
664
  }
655
665
  }
@@ -662,8 +672,8 @@ var PlayerAdapter = class {
662
672
  this.playerManager.pause(idx);
663
673
  } else if (typeof this.playerManager.close === "function") {
664
674
  this.playerManager.close(idx);
675
+ this.opts.emit("pause");
665
676
  }
666
- this.opts.emit("pause");
667
677
  } catch {
668
678
  }
669
679
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/sdk/SdkLoader.ts","../src/sdk/TokenVault.ts","../src/sdk/SelfTargetOriginShim.ts","../src/sdk/PlayerAdapter.ts","../src/DahuaPlayer.ts"],"sourcesContent":["export enum ErrorCode {\n CONTAINER_NOT_FOUND = 'CONTAINER_NOT_FOUND',\n INVALID_TOKEN = 'INVALID_TOKEN',\n SDK_LOAD_FAILED = 'SDK_LOAD_FAILED',\n SDK_LOAD_TIMEOUT = 'SDK_LOAD_TIMEOUT',\n SDK_INIT_FAILED = 'SDK_INIT_FAILED',\n PLAY_FAILED = 'PLAY_FAILED',\n NETWORK_DISCONNECTED = 'NETWORK_DISCONNECTED',\n DESTROYED = 'DESTROYED',\n}\n\nexport class DahuaPlayerError extends Error {\n code: ErrorCode;\n userMessage: string;\n cause?: unknown;\n\n constructor(params: { code: ErrorCode; message: string; userMessage: string; cause?: unknown }) {\n super(params.message);\n this.name = 'DahuaPlayerError';\n this.code = params.code;\n this.userMessage = params.userMessage;\n this.cause = params.cause;\n }\n}\n\nexport function toDahuaError(e: unknown, fallback: { code: ErrorCode; message: string; userMessage: string }) {\n if (e instanceof DahuaPlayerError) return e;\n const cause = e;\n return new DahuaPlayerError({ ...fallback, cause });\n}\n","type LoadScriptType = 'module' | 'text/javascript';\n\ntype SdkLoaderState = {\n scripts: Map<string, Promise<void>>;\n styles: Map<string, Promise<void>>;\n};\n\nconst state: SdkLoaderState = {\n scripts: new Map(),\n styles: new Map(),\n};\n\nfunction loadStyleOnce(href: string): Promise<void> {\n const url = href.trim();\n if (!url) return Promise.resolve();\n const existing = state.styles.get(url);\n if (existing) return existing;\n\n const p = new Promise<void>((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n link.onload = () => resolve();\n link.onerror = (e) => reject(e);\n document.head.appendChild(link);\n });\n\n state.styles.set(url, p);\n return p;\n}\n\nfunction loadScriptOnce(src: string, type: LoadScriptType): Promise<void> {\n const url = src.trim();\n if (!url) return Promise.resolve();\n const existing = state.scripts.get(url);\n if (existing) return existing;\n\n const p = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.type = type;\n script.src = url;\n script.onload = () => resolve();\n script.onerror = (e) => reject(e);\n document.head.appendChild(script);\n });\n\n state.scripts.set(url, p);\n return p;\n}\n\nfunction waitFor<T>(fn: () => T | null | undefined, timeoutMs: number): Promise<T> {\n const start = Date.now();\n return new Promise<T>((resolve, reject) => {\n const tick = () => {\n try {\n const v = fn();\n if (v) return resolve(v);\n } catch {}\n if (Date.now() - start >= timeoutMs) return reject(new Error('timeout'));\n setTimeout(tick, 50);\n };\n tick();\n });\n}\n\nexport async function ensureDahuaSdkLoaded(opts: { sdkUrl: string; cssUrl?: string; timeoutMs?: number }) {\n const sdkUrl = opts.sdkUrl;\n const cssUrl = opts.cssUrl;\n const timeoutMs = opts.timeoutMs ?? 20_000;\n\n if (cssUrl) {\n try {\n await loadStyleOnce(cssUrl);\n } catch {}\n }\n\n await loadScriptOnce(sdkUrl, 'module').catch(async () => {\n await loadScriptOnce(sdkUrl, 'text/javascript');\n });\n\n const PlayerManager = await waitFor(\n () => (window as any).PlayerManager as unknown,\n timeoutMs,\n );\n\n if (typeof PlayerManager !== 'function') {\n throw new Error('PlayerManager not available after SDK load');\n }\n}\n\n","type TokenShimState = {\n refCount: number;\n token: string | null;\n};\n\nconst state: TokenShimState = {\n refCount: 0,\n token: null,\n};\n\n/**\n * 将 token 同步到 sessionStorage。\n *\n * 背景:wsplayer 内部会从 `sessionStorage[tokenStorageKey] || localStorage[tokenStorageKey]`\n * 读取 token,并将其写入请求头 `X-Subject-Token`。因此这里需要保证 sessionStorage 中存在 psi_token。\n *\n * 注意:写入 sessionStorage 意味着 token 会在当前 tab 生命周期内可被同域脚本读取,\n * 请确保页面环境可信并注意 XSS 风险。\n */\nfunction syncToSessionStorage() {\n try {\n const ss = window.sessionStorage;\n if (!ss) return;\n if (state.token) {\n ss.setItem('psi_token', state.token);\n } else {\n ss.removeItem('psi_token');\n }\n } catch {}\n}\n\n/**\n * 设置当前 token。\n *\n * - 存入内存\n * - 若 shim 已启用,则立即同步到 sessionStorage.psi_token\n */\nexport function setToken(token: string | null) {\n state.token = token;\n if (state.refCount > 0) syncToSessionStorage();\n}\n\n/**\n * 获取当前内存 token。\n */\n/**\n * 启用 token 同步。\n *\n * - 使用 refCount 支持多个实例共存\n * - 只在第一次 acquire 时写入 sessionStorage\n */\nexport function acquireTokenShim() {\n state.refCount++;\n if (state.refCount !== 1) return;\n syncToSessionStorage();\n}\n\n/**\n * 释放 token 同步。\n *\n * - refCount 归零时清理 sessionStorage.psi_token\n */\nexport function releaseTokenShim() {\n if (state.refCount <= 0) return;\n state.refCount--;\n if (state.refCount !== 0) return;\n try {\n window.sessionStorage?.removeItem('psi_token');\n } catch {}\n}\n","type SelfTargetOriginShimState = {\n refCount: number;\n origin: string | null;\n originalXhrOpen: XMLHttpRequest['open'] | null;\n originalXhrSend: XMLHttpRequest['send'] | null;\n originalXhrSetRequestHeader: XMLHttpRequest['setRequestHeader'] | null;\n};\n\nconst state: SelfTargetOriginShimState = {\n refCount: 0,\n origin: null,\n originalXhrOpen: null,\n originalXhrSend: null,\n originalXhrSetRequestHeader: null,\n};\n\nfunction shouldAttachOrigin(url: unknown) {\n if (typeof url !== 'string') return false;\n return url.includes('/videoService/') || url.includes('videoService/');\n}\n\nfunction normalizeHeaderName(name: unknown) {\n return typeof name === 'string' ? name.trim().toLowerCase() : '';\n}\n\nexport function setSelfTargetOrigin(origin: string | null) {\n state.origin = typeof origin === 'string' ? origin.trim() || null : null;\n}\n\nexport function acquireSelfTargetOriginShim() {\n state.refCount++;\n if (state.refCount !== 1) return;\n\n try {\n const proto = XMLHttpRequest.prototype as any;\n if (typeof proto.open !== 'function' || typeof proto.send !== 'function' || typeof proto.setRequestHeader !== 'function') {\n return;\n }\n\n state.originalXhrOpen = proto.open;\n state.originalXhrSend = proto.send;\n state.originalXhrSetRequestHeader = proto.setRequestHeader;\n\n proto.open = function (...args: any[]) {\n try {\n (this as any).__dahua_request_url = args[1];\n (this as any).__dahua_has_self_target_origin = false;\n } catch {}\n return state.originalXhrOpen!.apply(this, args as any);\n };\n\n proto.setRequestHeader = function (name: string, value: string) {\n try {\n if (normalizeHeaderName(name) === 'self-targetorigin') {\n (this as any).__dahua_has_self_target_origin = true;\n }\n } catch {}\n return state.originalXhrSetRequestHeader!.call(this, name, value);\n };\n\n proto.send = function (...args: any[]) {\n try {\n const origin =\n state.origin ||\n window.sessionStorage?.getItem('wsplayer_origin') ||\n window.localStorage?.getItem('wsplayer_origin') ||\n null;\n const url = (this as any).__dahua_request_url;\n const alreadySet = Boolean((this as any).__dahua_has_self_target_origin);\n\n if (!alreadySet && origin && shouldAttachOrigin(url)) {\n state.originalXhrSetRequestHeader!.call(this, 'Self-TargetOrigin', origin);\n }\n } catch {}\n return state.originalXhrSend!.apply(this, args as any);\n };\n } catch {}\n}\n\nexport function releaseSelfTargetOriginShim() {\n if (state.refCount <= 0) return;\n state.refCount--;\n if (state.refCount !== 0) return;\n\n try {\n const proto = XMLHttpRequest.prototype as any;\n if (state.originalXhrOpen) proto.open = state.originalXhrOpen;\n if (state.originalXhrSend) proto.send = state.originalXhrSend;\n if (state.originalXhrSetRequestHeader) proto.setRequestHeader = state.originalXhrSetRequestHeader;\n } catch {}\n\n state.origin = null;\n state.originalXhrOpen = null;\n state.originalXhrSend = null;\n state.originalXhrSetRequestHeader = null;\n}\n","import { ErrorCode, DahuaPlayerError } from '../errors';\nimport type { DahuaPlayerMode, DahuaPlayerPlayerOptions } from '../types';\n\ntype ReceiveFn = (type: string, data: any) => void;\n\ntype PlayerAdapterOptions = {\n containerId: string;\n staticPath: string;\n mode: DahuaPlayerMode;\n cameraId?: string;\n cameraIds?: string[];\n streamType: 1 | 2 | 3;\n searchOnline: boolean;\n useNginxProxy?: boolean;\n nginxProxyHost?: string;\n useWSS?: boolean;\n num?: number;\n maxNum?: number;\n showRecordProgressBar?: boolean;\n playerOptions?: DahuaPlayerPlayerOptions;\n debug?: boolean;\n onMessage?: ReceiveFn;\n emit: (event: 'ready' | 'play' | 'pause' | 'error', payload?: any) => void;\n};\n\nexport class PlayerAdapter {\n private opts: PlayerAdapterOptions;\n private playerManager: any | null = null;\n private destroyed = false;\n private readyResolved = false;\n private currentNum = 1;\n private currentMaxNum = 1;\n\n constructor(opts: PlayerAdapterOptions) {\n this.opts = opts;\n }\n\n getRaw() {\n return this.playerManager;\n }\n\n init() {\n if (this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const PM = (window as any).PlayerManager;\n if (typeof PM !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'PlayerManager is not available',\n userMessage: '播放器内核未加载',\n });\n }\n\n const userReceive = this.opts.onMessage;\n const showRecordProgressBar =\n typeof this.opts.showRecordProgressBar === 'boolean'\n ? this.opts.showRecordProgressBar\n : this.opts.mode === 'record';\n const initialNum = this.normalizePositiveInt(\n this.opts.num ?? (this.opts.playerOptions as any)?.num ?? 1,\n 1,\n );\n const initialMaxNum = this.normalizePositiveInt(\n this.opts.maxNum ?? (this.opts.playerOptions as any)?.maxNum ?? initialNum,\n initialNum,\n );\n const defaultOptions: Record<string, unknown> = {\n type: this.opts.mode,\n num: initialNum,\n maxNum: initialMaxNum,\n showControl: false,\n showIcons: { hidden: true },\n showRecordProgressBar,\n useNginxProxy: this.opts.useNginxProxy ?? false,\n nginxProxyHost: this.opts.nginxProxyHost ?? '',\n useWSS: this.opts.useWSS ?? false,\n };\n const merged = {\n ...defaultOptions,\n ...(this.opts.playerOptions ?? {}),\n el: this.opts.containerId,\n STATIC_PATH: this.opts.staticPath,\n receiveMessageFromWSPlayer: (type: string, data: any) => {\n if (this.destroyed) return;\n\n try {\n userReceive?.(type, data);\n } catch {}\n\n this.handleSdkMessage(type, data);\n },\n };\n this.playerManager = new PM(merged);\n this.currentNum = this.normalizePositiveInt((merged as any).num, 1);\n this.currentMaxNum = this.normalizePositiveInt((merged as any).maxNum, this.currentNum);\n }\n\n private log(...args: any[]) {\n if (!this.opts.debug) return;\n try {\n console.log('[dahua-player]', ...args);\n } catch {}\n }\n\n private summarizeSdkMessage(type: string, data: any) {\n if (type === 'statusChanged') {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n return { status };\n }\n if (type === 'realError' || type === 'recordError') {\n const reason = data && typeof data === 'object' ? (data as any).reason : undefined;\n return { reason };\n }\n if (type === 'errorInfo') {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n const code = data && typeof data === 'object' ? (data as any).code : undefined;\n return { status, code };\n }\n return undefined;\n }\n\n private handleSdkMessage(type: string, data: any) {\n this.log('sdk', type, this.summarizeSdkMessage(type, data));\n switch (type) {\n case 'initializationCompleted': {\n if (!this.readyResolved) {\n this.readyResolved = true;\n this.opts.emit('ready');\n }\n return;\n }\n case 'realSuccess': {\n this.opts.emit('play', { mode: 'real' });\n return;\n }\n case 'recordSuccess': {\n this.opts.emit('play', { mode: 'record' });\n return;\n }\n case 'statusChanged': {\n if (data && typeof data === 'object' && (data.status === 'pause' || data.status === 'paused')) {\n this.opts.emit('pause');\n }\n return;\n }\n case 'windowNumChanged': {\n const n =\n typeof data === 'number'\n ? data\n : data && typeof data === 'object'\n ? ((data as any).num ?? (data as any).number ?? (data as any).windowNum)\n : undefined;\n const v = this.normalizePositiveInt(n, this.currentNum);\n this.currentNum = v;\n return;\n }\n case 'realError': {\n this.opts.emit(\n 'error',\n new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'Real play failed',\n userMessage: '实时预览失败',\n cause: data,\n }),\n );\n return;\n }\n case 'recordError': {\n this.opts.emit(\n 'error',\n new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'Record play failed',\n userMessage: '录像回放失败',\n cause: data,\n }),\n );\n return;\n }\n default:\n return;\n }\n }\n\n private normalizeChannelList(opt: any) {\n const fromOpt = opt && typeof opt === 'object' ? (opt as any).channelList : undefined;\n if (Array.isArray(fromOpt) && fromOpt.length > 0) return this.limitByCurrentNum(fromOpt);\n\n const idsFromOpt = this.normalizeCameraIds(\n opt && typeof opt === 'object' ? ((opt as any).cameraIds ?? (opt as any).cameraId) : undefined,\n );\n if (idsFromOpt.length > 0) return this.limitByCurrentNum(idsFromOpt.map((id) => ({ channelCode: id })));\n\n const initIds = this.normalizeCameraIds(this.opts.cameraIds);\n if (initIds.length > 0) return this.limitByCurrentNum(initIds.map((id) => ({ channelCode: id })));\n if (this.opts.cameraId) return [{ channelCode: this.opts.cameraId }];\n return null;\n }\n\n private normalizeCameraIds(input: unknown): string[] {\n const list: string[] = [];\n if (typeof input === 'string') {\n const v = input.trim();\n if (v) list.push(v);\n } else if (Array.isArray(input)) {\n for (const it of input) {\n if (typeof it !== 'string') continue;\n const v = it.trim();\n if (v) list.push(v);\n }\n }\n const uniq = Array.from(new Set(list));\n return uniq;\n }\n\n private limitByCurrentNum<T>(list: T[]): T[] {\n const cap = this.normalizePositiveInt(this.currentNum, 1);\n if (list.length <= cap) return list;\n const sliced = list.slice(0, cap);\n this.log('channelList truncated by layout', { cap, original: list.length });\n return sliced;\n }\n\n private normalizePositiveInt(input: unknown, fallback: number) {\n const n = typeof input === 'number' ? input : typeof input === 'string' ? Number(input) : NaN;\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.floor(n);\n }\n\n playRealVideo(opt: any) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const channelList = this.normalizeChannelList(opt);\n if (!channelList) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'channelList is required for real play',\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\n });\n }\n if (typeof this.playerManager.playRealVideo !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playRealVideo is not available',\n userMessage: '当前内核不支持实时预览播放',\n });\n }\n this.log('playRealVideo');\n this.playerManager.playRealVideo({ ...(opt ?? {}), channelList });\n }\n\n playRecordVideo(opt: any) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const channelList = this.normalizeChannelList(opt);\n if (!channelList) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'channelList is required for record play',\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\n });\n }\n if (typeof this.playerManager.playRecordVideo !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playRecordVideo is not available',\n userMessage: '当前内核不支持录像回放播放',\n });\n }\n this.log('playRecordVideo');\n this.playerManager.playRecordVideo({ ...(opt ?? {}), channelList });\n }\n\n setPlayerNum(num: number) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const v = this.normalizePositiveInt(num, this.currentNum);\n const fn = this.playerManager?.setPlayerNum;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setPlayerNum is not available',\n userMessage: '当前内核不支持切换布局路数',\n });\n }\n this.log('setPlayerNum', v);\n fn.call(this.playerManager, v);\n this.currentNum = v;\n }\n\n jumpPlayByDateTime(datetime: string | Date | number, index?: number) {\n if (this.opts.mode !== 'record') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime only supports record mode',\n userMessage: '实时预览不支持跳转播放',\n });\n }\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const dt = this.formatDateTime(datetime);\n const fn = this.pickMethod(['jumpPlayByDateTime', 'jumpPlayByDatetime']);\n if (!fn) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime is not available',\n userMessage: '当前内核不支持录像跳转播放',\n });\n }\n const idx = typeof index === 'number' ? Math.floor(index) : undefined;\n this.log('jumpPlayByDateTime', { dt, index: idx });\n fn(dt, idx);\n }\n\n playSpeed(speed: number, index: number) {\n if (this.opts.mode !== 'record') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed only supports record mode',\n userMessage: '实时预览不支持倍速播放',\n });\n }\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const allowed = new Set([0.125, 0.25, 0.5, 1, 1.25, 1.5, 2, 4, 8]);\n if (!allowed.has(speed)) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'invalid speed',\n userMessage: '倍速参数不合法',\n cause: { speed },\n });\n }\n const idx = this.normalizePositiveInt(index, 0);\n const fn = this.playerManager?.playSpeed;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed is not available',\n userMessage: '当前内核不支持倍速播放',\n });\n }\n this.log('playSpeed', { speed, index: idx });\n fn.call(this.playerManager, speed, idx);\n }\n\n setFullScreen() {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const fn = this.playerManager?.setFullScreen;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setFullScreen is not available',\n userMessage: '当前内核不支持全屏',\n });\n }\n this.log('setFullScreen');\n fn.call(this.playerManager);\n }\n\n setExitFullScreen() {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const fn = this.playerManager?.setExitFullScreen;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setExitFullScreen is not available',\n userMessage: '当前内核不支持退出全屏',\n });\n }\n this.log('setExitFullScreen');\n fn.call(this.playerManager);\n }\n\n callRaw(method: string, ...args: any[]) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const name = typeof method === 'string' ? method.trim() : '';\n if (!name) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'method is required',\n userMessage: '缺少 method 参数',\n });\n }\n const fn = (this.playerManager as any)[name];\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: `method not found: ${name}`,\n userMessage: `底层方法不存在:${name}`,\n });\n }\n this.log('callRaw', name);\n return fn.apply(this.playerManager, args);\n }\n\n private pickMethod(names: string[]) {\n for (const n of names) {\n const fn = (this.playerManager as any)?.[n];\n if (typeof fn === 'function') return fn.bind(this.playerManager);\n }\n return null;\n }\n\n private formatDateTime(input: string | Date | number) {\n if (typeof input === 'string') return input.trim();\n const d =\n typeof input === 'number'\n ? new Date(input > 1_000_000_000_000 ? input : input * 1000)\n : input instanceof Date\n ? input\n : new Date(NaN);\n if (!Number.isFinite(d.getTime())) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'invalid datetime',\n userMessage: '跳转时间格式不合法',\n });\n }\n const pad2 = (n: number) => String(n).padStart(2, '0');\n const y = d.getFullYear();\n const m = pad2(d.getMonth() + 1);\n const day = pad2(d.getDate());\n const hh = pad2(d.getHours());\n const mm = pad2(d.getMinutes());\n const ss = pad2(d.getSeconds());\n return `${y}-${m}-${day} ${hh}:${mm}:${ss}`;\n }\n\n pause() {\n if (!this.playerManager || this.destroyed) return;\n try {\n this.log('pause');\n if (typeof this.playerManager.pause === 'function') {\n this.playerManager.pause(0);\n } else if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(0);\n }\n this.opts.emit('pause');\n } catch {}\n }\n\n pauseWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('pauseWindow', idx);\n if (typeof this.playerManager.pause === 'function') {\n this.playerManager.pause(idx);\n } else if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(idx);\n }\n this.opts.emit('pause');\n } catch {}\n }\n\n playWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('playWindow', idx);\n if (typeof this.playerManager.play === 'function') {\n this.playerManager.play(idx);\n }\n } catch {}\n }\n\n closeWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('closeWindow', idx);\n if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(idx);\n }\n } catch {}\n }\n\n destroy() {\n if (this.destroyed) return;\n this.destroyed = true;\n this.log('destroy');\n\n if (this.playerManager) {\n try {\n this.playerManager.destroy();\n } catch {}\n this.playerManager = null;\n }\n }\n}\n","import { ErrorCode, DahuaPlayerError, toDahuaError } from './errors';\nimport type {\n DahuaPlayerEventName,\n DahuaPlayerAuth,\n DahuaPlayerInitOptions,\n DahuaPlayerInstance,\n DahuaPlayerMode,\n} from './types';\nimport { ensureDahuaSdkLoaded } from './sdk/SdkLoader';\nimport { acquireTokenShim, releaseTokenShim, setToken } from './sdk/TokenVault';\nimport { acquireSelfTargetOriginShim, releaseSelfTargetOriginShim, setSelfTargetOrigin } from './sdk/SelfTargetOriginShim';\nimport { PlayerAdapter } from './sdk/PlayerAdapter';\n\ntype ListenerMap = Map<DahuaPlayerEventName, Set<(payload: any) => void>>;\n\n/**\n * 规范化大华静态资源根路径。\n *\n * - 允许传入 \"/wsplayer-gov\" 或 \"wsplayer-gov\"\n * - 会去掉末尾多余的 \"/\"\n */\nfunction normalizeStaticPath(path: string) {\n const raw = (path || '').trim();\n if (!raw) return '/wsplayer-gov';\n const v = raw.replace(/\\/+$/, '');\n return v.startsWith('/') ? v : `/${v}`;\n}\n\nfunction buildTargetOriginFromAuth(auth: DahuaPlayerAuth | undefined) {\n if (!auth) return '';\n const ip = typeof auth.ip === 'string' ? auth.ip.trim() : '';\n const port = typeof auth.port === 'number' ? auth.port : typeof auth.port === 'string' ? Number(auth.port) : NaN;\n if (!ip || !Number.isFinite(port) || port <= 0) return '';\n const protocol = auth.protocol === 'http' ? 'http' : 'https';\n return `${protocol}://${ip}:${port}`;\n}\n\n/**\n * 解析播放器挂载容器。\n *\n * - string:按 id 查找元素\n * - HTMLElement:直接使用\n */\nfunction resolveContainer(container: HTMLElement | string): HTMLElement {\n if (typeof container === 'string') {\n const el = document.getElementById(container);\n if (!el) {\n throw new DahuaPlayerError({\n code: ErrorCode.CONTAINER_NOT_FOUND,\n message: `container not found: ${container}`,\n userMessage: '未找到播放器挂载节点',\n });\n }\n return el;\n }\n if (container && typeof container === 'object') return container;\n throw new DahuaPlayerError({\n code: ErrorCode.CONTAINER_NOT_FOUND,\n message: 'container is invalid',\n userMessage: '播放器挂载节点无效',\n });\n}\n\nfunction createListeners(): ListenerMap {\n return new Map();\n}\n\nfunction emit(listeners: ListenerMap, event: DahuaPlayerEventName, payload?: any) {\n const set = listeners.get(event);\n if (!set || set.size === 0) return;\n for (const cb of set) {\n try {\n cb(payload);\n } catch {}\n }\n}\n\n/**\n * 大华播放器核心入口。\n *\n * 设计目标:\n *\n * - 对外只暴露一个初始化方法:`DahuaPlayer.init(options)`\n * - 自动加载大华 SDK 脚本与 CSS(默认从 `/wsplayer-gov` 下加载)\n * - 不在浏览器持久化保存 token(通过 sessionStorage shim 仅在内存注入)\n * - 统一事件与错误码:ready/play/pause/error/destroy + ErrorCode\n *\n * 注意:\n *\n * - 本类不负责登录鉴权;需要外部提供已获取到的 `token`\n */\nexport class DahuaPlayer {\n /**\n * 初始化播放器并返回实例。\n *\n * 生命周期:\n *\n * - 立即创建 DOM 结构并开始异步加载 SDK\n * - `instance.ready` 会在 SDK 触发 `initializationCompleted` 后 resolve\n * - `destroy()` 会销毁 SDK 实例、移除 DOM,并释放 token shim\n *\n * @throws DahuaPlayerError 当 container/token 不合法时抛出\n */\n static init(options: DahuaPlayerInitOptions): DahuaPlayerInstance {\n const opts = options || ({} as any);\n const container = resolveContainer(opts.container);\n\n const mode: DahuaPlayerMode = opts.mode ?? 'real';\n\n const token = typeof opts.auth?.token === 'string' ? opts.auth.token.trim() : '';\n if (!token) {\n throw new DahuaPlayerError({\n code: ErrorCode.INVALID_TOKEN,\n message: 'token is required',\n userMessage: '缺少 token,请先完成鉴权登录',\n });\n }\n\n const cameraId = typeof opts.cameraId === 'string' ? opts.cameraId.trim() : '';\n const cameraIds = Array.isArray(opts.cameraIds) ? opts.cameraIds.map((v) => v.trim()).filter(Boolean) : [];\n const targetOrigin = buildTargetOriginFromAuth(opts.auth);\n\n const id = `dahua-player-${Math.random().toString(36).slice(2, 10)}`;\n const wrapper = document.createElement('div');\n wrapper.id = id;\n wrapper.style.position = 'relative';\n wrapper.style.width = opts.width === 'auto' || opts.width == null ? '100%' : `${opts.width}px`;\n wrapper.style.height = opts.height === 'auto' || opts.height == null ? '100%' : `${opts.height}px`;\n container.appendChild(wrapper);\n\n const innerId = `${id}-inner`;\n const inner = document.createElement('div');\n inner.id = innerId;\n inner.style.width = '100%';\n inner.style.height = '100%';\n wrapper.appendChild(inner);\n\n const loading = document.createElement('div');\n loading.style.position = 'absolute';\n loading.style.left = '0';\n loading.style.top = '0';\n loading.style.right = '0';\n loading.style.bottom = '0';\n loading.style.display = 'flex';\n loading.style.alignItems = 'center';\n loading.style.justifyContent = 'center';\n loading.style.background = 'rgba(0,0,0,0.35)';\n loading.style.color = '#fff';\n loading.style.fontSize = '12px';\n loading.style.pointerEvents = 'none';\n loading.style.zIndex = '10';\n loading.style.visibility = 'hidden';\n\n const loadingText = document.createElement('div');\n loadingText.textContent = '';\n loading.appendChild(loadingText);\n wrapper.appendChild(loading);\n\n const setLoading = (visible: boolean, text?: string) => {\n loadingText.textContent = text || '';\n loading.style.visibility = visible ? 'visible' : 'hidden';\n };\n\n let transientOverlayTimer: any = null;\n let stickyOverlayVisible = false;\n\n /**\n * 开始一个“加载中”覆盖层展示,并清理可能存在的错误提示计时器。\n */\n const showLoading = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = false;\n setLoading(true, text);\n };\n\n /**\n * 以短暂覆盖层的方式提示错误,给用户一个可见反馈。\n */\n const showTransientError = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = false;\n setLoading(true, text);\n transientOverlayTimer = setTimeout(() => {\n transientOverlayTimer = null;\n setLoading(false);\n }, 3000);\n };\n\n /**\n * 以常驻覆盖层的方式提示错误,直到下一次显式加载/销毁。\n */\n const showStickyError = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = true;\n setLoading(true, text);\n };\n\n /**\n * 将 error payload 格式化为可读文案;尽量带上状态码等关键信息。\n */\n const formatUserMessage = (payload: unknown, fallback: string) => {\n if (payload instanceof DahuaPlayerError) {\n const base = payload.userMessage || fallback;\n const cause: any = (payload as any).cause;\n const status = cause && typeof cause === 'object' ? (cause.status ?? cause.code) : undefined;\n if (typeof status === 'number' || typeof status === 'string') {\n return `${base}(${status})`;\n }\n return base;\n }\n return typeof payload === 'string' ? payload : fallback;\n };\n\n const listeners = createListeners();\n const staticPath = normalizeStaticPath(opts.staticPath ?? '/wsplayer-gov');\n const sdkUrl = (opts.sdkUrl || `${staticPath}/wsplayer.min.js`).trim();\n const cssUrl = `${staticPath}/WSPlayer/player.css`;\n\n const autoPlay = opts.autoPlay === true;\n const streamType = (opts.streamType ?? 2) as 1 | 2 | 3;\n const searchOnline = Boolean(opts.searchOnline);\n const num = Number.isFinite(opts.num as any) ? Math.floor(Number(opts.num)) : undefined;\n const maxNum = Number.isFinite(opts.maxNum as any) ? Math.floor(Number(opts.maxNum)) : undefined;\n const showRecordProgressBar =\n typeof opts.showRecordProgressBar === 'boolean' ? opts.showRecordProgressBar : undefined;\n const dblClickFullscreen = opts.dblClickFullscreen !== false;\n\n let destroyed = false;\n let adapter: PlayerAdapter | null = null;\n let readyResolve: () => void = () => {};\n let readyReject: (e: unknown) => void = () => {};\n\n const safeOnError = (e: unknown) => {\n try {\n opts.onError?.(e);\n } catch {}\n emit(listeners, 'error', e);\n };\n\n /**\n * autoPlay:根据 init 参数在 ready 后触发一次自动播放。\n *\n * 触发条件:\n * - 实时预览(mode=real):需要 cameraId + autoPlay=true\n * - 录像回放(mode=record):需要 recordStartTime/recordEndTime(Unix 秒)+ autoPlay=true\n */\n const tryAutoPlay = () => {\n if (!autoPlay) return;\n if (mode === 'real') {\n if (!cameraId && cameraIds.length === 0) return;\n try {\n showLoading('加载视频中…');\n adapter?.playRealVideo({});\n } catch (e) {\n safeOnError(e);\n }\n return;\n }\n if (mode === 'record') {\n if (!Number.isFinite(opts.recordStartTime as any)) return;\n if (!Number.isFinite(opts.recordEndTime as any)) return;\n if (!cameraId && cameraIds.length === 0) return;\n const startTime = Math.floor(Number(opts.recordStartTime));\n const endTime = Math.floor(Number(opts.recordEndTime));\n const recordSource = Number.isFinite(opts.recordSource as any)\n ? Math.floor(Number(opts.recordSource))\n : undefined;\n try {\n showLoading('加载录像中…');\n adapter?.playRecordVideo(recordSource == null ? { startTime, endTime } : { startTime, endTime, recordSource });\n } catch (e) {\n safeOnError(e);\n }\n }\n };\n\n /**\n * ready:仅代表播放器“初始化完成”,不等价于“已成功播放”。\n * 播放成功/失败通过 play/error 事件体现。\n */\n const ready = new Promise<void>((resolve, reject) => {\n readyResolve = resolve;\n readyReject = reject;\n });\n\n /**\n * 初始化兜底超时:避免 SDK 资源或初始化流程异常导致 ready 永远 pending。\n */\n const readyTimer = setTimeout(() => {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_LOAD_TIMEOUT,\n message: 'SDK ready timeout',\n userMessage: '播放器初始化超时',\n });\n showStickyError(`初始化失败:${err.userMessage}`);\n safeOnError(err);\n readyReject(err);\n }, 20_000);\n\n showLoading('初始化中…');\n\n void (async () => {\n try {\n /**\n * 大华 SDK 内部会从 sessionStorage 读取 psi_token。\n * 这里通过 shim 仅在内存提供 token,避免 token 落盘。\n */\n setToken(token);\n acquireTokenShim();\n if (targetOrigin) {\n try {\n window.sessionStorage?.setItem('wsplayer_origin', targetOrigin);\n } catch {}\n }\n setSelfTargetOrigin(targetOrigin || null);\n acquireSelfTargetOriginShim();\n\n await ensureDahuaSdkLoaded({ sdkUrl, cssUrl, timeoutMs: 20_000 });\n\n adapter = new PlayerAdapter({\n containerId: innerId,\n staticPath,\n mode,\n cameraId,\n cameraIds,\n streamType,\n searchOnline,\n useNginxProxy: opts.useNginxProxy,\n nginxProxyHost: opts.nginxProxyHost,\n useWSS: opts.useWSS,\n num,\n maxNum,\n showRecordProgressBar,\n playerOptions: opts.playerOptions,\n debug: opts.debug,\n onMessage: (type, data) => {\n try {\n opts.onSdkMessage?.(type, data);\n } catch {}\n },\n emit: (event, payload) => {\n if (event === 'ready') {\n clearTimeout(readyTimer);\n readyResolve();\n setLoading(false);\n stickyOverlayVisible = false;\n try {\n opts.onReady?.();\n } catch {}\n emit(listeners, 'ready');\n tryAutoPlay();\n return;\n }\n if (event === 'play') {\n setLoading(false);\n try {\n opts.onPlay?.(payload);\n } catch {}\n emit(listeners, 'play', payload);\n return;\n }\n if (event === 'pause') {\n setLoading(false);\n try {\n opts.onPause?.();\n } catch {}\n emit(listeners, 'pause');\n return;\n }\n if (event === 'error') {\n const msg = formatUserMessage(payload, '播放失败');\n if (payload instanceof DahuaPlayerError) {\n const initCodes = new Set<ErrorCode>([\n ErrorCode.SDK_INIT_FAILED,\n ErrorCode.SDK_LOAD_FAILED,\n ErrorCode.SDK_LOAD_TIMEOUT,\n ]);\n if (initCodes.has(payload.code)) {\n showStickyError(`初始化失败:${msg}`);\n safeOnError(payload);\n return;\n }\n }\n if (stickyOverlayVisible) return;\n showTransientError(msg);\n safeOnError(payload);\n }\n },\n });\n\n adapter.init();\n } catch (e) {\n clearTimeout(readyTimer);\n const err = toDahuaError(e, {\n code: ErrorCode.SDK_LOAD_FAILED,\n message: 'SDK load/init failed',\n userMessage: '播放器初始化失败',\n });\n showStickyError(`初始化失败:${err.userMessage}`);\n safeOnError(err);\n readyReject(err);\n }\n })();\n\n const instance: DahuaPlayerInstance = {\n id,\n ready,\n /**\n * 暂停播放。\n *\n * 注意:部分 SDK 版本 pause/close 的行为差异由内部适配处理。\n */\n pause: () => {\n if (!adapter) return;\n adapter.pause();\n },\n /**\n * 销毁播放器实例并释放资源。\n *\n * - 移除创建的 DOM 节点\n * - 调用 SDK destroy(若存在)\n * - 释放 token shim,清理内存 token\n * - 触发 destroy 事件\n */\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n clearTimeout(readyTimer);\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n setLoading(false);\n try {\n adapter?.destroy();\n } catch {}\n adapter = null;\n try {\n wrapper.remove();\n } catch {\n try {\n container.innerHTML = '';\n } catch {}\n }\n try {\n releaseTokenShim();\n } catch {}\n try {\n releaseSelfTargetOriginShim();\n } catch {}\n try {\n setToken(null);\n } catch {}\n try {\n opts.onDestroy?.();\n } catch {}\n emit(listeners, 'destroy');\n listeners.clear();\n },\n sdk: {\n getRaw: () => adapter?.getRaw(),\n callRaw: (method: string, ...args: any[]) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n return adapter.callRaw(method, ...args);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'callRaw failed',\n userMessage: '调用底层方法失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playRealVideo: (opt: any) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('加载视频中…');\n try {\n adapter.playRealVideo(opt);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playRealVideo failed',\n userMessage: '实时预览播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playRecordVideo: (opt: any) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('加载录像中…');\n try {\n adapter.playRecordVideo(opt);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playRecordVideo failed',\n userMessage: '录像回放播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n pause: (windowIndex?: number) => adapter?.pauseWindow(windowIndex),\n play: (windowIndex?: number) => adapter?.playWindow(windowIndex),\n close: (windowIndex?: number) => adapter?.closeWindow(windowIndex),\n setPlayerNum: (n: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setPlayerNum(n);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'setPlayerNum failed',\n userMessage: '切换布局路数失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n jumpPlayByDateTime: (datetime: string | Date | number, index?: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('跳转中…');\n try {\n adapter.jumpPlayByDateTime(datetime, index);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime failed',\n userMessage: '录像跳转播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playSpeed: (speed: number, index: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.playSpeed(speed, index);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed failed',\n userMessage: '设置倍速失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n setFullScreen: () => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setFullScreen();\n return;\n } catch {}\n const el: any = wrapper as any;\n const req = el?.requestFullscreen;\n if (typeof req !== 'function') {\n const err = new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'fullscreen is not supported',\n userMessage: '当前环境不支持全屏',\n });\n safeOnError(err);\n throw err;\n }\n void req.call(el);\n },\n setExitFullScreen: () => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setExitFullScreen();\n return;\n } catch {}\n const doc: any = document as any;\n const exit = doc?.exitFullscreen;\n if (typeof exit === 'function') {\n void exit.call(doc);\n return;\n }\n const err = new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'exitFullscreen is not supported',\n userMessage: '当前环境不支持退出全屏',\n });\n safeOnError(err);\n throw err;\n },\n destroy: () => instance.destroy(),\n },\n /**\n * 订阅事件(ready/play/pause/error/destroy)。\n */\n on: (event, handler) => {\n const set = listeners.get(event) ?? new Set();\n set.add(handler as any);\n listeners.set(event, set);\n },\n /**\n * 取消订阅事件。\n */\n off: (event, handler) => {\n const set = listeners.get(event);\n if (!set) return;\n set.delete(handler as any);\n if (set.size === 0) listeners.delete(event);\n },\n };\n\n if (dblClickFullscreen) {\n const onDblClick = () => {\n try {\n const doc: any = document as any;\n if (doc?.fullscreenElement) {\n instance.sdk.setExitFullScreen();\n return;\n }\n instance.sdk.setFullScreen();\n } catch {}\n };\n try {\n wrapper.addEventListener('dblclick', onDblClick);\n } catch {}\n const originDestroy = instance.destroy;\n instance.destroy = () => {\n try {\n wrapper.removeEventListener('dblclick', onDblClick);\n } catch {}\n originDestroy();\n };\n }\n\n return instance;\n }\n}\n"],"mappings":"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","names":["ErrorCode","state","state","_a","_b","_c","err"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/sdk/SdkLoader.ts","../src/sdk/TokenVault.ts","../src/sdk/SelfTargetOriginShim.ts","../src/sdk/PlayerAdapter.ts","../src/DahuaPlayer.ts"],"sourcesContent":["export enum ErrorCode {\n CONTAINER_NOT_FOUND = 'CONTAINER_NOT_FOUND',\n INVALID_TOKEN = 'INVALID_TOKEN',\n SDK_LOAD_FAILED = 'SDK_LOAD_FAILED',\n SDK_LOAD_TIMEOUT = 'SDK_LOAD_TIMEOUT',\n SDK_INIT_FAILED = 'SDK_INIT_FAILED',\n PLAY_FAILED = 'PLAY_FAILED',\n NETWORK_DISCONNECTED = 'NETWORK_DISCONNECTED',\n DESTROYED = 'DESTROYED',\n}\n\nexport class DahuaPlayerError extends Error {\n code: ErrorCode;\n userMessage: string;\n cause?: unknown;\n\n constructor(params: { code: ErrorCode; message: string; userMessage: string; cause?: unknown }) {\n super(params.message);\n this.name = 'DahuaPlayerError';\n this.code = params.code;\n this.userMessage = params.userMessage;\n this.cause = params.cause;\n }\n}\n\nexport function toDahuaError(e: unknown, fallback: { code: ErrorCode; message: string; userMessage: string }) {\n if (e instanceof DahuaPlayerError) return e;\n const cause = e;\n return new DahuaPlayerError({ ...fallback, cause });\n}\n","type LoadScriptType = 'module' | 'text/javascript';\n\ntype SdkLoaderState = {\n scripts: Map<string, Promise<void>>;\n styles: Map<string, Promise<void>>;\n};\n\nconst state: SdkLoaderState = {\n scripts: new Map(),\n styles: new Map(),\n};\n\nfunction loadStyleOnce(href: string): Promise<void> {\n const url = href.trim();\n if (!url) return Promise.resolve();\n const existing = state.styles.get(url);\n if (existing) return existing;\n\n const p = new Promise<void>((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n link.onload = () => resolve();\n link.onerror = (e) => reject(e);\n document.head.appendChild(link);\n });\n\n state.styles.set(url, p);\n return p;\n}\n\nfunction loadScriptOnce(src: string, type: LoadScriptType): Promise<void> {\n const url = src.trim();\n if (!url) return Promise.resolve();\n const existing = state.scripts.get(url);\n if (existing) return existing;\n\n const p = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.type = type;\n script.src = url;\n script.onload = () => resolve();\n script.onerror = (e) => reject(e);\n document.head.appendChild(script);\n });\n\n state.scripts.set(url, p);\n return p;\n}\n\nfunction waitFor<T>(fn: () => T | null | undefined, timeoutMs: number): Promise<T> {\n const start = Date.now();\n return new Promise<T>((resolve, reject) => {\n const tick = () => {\n try {\n const v = fn();\n if (v) return resolve(v);\n } catch {}\n if (Date.now() - start >= timeoutMs) return reject(new Error('timeout'));\n setTimeout(tick, 50);\n };\n tick();\n });\n}\n\nexport async function ensureDahuaSdkLoaded(opts: { sdkUrl: string; cssUrl?: string; timeoutMs?: number }) {\n const sdkUrl = opts.sdkUrl;\n const cssUrl = opts.cssUrl;\n const timeoutMs = opts.timeoutMs ?? 20_000;\n\n if (cssUrl) {\n try {\n await loadStyleOnce(cssUrl);\n } catch {}\n }\n\n await loadScriptOnce(sdkUrl, 'module').catch(async () => {\n await loadScriptOnce(sdkUrl, 'text/javascript');\n });\n\n const PlayerManager = await waitFor(\n () => (window as any).PlayerManager as unknown,\n timeoutMs,\n );\n\n if (typeof PlayerManager !== 'function') {\n throw new Error('PlayerManager not available after SDK load');\n }\n}\n\n","type TokenShimState = {\n refCount: number;\n token: string | null;\n};\n\nconst state: TokenShimState = {\n refCount: 0,\n token: null,\n};\n\n/**\n * 将 token 同步到 sessionStorage。\n *\n * 背景:wsplayer 内部会从 `sessionStorage[tokenStorageKey] || localStorage[tokenStorageKey]`\n * 读取 token,并将其写入请求头 `X-Subject-Token`。因此这里需要保证 sessionStorage 中存在 psi_token。\n *\n * 注意:写入 sessionStorage 意味着 token 会在当前 tab 生命周期内可被同域脚本读取,\n * 请确保页面环境可信并注意 XSS 风险。\n */\nfunction syncToSessionStorage() {\n try {\n const ss = window.sessionStorage;\n if (!ss) return;\n if (state.token) {\n ss.setItem('psi_token', state.token);\n } else {\n ss.removeItem('psi_token');\n }\n } catch {}\n}\n\n/**\n * 设置当前 token。\n *\n * - 存入内存\n * - 若 shim 已启用,则立即同步到 sessionStorage.psi_token\n */\nexport function setToken(token: string | null) {\n state.token = token;\n if (state.refCount > 0) syncToSessionStorage();\n}\n\n/**\n * 获取当前内存 token。\n */\n/**\n * 启用 token 同步。\n *\n * - 使用 refCount 支持多个实例共存\n * - 只在第一次 acquire 时写入 sessionStorage\n */\nexport function acquireTokenShim() {\n state.refCount++;\n if (state.refCount !== 1) return;\n syncToSessionStorage();\n}\n\n/**\n * 释放 token 同步。\n *\n * - refCount 归零时清理 sessionStorage.psi_token\n */\nexport function releaseTokenShim() {\n if (state.refCount <= 0) return;\n state.refCount--;\n if (state.refCount !== 0) return;\n try {\n window.sessionStorage?.removeItem('psi_token');\n } catch {}\n}\n","type SelfTargetOriginShimState = {\n refCount: number;\n origin: string | null;\n originalXhrOpen: XMLHttpRequest['open'] | null;\n originalXhrSend: XMLHttpRequest['send'] | null;\n originalXhrSetRequestHeader: XMLHttpRequest['setRequestHeader'] | null;\n};\n\nconst state: SelfTargetOriginShimState = {\n refCount: 0,\n origin: null,\n originalXhrOpen: null,\n originalXhrSend: null,\n originalXhrSetRequestHeader: null,\n};\n\nfunction shouldAttachOrigin(url: unknown) {\n if (typeof url !== 'string') return false;\n return url.includes('/videoService/') || url.includes('videoService/');\n}\n\nfunction normalizeHeaderName(name: unknown) {\n return typeof name === 'string' ? name.trim().toLowerCase() : '';\n}\n\nexport function setSelfTargetOrigin(origin: string | null) {\n state.origin = typeof origin === 'string' ? origin.trim() || null : null;\n}\n\nexport function acquireSelfTargetOriginShim() {\n state.refCount++;\n if (state.refCount !== 1) return;\n\n try {\n const proto = XMLHttpRequest.prototype as any;\n if (typeof proto.open !== 'function' || typeof proto.send !== 'function' || typeof proto.setRequestHeader !== 'function') {\n return;\n }\n\n state.originalXhrOpen = proto.open;\n state.originalXhrSend = proto.send;\n state.originalXhrSetRequestHeader = proto.setRequestHeader;\n\n proto.open = function (...args: any[]) {\n try {\n (this as any).__dahua_request_url = args[1];\n (this as any).__dahua_has_self_target_origin = false;\n } catch {}\n return state.originalXhrOpen!.apply(this, args as any);\n };\n\n proto.setRequestHeader = function (name: string, value: string) {\n try {\n if (normalizeHeaderName(name) === 'self-targetorigin') {\n (this as any).__dahua_has_self_target_origin = true;\n }\n } catch {}\n return state.originalXhrSetRequestHeader!.call(this, name, value);\n };\n\n proto.send = function (...args: any[]) {\n try {\n const origin =\n state.origin ||\n window.sessionStorage?.getItem('wsplayer_origin') ||\n window.localStorage?.getItem('wsplayer_origin') ||\n null;\n const url = (this as any).__dahua_request_url;\n const alreadySet = Boolean((this as any).__dahua_has_self_target_origin);\n\n if (!alreadySet && origin && shouldAttachOrigin(url)) {\n state.originalXhrSetRequestHeader!.call(this, 'Self-TargetOrigin', origin);\n }\n } catch {}\n return state.originalXhrSend!.apply(this, args as any);\n };\n } catch {}\n}\n\nexport function releaseSelfTargetOriginShim() {\n if (state.refCount <= 0) return;\n state.refCount--;\n if (state.refCount !== 0) return;\n\n try {\n const proto = XMLHttpRequest.prototype as any;\n if (state.originalXhrOpen) proto.open = state.originalXhrOpen;\n if (state.originalXhrSend) proto.send = state.originalXhrSend;\n if (state.originalXhrSetRequestHeader) proto.setRequestHeader = state.originalXhrSetRequestHeader;\n } catch {}\n\n state.origin = null;\n state.originalXhrOpen = null;\n state.originalXhrSend = null;\n state.originalXhrSetRequestHeader = null;\n}\n","import { ErrorCode, DahuaPlayerError } from '../errors';\nimport type { DahuaPlayerMode, DahuaPlayerPlayerOptions } from '../types';\n\ntype ReceiveFn = (type: string, data: any) => void;\n\ntype PlayerAdapterOptions = {\n containerId: string;\n staticPath: string;\n mode: DahuaPlayerMode;\n cameraId?: string;\n cameraIds?: string[];\n streamType: 1 | 2 | 3;\n searchOnline: boolean;\n useNginxProxy?: boolean;\n nginxProxyHost?: string;\n useWSS?: boolean;\n num?: number;\n maxNum?: number;\n showRecordProgressBar?: boolean;\n playerOptions?: DahuaPlayerPlayerOptions;\n debug?: boolean;\n onMessage?: ReceiveFn;\n emit: (event: 'ready' | 'play' | 'pause' | 'error', payload?: any) => void;\n};\n\nexport class PlayerAdapter {\n private opts: PlayerAdapterOptions;\n private playerManager: any | null = null;\n private destroyed = false;\n private readyResolved = false;\n private lastStatus: string | null = null;\n private currentNum = 1;\n private currentMaxNum = 1;\n\n constructor(opts: PlayerAdapterOptions) {\n this.opts = opts;\n }\n\n getRaw() {\n return this.playerManager;\n }\n\n init() {\n if (this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const PM = (window as any).PlayerManager;\n if (typeof PM !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'PlayerManager is not available',\n userMessage: '播放器内核未加载',\n });\n }\n\n const userReceive = this.opts.onMessage;\n const showRecordProgressBar =\n typeof this.opts.showRecordProgressBar === 'boolean'\n ? this.opts.showRecordProgressBar\n : this.opts.mode === 'record';\n const initialNum = this.normalizePositiveInt(\n this.opts.num ?? (this.opts.playerOptions as any)?.num ?? 1,\n 1,\n );\n const initialMaxNum = this.normalizePositiveInt(\n this.opts.maxNum ?? (this.opts.playerOptions as any)?.maxNum ?? initialNum,\n initialNum,\n );\n const defaultOptions: Record<string, unknown> = {\n type: this.opts.mode,\n num: initialNum,\n maxNum: initialMaxNum,\n showControl: false,\n showIcons: { hidden: true },\n showRecordProgressBar,\n useNginxProxy: this.opts.useNginxProxy ?? false,\n nginxProxyHost: this.opts.nginxProxyHost ?? '',\n useWSS: this.opts.useWSS ?? false,\n };\n const merged = {\n ...defaultOptions,\n ...(this.opts.playerOptions ?? {}),\n el: this.opts.containerId,\n STATIC_PATH: this.opts.staticPath,\n receiveMessageFromWSPlayer: (type: string, data: any) => {\n if (this.destroyed) return;\n\n try {\n userReceive?.(type, data);\n } catch {}\n\n this.handleSdkMessage(type, data);\n },\n };\n this.playerManager = new PM(merged);\n this.currentNum = this.normalizePositiveInt((merged as any).num, 1);\n this.currentMaxNum = this.normalizePositiveInt((merged as any).maxNum, this.currentNum);\n }\n\n private log(...args: any[]) {\n if (!this.opts.debug) return;\n try {\n console.log('[dahua-player]', ...args);\n } catch {}\n }\n\n private summarizeSdkMessage(type: string, data: any) {\n if (type === 'statusChanged') {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n return { status };\n }\n if (type === 'realError' || type === 'recordError') {\n const reason = data && typeof data === 'object' ? (data as any).reason : undefined;\n return { reason };\n }\n if (type === 'errorInfo') {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n const code = data && typeof data === 'object' ? (data as any).code : undefined;\n return { status, code };\n }\n return undefined;\n }\n\n private handleSdkMessage(type: string, data: any) {\n this.log('sdk', type, this.summarizeSdkMessage(type, data));\n switch (type) {\n case 'initializationCompleted': {\n if (!this.readyResolved) {\n this.readyResolved = true;\n this.opts.emit('ready');\n }\n return;\n }\n case 'realSuccess': {\n this.opts.emit('play', { mode: 'real' });\n return;\n }\n case 'recordSuccess': {\n this.opts.emit('play', { mode: 'record' });\n return;\n }\n case 'statusChanged': {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n if (typeof status === 'string' && status && status !== this.lastStatus) {\n this.lastStatus = status;\n if (status === 'pause' || status === 'paused') {\n this.opts.emit('pause');\n return;\n }\n if (status === 'playing') {\n this.opts.emit('play', { mode: this.opts.mode });\n return;\n }\n }\n return;\n }\n case 'windowNumChanged': {\n const n =\n typeof data === 'number'\n ? data\n : data && typeof data === 'object'\n ? ((data as any).num ?? (data as any).number ?? (data as any).windowNum)\n : undefined;\n const v = this.normalizePositiveInt(n, this.currentNum);\n this.currentNum = v;\n return;\n }\n case 'realError': {\n this.opts.emit(\n 'error',\n new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'Real play failed',\n userMessage: '实时预览失败',\n cause: data,\n }),\n );\n return;\n }\n case 'recordError': {\n this.opts.emit(\n 'error',\n new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'Record play failed',\n userMessage: '录像回放失败',\n cause: data,\n }),\n );\n return;\n }\n default:\n return;\n }\n }\n\n private normalizeChannelList(opt: any) {\n const fromOpt = opt && typeof opt === 'object' ? (opt as any).channelList : undefined;\n if (Array.isArray(fromOpt) && fromOpt.length > 0) return this.limitByCurrentNum(fromOpt);\n\n const idsFromOpt = this.normalizeCameraIds(\n opt && typeof opt === 'object' ? ((opt as any).cameraIds ?? (opt as any).cameraId) : undefined,\n );\n if (idsFromOpt.length > 0) return this.limitByCurrentNum(idsFromOpt.map((id) => ({ channelCode: id })));\n\n const initIds = this.normalizeCameraIds(this.opts.cameraIds);\n if (initIds.length > 0) return this.limitByCurrentNum(initIds.map((id) => ({ channelCode: id })));\n if (this.opts.cameraId) return [{ channelCode: this.opts.cameraId }];\n return null;\n }\n\n private normalizeCameraIds(input: unknown): string[] {\n const list: string[] = [];\n if (typeof input === 'string') {\n const v = input.trim();\n if (v) list.push(v);\n } else if (Array.isArray(input)) {\n for (const it of input) {\n if (typeof it !== 'string') continue;\n const v = it.trim();\n if (v) list.push(v);\n }\n }\n const uniq = Array.from(new Set(list));\n return uniq;\n }\n\n private limitByCurrentNum<T>(list: T[]): T[] {\n const cap = this.normalizePositiveInt(this.currentNum, 1);\n if (list.length <= cap) return list;\n const sliced = list.slice(0, cap);\n this.log('channelList truncated by layout', { cap, original: list.length });\n return sliced;\n }\n\n private normalizePositiveInt(input: unknown, fallback: number) {\n const n = typeof input === 'number' ? input : typeof input === 'string' ? Number(input) : NaN;\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.floor(n);\n }\n\n playRealVideo(opt: any) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const channelList = this.normalizeChannelList(opt);\n if (!channelList) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'channelList is required for real play',\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\n });\n }\n if (typeof this.playerManager.playRealVideo !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playRealVideo is not available',\n userMessage: '当前内核不支持实时预览播放',\n });\n }\n this.log('playRealVideo');\n this.playerManager.playRealVideo({ ...(opt ?? {}), channelList });\n }\n\n playRecordVideo(opt: any) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const channelList = this.normalizeChannelList(opt);\n if (!channelList) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'channelList is required for record play',\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\n });\n }\n if (typeof this.playerManager.playRecordVideo !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playRecordVideo is not available',\n userMessage: '当前内核不支持录像回放播放',\n });\n }\n this.log('playRecordVideo');\n this.playerManager.playRecordVideo({ ...(opt ?? {}), channelList });\n }\n\n setPlayerNum(num: number) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const v = this.normalizePositiveInt(num, this.currentNum);\n const fn = this.playerManager?.setPlayerNum;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setPlayerNum is not available',\n userMessage: '当前内核不支持切换布局路数',\n });\n }\n this.log('setPlayerNum', v);\n fn.call(this.playerManager, v);\n this.currentNum = v;\n }\n\n jumpPlayByDateTime(datetime: string | Date | number, index?: number) {\n if (this.opts.mode !== 'record') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime only supports record mode',\n userMessage: '实时预览不支持跳转播放',\n });\n }\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const dt = this.formatDateTime(datetime);\n const fn = this.pickMethod(['jumpPlayByDateTime', 'jumpPlayByDatetime']);\n if (!fn) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime is not available',\n userMessage: '当前内核不支持录像跳转播放',\n });\n }\n const idx = typeof index === 'number' ? Math.floor(index) : undefined;\n this.log('jumpPlayByDateTime', { dt, index: idx });\n fn(dt, idx);\n }\n\n playSpeed(speed: number, index: number) {\n if (this.opts.mode !== 'record') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed only supports record mode',\n userMessage: '实时预览不支持倍速播放',\n });\n }\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const allowed = new Set([0.125, 0.25, 0.5, 1, 1.25, 1.5, 2, 4, 8]);\n if (!allowed.has(speed)) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'invalid speed',\n userMessage: '倍速参数不合法',\n cause: { speed },\n });\n }\n const idx = this.normalizePositiveInt(index, 0);\n const fn = this.playerManager?.playSpeed;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed is not available',\n userMessage: '当前内核不支持倍速播放',\n });\n }\n this.log('playSpeed', { speed, index: idx });\n fn.call(this.playerManager, speed, idx);\n }\n\n setFullScreen() {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const fn = this.playerManager?.setFullScreen;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setFullScreen is not available',\n userMessage: '当前内核不支持全屏',\n });\n }\n this.log('setFullScreen');\n fn.call(this.playerManager);\n }\n\n setExitFullScreen() {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const fn = this.playerManager?.setExitFullScreen;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setExitFullScreen is not available',\n userMessage: '当前内核不支持退出全屏',\n });\n }\n this.log('setExitFullScreen');\n fn.call(this.playerManager);\n }\n\n callRaw(method: string, ...args: any[]) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const name = typeof method === 'string' ? method.trim() : '';\n if (!name) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'method is required',\n userMessage: '缺少 method 参数',\n });\n }\n const fn = (this.playerManager as any)[name];\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: `method not found: ${name}`,\n userMessage: `底层方法不存在:${name}`,\n });\n }\n this.log('callRaw', name);\n return fn.apply(this.playerManager, args);\n }\n\n private pickMethod(names: string[]) {\n for (const n of names) {\n const fn = (this.playerManager as any)?.[n];\n if (typeof fn === 'function') return fn.bind(this.playerManager);\n }\n return null;\n }\n\n private formatDateTime(input: string | Date | number) {\n if (typeof input === 'string') return input.trim();\n const d =\n typeof input === 'number'\n ? new Date(input > 1_000_000_000_000 ? input : input * 1000)\n : input instanceof Date\n ? input\n : new Date(NaN);\n if (!Number.isFinite(d.getTime())) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'invalid datetime',\n userMessage: '跳转时间格式不合法',\n });\n }\n const pad2 = (n: number) => String(n).padStart(2, '0');\n const y = d.getFullYear();\n const m = pad2(d.getMonth() + 1);\n const day = pad2(d.getDate());\n const hh = pad2(d.getHours());\n const mm = pad2(d.getMinutes());\n const ss = pad2(d.getSeconds());\n return `${y}-${m}-${day} ${hh}:${mm}:${ss}`;\n }\n\n pause() {\n if (!this.playerManager || this.destroyed) return;\n try {\n this.log('pause');\n if (typeof this.playerManager.pause === 'function') {\n this.playerManager.pause(0);\n } else if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(0);\n this.opts.emit('pause');\n }\n } catch {}\n }\n\n pauseWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('pauseWindow', idx);\n if (typeof this.playerManager.pause === 'function') {\n this.playerManager.pause(idx);\n } else if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(idx);\n this.opts.emit('pause');\n }\n } catch {}\n }\n\n playWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('playWindow', idx);\n if (typeof this.playerManager.play === 'function') {\n this.playerManager.play(idx);\n }\n } catch {}\n }\n\n closeWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('closeWindow', idx);\n if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(idx);\n }\n } catch {}\n }\n\n destroy() {\n if (this.destroyed) return;\n this.destroyed = true;\n this.log('destroy');\n\n if (this.playerManager) {\n try {\n this.playerManager.destroy();\n } catch {}\n this.playerManager = null;\n }\n }\n}\n","import { ErrorCode, DahuaPlayerError, toDahuaError } from './errors';\nimport type {\n DahuaPlayerEventName,\n DahuaPlayerAuth,\n DahuaPlayerInitOptions,\n DahuaPlayerInstance,\n DahuaPlayerMode,\n} from './types';\nimport { ensureDahuaSdkLoaded } from './sdk/SdkLoader';\nimport { acquireTokenShim, releaseTokenShim, setToken } from './sdk/TokenVault';\nimport { acquireSelfTargetOriginShim, releaseSelfTargetOriginShim, setSelfTargetOrigin } from './sdk/SelfTargetOriginShim';\nimport { PlayerAdapter } from './sdk/PlayerAdapter';\n\ntype ListenerMap = Map<DahuaPlayerEventName, Set<(payload: any) => void>>;\n\n/**\n * 规范化大华静态资源根路径。\n *\n * - 允许传入 \"/wsplayer-gov\" 或 \"wsplayer-gov\"\n * - 会去掉末尾多余的 \"/\"\n */\nfunction normalizeStaticPath(path: string) {\n const raw = (path || '').trim();\n if (!raw) return '/wsplayer-gov';\n const v = raw.replace(/\\/+$/, '');\n return v.startsWith('/') ? v : `/${v}`;\n}\n\nfunction buildTargetOriginFromAuth(auth: DahuaPlayerAuth | undefined) {\n if (!auth) return '';\n const ip = typeof auth.ip === 'string' ? auth.ip.trim() : '';\n const port = typeof auth.port === 'number' ? auth.port : typeof auth.port === 'string' ? Number(auth.port) : NaN;\n if (!ip || !Number.isFinite(port) || port <= 0) return '';\n const protocol = auth.protocol === 'http' ? 'http' : 'https';\n return `${protocol}://${ip}:${port}`;\n}\n\n/**\n * 解析播放器挂载容器。\n *\n * - string:按 id 查找元素\n * - HTMLElement:直接使用\n */\nfunction resolveContainer(container: HTMLElement | string): HTMLElement {\n if (typeof container === 'string') {\n const el = document.getElementById(container);\n if (!el) {\n throw new DahuaPlayerError({\n code: ErrorCode.CONTAINER_NOT_FOUND,\n message: `container not found: ${container}`,\n userMessage: '未找到播放器挂载节点',\n });\n }\n return el;\n }\n if (container && typeof container === 'object') return container;\n throw new DahuaPlayerError({\n code: ErrorCode.CONTAINER_NOT_FOUND,\n message: 'container is invalid',\n userMessage: '播放器挂载节点无效',\n });\n}\n\nfunction createListeners(): ListenerMap {\n return new Map();\n}\n\nfunction emit(listeners: ListenerMap, event: DahuaPlayerEventName, payload?: any) {\n const set = listeners.get(event);\n if (!set || set.size === 0) return;\n for (const cb of set) {\n try {\n cb(payload);\n } catch {}\n }\n}\n\n/**\n * 大华播放器核心入口。\n *\n * 设计目标:\n *\n * - 对外只暴露一个初始化方法:`DahuaPlayer.init(options)`\n * - 自动加载大华 SDK 脚本与 CSS(默认从 `/wsplayer-gov` 下加载)\n * - 不在浏览器持久化保存 token(通过 sessionStorage shim 仅在内存注入)\n * - 统一事件与错误码:ready/play/pause/error/destroy + ErrorCode\n *\n * 注意:\n *\n * - 本类不负责登录鉴权;需要外部提供已获取到的 `token`\n */\nexport class DahuaPlayer {\n /**\n * 初始化播放器并返回实例。\n *\n * 生命周期:\n *\n * - 立即创建 DOM 结构并开始异步加载 SDK\n * - `instance.ready` 会在 SDK 触发 `initializationCompleted` 后 resolve\n * - `destroy()` 会销毁 SDK 实例、移除 DOM,并释放 token shim\n *\n * @throws DahuaPlayerError 当 container/token 不合法时抛出\n */\n static init(options: DahuaPlayerInitOptions): DahuaPlayerInstance {\n const opts = options || ({} as any);\n const container = resolveContainer(opts.container);\n\n const mode: DahuaPlayerMode = opts.mode ?? 'real';\n\n const token = typeof opts.auth?.token === 'string' ? opts.auth.token.trim() : '';\n if (!token) {\n throw new DahuaPlayerError({\n code: ErrorCode.INVALID_TOKEN,\n message: 'token is required',\n userMessage: '缺少 token,请先完成鉴权登录',\n });\n }\n\n const cameraId = typeof opts.cameraId === 'string' ? opts.cameraId.trim() : '';\n const cameraIds = Array.isArray(opts.cameraIds) ? opts.cameraIds.map((v) => v.trim()).filter(Boolean) : [];\n const targetOrigin = buildTargetOriginFromAuth(opts.auth);\n\n const id = `dahua-player-${Math.random().toString(36).slice(2, 10)}`;\n const wrapper = document.createElement('div');\n wrapper.id = id;\n wrapper.style.position = 'relative';\n wrapper.style.width = opts.width === 'auto' || opts.width == null ? '100%' : `${opts.width}px`;\n wrapper.style.height = opts.height === 'auto' || opts.height == null ? '100%' : `${opts.height}px`;\n container.appendChild(wrapper);\n\n const innerId = `${id}-inner`;\n const inner = document.createElement('div');\n inner.id = innerId;\n inner.style.width = '100%';\n inner.style.height = '100%';\n wrapper.appendChild(inner);\n\n const loading = document.createElement('div');\n loading.style.position = 'absolute';\n loading.style.left = '0';\n loading.style.top = '0';\n loading.style.right = '0';\n loading.style.bottom = '0';\n loading.style.display = 'flex';\n loading.style.alignItems = 'center';\n loading.style.justifyContent = 'center';\n loading.style.background = 'rgba(0,0,0,0.35)';\n loading.style.color = '#fff';\n loading.style.fontSize = '12px';\n loading.style.pointerEvents = 'none';\n loading.style.zIndex = '10';\n loading.style.visibility = 'hidden';\n\n const loadingText = document.createElement('div');\n loadingText.textContent = '';\n loading.appendChild(loadingText);\n wrapper.appendChild(loading);\n\n const setLoading = (visible: boolean, text?: string) => {\n loadingText.textContent = text || '';\n loading.style.visibility = visible ? 'visible' : 'hidden';\n };\n\n let transientOverlayTimer: any = null;\n let stickyOverlayVisible = false;\n\n /**\n * 开始一个“加载中”覆盖层展示,并清理可能存在的错误提示计时器。\n */\n const showLoading = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = false;\n setLoading(true, text);\n };\n\n /**\n * 以短暂覆盖层的方式提示错误,给用户一个可见反馈。\n */\n const showTransientError = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = false;\n setLoading(true, text);\n transientOverlayTimer = setTimeout(() => {\n transientOverlayTimer = null;\n setLoading(false);\n }, 3000);\n };\n\n /**\n * 以常驻覆盖层的方式提示错误,直到下一次显式加载/销毁。\n */\n const showStickyError = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = true;\n setLoading(true, text);\n };\n\n /**\n * 将 error payload 格式化为可读文案;尽量带上状态码等关键信息。\n */\n const formatUserMessage = (payload: unknown, fallback: string) => {\n if (payload instanceof DahuaPlayerError) {\n const base = payload.userMessage || fallback;\n const cause: any = (payload as any).cause;\n const status = cause && typeof cause === 'object' ? (cause.status ?? cause.code) : undefined;\n if (typeof status === 'number' || typeof status === 'string') {\n return `${base}(${status})`;\n }\n return base;\n }\n return typeof payload === 'string' ? payload : fallback;\n };\n\n const listeners = createListeners();\n const staticPath = normalizeStaticPath(opts.staticPath ?? '/wsplayer-gov');\n const sdkUrl = (opts.sdkUrl || `${staticPath}/wsplayer.min.js`).trim();\n const cssUrl = `${staticPath}/WSPlayer/player.css`;\n\n const autoPlay = opts.autoPlay === true;\n const streamType = (opts.streamType ?? 2) as 1 | 2 | 3;\n const searchOnline = Boolean(opts.searchOnline);\n const num = Number.isFinite(opts.num as any) ? Math.floor(Number(opts.num)) : undefined;\n const maxNum = Number.isFinite(opts.maxNum as any) ? Math.floor(Number(opts.maxNum)) : undefined;\n const showRecordProgressBar =\n typeof opts.showRecordProgressBar === 'boolean' ? opts.showRecordProgressBar : undefined;\n const dblClickFullscreen = opts.dblClickFullscreen !== false;\n\n let destroyed = false;\n let adapter: PlayerAdapter | null = null;\n let readyResolve: () => void = () => {};\n let readyReject: (e: unknown) => void = () => {};\n\n const safeOnError = (e: unknown) => {\n try {\n opts.onError?.(e);\n } catch {}\n emit(listeners, 'error', e);\n };\n\n /**\n * autoPlay:根据 init 参数在 ready 后触发一次自动播放。\n *\n * 触发条件:\n * - 实时预览(mode=real):需要 cameraId + autoPlay=true\n * - 录像回放(mode=record):需要 recordStartTime/recordEndTime(Unix 秒)+ autoPlay=true\n */\n const tryAutoPlay = () => {\n if (!autoPlay) return;\n if (mode === 'real') {\n if (!cameraId && cameraIds.length === 0) return;\n try {\n showLoading('加载视频中…');\n adapter?.playRealVideo({});\n } catch (e) {\n safeOnError(e);\n }\n return;\n }\n if (mode === 'record') {\n if (!Number.isFinite(opts.recordStartTime as any)) return;\n if (!Number.isFinite(opts.recordEndTime as any)) return;\n if (!cameraId && cameraIds.length === 0) return;\n const startTime = Math.floor(Number(opts.recordStartTime));\n const endTime = Math.floor(Number(opts.recordEndTime));\n const recordSource = Number.isFinite(opts.recordSource as any)\n ? Math.floor(Number(opts.recordSource))\n : undefined;\n try {\n showLoading('加载录像中…');\n adapter?.playRecordVideo(recordSource == null ? { startTime, endTime } : { startTime, endTime, recordSource });\n } catch (e) {\n safeOnError(e);\n }\n }\n };\n\n /**\n * ready:仅代表播放器“初始化完成”,不等价于“已成功播放”。\n * 播放成功/失败通过 play/error 事件体现。\n */\n const ready = new Promise<void>((resolve, reject) => {\n readyResolve = resolve;\n readyReject = reject;\n });\n\n /**\n * 初始化兜底超时:避免 SDK 资源或初始化流程异常导致 ready 永远 pending。\n */\n const readyTimer = setTimeout(() => {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_LOAD_TIMEOUT,\n message: 'SDK ready timeout',\n userMessage: '播放器初始化超时',\n });\n showStickyError(`初始化失败:${err.userMessage}`);\n safeOnError(err);\n readyReject(err);\n }, 20_000);\n\n showLoading('初始化中…');\n\n void (async () => {\n try {\n /**\n * 大华 SDK 内部会从 sessionStorage 读取 psi_token。\n * 这里通过 shim 仅在内存提供 token,避免 token 落盘。\n */\n setToken(token);\n acquireTokenShim();\n if (targetOrigin) {\n try {\n window.sessionStorage?.setItem('wsplayer_origin', targetOrigin);\n } catch {}\n }\n setSelfTargetOrigin(targetOrigin || null);\n acquireSelfTargetOriginShim();\n\n await ensureDahuaSdkLoaded({ sdkUrl, cssUrl, timeoutMs: 20_000 });\n\n adapter = new PlayerAdapter({\n containerId: innerId,\n staticPath,\n mode,\n cameraId,\n cameraIds,\n streamType,\n searchOnline,\n useNginxProxy: opts.useNginxProxy,\n nginxProxyHost: opts.nginxProxyHost,\n useWSS: opts.useWSS,\n num,\n maxNum,\n showRecordProgressBar,\n playerOptions: opts.playerOptions,\n debug: opts.debug,\n onMessage: (type, data) => {\n try {\n opts.onSdkMessage?.(type, data);\n } catch {}\n },\n emit: (event, payload) => {\n if (event === 'ready') {\n clearTimeout(readyTimer);\n readyResolve();\n setLoading(false);\n stickyOverlayVisible = false;\n try {\n opts.onReady?.();\n } catch {}\n emit(listeners, 'ready');\n tryAutoPlay();\n return;\n }\n if (event === 'play') {\n setLoading(false);\n try {\n opts.onPlay?.(payload);\n } catch {}\n emit(listeners, 'play', payload);\n return;\n }\n if (event === 'pause') {\n setLoading(false);\n try {\n opts.onPause?.();\n } catch {}\n emit(listeners, 'pause');\n return;\n }\n if (event === 'error') {\n const msg = formatUserMessage(payload, '播放失败');\n if (payload instanceof DahuaPlayerError) {\n const initCodes = new Set<ErrorCode>([\n ErrorCode.SDK_INIT_FAILED,\n ErrorCode.SDK_LOAD_FAILED,\n ErrorCode.SDK_LOAD_TIMEOUT,\n ]);\n if (initCodes.has(payload.code)) {\n showStickyError(`初始化失败:${msg}`);\n safeOnError(payload);\n return;\n }\n }\n if (stickyOverlayVisible) return;\n showTransientError(msg);\n safeOnError(payload);\n }\n },\n });\n\n adapter.init();\n } catch (e) {\n clearTimeout(readyTimer);\n const err = toDahuaError(e, {\n code: ErrorCode.SDK_LOAD_FAILED,\n message: 'SDK load/init failed',\n userMessage: '播放器初始化失败',\n });\n showStickyError(`初始化失败:${err.userMessage}`);\n safeOnError(err);\n readyReject(err);\n }\n })();\n\n const instance: DahuaPlayerInstance = {\n id,\n ready,\n /**\n * 暂停播放。\n *\n * 注意:部分 SDK 版本 pause/close 的行为差异由内部适配处理。\n */\n pause: () => {\n if (!adapter) return;\n adapter.pause();\n },\n /**\n * 销毁播放器实例并释放资源。\n *\n * - 移除创建的 DOM 节点\n * - 调用 SDK destroy(若存在)\n * - 释放 token shim,清理内存 token\n * - 触发 destroy 事件\n */\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n clearTimeout(readyTimer);\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n setLoading(false);\n try {\n adapter?.destroy();\n } catch {}\n adapter = null;\n try {\n wrapper.remove();\n } catch {\n try {\n container.innerHTML = '';\n } catch {}\n }\n try {\n releaseTokenShim();\n } catch {}\n try {\n releaseSelfTargetOriginShim();\n } catch {}\n try {\n setToken(null);\n } catch {}\n try {\n opts.onDestroy?.();\n } catch {}\n emit(listeners, 'destroy');\n listeners.clear();\n },\n sdk: {\n getRaw: () => adapter?.getRaw(),\n callRaw: (method: string, ...args: any[]) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n return adapter.callRaw(method, ...args);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'callRaw failed',\n userMessage: '调用底层方法失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playRealVideo: (opt: any) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('加载视频中…');\n try {\n adapter.playRealVideo(opt);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playRealVideo failed',\n userMessage: '实时预览播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playRecordVideo: (opt: any) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('加载录像中…');\n try {\n adapter.playRecordVideo(opt);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playRecordVideo failed',\n userMessage: '录像回放播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n pause: (windowIndex?: number) => adapter?.pauseWindow(windowIndex),\n play: (windowIndex?: number) => adapter?.playWindow(windowIndex),\n close: (windowIndex?: number) => adapter?.closeWindow(windowIndex),\n setPlayerNum: (n: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setPlayerNum(n);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'setPlayerNum failed',\n userMessage: '切换布局路数失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n jumpPlayByDateTime: (datetime: string | Date | number, index?: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('跳转中…');\n try {\n adapter.jumpPlayByDateTime(datetime, index);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime failed',\n userMessage: '录像跳转播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playSpeed: (speed: number, index: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.playSpeed(speed, index);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed failed',\n userMessage: '设置倍速失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n setFullScreen: () => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setFullScreen();\n return;\n } catch {}\n const el: any = wrapper as any;\n const req = el?.requestFullscreen;\n if (typeof req !== 'function') {\n const err = new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'fullscreen is not supported',\n userMessage: '当前环境不支持全屏',\n });\n safeOnError(err);\n throw err;\n }\n void req.call(el);\n },\n setExitFullScreen: () => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setExitFullScreen();\n return;\n } catch {}\n const doc: any = document as any;\n const exit = doc?.exitFullscreen;\n if (typeof exit === 'function') {\n void exit.call(doc);\n return;\n }\n const err = new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'exitFullscreen is not supported',\n userMessage: '当前环境不支持退出全屏',\n });\n safeOnError(err);\n throw err;\n },\n destroy: () => instance.destroy(),\n },\n /**\n * 订阅事件(ready/play/pause/error/destroy)。\n */\n on: (event, handler) => {\n const set = listeners.get(event) ?? new Set();\n set.add(handler as any);\n listeners.set(event, set);\n },\n /**\n * 取消订阅事件。\n */\n off: (event, handler) => {\n const set = listeners.get(event);\n if (!set) return;\n set.delete(handler as any);\n if (set.size === 0) listeners.delete(event);\n },\n };\n\n if (dblClickFullscreen) {\n const onDblClick = () => {\n try {\n const doc: any = document as any;\n if (doc?.fullscreenElement) {\n instance.sdk.setExitFullScreen();\n return;\n }\n instance.sdk.setFullScreen();\n } catch {}\n };\n try {\n wrapper.addEventListener('dblclick', onDblClick);\n } catch {}\n const originDestroy = instance.destroy;\n instance.destroy = () => {\n try {\n wrapper.removeEventListener('dblclick', onDblClick);\n } catch {}\n originDestroy();\n };\n }\n\n return instance;\n }\n}\n"],"mappings":"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","names":["ErrorCode","state","state","_a","_b","_c","err"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@video-supply/dahua-player",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Dahua WSPlayer wrapper for browser apps",
5
5
  "type": "module",
6
6
  "sideEffects": false,