@video-supply/dahua-player 0.1.3 → 0.1.4

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
@@ -91,7 +91,9 @@ Optional:
91
91
  - `staticPath?: string` (default `/wsplayer-gov`)
92
92
  - `sdkUrl?: string` (default `/wsplayer-gov/wsplayer.min.js`)
93
93
  - `debug?: boolean` (default `false`)
94
- - callbacks: `onReady/onPlay/onPause/onError/onDestroy`
94
+ - callbacks: `onReady/onPlay/onPause/onPlaybackTime/onError/onDestroy`
95
+ - `onPlaybackTime(payload)` is record-mode only and fires when `timeSec` changes (about once per second).
96
+ - payload: `{ timeMs, timeSec, windowIndex?, channelCode?, raw? }`
95
97
 
96
98
  Returns: `DahuaPlayerInstance`
97
99
 
@@ -107,8 +109,37 @@ Returns: `DahuaPlayerInstance`
107
109
  - Destroys the instance and releases resources.
108
110
  - Removes DOM nodes, clears timers, and releases sessionStorage shims.
109
111
  - `on(event, handler) / off(event, handler)`
110
- - Subscribe/unsubscribe events: `ready` / `play` / `pause` / `error` / `destroy`.
112
+ - Subscribe/unsubscribe events: `ready` / `play` / `pause` / `playbackTime` / `error` / `destroy`.
111
113
  - `play` payload: `{ mode?: 'real' | 'record' }`.
114
+ - `getPlaybackTimeMs(): number | null`
115
+ - Returns the latest playback time in epoch milliseconds (record mode only).
116
+ - Returns `null` before the first playback timestamp arrives.
117
+
118
+ #### Playback time example (callback + imperative getter)
119
+
120
+ ```ts
121
+ const player = DahuaPlayer.init({
122
+ container: 'player',
123
+ auth: { token: 'YOUR_DAHUA_TOKEN' },
124
+ mode: 'record',
125
+ onPlaybackTime: ({ timeMs, timeSec }) => {
126
+ console.log('playback time changed:', timeSec, timeMs);
127
+ },
128
+ });
129
+
130
+ await player.ready;
131
+
132
+ player.on('playbackTime', ({ timeMs, timeSec }) => {
133
+ console.log('playbackTime event:', timeSec, timeMs);
134
+ });
135
+
136
+ player.sdk.playRecordVideo({
137
+ startTime: Math.floor(Date.now() / 1000) - 60,
138
+ endTime: Math.floor(Date.now() / 1000),
139
+ });
140
+
141
+ console.log('getPlaybackTimeMs:', player.getPlaybackTimeMs());
142
+ ```
112
143
 
113
144
  #### SDK methods (`instance.sdk`)
114
145
 
@@ -308,6 +339,8 @@ await player.ready;
308
339
  - `onReady`:内核初始化完成(不等同于播放成功)
309
340
  - `onPlay`:播放成功(包含 real/record)
310
341
  - `onPause`:暂停
342
+ - `onPlaybackTime`:回放当前时间变化(仅 mode=record,默认按秒变化触发)
343
+ - payload:`{ timeMs, timeSec, windowIndex?, channelCode?, raw? }`
311
344
  - `onError`:初始化/播放等错误
312
345
  - `onDestroy`:销毁
313
346
  - `onSdkMessage`:透出 WSPlayer 原始消息(排障用)
@@ -329,8 +362,11 @@ await instance.ready;
329
362
  - 销毁播放器实例并释放资源
330
363
  - 会移除 DOM、清理定时器、释放 sessionStorage shim
331
364
  - `instance.on(event, handler) / instance.off(event, handler)`
332
- - 订阅/取消订阅事件:`ready` / `play` / `pause` / `error` / `destroy`
365
+ - 订阅/取消订阅事件:`ready` / `play` / `pause` / `playbackTime` / `error` / `destroy`
333
366
  - `play` 事件 payload:`{ mode?: 'real' | 'record' }`
367
+ - `instance.getPlaybackTimeMs(): number | null`
368
+ - 主动获取最近一次收到的“当前回放时间(epoch ms)”
369
+ - 仅 mode=record 时有意义;未收到回放时间前返回 null
334
370
 
335
371
  `instance.sdk`:
336
372
 
package/README.zh-CN.md CHANGED
@@ -107,6 +107,14 @@ await player.ready;
107
107
  - `onReady`:内核初始化完成(不等同于播放成功)
108
108
  - `onPlay`:播放成功(包含 real/record)
109
109
  - `onPause`:暂停
110
+ - `onPlaybackTime`:回放当前时间变化(仅 mode=record,默认按秒变化触发)
111
+ - 触发时机:底层 SDK 会高频推送回放帧信息;库内部只在 `timeSec` 变化时对外触发(约 1 次/秒)
112
+ - payload:`{ timeMs, timeSec, windowIndex?, channelCode?, raw? }`
113
+ - `timeMs`:当前回放时间(epoch 毫秒)
114
+ - `timeSec`:当前回放时间(epoch 秒)
115
+ - `windowIndex`:窗口索引(可选)
116
+ - `channelCode`:通道编码(可选)
117
+ - `raw`:原始 SDK data(可选,用于排障)
110
118
  - `onError`:初始化/播放等错误
111
119
  - `onDestroy`:销毁
112
120
  - `onSdkMessage`:透出 WSPlayer 原始消息(排障用)
@@ -128,8 +136,38 @@ await instance.ready;
128
136
  - 销毁播放器实例并释放资源
129
137
  - 会移除 DOM、清理定时器、释放 sessionStorage shim
130
138
  - `instance.on(event, handler) / instance.off(event, handler)`
131
- - 订阅/取消订阅事件:`ready` / `play` / `pause` / `error` / `destroy`
139
+ - 订阅/取消订阅事件:`ready` / `play` / `pause` / `playbackTime` / `error` / `destroy`
132
140
  - `play` 事件 payload:`{ mode?: 'real' | 'record' }`
141
+ - `instance.getPlaybackTimeMs(): number | null`
142
+ - 主动获取最近一次收到的“当前回放时间(epoch ms)”
143
+ - 仅 mode=record 时有意义;未收到回放时间前返回 null
144
+
145
+ ### 回放时间示例(回调 + 主动获取)
146
+
147
+ ```ts
148
+ const player = DahuaPlayer.init({
149
+ container: 'player',
150
+ auth: { token: 'YOUR_DAHUA_TOKEN' },
151
+ mode: 'record',
152
+ onPlaybackTime: ({ timeMs, timeSec, windowIndex, channelCode }) => {
153
+ console.log('回放时间变化(秒级触发):', timeSec, timeMs, windowIndex, channelCode);
154
+ },
155
+ });
156
+
157
+ await player.ready;
158
+
159
+ player.on('playbackTime', ({ timeMs, timeSec }) => {
160
+ console.log('playbackTime 事件:', timeSec, timeMs);
161
+ });
162
+
163
+ player.sdk.playRecordVideo({
164
+ startTime: Math.floor(Date.now() / 1000) - 60,
165
+ endTime: Math.floor(Date.now() / 1000),
166
+ });
167
+
168
+ const t = player.getPlaybackTimeMs();
169
+ console.log('主动获取(可能为null):', t);
170
+ ```
133
171
 
134
172
  `instance.sdk`:
135
173
 
package/dist/index.cjs CHANGED
@@ -741,6 +741,35 @@ var PlayerAdapter = class {
741
741
  }
742
742
  };
743
743
 
