@video-supply/dahua-player 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE +1 -0
- package/README.md +192 -0
- package/README.zh-CN.md +202 -0
- package/dist/bin/copy-assets.cjs +51 -0
- package/dist/bin/copy-assets.cjs.map +1 -0
- package/dist/index.cjs +1447 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +157 -0
- package/dist/index.d.ts +157 -0
- package/dist/index.js +1418 -0
- package/dist/index.js.map +1 -0
- package/package.json +55 -0
- package/wsplayer-gov/Version.xml +4 -0
- package/wsplayer-gov/WSPlayer/PlaySDKInterface.js +1 -0
- package/wsplayer-gov/WSPlayer/WSPlayer.js +1 -0
- package/wsplayer-gov/WSPlayer/audioTalkWorker.js +1 -0
- package/wsplayer-gov/WSPlayer/commonThread/libH264Enc.js +21 -0
- package/wsplayer-gov/WSPlayer/commonThread/libH264Enc.wasm +0 -0
- package/wsplayer-gov/WSPlayer/commonThread/libIVSDrawer.js +21 -0
- package/wsplayer-gov/WSPlayer/commonThread/libIVSDrawer.wasm +0 -0
- package/wsplayer-gov/WSPlayer/commonThread/libRenderEngine.js +21 -0
- package/wsplayer-gov/WSPlayer/commonThread/libRenderEngine.wasm +0 -0
- package/wsplayer-gov/WSPlayer/commonThread/libmavasp_litepacket.data +50 -0
- package/wsplayer-gov/WSPlayer/commonThread/libmavasp_litepacket.js +21 -0
- package/wsplayer-gov/WSPlayer/commonThread/libmavasp_litepacket.wasm +0 -0
- package/wsplayer-gov/WSPlayer/icon/RecordHover.svg +13 -0
- package/wsplayer-gov/WSPlayer/icon/RecordNormal.svg +13 -0
- package/wsplayer-gov/WSPlayer/icon/Recording.svg +15 -0
- package/wsplayer-gov/WSPlayer/icon/arrow-b.svg +9 -0
- package/wsplayer-gov/WSPlayer/icon/arrow-l.svg +9 -0
- package/wsplayer-gov/WSPlayer/icon/arrow-lb.svg +10 -0
- package/wsplayer-gov/WSPlayer/icon/arrow-lt.svg +10 -0
- package/wsplayer-gov/WSPlayer/icon/arrow-r.svg +9 -0
- package/wsplayer-gov/WSPlayer/icon/arrow-rb.svg +10 -0
- package/wsplayer-gov/WSPlayer/icon/arrow-rt.svg +10 -0
- package/wsplayer-gov/WSPlayer/icon/arrow-t.svg +9 -0
- package/wsplayer-gov/WSPlayer/icon/close-all-hover.svg +18 -0
- package/wsplayer-gov/WSPlayer/icon/close-all.svg +18 -0
- package/wsplayer-gov/WSPlayer/icon/close.svg +16 -0
- package/wsplayer-gov/WSPlayer/icon/close_hover.svg +16 -0
- package/wsplayer-gov/WSPlayer/icon/default.png +0 -0
- package/wsplayer-gov/WSPlayer/icon/draw-triangle_off.svg +14 -0
- package/wsplayer-gov/WSPlayer/icon/draw-triangle_off_hover.svg +14 -0
- package/wsplayer-gov/WSPlayer/icon/draw-triangle_on.svg +15 -0
- package/wsplayer-gov/WSPlayer/icon/draw-triangle_on_hover.svg +15 -0
- package/wsplayer-gov/WSPlayer/icon/fullscreen-hover.svg +13 -0
- package/wsplayer-gov/WSPlayer/icon/fullscreen.svg +13 -0
- package/wsplayer-gov/WSPlayer/icon/more.svg +13 -0
- package/wsplayer-gov/WSPlayer/icon/play-h.png +0 -0
- package/wsplayer-gov/WSPlayer/icon/play-n.png +0 -0
- package/wsplayer-gov/WSPlayer/icon/play-p.png +0 -0
- package/wsplayer-gov/WSPlayer/icon/ptz-icon1.svg +4 -0
- package/wsplayer-gov/WSPlayer/icon/ptz-icon2.svg +13 -0
- package/wsplayer-gov/WSPlayer/icon/ptz-icon3.svg +10 -0
- package/wsplayer-gov/WSPlayer/icon/ptz-icon4.svg +10 -0
- package/wsplayer-gov/WSPlayer/icon/ptz-icon5.svg +12 -0
- package/wsplayer-gov/WSPlayer/icon/ptz-icon6.svg +14 -0
- package/wsplayer-gov/WSPlayer/icon/ptz-select-hover.svg +3 -0
- package/wsplayer-gov/WSPlayer/icon/ptz-select.svg +3 -0
- package/wsplayer-gov/WSPlayer/icon/record_pause.svg +5 -0
- package/wsplayer-gov/WSPlayer/icon/record_play.svg +5 -0
- package/wsplayer-gov/WSPlayer/icon/screen_1.svg +11 -0
- package/wsplayer-gov/WSPlayer/icon/screen_16.svg +18 -0
- package/wsplayer-gov/WSPlayer/icon/screen_16_hover.svg +18 -0
- package/wsplayer-gov/WSPlayer/icon/screen_1_hover.svg +11 -0
- package/wsplayer-gov/WSPlayer/icon/screen_2.svg +18 -0
- package/wsplayer-gov/WSPlayer/icon/screen_25.svg +19 -0
- package/wsplayer-gov/WSPlayer/icon/screen_25_hover.svg +19 -0
- package/wsplayer-gov/WSPlayer/icon/screen_2_hover.svg +18 -0
- package/wsplayer-gov/WSPlayer/icon/screen_3.svg +13 -0
- package/wsplayer-gov/WSPlayer/icon/screen_3_hover.svg +13 -0
- package/wsplayer-gov/WSPlayer/icon/screen_4.svg +12 -0
- package/wsplayer-gov/WSPlayer/icon/screen_4_hover.svg +12 -0
- package/wsplayer-gov/WSPlayer/icon/screen_6.svg +16 -0
- package/wsplayer-gov/WSPlayer/icon/screen_6_hover.svg +16 -0
- package/wsplayer-gov/WSPlayer/icon/screen_8.svg +18 -0
- package/wsplayer-gov/WSPlayer/icon/screen_8_hover.svg +18 -0
- package/wsplayer-gov/WSPlayer/icon/screen_9.svg +17 -0
- package/wsplayer-gov/WSPlayer/icon/screen_9_hover.svg +17 -0
- package/wsplayer-gov/WSPlayer/icon/screen_custom_division.svg +9 -0
- package/wsplayer-gov/WSPlayer/icon/screen_custom_division_hover.svg +9 -0
- package/wsplayer-gov/WSPlayer/icon/screen_custom_division_merge.svg +3 -0
- package/wsplayer-gov/WSPlayer/icon/screen_custom_division_split.svg +6 -0
- package/wsplayer-gov/WSPlayer/icon/screen_more.svg +15 -0
- package/wsplayer-gov/WSPlayer/icon/snapshot.svg +38 -0
- package/wsplayer-gov/WSPlayer/icon/snapshot_hover.svg +38 -0
- package/wsplayer-gov/WSPlayer/icon/speed_left.svg +15 -0
- package/wsplayer-gov/WSPlayer/icon/speed_right.svg +15 -0
- package/wsplayer-gov/WSPlayer/icon/spread.png +0 -0
- package/wsplayer-gov/WSPlayer/icon/talk-off-hover.svg +11 -0
- package/wsplayer-gov/WSPlayer/icon/talk-off.svg +11 -0
- package/wsplayer-gov/WSPlayer/icon/talk-on.svg +9 -0
- package/wsplayer-gov/WSPlayer/icon/voice-have.svg +43 -0
- package/wsplayer-gov/WSPlayer/icon/voice-have_hover.svg +43 -0
- package/wsplayer-gov/WSPlayer/icon/voice-null.svg +38 -0
- package/wsplayer-gov/WSPlayer/icon/voice-null_hover.svg +38 -0
- package/wsplayer-gov/WSPlayer/icon/ws-ctrl-ellipsis-hover.svg +14 -0
- package/wsplayer-gov/WSPlayer/icon/ws-ctrl-ellipsis.svg +14 -0
- package/wsplayer-gov/WSPlayer/locale/lang/en_US.js +123 -0
- package/wsplayer-gov/WSPlayer/locale/lang/zh_CN.js +124 -0
- package/wsplayer-gov/WSPlayer/locale/localProvider.js +7 -0
- package/wsplayer-gov/WSPlayer/locale/locale.js +34 -0
- package/wsplayer-gov/WSPlayer/multiThread/libStreamClient.js +21 -0
- package/wsplayer-gov/WSPlayer/multiThread/libStreamClient.wasm +0 -0
- package/wsplayer-gov/WSPlayer/multiThread/libStreamClient.worker.js +1 -0
- package/wsplayer-gov/WSPlayer/multiThread/libplay.data +0 -0
- package/wsplayer-gov/WSPlayer/multiThread/libplay.js +1 -0
- package/wsplayer-gov/WSPlayer/multiThread/libplay.wasm +0 -0
- package/wsplayer-gov/WSPlayer/multiThread/libplay.worker.js +1 -0
- package/wsplayer-gov/WSPlayer/player.css +1098 -0
- package/wsplayer-gov/WSPlayer/singleThread/VideoDecodeWorker.js +1245 -0
- package/wsplayer-gov/WSPlayer/singleThread/libStreamClient.js +21 -0
- package/wsplayer-gov/WSPlayer/singleThread/libStreamClient.wasm +0 -0
- package/wsplayer-gov/WSPlayer/singleThread/libplay.data +0 -0
- package/wsplayer-gov/WSPlayer/singleThread/libplay.js +1 -0
- package/wsplayer-gov/WSPlayer/singleThread/libplay.wasm +0 -0
- package/wsplayer-gov/WSPlayer/window.division.css +80 -0
- package/wsplayer-gov/wsplayer.min.js +6 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/sdk/SdkLoader.ts","../src/sdk/TokenVault.ts","../src/sdk/SelfTargetOriginShim.ts","../src/sdk/PlayerAdapter.ts","../src/DahuaPlayer.ts"],"sourcesContent":["export { DahuaPlayer } from './DahuaPlayer';\nexport { ErrorCode, DahuaPlayerError } from './errors';\nexport type { DahuaPlayerInitOptions, DahuaPlayerInstance, DahuaPlayerEventMap, DahuaPlayerEventName } from './types';\n\n","export enum ErrorCode {\n CONTAINER_NOT_FOUND = 'CONTAINER_NOT_FOUND',\n INVALID_TOKEN = 'INVALID_TOKEN',\n SDK_LOAD_FAILED = 'SDK_LOAD_FAILED',\n SDK_LOAD_TIMEOUT = 'SDK_LOAD_TIMEOUT',\n SDK_INIT_FAILED = 'SDK_INIT_FAILED',\n PLAY_FAILED = 'PLAY_FAILED',\n NETWORK_DISCONNECTED = 'NETWORK_DISCONNECTED',\n DESTROYED = 'DESTROYED',\n}\n\nexport class DahuaPlayerError extends Error {\n code: ErrorCode;\n userMessage: string;\n cause?: unknown;\n\n constructor(params: { code: ErrorCode; message: string; userMessage: string; cause?: unknown }) {\n super(params.message);\n this.name = 'DahuaPlayerError';\n this.code = params.code;\n this.userMessage = params.userMessage;\n this.cause = params.cause;\n }\n}\n\nexport function toDahuaError(e: unknown, fallback: { code: ErrorCode; message: string; userMessage: string }) {\n if (e instanceof DahuaPlayerError) return e;\n const cause = e;\n return new DahuaPlayerError({ ...fallback, cause });\n}\n","type LoadScriptType = 'module' | 'text/javascript';\n\ntype SdkLoaderState = {\n scripts: Map<string, Promise<void>>;\n styles: Map<string, Promise<void>>;\n};\n\nconst state: SdkLoaderState = {\n scripts: new Map(),\n styles: new Map(),\n};\n\nfunction loadStyleOnce(href: string): Promise<void> {\n const url = href.trim();\n if (!url) return Promise.resolve();\n const existing = state.styles.get(url);\n if (existing) return existing;\n\n const p = new Promise<void>((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n link.onload = () => resolve();\n link.onerror = (e) => reject(e);\n document.head.appendChild(link);\n });\n\n state.styles.set(url, p);\n return p;\n}\n\nfunction loadScriptOnce(src: string, type: LoadScriptType): Promise<void> {\n const url = src.trim();\n if (!url) return Promise.resolve();\n const existing = state.scripts.get(url);\n if (existing) return existing;\n\n const p = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.type = type;\n script.src = url;\n script.onload = () => resolve();\n script.onerror = (e) => reject(e);\n document.head.appendChild(script);\n });\n\n state.scripts.set(url, p);\n return p;\n}\n\nfunction waitFor<T>(fn: () => T | null | undefined, timeoutMs: number): Promise<T> {\n const start = Date.now();\n return new Promise<T>((resolve, reject) => {\n const tick = () => {\n try {\n const v = fn();\n if (v) return resolve(v);\n } catch {}\n if (Date.now() - start >= timeoutMs) return reject(new Error('timeout'));\n setTimeout(tick, 50);\n };\n tick();\n });\n}\n\nexport async function ensureDahuaSdkLoaded(opts: { sdkUrl: string; cssUrl?: string; timeoutMs?: number }) {\n const sdkUrl = opts.sdkUrl;\n const cssUrl = opts.cssUrl;\n const timeoutMs = opts.timeoutMs ?? 20_000;\n\n if (cssUrl) {\n try {\n await loadStyleOnce(cssUrl);\n } catch {}\n }\n\n await loadScriptOnce(sdkUrl, 'module').catch(async () => {\n await loadScriptOnce(sdkUrl, 'text/javascript');\n });\n\n const PlayerManager = await waitFor(\n () => (window as any).PlayerManager as unknown,\n timeoutMs,\n );\n\n if (typeof PlayerManager !== 'function') {\n throw new Error('PlayerManager not available after SDK load');\n }\n}\n\n","type TokenShimState = {\n refCount: number;\n token: string | null;\n};\n\nconst state: TokenShimState = {\n refCount: 0,\n token: null,\n};\n\n/**\n * 将 token 同步到 sessionStorage。\n *\n * 背景:wsplayer 内部会从 `sessionStorage[tokenStorageKey] || localStorage[tokenStorageKey]`\n * 读取 token,并将其写入请求头 `X-Subject-Token`。因此这里需要保证 sessionStorage 中存在 psi_token。\n *\n * 注意:写入 sessionStorage 意味着 token 会在当前 tab 生命周期内可被同域脚本读取,\n * 请确保页面环境可信并注意 XSS 风险。\n */\nfunction syncToSessionStorage() {\n try {\n const ss = window.sessionStorage;\n if (!ss) return;\n if (state.token) {\n ss.setItem('psi_token', state.token);\n } else {\n ss.removeItem('psi_token');\n }\n } catch {}\n}\n\n/**\n * 设置当前 token。\n *\n * - 存入内存\n * - 若 shim 已启用,则立即同步到 sessionStorage.psi_token\n */\nexport function setToken(token: string | null) {\n state.token = token;\n if (state.refCount > 0) syncToSessionStorage();\n}\n\n/**\n * 获取当前内存 token。\n */\n/**\n * 启用 token 同步。\n *\n * - 使用 refCount 支持多个实例共存\n * - 只在第一次 acquire 时写入 sessionStorage\n */\nexport function acquireTokenShim() {\n state.refCount++;\n if (state.refCount !== 1) return;\n syncToSessionStorage();\n}\n\n/**\n * 释放 token 同步。\n *\n * - refCount 归零时清理 sessionStorage.psi_token\n */\nexport function releaseTokenShim() {\n if (state.refCount <= 0) return;\n state.refCount--;\n if (state.refCount !== 0) return;\n try {\n window.sessionStorage?.removeItem('psi_token');\n } catch {}\n}\n","type SelfTargetOriginShimState = {\n refCount: number;\n origin: string | null;\n originalXhrOpen: XMLHttpRequest['open'] | null;\n originalXhrSend: XMLHttpRequest['send'] | null;\n originalXhrSetRequestHeader: XMLHttpRequest['setRequestHeader'] | null;\n};\n\nconst state: SelfTargetOriginShimState = {\n refCount: 0,\n origin: null,\n originalXhrOpen: null,\n originalXhrSend: null,\n originalXhrSetRequestHeader: null,\n};\n\nfunction shouldAttachOrigin(url: unknown) {\n if (typeof url !== 'string') return false;\n return url.includes('/videoService/') || url.includes('videoService/');\n}\n\nfunction normalizeHeaderName(name: unknown) {\n return typeof name === 'string' ? name.trim().toLowerCase() : '';\n}\n\nexport function setSelfTargetOrigin(origin: string | null) {\n state.origin = typeof origin === 'string' ? origin.trim() || null : null;\n}\n\nexport function acquireSelfTargetOriginShim() {\n state.refCount++;\n if (state.refCount !== 1) return;\n\n try {\n const proto = XMLHttpRequest.prototype as any;\n if (typeof proto.open !== 'function' || typeof proto.send !== 'function' || typeof proto.setRequestHeader !== 'function') {\n return;\n }\n\n state.originalXhrOpen = proto.open;\n state.originalXhrSend = proto.send;\n state.originalXhrSetRequestHeader = proto.setRequestHeader;\n\n proto.open = function (...args: any[]) {\n try {\n (this as any).__dahua_request_url = args[1];\n (this as any).__dahua_has_self_target_origin = false;\n } catch {}\n return state.originalXhrOpen!.apply(this, args as any);\n };\n\n proto.setRequestHeader = function (name: string, value: string) {\n try {\n if (normalizeHeaderName(name) === 'self-targetorigin') {\n (this as any).__dahua_has_self_target_origin = true;\n }\n } catch {}\n return state.originalXhrSetRequestHeader!.call(this, name, value);\n };\n\n proto.send = function (...args: any[]) {\n try {\n const origin =\n state.origin ||\n window.sessionStorage?.getItem('wsplayer_origin') ||\n window.localStorage?.getItem('wsplayer_origin') ||\n null;\n const url = (this as any).__dahua_request_url;\n const alreadySet = Boolean((this as any).__dahua_has_self_target_origin);\n\n if (!alreadySet && origin && shouldAttachOrigin(url)) {\n state.originalXhrSetRequestHeader!.call(this, 'Self-TargetOrigin', origin);\n }\n } catch {}\n return state.originalXhrSend!.apply(this, args as any);\n };\n } catch {}\n}\n\nexport function releaseSelfTargetOriginShim() {\n if (state.refCount <= 0) return;\n state.refCount--;\n if (state.refCount !== 0) return;\n\n try {\n const proto = XMLHttpRequest.prototype as any;\n if (state.originalXhrOpen) proto.open = state.originalXhrOpen;\n if (state.originalXhrSend) proto.send = state.originalXhrSend;\n if (state.originalXhrSetRequestHeader) proto.setRequestHeader = state.originalXhrSetRequestHeader;\n } catch {}\n\n state.origin = null;\n state.originalXhrOpen = null;\n state.originalXhrSend = null;\n state.originalXhrSetRequestHeader = null;\n}\n","import { ErrorCode, DahuaPlayerError } from '../errors';\nimport type { DahuaPlayerMode, DahuaPlayerPlayerOptions } from '../types';\n\ntype ReceiveFn = (type: string, data: any) => void;\n\ntype PlayerAdapterOptions = {\n containerId: string;\n staticPath: string;\n mode: DahuaPlayerMode;\n cameraId?: string;\n cameraIds?: string[];\n streamType: 1 | 2 | 3;\n searchOnline: boolean;\n useNginxProxy?: boolean;\n nginxProxyHost?: string;\n useWSS?: boolean;\n num?: number;\n maxNum?: number;\n showRecordProgressBar?: boolean;\n playerOptions?: DahuaPlayerPlayerOptions;\n debug?: boolean;\n onMessage?: ReceiveFn;\n emit: (event: 'ready' | 'play' | 'pause' | 'error', payload?: any) => void;\n};\n\nexport class PlayerAdapter {\n private opts: PlayerAdapterOptions;\n private playerManager: any | null = null;\n private destroyed = false;\n private readyResolved = false;\n private currentNum = 1;\n private currentMaxNum = 1;\n\n constructor(opts: PlayerAdapterOptions) {\n this.opts = opts;\n }\n\n getRaw() {\n return this.playerManager;\n }\n\n init() {\n if (this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const PM = (window as any).PlayerManager;\n if (typeof PM !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'PlayerManager is not available',\n userMessage: '播放器内核未加载',\n });\n }\n\n const userReceive = this.opts.onMessage;\n const showRecordProgressBar =\n typeof this.opts.showRecordProgressBar === 'boolean'\n ? this.opts.showRecordProgressBar\n : this.opts.mode === 'record';\n const initialNum = this.normalizePositiveInt(\n this.opts.num ?? (this.opts.playerOptions as any)?.num ?? 1,\n 1,\n );\n const initialMaxNum = this.normalizePositiveInt(\n this.opts.maxNum ?? (this.opts.playerOptions as any)?.maxNum ?? initialNum,\n initialNum,\n );\n const defaultOptions: Record<string, unknown> = {\n type: this.opts.mode,\n num: initialNum,\n maxNum: initialMaxNum,\n showControl: false,\n showIcons: { hidden: true },\n showRecordProgressBar,\n useNginxProxy: this.opts.useNginxProxy ?? false,\n nginxProxyHost: this.opts.nginxProxyHost ?? '',\n useWSS: this.opts.useWSS ?? false,\n };\n const merged = {\n ...defaultOptions,\n ...(this.opts.playerOptions ?? {}),\n el: this.opts.containerId,\n STATIC_PATH: this.opts.staticPath,\n receiveMessageFromWSPlayer: (type: string, data: any) => {\n if (this.destroyed) return;\n\n try {\n userReceive?.(type, data);\n } catch {}\n\n this.handleSdkMessage(type, data);\n },\n };\n this.playerManager = new PM(merged);\n this.currentNum = this.normalizePositiveInt((merged as any).num, 1);\n this.currentMaxNum = this.normalizePositiveInt((merged as any).maxNum, this.currentNum);\n }\n\n private log(...args: any[]) {\n if (!this.opts.debug) return;\n try {\n console.log('[dahua-player]', ...args);\n } catch {}\n }\n\n private summarizeSdkMessage(type: string, data: any) {\n if (type === 'statusChanged') {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n return { status };\n }\n if (type === 'realError' || type === 'recordError') {\n const reason = data && typeof data === 'object' ? (data as any).reason : undefined;\n return { reason };\n }\n if (type === 'errorInfo') {\n const status = data && typeof data === 'object' ? (data as any).status : undefined;\n const code = data && typeof data === 'object' ? (data as any).code : undefined;\n return { status, code };\n }\n return undefined;\n }\n\n private handleSdkMessage(type: string, data: any) {\n this.log('sdk', type, this.summarizeSdkMessage(type, data));\n switch (type) {\n case 'initializationCompleted': {\n if (!this.readyResolved) {\n this.readyResolved = true;\n this.opts.emit('ready');\n }\n return;\n }\n case 'realSuccess': {\n this.opts.emit('play', { mode: 'real' });\n return;\n }\n case 'recordSuccess': {\n this.opts.emit('play', { mode: 'record' });\n return;\n }\n case 'statusChanged': {\n if (data && typeof data === 'object' && (data.status === 'pause' || data.status === 'paused')) {\n this.opts.emit('pause');\n }\n return;\n }\n case 'windowNumChanged': {\n const n =\n typeof data === 'number'\n ? data\n : data && typeof data === 'object'\n ? ((data as any).num ?? (data as any).number ?? (data as any).windowNum)\n : undefined;\n const v = this.normalizePositiveInt(n, this.currentNum);\n this.currentNum = v;\n return;\n }\n case 'realError': {\n this.opts.emit(\n 'error',\n new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'Real play failed',\n userMessage: '实时预览失败',\n cause: data,\n }),\n );\n return;\n }\n case 'recordError': {\n this.opts.emit(\n 'error',\n new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'Record play failed',\n userMessage: '录像回放失败',\n cause: data,\n }),\n );\n return;\n }\n default:\n return;\n }\n }\n\n private normalizeChannelList(opt: any) {\n const fromOpt = opt && typeof opt === 'object' ? (opt as any).channelList : undefined;\n if (Array.isArray(fromOpt) && fromOpt.length > 0) return this.limitByCurrentNum(fromOpt);\n\n const idsFromOpt = this.normalizeCameraIds(\n opt && typeof opt === 'object' ? ((opt as any).cameraIds ?? (opt as any).cameraId) : undefined,\n );\n if (idsFromOpt.length > 0) return this.limitByCurrentNum(idsFromOpt.map((id) => ({ channelCode: id })));\n\n const initIds = this.normalizeCameraIds(this.opts.cameraIds);\n if (initIds.length > 0) return this.limitByCurrentNum(initIds.map((id) => ({ channelCode: id })));\n if (this.opts.cameraId) return [{ channelCode: this.opts.cameraId }];\n return null;\n }\n\n private normalizeCameraIds(input: unknown): string[] {\n const list: string[] = [];\n if (typeof input === 'string') {\n const v = input.trim();\n if (v) list.push(v);\n } else if (Array.isArray(input)) {\n for (const it of input) {\n if (typeof it !== 'string') continue;\n const v = it.trim();\n if (v) list.push(v);\n }\n }\n const uniq = Array.from(new Set(list));\n return uniq;\n }\n\n private limitByCurrentNum<T>(list: T[]): T[] {\n const cap = this.normalizePositiveInt(this.currentNum, 1);\n if (list.length <= cap) return list;\n const sliced = list.slice(0, cap);\n this.log('channelList truncated by layout', { cap, original: list.length });\n return sliced;\n }\n\n private normalizePositiveInt(input: unknown, fallback: number) {\n const n = typeof input === 'number' ? input : typeof input === 'string' ? Number(input) : NaN;\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.floor(n);\n }\n\n playRealVideo(opt: any) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const channelList = this.normalizeChannelList(opt);\n if (!channelList) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'channelList is required for real play',\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\n });\n }\n if (typeof this.playerManager.playRealVideo !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playRealVideo is not available',\n userMessage: '当前内核不支持实时预览播放',\n });\n }\n this.log('playRealVideo');\n this.playerManager.playRealVideo({ ...(opt ?? {}), channelList });\n }\n\n playRecordVideo(opt: any) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const channelList = this.normalizeChannelList(opt);\n if (!channelList) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'channelList is required for record play',\n userMessage: '缺少通道ID,请在调用时传入 channelList 或初始化时传入 cameraId',\n });\n }\n if (typeof this.playerManager.playRecordVideo !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playRecordVideo is not available',\n userMessage: '当前内核不支持录像回放播放',\n });\n }\n this.log('playRecordVideo');\n this.playerManager.playRecordVideo({ ...(opt ?? {}), channelList });\n }\n\n setPlayerNum(num: number) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const v = this.normalizePositiveInt(num, this.currentNum);\n const fn = this.playerManager?.setPlayerNum;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setPlayerNum is not available',\n userMessage: '当前内核不支持切换布局路数',\n });\n }\n this.log('setPlayerNum', v);\n fn.call(this.playerManager, v);\n this.currentNum = v;\n }\n\n jumpPlayByDateTime(datetime: string | Date | number, index?: number) {\n if (this.opts.mode !== 'record') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime only supports record mode',\n userMessage: '实时预览不支持跳转播放',\n });\n }\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const dt = this.formatDateTime(datetime);\n const fn = this.pickMethod(['jumpPlayByDateTime', 'jumpPlayByDatetime']);\n if (!fn) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime is not available',\n userMessage: '当前内核不支持录像跳转播放',\n });\n }\n const idx = typeof index === 'number' ? Math.floor(index) : undefined;\n this.log('jumpPlayByDateTime', { dt, index: idx });\n fn(dt, idx);\n }\n\n playSpeed(speed: number, index: number) {\n if (this.opts.mode !== 'record') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed only supports record mode',\n userMessage: '实时预览不支持倍速播放',\n });\n }\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const allowed = new Set([0.125, 0.25, 0.5, 1, 1.25, 1.5, 2, 4, 8]);\n if (!allowed.has(speed)) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'invalid speed',\n userMessage: '倍速参数不合法',\n cause: { speed },\n });\n }\n const idx = this.normalizePositiveInt(index, 0);\n const fn = this.playerManager?.playSpeed;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed is not available',\n userMessage: '当前内核不支持倍速播放',\n });\n }\n this.log('playSpeed', { speed, index: idx });\n fn.call(this.playerManager, speed, idx);\n }\n\n setFullScreen() {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const fn = this.playerManager?.setFullScreen;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setFullScreen is not available',\n userMessage: '当前内核不支持全屏',\n });\n }\n this.log('setFullScreen');\n fn.call(this.playerManager);\n }\n\n setExitFullScreen() {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const fn = this.playerManager?.setExitFullScreen;\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'setExitFullScreen is not available',\n userMessage: '当前内核不支持退出全屏',\n });\n }\n this.log('setExitFullScreen');\n fn.call(this.playerManager);\n }\n\n callRaw(method: string, ...args: any[]) {\n if (!this.playerManager || this.destroyed) {\n throw new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'Player destroyed',\n userMessage: '播放器已销毁',\n });\n }\n const name = typeof method === 'string' ? method.trim() : '';\n if (!name) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'method is required',\n userMessage: '缺少 method 参数',\n });\n }\n const fn = (this.playerManager as any)[name];\n if (typeof fn !== 'function') {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: `method not found: ${name}`,\n userMessage: `底层方法不存在:${name}`,\n });\n }\n this.log('callRaw', name);\n return fn.apply(this.playerManager, args);\n }\n\n private pickMethod(names: string[]) {\n for (const n of names) {\n const fn = (this.playerManager as any)?.[n];\n if (typeof fn === 'function') return fn.bind(this.playerManager);\n }\n return null;\n }\n\n private formatDateTime(input: string | Date | number) {\n if (typeof input === 'string') return input.trim();\n const d =\n typeof input === 'number'\n ? new Date(input > 1_000_000_000_000 ? input : input * 1000)\n : input instanceof Date\n ? input\n : new Date(NaN);\n if (!Number.isFinite(d.getTime())) {\n throw new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'invalid datetime',\n userMessage: '跳转时间格式不合法',\n });\n }\n const pad2 = (n: number) => String(n).padStart(2, '0');\n const y = d.getFullYear();\n const m = pad2(d.getMonth() + 1);\n const day = pad2(d.getDate());\n const hh = pad2(d.getHours());\n const mm = pad2(d.getMinutes());\n const ss = pad2(d.getSeconds());\n return `${y}-${m}-${day} ${hh}:${mm}:${ss}`;\n }\n\n pause() {\n if (!this.playerManager || this.destroyed) return;\n try {\n this.log('pause');\n if (typeof this.playerManager.pause === 'function') {\n this.playerManager.pause(0);\n } else if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(0);\n }\n this.opts.emit('pause');\n } catch {}\n }\n\n pauseWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('pauseWindow', idx);\n if (typeof this.playerManager.pause === 'function') {\n this.playerManager.pause(idx);\n } else if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(idx);\n }\n this.opts.emit('pause');\n } catch {}\n }\n\n playWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('playWindow', idx);\n if (typeof this.playerManager.play === 'function') {\n this.playerManager.play(idx);\n }\n } catch {}\n }\n\n closeWindow(windowIndex?: number) {\n if (!this.playerManager || this.destroyed) return;\n try {\n const idx = typeof windowIndex === 'number' ? windowIndex : undefined;\n this.log('closeWindow', idx);\n if (typeof this.playerManager.close === 'function') {\n this.playerManager.close(idx);\n }\n } catch {}\n }\n\n destroy() {\n if (this.destroyed) return;\n this.destroyed = true;\n this.log('destroy');\n\n if (this.playerManager) {\n try {\n this.playerManager.destroy();\n } catch {}\n this.playerManager = null;\n }\n }\n}\n","import { ErrorCode, DahuaPlayerError, toDahuaError } from './errors';\nimport type {\n DahuaPlayerEventName,\n DahuaPlayerAuth,\n DahuaPlayerInitOptions,\n DahuaPlayerInstance,\n DahuaPlayerMode,\n} from './types';\nimport { ensureDahuaSdkLoaded } from './sdk/SdkLoader';\nimport { acquireTokenShim, releaseTokenShim, setToken } from './sdk/TokenVault';\nimport { acquireSelfTargetOriginShim, releaseSelfTargetOriginShim, setSelfTargetOrigin } from './sdk/SelfTargetOriginShim';\nimport { PlayerAdapter } from './sdk/PlayerAdapter';\n\ntype ListenerMap = Map<DahuaPlayerEventName, Set<(payload: any) => void>>;\n\n/**\n * 规范化大华静态资源根路径。\n *\n * - 允许传入 \"/wsplayer-gov\" 或 \"wsplayer-gov\"\n * - 会去掉末尾多余的 \"/\"\n */\nfunction normalizeStaticPath(path: string) {\n const raw = (path || '').trim();\n if (!raw) return '/wsplayer-gov';\n const v = raw.replace(/\\/+$/, '');\n return v.startsWith('/') ? v : `/${v}`;\n}\n\nfunction buildTargetOriginFromAuth(auth: DahuaPlayerAuth | undefined) {\n if (!auth) return '';\n const ip = typeof auth.ip === 'string' ? auth.ip.trim() : '';\n const port = typeof auth.port === 'number' ? auth.port : typeof auth.port === 'string' ? Number(auth.port) : NaN;\n if (!ip || !Number.isFinite(port) || port <= 0) return '';\n const protocol = auth.protocol === 'http' ? 'http' : 'https';\n return `${protocol}://${ip}:${port}`;\n}\n\n/**\n * 解析播放器挂载容器。\n *\n * - string:按 id 查找元素\n * - HTMLElement:直接使用\n */\nfunction resolveContainer(container: HTMLElement | string): HTMLElement {\n if (typeof container === 'string') {\n const el = document.getElementById(container);\n if (!el) {\n throw new DahuaPlayerError({\n code: ErrorCode.CONTAINER_NOT_FOUND,\n message: `container not found: ${container}`,\n userMessage: '未找到播放器挂载节点',\n });\n }\n return el;\n }\n if (container && typeof container === 'object') return container;\n throw new DahuaPlayerError({\n code: ErrorCode.CONTAINER_NOT_FOUND,\n message: 'container is invalid',\n userMessage: '播放器挂载节点无效',\n });\n}\n\nfunction createListeners(): ListenerMap {\n return new Map();\n}\n\nfunction emit(listeners: ListenerMap, event: DahuaPlayerEventName, payload?: any) {\n const set = listeners.get(event);\n if (!set || set.size === 0) return;\n for (const cb of set) {\n try {\n cb(payload);\n } catch {}\n }\n}\n\n/**\n * 大华播放器核心入口。\n *\n * 设计目标:\n *\n * - 对外只暴露一个初始化方法:`DahuaPlayer.init(options)`\n * - 自动加载大华 SDK 脚本与 CSS(默认从 `/wsplayer-gov` 下加载)\n * - 不在浏览器持久化保存 token(通过 sessionStorage shim 仅在内存注入)\n * - 统一事件与错误码:ready/play/pause/error/destroy + ErrorCode\n *\n * 注意:\n *\n * - 本类不负责登录鉴权;需要外部提供已获取到的 `token`\n */\nexport class DahuaPlayer {\n /**\n * 初始化播放器并返回实例。\n *\n * 生命周期:\n *\n * - 立即创建 DOM 结构并开始异步加载 SDK\n * - `instance.ready` 会在 SDK 触发 `initializationCompleted` 后 resolve\n * - `destroy()` 会销毁 SDK 实例、移除 DOM,并释放 token shim\n *\n * @throws DahuaPlayerError 当 container/token 不合法时抛出\n */\n static init(options: DahuaPlayerInitOptions): DahuaPlayerInstance {\n const opts = options || ({} as any);\n const container = resolveContainer(opts.container);\n\n const mode: DahuaPlayerMode = opts.mode ?? 'real';\n\n const token = typeof opts.auth?.token === 'string' ? opts.auth.token.trim() : '';\n if (!token) {\n throw new DahuaPlayerError({\n code: ErrorCode.INVALID_TOKEN,\n message: 'token is required',\n userMessage: '缺少 token,请先完成鉴权登录',\n });\n }\n\n const cameraId = typeof opts.cameraId === 'string' ? opts.cameraId.trim() : '';\n const cameraIds = Array.isArray(opts.cameraIds) ? opts.cameraIds.map((v) => v.trim()).filter(Boolean) : [];\n const targetOrigin = buildTargetOriginFromAuth(opts.auth);\n\n const id = `dahua-player-${Math.random().toString(36).slice(2, 10)}`;\n const wrapper = document.createElement('div');\n wrapper.id = id;\n wrapper.style.position = 'relative';\n wrapper.style.width = opts.width === 'auto' || opts.width == null ? '100%' : `${opts.width}px`;\n wrapper.style.height = opts.height === 'auto' || opts.height == null ? '100%' : `${opts.height}px`;\n container.appendChild(wrapper);\n\n const innerId = `${id}-inner`;\n const inner = document.createElement('div');\n inner.id = innerId;\n inner.style.width = '100%';\n inner.style.height = '100%';\n wrapper.appendChild(inner);\n\n const loading = document.createElement('div');\n loading.style.position = 'absolute';\n loading.style.left = '0';\n loading.style.top = '0';\n loading.style.right = '0';\n loading.style.bottom = '0';\n loading.style.display = 'flex';\n loading.style.alignItems = 'center';\n loading.style.justifyContent = 'center';\n loading.style.background = 'rgba(0,0,0,0.35)';\n loading.style.color = '#fff';\n loading.style.fontSize = '12px';\n loading.style.pointerEvents = 'none';\n loading.style.zIndex = '10';\n loading.style.visibility = 'hidden';\n\n const loadingText = document.createElement('div');\n loadingText.textContent = '';\n loading.appendChild(loadingText);\n wrapper.appendChild(loading);\n\n const setLoading = (visible: boolean, text?: string) => {\n loadingText.textContent = text || '';\n loading.style.visibility = visible ? 'visible' : 'hidden';\n };\n\n let transientOverlayTimer: any = null;\n let stickyOverlayVisible = false;\n\n /**\n * 开始一个“加载中”覆盖层展示,并清理可能存在的错误提示计时器。\n */\n const showLoading = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = false;\n setLoading(true, text);\n };\n\n /**\n * 以短暂覆盖层的方式提示错误,给用户一个可见反馈。\n */\n const showTransientError = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = false;\n setLoading(true, text);\n transientOverlayTimer = setTimeout(() => {\n transientOverlayTimer = null;\n setLoading(false);\n }, 3000);\n };\n\n /**\n * 以常驻覆盖层的方式提示错误,直到下一次显式加载/销毁。\n */\n const showStickyError = (text: string) => {\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n stickyOverlayVisible = true;\n setLoading(true, text);\n };\n\n /**\n * 将 error payload 格式化为可读文案;尽量带上状态码等关键信息。\n */\n const formatUserMessage = (payload: unknown, fallback: string) => {\n if (payload instanceof DahuaPlayerError) {\n const base = payload.userMessage || fallback;\n const cause: any = (payload as any).cause;\n const status = cause && typeof cause === 'object' ? (cause.status ?? cause.code) : undefined;\n if (typeof status === 'number' || typeof status === 'string') {\n return `${base}(${status})`;\n }\n return base;\n }\n return typeof payload === 'string' ? payload : fallback;\n };\n\n const listeners = createListeners();\n const staticPath = normalizeStaticPath(opts.staticPath ?? '/wsplayer-gov');\n const sdkUrl = (opts.sdkUrl || `${staticPath}/wsplayer.min.js`).trim();\n const cssUrl = `${staticPath}/WSPlayer/player.css`;\n\n const autoPlay = opts.autoPlay === true;\n const streamType = (opts.streamType ?? 2) as 1 | 2 | 3;\n const searchOnline = Boolean(opts.searchOnline);\n const num = Number.isFinite(opts.num as any) ? Math.floor(Number(opts.num)) : undefined;\n const maxNum = Number.isFinite(opts.maxNum as any) ? Math.floor(Number(opts.maxNum)) : undefined;\n const showRecordProgressBar =\n typeof opts.showRecordProgressBar === 'boolean' ? opts.showRecordProgressBar : undefined;\n const dblClickFullscreen = opts.dblClickFullscreen !== false;\n\n let destroyed = false;\n let adapter: PlayerAdapter | null = null;\n let readyResolve: () => void = () => {};\n let readyReject: (e: unknown) => void = () => {};\n\n const safeOnError = (e: unknown) => {\n try {\n opts.onError?.(e);\n } catch {}\n emit(listeners, 'error', e);\n };\n\n /**\n * autoPlay:根据 init 参数在 ready 后触发一次自动播放。\n *\n * 触发条件:\n * - 实时预览(mode=real):需要 cameraId + autoPlay=true\n * - 录像回放(mode=record):需要 recordStartTime/recordEndTime(Unix 秒)+ autoPlay=true\n */\n const tryAutoPlay = () => {\n if (!autoPlay) return;\n if (mode === 'real') {\n if (!cameraId && cameraIds.length === 0) return;\n try {\n showLoading('加载视频中…');\n adapter?.playRealVideo({});\n } catch (e) {\n safeOnError(e);\n }\n return;\n }\n if (mode === 'record') {\n if (!Number.isFinite(opts.recordStartTime as any)) return;\n if (!Number.isFinite(opts.recordEndTime as any)) return;\n if (!cameraId && cameraIds.length === 0) return;\n const startTime = Math.floor(Number(opts.recordStartTime));\n const endTime = Math.floor(Number(opts.recordEndTime));\n const recordSource = Number.isFinite(opts.recordSource as any)\n ? Math.floor(Number(opts.recordSource))\n : undefined;\n try {\n showLoading('加载录像中…');\n adapter?.playRecordVideo(recordSource == null ? { startTime, endTime } : { startTime, endTime, recordSource });\n } catch (e) {\n safeOnError(e);\n }\n }\n };\n\n /**\n * ready:仅代表播放器“初始化完成”,不等价于“已成功播放”。\n * 播放成功/失败通过 play/error 事件体现。\n */\n const ready = new Promise<void>((resolve, reject) => {\n readyResolve = resolve;\n readyReject = reject;\n });\n\n /**\n * 初始化兜底超时:避免 SDK 资源或初始化流程异常导致 ready 永远 pending。\n */\n const readyTimer = setTimeout(() => {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_LOAD_TIMEOUT,\n message: 'SDK ready timeout',\n userMessage: '播放器初始化超时',\n });\n showStickyError(`初始化失败:${err.userMessage}`);\n safeOnError(err);\n readyReject(err);\n }, 20_000);\n\n showLoading('初始化中…');\n\n void (async () => {\n try {\n /**\n * 大华 SDK 内部会从 sessionStorage 读取 psi_token。\n * 这里通过 shim 仅在内存提供 token,避免 token 落盘。\n */\n setToken(token);\n acquireTokenShim();\n if (targetOrigin) {\n try {\n window.sessionStorage?.setItem('wsplayer_origin', targetOrigin);\n } catch {}\n }\n setSelfTargetOrigin(targetOrigin || null);\n acquireSelfTargetOriginShim();\n\n await ensureDahuaSdkLoaded({ sdkUrl, cssUrl, timeoutMs: 20_000 });\n\n adapter = new PlayerAdapter({\n containerId: innerId,\n staticPath,\n mode,\n cameraId,\n cameraIds,\n streamType,\n searchOnline,\n useNginxProxy: opts.useNginxProxy,\n nginxProxyHost: opts.nginxProxyHost,\n useWSS: opts.useWSS,\n num,\n maxNum,\n showRecordProgressBar,\n playerOptions: opts.playerOptions,\n debug: opts.debug,\n onMessage: (type, data) => {\n try {\n opts.onSdkMessage?.(type, data);\n } catch {}\n },\n emit: (event, payload) => {\n if (event === 'ready') {\n clearTimeout(readyTimer);\n readyResolve();\n setLoading(false);\n stickyOverlayVisible = false;\n try {\n opts.onReady?.();\n } catch {}\n emit(listeners, 'ready');\n tryAutoPlay();\n return;\n }\n if (event === 'play') {\n setLoading(false);\n try {\n opts.onPlay?.(payload);\n } catch {}\n emit(listeners, 'play', payload);\n return;\n }\n if (event === 'pause') {\n setLoading(false);\n try {\n opts.onPause?.();\n } catch {}\n emit(listeners, 'pause');\n return;\n }\n if (event === 'error') {\n const msg = formatUserMessage(payload, '播放失败');\n if (payload instanceof DahuaPlayerError) {\n const initCodes = new Set<ErrorCode>([\n ErrorCode.SDK_INIT_FAILED,\n ErrorCode.SDK_LOAD_FAILED,\n ErrorCode.SDK_LOAD_TIMEOUT,\n ]);\n if (initCodes.has(payload.code)) {\n showStickyError(`初始化失败:${msg}`);\n safeOnError(payload);\n return;\n }\n }\n if (stickyOverlayVisible) return;\n showTransientError(msg);\n safeOnError(payload);\n }\n },\n });\n\n adapter.init();\n } catch (e) {\n clearTimeout(readyTimer);\n const err = toDahuaError(e, {\n code: ErrorCode.SDK_LOAD_FAILED,\n message: 'SDK load/init failed',\n userMessage: '播放器初始化失败',\n });\n showStickyError(`初始化失败:${err.userMessage}`);\n safeOnError(err);\n readyReject(err);\n }\n })();\n\n const instance: DahuaPlayerInstance = {\n id,\n ready,\n /**\n * 暂停播放。\n *\n * 注意:部分 SDK 版本 pause/close 的行为差异由内部适配处理。\n */\n pause: () => {\n if (!adapter) return;\n adapter.pause();\n },\n /**\n * 销毁播放器实例并释放资源。\n *\n * - 移除创建的 DOM 节点\n * - 调用 SDK destroy(若存在)\n * - 释放 token shim,清理内存 token\n * - 触发 destroy 事件\n */\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n clearTimeout(readyTimer);\n if (transientOverlayTimer) {\n clearTimeout(transientOverlayTimer);\n transientOverlayTimer = null;\n }\n setLoading(false);\n try {\n adapter?.destroy();\n } catch {}\n adapter = null;\n try {\n wrapper.remove();\n } catch {\n try {\n container.innerHTML = '';\n } catch {}\n }\n try {\n releaseTokenShim();\n } catch {}\n try {\n releaseSelfTargetOriginShim();\n } catch {}\n try {\n setToken(null);\n } catch {}\n try {\n opts.onDestroy?.();\n } catch {}\n emit(listeners, 'destroy');\n listeners.clear();\n },\n sdk: {\n getRaw: () => adapter?.getRaw(),\n callRaw: (method: string, ...args: any[]) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n return adapter.callRaw(method, ...args);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'callRaw failed',\n userMessage: '调用底层方法失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playRealVideo: (opt: any) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('加载视频中…');\n try {\n adapter.playRealVideo(opt);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playRealVideo failed',\n userMessage: '实时预览播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playRecordVideo: (opt: any) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('加载录像中…');\n try {\n adapter.playRecordVideo(opt);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playRecordVideo failed',\n userMessage: '录像回放播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n pause: (windowIndex?: number) => adapter?.pauseWindow(windowIndex),\n play: (windowIndex?: number) => adapter?.playWindow(windowIndex),\n close: (windowIndex?: number) => adapter?.closeWindow(windowIndex),\n setPlayerNum: (n: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setPlayerNum(n);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'setPlayerNum failed',\n userMessage: '切换布局路数失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n jumpPlayByDateTime: (datetime: string | Date | number, index?: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n showLoading('跳转中…');\n try {\n adapter.jumpPlayByDateTime(datetime, index);\n } catch (e) {\n setLoading(false);\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'jumpPlayByDateTime failed',\n userMessage: '录像跳转播放失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n playSpeed: (speed: number, index: number) => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.playSpeed(speed, index);\n } catch (e) {\n const err = toDahuaError(e, {\n code: ErrorCode.PLAY_FAILED,\n message: 'playSpeed failed',\n userMessage: '设置倍速失败',\n });\n safeOnError(err);\n throw err;\n }\n },\n setFullScreen: () => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setFullScreen();\n return;\n } catch {}\n const el: any = wrapper as any;\n const req = el?.requestFullscreen;\n if (typeof req !== 'function') {\n const err = new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'fullscreen is not supported',\n userMessage: '当前环境不支持全屏',\n });\n safeOnError(err);\n throw err;\n }\n void req.call(el);\n },\n setExitFullScreen: () => {\n if (destroyed) {\n const err = new DahuaPlayerError({\n code: ErrorCode.DESTROYED,\n message: 'destroyed',\n userMessage: '播放器已销毁',\n });\n safeOnError(err);\n throw err;\n }\n if (!adapter) {\n const err = new DahuaPlayerError({\n code: ErrorCode.SDK_INIT_FAILED,\n message: 'player not ready',\n userMessage: '播放器未就绪,请等待 ready 后再调用',\n });\n safeOnError(err);\n throw err;\n }\n try {\n adapter.setExitFullScreen();\n return;\n } catch {}\n const doc: any = document as any;\n const exit = doc?.exitFullscreen;\n if (typeof exit === 'function') {\n void exit.call(doc);\n return;\n }\n const err = new DahuaPlayerError({\n code: ErrorCode.PLAY_FAILED,\n message: 'exitFullscreen is not supported',\n userMessage: '当前环境不支持退出全屏',\n });\n safeOnError(err);\n throw err;\n },\n destroy: () => instance.destroy(),\n },\n /**\n * 订阅事件(ready/play/pause/error/destroy)。\n */\n on: (event, handler) => {\n const set = listeners.get(event) ?? new Set();\n set.add(handler as any);\n listeners.set(event, set);\n },\n /**\n * 取消订阅事件。\n */\n off: (event, handler) => {\n const set = listeners.get(event);\n if (!set) return;\n set.delete(handler as any);\n if (set.size === 0) listeners.delete(event);\n },\n };\n\n if (dblClickFullscreen) {\n const onDblClick = () => {\n try {\n const doc: any = document as any;\n if (doc?.fullscreenElement) {\n instance.sdk.setExitFullScreen();\n return;\n }\n instance.sdk.setFullScreen();\n } catch {}\n };\n try {\n wrapper.addEventListener('dblclick', onDblClick);\n } catch {}\n const originDestroy = instance.destroy;\n instance.destroy = () => {\n try {\n wrapper.removeEventListener('dblclick', onDblClick);\n } catch {}\n originDestroy();\n };\n }\n\n return instance;\n }\n}\n"],"mappings":"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","names":["ErrorCode","state","state","_a","_b","_c","err"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
type DahuaPlayerSize = number | 'auto';
|
|
2
|
+
type DahuaPlayerMode = 'real' | 'record';
|
|
3
|
+
type DahuaPlayerPlayerOptions = Record<string, unknown>;
|
|
4
|
+
type DahuaPlayerAuth = {
|
|
5
|
+
token: string;
|
|
6
|
+
ip?: string;
|
|
7
|
+
port?: number;
|
|
8
|
+
protocol?: 'http' | 'https';
|
|
9
|
+
};
|
|
10
|
+
type DahuaPlayerInitOptions = {
|
|
11
|
+
container: HTMLElement | string;
|
|
12
|
+
auth: DahuaPlayerAuth;
|
|
13
|
+
/**
|
|
14
|
+
* cameraId:通道/设备编码(可选)。
|
|
15
|
+
*
|
|
16
|
+
* - 用于简化调用 sdk.playRealVideo/playRecordVideo 时的默认通道
|
|
17
|
+
* - 若未传入,则需要在调用 sdk.play* 时显式传入 channelList
|
|
18
|
+
*/
|
|
19
|
+
cameraId?: string;
|
|
20
|
+
cameraIds?: string[];
|
|
21
|
+
mode?: DahuaPlayerMode;
|
|
22
|
+
/**
|
|
23
|
+
* autoPlay:是否在 ready 后自动触发一次播放。
|
|
24
|
+
*
|
|
25
|
+
* - mode=real:需要同时传入 cameraId
|
|
26
|
+
* - mode=record:需要同时传入 recordStartTime/recordEndTime
|
|
27
|
+
*/
|
|
28
|
+
autoPlay?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* recordStartTime:录像回放开始时间(Unix 秒)。
|
|
31
|
+
*
|
|
32
|
+
* - 仅用于 mode=record + autoPlay=true
|
|
33
|
+
*/
|
|
34
|
+
recordStartTime?: number;
|
|
35
|
+
/**
|
|
36
|
+
* recordEndTime:录像回放结束时间(Unix 秒)。
|
|
37
|
+
*
|
|
38
|
+
* - 仅用于 mode=record + autoPlay=true
|
|
39
|
+
*/
|
|
40
|
+
recordEndTime?: number;
|
|
41
|
+
/**
|
|
42
|
+
* recordSource:录像来源(透传给 WSPlayer)。
|
|
43
|
+
*
|
|
44
|
+
* - 仅用于 mode=record + autoPlay=true
|
|
45
|
+
*/
|
|
46
|
+
recordSource?: number;
|
|
47
|
+
width?: DahuaPlayerSize;
|
|
48
|
+
height?: DahuaPlayerSize;
|
|
49
|
+
staticPath?: string;
|
|
50
|
+
sdkUrl?: string;
|
|
51
|
+
streamType?: 1 | 2 | 3;
|
|
52
|
+
searchOnline?: boolean;
|
|
53
|
+
useNginxProxy?: boolean;
|
|
54
|
+
nginxProxyHost?: string;
|
|
55
|
+
useWSS?: boolean;
|
|
56
|
+
num?: number;
|
|
57
|
+
maxNum?: number;
|
|
58
|
+
showRecordProgressBar?: boolean;
|
|
59
|
+
dblClickFullscreen?: boolean;
|
|
60
|
+
playerOptions?: DahuaPlayerPlayerOptions;
|
|
61
|
+
debug?: boolean;
|
|
62
|
+
onReady?: () => void;
|
|
63
|
+
onPlay?: (payload?: {
|
|
64
|
+
mode?: DahuaPlayerMode;
|
|
65
|
+
}) => void;
|
|
66
|
+
onPause?: () => void;
|
|
67
|
+
onError?: (err: unknown) => void;
|
|
68
|
+
onDestroy?: () => void;
|
|
69
|
+
onSdkMessage?: (type: string, data: unknown) => void;
|
|
70
|
+
};
|
|
71
|
+
type DahuaPlayerEventMap = {
|
|
72
|
+
ready: void;
|
|
73
|
+
play: {
|
|
74
|
+
mode?: DahuaPlayerMode;
|
|
75
|
+
} | void;
|
|
76
|
+
pause: void;
|
|
77
|
+
error: unknown;
|
|
78
|
+
destroy: void;
|
|
79
|
+
};
|
|
80
|
+
type DahuaPlayerEventName = keyof DahuaPlayerEventMap;
|
|
81
|
+
type DahuaPlayerSdkCompat = {
|
|
82
|
+
getRaw: () => any;
|
|
83
|
+
playRealVideo: (opt: any) => void;
|
|
84
|
+
playRecordVideo: (opt: any) => void;
|
|
85
|
+
pause: (windowIndex?: number) => void;
|
|
86
|
+
play: (windowIndex?: number) => void;
|
|
87
|
+
close: (windowIndex?: number) => void;
|
|
88
|
+
setPlayerNum: (num: number) => void;
|
|
89
|
+
jumpPlayByDateTime: (datetime: string | Date | number, index?: number) => void;
|
|
90
|
+
playSpeed: (speed: number, index: number) => void;
|
|
91
|
+
setFullScreen: () => void;
|
|
92
|
+
setExitFullScreen: () => void;
|
|
93
|
+
callRaw: (method: string, ...args: any[]) => any;
|
|
94
|
+
destroy: () => void;
|
|
95
|
+
};
|
|
96
|
+
type DahuaPlayerInstance = {
|
|
97
|
+
id: string;
|
|
98
|
+
ready: Promise<void>;
|
|
99
|
+
pause: () => void;
|
|
100
|
+
destroy: () => void;
|
|
101
|
+
sdk: DahuaPlayerSdkCompat;
|
|
102
|
+
on: <K extends DahuaPlayerEventName>(event: K, handler: (payload: DahuaPlayerEventMap[K]) => void) => void;
|
|
103
|
+
off: <K extends DahuaPlayerEventName>(event: K, handler: (payload: DahuaPlayerEventMap[K]) => void) => void;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 大华播放器核心入口。
|
|
108
|
+
*
|
|
109
|
+
* 设计目标:
|
|
110
|
+
*
|
|
111
|
+
* - 对外只暴露一个初始化方法:`DahuaPlayer.init(options)`
|
|
112
|
+
* - 自动加载大华 SDK 脚本与 CSS(默认从 `/wsplayer-gov` 下加载)
|
|
113
|
+
* - 不在浏览器持久化保存 token(通过 sessionStorage shim 仅在内存注入)
|
|
114
|
+
* - 统一事件与错误码:ready/play/pause/error/destroy + ErrorCode
|
|
115
|
+
*
|
|
116
|
+
* 注意:
|
|
117
|
+
*
|
|
118
|
+
* - 本类不负责登录鉴权;需要外部提供已获取到的 `token`
|
|
119
|
+
*/
|
|
120
|
+
declare class DahuaPlayer {
|
|
121
|
+
/**
|
|
122
|
+
* 初始化播放器并返回实例。
|
|
123
|
+
*
|
|
124
|
+
* 生命周期:
|
|
125
|
+
*
|
|
126
|
+
* - 立即创建 DOM 结构并开始异步加载 SDK
|
|
127
|
+
* - `instance.ready` 会在 SDK 触发 `initializationCompleted` 后 resolve
|
|
128
|
+
* - `destroy()` 会销毁 SDK 实例、移除 DOM,并释放 token shim
|
|
129
|
+
*
|
|
130
|
+
* @throws DahuaPlayerError 当 container/token 不合法时抛出
|
|
131
|
+
*/
|
|
132
|
+
static init(options: DahuaPlayerInitOptions): DahuaPlayerInstance;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
declare enum ErrorCode {
|
|
136
|
+
CONTAINER_NOT_FOUND = "CONTAINER_NOT_FOUND",
|
|
137
|
+
INVALID_TOKEN = "INVALID_TOKEN",
|
|
138
|
+
SDK_LOAD_FAILED = "SDK_LOAD_FAILED",
|
|
139
|
+
SDK_LOAD_TIMEOUT = "SDK_LOAD_TIMEOUT",
|
|
140
|
+
SDK_INIT_FAILED = "SDK_INIT_FAILED",
|
|
141
|
+
PLAY_FAILED = "PLAY_FAILED",
|
|
142
|
+
NETWORK_DISCONNECTED = "NETWORK_DISCONNECTED",
|
|
143
|
+
DESTROYED = "DESTROYED"
|
|
144
|
+
}
|
|
145
|
+
declare class DahuaPlayerError extends Error {
|
|
146
|
+
code: ErrorCode;
|
|
147
|
+
userMessage: string;
|
|
148
|
+
cause?: unknown;
|
|
149
|
+
constructor(params: {
|
|
150
|
+
code: ErrorCode;
|
|
151
|
+
message: string;
|
|
152
|
+
userMessage: string;
|
|
153
|
+
cause?: unknown;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export { DahuaPlayer, DahuaPlayerError, type DahuaPlayerEventMap, type DahuaPlayerEventName, type DahuaPlayerInitOptions, type DahuaPlayerInstance, ErrorCode };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
type DahuaPlayerSize = number | 'auto';
|
|
2
|
+
type DahuaPlayerMode = 'real' | 'record';
|
|
3
|
+
type DahuaPlayerPlayerOptions = Record<string, unknown>;
|
|
4
|
+
type DahuaPlayerAuth = {
|
|
5
|
+
token: string;
|
|
6
|
+
ip?: string;
|
|
7
|
+
port?: number;
|
|
8
|
+
protocol?: 'http' | 'https';
|
|
9
|
+
};
|
|
10
|
+
type DahuaPlayerInitOptions = {
|
|
11
|
+
container: HTMLElement | string;
|
|
12
|
+
auth: DahuaPlayerAuth;
|
|
13
|
+
/**
|
|
14
|
+
* cameraId:通道/设备编码(可选)。
|
|
15
|
+
*
|
|
16
|
+
* - 用于简化调用 sdk.playRealVideo/playRecordVideo 时的默认通道
|
|
17
|
+
* - 若未传入,则需要在调用 sdk.play* 时显式传入 channelList
|
|
18
|
+
*/
|
|
19
|
+
cameraId?: string;
|
|
20
|
+
cameraIds?: string[];
|
|
21
|
+
mode?: DahuaPlayerMode;
|
|
22
|
+
/**
|
|
23
|
+
* autoPlay:是否在 ready 后自动触发一次播放。
|
|
24
|
+
*
|
|
25
|
+
* - mode=real:需要同时传入 cameraId
|
|
26
|
+
* - mode=record:需要同时传入 recordStartTime/recordEndTime
|
|
27
|
+
*/
|
|
28
|
+
autoPlay?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* recordStartTime:录像回放开始时间(Unix 秒)。
|
|
31
|
+
*
|
|
32
|
+
* - 仅用于 mode=record + autoPlay=true
|
|
33
|
+
*/
|
|
34
|
+
recordStartTime?: number;
|
|
35
|
+
/**
|
|
36
|
+
* recordEndTime:录像回放结束时间(Unix 秒)。
|
|
37
|
+
*
|
|
38
|
+
* - 仅用于 mode=record + autoPlay=true
|
|
39
|
+
*/
|
|
40
|
+
recordEndTime?: number;
|
|
41
|
+
/**
|
|
42
|
+
* recordSource:录像来源(透传给 WSPlayer)。
|
|
43
|
+
*
|
|
44
|
+
* - 仅用于 mode=record + autoPlay=true
|
|
45
|
+
*/
|
|
46
|
+
recordSource?: number;
|
|
47
|
+
width?: DahuaPlayerSize;
|
|
48
|
+
height?: DahuaPlayerSize;
|
|
49
|
+
staticPath?: string;
|
|
50
|
+
sdkUrl?: string;
|
|
51
|
+
streamType?: 1 | 2 | 3;
|
|
52
|
+
searchOnline?: boolean;
|
|
53
|
+
useNginxProxy?: boolean;
|
|
54
|
+
nginxProxyHost?: string;
|
|
55
|
+
useWSS?: boolean;
|
|
56
|
+
num?: number;
|
|
57
|
+
maxNum?: number;
|
|
58
|
+
showRecordProgressBar?: boolean;
|
|
59
|
+
dblClickFullscreen?: boolean;
|
|
60
|
+
playerOptions?: DahuaPlayerPlayerOptions;
|
|
61
|
+
debug?: boolean;
|
|
62
|
+
onReady?: () => void;
|
|
63
|
+
onPlay?: (payload?: {
|
|
64
|
+
mode?: DahuaPlayerMode;
|
|
65
|
+
}) => void;
|
|
66
|
+
onPause?: () => void;
|
|
67
|
+
onError?: (err: unknown) => void;
|
|
68
|
+
onDestroy?: () => void;
|
|
69
|
+
onSdkMessage?: (type: string, data: unknown) => void;
|
|
70
|
+
};
|
|
71
|
+
type DahuaPlayerEventMap = {
|
|
72
|
+
ready: void;
|
|
73
|
+
play: {
|
|
74
|
+
mode?: DahuaPlayerMode;
|
|
75
|
+
} | void;
|
|
76
|
+
pause: void;
|
|
77
|
+
error: unknown;
|
|
78
|
+
destroy: void;
|
|
79
|
+
};
|
|
80
|
+
type DahuaPlayerEventName = keyof DahuaPlayerEventMap;
|
|
81
|
+
type DahuaPlayerSdkCompat = {
|
|
82
|
+
getRaw: () => any;
|
|
83
|
+
playRealVideo: (opt: any) => void;
|
|
84
|
+
playRecordVideo: (opt: any) => void;
|
|
85
|
+
pause: (windowIndex?: number) => void;
|
|
86
|
+
play: (windowIndex?: number) => void;
|
|
87
|
+
close: (windowIndex?: number) => void;
|
|
88
|
+
setPlayerNum: (num: number) => void;
|
|
89
|
+
jumpPlayByDateTime: (datetime: string | Date | number, index?: number) => void;
|
|
90
|
+
playSpeed: (speed: number, index: number) => void;
|
|
91
|
+
setFullScreen: () => void;
|
|
92
|
+
setExitFullScreen: () => void;
|
|
93
|
+
callRaw: (method: string, ...args: any[]) => any;
|
|
94
|
+
destroy: () => void;
|
|
95
|
+
};
|
|
96
|
+
type DahuaPlayerInstance = {
|
|
97
|
+
id: string;
|
|
98
|
+
ready: Promise<void>;
|
|
99
|
+
pause: () => void;
|
|
100
|
+
destroy: () => void;
|
|
101
|
+
sdk: DahuaPlayerSdkCompat;
|
|
102
|
+
on: <K extends DahuaPlayerEventName>(event: K, handler: (payload: DahuaPlayerEventMap[K]) => void) => void;
|
|
103
|
+
off: <K extends DahuaPlayerEventName>(event: K, handler: (payload: DahuaPlayerEventMap[K]) => void) => void;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 大华播放器核心入口。
|
|
108
|
+
*
|
|
109
|
+
* 设计目标:
|
|
110
|
+
*
|
|
111
|
+
* - 对外只暴露一个初始化方法:`DahuaPlayer.init(options)`
|
|
112
|
+
* - 自动加载大华 SDK 脚本与 CSS(默认从 `/wsplayer-gov` 下加载)
|
|
113
|
+
* - 不在浏览器持久化保存 token(通过 sessionStorage shim 仅在内存注入)
|
|
114
|
+
* - 统一事件与错误码:ready/play/pause/error/destroy + ErrorCode
|
|
115
|
+
*
|
|
116
|
+
* 注意:
|
|
117
|
+
*
|
|
118
|
+
* - 本类不负责登录鉴权;需要外部提供已获取到的 `token`
|
|
119
|
+
*/
|
|
120
|
+
declare class DahuaPlayer {
|
|
121
|
+
/**
|
|
122
|
+
* 初始化播放器并返回实例。
|
|
123
|
+
*
|
|
124
|
+
* 生命周期:
|
|
125
|
+
*
|
|
126
|
+
* - 立即创建 DOM 结构并开始异步加载 SDK
|
|
127
|
+
* - `instance.ready` 会在 SDK 触发 `initializationCompleted` 后 resolve
|
|
128
|
+
* - `destroy()` 会销毁 SDK 实例、移除 DOM,并释放 token shim
|
|
129
|
+
*
|
|
130
|
+
* @throws DahuaPlayerError 当 container/token 不合法时抛出
|
|
131
|
+
*/
|
|
132
|
+
static init(options: DahuaPlayerInitOptions): DahuaPlayerInstance;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
declare enum ErrorCode {
|
|
136
|
+
CONTAINER_NOT_FOUND = "CONTAINER_NOT_FOUND",
|
|
137
|
+
INVALID_TOKEN = "INVALID_TOKEN",
|
|
138
|
+
SDK_LOAD_FAILED = "SDK_LOAD_FAILED",
|
|
139
|
+
SDK_LOAD_TIMEOUT = "SDK_LOAD_TIMEOUT",
|
|
140
|
+
SDK_INIT_FAILED = "SDK_INIT_FAILED",
|
|
141
|
+
PLAY_FAILED = "PLAY_FAILED",
|
|
142
|
+
NETWORK_DISCONNECTED = "NETWORK_DISCONNECTED",
|
|
143
|
+
DESTROYED = "DESTROYED"
|
|
144
|
+
}
|
|
145
|
+
declare class DahuaPlayerError extends Error {
|
|
146
|
+
code: ErrorCode;
|
|
147
|
+
userMessage: string;
|
|
148
|
+
cause?: unknown;
|
|
149
|
+
constructor(params: {
|
|
150
|
+
code: ErrorCode;
|
|
151
|
+
message: string;
|
|
152
|
+
userMessage: string;
|
|
153
|
+
cause?: unknown;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export { DahuaPlayer, DahuaPlayerError, type DahuaPlayerEventMap, type DahuaPlayerEventName, type DahuaPlayerInitOptions, type DahuaPlayerInstance, ErrorCode };
|