@ngxsp/core 0.0.1-next.0 → 0.0.1-next.1
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/index.cjs +67 -12
- package/index.cjs.map +1 -1
- package/index.d.cts +133 -3
- package/index.d.ts +133 -3
- package/index.js +61 -13
- package/index.js.map +1 -1
- package/package.json +16 -10
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/engine-factory.ts","../src/engine/native.engine.ts","../src/engine/native.factory.ts","../src/engine/engine-profile.ts","../src/engine/playback-capabilities.ts","../src/engine/capability-report.ts","../src/remote-config/remote-config.ts","../src/ports/storage.port.ts","../src/ports/telemetry.port.ts","../src/ports/log.port.ts","../src/ports/ports.ts","../src/facade/player-facade.ts","../src/plugins/metadata/providers/local-metadata.provider.ts","../src/plugins/subtitles/providers/local-subtitle.provider.ts","../src/utils/cache-store.ts","../src/commands.ts","../src/events/event-bus.ts","../src/plugins/progress/progress.plugin.ts","../src/plugins/resilience/resilience.plugin.ts","../src/plugins/ads/ssai.plugin.ts"],"names":["patch","merged","fetch"],"mappings":"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","file":"index.js","sourcesContent":["import type { PlayerConfig } from '../types';\nimport type { PlaybackEngine } from './playback-engine';\nimport type { PlaybackCapabilities } from './playback-capabilities';\n\nexport interface EngineFactory {\n /** Unique id (ex: 'native', 'shaka') */\n id: string;\n /** Higher priority wins when multiple support the same source. Default 0. */\n priority?: number;\n /** Whether this engine supports this config/source. */\n supports(config: PlayerConfig): boolean;\n /**\n * Optional, capability-aware selector.\n * If present, it is preferred over supports().\n */\n supportsWithCaps?: (config: PlayerConfig, caps: PlaybackCapabilities) => boolean;\n /** Create a new engine instance. */\n create(): PlaybackEngine;\n}\n\nexport function selectEngine(\n config: PlayerConfig,\n factories: EngineFactory[],\n caps?: PlaybackCapabilities\n): EngineFactory | null {\n const candidates = (factories ?? []).filter(f => {\n try {\n if (caps && typeof f.supportsWithCaps === 'function') return !!f.supportsWithCaps(config, caps);\n return !!f.supports(config);\n } catch {\n return false;\n }\n });\n if (candidates.length === 0) return null;\n candidates.sort((a,b) => (b.priority ?? 0) - (a.priority ?? 0));\n return candidates[0];\n}\n","import { PlaybackEngine, EngineEvent } from './playback-engine';\nimport { MediaTrack, PlayerSource } from '../types';\n\n\nfunction mimeFromUrl(url: string): string {\n try {\n const clean = url.split('?')[0].split('#')[0];\n const parts = clean.split('.');\n const ext = (parts.length > 1 ? parts.pop() : '')?.toLowerCase() || '';\n switch (ext) {\n case 'mp4': return 'video/mp4';\n case 'm4v': return 'video/x-m4v';\n case 'mov': return 'video/quicktime';\n case 'webm': return 'video/webm';\n case 'mkv': return 'video/x-matroska';\n case 'avi': return 'video/x-msvideo';\n case 'mpg':\n case 'mpeg': return 'video/mpeg';\n case 'ts': return 'video/mp2t';\n case 'ogv': return 'video/ogg';\n default: return '';\n }\n } catch {\n return '';\n }\n}\n\nexport class NativeEngine implements PlaybackEngine {\n public readonly id = 'native';\n private video?: HTMLVideoElement;\n private listeners: Array<(e: EngineEvent) => void> = [];\n\n async attach(videoEl: HTMLVideoElement): Promise<void> {\n this.video = videoEl;\n const v = videoEl;\n\n const emit = (e: EngineEvent) => this.listeners.forEach(l => l(e));\n\n v.addEventListener('timeupdate', () => emit({ type: 'timeupdate', currentTime: v.currentTime, duration: v.duration || 0 }));\n v.addEventListener('playing', () => emit({ type: 'state', state: 'playing' }));\n v.addEventListener('pause', () => emit({ type: 'state', state: 'paused' }));\n v.addEventListener('waiting', () => emit({ type: 'state', state: 'buffering' }));\n v.addEventListener('ended', () => emit({ type: 'state', state: 'ended' }));\n v.addEventListener('error', () => {\n const err = v.error;\n emit({\n type: 'error',\n error: { code: `HTML5_${err?.code ?? 'UNKNOWN'}`, message: err?.message ?? 'HTML5 video error', fatal: true, details: err }\n });\n });\n }\n\n async load(source: PlayerSource, opts?: { startTimeSec?: number }): Promise<void> {\n if (!this.video) throw new Error('NativeEngine not attached');\n const v = this.video;\n\n if (source.type === 'local-file') {\n if (!source.file) throw new Error('source.file is required');\n v.src = URL.createObjectURL(source.file);\n } else {\n if (!source.url) throw new Error('source.url is required');\n\n // For custom protocols (e.g. ngxsp-file://) Chromium sometimes refuses to infer\n // a playable type from the URL alone. Using a <source type=\"...\"> helps it pick\n // the right pipeline and avoids \"The element has no supported sources.\"\n const type = mimeFromUrl(source.url);\n while (v.firstChild) v.removeChild(v.firstChild);\n if (type) {\n const s = document.createElement('source');\n s.src = source.url;\n s.type = type;\n v.appendChild(s);\n v.removeAttribute('src');\n } else {\n v.src = source.url;\n }\n}\n\n await v.load();\n if (opts?.startTimeSec != null && isFinite(opts.startTimeSec)) {\n v.currentTime = Math.max(0, opts.startTimeSec);\n }\n }\n\n async destroy(): Promise<void> {\n if (!this.video) return;\n this.video.removeAttribute('src');\n this.video.load();\n this.video = undefined;\n this.listeners = [];\n }\n\n async play(): Promise<void> { await this.video?.play(); }\n async pause(): Promise<void> { this.video?.pause(); }\n async seekTo(timeSec: number): Promise<void> { if (this.video) this.video.currentTime = Math.max(0, timeSec); }\n async setPlaybackRate(rate: number): Promise<void> { if (this.video) this.video.playbackRate = rate; }\n async setVolume(volume: number): Promise<void> { if (this.video) this.video.volume = Math.min(1, Math.max(0, volume)); }\n\n async setTextTrack(_trackId: string | null): Promise<void> { /* native text tracks not managed here */ }\n async setAudioTrack(_trackId: string | null): Promise<void> { /* not supported in basic native impl */ }\n async setVideoTrack(_trackId: string | null): Promise<void> { /* not supported in basic native impl */ }\n\n async getTracks(): Promise<MediaTrack[]> { return []; }\n\n onEvent(cb: (ev: EngineEvent) => void): () => void {\n this.listeners.push(cb);\n return () => { this.listeners = this.listeners.filter(x => x !== cb); };\n }\n}\n","import type { EngineFactory } from './engine-factory';\nimport { NativeEngine } from './native.engine';\nimport type { PlayerConfig } from '../types';\n\nexport function createNativeEngineFactory(): EngineFactory {\n return {\n id: 'native',\n priority: 0,\n supports: (cfg: PlayerConfig) => {\n const drm = (cfg as any).drm ?? (cfg as any).source?.drm;\n if (drm?.required) return false;\n // Native engine for progressive/local urls\n const t = cfg.source.type;\n if (t === 'url' || t === 'local-file') return true;\n // also allow unknown as fallback, but avoid claiming HLS/DASH/DRM explicitly\n return false;\n },\n create: () => new NativeEngine()\n };\n}\n","import type { EngineProfileId, PlayerSource } from '../types';\n\n/**\n * High-level playback profiles.\n *\n * Goal: provide good defaults with *minimal configuration*.\n * Users can still override per-source hints via `source.abr`.\n */\nexport interface EngineProfileHints {\n /** Defaults applied only when the user did not specify `source.abr.*` */\n abr?: {\n maxHeight?: number;\n maxBandwidth?: number;\n };\n\n /** Shaka-specific streaming knobs (best-effort, ignored by non-shaka engines). */\n shakaStreaming?: {\n lowLatencyMode?: boolean;\n bufferingGoalSec?: number;\n rebufferingGoalSec?: number;\n };\n}\n\nexport function getEngineProfileHints(profile?: EngineProfileId): EngineProfileHints {\n switch (profile) {\n case 'tv':\n return {\n abr: {\n // Prefer higher quality by default.\n maxHeight: 2160\n },\n shakaStreaming: {\n bufferingGoalSec: 30,\n rebufferingGoalSec: 2\n }\n };\n case 'mobile':\n return {\n abr: {\n // Reasonable default for mobile data/CPU.\n maxHeight: 720\n },\n shakaStreaming: {\n bufferingGoalSec: 15,\n rebufferingGoalSec: 2\n }\n };\n case 'low-latency':\n return {\n abr: {\n // Avoid very high res by default (keeps latency predictable).\n maxHeight: 1080\n },\n shakaStreaming: {\n lowLatencyMode: true,\n bufferingGoalSec: 6,\n rebufferingGoalSec: 1\n }\n };\n case 'default':\n default:\n return {\n shakaStreaming: {\n bufferingGoalSec: 20,\n rebufferingGoalSec: 2\n }\n };\n }\n}\n\n/**\n * Apply profile defaults to a `PlayerSource` without overriding user-provided hints.\n *\n * This function is intentionally conservative: it only fills missing fields.\n */\nexport function applyEngineProfileToSource(source: PlayerSource, profile?: EngineProfileId): PlayerSource {\n const p: EngineProfileId = profile ?? 'default';\n const hints = getEngineProfileHints(p);\n\n const anySrc: any = source as any;\n const abrIn = (anySrc.abr ?? {}) as any;\n\n const abrOut: any = { ...abrIn };\n if (abrOut.maxHeight == null && hints.abr?.maxHeight != null) abrOut.maxHeight = hints.abr.maxHeight;\n if (abrOut.maxBandwidth == null && hints.abr?.maxBandwidth != null) abrOut.maxBandwidth = hints.abr.maxBandwidth;\n\n const out: any = {\n ...anySrc,\n // Expose profile to engines (optional).\n profile: p\n };\n\n if (Object.keys(abrOut).length) out.abr = abrOut;\n\n // Shaka streaming hints are carried on the source (optional).\n if (hints.shakaStreaming) {\n out._shakaStreaming = {\n ...(anySrc._shakaStreaming ?? {}),\n ...hints.shakaStreaming\n };\n }\n\n return out as PlayerSource;\n}\n","export interface PlaybackCapabilities {\n /** Browser has MediaSource (MSE). */\n mse: boolean;\n /** Browser has Encrypted Media Extensions (EME) API. */\n eme: boolean;\n /** True if navigator.mediaCapabilities is available. */\n mediaCapabilities: boolean;\n /** Whether basic HLS playback is possible via MSE/native. */\n hls: boolean;\n /** Whether basic DASH playback is possible via MSE. */\n dash: boolean;\n /** Progressive mp4/webm playback via <video src>. */\n progressive: boolean;\n /** Heuristic: support for at least one of common video codecs. */\n codecs: {\n mp4_h264: boolean;\n mp4_hevc: boolean;\n webm_vp9: boolean;\n webm_av1: boolean;\n };\n /** Known DRM key systems availability (best-effort). */\n drm: {\n widevine: boolean;\n playready: boolean;\n fairplay: boolean;\n };\n}\n\nexport function createDefaultCapabilities(): PlaybackCapabilities {\n return {\n mse: false,\n eme: false,\n mediaCapabilities: false,\n hls: false,\n dash: false,\n progressive: true,\n codecs: { mp4_h264: false, mp4_hevc: false, webm_vp9: false, webm_av1: false },\n drm: { widevine: false, playready: false, fairplay: false }\n };\n}\n\nexport async function detectPlaybackCapabilities(videoEl?: HTMLVideoElement): Promise<PlaybackCapabilities> {\n const caps = createDefaultCapabilities();\n\n const w = globalThis as any;\n caps.mse = !!w.MediaSource && typeof w.MediaSource.isTypeSupported === 'function';\n caps.eme = !!(w.navigator && w.navigator.requestMediaKeySystemAccess);\n caps.mediaCapabilities = !!(w.navigator && (w.navigator as any).mediaCapabilities);\n\n // Codec support (quick heuristic). Prefer MediaSource.isTypeSupported when available.\n const v = videoEl ?? (typeof document !== 'undefined' ? document.createElement('video') : undefined);\n const canPlay = (mime: string) => {\n try {\n if (caps.mse && w.MediaSource?.isTypeSupported) return !!w.MediaSource.isTypeSupported(mime);\n if (v && typeof v.canPlayType === 'function') return v.canPlayType(mime) !== '';\n return false;\n } catch {\n return false;\n }\n };\n\n caps.codecs.mp4_h264 = canPlay('video/mp4; codecs=\"avc1.42E01E\"');\n caps.codecs.mp4_hevc = canPlay('video/mp4; codecs=\"hvc1.1.6.L93.B0\"');\n caps.codecs.webm_vp9 = canPlay('video/webm; codecs=\"vp09.00.10.08\"');\n caps.codecs.webm_av1 = canPlay('video/webm; codecs=\"av01.0.05M.08\"');\n\n // HLS/DASH heuristics:\n // - DASH typically requires MSE.\n // - HLS can be native on Safari, otherwise usually requires MSE + JS player (Shaka/hls.js).\n caps.dash = caps.mse;\n caps.hls = canPlay('application/vnd.apple.mpegurl') || canPlay('application/x-mpegURL') || caps.mse;\n caps.progressive = caps.codecs.mp4_h264 || caps.codecs.webm_vp9 || caps.codecs.webm_av1 || true;\n\n // DRM availability (best-effort probes)\n if (caps.eme && w.navigator?.requestMediaKeySystemAccess) {\n const probe = async (ks: string) => {\n try {\n // minimal config; browsers may still reject.\n const cfg = [{\n initDataTypes: ['cenc'],\n audioCapabilities: [{ contentType: 'audio/mp4; codecs=\"mp4a.40.2\"' }],\n videoCapabilities: [{ contentType: 'video/mp4; codecs=\"avc1.42E01E\"' }]\n }];\n await w.navigator.requestMediaKeySystemAccess(ks, cfg);\n return true;\n } catch {\n return false;\n }\n };\n\n // Widevine\n caps.drm.widevine = await probe('com.widevine.alpha');\n // PlayReady\n caps.drm.playready = await probe('com.microsoft.playready');\n // FairPlay (Safari)\n caps.drm.fairplay = await probe('com.apple.fps.1_0');\n }\n\n return caps;\n}\n","import type { PlayerConfig } from '../types';\n\nexport interface CapabilityReport {\n timestamp: number;\n userAgent?: string;\n source?: {\n type?: string;\n live?: boolean;\n drm?: boolean;\n url?: string;\n contentId?: string;\n };\n platform: {\n isSecureContext: boolean;\n };\n features: {\n mse: boolean;\n eme: boolean;\n mediaCapabilities: boolean;\n };\n canPlay: Record<string, boolean>;\n /**\n * Optional, best-effort decoding probes via the MediaCapabilities API.\n *\n * Keys are stable labels (e.g. \"h264_1080p\").\n */\n mediaDecoding?: Record<string, { supported: boolean; smooth?: boolean; powerEfficient?: boolean }>;\n notes: string[];\n}\n\n/** Best-effort decoding probes used for diagnostics and ABR tuning hints. */\nexport async function createMediaDecodingReport(): Promise<CapabilityReport['mediaDecoding']> {\n const mc: any = (globalThis as any).navigator?.mediaCapabilities;\n if (!mc?.decodingInfo) return undefined;\n\n const mk = (contentType: string, width: number, height: number, bitrate: number) => ({\n type: 'media-source',\n video: { contentType, width, height, bitrate, framerate: 30 },\n audio: { contentType: 'audio/mp4; codecs=\"mp4a.40.2\"', channels: 2, bitrate: 128000, samplerate: 48000 }\n });\n\n const probes: Array<[string, any]> = [\n ['h264_720p', mk('video/mp4; codecs=\"avc1.64001f\"', 1280, 720, 2500000)],\n ['h264_1080p', mk('video/mp4; codecs=\"avc1.640028\"', 1920, 1080, 5000000)],\n ['vp9_1080p', mk('video/webm; codecs=\"vp09.00.51.08\"', 1920, 1080, 5000000)]\n ];\n\n const out: NonNullable<CapabilityReport['mediaDecoding']> = {};\n for (const [key, cfg] of probes) {\n try {\n const info = await mc.decodingInfo(cfg);\n out[key] = {\n supported: !!info?.supported,\n smooth: info?.smooth,\n powerEfficient: info?.powerEfficient\n };\n } catch {\n // ignore\n }\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction safeUa(): string | undefined {\n try { return (globalThis as any).navigator?.userAgent; } catch { return undefined; }\n}\n\nfunction canPlayType(videoEl: HTMLVideoElement | undefined, mime: string): boolean {\n try {\n const v = videoEl ?? (typeof document !== 'undefined' ? document.createElement('video') : undefined);\n if (!v || typeof v.canPlayType !== 'function') return false;\n return v.canPlayType(mime) !== '';\n } catch {\n return false;\n }\n}\n\nexport function createCapabilityReport(\n videoEl?: HTMLVideoElement,\n cfg?: PlayerConfig,\n mediaDecoding?: CapabilityReport['mediaDecoding']\n): CapabilityReport {\n const w = globalThis as any;\n const notes: string[] = [];\n\n const mse = !!w.MediaSource && typeof w.MediaSource.isTypeSupported === 'function';\n const eme = !!(w.navigator && w.navigator.requestMediaKeySystemAccess);\n const mediaCapabilities = !!(w.navigator && (w.navigator as any).mediaCapabilities);\n\n if (!mse) notes.push('MediaSource (MSE) not available');\n if (!eme) notes.push('Encrypted Media Extensions (EME) not available');\n\n const canPlay: Record<string, boolean> = {\n 'video/mp4; codecs=\"avc1.42E01E\"': canPlayType(videoEl, 'video/mp4; codecs=\"avc1.42E01E\"'),\n 'video/mp4; codecs=\"hvc1.1.6.L93.B0\"': canPlayType(videoEl, 'video/mp4; codecs=\"hvc1.1.6.L93.B0\"'),\n 'video/webm; codecs=\"vp09.00.10.08\"': canPlayType(videoEl, 'video/webm; codecs=\"vp09.00.10.08\"'),\n 'video/webm; codecs=\"av01.0.05M.08\"': canPlayType(videoEl, 'video/webm; codecs=\"av01.0.05M.08\"'),\n 'application/vnd.apple.mpegurl': canPlayType(videoEl, 'application/vnd.apple.mpegurl'),\n 'application/dash+xml': canPlayType(videoEl, 'application/dash+xml')\n };\n\n const secure = (() => {\n try { return !!(globalThis as any).isSecureContext; } catch { return false; }\n })();\n if (!secure) notes.push('Not running in a secure context (HTTPS). DRM and some APIs may fail.');\n\n const src = cfg?.source;\n const drmCfg = cfg ? ((cfg as any).drm ?? (src as any)?.drm) : undefined;\n const drmFlag = !!drmCfg;\n\n return {\n timestamp: Date.now(),\n userAgent: safeUa(),\n source: src ? {\n type: (src as any).type,\n live: (src as any).live,\n drm: drmFlag,\n url: (src as any).url,\n contentId: (src as any).contentId\n } : undefined,\n platform: { isSecureContext: secure },\n features: { mse, eme, mediaCapabilities },\n canPlay,\n mediaDecoding,\n notes\n };\n}\n","import type { PlayerPorts } from '../ports/ports';\nimport type { PlayerConfig, RemoteConfigConfig, RemoteConfigPayload } from '../types';\n\ntype CacheEntry = { ts: number; data: RemoteConfigPayload };\n\nconst DEFAULT_ALLOW = [\n 'profile',\n 'abr',\n 'resilience',\n 'drm',\n 'ads',\n 'ui',\n 'subtitles',\n 'metadata',\n 'progress',\n 'chapters',\n 'offline'\n];\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return !!v && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction deepMerge<T extends Record<string, any>>(base: T, patch: Record<string, any>): T {\n const out: any = { ...base };\n for (const [k, v] of Object.entries(patch)) {\n if (isPlainObject(v) && isPlainObject(out[k])) out[k] = deepMerge(out[k], v);\n else out[k] = v;\n }\n return out;\n}\n\nfunction shallowMerge<T extends Record<string, any>>(base: T, patch: Record<string, any>): T {\n return { ...(base as any), ...(patch as any) };\n}\n\nfunction hashKey(url: string): string {\n // Small deterministic key (no crypto dependency).\n let h = 0;\n for (let i = 0; i < url.length; i++) h = (h * 31 + url.charCodeAt(i)) >>> 0;\n return h.toString(16);\n}\n\nasync function readCache(storage: PlayerPorts['storage'] | undefined, key: string): Promise<CacheEntry | null> {\n if (!storage?.get) return null;\n const raw = await storage.get(key);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as CacheEntry;\n if (!parsed || typeof parsed.ts !== 'number' || !isPlainObject(parsed.data)) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nasync function writeCache(storage: PlayerPorts['storage'] | undefined, key: string, entry: CacheEntry): Promise<void> {\n if (!storage?.set) return;\n await storage.set(key, JSON.stringify(entry));\n}\n\nexport async function applyRemoteConfig(\n cfg: PlayerConfig,\n ports: Partial<PlayerPorts>\n): Promise<{ config: PlayerConfig; applied: boolean; payload?: RemoteConfigPayload; source: 'cache' | 'network' | 'none' }>\n{\n const rc = cfg.remoteConfig;\n if (!rc?.enabled) return { config: cfg, applied: false, source: 'none' };\n\n const url = rc.url;\n const ttlMs = Math.max(1, (rc.ttlSec ?? 300)) * 1000;\n const mode = rc.mode ?? 'deep';\n const allow = (rc.allow?.length ? rc.allow : DEFAULT_ALLOW) as string[];\n const cacheKey = `remoteConfig:${hashKey(url)}`;\n\n const now = Date.now();\n\n try {\n const cached = await readCache(ports.storage, cacheKey);\n if (cached && now - cached.ts < ttlMs) {\n const patch = filterAllowList(cached.data, allow);\n const merged = mode === 'shallow' ? shallowMerge(cfg as any, patch as any) : deepMerge(cfg as any, patch as any);\n return { config: merged, applied: true, payload: cached.data, source: 'cache' };\n }\n\n const fetch = ports.http?.fetch;\n if (!fetch) throw new Error('Remote config enabled but no ports.http.fetch provided');\n\n const res = await fetch(url, { method: 'GET', headers: { 'accept': 'application/json' } });\n if (!res.ok) throw new Error(`Remote config HTTP ${res.status}`);\n const json = (await res.json()) as unknown;\n if (!isPlainObject(json)) throw new Error('Remote config payload must be a JSON object');\n\n const payload = json as RemoteConfigPayload;\n await writeCache(ports.storage, cacheKey, { ts: now, data: payload });\n\n const patch = filterAllowList(payload, allow);\n const merged = mode === 'shallow' ? shallowMerge(cfg as any, patch as any) : deepMerge(cfg as any, patch as any);\n return { config: merged, applied: true, payload, source: 'network' };\n } catch (err) {\n ports.log?.warn?.('[ngxsp] remoteConfig failed', err);\n return { config: cfg, applied: false, source: 'none' };\n }\n}\n\nfunction filterAllowList(payload: RemoteConfigPayload, allow: string[]): RemoteConfigPayload {\n const out: RemoteConfigPayload = {};\n for (const k of allow) {\n if (Object.prototype.hasOwnProperty.call(payload, k)) out[k] = payload[k];\n }\n return out;\n}\n","export interface StoragePort {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n remove?(key: string): Promise<void>;\n}\n\nexport class MemoryStoragePort implements StoragePort {\n private map = new Map<string, string>();\n async get(key: string): Promise<string | null> { return this.map.get(key) ?? null; }\n async set(key: string, value: string): Promise<void> { this.map.set(key, value); }\n async remove(key: string): Promise<void> { this.map.delete(key); }\n}\n","export interface TelemetryPort {\n add(sample: Record<string, unknown>): void;\n export?(): unknown;\n}\n\nexport class NoopTelemetryPort implements TelemetryPort {\n add(_sample: Record<string, unknown>): void { /* noop */ }\n}\n","export interface LogPort {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n}\n\nexport class ConsoleLogPort implements LogPort {\n debug(...args: unknown[]): void { console.debug(...args); }\n info(...args: unknown[]): void { console.info(...args); }\n warn(...args: unknown[]): void { console.warn(...args); }\n error(...args: unknown[]): void { console.error(...args); }\n}\n","import type { HttpPort } from './http.port';\nimport type { StoragePort } from './storage.port';\nimport type { TelemetryPort } from './telemetry.port';\nimport type { LogPort } from './log.port';\nimport { MemoryStoragePort } from './storage.port';\nimport { NoopTelemetryPort } from './telemetry.port';\nimport { ConsoleLogPort } from './log.port';\n\nexport interface PlayerPorts {\n http: HttpPort;\n storage: StoragePort;\n telemetry: TelemetryPort;\n log: LogPort;\n}\n\nexport function createDefaultPorts(): PlayerPorts {\n const http: HttpPort = { fetch: (input, init) => fetch(input, init) };\n return {\n http,\n storage: new MemoryStoragePort(),\n telemetry: new NoopTelemetryPort(),\n log: new ConsoleLogPort()\n };\n}\n\nexport { MemoryStoragePort } from './storage.port';\nexport { NoopTelemetryPort } from './telemetry.port';\nexport { ConsoleLogPort } from './log.port';\n","import { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport {\n AspectRatioMode,\n MediaTrack,\n PlayerConfig,\n PlayerError,\n PlayerErrorCode,\n PlayerState,\n type DiagnosticsSnapshot,\n type DiagnosticsEngineInfo,\n type PlayerTime,\n type PlayerSource\n} from '../types';\nimport type { TelemetrySample, TelemetryEvent, TelemetryLevel } from '../telemetry/telemetry.types';\nimport { PlaybackEngine, EngineEvent, LoadOptions } from '../engine/playback-engine';\nimport type { EngineFactory } from '../engine/engine-factory';\nimport { selectEngine } from '../engine/engine-factory';\nimport { createNativeEngineFactory } from '../engine/native.factory';\nimport { NativeEngine } from '../engine/native.engine';\nimport { applyEngineProfileToSource } from '../engine/engine-profile';\nimport { detectPlaybackCapabilities, type PlaybackCapabilities } from '../engine/playback-capabilities';\nimport { createCapabilityReport, createMediaDecodingReport, type CapabilityReport } from '../engine/capability-report';\nimport { applyRemoteConfig } from '../remote-config/remote-config';\nimport { PlayerPlugin, PlayerContext } from '../plugins/plugin';\nimport type { PlayerPorts } from '../ports/ports';\nimport { createDefaultPorts } from '../ports/ports';\nimport { VideoMetadata } from '../plugins/metadata/metadata.types';\n\nexport interface PlayerSnapshot {\n currentTime: number;\n duration: number;\n state: PlayerState;\n bufferedAheadSec: number;\n}\n\n/**\n * Public diagnostics payload.\n *\n * NOTE: This is intentionally an alias of `DiagnosticsSnapshot` to keep one\n * canonical shape exported by `@ngxsp/core`.\n */\nexport type PlayerDiagnostics = DiagnosticsSnapshot;\n\nexport class PlayerFacade {\n private engineFactories: EngineFactory[] = [createNativeEngineFactory()];\n private engineId = 'native';\n private lastNonFatal: PlayerError | null = null;\n\n // Optional MediaCapabilities decoding probes (async, best-effort)\n private mediaDecodingSub = new BehaviorSubject<CapabilityReport['mediaDecoding'] | null>(null);\n private video?: HTMLVideoElement;\n private engine?: PlaybackEngine;\n private plugins: PlayerPlugin[] = [];\n private ctx?: PlayerContext;\n\n private stateSub = new BehaviorSubject<PlayerState>({ kind: 'idle' });\n private timeSub = new BehaviorSubject<{ currentTime: number; duration: number }>({ currentTime: 0, duration: 0 });\n private bufferSub = new BehaviorSubject<number>(0);\n private tracksSub = new BehaviorSubject<MediaTrack[]>([]);\n private errorSub = new Subject<PlayerError>();\n private metadataSub = new BehaviorSubject<VideoMetadata | null>(null);\n\n private capsSub = new BehaviorSubject<PlaybackCapabilities | null>(null);\n readonly capabilities$ = this.capsSub.asObservable();\n\n readonly state$ = this.stateSub.asObservable();\n readonly time$ = this.timeSub.asObservable();\n readonly bufferAheadSec$ = this.bufferSub.asObservable();\n readonly tracks$ = this.tracksSub.asObservable();\n readonly error$ = this.errorSub.asObservable();\n readonly metadata$ = this.metadataSub.asObservable();\n\n private seriesIndexSub = new BehaviorSubject<number | null>(null);\n readonly seriesIndex$ = this.seriesIndexSub.asObservable();\n\n private playlistIndexSub = new BehaviorSubject<number | null>(null);\n readonly playlistIndex$ = this.playlistIndexSub.asObservable();\n private playlist: import('../types').PlayerSource[] = [];\n private playlistKey = '';\n\n private externalVttUrl?: string;\n\n constructor(\n private chooseEngine: (cfg: PlayerConfig) => PlaybackEngine = defaultEngineChooser,\n private ports: PlayerPorts = createDefaultPorts()\n ) {}\n\n\nattach(videoEl: HTMLVideoElement, plugins: PlayerPlugin[] = [], config: PlayerConfig, ports?: Partial<PlayerPorts>, engines?: EngineFactory[]): void {\n // merge ports\n if (ports) {\n this.ports = { ...this.ports, ...ports } as any;\n }\n // Engines registry: always keep native engine as fallback to avoid breaking progressive/local playback.\n if (engines && engines.length) {\n this.engineFactories = [createNativeEngineFactory(), ...engines];\n } else {\n this.engineFactories = [createNativeEngineFactory()];\n }\n this.video = videoEl;\n this.plugins = plugins ?? [];\n this.ctx = { config, facade: this, ports: this.ports, contentId: config.source.contentId };\n\n // Capability probe (async; used for engine selection + better diagnostics).\n void detectPlaybackCapabilities(videoEl)\n .then(c => this.capsSub.next(c))\n .catch(() => this.capsSub.next(null));\n\n // MediaCapabilities decoding probes (async; best-effort; used for diagnostics/ABR hints).\n void createMediaDecodingReport()\n .then(r => this.mediaDecodingSub.next(r ?? null))\n .catch(() => this.mediaDecodingSub.next(null));\n this.emitTelemetry('player:attach','info');\n this.emitTelemetry('player:source_set','info',{ type: config.source.type, live: config.source.live });\n\n this.installVideoEventListeners();\n\n // init plugins\n for (const p of this.plugins) {\n try { void p.onInit?.(this.ctx); } catch { /* noop */ }\n }\n}\n\nasync load(config: PlayerConfig, opts?: LoadOptions): Promise<void> {\n if (!this.video) throw new Error('PlayerFacade not attached');\n if (!this.ctx) throw new Error('PlayerFacade context missing');\n\n // Remote control-plane (feature flags / tuning / profiles) – applied before engine/plugin decisions.\n const rc = await applyRemoteConfig(config, this.ports);\n if (rc.applied) {\n this.ports.telemetry?.add?.({\n event: 'remote_config:applied' as any,\n level: 'info',\n ts: Date.now(),\n data: { source: rc.source, url: config.remoteConfig?.url }\n } as any);\n config = rc.config;\n }\n\n // Normalize playlist (v1.7.1)\n const list = config.playlist ?? [];\n if (list.length > 0) {\n const key = list.map(s => (s.contentId ?? s.url ?? (s as any).filePath ?? '')).join('|');\n if (key !== this.playlistKey) {\n this.playlistKey = key;\n this.playlist = list;\n const startIdx = config.playlistStartIndex ?? 0;\n this.playlistIndexSub.next(Math.max(0, Math.min(startIdx, list.length - 1)));\n }\n if (opts?.playlistIndex != null) {\n this.playlistIndexSub.next(Math.max(0, Math.min(opts.playlistIndex, list.length - 1)));\n }\n const idx = this.playlistIndexSub.value ?? 0;\n const src = list[idx] ?? config.source;\n config = { ...config, source: src, autoNext: config.autoNext ?? true };\n this.emitTelemetry('player:playlist_index', 'info', { index: idx, total: list.length });\n }\n\n this.ctx.config = config;\n this.ctx.contentId = config.source.contentId;\n this.emitTelemetry('player:load_start','info');\n try {\n const now = (globalThis.performance?.now?.() ?? Date.now());\n this.qoe.loadStartMs = now;\n this.qoe.firstFrameMs = 0;\n this.qoe.startupMs = 0;\n this.qoe.rebufferCount = 0;\n this.qoe.rebufferMs = 0;\n this.qoe.rebufferStartMs = 0;\n this.qoe.firstFrameEmitted = false;\n } catch {}\n\n for (const p of this.plugins) {\n try { await p.onLoadStart?.(this.ctx); } catch { /* noop */ }\n }\n\n // (re)create engine\n if (this.engine) {\n try { await this.engine.destroy(); } catch {}\n this.engine = undefined;\n }\n\n const caps = this.capsSub.value ?? undefined;\n const chosen = selectEngine(config, this.engineFactories, caps);\n if (!chosen) {\n const detail = { source: config.source, caps };\n this.emitFatal(new Error(`No engine registered for this source: ${JSON.stringify(detail)}`), 'ENGINE_MISSING');\n throw new Error('ENGINE_MISSING');\n }\n const engine = chosen.create();\n\n this.engine = engine;\n this.engineId = (engine as any).id ?? (engine.constructor?.name ?? 'engine');\n this.emitTelemetry('player:engine_selected','info',{ engineId: this.engineId });\n\n await engine.attach(this.video);\n\n const off = engine.onEvent(ev => this.handleEngineEvent(ev));\n (this as any)._offEngine = off;\n\n const startTime = opts?.startTimeSec;\n // Merge DRM from config onto the source so engines can stay \"source-only\".\n const sourceWithDrm = applyEngineProfileToSource(\n {\n ...config.source,\n drm: (config as any).drm ?? (config.source as any).drm,\n profile: (config as any).profile ?? (config.source as any).profile\n } as any,\n (config as any).profile ?? (config.source as any).profile\n ) as any;\n try {\n await engine.load(sourceWithDrm, { startTimeSec: startTime ?? undefined });\n this.stateSub.next({ kind: 'paused' });\n this.emitTelemetry('player:load_ok','info');\n } catch (err) {\n this.emitTelemetry('player:load_fail','error',{}, (err as any)?.message);\n this.emitFatal(err, 'UNKNOWN');\n throw err;\n }\n\n // notify plugins loaded\n for (const p of this.plugins) {\n try { await p.onLoaded?.(this.ctx); } catch { /* noop */ }\n }\n}\n\nasync reload(opts?: LoadOptions): Promise<void> {\n if (!this.ctx) throw new Error('PlayerFacade context missing');\n const snap = this.snapshot();\n const start = opts?.startTimeSec ?? snap.currentTime ?? 0;\n await this.load(this.ctx.config, { startTimeSec: start });\n}\n\nasync next(): Promise<void> {\n if (!this.ctx) return;\n const cfg = this.ctx.config;\n const list = cfg.playlist ?? this.playlist;\n if (!list || list.length === 0) return;\n const idx = (this.playlistIndexSub.value ?? 0) + 1;\n if (idx >= list.length) return;\n await this.load(cfg, { playlistIndex: idx, startTimeSec: 0 });\n}\n\nasync previous(): Promise<void> {\n if (!this.ctx) return;\n const cfg = this.ctx.config;\n const list = cfg.playlist ?? this.playlist;\n if (!list || list.length === 0) return;\n const idx = (this.playlistIndexSub.value ?? 0) - 1;\n if (idx < 0) return;\n await this.load(cfg, { playlistIndex: idx, startTimeSec: 0 });\n}\n\n\nasync destroy(): Promise<void> {\n try {\n for (const p of this.plugins) {\n try { await p.onDestroy?.(this.ctx!); } catch { /* noop */ }\n }\n } finally {\n try { (this as any)._offEngine?.(); } catch {}\n try { await this.engine?.destroy(); } catch {}\n this.engine = undefined;\n this.video = undefined;\n this.ctx = undefined;\n this.plugins = [];\n this.emitTelemetry('player:init','debug',{ destroyed: true });\n }\n}\n\n/** Emit a non-fatal error (does not transition to fatal error state). */\npublic emitNonFatal(err: unknown, code: PlayerErrorCode | string = 'UNKNOWN'): void {\n const pe = this.toPlayerError(err, false, code);\n this.lastNonFatal = pe;\n this.emitTelemetry('player:error_nonfatal', 'warn', { code: pe.code }, pe.message);\n // let plugins observe if they subscribe to error$ externally\n this.errorSub.next(pe);\n}\n\n/** Emit a fatal error (transitions to error state). */\nprivate emitFatal(err: unknown, code: PlayerErrorCode | string = 'UNKNOWN'): void {\n const pe = this.toPlayerError(err, true, code);\n this.emitTelemetry('player:error_fatal', 'error', { code: pe.code }, pe.message);\n this.stateSub.next({ kind: 'error', error: pe });\n this.errorSub.next(pe);\n // notify plugins\n if (this.ctx) {\n for (const p of this.plugins) {\n try { void p.onError?.(this.ctx, pe); } catch { /* noop */ }\n }\n }\n}\n\nprivate async tryAutoNext(): Promise<void> {\n if (!this.ctx) return;\n const cfg = this.ctx.config;\n const list = cfg.playlist ?? this.playlist;\n if (!list || list.length === 0) return;\n const auto = cfg.autoNext ?? true;\n if (!auto) return;\n const idx = this.playlistIndexSub.value ?? 0;\n if (idx >= list.length - 1) return;\n\n const nextIdx = idx + 1;\n this.emitTelemetry('player:auto_next','info',{ from: idx, to: nextIdx, total: list.length });\n try {\n await this.load(cfg, { playlistIndex: nextIdx, startTimeSec: 0 });\n } catch {\n // handled by load\n }\n}\n\n\nprivate installed = false;\n\n // QoE metrics (v1.7)\n private qoe = {\n loadStartMs: 0,\n firstFrameMs: 0,\n startupMs: 0,\n rebufferCount: 0,\n rebufferMs: 0,\n rebufferStartMs: 0 as number | 0,\n firstFrameEmitted: false\n };\nprivate installVideoEventListeners(): void {\n const v = this.video;\n if (!v || this.installed) return;\n this.installed = true;\n\n const nowMs = () => (globalThis.performance?.now?.() ?? Date.now());\n\n const maybeFirstFrame = () => {\n if (this.qoe.firstFrameEmitted) return;\n const t = nowMs();\n this.qoe.firstFrameMs = t;\n if (this.qoe.loadStartMs) this.qoe.startupMs = Math.max(0, t - this.qoe.loadStartMs);\n this.qoe.firstFrameEmitted = true;\n this.emitTelemetry('qoe:first_frame','info', { firstFrameMs: this.qoe.startupMs });\n };\n\n const maybeEndRebuffer = () => {\n if (!this.qoe.rebufferStartMs) return;\n const t = nowMs();\n const delta = Math.max(0, t - this.qoe.rebufferStartMs);\n this.qoe.rebufferMs += delta;\n this.qoe.rebufferStartMs = 0;\n this.emitTelemetry('qoe:rebuffer_end','debug', { deltaMs: delta, totalMs: this.qoe.rebufferMs, count: this.qoe.rebufferCount });\n };\n\n v.addEventListener('timeupdate', () => {\n this.emitTelemetry('player:timeupdate', 'debug', { t: v.currentTime, d: v.duration });\n });\n\nv.addEventListener('loadeddata', () => {\n // First frame decoded (often the best proxy)\n maybeFirstFrame();\n});\n\nv.addEventListener('playing', () => {\n // Playback actually started\n maybeFirstFrame();\n maybeEndRebuffer();\n this.emitTelemetry('player:playing', 'info');\n});\n\nv.addEventListener('waiting', () => {\n // Rebuffering\n if (!this.qoe.rebufferStartMs) {\n this.qoe.rebufferCount += 1;\n this.qoe.rebufferStartMs = nowMs();\n this.emitTelemetry('qoe:rebuffer_start','debug', { count: this.qoe.rebufferCount });\n }\n});\n\nv.addEventListener('stalled', () => {\n if (!this.qoe.rebufferStartMs) {\n this.qoe.rebufferCount += 1;\n this.qoe.rebufferStartMs = nowMs();\n this.emitTelemetry('qoe:rebuffer_start','debug', { count: this.qoe.rebufferCount, reason: 'stalled' });\n }\n});\n\n\n v.addEventListener('ended', () => {\n maybeEndRebuffer();\n this.emitTelemetry('player:ended', 'info');\n this.emitTelemetry('qoe:summary','info', { startupMs: this.qoe.startupMs, rebufferCount: this.qoe.rebufferCount, rebufferMs: this.qoe.rebufferMs });\n void this.tryAutoNext();\n });\n\n v.addEventListener('pause', () => {\n this.emitTelemetry('player:pause', 'info');\n });\n\n v.addEventListener('error', () => {\n const me = v.error;\n if (!me) return;\n const codeMap: Record<number, PlayerErrorCode> = {\n 1: 'UNKNOWN',\n 2: 'NETWORK_HTTP',\n 3: 'DECODE_ERROR',\n 4: 'SRC_NOT_SUPPORTED'\n };\n const c = codeMap[me.code] ?? 'UNKNOWN';\n this.emitFatal(me, c);\n });\n}\n\nprivate emitTelemetry(event: TelemetryEvent, level: TelemetryLevel = 'info', data?: Record<string, unknown>, message?: string): void {\n try {\n const cfg = this.ctx?.config;\n const contentId = cfg?.source?.contentId;\n const sample: TelemetrySample = {\n ts: Date.now(),\n level,\n event,\n contentId,\n engineId: this.engineId,\n message,\n data\n };\n this.ports.telemetry.add(sample as any);\n } catch { /* noop */ }\n}\n\nprivate toPlayerError(err: unknown, fatal: boolean, code: PlayerErrorCode | string = 'UNKNOWN'): PlayerError {\n const e: any = err as any;\n const msg = e?.message ? String(e.message) : String(err ?? 'Unknown error');\n return { code, message: msg, fatal, details: e };\n}\n async play(): Promise<void> {\n this.emitTelemetry('player:play_request','info');\n try {\n await this.engine?.play();\n this.emitTelemetry('player:play_ok','info');\n } catch (err) {\n const name = (err as any)?.name;\n if (name === 'NotAllowedError') {\n this.emitNonFatal(err, 'AUTOPLAY_BLOCKED');\n this.emitTelemetry('player:play_fail','warn',{ code: 'AUTOPLAY_BLOCKED' }, (err as any)?.message);\n } else {\n this.emitFatal(err, 'UNKNOWN');\n this.emitTelemetry('player:play_fail','error',{ code: 'UNKNOWN' }, (err as any)?.message);\n }\n throw err;\n }\n }\n async pause(): Promise<void> { await this.engine?.pause(); }\n async seekTo(timeSec: number): Promise<void> { await this.engine?.seekTo(timeSec); }\n async setRate(rate: number): Promise<void> { await this.engine?.setPlaybackRate(rate); }\n async setVolume(volume: number): Promise<void> { await this.engine?.setVolume(volume); }\n\n async setTextTrack(trackId: string | null): Promise<void> {\n if (trackId === 'external') {\n // handled by external VTT injection\n if (this.video && this.externalVttUrl) {\n this.ensureExternalTrack(this.externalVttUrl);\n }\n return;\n }\n await this.engine?.setTextTrack(trackId);\n }\n async setAudioTrack(trackId: string | null): Promise<void> { await this.engine?.setAudioTrack(trackId); }\n async setVideoTrack(trackId: string | null): Promise<void> { await this.engine?.setVideoTrack(trackId); }\n\n // UI helpers\n setAspectRatio(_mode: AspectRatioMode): void {\n // UI component controls CSS class; facade keeps it as state if needed in your app.\n }\n\n snapshot(): PlayerSnapshot {\n const time = this.timeSub.value;\n return {\n currentTime: time.currentTime,\n duration: time.duration,\n state: this.stateSub.value,\n bufferedAheadSec: this.bufferSub.value\n };\n }\n\n /**\n * Diagnostics helper for UI / support logs.\n * Safe to call anytime after attach().\n */\n diagnostics(): PlayerDiagnostics {\n const snap = this.snapshot();\n const bufferedEnd = (snap.currentTime ?? 0) + (snap.bufferedAheadSec ?? 0);\n const time: PlayerTime = {\n currentTime: snap.currentTime,\n duration: snap.duration,\n bufferedEnd\n };\n const engine: DiagnosticsEngineInfo = {\n id: this.engine?.id ?? 'none',\n selectedBy: 'supports',\n reasons: []\n };\n const source = (this.ctx?.config as any)?.source as PlayerSource | undefined;\n return {\n ts: Date.now(),\n engine,\n capabilities: createCapabilityReport(\n this.video ?? undefined,\n this.ctx?.config,\n this.mediaDecodingSub.value ?? undefined\n ),\n source,\n state: snap.state,\n time,\n lastNonFatal: this.lastNonFatal,\n\n // backward compat\n selectedEngineId: engine.id,\n snapshot: {\n currentTime: snap.currentTime,\n duration: snap.duration,\n state: snap.state,\n bufferedAheadSec: snap.bufferedAheadSec\n }\n };\n }\n\n // External tracks (for provider-based subtitles)\n async setExternalVttTrack(lang: string, vtt: string): Promise<void> {\n if (!this.video) return;\n const blob = new Blob([vtt], { type: 'text/vtt' });\n this.externalVttUrl = URL.createObjectURL(blob);\n this.ensureExternalTrack(this.externalVttUrl, lang);\n }\n\n setMetadata(meta: VideoMetadata): void { this.metadataSub.next(meta); }\n\n private ensureExternalTrack(url: string, lang: string = 'und'): void {\n if (!this.video) return;\n // Remove prior external track\n const prev = this.video.querySelector('track[data-external=\"true\"]');\n if (prev) prev.remove();\n\n const track = document.createElement('track');\n track.kind = 'subtitles';\n track.label = `External (${lang})`;\n track.srclang = lang;\n track.src = url;\n track.default = true;\n track.setAttribute('data-external', 'true');\n\n this.video.appendChild(track);\n }\n\n private handleEngineEvent(ev: EngineEvent): void {\n if (ev.type === 'timeupdate') {\n this.timeSub.next({ currentTime: ev.currentTime, duration: ev.duration });\n return;\n }\n if (ev.type === 'bufferupdate') {\n this.bufferSub.next(ev.bufferedAheadSec);\n return;\n }\n if (ev.type === 'tracks') {\n this.tracksSub.next(ev.tracks);\n return;\n }\n if (ev.type === 'state') {\n const map: Record<string, PlayerState> = {\n loading: { kind: 'loading' },\n buffering: { kind: 'buffering' },\n playing: { kind: 'playing' },\n paused: { kind: 'paused' },\n ended: { kind: 'ended' }\n };\n this.stateSub.next(map[ev.state] ?? { kind: 'idle' });\n try { this.ctx?.ports.telemetry.add({ t: Date.now(), kind: 'state', state: ev.state }); } catch { /* ignore */ }\n if (ev.state === 'ended') void this.tryAutoNext();\n return;\n }\n if (ev.type === 'error') {\n const pe: PlayerError = { code: ev.error.code, message: ev.error.message, fatal: ev.error.fatal, details: ev.error.details };\n this.stateSub.next({ kind: 'error', error: pe });\n this.errorSub.next(pe);\n try { this.ctx?.ports.telemetry.add({ t: Date.now(), kind: 'error', code: pe.code, fatal: !!pe.fatal }); } catch { /* ignore */ }\n if (this.ctx) for (const p of this.plugins) void p.onError?.(this.ctx, pe);\n return;\n }\n }\n\n private async tryRestoreStartTime(_config: PlayerConfig): Promise<number | null> {\n // Start time can be injected by ProgressPlugin through ctx.facade.seekTo after load.\n // Here we keep it null; the plugin may seek during onLoaded().\n return null;\n }\n}\n\nfunction defaultEngineChooser(cfg: PlayerConfig): PlaybackEngine {\n // Strategic rule (v1.3):\n // - HLS/DASH => ShakaEngine\n // - DRM or advanced streaming => ShakaEngine\n // - Progressive URL / blob URL / local-file => NativeEngine\n const t = cfg.source.type;\n const url = (t === 'url' ? (cfg.source as any).url : '');\n const looksLikeHls = typeof url === 'string' && /\\.m3u8($|\\?)/i.test(url);\n const looksLikeDash = typeof url === 'string' && /\\.mpd($|\\?)/i.test(url);\n const hasDrm = !!(cfg.source as any).drm;\n\n if (t === 'hls' || t === 'dash' || looksLikeHls || looksLikeDash || hasDrm) return new NativeEngine();\n return new NativeEngine();\n}\n","import { MetadataProvider, MetadataHint, MetadataMatch, VideoMetadata } from '../metadata.types';\n\n/**\n * Local provider: loads sidecar metadata from a URL (json or txt).\n * - JSON: parsed into `VideoMetadata` where possible\n * - TXT: stored as description\n */\nexport class LocalMetadataProvider implements MetadataProvider {\n id = 'local';\n\n async match(_hint: MetadataHint): Promise<MetadataMatch[]> {\n // Match is resolved by the plugin using sidecar URL; nothing to match here.\n return [];\n }\n\n async fetch(id: string): Promise<VideoMetadata> {\n // Here `id` is expected to be a URL in the local provider.\n const res = await fetch(id);\n if (!res.ok) throw new Error(`Metadata fetch failed: ${res.status}`);\n const ct = res.headers.get('content-type') ?? '';\n const text = await res.text();\n\n if (ct.includes('application/json') || looksLikeJson(text)) {\n try { return JSON.parse(text) as VideoMetadata; } catch { /* fallthrough */ }\n }\n return { description: text };\n }\n}\n\nfunction looksLikeJson(t: string): boolean {\n const s = t.trim();\n return (s.startsWith('{') && s.endsWith('}')) || (s.startsWith('[') && s.endsWith(']'));\n}\n","import { SubtitleProvider, SubtitleCandidate, SubtitleQuery } from '../subtitles.types';\n\n/**\n * Local provider: uses `config.source.sidecar.subtitles` entries as candidates.\n */\nexport class LocalSubtitleProvider implements SubtitleProvider {\n id = 'local';\n\n async search(query: SubtitleQuery): Promise<SubtitleCandidate[]> {\n // This provider doesn't search globally. The plugin will pass sidecar items directly.\n return [];\n }\n\n async fetch(candidate: SubtitleCandidate): Promise<string | ArrayBuffer> {\n if (!candidate.url) throw new Error('LocalSubtitleProvider: candidate.url is required');\n const res = await fetch(candidate.url);\n if (!res.ok) throw new Error(`Subtitle fetch failed: ${res.status}`);\n return await res.text();\n }\n}\n","export interface CacheStore {\n get<T>(key: string): Promise<T | null>;\n set<T>(key: string, value: T, ttlMs: number): Promise<void>;\n del(key: string): Promise<void>;\n}\n\nexport class DefaultCacheStore implements CacheStore {\n private dbp: Promise<IDBDatabase | null> | null = null;\n\n async get<T>(key: string): Promise<T | null> {\n const db = await this.db();\n if (db) return idbGet<T>(db, key);\n return lsGet<T>(key);\n }\n\n async set<T>(key: string, value: T, ttlMs: number): Promise<void> {\n const payload = { value, exp: Date.now() + ttlMs };\n const db = await this.db();\n if (db) return idbSet(db, key, payload);\n lsSet(key, payload);\n }\n\n async del(key: string): Promise<void> {\n const db = await this.db();\n if (db) return idbDel(db, key);\n localStorage.removeItem(key);\n }\n\n private db(): Promise<IDBDatabase | null> {\n if (typeof indexedDB === 'undefined') return Promise.resolve(null);\n if (!this.dbp) this.dbp = openDb();\n return this.dbp;\n }\n}\n\nconst DB_NAME = 'ngx-smart-player-cache';\nconst STORE = 'kv';\n\nfunction openDb(): Promise<IDBDatabase | null> {\n return new Promise((resolve) => {\n const req = indexedDB.open(DB_NAME, 1);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STORE)) db.createObjectStore(STORE);\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => resolve(null);\n });\n}\n\nasync function idbGet<T>(db: IDBDatabase, key: string): Promise<T | null> {\n return new Promise((resolve) => {\n const tx = db.transaction(STORE, 'readonly');\n const st = tx.objectStore(STORE);\n const req = st.get(key);\n req.onsuccess = () => {\n const v = req.result;\n if (!v) return resolve(null);\n if (v.exp && Date.now() > v.exp) return resolve(null);\n resolve(v.value as T);\n };\n req.onerror = () => resolve(null);\n });\n}\n\nasync function idbSet(db: IDBDatabase, key: string, val: any): Promise<void> {\n return new Promise((resolve) => {\n const tx = db.transaction(STORE, 'readwrite');\n tx.objectStore(STORE).put(val, key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n });\n}\n\nasync function idbDel(db: IDBDatabase, key: string): Promise<void> {\n return new Promise((resolve) => {\n const tx = db.transaction(STORE, 'readwrite');\n tx.objectStore(STORE).delete(key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n });\n}\n\nfunction lsGet<T>(key: string): T | null {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n try {\n const v = JSON.parse(raw);\n if (v?.exp && Date.now() > v.exp) return null;\n return (v?.value as T) ?? null;\n } catch { return null; }\n}\n\nfunction lsSet(key: string, val: any): void {\n try { localStorage.setItem(key, JSON.stringify(val)); } catch {}\n}\n","export type PlayerCommand =\n | { type: 'play' }\n | { type: 'pause' }\n | { type: 'toggle' }\n | { type: 'seek'; to: number }\n | { type: 'setPlaybackRate'; rate: number }\n | { type: 'setVolume'; volume: number }\n | { type: 'setMuted'; muted: boolean }\n | { type: 'selectTextTrack'; id: string }\n | { type: 'disableTextTrack' }\n | { type: 'selectAudioTrack'; id: string }\n | { type: 'requestPiP' }\n | { type: 'exitPiP' }\n | { type: 'requestFullscreen' }\n | { type: 'exitFullscreen' }\n | { type: 'requestCast' }\n | { type: 'stopCast' };\n\nexport function isCategorizedEventType(type: string): boolean {\n return /^(playback|engine|network|drm|ads|subtitles|ui):/.test(type);\n}\n","import type { PlayerEvent } from '../types';\n\nexport type Unsubscribe = () => void;\n\nexport interface PlayerEventBus {\n emit(event: PlayerEvent): void;\n on<T extends PlayerEvent['type']>(\n type: T,\n handler: (e: Extract<PlayerEvent, { type: T }>) => void\n ): Unsubscribe;\n}\n\nexport class SimpleEventBus implements PlayerEventBus {\n private handlers = new Map<string, Set<(e: any) => void>>();\n\n emit(event: PlayerEvent): void {\n const set = this.handlers.get(event.type);\n if (!set) return;\n for (const h of Array.from(set)) h(event as any);\n }\n\n on<T extends PlayerEvent['type']>(type: T, handler: (e: Extract<PlayerEvent, { type: T }>) => void): Unsubscribe {\n const set = this.handlers.get(type) ?? new Set();\n set.add(handler as any);\n this.handlers.set(type, set);\n return () => set.delete(handler as any);\n }\n}\n","import type { PlayerPlugin, PlayerContext } from '../plugin';\n\ninterface ProgressRecord {\n contentId: string;\n positionSec: number;\n updatedAt: number;\n durationSec?: number;\n}\n\nfunction keyFor(contentId: string): string {\n return `progress:${contentId}`;\n}\n\nexport class ProgressPlugin implements PlayerPlugin {\n readonly id = 'progress';\n private timer: any = null;\n\n async onLoadStart(ctx: PlayerContext): Promise<void> {\n this.stop();\n // nothing else; restore happens onLoaded (engine ready)\n }\n\n async onLoaded(ctx: PlayerContext): Promise<void> {\n const contentId = ctx.contentId ?? ctx.config.source.contentId;\n if (!contentId) return;\n\n // Restore (local)\n try {\n if (ctx.config.progress.mode === 'local' || ctx.config.progress.mode === 'hybrid') {\n const raw = await ctx.ports.storage.get(keyFor(contentId));\n if (raw) {\n const rec = JSON.parse(raw) as ProgressRecord;\n if (Number.isFinite(rec.positionSec) && rec.positionSec > 0) {\n // seek after load\n await ctx.facade.seekTo(rec.positionSec);\n }\n }\n }\n } catch (e) {\n ctx.ports.log.warn('[ProgressPlugin] restore failed', e);\n }\n\n // Start periodic save\n const intervalMs = Math.max(3, ctx.config.progress.intervalSec ?? 10) * 1000;\n this.timer = setInterval(() => void this.save(ctx), intervalMs);\n }\n\n async onDestroy(ctx: PlayerContext): Promise<void> {\n this.stop();\n // final save\n await this.save(ctx);\n }\n\n private stop(): void {\n if (this.timer) { clearInterval(this.timer); this.timer = null; }\n }\n\n private async save(ctx: PlayerContext): Promise<void> {\n const contentId = ctx.contentId ?? ctx.config.source.contentId;\n if (!contentId) return;\n\n const snap = ctx.facade.snapshot();\n const positionSec = Math.max(0, snap.currentTime);\n const rec: ProgressRecord = {\n contentId,\n positionSec,\n durationSec: snap.duration || undefined,\n updatedAt: Date.now()\n };\n\n // Local storage\n try {\n if (ctx.config.progress.mode === 'local' || ctx.config.progress.mode === 'hybrid') {\n await ctx.ports.storage.set(keyFor(contentId), JSON.stringify(rec));\n }\n } catch (e) {\n ctx.ports.log.warn('[ProgressPlugin] local save failed', e);\n }\n\n // Server persistence (best-effort)\n try {\n if ((ctx.config.progress.mode === 'server' || ctx.config.progress.mode === 'hybrid') && ctx.config.progress.endpoint) {\n await ctx.ports.http.fetch(ctx.config.progress.endpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(rec)\n });\n }\n } catch (e) {\n ctx.ports.log.warn('[ProgressPlugin] server save failed', e);\n }\n }\n}\n","import type { PlayerPlugin, PlayerContext } from '../plugin';\nimport type { PlayerError } from '../../types';\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nexport class ResiliencePlugin implements PlayerPlugin {\n readonly id = 'resilience';\n private attempts = 0;\n private recovering = false;\n\n async onLoadStart(ctx: PlayerContext): Promise<void> {\n this.attempts = 0;\n this.recovering = false;\n // optional health check at load\n if (ctx.config.resilience.healthEndpoint) {\n void this.health(ctx);\n }\n }\n\n async onError(ctx: PlayerContext, err: PlayerError): Promise<void> {\n if (this.recovering) return;\n if (err.fatal) return;\n\n const max = Math.max(0, ctx.config.resilience.retries ?? 0);\n if (this.attempts >= max) return;\n\n this.attempts++;\n this.recovering = true;\n\n const min = ctx.config.resilience.backoffMs?.min ?? 500;\n const maxMs = ctx.config.resilience.backoffMs?.max ?? 8000;\n const backoff = Math.min(maxMs, min * Math.pow(2, this.attempts - 1));\n\n ctx.ports.log.warn('[ResiliencePlugin] retry', { attempt: this.attempts, backoff, code: err.code });\n\n // optional health token refresh\n if (ctx.config.resilience.healthEndpoint) {\n await this.health(ctx);\n }\n\n await sleep(backoff);\n\n try {\n const snap = ctx.facade.snapshot();\n await ctx.facade.reload({ startTimeSec: snap.currentTime || undefined });\n } catch (e) {\n ctx.ports.log.error('[ResiliencePlugin] reload failed', e);\n } finally {\n this.recovering = false;\n }\n }\n\n private async health(ctx: PlayerContext): Promise<void> {\n try {\n await ctx.ports.http.fetch(ctx.config.resilience.healthEndpoint!, { method: 'GET' });\n } catch (e) {\n ctx.ports.log.warn('[ResiliencePlugin] health check failed', e);\n }\n }\n}\n","import type { PlayerContext, PlayerPlugin } from '../plugin';\n\n/**\n * SSAI helper (v1.11)\n *\n * Keeps the core decoupled from vendor SDKs.\n * This plugin rewrites the manifest URL before the engine loads it.\n */\n\nexport interface SsaiManifestRewriteConfig {\n /** If provided, used as the final playback URL (highest priority). */\n stitchedUrl?: string;\n /** Append query parameters to the source URL (e.g. session, device). */\n appendQuery?: Record<string, string | number | boolean | null | undefined>;\n}\n\nfunction appendQuery(url: string, q: Record<string, any>): string {\n try {\n const base = typeof window !== 'undefined' ? window.location.href : 'http://localhost';\n const u = new URL(url, base);\n for (const [k, v] of Object.entries(q)) {\n if (v === undefined || v === null) continue;\n u.searchParams.set(k, String(v));\n }\n return u.toString();\n } catch {\n return url;\n }\n}\n\nexport function createSsaiManifestRewritePlugin(): PlayerPlugin {\n return {\n id: 'ads:ssai-manifest-rewrite',\n\n async onLoadStart(ctx: PlayerContext): Promise<void> {\n const ads: any = (ctx.config as any)?.ads;\n if (!ads || ads.enabled !== true) return;\n if (ads.mode !== 'ssai') return;\n\n const provider: SsaiManifestRewriteConfig = (ads.providerConfig ?? {}) as any;\n const src: any = (ctx.config as any)?.source;\n if (!src || typeof src.url !== 'string' || !src.url) return;\n\n const before = src.url;\n let after = before;\n if (provider.stitchedUrl) after = provider.stitchedUrl;\n if (provider.appendQuery) after = appendQuery(after, provider.appendQuery);\n\n if (after !== before) {\n src.url = after;\n ctx.ports.telemetry?.add?.({\n event: 'ssai:manifest_rewrite',\n level: 'info',\n ts: Date.now(),\n payload: { before, after }\n } as any);\n }\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/default-config.ts","../src/engine/engine-factory.ts","../src/engine/native.engine.ts","../src/engine/native.factory.ts","../src/engine/engine-profile.ts","../src/engine/playback-capabilities.ts","../src/engine/capability-report.ts","../src/remote-config/remote-config.ts","../src/ports/storage.port.ts","../src/ports/telemetry.port.ts","../src/ports/log.port.ts","../src/ports/ports.ts","../src/facade/player-facade.ts","../src/plugins/metadata/providers/local-metadata.provider.ts","../src/plugins/subtitles/providers/local-subtitle.provider.ts","../src/utils/cache-store.ts","../src/commands.ts","../src/events/event-bus.ts","../src/plugins/progress/progress.plugin.ts","../src/plugins/resilience/resilience.plugin.ts","../src/plugins/ads/ssai.plugin.ts"],"names":["patch","merged","fetch"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n AdsConfig,\n MetadataConfig,\n PlayerConfig,\n PlayerSource,\n ProgressConfig,\n ResilienceConfig,\n SubtitlesConfig,\n UiConfig,\n} from '../types';\n\n/**\n * Sensible, framework-agnostic defaults for the mandatory sub-configs of\n * {@link PlayerConfig}. They mirror the values used by the existing\n * consumers (local audio/video players) so a brand new integration can get a\n * valid config without restating every field.\n */\nexport const DEFAULT_PROGRESS_CONFIG: ProgressConfig = {\n mode: 'local',\n intervalSec: 5,\n};\n\nexport const DEFAULT_UI_CONFIG: UiConfig = {\n ratios: ['16:9'],\n defaultRatio: '16:9',\n keyboardShortcuts: true,\n};\n\nexport const DEFAULT_RESILIENCE_CONFIG: ResilienceConfig = {\n retries: 2,\n backoffMs: { min: 300, max: 1500 },\n};\n\nexport const DEFAULT_SUBTITLES_CONFIG: SubtitlesConfig = {\n enabled: false,\n providers: ['local'],\n};\n\nexport const DEFAULT_METADATA_CONFIG: MetadataConfig = {\n enabled: false,\n providers: ['local'],\n localSidecar: false,\n};\n\nexport const DEFAULT_ADS_CONFIG: AdsConfig = {\n enabled: false,\n mode: 'csai',\n};\n\n/**\n * Build a complete, type-safe {@link PlayerConfig} from a minimal set of\n * overrides. Only `source` is required; the mandatory sub-configs\n * (`progress`, `ui`, `resilience`, `subtitles`, `metadata`, `ads`) are filled\n * with the defaults above and shallow-merged with any override provided.\n *\n * Optional top-level fields (`profile`, `drm`, `series`, `playlist`,\n * `offline`, `remoteConfig`, ...) are passed through untouched when present.\n *\n * @example\n * ```ts\n * const config = createDefaultConfig({\n * source: { type: 'hls', url: 'https://cdn.example.com/movie.m3u8' },\n * drm: { keySystems: { 'com.widevine.alpha': { licenseServerUrl: 'https://drm/widevine' } } },\n * subtitles: { enabled: true, providers: ['local'], preferredLang: 'fr' },\n * });\n * ```\n */\nexport function createDefaultConfig(\n overrides: Partial<PlayerConfig> & { source: PlayerSource },\n): PlayerConfig {\n const {\n source,\n progress,\n ui,\n resilience,\n subtitles,\n metadata,\n ads,\n ...rest\n } = overrides;\n\n return {\n // Pass through every other (mostly optional) top-level field as provided:\n // profile, drm, series, playlist, playlistStartIndex, autoNext, offline,\n // remoteConfig, ...\n ...rest,\n source,\n progress: { ...DEFAULT_PROGRESS_CONFIG, ...progress },\n ui: { ...DEFAULT_UI_CONFIG, ...ui },\n resilience: {\n ...DEFAULT_RESILIENCE_CONFIG,\n ...resilience,\n backoffMs: {\n ...DEFAULT_RESILIENCE_CONFIG.backoffMs,\n ...resilience?.backoffMs,\n },\n },\n subtitles: { ...DEFAULT_SUBTITLES_CONFIG, ...subtitles },\n metadata: { ...DEFAULT_METADATA_CONFIG, ...metadata },\n ads: { ...DEFAULT_ADS_CONFIG, ...ads },\n };\n}\n","import type { PlayerConfig } from '../types';\nimport type { PlaybackEngine } from './playback-engine';\nimport type { PlaybackCapabilities } from './playback-capabilities';\n\nexport interface EngineFactory {\n /** Unique id (ex: 'native', 'shaka') */\n id: string;\n /** Higher priority wins when multiple support the same source. Default 0. */\n priority?: number;\n /** Whether this engine supports this config/source. */\n supports(config: PlayerConfig): boolean;\n /**\n * Optional, capability-aware selector.\n * If present, it is preferred over supports().\n */\n supportsWithCaps?: (config: PlayerConfig, caps: PlaybackCapabilities) => boolean;\n /** Create a new engine instance. */\n create(): PlaybackEngine;\n}\n\nexport function selectEngine(\n config: PlayerConfig,\n factories: EngineFactory[],\n caps?: PlaybackCapabilities\n): EngineFactory | null {\n const candidates = (factories ?? []).filter(f => {\n try {\n if (caps && typeof f.supportsWithCaps === 'function') return !!f.supportsWithCaps(config, caps);\n return !!f.supports(config);\n } catch {\n return false;\n }\n });\n if (candidates.length === 0) return null;\n candidates.sort((a,b) => (b.priority ?? 0) - (a.priority ?? 0));\n return candidates[0];\n}\n","import { PlaybackEngine, EngineEvent } from './playback-engine';\nimport { MediaTrack, PlayerSource } from '../types';\n\n\nfunction mimeFromUrl(url: string): string {\n try {\n const clean = url.split('?')[0].split('#')[0];\n const parts = clean.split('.');\n const ext = (parts.length > 1 ? parts.pop() : '')?.toLowerCase() || '';\n switch (ext) {\n case 'mp4': return 'video/mp4';\n case 'm4v': return 'video/x-m4v';\n case 'mov': return 'video/quicktime';\n case 'webm': return 'video/webm';\n case 'mkv': return 'video/x-matroska';\n case 'avi': return 'video/x-msvideo';\n case 'mpg':\n case 'mpeg': return 'video/mpeg';\n case 'ts': return 'video/mp2t';\n case 'ogv': return 'video/ogg';\n default: return '';\n }\n } catch {\n return '';\n }\n}\n\nexport class NativeEngine implements PlaybackEngine {\n public readonly id = 'native';\n private video?: HTMLVideoElement;\n private listeners: Array<(e: EngineEvent) => void> = [];\n\n async attach(videoEl: HTMLVideoElement): Promise<void> {\n this.video = videoEl;\n const v = videoEl;\n\n const emit = (e: EngineEvent) => this.listeners.forEach(l => l(e));\n\n v.addEventListener('timeupdate', () => emit({ type: 'timeupdate', currentTime: v.currentTime, duration: v.duration || 0 }));\n v.addEventListener('playing', () => emit({ type: 'state', state: 'playing' }));\n v.addEventListener('pause', () => emit({ type: 'state', state: 'paused' }));\n v.addEventListener('waiting', () => emit({ type: 'state', state: 'buffering' }));\n v.addEventListener('ended', () => emit({ type: 'state', state: 'ended' }));\n v.addEventListener('error', () => {\n const err = v.error;\n emit({\n type: 'error',\n error: { code: `HTML5_${err?.code ?? 'UNKNOWN'}`, message: err?.message ?? 'HTML5 video error', fatal: true, details: err }\n });\n });\n }\n\n async load(source: PlayerSource, opts?: { startTimeSec?: number }): Promise<void> {\n if (!this.video) throw new Error('NativeEngine not attached');\n const v = this.video;\n\n if (source.type === 'local-file') {\n if (!source.file) throw new Error('source.file is required');\n v.src = URL.createObjectURL(source.file);\n } else {\n if (!source.url) throw new Error('source.url is required');\n\n // For custom protocols (e.g. ngxsp-file://) Chromium sometimes refuses to infer\n // a playable type from the URL alone. Using a <source type=\"...\"> helps it pick\n // the right pipeline and avoids \"The element has no supported sources.\"\n const type = mimeFromUrl(source.url);\n while (v.firstChild) v.removeChild(v.firstChild);\n if (type) {\n const s = document.createElement('source');\n s.src = source.url;\n s.type = type;\n v.appendChild(s);\n v.removeAttribute('src');\n } else {\n v.src = source.url;\n }\n}\n\n await v.load();\n if (opts?.startTimeSec != null && isFinite(opts.startTimeSec)) {\n v.currentTime = Math.max(0, opts.startTimeSec);\n }\n }\n\n async destroy(): Promise<void> {\n if (!this.video) return;\n this.video.removeAttribute('src');\n this.video.load();\n this.video = undefined;\n this.listeners = [];\n }\n\n async play(): Promise<void> { await this.video?.play(); }\n async pause(): Promise<void> { this.video?.pause(); }\n async seekTo(timeSec: number): Promise<void> { if (this.video) this.video.currentTime = Math.max(0, timeSec); }\n async setPlaybackRate(rate: number): Promise<void> { if (this.video) this.video.playbackRate = rate; }\n async setVolume(volume: number): Promise<void> { if (this.video) this.video.volume = Math.min(1, Math.max(0, volume)); }\n\n async setTextTrack(_trackId: string | null): Promise<void> { /* native text tracks not managed here */ }\n async setAudioTrack(_trackId: string | null): Promise<void> { /* not supported in basic native impl */ }\n async setVideoTrack(_trackId: string | null): Promise<void> { /* not supported in basic native impl */ }\n\n async getTracks(): Promise<MediaTrack[]> { return []; }\n\n onEvent(cb: (ev: EngineEvent) => void): () => void {\n this.listeners.push(cb);\n return () => { this.listeners = this.listeners.filter(x => x !== cb); };\n }\n}\n","import type { EngineFactory } from './engine-factory';\nimport { NativeEngine } from './native.engine';\nimport type { PlayerConfig } from '../types';\n\nexport function createNativeEngineFactory(): EngineFactory {\n return {\n id: 'native',\n priority: 0,\n supports: (cfg: PlayerConfig) => {\n const drm = (cfg as any).drm ?? (cfg as any).source?.drm;\n if (drm?.required) return false;\n // Native engine for progressive/local urls\n const t = cfg.source.type;\n if (t === 'url' || t === 'local-file') return true;\n // also allow unknown as fallback, but avoid claiming HLS/DASH/DRM explicitly\n return false;\n },\n create: () => new NativeEngine()\n };\n}\n","import type { EngineProfileId, PlayerSource } from '../types';\n\n/**\n * High-level playback profiles.\n *\n * Goal: provide good defaults with *minimal configuration*.\n * Users can still override per-source hints via `source.abr`.\n */\nexport interface EngineProfileHints {\n /** Defaults applied only when the user did not specify `source.abr.*` */\n abr?: {\n maxHeight?: number;\n maxBandwidth?: number;\n };\n\n /** Shaka-specific streaming knobs (best-effort, ignored by non-shaka engines). */\n shakaStreaming?: {\n lowLatencyMode?: boolean;\n bufferingGoalSec?: number;\n rebufferingGoalSec?: number;\n };\n}\n\nexport function getEngineProfileHints(profile?: EngineProfileId): EngineProfileHints {\n switch (profile) {\n case 'tv':\n return {\n abr: {\n // Prefer higher quality by default.\n maxHeight: 2160\n },\n shakaStreaming: {\n bufferingGoalSec: 30,\n rebufferingGoalSec: 2\n }\n };\n case 'mobile':\n return {\n abr: {\n // Reasonable default for mobile data/CPU.\n maxHeight: 720\n },\n shakaStreaming: {\n bufferingGoalSec: 15,\n rebufferingGoalSec: 2\n }\n };\n case 'low-latency':\n return {\n abr: {\n // Avoid very high res by default (keeps latency predictable).\n maxHeight: 1080\n },\n shakaStreaming: {\n lowLatencyMode: true,\n bufferingGoalSec: 6,\n rebufferingGoalSec: 1\n }\n };\n case 'default':\n default:\n return {\n shakaStreaming: {\n bufferingGoalSec: 20,\n rebufferingGoalSec: 2\n }\n };\n }\n}\n\n/**\n * Apply profile defaults to a `PlayerSource` without overriding user-provided hints.\n *\n * This function is intentionally conservative: it only fills missing fields.\n */\nexport function applyEngineProfileToSource(source: PlayerSource, profile?: EngineProfileId): PlayerSource {\n const p: EngineProfileId = profile ?? 'default';\n const hints = getEngineProfileHints(p);\n\n const anySrc: any = source as any;\n const abrIn = (anySrc.abr ?? {}) as any;\n\n const abrOut: any = { ...abrIn };\n if (abrOut.maxHeight == null && hints.abr?.maxHeight != null) abrOut.maxHeight = hints.abr.maxHeight;\n if (abrOut.maxBandwidth == null && hints.abr?.maxBandwidth != null) abrOut.maxBandwidth = hints.abr.maxBandwidth;\n\n const out: any = {\n ...anySrc,\n // Expose profile to engines (optional).\n profile: p\n };\n\n if (Object.keys(abrOut).length) out.abr = abrOut;\n\n // Shaka streaming hints are carried on the source (optional).\n if (hints.shakaStreaming) {\n out._shakaStreaming = {\n ...(anySrc._shakaStreaming ?? {}),\n ...hints.shakaStreaming\n };\n }\n\n return out as PlayerSource;\n}\n","export interface PlaybackCapabilities {\n /** Browser has MediaSource (MSE). */\n mse: boolean;\n /** Browser has Encrypted Media Extensions (EME) API. */\n eme: boolean;\n /** True if navigator.mediaCapabilities is available. */\n mediaCapabilities: boolean;\n /** Whether basic HLS playback is possible via MSE/native. */\n hls: boolean;\n /** Whether basic DASH playback is possible via MSE. */\n dash: boolean;\n /** Progressive mp4/webm playback via <video src>. */\n progressive: boolean;\n /** Heuristic: support for at least one of common video codecs. */\n codecs: {\n mp4_h264: boolean;\n mp4_hevc: boolean;\n webm_vp9: boolean;\n webm_av1: boolean;\n };\n /** Known DRM key systems availability (best-effort). */\n drm: {\n widevine: boolean;\n playready: boolean;\n fairplay: boolean;\n };\n}\n\nexport function createDefaultCapabilities(): PlaybackCapabilities {\n return {\n mse: false,\n eme: false,\n mediaCapabilities: false,\n hls: false,\n dash: false,\n progressive: true,\n codecs: { mp4_h264: false, mp4_hevc: false, webm_vp9: false, webm_av1: false },\n drm: { widevine: false, playready: false, fairplay: false }\n };\n}\n\nexport async function detectPlaybackCapabilities(videoEl?: HTMLVideoElement): Promise<PlaybackCapabilities> {\n const caps = createDefaultCapabilities();\n\n const w = globalThis as any;\n caps.mse = !!w.MediaSource && typeof w.MediaSource.isTypeSupported === 'function';\n caps.eme = !!(w.navigator && w.navigator.requestMediaKeySystemAccess);\n caps.mediaCapabilities = !!(w.navigator && (w.navigator as any).mediaCapabilities);\n\n // Codec support (quick heuristic). Prefer MediaSource.isTypeSupported when available.\n const v = videoEl ?? (typeof document !== 'undefined' ? document.createElement('video') : undefined);\n const canPlay = (mime: string) => {\n try {\n if (caps.mse && w.MediaSource?.isTypeSupported) return !!w.MediaSource.isTypeSupported(mime);\n if (v && typeof v.canPlayType === 'function') return v.canPlayType(mime) !== '';\n return false;\n } catch {\n return false;\n }\n };\n\n caps.codecs.mp4_h264 = canPlay('video/mp4; codecs=\"avc1.42E01E\"');\n caps.codecs.mp4_hevc = canPlay('video/mp4; codecs=\"hvc1.1.6.L93.B0\"');\n caps.codecs.webm_vp9 = canPlay('video/webm; codecs=\"vp09.00.10.08\"');\n caps.codecs.webm_av1 = canPlay('video/webm; codecs=\"av01.0.05M.08\"');\n\n // HLS/DASH heuristics:\n // - DASH typically requires MSE.\n // - HLS can be native on Safari, otherwise usually requires MSE + JS player (Shaka/hls.js).\n caps.dash = caps.mse;\n caps.hls = canPlay('application/vnd.apple.mpegurl') || canPlay('application/x-mpegURL') || caps.mse;\n caps.progressive = caps.codecs.mp4_h264 || caps.codecs.webm_vp9 || caps.codecs.webm_av1 || true;\n\n // DRM availability (best-effort probes)\n if (caps.eme && w.navigator?.requestMediaKeySystemAccess) {\n const probe = async (ks: string) => {\n try {\n // minimal config; browsers may still reject.\n const cfg = [{\n initDataTypes: ['cenc'],\n audioCapabilities: [{ contentType: 'audio/mp4; codecs=\"mp4a.40.2\"' }],\n videoCapabilities: [{ contentType: 'video/mp4; codecs=\"avc1.42E01E\"' }]\n }];\n await w.navigator.requestMediaKeySystemAccess(ks, cfg);\n return true;\n } catch {\n return false;\n }\n };\n\n // Widevine\n caps.drm.widevine = await probe('com.widevine.alpha');\n // PlayReady\n caps.drm.playready = await probe('com.microsoft.playready');\n // FairPlay (Safari)\n caps.drm.fairplay = await probe('com.apple.fps.1_0');\n }\n\n return caps;\n}\n","import type { PlayerConfig } from '../types';\n\nexport interface CapabilityReport {\n timestamp: number;\n userAgent?: string;\n source?: {\n type?: string;\n live?: boolean;\n drm?: boolean;\n url?: string;\n contentId?: string;\n };\n platform: {\n isSecureContext: boolean;\n };\n features: {\n mse: boolean;\n eme: boolean;\n mediaCapabilities: boolean;\n };\n canPlay: Record<string, boolean>;\n /**\n * Optional, best-effort decoding probes via the MediaCapabilities API.\n *\n * Keys are stable labels (e.g. \"h264_1080p\").\n */\n mediaDecoding?: Record<string, { supported: boolean; smooth?: boolean; powerEfficient?: boolean }>;\n notes: string[];\n}\n\n/** Best-effort decoding probes used for diagnostics and ABR tuning hints. */\nexport async function createMediaDecodingReport(): Promise<CapabilityReport['mediaDecoding']> {\n const mc: any = (globalThis as any).navigator?.mediaCapabilities;\n if (!mc?.decodingInfo) return undefined;\n\n const mk = (contentType: string, width: number, height: number, bitrate: number) => ({\n type: 'media-source',\n video: { contentType, width, height, bitrate, framerate: 30 },\n audio: { contentType: 'audio/mp4; codecs=\"mp4a.40.2\"', channels: 2, bitrate: 128000, samplerate: 48000 }\n });\n\n const probes: Array<[string, any]> = [\n ['h264_720p', mk('video/mp4; codecs=\"avc1.64001f\"', 1280, 720, 2500000)],\n ['h264_1080p', mk('video/mp4; codecs=\"avc1.640028\"', 1920, 1080, 5000000)],\n ['vp9_1080p', mk('video/webm; codecs=\"vp09.00.51.08\"', 1920, 1080, 5000000)]\n ];\n\n const out: NonNullable<CapabilityReport['mediaDecoding']> = {};\n for (const [key, cfg] of probes) {\n try {\n const info = await mc.decodingInfo(cfg);\n out[key] = {\n supported: !!info?.supported,\n smooth: info?.smooth,\n powerEfficient: info?.powerEfficient\n };\n } catch {\n // ignore\n }\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction safeUa(): string | undefined {\n try { return (globalThis as any).navigator?.userAgent; } catch { return undefined; }\n}\n\nfunction canPlayType(videoEl: HTMLVideoElement | undefined, mime: string): boolean {\n try {\n const v = videoEl ?? (typeof document !== 'undefined' ? document.createElement('video') : undefined);\n if (!v || typeof v.canPlayType !== 'function') return false;\n return v.canPlayType(mime) !== '';\n } catch {\n return false;\n }\n}\n\nexport function createCapabilityReport(\n videoEl?: HTMLVideoElement,\n cfg?: PlayerConfig,\n mediaDecoding?: CapabilityReport['mediaDecoding']\n): CapabilityReport {\n const w = globalThis as any;\n const notes: string[] = [];\n\n const mse = !!w.MediaSource && typeof w.MediaSource.isTypeSupported === 'function';\n const eme = !!(w.navigator && w.navigator.requestMediaKeySystemAccess);\n const mediaCapabilities = !!(w.navigator && (w.navigator as any).mediaCapabilities);\n\n if (!mse) notes.push('MediaSource (MSE) not available');\n if (!eme) notes.push('Encrypted Media Extensions (EME) not available');\n\n const canPlay: Record<string, boolean> = {\n 'video/mp4; codecs=\"avc1.42E01E\"': canPlayType(videoEl, 'video/mp4; codecs=\"avc1.42E01E\"'),\n 'video/mp4; codecs=\"hvc1.1.6.L93.B0\"': canPlayType(videoEl, 'video/mp4; codecs=\"hvc1.1.6.L93.B0\"'),\n 'video/webm; codecs=\"vp09.00.10.08\"': canPlayType(videoEl, 'video/webm; codecs=\"vp09.00.10.08\"'),\n 'video/webm; codecs=\"av01.0.05M.08\"': canPlayType(videoEl, 'video/webm; codecs=\"av01.0.05M.08\"'),\n 'application/vnd.apple.mpegurl': canPlayType(videoEl, 'application/vnd.apple.mpegurl'),\n 'application/dash+xml': canPlayType(videoEl, 'application/dash+xml')\n };\n\n const secure = (() => {\n try { return !!(globalThis as any).isSecureContext; } catch { return false; }\n })();\n if (!secure) notes.push('Not running in a secure context (HTTPS). DRM and some APIs may fail.');\n\n const src = cfg?.source;\n const drmCfg = cfg ? ((cfg as any).drm ?? (src as any)?.drm) : undefined;\n const drmFlag = !!drmCfg;\n\n return {\n timestamp: Date.now(),\n userAgent: safeUa(),\n source: src ? {\n type: (src as any).type,\n live: (src as any).live,\n drm: drmFlag,\n url: (src as any).url,\n contentId: (src as any).contentId\n } : undefined,\n platform: { isSecureContext: secure },\n features: { mse, eme, mediaCapabilities },\n canPlay,\n mediaDecoding,\n notes\n };\n}\n","import type { PlayerPorts } from '../ports/ports';\nimport type { PlayerConfig, RemoteConfigConfig, RemoteConfigPayload } from '../types';\n\ntype CacheEntry = { ts: number; data: RemoteConfigPayload };\n\nconst DEFAULT_ALLOW = [\n 'profile',\n 'abr',\n 'resilience',\n 'drm',\n 'ads',\n 'ui',\n 'subtitles',\n 'metadata',\n 'progress',\n 'chapters',\n 'offline'\n];\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return !!v && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction deepMerge<T extends Record<string, any>>(base: T, patch: Record<string, any>): T {\n const out: any = { ...base };\n for (const [k, v] of Object.entries(patch)) {\n if (isPlainObject(v) && isPlainObject(out[k])) out[k] = deepMerge(out[k], v);\n else out[k] = v;\n }\n return out;\n}\n\nfunction shallowMerge<T extends Record<string, any>>(base: T, patch: Record<string, any>): T {\n return { ...(base as any), ...(patch as any) };\n}\n\nfunction hashKey(url: string): string {\n // Small deterministic key (no crypto dependency).\n let h = 0;\n for (let i = 0; i < url.length; i++) h = (h * 31 + url.charCodeAt(i)) >>> 0;\n return h.toString(16);\n}\n\nasync function readCache(storage: PlayerPorts['storage'] | undefined, key: string): Promise<CacheEntry | null> {\n if (!storage?.get) return null;\n const raw = await storage.get(key);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as CacheEntry;\n if (!parsed || typeof parsed.ts !== 'number' || !isPlainObject(parsed.data)) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nasync function writeCache(storage: PlayerPorts['storage'] | undefined, key: string, entry: CacheEntry): Promise<void> {\n if (!storage?.set) return;\n await storage.set(key, JSON.stringify(entry));\n}\n\nexport async function applyRemoteConfig(\n cfg: PlayerConfig,\n ports: Partial<PlayerPorts>\n): Promise<{ config: PlayerConfig; applied: boolean; payload?: RemoteConfigPayload; source: 'cache' | 'network' | 'none' }>\n{\n const rc = cfg.remoteConfig;\n if (!rc?.enabled) return { config: cfg, applied: false, source: 'none' };\n\n const url = rc.url;\n const ttlMs = Math.max(1, (rc.ttlSec ?? 300)) * 1000;\n const mode = rc.mode ?? 'deep';\n const allow = (rc.allow?.length ? rc.allow : DEFAULT_ALLOW) as string[];\n const cacheKey = `remoteConfig:${hashKey(url)}`;\n\n const now = Date.now();\n\n try {\n const cached = await readCache(ports.storage, cacheKey);\n if (cached && now - cached.ts < ttlMs) {\n const patch = filterAllowList(cached.data, allow);\n const merged = mode === 'shallow' ? shallowMerge(cfg as any, patch as any) : deepMerge(cfg as any, patch as any);\n return { config: merged, applied: true, payload: cached.data, source: 'cache' };\n }\n\n const fetch = ports.http?.fetch;\n if (!fetch) throw new Error('Remote config enabled but no ports.http.fetch provided');\n\n const res = await fetch(url, { method: 'GET', headers: { 'accept': 'application/json' } });\n if (!res.ok) throw new Error(`Remote config HTTP ${res.status}`);\n const json = (await res.json()) as unknown;\n if (!isPlainObject(json)) throw new Error('Remote config payload must be a JSON object');\n\n const payload = json as RemoteConfigPayload;\n await writeCache(ports.storage, cacheKey, { ts: now, data: payload });\n\n const patch = filterAllowList(payload, allow);\n const merged = mode === 'shallow' ? shallowMerge(cfg as any, patch as any) : deepMerge(cfg as any, patch as any);\n return { config: merged, applied: true, payload, source: 'network' };\n } catch (err) {\n ports.log?.warn?.('[ngxsp] remoteConfig failed', err);\n return { config: cfg, applied: false, source: 'none' };\n }\n}\n\nfunction filterAllowList(payload: RemoteConfigPayload, allow: string[]): RemoteConfigPayload {\n const out: RemoteConfigPayload = {};\n for (const k of allow) {\n if (Object.prototype.hasOwnProperty.call(payload, k)) out[k] = payload[k];\n }\n return out;\n}\n","export interface StoragePort {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n remove?(key: string): Promise<void>;\n}\n\nexport class MemoryStoragePort implements StoragePort {\n private map = new Map<string, string>();\n async get(key: string): Promise<string | null> { return this.map.get(key) ?? null; }\n async set(key: string, value: string): Promise<void> { this.map.set(key, value); }\n async remove(key: string): Promise<void> { this.map.delete(key); }\n}\n","export interface TelemetryPort {\n add(sample: Record<string, unknown>): void;\n export?(): unknown;\n}\n\nexport class NoopTelemetryPort implements TelemetryPort {\n add(_sample: Record<string, unknown>): void { /* noop */ }\n}\n","export interface LogPort {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n}\n\nexport class ConsoleLogPort implements LogPort {\n debug(...args: unknown[]): void { console.debug(...args); }\n info(...args: unknown[]): void { console.info(...args); }\n warn(...args: unknown[]): void { console.warn(...args); }\n error(...args: unknown[]): void { console.error(...args); }\n}\n","import type { HttpPort } from './http.port';\nimport type { StoragePort } from './storage.port';\nimport type { TelemetryPort } from './telemetry.port';\nimport type { LogPort } from './log.port';\nimport { MemoryStoragePort } from './storage.port';\nimport { NoopTelemetryPort } from './telemetry.port';\nimport { ConsoleLogPort } from './log.port';\n\nexport interface PlayerPorts {\n http: HttpPort;\n storage: StoragePort;\n telemetry: TelemetryPort;\n log: LogPort;\n}\n\nexport function createDefaultPorts(): PlayerPorts {\n const http: HttpPort = { fetch: (input, init) => fetch(input, init) };\n return {\n http,\n storage: new MemoryStoragePort(),\n telemetry: new NoopTelemetryPort(),\n log: new ConsoleLogPort()\n };\n}\n\nexport { MemoryStoragePort } from './storage.port';\nexport { NoopTelemetryPort } from './telemetry.port';\nexport { ConsoleLogPort } from './log.port';\n","import { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport {\n AspectRatioMode,\n MediaTrack,\n PlayerConfig,\n PlayerError,\n PlayerErrorCode,\n PlayerState,\n type DiagnosticsSnapshot,\n type DiagnosticsEngineInfo,\n type PlayerTime,\n type PlayerSource\n} from '../types';\nimport type { TelemetrySample, TelemetryEvent, TelemetryLevel } from '../telemetry/telemetry.types';\nimport { PlaybackEngine, EngineEvent, LoadOptions } from '../engine/playback-engine';\nimport type { EngineFactory } from '../engine/engine-factory';\nimport { selectEngine } from '../engine/engine-factory';\nimport { createNativeEngineFactory } from '../engine/native.factory';\nimport { applyEngineProfileToSource } from '../engine/engine-profile';\nimport { detectPlaybackCapabilities, type PlaybackCapabilities } from '../engine/playback-capabilities';\nimport { createCapabilityReport, createMediaDecodingReport, type CapabilityReport } from '../engine/capability-report';\nimport { applyRemoteConfig } from '../remote-config/remote-config';\nimport { PlayerPlugin, PlayerContext } from '../plugins/plugin';\nimport type { PlayerPorts } from '../ports/ports';\nimport { createDefaultPorts } from '../ports/ports';\nimport { VideoMetadata } from '../plugins/metadata/metadata.types';\n\nexport interface PlayerSnapshot {\n currentTime: number;\n duration: number;\n state: PlayerState;\n bufferedAheadSec: number;\n}\n\n/**\n * Public diagnostics payload.\n *\n * NOTE: This is intentionally an alias of `DiagnosticsSnapshot` to keep one\n * canonical shape exported by `@ngxsp/core`.\n */\nexport type PlayerDiagnostics = DiagnosticsSnapshot;\n\nexport class PlayerFacade {\n private engineFactories: EngineFactory[] = [createNativeEngineFactory()];\n private engineId = 'native';\n private lastNonFatal: PlayerError | null = null;\n\n // Optional MediaCapabilities decoding probes (async, best-effort)\n private mediaDecodingSub = new BehaviorSubject<CapabilityReport['mediaDecoding'] | null>(null);\n private video?: HTMLVideoElement;\n private engine?: PlaybackEngine;\n private plugins: PlayerPlugin[] = [];\n private ctx?: PlayerContext;\n\n private stateSub = new BehaviorSubject<PlayerState>({ kind: 'idle' });\n private timeSub = new BehaviorSubject<{ currentTime: number; duration: number }>({ currentTime: 0, duration: 0 });\n private bufferSub = new BehaviorSubject<number>(0);\n private tracksSub = new BehaviorSubject<MediaTrack[]>([]);\n private errorSub = new Subject<PlayerError>();\n private metadataSub = new BehaviorSubject<VideoMetadata | null>(null);\n\n private capsSub = new BehaviorSubject<PlaybackCapabilities | null>(null);\n readonly capabilities$ = this.capsSub.asObservable();\n\n readonly state$ = this.stateSub.asObservable();\n readonly time$ = this.timeSub.asObservable();\n readonly bufferAheadSec$ = this.bufferSub.asObservable();\n readonly tracks$ = this.tracksSub.asObservable();\n readonly error$ = this.errorSub.asObservable();\n readonly metadata$ = this.metadataSub.asObservable();\n\n private seriesIndexSub = new BehaviorSubject<number | null>(null);\n readonly seriesIndex$ = this.seriesIndexSub.asObservable();\n\n private playlistIndexSub = new BehaviorSubject<number | null>(null);\n readonly playlistIndex$ = this.playlistIndexSub.asObservable();\n private playlist: import('../types').PlayerSource[] = [];\n private playlistKey = '';\n\n private externalVttUrl?: string;\n\n constructor(private ports: PlayerPorts = createDefaultPorts()) {}\n\n\nattach(videoEl: HTMLVideoElement, plugins: PlayerPlugin[] = [], config: PlayerConfig, ports?: Partial<PlayerPorts>, engines?: EngineFactory[]): void {\n // merge ports\n if (ports) {\n this.ports = { ...this.ports, ...ports } as any;\n }\n // Engines registry: always keep native engine as fallback to avoid breaking progressive/local playback.\n if (engines && engines.length) {\n this.engineFactories = [createNativeEngineFactory(), ...engines];\n } else {\n this.engineFactories = [createNativeEngineFactory()];\n }\n this.video = videoEl;\n this.plugins = plugins ?? [];\n this.ctx = { config, facade: this, ports: this.ports, contentId: config.source.contentId };\n\n // Capability probe (async; used for engine selection + better diagnostics).\n void detectPlaybackCapabilities(videoEl)\n .then(c => this.capsSub.next(c))\n .catch(() => this.capsSub.next(null));\n\n // MediaCapabilities decoding probes (async; best-effort; used for diagnostics/ABR hints).\n void createMediaDecodingReport()\n .then(r => this.mediaDecodingSub.next(r ?? null))\n .catch(() => this.mediaDecodingSub.next(null));\n this.emitTelemetry('player:attach','info');\n this.emitTelemetry('player:source_set','info',{ type: config.source.type, live: config.source.live });\n\n this.installVideoEventListeners();\n\n // init plugins\n for (const p of this.plugins) {\n try { void p.onInit?.(this.ctx); } catch { /* noop */ }\n }\n}\n\nasync load(config: PlayerConfig, opts?: LoadOptions): Promise<void> {\n if (!this.video) throw new Error('PlayerFacade not attached');\n if (!this.ctx) throw new Error('PlayerFacade context missing');\n\n // Remote control-plane (feature flags / tuning / profiles) – applied before engine/plugin decisions.\n const rc = await applyRemoteConfig(config, this.ports);\n if (rc.applied) {\n this.ports.telemetry?.add?.({\n event: 'remote_config:applied' as any,\n level: 'info',\n ts: Date.now(),\n data: { source: rc.source, url: config.remoteConfig?.url }\n } as any);\n config = rc.config;\n }\n\n // Normalize playlist (v1.7.1)\n const list = config.playlist ?? [];\n if (list.length > 0) {\n const key = list.map(s => (s.contentId ?? s.url ?? (s as any).filePath ?? '')).join('|');\n if (key !== this.playlistKey) {\n this.playlistKey = key;\n this.playlist = list;\n const startIdx = config.playlistStartIndex ?? 0;\n this.playlistIndexSub.next(Math.max(0, Math.min(startIdx, list.length - 1)));\n }\n if (opts?.playlistIndex != null) {\n this.playlistIndexSub.next(Math.max(0, Math.min(opts.playlistIndex, list.length - 1)));\n }\n const idx = this.playlistIndexSub.value ?? 0;\n const src = list[idx] ?? config.source;\n config = { ...config, source: src, autoNext: config.autoNext ?? true };\n this.emitTelemetry('player:playlist_index', 'info', { index: idx, total: list.length });\n }\n\n this.ctx.config = config;\n this.ctx.contentId = config.source.contentId;\n this.emitTelemetry('player:load_start','info');\n try {\n const now = (globalThis.performance?.now?.() ?? Date.now());\n this.qoe.loadStartMs = now;\n this.qoe.firstFrameMs = 0;\n this.qoe.startupMs = 0;\n this.qoe.rebufferCount = 0;\n this.qoe.rebufferMs = 0;\n this.qoe.rebufferStartMs = 0;\n this.qoe.firstFrameEmitted = false;\n } catch {}\n\n for (const p of this.plugins) {\n try { await p.onLoadStart?.(this.ctx); } catch { /* noop */ }\n }\n\n // (re)create engine\n if (this.engine) {\n try { await this.engine.destroy(); } catch {}\n this.engine = undefined;\n }\n\n const caps = this.capsSub.value ?? undefined;\n const chosen = selectEngine(config, this.engineFactories, caps);\n if (!chosen) {\n const detail = { source: config.source, caps };\n this.emitFatal(new Error(`No engine registered for this source: ${JSON.stringify(detail)}`), 'ENGINE_MISSING');\n throw new Error('ENGINE_MISSING');\n }\n const engine = chosen.create();\n\n this.engine = engine;\n this.engineId = (engine as any).id ?? (engine.constructor?.name ?? 'engine');\n this.emitTelemetry('player:engine_selected','info',{ engineId: this.engineId });\n\n await engine.attach(this.video);\n\n const off = engine.onEvent(ev => this.handleEngineEvent(ev));\n (this as any)._offEngine = off;\n\n const startTime = opts?.startTimeSec;\n // Merge DRM from config onto the source so engines can stay \"source-only\".\n const sourceWithDrm = applyEngineProfileToSource(\n {\n ...config.source,\n drm: (config as any).drm ?? (config.source as any).drm,\n profile: (config as any).profile ?? (config.source as any).profile\n } as any,\n (config as any).profile ?? (config.source as any).profile\n ) as any;\n try {\n await engine.load(sourceWithDrm, { startTimeSec: startTime ?? undefined });\n this.stateSub.next({ kind: 'paused' });\n this.emitTelemetry('player:load_ok','info');\n } catch (err) {\n this.emitTelemetry('player:load_fail','error',{}, (err as any)?.message);\n this.emitFatal(err, 'UNKNOWN');\n throw err;\n }\n\n // notify plugins loaded\n for (const p of this.plugins) {\n try { await p.onLoaded?.(this.ctx); } catch { /* noop */ }\n }\n}\n\nasync reload(opts?: LoadOptions): Promise<void> {\n if (!this.ctx) throw new Error('PlayerFacade context missing');\n const snap = this.snapshot();\n const start = opts?.startTimeSec ?? snap.currentTime ?? 0;\n await this.load(this.ctx.config, { startTimeSec: start });\n}\n\nasync next(): Promise<void> {\n if (!this.ctx) return;\n const cfg = this.ctx.config;\n const list = cfg.playlist ?? this.playlist;\n if (!list || list.length === 0) return;\n const idx = (this.playlistIndexSub.value ?? 0) + 1;\n if (idx >= list.length) return;\n await this.load(cfg, { playlistIndex: idx, startTimeSec: 0 });\n}\n\nasync previous(): Promise<void> {\n if (!this.ctx) return;\n const cfg = this.ctx.config;\n const list = cfg.playlist ?? this.playlist;\n if (!list || list.length === 0) return;\n const idx = (this.playlistIndexSub.value ?? 0) - 1;\n if (idx < 0) return;\n await this.load(cfg, { playlistIndex: idx, startTimeSec: 0 });\n}\n\n\nasync destroy(): Promise<void> {\n try {\n for (const p of this.plugins) {\n try { await p.onDestroy?.(this.ctx!); } catch { /* noop */ }\n }\n } finally {\n try { (this as any)._offEngine?.(); } catch {}\n try { await this.engine?.destroy(); } catch {}\n this.engine = undefined;\n this.video = undefined;\n this.ctx = undefined;\n this.plugins = [];\n this.emitTelemetry('player:init','debug',{ destroyed: true });\n }\n}\n\n/** Emit a non-fatal error (does not transition to fatal error state). */\npublic emitNonFatal(err: unknown, code: PlayerErrorCode | string = 'UNKNOWN'): void {\n const pe = this.toPlayerError(err, false, code);\n this.lastNonFatal = pe;\n this.emitTelemetry('player:error_nonfatal', 'warn', { code: pe.code }, pe.message);\n // let plugins observe if they subscribe to error$ externally\n this.errorSub.next(pe);\n}\n\n/** Emit a fatal error (transitions to error state). */\nprivate emitFatal(err: unknown, code: PlayerErrorCode | string = 'UNKNOWN'): void {\n const pe = this.toPlayerError(err, true, code);\n this.emitTelemetry('player:error_fatal', 'error', { code: pe.code }, pe.message);\n this.stateSub.next({ kind: 'error', error: pe });\n this.errorSub.next(pe);\n // notify plugins\n if (this.ctx) {\n for (const p of this.plugins) {\n try { void p.onError?.(this.ctx, pe); } catch { /* noop */ }\n }\n }\n}\n\nprivate async tryAutoNext(): Promise<void> {\n if (!this.ctx) return;\n const cfg = this.ctx.config;\n const list = cfg.playlist ?? this.playlist;\n if (!list || list.length === 0) return;\n const auto = cfg.autoNext ?? true;\n if (!auto) return;\n const idx = this.playlistIndexSub.value ?? 0;\n if (idx >= list.length - 1) return;\n\n const nextIdx = idx + 1;\n this.emitTelemetry('player:auto_next','info',{ from: idx, to: nextIdx, total: list.length });\n try {\n await this.load(cfg, { playlistIndex: nextIdx, startTimeSec: 0 });\n } catch {\n // handled by load\n }\n}\n\n\nprivate installed = false;\n\n // QoE metrics (v1.7)\n private qoe = {\n loadStartMs: 0,\n firstFrameMs: 0,\n startupMs: 0,\n rebufferCount: 0,\n rebufferMs: 0,\n rebufferStartMs: 0 as number | 0,\n firstFrameEmitted: false\n };\nprivate installVideoEventListeners(): void {\n const v = this.video;\n if (!v || this.installed) return;\n this.installed = true;\n\n const nowMs = () => (globalThis.performance?.now?.() ?? Date.now());\n\n const maybeFirstFrame = () => {\n if (this.qoe.firstFrameEmitted) return;\n const t = nowMs();\n this.qoe.firstFrameMs = t;\n if (this.qoe.loadStartMs) this.qoe.startupMs = Math.max(0, t - this.qoe.loadStartMs);\n this.qoe.firstFrameEmitted = true;\n this.emitTelemetry('qoe:first_frame','info', { firstFrameMs: this.qoe.startupMs });\n };\n\n const maybeEndRebuffer = () => {\n if (!this.qoe.rebufferStartMs) return;\n const t = nowMs();\n const delta = Math.max(0, t - this.qoe.rebufferStartMs);\n this.qoe.rebufferMs += delta;\n this.qoe.rebufferStartMs = 0;\n this.emitTelemetry('qoe:rebuffer_end','debug', { deltaMs: delta, totalMs: this.qoe.rebufferMs, count: this.qoe.rebufferCount });\n };\n\n v.addEventListener('timeupdate', () => {\n this.emitTelemetry('player:timeupdate', 'debug', { t: v.currentTime, d: v.duration });\n });\n\nv.addEventListener('loadeddata', () => {\n // First frame decoded (often the best proxy)\n maybeFirstFrame();\n});\n\nv.addEventListener('playing', () => {\n // Playback actually started\n maybeFirstFrame();\n maybeEndRebuffer();\n this.emitTelemetry('player:playing', 'info');\n});\n\nv.addEventListener('waiting', () => {\n // Rebuffering\n if (!this.qoe.rebufferStartMs) {\n this.qoe.rebufferCount += 1;\n this.qoe.rebufferStartMs = nowMs();\n this.emitTelemetry('qoe:rebuffer_start','debug', { count: this.qoe.rebufferCount });\n }\n});\n\nv.addEventListener('stalled', () => {\n if (!this.qoe.rebufferStartMs) {\n this.qoe.rebufferCount += 1;\n this.qoe.rebufferStartMs = nowMs();\n this.emitTelemetry('qoe:rebuffer_start','debug', { count: this.qoe.rebufferCount, reason: 'stalled' });\n }\n});\n\n\n v.addEventListener('ended', () => {\n maybeEndRebuffer();\n this.emitTelemetry('player:ended', 'info');\n this.emitTelemetry('qoe:summary','info', { startupMs: this.qoe.startupMs, rebufferCount: this.qoe.rebufferCount, rebufferMs: this.qoe.rebufferMs });\n void this.tryAutoNext();\n });\n\n v.addEventListener('pause', () => {\n this.emitTelemetry('player:pause', 'info');\n });\n\n v.addEventListener('error', () => {\n const me = v.error;\n if (!me) return;\n const codeMap: Record<number, PlayerErrorCode> = {\n 1: 'UNKNOWN',\n 2: 'NETWORK_HTTP',\n 3: 'DECODE_ERROR',\n 4: 'SRC_NOT_SUPPORTED'\n };\n const c = codeMap[me.code] ?? 'UNKNOWN';\n this.emitFatal(me, c);\n });\n}\n\nprivate emitTelemetry(event: TelemetryEvent, level: TelemetryLevel = 'info', data?: Record<string, unknown>, message?: string): void {\n try {\n const cfg = this.ctx?.config;\n const contentId = cfg?.source?.contentId;\n const sample: TelemetrySample = {\n ts: Date.now(),\n level,\n event,\n contentId,\n engineId: this.engineId,\n message,\n data\n };\n this.ports.telemetry.add(sample as any);\n } catch { /* noop */ }\n}\n\nprivate toPlayerError(err: unknown, fatal: boolean, code: PlayerErrorCode | string = 'UNKNOWN'): PlayerError {\n const e: any = err as any;\n const msg = e?.message ? String(e.message) : String(err ?? 'Unknown error');\n return { code, message: msg, fatal, details: e };\n}\n async play(): Promise<void> {\n this.emitTelemetry('player:play_request','info');\n try {\n await this.engine?.play();\n this.emitTelemetry('player:play_ok','info');\n } catch (err) {\n const name = (err as any)?.name;\n if (name === 'NotAllowedError') {\n this.emitNonFatal(err, 'AUTOPLAY_BLOCKED');\n this.emitTelemetry('player:play_fail','warn',{ code: 'AUTOPLAY_BLOCKED' }, (err as any)?.message);\n } else {\n this.emitFatal(err, 'UNKNOWN');\n this.emitTelemetry('player:play_fail','error',{ code: 'UNKNOWN' }, (err as any)?.message);\n }\n throw err;\n }\n }\n async pause(): Promise<void> { await this.engine?.pause(); }\n async seekTo(timeSec: number): Promise<void> { await this.engine?.seekTo(timeSec); }\n async setRate(rate: number): Promise<void> { await this.engine?.setPlaybackRate(rate); }\n async setVolume(volume: number): Promise<void> { await this.engine?.setVolume(volume); }\n\n async setTextTrack(trackId: string | null): Promise<void> {\n if (trackId === 'external') {\n // handled by external VTT injection\n if (this.video && this.externalVttUrl) {\n this.ensureExternalTrack(this.externalVttUrl);\n }\n return;\n }\n await this.engine?.setTextTrack(trackId);\n }\n async setAudioTrack(trackId: string | null): Promise<void> { await this.engine?.setAudioTrack(trackId); }\n async setVideoTrack(trackId: string | null): Promise<void> { await this.engine?.setVideoTrack(trackId); }\n\n // UI helpers\n setAspectRatio(_mode: AspectRatioMode): void {\n // UI component controls CSS class; facade keeps it as state if needed in your app.\n }\n\n snapshot(): PlayerSnapshot {\n const time = this.timeSub.value;\n return {\n currentTime: time.currentTime,\n duration: time.duration,\n state: this.stateSub.value,\n bufferedAheadSec: this.bufferSub.value\n };\n }\n\n /**\n * Diagnostics helper for UI / support logs.\n * Safe to call anytime after attach().\n */\n diagnostics(): PlayerDiagnostics {\n const snap = this.snapshot();\n const bufferedEnd = (snap.currentTime ?? 0) + (snap.bufferedAheadSec ?? 0);\n const time: PlayerTime = {\n currentTime: snap.currentTime,\n duration: snap.duration,\n bufferedEnd\n };\n const engine: DiagnosticsEngineInfo = {\n id: this.engine?.id ?? 'none',\n selectedBy: 'supports',\n reasons: []\n };\n const source = (this.ctx?.config as any)?.source as PlayerSource | undefined;\n return {\n ts: Date.now(),\n engine,\n capabilities: createCapabilityReport(\n this.video ?? undefined,\n this.ctx?.config,\n this.mediaDecodingSub.value ?? undefined\n ),\n source,\n state: snap.state,\n time,\n lastNonFatal: this.lastNonFatal,\n\n // backward compat\n selectedEngineId: engine.id,\n snapshot: {\n currentTime: snap.currentTime,\n duration: snap.duration,\n state: snap.state,\n bufferedAheadSec: snap.bufferedAheadSec\n }\n };\n }\n\n // External tracks (for provider-based subtitles)\n async setExternalVttTrack(lang: string, vtt: string): Promise<void> {\n if (!this.video) return;\n const blob = new Blob([vtt], { type: 'text/vtt' });\n this.externalVttUrl = URL.createObjectURL(blob);\n this.ensureExternalTrack(this.externalVttUrl, lang);\n }\n\n setMetadata(meta: VideoMetadata): void { this.metadataSub.next(meta); }\n\n private ensureExternalTrack(url: string, lang: string = 'und'): void {\n if (!this.video) return;\n // Remove prior external track\n const prev = this.video.querySelector('track[data-external=\"true\"]');\n if (prev) prev.remove();\n\n const track = document.createElement('track');\n track.kind = 'subtitles';\n track.label = `External (${lang})`;\n track.srclang = lang;\n track.src = url;\n track.default = true;\n track.setAttribute('data-external', 'true');\n\n this.video.appendChild(track);\n }\n\n private handleEngineEvent(ev: EngineEvent): void {\n if (ev.type === 'timeupdate') {\n this.timeSub.next({ currentTime: ev.currentTime, duration: ev.duration });\n return;\n }\n if (ev.type === 'bufferupdate') {\n this.bufferSub.next(ev.bufferedAheadSec);\n return;\n }\n if (ev.type === 'tracks') {\n this.tracksSub.next(ev.tracks);\n return;\n }\n if (ev.type === 'state') {\n const map: Record<string, PlayerState> = {\n loading: { kind: 'loading' },\n buffering: { kind: 'buffering' },\n playing: { kind: 'playing' },\n paused: { kind: 'paused' },\n ended: { kind: 'ended' }\n };\n this.stateSub.next(map[ev.state] ?? { kind: 'idle' });\n try { this.ctx?.ports.telemetry.add({ t: Date.now(), kind: 'state', state: ev.state }); } catch { /* ignore */ }\n if (ev.state === 'ended') void this.tryAutoNext();\n return;\n }\n if (ev.type === 'error') {\n const pe: PlayerError = { code: ev.error.code, message: ev.error.message, fatal: ev.error.fatal, details: ev.error.details };\n this.stateSub.next({ kind: 'error', error: pe });\n this.errorSub.next(pe);\n try { this.ctx?.ports.telemetry.add({ t: Date.now(), kind: 'error', code: pe.code, fatal: !!pe.fatal }); } catch { /* ignore */ }\n if (this.ctx) for (const p of this.plugins) void p.onError?.(this.ctx, pe);\n return;\n }\n }\n\n private async tryRestoreStartTime(_config: PlayerConfig): Promise<number | null> {\n // Start time can be injected by ProgressPlugin through ctx.facade.seekTo after load.\n // Here we keep it null; the plugin may seek during onLoaded().\n return null;\n }\n}\n","import { MetadataProvider, MetadataHint, MetadataMatch, VideoMetadata } from '../metadata.types';\n\n/**\n * Local provider: loads sidecar metadata from a URL (json or txt).\n * - JSON: parsed into `VideoMetadata` where possible\n * - TXT: stored as description\n */\nexport class LocalMetadataProvider implements MetadataProvider {\n id = 'local';\n\n async match(_hint: MetadataHint): Promise<MetadataMatch[]> {\n // Match is resolved by the plugin using sidecar URL; nothing to match here.\n return [];\n }\n\n async fetch(id: string): Promise<VideoMetadata> {\n // Here `id` is expected to be a URL in the local provider.\n const res = await fetch(id);\n if (!res.ok) throw new Error(`Metadata fetch failed: ${res.status}`);\n const ct = res.headers.get('content-type') ?? '';\n const text = await res.text();\n\n if (ct.includes('application/json') || looksLikeJson(text)) {\n try { return JSON.parse(text) as VideoMetadata; } catch { /* fallthrough */ }\n }\n return { description: text };\n }\n}\n\nfunction looksLikeJson(t: string): boolean {\n const s = t.trim();\n return (s.startsWith('{') && s.endsWith('}')) || (s.startsWith('[') && s.endsWith(']'));\n}\n","import { SubtitleProvider, SubtitleCandidate, SubtitleQuery } from '../subtitles.types';\n\n/**\n * Local provider: uses `config.source.sidecar.subtitles` entries as candidates.\n */\nexport class LocalSubtitleProvider implements SubtitleProvider {\n id = 'local';\n\n async search(query: SubtitleQuery): Promise<SubtitleCandidate[]> {\n // This provider doesn't search globally. The plugin will pass sidecar items directly.\n return [];\n }\n\n async fetch(candidate: SubtitleCandidate): Promise<string | ArrayBuffer> {\n if (!candidate.url) throw new Error('LocalSubtitleProvider: candidate.url is required');\n const res = await fetch(candidate.url);\n if (!res.ok) throw new Error(`Subtitle fetch failed: ${res.status}`);\n return await res.text();\n }\n}\n","export interface CacheStore {\n get<T>(key: string): Promise<T | null>;\n set<T>(key: string, value: T, ttlMs: number): Promise<void>;\n del(key: string): Promise<void>;\n}\n\nexport class DefaultCacheStore implements CacheStore {\n private dbp: Promise<IDBDatabase | null> | null = null;\n\n async get<T>(key: string): Promise<T | null> {\n const db = await this.db();\n if (db) return idbGet<T>(db, key);\n return lsGet<T>(key);\n }\n\n async set<T>(key: string, value: T, ttlMs: number): Promise<void> {\n const payload = { value, exp: Date.now() + ttlMs };\n const db = await this.db();\n if (db) return idbSet(db, key, payload);\n lsSet(key, payload);\n }\n\n async del(key: string): Promise<void> {\n const db = await this.db();\n if (db) return idbDel(db, key);\n localStorage.removeItem(key);\n }\n\n private db(): Promise<IDBDatabase | null> {\n if (typeof indexedDB === 'undefined') return Promise.resolve(null);\n if (!this.dbp) this.dbp = openDb();\n return this.dbp;\n }\n}\n\nconst DB_NAME = 'ngx-smart-player-cache';\nconst STORE = 'kv';\n\nfunction openDb(): Promise<IDBDatabase | null> {\n return new Promise((resolve) => {\n const req = indexedDB.open(DB_NAME, 1);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STORE)) db.createObjectStore(STORE);\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => resolve(null);\n });\n}\n\nasync function idbGet<T>(db: IDBDatabase, key: string): Promise<T | null> {\n return new Promise((resolve) => {\n const tx = db.transaction(STORE, 'readonly');\n const st = tx.objectStore(STORE);\n const req = st.get(key);\n req.onsuccess = () => {\n const v = req.result;\n if (!v) return resolve(null);\n if (v.exp && Date.now() > v.exp) return resolve(null);\n resolve(v.value as T);\n };\n req.onerror = () => resolve(null);\n });\n}\n\nasync function idbSet(db: IDBDatabase, key: string, val: any): Promise<void> {\n return new Promise((resolve) => {\n const tx = db.transaction(STORE, 'readwrite');\n tx.objectStore(STORE).put(val, key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n });\n}\n\nasync function idbDel(db: IDBDatabase, key: string): Promise<void> {\n return new Promise((resolve) => {\n const tx = db.transaction(STORE, 'readwrite');\n tx.objectStore(STORE).delete(key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n });\n}\n\nfunction lsGet<T>(key: string): T | null {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n try {\n const v = JSON.parse(raw);\n if (v?.exp && Date.now() > v.exp) return null;\n return (v?.value as T) ?? null;\n } catch { return null; }\n}\n\nfunction lsSet(key: string, val: any): void {\n try { localStorage.setItem(key, JSON.stringify(val)); } catch {}\n}\n","export type PlayerCommand =\n | { type: 'play' }\n | { type: 'pause' }\n | { type: 'toggle' }\n | { type: 'seek'; to: number }\n | { type: 'setPlaybackRate'; rate: number }\n | { type: 'setVolume'; volume: number }\n | { type: 'setMuted'; muted: boolean }\n | { type: 'selectTextTrack'; id: string }\n | { type: 'disableTextTrack' }\n | { type: 'selectAudioTrack'; id: string }\n | { type: 'requestPiP' }\n | { type: 'exitPiP' }\n | { type: 'requestFullscreen' }\n | { type: 'exitFullscreen' }\n | { type: 'requestCast' }\n | { type: 'stopCast' };\n\nexport function isCategorizedEventType(type: string): boolean {\n return /^(playback|engine|network|drm|ads|subtitles|ui):/.test(type);\n}\n","import type { PlayerEvent } from '../types';\n\nexport type Unsubscribe = () => void;\n\nexport interface PlayerEventBus {\n emit(event: PlayerEvent): void;\n on<T extends PlayerEvent['type']>(\n type: T,\n handler: (e: Extract<PlayerEvent, { type: T }>) => void\n ): Unsubscribe;\n}\n\nexport class SimpleEventBus implements PlayerEventBus {\n private handlers = new Map<string, Set<(e: any) => void>>();\n\n emit(event: PlayerEvent): void {\n const set = this.handlers.get(event.type);\n if (!set) return;\n for (const h of Array.from(set)) h(event as any);\n }\n\n on<T extends PlayerEvent['type']>(type: T, handler: (e: Extract<PlayerEvent, { type: T }>) => void): Unsubscribe {\n const set = this.handlers.get(type) ?? new Set();\n set.add(handler as any);\n this.handlers.set(type, set);\n return () => set.delete(handler as any);\n }\n}\n","import type { PlayerPlugin, PlayerContext } from '../plugin';\n\ninterface ProgressRecord {\n contentId: string;\n positionSec: number;\n updatedAt: number;\n durationSec?: number;\n}\n\nfunction keyFor(contentId: string): string {\n return `progress:${contentId}`;\n}\n\nexport class ProgressPlugin implements PlayerPlugin {\n readonly id = 'progress';\n private timer: any = null;\n\n async onLoadStart(ctx: PlayerContext): Promise<void> {\n this.stop();\n // nothing else; restore happens onLoaded (engine ready)\n }\n\n async onLoaded(ctx: PlayerContext): Promise<void> {\n const contentId = ctx.contentId ?? ctx.config.source.contentId;\n if (!contentId) return;\n\n // Restore (local)\n try {\n if (ctx.config.progress.mode === 'local' || ctx.config.progress.mode === 'hybrid') {\n const raw = await ctx.ports.storage.get(keyFor(contentId));\n if (raw) {\n const rec = JSON.parse(raw) as ProgressRecord;\n if (Number.isFinite(rec.positionSec) && rec.positionSec > 0) {\n // seek after load\n await ctx.facade.seekTo(rec.positionSec);\n }\n }\n }\n } catch (e) {\n ctx.ports.log.warn('[ProgressPlugin] restore failed', e);\n }\n\n // Start periodic save\n const intervalMs = Math.max(3, ctx.config.progress.intervalSec ?? 10) * 1000;\n this.timer = setInterval(() => void this.save(ctx), intervalMs);\n }\n\n async onDestroy(ctx: PlayerContext): Promise<void> {\n this.stop();\n // final save\n await this.save(ctx);\n }\n\n private stop(): void {\n if (this.timer) { clearInterval(this.timer); this.timer = null; }\n }\n\n private async save(ctx: PlayerContext): Promise<void> {\n const contentId = ctx.contentId ?? ctx.config.source.contentId;\n if (!contentId) return;\n\n const snap = ctx.facade.snapshot();\n const positionSec = Math.max(0, snap.currentTime);\n const rec: ProgressRecord = {\n contentId,\n positionSec,\n durationSec: snap.duration || undefined,\n updatedAt: Date.now()\n };\n\n // Local storage\n try {\n if (ctx.config.progress.mode === 'local' || ctx.config.progress.mode === 'hybrid') {\n await ctx.ports.storage.set(keyFor(contentId), JSON.stringify(rec));\n }\n } catch (e) {\n ctx.ports.log.warn('[ProgressPlugin] local save failed', e);\n }\n\n // Server persistence (best-effort)\n try {\n if ((ctx.config.progress.mode === 'server' || ctx.config.progress.mode === 'hybrid') && ctx.config.progress.endpoint) {\n await ctx.ports.http.fetch(ctx.config.progress.endpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(rec)\n });\n }\n } catch (e) {\n ctx.ports.log.warn('[ProgressPlugin] server save failed', e);\n }\n }\n}\n","import type { PlayerPlugin, PlayerContext } from '../plugin';\nimport type { PlayerError } from '../../types';\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nexport class ResiliencePlugin implements PlayerPlugin {\n readonly id = 'resilience';\n private attempts = 0;\n private recovering = false;\n\n async onLoadStart(ctx: PlayerContext): Promise<void> {\n this.attempts = 0;\n this.recovering = false;\n // optional health check at load\n if (ctx.config.resilience.healthEndpoint) {\n void this.health(ctx);\n }\n }\n\n async onError(ctx: PlayerContext, err: PlayerError): Promise<void> {\n if (this.recovering) return;\n if (err.fatal) return;\n\n const max = Math.max(0, ctx.config.resilience.retries ?? 0);\n if (this.attempts >= max) return;\n\n this.attempts++;\n this.recovering = true;\n\n const min = ctx.config.resilience.backoffMs?.min ?? 500;\n const maxMs = ctx.config.resilience.backoffMs?.max ?? 8000;\n const backoff = Math.min(maxMs, min * Math.pow(2, this.attempts - 1));\n\n ctx.ports.log.warn('[ResiliencePlugin] retry', { attempt: this.attempts, backoff, code: err.code });\n\n // optional health token refresh\n if (ctx.config.resilience.healthEndpoint) {\n await this.health(ctx);\n }\n\n await sleep(backoff);\n\n try {\n const snap = ctx.facade.snapshot();\n await ctx.facade.reload({ startTimeSec: snap.currentTime || undefined });\n } catch (e) {\n ctx.ports.log.error('[ResiliencePlugin] reload failed', e);\n } finally {\n this.recovering = false;\n }\n }\n\n private async health(ctx: PlayerContext): Promise<void> {\n try {\n await ctx.ports.http.fetch(ctx.config.resilience.healthEndpoint!, { method: 'GET' });\n } catch (e) {\n ctx.ports.log.warn('[ResiliencePlugin] health check failed', e);\n }\n }\n}\n","import type { PlayerContext, PlayerPlugin } from '../plugin';\n\n/**\n * SSAI helper (v1.11)\n *\n * Keeps the core decoupled from vendor SDKs.\n * This plugin rewrites the manifest URL before the engine loads it.\n */\n\nexport interface SsaiManifestRewriteConfig {\n /** If provided, used as the final playback URL (highest priority). */\n stitchedUrl?: string;\n /** Append query parameters to the source URL (e.g. session, device). */\n appendQuery?: Record<string, string | number | boolean | null | undefined>;\n}\n\nfunction appendQuery(url: string, q: Record<string, any>): string {\n try {\n const base = typeof window !== 'undefined' ? window.location.href : 'http://localhost';\n const u = new URL(url, base);\n for (const [k, v] of Object.entries(q)) {\n if (v === undefined || v === null) continue;\n u.searchParams.set(k, String(v));\n }\n return u.toString();\n } catch {\n return url;\n }\n}\n\nexport function createSsaiManifestRewritePlugin(): PlayerPlugin {\n return {\n id: 'ads:ssai-manifest-rewrite',\n\n async onLoadStart(ctx: PlayerContext): Promise<void> {\n const ads: any = (ctx.config as any)?.ads;\n if (!ads || ads.enabled !== true) return;\n if (ads.mode !== 'ssai') return;\n\n const provider: SsaiManifestRewriteConfig = (ads.providerConfig ?? {}) as any;\n const src: any = (ctx.config as any)?.source;\n if (!src || typeof src.url !== 'string' || !src.url) return;\n\n const before = src.url;\n let after = before;\n if (provider.stitchedUrl) after = provider.stitchedUrl;\n if (provider.appendQuery) after = appendQuery(after, provider.appendQuery);\n\n if (after !== before) {\n src.url = after;\n ctx.ports.telemetry?.add?.({\n event: 'ssai:manifest_rewrite',\n level: 'info',\n ts: Date.now(),\n payload: { before, after }\n } as any);\n }\n }\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ngxsp/core",
|
|
3
|
-
"version": "0.0.1-next.
|
|
3
|
+
"version": "0.0.1-next.1",
|
|
4
|
+
"description": "Composable core runtime for audio and video playback workflows.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"audio",
|
|
7
|
+
"video",
|
|
8
|
+
"media",
|
|
9
|
+
"player",
|
|
10
|
+
"runtime",
|
|
11
|
+
"streaming"
|
|
12
|
+
],
|
|
4
13
|
"type": "module",
|
|
5
|
-
"main": "./
|
|
6
|
-
"module": "./
|
|
7
|
-
"types": "./
|
|
14
|
+
"main": "./index.cjs",
|
|
15
|
+
"module": "./index.js",
|
|
16
|
+
"types": "./index.d.ts",
|
|
8
17
|
"exports": {
|
|
9
18
|
".": {
|
|
10
|
-
"types": "./
|
|
11
|
-
"import": "./
|
|
12
|
-
"require": "./
|
|
19
|
+
"types": "./index.d.ts",
|
|
20
|
+
"import": "./index.js",
|
|
21
|
+
"require": "./index.cjs"
|
|
13
22
|
}
|
|
14
23
|
},
|
|
15
24
|
"dependencies": {
|
|
@@ -22,8 +31,5 @@
|
|
|
22
31
|
"shaka-player": {
|
|
23
32
|
"optional": true
|
|
24
33
|
}
|
|
25
|
-
},
|
|
26
|
-
"optionalDependencies": {
|
|
27
|
-
"shaka-player": "^5.0.2"
|
|
28
34
|
}
|
|
29
35
|
}
|