744
+ // src/sdk/PlaybackTime.ts
745
+ function extractPlaybackTimeMsFromFrameInfo(data) {
746
+ const vf = data && typeof data === "object" ? data.videoFrameInfo : void 0;
747
+ const utcMsRaw = vf && typeof vf === "object" ? vf.utcTimeStamp : void 0;
748
+ const secRaw = data && typeof data === "object" ? data.timeStamp : void 0;
749
+ const utcMs = typeof utcMsRaw === "number" && Number.isFinite(utcMsRaw) ? Math.floor(utcMsRaw) : null;
750
+ const sec = typeof secRaw === "number" && Number.isFinite(secRaw) ? Math.floor(secRaw) : null;
751
+ const baseMs = utcMs != null ? utcMs : sec != null ? sec * 1e3 : null;
752
+ if (baseMs == null) return null;
753
+ const shouldApplySubMs = utcMs == null ? true : utcMs % 1e3 === 0;
754
+ if (!shouldApplySubMs) return baseMs;
755
+ const nTimeStampRaw = vf && typeof vf === "object" ? vf.nTimeStamp : void 0;
756
+ if (typeof nTimeStampRaw !== "number" || !Number.isFinite(nTimeStampRaw)) return baseMs;
757
+ const sub = (Math.floor(nTimeStampRaw) % 1e3 + 1e3) % 1e3;
758
+ return baseMs + sub;
759
+ }
760
+ function buildPlaybackTimePayloadFromFrameInfo(data) {
761
+ var _a;
762
+ const timeMs = extractPlaybackTimeMsFromFrameInfo(data);
763
+ if (timeMs == null) return null;
764
+ const secRaw = data && typeof data === "object" ? data.timeStamp : void 0;
765
+ const timeSec = typeof secRaw === "number" && Number.isFinite(secRaw) ? Math.floor(secRaw) : Math.floor(timeMs / 1e3);
766
+ const idxRaw = data && typeof data === "object" ? data.selectIndex : void 0;
767
+ const windowIndex = typeof idxRaw === "number" && Number.isFinite(idxRaw) ? Math.floor(idxRaw) : void 0;
768
+ const channelCodeRaw = data && typeof data === "object" ? (_a = data.channelData) == null ? void 0 : _a.channelCode : void 0;
769
+ const channelCode = typeof channelCodeRaw === "string" ? channelCodeRaw : void 0;
770
+ return { timeMs, timeSec, windowIndex, channelCode, raw: data };
771
+ }
772
+
744
773
  // src/DahuaPlayer.ts
745
774
  function normalizeStaticPath(path) {
746
775
  const raw = (path || "").trim();
@@ -912,6 +941,8 @@ var DahuaPlayer = class {
912
941
  };
913
942
  let readyReject = () => {
914
943
  };
944
+ let lastPlaybackTimeMs = null;
945
+ let lastEmittedPlaybackTimeSec = null;
915
946
  const safeOnError = (e) => {
916
947
  var _a2;
917
948
  try {
@@ -993,11 +1024,24 @@ var DahuaPlayer = class {
993
1024
  playerOptions: opts.playerOptions,
994
1025
  debug: opts.debug,
995
1026
  onMessage: (type, data) => {
996
- var _a3;
1027
+ var _a3, _b2;
997
1028
  try {
998
1029
  (_a3 = opts.onSdkMessage) == null ? void 0 : _a3.call(opts, type, data);
999
1030
  } catch {
1000
1031
  }
1032
+ if (type === "getVideoFrameInfo") {
1033
+ const payload = buildPlaybackTimePayloadFromFrameInfo(data);
1034
+ if (!payload) return;
1035
+ lastPlaybackTimeMs = payload.timeMs;
1036
+ if (payload.timeSec !== lastEmittedPlaybackTimeSec) {
1037
+ lastEmittedPlaybackTimeSec = payload.timeSec;
1038
+ try {
1039
+ (_b2 = opts.onPlaybackTime) == null ? void 0 : _b2.call(opts, payload);
1040
+ } catch {
1041
+ }
1042
+ emit(listeners, "playbackTime", payload);
1043
+ }
1044
+ }
1001
1045
  },
1002
1046
  emit: (event, payload) => {
1003
1047
  var _a3, _b2, _c2;
@@ -1065,6 +1109,7 @@ var DahuaPlayer = class {
1065
1109
  readyReject(err);
1066
1110
  }
1067
1111
  })();
1112
+ const getPlaybackTimeMs = () => lastPlaybackTimeMs;
1068
1113
  const instance = {
1069
1114
  id,
1070
1115
  ready,
@@ -1077,6 +1122,7 @@ var DahuaPlayer = class {
1077
1122
  if (!adapter) return;
1078
1123
  adapter.pause();
1079
1124
  },
1125
+ getPlaybackTimeMs,
1080
1126
  /**
1081
1127
  * 销毁播放器实例并释放资源。
1082
1128
  *
@@ -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 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"]}
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/sdk/PlaybackTime.ts","../src/DahuaPlayer.ts"],"sourcesContent":["export { DahuaPlayer } from './DahuaPlayer';\nexport { ErrorCode, DahuaPlayerError } from './errors';\nexport type {\n DahuaPlayerInitOptions,\n DahuaPlayerInstance,\n DahuaPlayerEventMap,\n DahuaPlayerEventName,\n DahuaPlayerPlaybackTimePayload,\n} from './types';\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';\r\nimport type { DahuaPlayerMode, DahuaPlayerPlayerOptions } from '../types';\r\n\r\ntype ReceiveFn = (type: string, data: any) => void;\r\n\r\ntype PlayerAdapterOptions = {\r\n containerId: string;\r\n staticPath: string;\r\n mode: DahuaPlayerMode;\r\n cameraId?: string;\r\n cameraIds?: string[];\r\n streamType: 1 | 2 | 3;\r\n searchOnline: boolean;\r\n useNginxProxy?: boolean;\r\n nginxProxyHost?: string;\r\n useWSS?: boolean;\r\n num?: number;\r\n maxNum?: number;\r\n showRecordProgressBar?: boolean;\r\n playerOptions?: DahuaPlayerPlayerOptions;\r\n debug?: boolean;\r\n onMessage?: ReceiveFn;\r\n emit: (event: 'ready' | 'play' | 'pause' | 'error', payload?: any) => void;\r\n};\r\n\r\nexport class PlayerAdapter {\r\n private opts: PlayerAdapterOptions;\r\n private playerManager: any | null = null;\r\n private destroyed = false;\r\n private readyResolved = false;\r\n private lastStatus: string | null = null;\r\n private currentNum = 1;\r\n private currentMaxNum = 1;\r\n\r\n constructor(opts: PlayerAdapterOptions) {\r\n this.opts = opts;\r\n }\r\n\r\n getRaw() {\r\n return this.playerManager;\r\n }\r\n\r\n init() {\r\n if (this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const PM = (window as any).PlayerManager;\r\n if (typeof PM !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.SDK_INIT_FAILED,\r\n message: 'PlayerManager is not available',\r\n userMessage: '播放器内核未加载',\r\n });\r\n }\r\n\r\n const userReceive = this.opts.onMessage;\r\n const showRecordProgressBar =\r\n typeof this.opts.showRecordProgressBar === 'boolean'\r\n ? this.opts.showRecordProgressBar\r\n : this.opts.mode === 'record';\r\n const initialNum = this.normalizePositiveInt(\r\n this.opts.num ?? (this.opts.playerOptions as any)?.num ?? 1,\r\n 1,\r\n );\r\n const initialMaxNum = this.normalizePositiveInt(\r\n this.opts.maxNum ?? (this.opts.playerOptions as any)?.maxNum ?? initialNum,\r\n initialNum,\r\n );\r\n const defaultOptions: Record<string, unknown> = {\r\n type: this.opts.mode,\r\n num: initialNum,\r\n maxNum: initialMaxNum,\r\n showControl: false,\r\n showIcons: { hidden: true },\r\n showRecordProgressBar,\r\n useNginxProxy: this.opts.useNginxProxy ?? false,\r\n nginxProxyHost: this.opts.nginxProxyHost ?? '',\r\n useWSS: this.opts.useWSS ?? false,\r\n };\r\n const merged = {\r\n ...defaultOptions,\r\n ...(this.opts.playerOptions ?? {}),\r\n el: this.opts.containerId,\r\n STATIC_PATH: this.opts.staticPath,\r\n receiveMessageFromWSPlayer: (type: string, data: any) => {\r\n if (this.destroyed) return;\r\n\r\n try {\r\n userReceive?.(type, data);\r\n } catch {}\r\n\r\n this.handleSdkMessage(type, data);\r\n },\r\n };\r\n this.playerManager = new PM(merged);\r\n this.currentNum = this.normalizePositiveInt((merged as any).num, 1);\r\n this.currentMaxNum = this.normalizePositiveInt((merged as any).maxNum, this.currentNum);\r\n }\r\n\r\n private log(...args: any[]) {\r\n if (!this.opts.debug) return;\r\n try {\r\n console.log('[dahua-player]', ...args);\r\n } catch {}\r\n }\r\n\r\n private summarizeSdkMessage(type: string, data: any) {\r\n if (type === 'statusChanged') {\r\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\r\n return { status };\r\n }\r\n if (type === 'realError' || type === 'recordError') {\r\n const reason = data && typeof data === 'object' ? (data as any).reason : undefined;\r\n return { reason };\r\n }\r\n if (type === 'errorInfo') {\r\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\r\n const code = data && typeof data === 'object' ? (data as any).code : undefined;\r\n return { status, code };\r\n }\r\n return undefined;\r\n }\r\n\r\n private handleSdkMessage(type: string, data: any) {\r\n this.log('sdk', type, this.summarizeSdkMessage(type, data));\r\n switch (type) {\r\n case 'initializationCompleted': {\r\n if (!this.readyResolved) {\r\n this.readyResolved = true;\r\n this.opts.emit('ready');\r\n }\r\n return;\r\n }\r\n case 'realSuccess': {\r\n this.opts.emit('play', { mode: 'real' });\r\n return;\r\n }\r\n case 'recordSuccess': {\r\n this.opts.emit('play', { mode: 'record' });\r\n return;\r\n }\r\n case 'statusChanged': {\r\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\r\n if (typeof status === 'string' && status && status !== this.lastStatus) {\r\n this.lastStatus = status;\r\n if (status === 'pause' || status === 'paused') {\r\n this.opts.emit('pause');\r\n return;\r\n }\r\n if (status === 'playing') {\r\n this.opts.emit('play', { mode: this.opts.mode });\r\n return;\r\n }\r\n }\r\n return;\r\n }\r\n case 'windowNumChanged': {\r\n const n =\r\n typeof data === 'number'\r\n ? data\r\n : data && typeof data === 'object'\r\n ? ((data as any).num ?? (data as any).number ?? (data as any).windowNum)\r\n : undefined;\r\n const v = this.normalizePositiveInt(n, this.currentNum);\r\n this.currentNum = v;\r\n return;\r\n }\r\n case 'realError': {\r\n this.opts.emit(\r\n 'error',\r\n new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'Real play failed',\r\n userMessage: '实时预览失败',\r\n cause: data,\r\n }),\r\n );\r\n return;\r\n }\r\n case 'recordError': {\r\n this.opts.emit(\r\n 'error',\r\n new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'Record play failed',\r\n userMessage: '录像回放失败',\r\n cause: data,\r\n }),\r\n );\r\n return;\r\n }\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n private normalizeChannelList(opt: any) {\r\n const fromOpt = opt && typeof opt === 'object' ? (opt as any).channelList : undefined;\r\n if (Array.isArray(fromOpt) && fromOpt.length > 0) return this.limitByCurrentNum(fromOpt);\r\n\r\n const idsFromOpt = this.normalizeCameraIds(\r\n opt && typeof opt === 'object' ? ((opt as any).cameraIds ?? (opt as any).cameraId) : undefined,\r\n );\r\n if (idsFromOpt.length > 0) return this.limitByCurrentNum(idsFromOpt.map((id) => ({ channelCode: id })));\r\n\r\n const initIds = this.normalizeCameraIds(this.opts.cameraIds);\r\n if (initIds.length > 0) return this.limitByCurrentNum(initIds.map((id) => ({ channelCode: id })));\r\n if (this.opts.cameraId) return [{ channelCode: this.opts.cameraId }];\r\n return null;\r\n }\r\n\r\n private normalizeCameraIds(input: unknown): string[] {\r\n const list: string[] = [];\r\n if (typeof input === 'string') {\r\n const v = input.trim();\r\n if (v) list.push(v);\r\n } else if (Array.isArray(input)) {\r\n for (const it of input) {\r\n if (typeof it !== 'string') continue;\r\n const v = it.trim();\r\n if (v) list.push(v);\r\n }\r\n }\r\n const uniq = Array.from(new Set(list));\r\n return uniq;\r\n }\r\n\r\n private limitByCurrentNum<T>(list: T[]): T[] {\r\n const cap = this.normalizePositiveInt(this.currentNum, 1);\r\n if (list.length <= cap) return list;\r\n const sliced = list.slice(0, cap);\r\n this.log('channelList truncated by layout', { cap, original: list.length });\r\n return sliced;\r\n }\r\n\r\n private normalizePositiveInt(input: unknown, fallback: number) {\r\n const n = typeof input === 'number' ? input : typeof input === 'string' ? Number(input) : NaN;\r\n if (!Number.isFinite(n) || n <= 0) return fallback;\r\n return Math.floor(n);\r\n }\r\n\r\n playRealVideo(opt: any) {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const channelList = this.normalizeChannelList(opt);\r\n if (!channelList) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'channelList is required for real play',\r\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\r\n });\r\n }\r\n if (typeof this.playerManager.playRealVideo !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'playRealVideo is not available',\r\n userMessage: '当前内核不支持实时预览播放',\r\n });\r\n }\r\n this.log('playRealVideo');\r\n this.playerManager.playRealVideo({ ...(opt ?? {}), channelList });\r\n }\r\n\r\n playRecordVideo(opt: any) {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const channelList = this.normalizeChannelList(opt);\r\n if (!channelList) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'channelList is required for record play',\r\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\r\n });\r\n }\r\n if (typeof this.playerManager.playRecordVideo !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'playRecordVideo is not available',\r\n userMessage: '当前内核不支持录像回放播放',\r\n });\r\n }\r\n this.log('playRecordVideo');\r\n this.playerManager.playRecordVideo({ ...(opt ?? {}), channelList });\r\n }\r\n\r\n setPlayerNum(num: number) {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const v = this.normalizePositiveInt(num, this.currentNum);\r\n const fn = this.playerManager?.setPlayerNum;\r\n if (typeof fn !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'setPlayerNum is not available',\r\n userMessage: '当前内核不支持切换布局路数',\r\n });\r\n }\r\n this.log('setPlayerNum', v);\r\n fn.call(this.playerManager, v);\r\n this.currentNum = v;\r\n }\r\n\r\n jumpPlayByDateTime(datetime: string | Date | number, index?: number) {\r\n if (this.opts.mode !== 'record') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'jumpPlayByDateTime only supports record mode',\r\n userMessage: '实时预览不支持跳转播放',\r\n });\r\n }\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const dt = this.formatDateTime(datetime);\r\n const fn = this.pickMethod(['jumpPlayByDateTime', 'jumpPlayByDatetime']);\r\n if (!fn) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'jumpPlayByDateTime is not available',\r\n userMessage: '当前内核不支持录像跳转播放',\r\n });\r\n }\r\n const idx = typeof index === 'number' ? Math.floor(index) : undefined;\r\n this.log('jumpPlayByDateTime', { dt, index: idx });\r\n fn(dt, idx);\r\n }\r\n\r\n playSpeed(speed: number, index: number) {\r\n if (this.opts.mode !== 'record') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'playSpeed only supports record mode',\r\n userMessage: '实时预览不支持倍速播放',\r\n });\r\n }\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const allowed = new Set([0.125, 0.25, 0.5, 1, 1.25, 1.5, 2, 4, 8]);\r\n if (!allowed.has(speed)) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'invalid speed',\r\n userMessage: '倍速参数不合法',\r\n cause: { speed },\r\n });\r\n }\r\n const idx = this.normalizePositiveInt(index, 0);\r\n const fn = this.playerManager?.playSpeed;\r\n if (typeof fn !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'playSpeed is not available',\r\n userMessage: '当前内核不支持倍速播放',\r\n });\r\n }\r\n this.log('playSpeed', { speed, index: idx });\r\n fn.call(this.playerManager, speed, idx);\r\n }\r\n\r\n setFullScreen() {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const fn = this.playerManager?.setFullScreen;\r\n if (typeof fn !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'setFullScreen is not available',\r\n userMessage: '当前内核不支持全屏',\r\n });\r\n }\r\n this.log('setFullScreen');\r\n fn.call(this.playerManager);\r\n }\r\n\r\n setExitFullScreen() {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const fn = this.playerManager?.setExitFullScreen;\r\n if (typeof fn !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'setExitFullScreen is not available',\r\n userMessage: '当前内核不支持退出全屏',\r\n });\r\n }\r\n this.log('setExitFullScreen');\r\n fn.call(this.playerManager);\r\n }\r\n\r\n callRaw(method: string, ...args: any[]) {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const name = typeof method === 'string' ? method.trim() : '';\r\n if (!name) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'method is required',\r\n userMessage: '缺少 method 参数',\r\n });\r\n }\r\n const fn = (this.playerManager as any)[name];\r\n if (typeof fn !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: `method not found: ${name}`,\r\n userMessage: `底层方法不存在:${name}`,\r\n });\r\n }\r\n this.log('callRaw', name);\r\n return fn.apply(this.playerManager, args);\r\n }\r\n\r\n private pickMethod(names: string[]) {\r\n for (const n of names) {\r\n const fn = (this.playerManager as any)?.[n];\r\n if (typeof fn === 'function') return fn.bind(this.playerManager);\r\n }\r\n return null;\r\n }\r\n\r\n private formatDateTime(input: string | Date | number) {\r\n if (typeof input === 'string') return input.trim();\r\n const d =\r\n typeof input === 'number'\r\n ? new Date(input > 1_000_000_000_000 ? input : input * 1000)\r\n : input instanceof Date\r\n ? input\r\n : new Date(NaN);\r\n if (!Number.isFinite(d.getTime())) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'invalid datetime',\r\n userMessage: '跳转时间格式不合法',\r\n });\r\n }\r\n const pad2 = (n: number) => String(n).padStart(2, '0');\r\n const y = d.getFullYear();\r\n const m = pad2(d.getMonth() + 1);\r\n const day = pad2(d.getDate());\r\n const hh = pad2(d.getHours());\r\n const mm = pad2(d.getMinutes());\r\n const ss = pad2(d.getSeconds());\r\n return `${y}-${m}-${day} ${hh}:${mm}:${ss}`;\r\n }\r\n\r\n pause() {\r\n if (!this.playerManager || this.destroyed) return;\r\n try {\r\n this.log('pause');\r\n if (typeof this.playerManager.pause === 'function') {\r\n this.playerManager.pause(0);\r\n } else if (typeof this.playerManager.close === 'function') {\r\n this.playerManager.close(0);\r\n this.opts.emit('pause');\r\n }\r\n } catch {}\r\n }\r\n\r\n pauseWindow(windowIndex?: number) {\r\n if (!this.playerManager || this.destroyed) return;\r\n try {\r\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\r\n this.log('pauseWindow', idx);\r\n if (typeof this.playerManager.pause === 'function') {\r\n this.playerManager.pause(idx);\r\n } else if (typeof this.playerManager.close === 'function') {\r\n this.playerManager.close(idx);\r\n this.opts.emit('pause');\r\n }\r\n } catch {}\r\n }\r\n\r\n playWindow(windowIndex?: number) {\r\n if (!this.playerManager || this.destroyed) return;\r\n try {\r\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\r\n this.log('playWindow', idx);\r\n if (typeof this.playerManager.play === 'function') {\r\n this.playerManager.play(idx);\r\n }\r\n } catch {}\r\n }\r\n\r\n closeWindow(windowIndex?: number) {\r\n if (!this.playerManager || this.destroyed) return;\r\n try {\r\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\r\n this.log('closeWindow', idx);\r\n if (typeof this.playerManager.close === 'function') {\r\n this.playerManager.close(idx);\r\n }\r\n } catch {}\r\n }\r\n\r\n destroy() {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n this.log('destroy');\r\n\r\n if (this.playerManager) {\r\n try {\r\n this.playerManager.destroy();\r\n } catch {}\r\n this.playerManager = null;\r\n }\r\n }\r\n}\r\n","import type { DahuaPlayerPlaybackTimePayload } from '../types';\n\n/**\n * 从 WSPlayer 的 getVideoFrameInfo 回调 data 中提取“当前回放时间(epoch ms)”。(AI by zb)\n *\n * 规则:\n * - 优先使用 videoFrameInfo.utcTimeStamp(ms)\n * - 若 utcTimeStamp 为整秒(utcTimeStamp % 1000 === 0),且存在 nTimeStamp,则叠加 nTimeStamp % 1000 作为子秒补偿\n * - 若 utcTimeStamp 本身已包含毫秒(%1000 !== 0),则不叠加子秒补偿,避免双计数\n * - 若缺失 utcTimeStamp,则回退到顶层 timeStamp(秒)转换为毫秒\n *\n * @author AI by zb\n */\nexport function extractPlaybackTimeMsFromFrameInfo(data: any): number | null {\n const vf = data && typeof data === 'object' ? (data as any).videoFrameInfo : undefined;\n const utcMsRaw = vf && typeof vf === 'object' ? (vf as any).utcTimeStamp : undefined;\n const secRaw = data && typeof data === 'object' ? (data as any).timeStamp : undefined;\n\n const utcMs = typeof utcMsRaw === 'number' && Number.isFinite(utcMsRaw) ? Math.floor(utcMsRaw) : null;\n const sec = typeof secRaw === 'number' && Number.isFinite(secRaw) ? Math.floor(secRaw) : null;\n\n const baseMs = utcMs != null ? utcMs : sec != null ? sec * 1000 : null;\n if (baseMs == null) return null;\n\n const shouldApplySubMs = utcMs == null ? true : utcMs % 1000 === 0;\n if (!shouldApplySubMs) return baseMs;\n\n const nTimeStampRaw = vf && typeof vf === 'object' ? (vf as any).nTimeStamp : undefined;\n if (typeof nTimeStampRaw !== 'number' || !Number.isFinite(nTimeStampRaw)) return baseMs;\n\n const sub = ((Math.floor(nTimeStampRaw) % 1000) + 1000) % 1000;\n return baseMs + sub;\n}\n\n/**\n * 将 getVideoFrameInfo 回调 data 构造成对外的回放时间 payload。(AI by zb)\n * @author AI by zb\n */\nexport function buildPlaybackTimePayloadFromFrameInfo(data: any): DahuaPlayerPlaybackTimePayload | null {\n const timeMs = extractPlaybackTimeMsFromFrameInfo(data);\n if (timeMs == null) return null;\n\n const secRaw = data && typeof data === 'object' ? (data as any).timeStamp : undefined;\n const timeSec = typeof secRaw === 'number' && Number.isFinite(secRaw) ? Math.floor(secRaw) : Math.floor(timeMs / 1000);\n\n const idxRaw = data && typeof data === 'object' ? (data as any).selectIndex : undefined;\n const windowIndex = typeof idxRaw === 'number' && Number.isFinite(idxRaw) ? Math.floor(idxRaw) : undefined;\n\n const channelCodeRaw = data && typeof data === 'object' ? (data as any).channelData?.channelCode : undefined;\n const channelCode = typeof channelCodeRaw === 'string' ? channelCodeRaw : undefined;\n\n return { timeMs, timeSec, windowIndex, channelCode, raw: data };\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';\nimport { buildPlaybackTimePayloadFromFrameInfo } from './sdk/PlaybackTime';\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 let lastPlaybackTimeMs: number | null = null;\n let lastEmittedPlaybackTimeSec: number | null = null;\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 if (type === 'getVideoFrameInfo') {\n const payload = buildPlaybackTimePayloadFromFrameInfo(data);\n if (!payload) return;\n lastPlaybackTimeMs = payload.timeMs;\n if (payload.timeSec !== lastEmittedPlaybackTimeSec) {\n lastEmittedPlaybackTimeSec = payload.timeSec;\n try {\n opts.onPlaybackTime?.(payload);\n } catch {}\n emit(listeners, 'playbackTime', payload);\n }\n }\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 /**\n * 主动获取最近一次收到的“当前回放时间(epoch ms)”。(AI by zb)\n * @author AI by zb\n */\n const getPlaybackTimeMs = () => lastPlaybackTimeMs;\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 getPlaybackTimeMs,\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.d.cts CHANGED
@@ -7,6 +7,13 @@ type DahuaPlayerAuth = {
7
7
  port?: number;
8
8
  protocol?: 'http' | 'https';
9
9
  };
10
+ type DahuaPlayerPlaybackTimePayload = {
11
+ timeMs: number;
12
+ timeSec: number;
13
+ windowIndex?: number;
14
+ channelCode?: string;
15
+ raw?: unknown;
16
+ };
10
17
  type DahuaPlayerInitOptions = {
11
18
  container: HTMLElement | string;
12
19
  auth: DahuaPlayerAuth;
@@ -64,6 +71,7 @@ type DahuaPlayerInitOptions = {
64
71
  mode?: DahuaPlayerMode;
65
72
  }) => void;
66
73
  onPause?: () => void;
74
+ onPlaybackTime?: (payload: DahuaPlayerPlaybackTimePayload) => void;
67
75
  onError?: (err: unknown) => void;
68
76
  onDestroy?: () => void;
69
77
  onSdkMessage?: (type: string, data: unknown) => void;
@@ -74,6 +82,7 @@ type DahuaPlayerEventMap = {
74
82
  mode?: DahuaPlayerMode;
75
83
  } | void;
76
84
  pause: void;
85
+ playbackTime: DahuaPlayerPlaybackTimePayload;
77
86
  error: unknown;
78
87
  destroy: void;
79
88
  };
@@ -97,6 +106,7 @@ type DahuaPlayerInstance = {
97
106
  id: string;
98
107
  ready: Promise<void>;
99
108
  pause: () => void;
109
+ getPlaybackTimeMs: () => number | null;
100
110
  destroy: () => void;
101
111
  sdk: DahuaPlayerSdkCompat;
102
112
  on: <K extends DahuaPlayerEventName>(event: K, handler: (payload: DahuaPlayerEventMap[K]) => void) => void;
@@ -154,4 +164,4 @@ declare class DahuaPlayerError extends Error {
154
164
  });
155
165
  }
156
166
 
157
- export { DahuaPlayer, DahuaPlayerError, type DahuaPlayerEventMap, type DahuaPlayerEventName, type DahuaPlayerInitOptions, type DahuaPlayerInstance, ErrorCode };
167
+ export { DahuaPlayer, DahuaPlayerError, type DahuaPlayerEventMap, type DahuaPlayerEventName, type DahuaPlayerInitOptions, type DahuaPlayerInstance, type DahuaPlayerPlaybackTimePayload, ErrorCode };
package/dist/index.d.ts CHANGED
@@ -7,6 +7,13 @@ type DahuaPlayerAuth = {
7
7
  port?: number;
8
8
  protocol?: 'http' | 'https';
9
9
  };
10
+ type DahuaPlayerPlaybackTimePayload = {
11
+ timeMs: number;
12
+ timeSec: number;
13
+ windowIndex?: number;
14
+ channelCode?: string;
15
+ raw?: unknown;
16
+ };
10
17
  type DahuaPlayerInitOptions = {
11
18
  container: HTMLElement | string;
12
19
  auth: DahuaPlayerAuth;
@@ -64,6 +71,7 @@ type DahuaPlayerInitOptions = {
64
71
  mode?: DahuaPlayerMode;
65
72
  }) => void;
66
73
  onPause?: () => void;
74
+ onPlaybackTime?: (payload: DahuaPlayerPlaybackTimePayload) => void;
67
75
  onError?: (err: unknown) => void;
68
76
  onDestroy?: () => void;
69
77
  onSdkMessage?: (type: string, data: unknown) => void;
@@ -74,6 +82,7 @@ type DahuaPlayerEventMap = {
74
82
  mode?: DahuaPlayerMode;
75
83
  } | void;
76
84
  pause: void;
85
+ playbackTime: DahuaPlayerPlaybackTimePayload;
77
86
  error: unknown;
78
87
  destroy: void;
79
88
  };
@@ -97,6 +106,7 @@ type DahuaPlayerInstance = {
97
106
  id: string;
98
107
  ready: Promise<void>;
99
108
  pause: () => void;
109
+ getPlaybackTimeMs: () => number | null;
100
110
  destroy: () => void;
101
111
  sdk: DahuaPlayerSdkCompat;
102
112
  on: <K extends DahuaPlayerEventName>(event: K, handler: (payload: DahuaPlayerEventMap[K]) => void) => void;
@@ -154,4 +164,4 @@ declare class DahuaPlayerError extends Error {
154
164
  });
155
165
  }
156
166
 
157
- export { DahuaPlayer, DahuaPlayerError, type DahuaPlayerEventMap, type DahuaPlayerEventName, type DahuaPlayerInitOptions, type DahuaPlayerInstance, ErrorCode };
167
+ export { DahuaPlayer, DahuaPlayerError, type DahuaPlayerEventMap, type DahuaPlayerEventName, type DahuaPlayerInitOptions, type DahuaPlayerInstance, type DahuaPlayerPlaybackTimePayload, ErrorCode };
package/dist/index.js CHANGED
@@ -713,6 +713,35 @@ var PlayerAdapter = class {
713
713
  }
714
714
  };
715
715
 
716
+ // src/sdk/PlaybackTime.ts
717
+ function extractPlaybackTimeMsFromFrameInfo(data) {
718
+ const vf = data && typeof data === "object" ? data.videoFrameInfo : void 0;
719
+ const utcMsRaw = vf && typeof vf === "object" ? vf.utcTimeStamp : void 0;
720
+ const secRaw = data && typeof data === "object" ? data.timeStamp : void 0;
721
+ const utcMs = typeof utcMsRaw === "number" && Number.isFinite(utcMsRaw) ? Math.floor(utcMsRaw) : null;
722
+ const sec = typeof secRaw === "number" && Number.isFinite(secRaw) ? Math.floor(secRaw) : null;
723
+ const baseMs = utcMs != null ? utcMs : sec != null ? sec * 1e3 : null;
724
+ if (baseMs == null) return null;
725
+ const shouldApplySubMs = utcMs == null ? true : utcMs % 1e3 === 0;
726
+ if (!shouldApplySubMs) return baseMs;
727
+ const nTimeStampRaw = vf && typeof vf === "object" ? vf.nTimeStamp : void 0;
728
+ if (typeof nTimeStampRaw !== "number" || !Number.isFinite(nTimeStampRaw)) return baseMs;
729
+ const sub = (Math.floor(nTimeStampRaw) % 1e3 + 1e3) % 1e3;
730
+ return baseMs + sub;
731
+ }
732
+ function buildPlaybackTimePayloadFromFrameInfo(data) {
733
+ var _a;
734
+ const timeMs = extractPlaybackTimeMsFromFrameInfo(data);
735
+ if (timeMs == null) return null;
736
+ const secRaw = data && typeof data === "object" ? data.timeStamp : void 0;
737
+ const timeSec = typeof secRaw === "number" && Number.isFinite(secRaw) ? Math.floor(secRaw) : Math.floor(timeMs / 1e3);
738
+ const idxRaw = data && typeof data === "object" ? data.selectIndex : void 0;
739
+ const windowIndex = typeof idxRaw === "number" && Number.isFinite(idxRaw) ? Math.floor(idxRaw) : void 0;
740
+ const channelCodeRaw = data && typeof data === "object" ? (_a = data.channelData) == null ? void 0 : _a.channelCode : void 0;
741
+ const channelCode = typeof channelCodeRaw === "string" ? channelCodeRaw : void 0;
742
+ return { timeMs, timeSec, windowIndex, channelCode, raw: data };
743
+ }
744
+
716
745
  // src/DahuaPlayer.ts
717
746
  function normalizeStaticPath(path) {
718
747
  const raw = (path || "").trim();
@@ -884,6 +913,8 @@ var DahuaPlayer = class {
884
913
  };
885
914
  let readyReject = () => {
886
915
  };
916
+ let lastPlaybackTimeMs = null;
917
+ let lastEmittedPlaybackTimeSec = null;
887
918
  const safeOnError = (e) => {
888
919
  var _a2;
889
920
  try {
@@ -965,11 +996,24 @@ var DahuaPlayer = class {
965
996
  playerOptions: opts.playerOptions,
966
997
  debug: opts.debug,
967
998
  onMessage: (type, data) => {
968
- var _a3;
999
+ var _a3, _b2;
969
1000
  try {
970
1001
  (_a3 = opts.onSdkMessage) == null ? void 0 : _a3.call(opts, type, data);
971
1002
  } catch {
972
1003
  }
1004
+ if (type === "getVideoFrameInfo") {
1005
+ const payload = buildPlaybackTimePayloadFromFrameInfo(data);
1006
+ if (!payload) return;
1007
+ lastPlaybackTimeMs = payload.timeMs;
1008
+ if (payload.timeSec !== lastEmittedPlaybackTimeSec) {
1009
+ lastEmittedPlaybackTimeSec = payload.timeSec;
1010
+ try {
1011
+ (_b2 = opts.onPlaybackTime) == null ? void 0 : _b2.call(opts, payload);
1012
+ } catch {
1013
+ }
1014
+ emit(listeners, "playbackTime", payload);
1015
+ }
1016
+ }
973
1017
  },
974
1018
  emit: (event, payload) => {
975
1019
  var _a3, _b2, _c2;
@@ -1037,6 +1081,7 @@ var DahuaPlayer = class {
1037
1081
  readyReject(err);
1038
1082
  }
1039
1083
  })();
1084
+ const getPlaybackTimeMs = () => lastPlaybackTimeMs;
1040
1085
  const instance = {
1041
1086
  id,
1042
1087
  ready,
@@ -1049,6 +1094,7 @@ var DahuaPlayer = class {
1049
1094
  if (!adapter) return;
1050
1095
  adapter.pause();
1051
1096
  },
1097
+ getPlaybackTimeMs,
1052
1098
  /**
1053
1099
  * 销毁播放器实例并释放资源。
1054
1100
  *
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 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"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/sdk/SdkLoader.ts","../src/sdk/TokenVault.ts","../src/sdk/SelfTargetOriginShim.ts","../src/sdk/PlayerAdapter.ts","../src/sdk/PlaybackTime.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';\r\nimport type { DahuaPlayerMode, DahuaPlayerPlayerOptions } from '../types';\r\n\r\ntype ReceiveFn = (type: string, data: any) => void;\r\n\r\ntype PlayerAdapterOptions = {\r\n containerId: string;\r\n staticPath: string;\r\n mode: DahuaPlayerMode;\r\n cameraId?: string;\r\n cameraIds?: string[];\r\n streamType: 1 | 2 | 3;\r\n searchOnline: boolean;\r\n useNginxProxy?: boolean;\r\n nginxProxyHost?: string;\r\n useWSS?: boolean;\r\n num?: number;\r\n maxNum?: number;\r\n showRecordProgressBar?: boolean;\r\n playerOptions?: DahuaPlayerPlayerOptions;\r\n debug?: boolean;\r\n onMessage?: ReceiveFn;\r\n emit: (event: 'ready' | 'play' | 'pause' | 'error', payload?: any) => void;\r\n};\r\n\r\nexport class PlayerAdapter {\r\n private opts: PlayerAdapterOptions;\r\n private playerManager: any | null = null;\r\n private destroyed = false;\r\n private readyResolved = false;\r\n private lastStatus: string | null = null;\r\n private currentNum = 1;\r\n private currentMaxNum = 1;\r\n\r\n constructor(opts: PlayerAdapterOptions) {\r\n this.opts = opts;\r\n }\r\n\r\n getRaw() {\r\n return this.playerManager;\r\n }\r\n\r\n init() {\r\n if (this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const PM = (window as any).PlayerManager;\r\n if (typeof PM !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.SDK_INIT_FAILED,\r\n message: 'PlayerManager is not available',\r\n userMessage: '播放器内核未加载',\r\n });\r\n }\r\n\r\n const userReceive = this.opts.onMessage;\r\n const showRecordProgressBar =\r\n typeof this.opts.showRecordProgressBar === 'boolean'\r\n ? this.opts.showRecordProgressBar\r\n : this.opts.mode === 'record';\r\n const initialNum = this.normalizePositiveInt(\r\n this.opts.num ?? (this.opts.playerOptions as any)?.num ?? 1,\r\n 1,\r\n );\r\n const initialMaxNum = this.normalizePositiveInt(\r\n this.opts.maxNum ?? (this.opts.playerOptions as any)?.maxNum ?? initialNum,\r\n initialNum,\r\n );\r\n const defaultOptions: Record<string, unknown> = {\r\n type: this.opts.mode,\r\n num: initialNum,\r\n maxNum: initialMaxNum,\r\n showControl: false,\r\n showIcons: { hidden: true },\r\n showRecordProgressBar,\r\n useNginxProxy: this.opts.useNginxProxy ?? false,\r\n nginxProxyHost: this.opts.nginxProxyHost ?? '',\r\n useWSS: this.opts.useWSS ?? false,\r\n };\r\n const merged = {\r\n ...defaultOptions,\r\n ...(this.opts.playerOptions ?? {}),\r\n el: this.opts.containerId,\r\n STATIC_PATH: this.opts.staticPath,\r\n receiveMessageFromWSPlayer: (type: string, data: any) => {\r\n if (this.destroyed) return;\r\n\r\n try {\r\n userReceive?.(type, data);\r\n } catch {}\r\n\r\n this.handleSdkMessage(type, data);\r\n },\r\n };\r\n this.playerManager = new PM(merged);\r\n this.currentNum = this.normalizePositiveInt((merged as any).num, 1);\r\n this.currentMaxNum = this.normalizePositiveInt((merged as any).maxNum, this.currentNum);\r\n }\r\n\r\n private log(...args: any[]) {\r\n if (!this.opts.debug) return;\r\n try {\r\n console.log('[dahua-player]', ...args);\r\n } catch {}\r\n }\r\n\r\n private summarizeSdkMessage(type: string, data: any) {\r\n if (type === 'statusChanged') {\r\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\r\n return { status };\r\n }\r\n if (type === 'realError' || type === 'recordError') {\r\n const reason = data && typeof data === 'object' ? (data as any).reason : undefined;\r\n return { reason };\r\n }\r\n if (type === 'errorInfo') {\r\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\r\n const code = data && typeof data === 'object' ? (data as any).code : undefined;\r\n return { status, code };\r\n }\r\n return undefined;\r\n }\r\n\r\n private handleSdkMessage(type: string, data: any) {\r\n this.log('sdk', type, this.summarizeSdkMessage(type, data));\r\n switch (type) {\r\n case 'initializationCompleted': {\r\n if (!this.readyResolved) {\r\n this.readyResolved = true;\r\n this.opts.emit('ready');\r\n }\r\n return;\r\n }\r\n case 'realSuccess': {\r\n this.opts.emit('play', { mode: 'real' });\r\n return;\r\n }\r\n case 'recordSuccess': {\r\n this.opts.emit('play', { mode: 'record' });\r\n return;\r\n }\r\n case 'statusChanged': {\r\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\r\n if (typeof status === 'string' && status && status !== this.lastStatus) {\r\n this.lastStatus = status;\r\n if (status === 'pause' || status === 'paused') {\r\n this.opts.emit('pause');\r\n return;\r\n }\r\n if (status === 'playing') {\r\n this.opts.emit('play', { mode: this.opts.mode });\r\n return;\r\n }\r\n }\r\n return;\r\n }\r\n case 'windowNumChanged': {\r\n const n =\r\n typeof data === 'number'\r\n ? data\r\n : data && typeof data === 'object'\r\n ? ((data as any).num ?? (data as any).number ?? (data as any).windowNum)\r\n : undefined;\r\n const v = this.normalizePositiveInt(n, this.currentNum);\r\n this.currentNum = v;\r\n return;\r\n }\r\n case 'realError': {\r\n this.opts.emit(\r\n 'error',\r\n new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'Real play failed',\r\n userMessage: '实时预览失败',\r\n cause: data,\r\n }),\r\n );\r\n return;\r\n }\r\n case 'recordError': {\r\n this.opts.emit(\r\n 'error',\r\n new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'Record play failed',\r\n userMessage: '录像回放失败',\r\n cause: data,\r\n }),\r\n );\r\n return;\r\n }\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n private normalizeChannelList(opt: any) {\r\n const fromOpt = opt && typeof opt === 'object' ? (opt as any).channelList : undefined;\r\n if (Array.isArray(fromOpt) && fromOpt.length > 0) return this.limitByCurrentNum(fromOpt);\r\n\r\n const idsFromOpt = this.normalizeCameraIds(\r\n opt && typeof opt === 'object' ? ((opt as any).cameraIds ?? (opt as any).cameraId) : undefined,\r\n );\r\n if (idsFromOpt.length > 0) return this.limitByCurrentNum(idsFromOpt.map((id) => ({ channelCode: id })));\r\n\r\n const initIds = this.normalizeCameraIds(this.opts.cameraIds);\r\n if (initIds.length > 0) return this.limitByCurrentNum(initIds.map((id) => ({ channelCode: id })));\r\n if (this.opts.cameraId) return [{ channelCode: this.opts.cameraId }];\r\n return null;\r\n }\r\n\r\n private normalizeCameraIds(input: unknown): string[] {\r\n const list: string[] = [];\r\n if (typeof input === 'string') {\r\n const v = input.trim();\r\n if (v) list.push(v);\r\n } else if (Array.isArray(input)) {\r\n for (const it of input) {\r\n if (typeof it !== 'string') continue;\r\n const v = it.trim();\r\n if (v) list.push(v);\r\n }\r\n }\r\n const uniq = Array.from(new Set(list));\r\n return uniq;\r\n }\r\n\r\n private limitByCurrentNum<T>(list: T[]): T[] {\r\n const cap = this.normalizePositiveInt(this.currentNum, 1);\r\n if (list.length <= cap) return list;\r\n const sliced = list.slice(0, cap);\r\n this.log('channelList truncated by layout', { cap, original: list.length });\r\n return sliced;\r\n }\r\n\r\n private normalizePositiveInt(input: unknown, fallback: number) {\r\n const n = typeof input === 'number' ? input : typeof input === 'string' ? Number(input) : NaN;\r\n if (!Number.isFinite(n) || n <= 0) return fallback;\r\n return Math.floor(n);\r\n }\r\n\r\n playRealVideo(opt: any) {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const channelList = this.normalizeChannelList(opt);\r\n if (!channelList) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'channelList is required for real play',\r\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\r\n });\r\n }\r\n if (typeof this.playerManager.playRealVideo !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'playRealVideo is not available',\r\n userMessage: '当前内核不支持实时预览播放',\r\n });\r\n }\r\n this.log('playRealVideo');\r\n this.playerManager.playRealVideo({ ...(opt ?? {}), channelList });\r\n }\r\n\r\n playRecordVideo(opt: any) {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const channelList = this.normalizeChannelList(opt);\r\n if (!channelList) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'channelList is required for record play',\r\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\r\n });\r\n }\r\n if (typeof this.playerManager.playRecordVideo !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'playRecordVideo is not available',\r\n userMessage: '当前内核不支持录像回放播放',\r\n });\r\n }\r\n this.log('playRecordVideo');\r\n this.playerManager.playRecordVideo({ ...(opt ?? {}), channelList });\r\n }\r\n\r\n setPlayerNum(num: number) {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const v = this.normalizePositiveInt(num, this.currentNum);\r\n const fn = this.playerManager?.setPlayerNum;\r\n if (typeof fn !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'setPlayerNum is not available',\r\n userMessage: '当前内核不支持切换布局路数',\r\n });\r\n }\r\n this.log('setPlayerNum', v);\r\n fn.call(this.playerManager, v);\r\n this.currentNum = v;\r\n }\r\n\r\n jumpPlayByDateTime(datetime: string | Date | number, index?: number) {\r\n if (this.opts.mode !== 'record') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'jumpPlayByDateTime only supports record mode',\r\n userMessage: '实时预览不支持跳转播放',\r\n });\r\n }\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const dt = this.formatDateTime(datetime);\r\n const fn = this.pickMethod(['jumpPlayByDateTime', 'jumpPlayByDatetime']);\r\n if (!fn) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'jumpPlayByDateTime is not available',\r\n userMessage: '当前内核不支持录像跳转播放',\r\n });\r\n }\r\n const idx = typeof index === 'number' ? Math.floor(index) : undefined;\r\n this.log('jumpPlayByDateTime', { dt, index: idx });\r\n fn(dt, idx);\r\n }\r\n\r\n playSpeed(speed: number, index: number) {\r\n if (this.opts.mode !== 'record') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'playSpeed only supports record mode',\r\n userMessage: '实时预览不支持倍速播放',\r\n });\r\n }\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const allowed = new Set([0.125, 0.25, 0.5, 1, 1.25, 1.5, 2, 4, 8]);\r\n if (!allowed.has(speed)) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'invalid speed',\r\n userMessage: '倍速参数不合法',\r\n cause: { speed },\r\n });\r\n }\r\n const idx = this.normalizePositiveInt(index, 0);\r\n const fn = this.playerManager?.playSpeed;\r\n if (typeof fn !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'playSpeed is not available',\r\n userMessage: '当前内核不支持倍速播放',\r\n });\r\n }\r\n this.log('playSpeed', { speed, index: idx });\r\n fn.call(this.playerManager, speed, idx);\r\n }\r\n\r\n setFullScreen() {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const fn = this.playerManager?.setFullScreen;\r\n if (typeof fn !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'setFullScreen is not available',\r\n userMessage: '当前内核不支持全屏',\r\n });\r\n }\r\n this.log('setFullScreen');\r\n fn.call(this.playerManager);\r\n }\r\n\r\n setExitFullScreen() {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const fn = this.playerManager?.setExitFullScreen;\r\n if (typeof fn !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'setExitFullScreen is not available',\r\n userMessage: '当前内核不支持退出全屏',\r\n });\r\n }\r\n this.log('setExitFullScreen');\r\n fn.call(this.playerManager);\r\n }\r\n\r\n callRaw(method: string, ...args: any[]) {\r\n if (!this.playerManager || this.destroyed) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.DESTROYED,\r\n message: 'Player destroyed',\r\n userMessage: '播放器已销毁',\r\n });\r\n }\r\n const name = typeof method === 'string' ? method.trim() : '';\r\n if (!name) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'method is required',\r\n userMessage: '缺少 method 参数',\r\n });\r\n }\r\n const fn = (this.playerManager as any)[name];\r\n if (typeof fn !== 'function') {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: `method not found: ${name}`,\r\n userMessage: `底层方法不存在:${name}`,\r\n });\r\n }\r\n this.log('callRaw', name);\r\n return fn.apply(this.playerManager, args);\r\n }\r\n\r\n private pickMethod(names: string[]) {\r\n for (const n of names) {\r\n const fn = (this.playerManager as any)?.[n];\r\n if (typeof fn === 'function') return fn.bind(this.playerManager);\r\n }\r\n return null;\r\n }\r\n\r\n private formatDateTime(input: string | Date | number) {\r\n if (typeof input === 'string') return input.trim();\r\n const d =\r\n typeof input === 'number'\r\n ? new Date(input > 1_000_000_000_000 ? input : input * 1000)\r\n : input instanceof Date\r\n ? input\r\n : new Date(NaN);\r\n if (!Number.isFinite(d.getTime())) {\r\n throw new DahuaPlayerError({\r\n code: ErrorCode.PLAY_FAILED,\r\n message: 'invalid datetime',\r\n userMessage: '跳转时间格式不合法',\r\n });\r\n }\r\n const pad2 = (n: number) => String(n).padStart(2, '0');\r\n const y = d.getFullYear();\r\n const m = pad2(d.getMonth() + 1);\r\n const day = pad2(d.getDate());\r\n const hh = pad2(d.getHours());\r\n const mm = pad2(d.getMinutes());\r\n const ss = pad2(d.getSeconds());\r\n return `${y}-${m}-${day} ${hh}:${mm}:${ss}`;\r\n }\r\n\r\n pause() {\r\n if (!this.playerManager || this.destroyed) return;\r\n try {\r\n this.log('pause');\r\n if (typeof this.playerManager.pause === 'function') {\r\n this.playerManager.pause(0);\r\n } else if (typeof this.playerManager.close === 'function') {\r\n this.playerManager.close(0);\r\n this.opts.emit('pause');\r\n }\r\n } catch {}\r\n }\r\n\r\n pauseWindow(windowIndex?: number) {\r\n if (!this.playerManager || this.destroyed) return;\r\n try {\r\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\r\n this.log('pauseWindow', idx);\r\n if (typeof this.playerManager.pause === 'function') {\r\n this.playerManager.pause(idx);\r\n } else if (typeof this.playerManager.close === 'function') {\r\n this.playerManager.close(idx);\r\n this.opts.emit('pause');\r\n }\r\n } catch {}\r\n }\r\n\r\n playWindow(windowIndex?: number) {\r\n if (!this.playerManager || this.destroyed) return;\r\n try {\r\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\r\n this.log('playWindow', idx);\r\n if (typeof this.playerManager.play === 'function') {\r\n this.playerManager.play(idx);\r\n }\r\n } catch {}\r\n }\r\n\r\n closeWindow(windowIndex?: number) {\r\n if (!this.playerManager || this.destroyed) return;\r\n try {\r\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\r\n this.log('closeWindow', idx);\r\n if (typeof this.playerManager.close === 'function') {\r\n this.playerManager.close(idx);\r\n }\r\n } catch {}\r\n }\r\n\r\n destroy() {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n this.log('destroy');\r\n\r\n if (this.playerManager) {\r\n try {\r\n this.playerManager.destroy();\r\n } catch {}\r\n this.playerManager = null;\r\n }\r\n }\r\n}\r\n","import type { DahuaPlayerPlaybackTimePayload } from '../types';\n\n/**\n * 从 WSPlayer 的 getVideoFrameInfo 回调 data 中提取“当前回放时间(epoch ms)”。(AI by zb)\n *\n * 规则:\n * - 优先使用 videoFrameInfo.utcTimeStamp(ms)\n * - 若 utcTimeStamp 为整秒(utcTimeStamp % 1000 === 0),且存在 nTimeStamp,则叠加 nTimeStamp % 1000 作为子秒补偿\n * - 若 utcTimeStamp 本身已包含毫秒(%1000 !== 0),则不叠加子秒补偿,避免双计数\n * - 若缺失 utcTimeStamp,则回退到顶层 timeStamp(秒)转换为毫秒\n *\n * @author AI by zb\n */\nexport function extractPlaybackTimeMsFromFrameInfo(data: any): number | null {\n const vf = data && typeof data === 'object' ? (data as any).videoFrameInfo : undefined;\n const utcMsRaw = vf && typeof vf === 'object' ? (vf as any).utcTimeStamp : undefined;\n const secRaw = data && typeof data === 'object' ? (data as any).timeStamp : undefined;\n\n const utcMs = typeof utcMsRaw === 'number' && Number.isFinite(utcMsRaw) ? Math.floor(utcMsRaw) : null;\n const sec = typeof secRaw === 'number' && Number.isFinite(secRaw) ? Math.floor(secRaw) : null;\n\n const baseMs = utcMs != null ? utcMs : sec != null ? sec * 1000 : null;\n if (baseMs == null) return null;\n\n const shouldApplySubMs = utcMs == null ? true : utcMs % 1000 === 0;\n if (!shouldApplySubMs) return baseMs;\n\n const nTimeStampRaw = vf && typeof vf === 'object' ? (vf as any).nTimeStamp : undefined;\n if (typeof nTimeStampRaw !== 'number' || !Number.isFinite(nTimeStampRaw)) return baseMs;\n\n const sub = ((Math.floor(nTimeStampRaw) % 1000) + 1000) % 1000;\n return baseMs + sub;\n}\n\n/**\n * 将 getVideoFrameInfo 回调 data 构造成对外的回放时间 payload。(AI by zb)\n * @author AI by zb\n */\nexport function buildPlaybackTimePayloadFromFrameInfo(data: any): DahuaPlayerPlaybackTimePayload | null {\n const timeMs = extractPlaybackTimeMsFromFrameInfo(data);\n if (timeMs == null) return null;\n\n const secRaw = data && typeof data === 'object' ? (data as any).timeStamp : undefined;\n const timeSec = typeof secRaw === 'number' && Number.isFinite(secRaw) ? Math.floor(secRaw) : Math.floor(timeMs / 1000);\n\n const idxRaw = data && typeof data === 'object' ? (data as any).selectIndex : undefined;\n const windowIndex = typeof idxRaw === 'number' && Number.isFinite(idxRaw) ? Math.floor(idxRaw) : undefined;\n\n const channelCodeRaw = data && typeof data === 'object' ? (data as any).channelData?.channelCode : undefined;\n const channelCode = typeof channelCodeRaw === 'string' ? channelCodeRaw : undefined;\n\n return { timeMs, timeSec, windowIndex, channelCode, raw: data };\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';\nimport { buildPlaybackTimePayloadFromFrameInfo } from './sdk/PlaybackTime';\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 let lastPlaybackTimeMs: number | null = null;\n let lastEmittedPlaybackTimeSec: number | null = null;\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 if (type === 'getVideoFrameInfo') {\n const payload = buildPlaybackTimePayloadFromFrameInfo(data);\n if (!payload) return;\n lastPlaybackTimeMs = payload.timeMs;\n if (payload.timeSec !== lastEmittedPlaybackTimeSec) {\n lastEmittedPlaybackTimeSec = payload.timeSec;\n try {\n opts.onPlaybackTime?.(payload);\n } catch {}\n emit(listeners, 'playbackTime', payload);\n }\n }\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 /**\n * 主动获取最近一次收到的“当前回放时间(epoch ms)”。(AI by zb)\n * @author AI by zb\n */\n const getPlaybackTimeMs = () => lastPlaybackTimeMs;\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 getPlaybackTimeMs,\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.3",
3
+ "version": "0.1.4",
4
4
  "description": "Dahua WSPlayer wrapper for browser apps",
5
5
  "type": "module",
6
6
  "sideEffects": false,