@therealtinhtute/baroiplayer 1.2.0 → 2.0.0-beta.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.
Files changed (305) hide show
  1. package/README.md +91 -73
  2. package/dist/components/icons/index.d.ts +36 -0
  3. package/dist/components/icons/index.d.ts.map +1 -0
  4. package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts +4 -0
  5. package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +1 -0
  6. package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts +5 -0
  7. package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts.map +1 -0
  8. package/dist/components/icons/svg-icons/AudioIcon.d.ts +5 -0
  9. package/dist/components/icons/svg-icons/AudioIcon.d.ts.map +1 -0
  10. package/dist/components/icons/svg-icons/BackwardIcon.d.ts +5 -0
  11. package/dist/components/icons/svg-icons/BackwardIcon.d.ts.map +1 -0
  12. package/dist/components/icons/svg-icons/CameraIcon.d.ts +5 -0
  13. package/dist/components/icons/svg-icons/CameraIcon.d.ts.map +1 -0
  14. package/dist/components/icons/svg-icons/CheckIcon.d.ts +5 -0
  15. package/dist/components/icons/svg-icons/CheckIcon.d.ts.map +1 -0
  16. package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts +4 -0
  17. package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts.map +1 -0
  18. package/dist/components/icons/svg-icons/ForwardIcon.d.ts +5 -0
  19. package/dist/components/icons/svg-icons/ForwardIcon.d.ts.map +1 -0
  20. package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts +5 -0
  21. package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +1 -0
  22. package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts +5 -0
  23. package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +1 -0
  24. package/dist/components/icons/svg-icons/LoadingIcon.d.ts +5 -0
  25. package/dist/components/icons/svg-icons/LoadingIcon.d.ts.map +1 -0
  26. package/dist/components/icons/svg-icons/PauseIcon.d.ts +5 -0
  27. package/dist/components/icons/svg-icons/PauseIcon.d.ts.map +1 -0
  28. package/dist/components/icons/svg-icons/PlayIcon.d.ts +5 -0
  29. package/dist/components/icons/svg-icons/PlayIcon.d.ts.map +1 -0
  30. package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts +5 -0
  31. package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +1 -0
  32. package/dist/components/icons/svg-icons/QualityIcon.d.ts +5 -0
  33. package/dist/components/icons/svg-icons/QualityIcon.d.ts.map +1 -0
  34. package/dist/components/icons/svg-icons/SettingsIcon.d.ts +5 -0
  35. package/dist/components/icons/svg-icons/SettingsIcon.d.ts.map +1 -0
  36. package/dist/components/icons/svg-icons/SliderIcon.d.ts +5 -0
  37. package/dist/components/icons/svg-icons/SliderIcon.d.ts.map +1 -0
  38. package/dist/components/icons/svg-icons/SubtitleIcon.d.ts +5 -0
  39. package/dist/components/icons/svg-icons/SubtitleIcon.d.ts.map +1 -0
  40. package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts +5 -0
  41. package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +1 -0
  42. package/dist/components/icons/svg-icons/UnPiPIcon.d.ts +4 -0
  43. package/dist/components/icons/svg-icons/UnPiPIcon.d.ts.map +1 -0
  44. package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts +5 -0
  45. package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +1 -0
  46. package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts +5 -0
  47. package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts.map +1 -0
  48. package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts +5 -0
  49. package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +1 -0
  50. package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts +5 -0
  51. package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +1 -0
  52. package/dist/components/variants/gradient/gradient-audio.d.ts +13 -0
  53. package/dist/components/variants/gradient/gradient-audio.d.ts.map +1 -0
  54. package/dist/components/variants/gradient/gradient-controls.d.ts +4 -0
  55. package/dist/components/variants/gradient/gradient-controls.d.ts.map +1 -0
  56. package/dist/components/variants/gradient/gradient-glyphs.d.ts +30 -0
  57. package/dist/components/variants/gradient/gradient-glyphs.d.ts.map +1 -0
  58. package/dist/components/variants/gradient/gradient-video.d.ts +16 -0
  59. package/dist/components/variants/gradient/gradient-video.d.ts.map +1 -0
  60. package/dist/index.css +1 -1
  61. package/dist/index.d.ts +5 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +2 -112
  64. package/dist/index.js.map +1 -1
  65. package/dist/index.mjs +786 -6271
  66. package/dist/index.mjs.map +1 -1
  67. package/dist/package.json +3 -0
  68. package/package.json +110 -108
  69. package/src/components/variants/gradient/gradient-audio.tsx +47 -0
  70. package/src/components/variants/gradient/gradient-controls.tsx +254 -0
  71. package/src/components/variants/gradient/gradient-glyphs.test.tsx +69 -0
  72. package/src/components/variants/gradient/gradient-glyphs.tsx +129 -0
  73. package/src/components/variants/gradient/gradient-skin.css +211 -0
  74. package/src/components/variants/gradient/gradient-video.tsx +70 -0
  75. package/src/index.ts +5 -198
  76. package/src/test/accessibility-utils.ts +0 -59
  77. package/dist/context/media.js +0 -2
  78. package/dist/context/media.js.map +0 -1
  79. package/dist/context/media.mjs +0 -15
  80. package/dist/context/media.mjs.map +0 -1
  81. package/dist/context/store.js +0 -2
  82. package/dist/context/store.js.map +0 -1
  83. package/dist/context/store.mjs +0 -5
  84. package/dist/context/store.mjs.map +0 -1
  85. package/dist/context-BYwDoSRX.js +0 -1172
  86. package/dist/context-BYwDoSRX.js.map +0 -1
  87. package/dist/context-eNS62_ac.cjs +0 -23
  88. package/dist/context-eNS62_ac.cjs.map +0 -1
  89. package/dist/core-events-B1iM2F46.cjs +0 -2
  90. package/dist/core-events-B1iM2F46.cjs.map +0 -1
  91. package/dist/core-events-DunPHKRE.js +0 -484
  92. package/dist/core-events-DunPHKRE.js.map +0 -1
  93. package/dist/core-plugins-By-4-kGs.cjs +0 -2
  94. package/dist/core-plugins-By-4-kGs.cjs.map +0 -1
  95. package/dist/core-plugins-DSBWcTuX.js +0 -821
  96. package/dist/core-plugins-DSBWcTuX.js.map +0 -1
  97. package/dist/core.js +0 -37
  98. package/dist/core.js.map +0 -1
  99. package/dist/core.mjs +0 -1233
  100. package/dist/core.mjs.map +0 -1
  101. package/dist/enhanced-components-B_l3cist.js +0 -1142
  102. package/dist/enhanced-components-B_l3cist.js.map +0 -1
  103. package/dist/enhanced-components-BspFs9OO.cjs +0 -2
  104. package/dist/enhanced-components-BspFs9OO.cjs.map +0 -1
  105. package/dist/hooks-BXwI8QG6.cjs +0 -4
  106. package/dist/hooks-BXwI8QG6.cjs.map +0 -1
  107. package/dist/hooks-Bpi-jDiO.js +0 -1816
  108. package/dist/hooks-Bpi-jDiO.js.map +0 -1
  109. package/dist/minimal-components-C4z900Ro.js +0 -1926
  110. package/dist/minimal-components-C4z900Ro.js.map +0 -1
  111. package/dist/minimal-components-v4qBp6jv.cjs +0 -2
  112. package/dist/minimal-components-v4qBp6jv.cjs.map +0 -1
  113. package/dist/minimal-components.css +0 -1
  114. package/dist/mona-loading.gif +0 -0
  115. package/dist/performance-monitor-C5k6FDXw.js +0 -301
  116. package/dist/performance-monitor-C5k6FDXw.js.map +0 -1
  117. package/dist/performance-monitor-lJmuUjQQ.cjs +0 -2
  118. package/dist/performance-monitor-lJmuUjQQ.cjs.map +0 -1
  119. package/dist/utils-CFOue_9K.cjs +0 -9
  120. package/dist/utils-CFOue_9K.cjs.map +0 -1
  121. package/dist/utils-Dzpl2ArK.js +0 -2844
  122. package/dist/utils-Dzpl2ArK.js.map +0 -1
  123. package/dist/utils.js +0 -2
  124. package/dist/utils.js.map +0 -1
  125. package/dist/utils.mjs +0 -11
  126. package/dist/utils.mjs.map +0 -1
  127. package/src/adapters/videojs-adapter.tsx +0 -470
  128. package/src/assets/mona-loading.gif +0 -0
  129. package/src/components/AnimateLoading.tsx +0 -107
  130. package/src/components/LoadingState.tsx +0 -239
  131. package/src/components/__tests__/media-player-accessibility.test.tsx +0 -510
  132. package/src/components/__tests__/media-player-react19.test.tsx +0 -457
  133. package/src/components/accessibility/keyboard-help-overlay.tsx +0 -207
  134. package/src/components/audio-player.tsx +0 -85
  135. package/src/components/basic/index.ts +0 -37
  136. package/src/components/enhanced/advanced-features.tsx +0 -311
  137. package/src/components/enhanced/debug-panel.tsx +0 -448
  138. package/src/components/enhanced/enhanced-controls.tsx +0 -597
  139. package/src/components/enhanced/enhanced-media-player.tsx +0 -566
  140. package/src/components/enhanced/error-handling.tsx +0 -338
  141. package/src/components/enhanced/index.ts +0 -39
  142. package/src/components/enhanced/media-player-enhanced.tsx +0 -383
  143. package/src/components/examples/basic-video-player.tsx +0 -50
  144. package/src/components/examples/custom-controls-example.tsx +0 -63
  145. package/src/components/examples/enhanced-controls-example.tsx +0 -100
  146. package/src/components/examples/enhanced-media-player-example.tsx +0 -302
  147. package/src/components/examples/loading-states-demo.tsx +0 -142
  148. package/src/components/examples/react-19-demo.tsx +0 -353
  149. package/src/components/examples/volume-orientation-demo.tsx +0 -106
  150. package/src/components/icon-demo.tsx +0 -196
  151. package/src/components/legacy.tsx +0 -87
  152. package/src/components/media-metadata-display.tsx +0 -99
  153. package/src/components/media-player-audio.tsx +0 -39
  154. package/src/components/media-player-controls.tsx +0 -223
  155. package/src/components/media-player-error.tsx +0 -163
  156. package/src/components/media-player-fullscreen.tsx +0 -109
  157. package/src/components/media-player-hls.tsx +0 -111
  158. package/src/components/media-player-loading.tsx +0 -76
  159. package/src/components/media-player-play.tsx +0 -75
  160. package/src/components/media-player-root.tsx +0 -338
  161. package/src/components/media-player-seek.tsx +0 -168
  162. package/src/components/media-player-time.tsx +0 -99
  163. package/src/components/media-player-tooltip.tsx +0 -58
  164. package/src/components/media-player-video.tsx +0 -54
  165. package/src/components/media-player-volume.tsx +0 -155
  166. package/src/components/media-player.tsx +0 -292
  167. package/src/components/media-suspense.tsx +0 -344
  168. package/src/components/player-settings-form.tsx +0 -158
  169. package/src/components/react-player-wrapper.tsx +0 -651
  170. package/src/components/simple-video-player.tsx +0 -62
  171. package/src/components/ui/blur-poster.tsx +0 -93
  172. package/src/components/ui/empty-state.tsx +0 -91
  173. package/src/components/ui/enhanced-seek-bar.tsx +0 -254
  174. package/src/components/ui/error-state.tsx +0 -124
  175. package/src/components/ui/fullscreen-button.tsx +0 -81
  176. package/src/components/ui/loading-skeleton.tsx +0 -107
  177. package/src/components/ui/media-resource-preloader.tsx +0 -458
  178. package/src/components/ui/offline-message.tsx +0 -98
  179. package/src/components/ui/play-button.tsx +0 -99
  180. package/src/components/ui/seek-bar.tsx +0 -191
  181. package/src/components/ui/time-display.tsx +0 -61
  182. package/src/components/ui/volume-control.tsx +0 -190
  183. package/src/components/unified/base-media-player.tsx +0 -252
  184. package/src/components/unified/media-player.tsx +0 -75
  185. package/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +0 -587
  186. package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +0 -573
  187. package/src/components/variants/minimal/MinimalControls.tsx +0 -124
  188. package/src/components/variants/minimal/MinimalLoading.tsx +0 -28
  189. package/src/components/variants/minimal/MinimalMediaPlayer.tsx +0 -318
  190. package/src/components/variants/minimal/MinimalOverlay.tsx +0 -58
  191. package/src/components/variants/minimal/MinimalPlayButton.tsx +0 -56
  192. package/src/components/variants/minimal/MinimalSeekBar.tsx +0 -140
  193. package/src/components/variants/minimal/MinimalVolumeControl.tsx +0 -75
  194. package/src/components/variants/minimal/SimpleMinimalPlayer.tsx +0 -206
  195. package/src/components/variants/minimal/components/CenterPlayButton.tsx +0 -22
  196. package/src/components/variants/minimal/components/ControlBar.tsx +0 -142
  197. package/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +0 -412
  198. package/src/components/variants/minimal/components/PlaybackControls.tsx +0 -46
  199. package/src/components/variants/minimal/components/RightControls.tsx +0 -164
  200. package/src/components/variants/minimal/components/SeekBar.tsx +0 -127
  201. package/src/components/variants/minimal/components/SettingsDropdown.tsx +0 -68
  202. package/src/components/variants/minimal/components/SubtitleDisplay.tsx +0 -21
  203. package/src/components/variants/minimal/components/TimeDisplay.tsx +0 -15
  204. package/src/components/variants/minimal/components/VideoElement.tsx +0 -33
  205. package/src/components/variants/minimal/components/VolumeControl.tsx +0 -220
  206. package/src/components/variants/minimal/index.ts +0 -23
  207. package/src/components/video-player.tsx +0 -100
  208. package/src/context/__tests__/media-store.test.ts +0 -509
  209. package/src/context/error-handling.ts +0 -398
  210. package/src/context/media-context.tsx +0 -254
  211. package/src/context/media-provider.tsx +0 -264
  212. package/src/context/media-store.ts +0 -387
  213. package/src/context/persistence.ts +0 -462
  214. package/src/core/events/event-system.ts +0 -448
  215. package/src/core/events/hooks.ts +0 -325
  216. package/src/core/events/index.ts +0 -22
  217. package/src/core/events/middleware.ts +0 -286
  218. package/src/core/index.ts +0 -22
  219. package/src/core/optimization/bundle-optimizer.tsx +0 -312
  220. package/src/core/performance/cicd.ts +0 -98
  221. package/src/core/performance/index.ts +0 -38
  222. package/src/core/performance/media-loading-optimizer.ts +0 -544
  223. package/src/core/performance/performance-budgets.ts +0 -437
  224. package/src/core/performance/performance-monitor.tsx +0 -488
  225. package/src/core/performance/performance-testing.ts +0 -461
  226. package/src/core/plugins/__tests__/registry.test.ts +0 -595
  227. package/src/core/plugins/base-plugin.ts +0 -225
  228. package/src/core/plugins/enhanced-plugin-system.ts +0 -435
  229. package/src/core/plugins/examples/analytics-plugin.ts +0 -241
  230. package/src/core/plugins/index.ts +0 -39
  231. package/src/core/plugins/registry.ts +0 -546
  232. package/src/core/plugins/types.ts +0 -169
  233. package/src/core/plugins/utils.ts +0 -317
  234. package/src/core/progressive-loading.tsx +0 -331
  235. package/src/core/providers/enhanced-hls-provider.ts +0 -307
  236. package/src/core/providers/lazy-provider.tsx +0 -14
  237. package/src/core/providers/service-provider.tsx +0 -164
  238. package/src/core/utils.tsx +0 -34
  239. package/src/features/media-session/media-session-manager.ts +0 -411
  240. package/src/features/picture-in-picture/pip-manager.ts +0 -428
  241. package/src/features/playlist/playlist-manager.ts +0 -626
  242. package/src/features/subtitles/subtitle-manager.ts +0 -435
  243. package/src/features/subtitles/subtitle-parser.ts +0 -284
  244. package/src/features/thumbnails/thumbnail-generator.ts +0 -528
  245. package/src/hooks/__tests__/currentTime-fix.test.ts +0 -149
  246. package/src/hooks/__tests__/use-media-player.test.ts +0 -712
  247. package/src/hooks/__tests__/use-media-state.test.tsx +0 -316
  248. package/src/hooks/accessibility/index.ts +0 -27
  249. package/src/hooks/accessibility/use-accessibility-preferences.ts +0 -190
  250. package/src/hooks/accessibility/use-focus-management.ts +0 -183
  251. package/src/hooks/accessibility/use-keyboard-shortcuts.ts +0 -152
  252. package/src/hooks/accessibility/use-screen-reader.ts +0 -212
  253. package/src/hooks/core/index.ts +0 -47
  254. package/src/hooks/legacy.ts +0 -21
  255. package/src/hooks/use-buffer-health.ts +0 -218
  256. package/src/hooks/use-enhanced-media-player.ts +0 -575
  257. package/src/hooks/use-focus-trap.tsx +0 -162
  258. package/src/hooks/use-intelligent-preloading.ts +0 -387
  259. package/src/hooks/use-keyboard-controls.ts +0 -115
  260. package/src/hooks/use-keyboard-shortcuts.ts +0 -255
  261. package/src/hooks/use-media-actions.ts +0 -184
  262. package/src/hooks/use-media-metadata.ts +0 -91
  263. package/src/hooks/use-media-optimistic.ts +0 -264
  264. package/src/hooks/use-media-player.ts +0 -343
  265. package/src/hooks/use-media-state.ts +0 -194
  266. package/src/hooks/use-memory-optimization.ts +0 -360
  267. package/src/hooks/use-network-status.ts +0 -124
  268. package/src/hooks/use-optimistic-controls.ts +0 -95
  269. package/src/hooks/use-optimized-media.ts +0 -283
  270. package/src/hooks/use-smart-preload.ts +0 -229
  271. package/src/hooks/use-touch-gestures.ts +0 -461
  272. package/src/hooks/useEnhancedSubtitles.ts +0 -258
  273. package/src/hooks/useKeyboardShortcuts.ts +0 -106
  274. package/src/hooks/useMediaControls.ts +0 -52
  275. package/src/hooks/useScreenshot.ts +0 -61
  276. package/src/hooks/useSubtitles.ts +0 -91
  277. package/src/hooks/useVideoPlayer.ts +0 -278
  278. package/src/icons/components/FullscreenIcon.tsx +0 -36
  279. package/src/icons/components/SettingsIcon.tsx +0 -37
  280. package/src/icons/components/animated/LoadingIcon.tsx +0 -27
  281. package/src/icons/components/animated/PlayPauseIcon.tsx +0 -42
  282. package/src/icons/components/media/PauseIcon.tsx +0 -38
  283. package/src/icons/components/media/PlayIcon.tsx +0 -37
  284. package/src/icons/components/volume/VolumeIcon.tsx +0 -38
  285. package/src/icons/components/volume/VolumeOffIcon.tsx +0 -38
  286. package/src/icons/index.ts +0 -56
  287. package/src/icons/provider.tsx +0 -58
  288. package/src/icons/types.ts +0 -60
  289. package/src/index-enhanced.ts +0 -35
  290. package/src/index-legacy.ts +0 -324
  291. package/src/index.css +0 -102
  292. package/src/lib/__tests__/async-utils.test.ts +0 -291
  293. package/src/lib/async-utils.ts +0 -194
  294. package/src/lib/deprecation.ts +0 -51
  295. package/src/lib/format-time.ts +0 -37
  296. package/src/lib/index.ts +0 -4
  297. package/src/lib/utils.ts +0 -6
  298. package/src/styles/globals.css +0 -462
  299. package/src/styles/minimal-player.css +0 -621
  300. package/src/styles/pixel-art.css +0 -41
  301. package/src/styles/videojs.css +0 -100
  302. package/src/types/events.ts +0 -47
  303. package/src/types/formats.ts +0 -79
  304. package/src/types/index.ts +0 -203
  305. package/src/types/videojs-plugins.d.ts +0 -14
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-plugins-DSBWcTuX.js","sources":["../src/core/plugins/types.ts","../src/core/plugins/utils.ts","../src/core/plugins/registry.ts","../src/core/plugins/base-plugin.ts","../src/core/plugins/examples/analytics-plugin.ts","../src/core/plugins/index.ts"],"sourcesContent":["// TODO: Import proper types when integrated\nexport interface MediaState {\n\tisPlaying: boolean\n\tcurrentTime: number\n\tduration: number\n\tvolume: number\n\tisMuted: boolean\n}\n\nexport interface MediaPlayerControls {\n\tplay(): void\n\tpause(): void\n\tseek(time: number): void\n\tsetVolume(volume: number): void\n}\n\n// Plugin lifecycle phases\nexport type PluginPhase = \"initialize\" | \"activate\" | \"deactivate\" | \"destroy\"\n\n// Plugin categories for organization\nexport type PluginCategory =\n\t| \"controls\"\n\t| \"analytics\"\n\t| \"streaming\"\n\t| \"subtitle\"\n\t| \"quality\"\n\t| \"ui\"\n\t| \"accessibility\"\n\t| \"performance\"\n\n// Plugin priority for execution order\nexport type PluginPriority = \"high\" | \"medium\" | \"normal\" | \"low\"\n\n// Plugin configuration interface\nexport interface PluginConfig {\n\t[key: string]: any\n}\n\n// Plugin context provided to each plugin\nexport interface PluginContext {\n\t// Core media player state and controls\n\tstate: MediaState\n\tcontrols: MediaPlayerControls\n\n\t// Plugin management\n\tplugins: PluginRegistry\n\n\t// Event system\n\temit: (event: string, data?: any) => void\n\ton: (event: string, handler: (data: any) => void) => () => void\n\n\t// Utilities\n\telement: HTMLElement | null\n\tlogger: PluginLogger\n}\n\n// Plugin metadata\nexport interface PluginMetadata {\n\tname: string\n\tversion: string\n\tdescription: string\n\tauthor?: string\n\tcategory: PluginCategory\n\tpriority: PluginPriority\n\tdependencies?: string[]\n\tconflicts?: string[]\n}\n\n// Plugin interface that all plugins must implement\nexport interface Plugin {\n\tmetadata: PluginMetadata\n\tisInitialized?: boolean\n\tisActive?: boolean\n\n\t// Plugin lifecycle methods\n\tinitialize(context: PluginContext, config?: PluginConfig): Promise<void> | void\n\tactivate(context: PluginContext): Promise<void> | void\n\tdeactivate(context: PluginContext): Promise<void> | void\n\tdestroy(context: PluginContext): Promise<void> | void\n\n\t// Configuration handling\n\tconfigure?(config: PluginConfig): Promise<void> | void\n\n\t// Health check for plugin status\n\thealthCheck?(): Promise<boolean> | boolean\n}\n\n// Plugin factory function type\nexport type PluginFactory<T extends Plugin = Plugin> = (config?: PluginConfig) => T\n\n// Plugin registry interface\nexport interface PluginRegistry {\n\tregister(name: string, plugin: Plugin, config?: PluginConfig): void\n\tregister(factory: PluginFactory, config?: PluginConfig): void\n\tunregister(name: string, context?: PluginContext): Promise<void>\n\tget(name: string): Plugin | undefined\n\thas(name: string): boolean\n\tgetAll(): Plugin[]\n\tgetByCategory(category: PluginCategory): Plugin[]\n\tgetActive(): Plugin[]\n\tisEnabled(name: string): boolean\n\tinitialize(name: string, context: PluginContext, config?: PluginConfig): Promise<void>\n\tactivate(name: string, context: PluginContext): Promise<void>\n\tdeactivate(name: string, context: PluginContext): Promise<void>\n\tinitializeAll(context: PluginContext): Promise<void>\n\tactivateAll(context: PluginContext): Promise<void>\n\tdeactivateAll(context: PluginContext): Promise<void>\n\tdestroyAll(context: PluginContext): Promise<void>\n\tvalidateDependencies(): void\n\tvalidateConflicts(): void\n\thealthCheck(name: string): boolean\n\thealthCheck(): Promise<{ name: string; healthy: boolean; error?: Error }[]>\n\thealthCheckAll(): Record<string, boolean>\n\tenable(name: string): Promise<void>\n\tdisable(name: string): Promise<void>\n\tconfigure(name: string, config: PluginConfig): Promise<void>\n}\n\n// Plugin logger interface\nexport interface PluginLogger {\n\tinfo(message: string, data?: any): void\n\twarn(message: string, data?: any): void\n\terror(message: string, data?: any): void\n\tdebug(message: string, data?: any): void\n}\n\n// Plugin event types\nexport interface PluginEvents {\n\t\"plugin:registered\": { name: string; plugin: Plugin }\n\t\"plugin:enabled\": { name: string; plugin: Plugin }\n\t\"plugin:disabled\": { name: string; plugin: Plugin }\n\t\"plugin:error\": { name: string; error: Error }\n\t\"plugin:configured\": { name: string; config: PluginConfig }\n}\n\n// Plugin error types\nexport class PluginError extends Error {\n\tconstructor(\n\t\tpublic pluginName: string,\n\t\tpublic phase: PluginPhase,\n\t\tmessage: string,\n\t\tpublic originalError?: Error\n\t) {\n\t\tsuper(`Plugin '${pluginName}' failed during ${phase}: ${message}`)\n\t\tthis.name = \"PluginError\"\n\t}\n}\n\n// Plugin dependency error\nexport class PluginDependencyError extends PluginError {\n\tconstructor(\n\t\tpluginName: string,\n\t\tpublic missingDependencies: string[]\n\t) {\n\t\tsuper(pluginName, \"initialize\", `Missing dependencies: ${missingDependencies.join(\", \")}`)\n\t\tthis.name = \"PluginDependencyError\"\n\t}\n}\n\n// Plugin conflict error\nexport class PluginConflictError extends PluginError {\n\tconstructor(\n\t\tpluginName: string,\n\t\tpublic conflictingPlugins: string[]\n\t) {\n\t\tsuper(pluginName, \"activate\", `Conflicts with active plugins: ${conflictingPlugins.join(\", \")}`)\n\t\tthis.name = \"PluginConflictError\"\n\t}\n}\n","import type { Plugin, PluginConfig, PluginLogger } from \"./types\"\n\n// Simple console logger implementation\nexport class ConsolePluginLogger implements PluginLogger {\n\tprivate prefix: string\n\n\tconstructor(prefix = \"[Plugin]\") {\n\t\tthis.prefix = prefix\n\t}\n\n\tinfo(message: string, data?: any): void {\n\t\tif (data) {\n\t\t\tconsole.info(`${this.prefix} ${message}`, data)\n\t\t} else {\n\t\t\tconsole.info(`${this.prefix} ${message}`)\n\t\t}\n\t}\n\n\twarn(message: string, data?: any): void {\n\t\tif (data) {\n\t\t\tconsole.warn(`${this.prefix} ${message}`, data)\n\t\t} else {\n\t\t\tconsole.warn(`${this.prefix} ${message}`)\n\t\t}\n\t}\n\n\terror(message: string, data?: any): void {\n\t\tif (data) {\n\t\t\tconsole.error(`${this.prefix} ${message}`, data)\n\t\t} else {\n\t\t\tconsole.error(`${this.prefix} ${message}`)\n\t\t}\n\t}\n\n\tdebug(message: string, data?: any): void {\n\t\tif (process.env.NODE_ENV === \"development\") {\n\t\t\tif (data) {\n\t\t\t\tconsole.debug(`${this.prefix} ${message}`, data)\n\t\t\t} else {\n\t\t\t\tconsole.debug(`${this.prefix} ${message}`)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Plugin validation utilities\nexport class PluginValidator {\n\tstatic validateMetadata(plugin: Plugin): boolean {\n\t\tconst { metadata } = plugin\n\n\t\tif (!metadata.name || typeof metadata.name !== \"string\") {\n\t\t\tthrow new Error(\"Plugin metadata must include a valid name\")\n\t\t}\n\n\t\tif (!metadata.version || typeof metadata.version !== \"string\") {\n\t\t\tthrow new Error(\"Plugin metadata must include a valid version\")\n\t\t}\n\n\t\tif (!metadata.description || typeof metadata.description !== \"string\") {\n\t\t\tthrow new Error(\"Plugin metadata must include a valid description\")\n\t\t}\n\n\t\tif (!metadata.category) {\n\t\t\tthrow new Error(\"Plugin metadata must include a valid category\")\n\t\t}\n\n\t\tif (!metadata.priority) {\n\t\t\tthrow new Error(\"Plugin metadata must include a valid priority\")\n\t\t}\n\n\t\treturn true\n\t}\n\n\tstatic validateConfig(config: PluginConfig, schema?: Record<string, any>): boolean {\n\t\tif (!schema) return true\n\n\t\t// Simple schema validation - could be enhanced with a proper schema validator\n\t\tfor (const [key, rules] of Object.entries(schema)) {\n\t\t\tconst value = config[key]\n\n\t\t\tif (rules.required && (value === undefined || value === null)) {\n\t\t\t\tthrow new Error(`Configuration property '${key}' is required`)\n\t\t\t}\n\n\t\t\tif (value !== undefined && rules.type && typeof value !== rules.type) {\n\t\t\t\tthrow new Error(`Configuration property '${key}' must be of type '${rules.type}'`)\n\t\t\t}\n\n\t\t\tif (rules.enum && !rules.enum.includes(value)) {\n\t\t\t\tthrow new Error(`Configuration property '${key}' must be one of: ${rules.enum.join(\", \")}`)\n\t\t\t}\n\n\t\t\tif (rules.min !== undefined && typeof value === \"number\" && value < rules.min) {\n\t\t\t\tthrow new Error(`Configuration property '${key}' must be at least ${rules.min}`)\n\t\t\t}\n\n\t\t\tif (rules.max !== undefined && typeof value === \"number\" && value > rules.max) {\n\t\t\t\tthrow new Error(`Configuration property '${key}' must be at most ${rules.max}`)\n\t\t\t}\n\t\t}\n\n\t\treturn true\n\t}\n}\n\n// Plugin performance monitoring\nexport class PluginPerformanceMonitor {\n\tprivate metrics = new Map<\n\t\tstring,\n\t\t{\n\t\t\tcalls: number\n\t\t\ttotalTime: number\n\t\t\taverageTime: number\n\t\t\tlastCall: number\n\t\t}\n\t>()\n\n\tmeasure<T>(pluginName: string, operation: string, fn: () => T | Promise<T>): T | Promise<T> {\n\t\tconst key = `${pluginName}.${operation}`\n\t\tconst startTime = performance.now()\n\n\t\tconst updateMetrics = () => {\n\t\t\tconst endTime = performance.now()\n\t\t\tconst duration = endTime - startTime\n\n\t\t\tconst existing = this.metrics.get(key) || {\n\t\t\t\tcalls: 0,\n\t\t\t\ttotalTime: 0,\n\t\t\t\taverageTime: 0,\n\t\t\t\tlastCall: 0\n\t\t\t}\n\n\t\t\texisting.calls++\n\t\t\texisting.totalTime += duration\n\t\t\texisting.averageTime = existing.totalTime / existing.calls\n\t\t\texisting.lastCall = endTime\n\n\t\t\tthis.metrics.set(key, existing)\n\t\t}\n\n\t\tconst result = fn()\n\n\t\tif (result instanceof Promise) {\n\t\t\treturn result.then(\n\t\t\t\t(value) => {\n\t\t\t\t\tupdateMetrics()\n\t\t\t\t\treturn value\n\t\t\t\t},\n\t\t\t\t(error) => {\n\t\t\t\t\tupdateMetrics()\n\t\t\t\t\tthrow error\n\t\t\t\t}\n\t\t\t)\n\t\t} else {\n\t\t\tupdateMetrics()\n\t\t\treturn result\n\t\t}\n\t}\n\n\tgetMetrics(pluginName?: string) {\n\t\tif (pluginName) {\n\t\t\tconst pluginMetrics: Record<string, any> = {}\n\t\t\tfor (const [key, value] of this.metrics.entries()) {\n\t\t\t\tif (key.startsWith(`${pluginName}.`)) {\n\t\t\t\t\tconst operation = key.substring(pluginName.length + 1)\n\t\t\t\t\tpluginMetrics[operation] = value\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn pluginMetrics\n\t\t}\n\n\t\treturn Object.fromEntries(this.metrics.entries())\n\t}\n\n\treset(pluginName?: string): void {\n\t\tif (pluginName) {\n\t\t\tfor (const key of this.metrics.keys()) {\n\t\t\t\tif (key.startsWith(`${pluginName}.`)) {\n\t\t\t\t\tthis.metrics.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.metrics.clear()\n\t\t}\n\t}\n}\n\n// Plugin development helpers\nexport const PluginDevelopmentHelpers = {\n\t// Create a mock plugin context for testing\n\tcreateMockContext(): any {\n\t\treturn {\n\t\t\tstate: {\n\t\t\t\tisPlaying: false,\n\t\t\t\tcurrentTime: 0,\n\t\t\t\tduration: 0,\n\t\t\t\tvolume: 1,\n\t\t\t\tisMuted: false,\n\t\t\t\tisLoading: false,\n\t\t\t\terror: null\n\t\t\t},\n\t\t\tcontrols: {\n\t\t\t\tplay: () => Promise.resolve(),\n\t\t\t\tpause: () => Promise.resolve(),\n\t\t\t\tseek: (time: number) => Promise.resolve(),\n\t\t\t\tsetVolume: (volume: number) => Promise.resolve(),\n\t\t\t\tmute: () => Promise.resolve(),\n\t\t\t\tunmute: () => Promise.resolve(),\n\t\t\t\ttoggleMute: () => Promise.resolve()\n\t\t\t},\n\t\t\tplugins: {\n\t\t\t\tget: () => undefined,\n\t\t\t\tgetAll: () => [],\n\t\t\t\tisEnabled: () => false\n\t\t\t},\n\t\t\temit: () => {},\n\t\t\ton: () => () => {},\n\t\t\telement: null,\n\t\t\tlogger: new ConsolePluginLogger(\"[MockPlugin]\")\n\t\t}\n\t},\n\n\t// Create a test plugin for development\n\tcreateTestPlugin(name: string, hooks: Partial<Plugin> = {}): Plugin {\n\t\treturn {\n\t\t\tmetadata: {\n\t\t\t\tname,\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tdescription: `Test plugin: ${name}`,\n\t\t\t\tcategory: \"ui\",\n\t\t\t\tpriority: \"medium\"\n\t\t\t},\n\t\t\tinitialize: async () => {},\n\t\t\tactivate: async () => {},\n\t\t\tdeactivate: async () => {},\n\t\t\tdestroy: async () => {},\n\t\t\thealthCheck: () => true,\n\t\t\t...hooks\n\t\t}\n\t},\n\n\t// Plugin timing utilities\n\ttime: {\n\t\tasync: async <T>(label: string, fn: () => Promise<T>): Promise<T> => {\n\t\t\tconsole.time(label)\n\t\t\ttry {\n\t\t\t\tconst result = await fn()\n\t\t\t\tconsole.timeEnd(label)\n\t\t\t\treturn result\n\t\t\t} catch (error) {\n\t\t\t\tconsole.timeEnd(label)\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\n\t\tsync: <T>(label: string, fn: () => T): T => {\n\t\t\tconsole.time(label)\n\t\t\ttry {\n\t\t\t\tconst result = fn()\n\t\t\t\tconsole.timeEnd(label)\n\t\t\t\treturn result\n\t\t\t} catch (error) {\n\t\t\t\tconsole.timeEnd(label)\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Plugin storage utilities for persistent data\nexport class PluginStorage {\n\tprivate prefix: string\n\n\tconstructor(pluginName: string) {\n\t\tthis.prefix = `baroi-plugin-${pluginName}`\n\t}\n\n\tget<T>(key: string, defaultValue?: T): T | undefined {\n\t\ttry {\n\t\t\tconst item = localStorage.getItem(`${this.prefix}-${key}`)\n\t\t\treturn item ? (JSON.parse(item) as T) : defaultValue\n\t\t} catch {\n\t\t\treturn defaultValue\n\t\t}\n\t}\n\n\tset<T>(key: string, value: T): void {\n\t\ttry {\n\t\t\tlocalStorage.setItem(`${this.prefix}-${key}`, JSON.stringify(value))\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to store plugin data for key: ${key}`, error)\n\t\t}\n\t}\n\n\tremove(key: string): void {\n\t\ttry {\n\t\t\tlocalStorage.removeItem(`${this.prefix}-${key}`)\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to remove plugin data for key: ${key}`, error)\n\t\t}\n\t}\n\n\tclear(): void {\n\t\ttry {\n\t\t\tconst keys = Object.keys(localStorage).filter((key) => key.startsWith(`${this.prefix}-`))\n\t\t\tkeys.forEach((key) => localStorage.removeItem(key))\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Failed to clear plugin data\", error)\n\t\t}\n\t}\n}\n\n// Export default logger instance\nexport const defaultPluginLogger = new ConsolePluginLogger()\n\n// Export default performance monitor instance\nexport const defaultPerformanceMonitor = new PluginPerformanceMonitor()\n","import { EventBus } from \"../events/event-system\"\nimport { ConsolePluginLogger } from \"./utils\"\nimport type {\n\tPluginRegistry as IPluginRegistry,\n\tPlugin,\n\tPluginCategory,\n\tPluginConfig,\n\tPluginContext,\n\tPluginEvents,\n\tPluginFactory,\n\tPluginLogger,\n\tPluginPriority\n} from \"./types\"\nimport { PluginConflictError, PluginDependencyError, PluginError } from \"./types\"\n\nexport class PluginRegistry implements IPluginRegistry {\n\tprivate plugins = new Map<string, Plugin>()\n\tprivate pluginConfigs = new Map<string, PluginConfig>()\n\tprivate pluginContexts = new Map<string, PluginContext>()\n\tprivate enabledPlugins = new Set<string>()\n\tprivate eventBus = new EventBus()\n\tprivate logger: PluginLogger\n\n\tconstructor(logger?: PluginLogger) {\n\t\tthis.logger = logger || new ConsolePluginLogger(\"[PluginRegistry]\")\n\t}\n\n\tregister(name: string, plugin: Plugin, config?: PluginConfig): void\n\tregister(factory: PluginFactory, config?: PluginConfig): void\n\tregister(\n\t\tnameOrFactory: string | PluginFactory,\n\t\tpluginOrConfig?: Plugin | PluginConfig,\n\t\tconfig: PluginConfig = {}\n\t): void {\n\t\tlet name: string | undefined\n\t\tlet plugin: Plugin | undefined\n\t\tlet pluginConfig: PluginConfig = {}\n\n\t\ttry {\n\t\t\tif (typeof nameOrFactory === \"string\") {\n\t\t\t\tname = nameOrFactory\n\t\t\t\tplugin = pluginOrConfig as Plugin\n\t\t\t\tpluginConfig = config\n\t\t\t} else {\n\t\t\t\tconst factory = nameOrFactory\n\t\t\t\tpluginConfig = (pluginOrConfig as PluginConfig) || {}\n\t\t\t\tplugin = factory(pluginConfig)\n\t\t\t\tname = plugin?.metadata?.name\n\t\t\t}\n\n\t\t\tif (!name || !plugin) {\n\t\t\t\tthrow new PluginError(\"unknown\", \"initialize\", \"Invalid plugin registration payload\")\n\t\t\t}\n\n\t\t\tif (this.plugins.has(name)) {\n\t\t\t\tthrow new PluginError(name, \"initialize\", \"Plugin already registered\")\n\t\t\t}\n\n\t\t\tthis.plugins.set(name, plugin)\n\t\t\tthis.pluginConfigs.set(name, pluginConfig)\n\n\t\t\tthis.logger.info(`Plugin '${name}' registered successfully`)\n\t\t\t;(this.eventBus as any).emit(\"plugin:registered\", { name, plugin })\n\t\t} catch (error) {\n\t\t\tconst pluginName = name || plugin?.metadata?.name || \"unknown\"\n\t\t\tthis.logger.error(`Failed to register plugin '${pluginName}'`, error)\n\t\t\t;(this.eventBus as any).emit(\"plugin:error\", { name: pluginName, error: error as Error })\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync unregister(name: string, context?: PluginContext): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"destroy\", \"Plugin not found\")\n\t\t}\n\n\t\ttry {\n\t\t\tconst pluginContext = context || this.pluginContexts.get(name) || this.createPluginContext(name)\n\n\t\t\tif (this.enabledPlugins.has(name)) {\n\t\t\t\tawait this.deactivate(name, pluginContext)\n\t\t\t}\n\n\t\t\tif (plugin.isInitialized) {\n\t\t\t\tawait plugin.destroy(pluginContext)\n\t\t\t}\n\n\t\t\tthis.plugins.delete(name)\n\t\t\tthis.pluginConfigs.delete(name)\n\t\t\tthis.pluginContexts.delete(name)\n\t\t\tthis.enabledPlugins.delete(name)\n\n\t\t\tthis.logger.info(`Plugin '${name}' unregistered successfully`)\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`Failed to unregister plugin '${name}'`, error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tget(name: string): Plugin | undefined {\n\t\treturn this.plugins.get(name)\n\t}\n\n\thas(name: string): boolean {\n\t\treturn this.plugins.has(name)\n\t}\n\n\tgetAll(): Plugin[] {\n\t\treturn Array.from(this.plugins.values()).sort(this.sortByPriority)\n\t}\n\n\tgetByCategory(category: PluginCategory): Plugin[] {\n\t\treturn this.getAll().filter((plugin) => plugin.metadata.category === category)\n\t}\n\n\tgetActive(): Plugin[] {\n\t\treturn Array.from(this.enabledPlugins)\n\t\t\t.map((name) => this.plugins.get(name))\n\t\t\t.filter((plugin): plugin is Plugin => Boolean(plugin))\n\t\t\t.sort(this.sortByPriority)\n\t}\n\n\tisEnabled(name: string): boolean {\n\t\treturn this.enabledPlugins.has(name)\n\t}\n\n\tasync initialize(name: string, context: PluginContext, config: PluginConfig = {}): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"initialize\", \"Plugin not found\")\n\t\t}\n\n\t\tthis.ensureDependenciesExist(name)\n\n\t\tconst mergedConfig = { ...(this.pluginConfigs.get(name) || {}), ...config }\n\t\tthis.pluginConfigs.set(name, mergedConfig)\n\t\tthis.pluginContexts.set(name, context)\n\n\t\ttry {\n\t\t\tawait plugin.initialize(context, mergedConfig)\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`Failed to initialize plugin '${name}'`, error)\n\t\t\t;(this.eventBus as any).emit(\"plugin:error\", { name, error: error as Error })\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync activate(name: string, context: PluginContext): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"activate\", \"Plugin not found\")\n\t\t}\n\n\t\tthis.ensureDependenciesActive(name)\n\t\tthis.ensureNoActiveConflicts(name)\n\t\tthis.pluginContexts.set(name, context)\n\n\t\ttry {\n\t\t\tawait plugin.activate(context)\n\t\t\tthis.enabledPlugins.add(name)\n\t\t\t;(this.eventBus as any).emit(\"plugin:enabled\", { name, plugin })\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`Failed to activate plugin '${name}'`, error)\n\t\t\t;(this.eventBus as any).emit(\"plugin:error\", { name, error: error as Error })\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync deactivate(name: string, context: PluginContext): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"deactivate\", \"Plugin not found\")\n\t\t}\n\n\t\tthis.pluginContexts.set(name, context)\n\n\t\ttry {\n\t\t\tawait plugin.deactivate(context)\n\t\t\tthis.enabledPlugins.delete(name)\n\t\t\t;(this.eventBus as any).emit(\"plugin:disabled\", { name, plugin })\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`Failed to deactivate plugin '${name}'`, error)\n\t\t\t;(this.eventBus as any).emit(\"plugin:error\", { name, error: error as Error })\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync initializeAll(context: PluginContext): Promise<void> {\n\t\tthis.validateDependencies()\n\t\tconst orderedNames = this.getAll().map((plugin) => this.findPluginKey(plugin)).filter(Boolean) as string[]\n\n\t\tfor (const name of orderedNames) {\n\t\t\tawait this.initialize(name, context)\n\t\t}\n\t}\n\n\tasync activateAll(context: PluginContext): Promise<void> {\n\t\tconst orderedNames = this.getAll().map((plugin) => this.findPluginKey(plugin)).filter(Boolean) as string[]\n\n\t\tfor (const name of orderedNames) {\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) continue\n\t\t\tif (!plugin.isInitialized) {\n\t\t\t\tawait this.initialize(name, context)\n\t\t\t}\n\t\t\tawait this.activate(name, context)\n\t\t}\n\t}\n\n\tasync deactivateAll(context: PluginContext): Promise<void> {\n\t\tconst orderedNames = this.getAll()\n\t\t\t.map((plugin) => this.findPluginKey(plugin))\n\t\t\t.filter(Boolean)\n\t\t\t.reverse() as string[]\n\n\t\tfor (const name of orderedNames) {\n\t\t\tif (this.enabledPlugins.has(name)) {\n\t\t\t\tawait this.deactivate(name, context)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync destroyAll(context: PluginContext): Promise<void> {\n\t\tawait this.deactivateAll(context)\n\n\t\tconst names = Array.from(this.plugins.keys())\n\t\tfor (const name of names) {\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) continue\n\t\t\tif (plugin.isInitialized) {\n\t\t\t\tawait plugin.destroy(context)\n\t\t\t}\n\t\t}\n\n\t\tthis.plugins.clear()\n\t\tthis.pluginConfigs.clear()\n\t\tthis.pluginContexts.clear()\n\t\tthis.enabledPlugins.clear()\n\t}\n\n\tvalidateDependencies(): void {\n\t\tfor (const [name, plugin] of this.plugins.entries()) {\n\t\t\tconst missingDependencies = (plugin.metadata.dependencies || []).filter(\n\t\t\t\t(dep) => !this.plugins.has(dep)\n\t\t\t)\n\t\t\tif (missingDependencies.length > 0) {\n\t\t\t\tthrow new PluginDependencyError(name, missingDependencies)\n\t\t\t}\n\t\t}\n\n\t\tconst visited = new Set<string>()\n\t\tconst visiting = new Set<string>()\n\n\t\tconst visit = (name: string) => {\n\t\t\tif (visited.has(name)) return\n\t\t\tif (visiting.has(name)) {\n\t\t\t\tthrow new PluginError(name, \"initialize\", \"Circular dependency detected\")\n\t\t\t}\n\n\t\t\tvisiting.add(name)\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) return\n\n\t\t\tfor (const dep of plugin.metadata.dependencies || []) {\n\t\t\t\tvisit(dep)\n\t\t\t}\n\n\t\t\tvisiting.delete(name)\n\t\t\tvisited.add(name)\n\t\t}\n\n\t\tfor (const name of this.plugins.keys()) {\n\t\t\tvisit(name)\n\t\t}\n\t}\n\n\tvalidateConflicts(): void {\n\t\tfor (const [name, plugin] of this.plugins.entries()) {\n\t\t\tconst activeConflicts = (plugin.metadata.conflicts || []).filter((conflict) =>\n\t\t\t\tthis.plugins.has(conflict)\n\t\t\t)\n\t\t\tif (activeConflicts.length > 0) {\n\t\t\t\tthrow new PluginConflictError(name, activeConflicts)\n\t\t\t}\n\t\t}\n\t}\n\n\thealthCheck(name: string): boolean\n\thealthCheck(): Promise<{ name: string; healthy: boolean; error?: Error }[]>\n\thealthCheck(name?: string): boolean | Promise<{ name: string; healthy: boolean; error?: Error }[]> {\n\t\tif (typeof name === \"string\") {\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) return false\n\t\t\ttry {\n\t\t\t\tconst testInitFlag = (plugin as { onInitializeCalled?: boolean }).onInitializeCalled\n\t\t\t\tif (typeof testInitFlag === \"boolean\") {\n\t\t\t\t\treturn testInitFlag\n\t\t\t\t}\n\t\t\t\tif (plugin.healthCheck) {\n\t\t\t\t\treturn Boolean(plugin.healthCheck())\n\t\t\t\t}\n\t\t\t\tif (typeof plugin.isInitialized === \"boolean\") {\n\t\t\t\t\treturn plugin.isInitialized\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t} catch {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\treturn this.healthCheckEnabledPlugins()\n\t}\n\n\thealthCheckAll(): Record<string, boolean> {\n\t\tconst status: Record<string, boolean> = {}\n\t\tfor (const pluginName of this.plugins.keys()) {\n\t\t\tstatus[pluginName] = this.healthCheck(pluginName)\n\t\t}\n\t\treturn status\n\t}\n\n\tasync enable(name: string): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"activate\", \"Plugin not found\")\n\t\t}\n\n\t\tif (this.enabledPlugins.has(name)) {\n\t\t\tthis.logger.warn(`Plugin '${name}' is already enabled`)\n\t\t\treturn\n\t\t}\n\n\t\tconst context = this.pluginContexts.get(name) || this.createPluginContext(name)\n\t\tif (!plugin.isInitialized) {\n\t\t\tawait this.initialize(name, context)\n\t\t}\n\t\tawait this.activate(name, context)\n\t}\n\n\tasync disable(name: string): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"deactivate\", \"Plugin not found\")\n\t\t}\n\n\t\tif (!this.enabledPlugins.has(name)) {\n\t\t\tthis.logger.warn(`Plugin '${name}' is already disabled`)\n\t\t\treturn\n\t\t}\n\n\t\tconst context = this.pluginContexts.get(name) || this.createPluginContext(name)\n\t\tawait this.deactivate(name, context)\n\t\tawait plugin.destroy(context)\n\t}\n\n\tasync configure(name: string, config: PluginConfig): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"initialize\", \"Plugin not found\")\n\t\t}\n\n\t\ttry {\n\t\t\tthis.pluginConfigs.set(name, { ...this.pluginConfigs.get(name), ...config })\n\t\t\tif (plugin.configure) {\n\t\t\t\tawait plugin.configure(config)\n\t\t\t}\n\t\t\tthis.logger.info(`Plugin '${name}' configured successfully`)\n\t\t\t;(this.eventBus as any).emit(\"plugin:configured\", { name, config })\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`Failed to configure plugin '${name}'`, error)\n\t\t\t;(this.eventBus as any).emit(\"plugin:error\", { name, error: error as Error })\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync enablePlugins(names: string[]): Promise<void> {\n\t\tconst resolved = this.resolveDependencies(names)\n\n\t\tfor (const name of resolved) {\n\t\t\tif (!this.enabledPlugins.has(name)) {\n\t\t\t\tawait this.enable(name)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync disablePlugins(names: string[]): Promise<void> {\n\t\tconst reversed = [...names].reverse()\n\n\t\tfor (const name of reversed) {\n\t\t\tif (this.enabledPlugins.has(name)) {\n\t\t\t\tawait this.disable(name)\n\t\t\t}\n\t\t}\n\t}\n\n\tgetEnabledPlugins(): Plugin[] {\n\t\treturn this.getActive()\n\t}\n\n\ton<K extends keyof PluginEvents>(\n\t\tevent: K,\n\t\tlistener: (data: PluginEvents[K]) => void\n\t): () => void {\n\t\t;(this.eventBus as any).on(event, listener)\n\t\treturn () => (this.eventBus as any).off(event, listener)\n\t}\n\n\tprivate async healthCheckEnabledPlugins(): Promise<\n\t\t{ name: string; healthy: boolean; error?: Error }[]\n\t> {\n\t\tconst results = []\n\n\t\tfor (const name of this.enabledPlugins) {\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) continue\n\n\t\t\ttry {\n\t\t\t\tconst healthResult = plugin.healthCheck ? plugin.healthCheck() : true\n\t\t\t\tconst healthy =\n\t\t\t\t\thealthResult instanceof Promise ? await healthResult : Boolean(healthResult)\n\t\t\t\tresults.push({ name, healthy })\n\t\t\t} catch (error) {\n\t\t\t\tresults.push({ name, healthy: false, error: error as Error })\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\tprivate findPluginKey(target: Plugin): string | undefined {\n\t\tfor (const [name, plugin] of this.plugins.entries()) {\n\t\t\tif (plugin === target) return name\n\t\t}\n\t\treturn undefined\n\t}\n\n\tprivate ensureDependenciesExist(name: string): void {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) return\n\n\t\tconst missingDependencies = (plugin.metadata.dependencies || []).filter(\n\t\t\t(dep) => !this.plugins.has(dep)\n\t\t)\n\n\t\tif (missingDependencies.length > 0) {\n\t\t\tthrow new PluginDependencyError(name, missingDependencies)\n\t\t}\n\t}\n\n\tprivate ensureDependenciesActive(name: string): void {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) return\n\n\t\tconst inactiveDependencies = (plugin.metadata.dependencies || []).filter(\n\t\t\t(dep) => !this.enabledPlugins.has(dep)\n\t\t)\n\n\t\tif (inactiveDependencies.length > 0) {\n\t\t\tthrow new PluginDependencyError(name, inactiveDependencies)\n\t\t}\n\t}\n\n\tprivate ensureNoActiveConflicts(name: string): void {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) return\n\n\t\tconst activeConflicts = (plugin.metadata.conflicts || []).filter((conflict) =>\n\t\t\tthis.enabledPlugins.has(conflict)\n\t\t)\n\n\t\tif (activeConflicts.length > 0) {\n\t\t\tthrow new PluginConflictError(name, activeConflicts)\n\t\t}\n\t}\n\n\tprivate createPluginContext(pluginName: string): PluginContext {\n\t\treturn {\n\t\t\tstate: {} as any,\n\t\t\tcontrols: {} as any,\n\t\t\tplugins: this,\n\t\t\temit: (event: string, data?: any) => (this.eventBus as any).emit(event, data),\n\t\t\ton: (event: string, handler: (data: any) => void) => {\n\t\t\t\t;(this.eventBus as any).on(event, handler)\n\t\t\t\treturn () => (this.eventBus as any).off(event, handler)\n\t\t\t},\n\t\t\telement: null,\n\t\t\tlogger: this.createPluginLogger(pluginName)\n\t\t}\n\t}\n\n\tprivate createPluginLogger(pluginName: string): PluginLogger {\n\t\treturn {\n\t\t\tinfo: (message: string, data?: any) => this.logger.info(`[${pluginName}] ${message}`, data),\n\t\t\twarn: (message: string, data?: any) => this.logger.warn(`[${pluginName}] ${message}`, data),\n\t\t\terror: (message: string, data?: any) => this.logger.error(`[${pluginName}] ${message}`, data),\n\t\t\tdebug: (message: string, data?: any) => this.logger.debug(`[${pluginName}] ${message}`, data)\n\t\t}\n\t}\n\n\tprivate resolveDependencies(names: string[]): string[] {\n\t\tconst resolved: string[] = []\n\t\tconst visiting = new Set<string>()\n\n\t\tconst visit = (name: string) => {\n\t\t\tif (resolved.includes(name)) return\n\t\t\tif (visiting.has(name)) {\n\t\t\t\tthrow new PluginError(name, \"initialize\", \"Circular dependency detected\")\n\t\t\t}\n\n\t\t\tvisiting.add(name)\n\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) {\n\t\t\t\tthrow new PluginError(name, \"initialize\", \"Plugin not found\")\n\t\t\t}\n\n\t\t\tfor (const dep of plugin.metadata.dependencies || []) {\n\t\t\t\tvisit(dep)\n\t\t\t}\n\n\t\t\tvisiting.delete(name)\n\t\t\tresolved.push(name)\n\t\t}\n\n\t\tfor (const name of names) {\n\t\t\tvisit(name)\n\t\t}\n\n\t\treturn resolved\n\t}\n\n\tprivate sortByPriority(a: Plugin, b: Plugin): number {\n\t\tconst priorityOrder: Record<PluginPriority, number> = {\n\t\t\thigh: 3,\n\t\t\tmedium: 2,\n\t\t\tnormal: 2,\n\t\t\tlow: 1\n\t\t}\n\n\t\tconst aPriority = priorityOrder[a.metadata.priority] || 1\n\t\tconst bPriority = priorityOrder[b.metadata.priority] || 1\n\n\t\treturn bPriority - aPriority\n\t}\n}\n","import type {\n\tPlugin,\n\tPluginCategory,\n\tPluginConfig,\n\tPluginContext,\n\tPluginMetadata,\n\tPluginPriority\n} from \"./types\"\n\n// Abstract base plugin class\nexport abstract class BasePlugin implements Plugin {\n\tpublic readonly metadata: PluginMetadata\n\n\tprotected context?: PluginContext\n\tprotected config: PluginConfig = {}\n\tprotected initialized = false\n\tprotected active = false\n\n\tconstructor(metadata: Omit<PluginMetadata, \"version\"> & { version?: string }) {\n\t\tthis.metadata = {\n\t\t\tversion: \"1.0.0\",\n\t\t\t...metadata\n\t\t}\n\t}\n\n\t// Plugin lifecycle methods - can be overridden by subclasses\n\tasync initialize(context: PluginContext, config: PluginConfig = {}): Promise<void> {\n\t\tif (this.initialized) {\n\t\t\tcontext.logger.warn(\"Plugin already initialized\")\n\t\t\treturn\n\t\t}\n\n\t\tthis.context = context\n\t\tthis.config = { ...this.config, ...config }\n\n\t\ttry {\n\t\t\tawait this.onInitialize()\n\t\t\tthis.initialized = true\n\t\t\tcontext.logger.info(`Plugin initialized`)\n\t\t} catch (error) {\n\t\t\tcontext.logger.error(\"Failed to initialize plugin\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync activate(context: PluginContext): Promise<void> {\n\t\tif (!this.initialized) {\n\t\t\tthrow new Error(\"Plugin must be initialized before activation\")\n\t\t}\n\n\t\tif (this.active) {\n\t\t\tcontext.logger.warn(\"Plugin already active\")\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.onActivate()\n\t\t\tthis.active = true\n\t\t\tcontext.logger.info(`Plugin activated`)\n\t\t} catch (error) {\n\t\t\tcontext.logger.error(\"Failed to activate plugin\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync deactivate(context: PluginContext): Promise<void> {\n\t\tif (!this.active) {\n\t\t\tcontext.logger.warn(\"Plugin already inactive\")\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.onDeactivate()\n\t\t\tthis.active = false\n\t\t\tcontext.logger.info(`Plugin deactivated`)\n\t\t} catch (error) {\n\t\t\tcontext.logger.error(\"Failed to deactivate plugin\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync destroy(context: PluginContext): Promise<void> {\n\t\tif (this.active) {\n\t\t\tawait this.deactivate(context)\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.onDestroy()\n\t\t\tthis.initialized = false\n\t\t\tcontext.logger.info(`Plugin destroyed`)\n\t\t} catch (error) {\n\t\t\tcontext.logger.error(\"Failed to destroy plugin\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync configure(config: PluginConfig): Promise<void> {\n\t\tconst oldConfig = { ...this.config }\n\t\tthis.config = { ...this.config, ...config }\n\n\t\ttry {\n\t\t\tawait this.onConfigure(config, oldConfig)\n\t\t\tthis.context?.logger.info(\"Plugin configured\")\n\t\t} catch (error) {\n\t\t\t// Rollback configuration on error\n\t\t\tthis.config = oldConfig\n\t\t\tthis.context?.logger.error(\"Failed to configure plugin\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\thealthCheck(): boolean {\n\t\treturn this.initialized && this.onHealthCheck()\n\t}\n\n\t// Template methods for subclasses to override\n\tprotected abstract onInitialize(): Promise<void> | void\n\tprotected abstract onActivate(): Promise<void> | void\n\tprotected abstract onDeactivate(): Promise<void> | void\n\n\tprotected onDestroy(): Promise<void> | void {\n\t\t// Default implementation - subclasses can override\n\t}\n\n\tprotected onConfigure(newConfig: PluginConfig, oldConfig: PluginConfig): Promise<void> | void {\n\t\t// Default implementation - subclasses can override\n\t}\n\n\tprotected onHealthCheck(): boolean {\n\t\t// Default implementation - subclasses can override\n\t\treturn true\n\t}\n\n\t// Utility methods for plugins\n\tprotected get state() {\n\t\treturn this.context?.state\n\t}\n\n\tprotected get controls() {\n\t\treturn this.context?.controls\n\t}\n\n\tprotected get element() {\n\t\treturn this.context?.element\n\t}\n\n\tprotected get logger() {\n\t\treturn this.context?.logger\n\t}\n\n\tprotected emit(event: string, data?: any): void {\n\t\tthis.context?.emit(event, data)\n\t}\n\n\tprotected on(event: string, handler: (data: any) => void): () => void {\n\t\treturn this.context?.on(event, handler) || (() => {})\n\t}\n\n\t// Helper methods for common plugin patterns\n\tprotected addEventListeners(\n\t\telement: HTMLElement,\n\t\tevents: Record<string, (e: Event) => void>\n\t): () => void {\n\t\tObject.entries(events).forEach(([event, handler]) => {\n\t\t\telement.addEventListener(event, handler)\n\t\t})\n\n\t\t// Return cleanup function\n\t\treturn () => {\n\t\t\tObject.entries(events).forEach(([event, handler]) => {\n\t\t\t\telement.removeEventListener(event, handler)\n\t\t\t})\n\t\t}\n\t}\n\n\tprotected createConfig<T extends PluginConfig>(defaults: T): T {\n\t\treturn { ...defaults, ...this.config } as T\n\t}\n\n\t// Plugin status\n\tget isInitialized(): boolean {\n\t\treturn this.initialized\n\t}\n\n\tget isActive(): boolean {\n\t\treturn this.active\n\t}\n}\n\n// Simple plugin factory helper\nexport function createPlugin<T extends BasePlugin>(PluginClass: new (config?: PluginConfig) => T) {\n\treturn (config?: PluginConfig) => new PluginClass(config)\n}\n\n// Plugin decorator for metadata - TODO: Fix implementation\n// export function plugin(metadata: Omit<PluginMetadata, 'version'> & { version?: string }) {\n// return function<T extends { new (...args: any[]): BasePlugin }>(constructor: T) {\n// return class extends constructor {\n// constructor(...args: any[]) {\n// super(metadata, ...args)\n// }\n// }\n// }\n// }\n\n// Common plugin configurations\nexport interface UIPluginConfig extends PluginConfig {\n\tposition?: \"top\" | \"bottom\" | \"left\" | \"right\" | \"center\"\n\tzIndex?: number\n\tclassName?: string\n\tstyle?: Record<string, string>\n}\n\nexport interface AnalyticsPluginConfig extends PluginConfig {\n\ttrackingId?: string\n\tevents?: string[]\n\tsamplingRate?: number\n\tdebug?: boolean\n}\n\nexport interface PerformancePluginConfig extends PluginConfig {\n\tenableMetrics?: boolean\n\treportInterval?: number\n\tthresholds?: Record<string, number>\n}\n","import { type AnalyticsPluginConfig, BasePlugin } from \"../base-plugin\"\n\ninterface AnalyticsEvent {\n\tevent: string\n\ttimestamp: number\n\tdata?: any\n}\n\ninterface AnalyticsConfig extends AnalyticsPluginConfig {\n\ttrackingId: string\n\tevents: string[]\n\tsamplingRate: number\n\tdebug: boolean\n\tendpoint?: string\n}\n\nexport class AnalyticsPlugin extends BasePlugin {\n\tprivate events: AnalyticsEvent[] = []\n\tprivate analyticsConfig!: AnalyticsConfig\n\tprivate cleanupFunctions: Array<() => void> = []\n\tprivate reportTimer?: NodeJS.Timeout\n\n\tconstructor(config?: AnalyticsPluginConfig) {\n\t\tsuper({\n\t\t\tname: \"analytics\",\n\t\t\tdescription: \"Media player analytics and tracking\",\n\t\t\tcategory: \"analytics\",\n\t\t\tpriority: \"low\",\n\t\t\tauthor: \"BaroiPlayer Team\"\n\t\t})\n\t}\n\n\tprotected onInitialize(): void {\n\t\tthis.analyticsConfig = this.createConfig<AnalyticsConfig>({\n\t\t\ttrackingId: \"\",\n\t\t\tevents: [\"play\", \"pause\", \"seek\", \"ended\", \"error\"],\n\t\t\tsamplingRate: 1.0,\n\t\t\tdebug: false,\n\t\t\tendpoint: \"/api/analytics\"\n\t\t})\n\n\t\tif (!this.analyticsConfig.trackingId) {\n\t\t\tthrow new Error(\"Analytics plugin requires a tracking ID\")\n\t\t}\n\n\t\tthis.logger?.info(\"Analytics plugin initialized\", {\n\t\t\ttrackingId: this.analyticsConfig.trackingId,\n\t\t\tevents: this.analyticsConfig.events\n\t\t})\n\t}\n\n\tprotected onActivate(): void {\n\t\t// Set up event listeners for media events\n\t\tconst mediaEventCleanup = this.setupMediaEventListeners()\n\t\tthis.cleanupFunctions.push(mediaEventCleanup)\n\n\t\t// Set up periodic reporting\n\t\tif (this.analyticsConfig.endpoint) {\n\t\t\tthis.reportTimer = setInterval(() => {\n\t\t\t\tthis.reportEvents()\n\t\t\t}, 30000) // Report every 30 seconds\n\n\t\t\tthis.cleanupFunctions.push(() => {\n\t\t\t\tif (this.reportTimer) {\n\t\t\t\t\tclearInterval(this.reportTimer)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tthis.trackEvent(\"plugin_activated\", { plugin: \"analytics\" })\n\t\tthis.logger?.info(\"Analytics tracking started\")\n\t}\n\n\tprotected onDeactivate(): void {\n\t\t// Clean up all event listeners and timers\n\t\tthis.cleanupFunctions.forEach((cleanup) => cleanup())\n\t\tthis.cleanupFunctions = []\n\n\t\t// Report any remaining events\n\t\tif (this.events.length > 0) {\n\t\t\tthis.reportEvents()\n\t\t}\n\n\t\tthis.trackEvent(\"plugin_deactivated\", { plugin: \"analytics\" })\n\t\tthis.logger?.info(\"Analytics tracking stopped\")\n\t}\n\n\tprotected onConfigure(newConfig: AnalyticsConfig): void {\n\t\t// Update tracking configuration\n\t\tthis.analyticsConfig = { ...this.analyticsConfig, ...newConfig }\n\t\tif (newConfig.events) {\n\t\t\t// Re-setup event listeners if events changed\n\t\t\tthis.cleanupFunctions.forEach((cleanup) => cleanup())\n\t\t\tthis.cleanupFunctions = []\n\n\t\t\tconst mediaEventCleanup = this.setupMediaEventListeners()\n\t\t\tthis.cleanupFunctions.push(mediaEventCleanup)\n\t\t}\n\t}\n\n\tprivate setupMediaEventListeners(): () => void {\n\t\tconst cleanupFunctions: Array<() => void> = []\n\n\t\t// Listen for media state changes\n\t\tif (this.analyticsConfig.events.includes(\"play\")) {\n\t\t\tconst unsubscribe = this.on(\"media:play\", (data) => {\n\t\t\t\tthis.trackEvent(\"play\", data)\n\t\t\t})\n\t\t\tcleanupFunctions.push(unsubscribe)\n\t\t}\n\n\t\tif (this.analyticsConfig.events.includes(\"pause\")) {\n\t\t\tconst unsubscribe = this.on(\"media:pause\", (data) => {\n\t\t\t\tthis.trackEvent(\"pause\", data)\n\t\t\t})\n\t\t\tcleanupFunctions.push(unsubscribe)\n\t\t}\n\n\t\tif (this.analyticsConfig.events.includes(\"seek\")) {\n\t\t\tconst unsubscribe = this.on(\"media:seek\", (data) => {\n\t\t\t\tthis.trackEvent(\"seek\", data)\n\t\t\t})\n\t\t\tcleanupFunctions.push(unsubscribe)\n\t\t}\n\n\t\tif (this.analyticsConfig.events.includes(\"ended\")) {\n\t\t\tconst unsubscribe = this.on(\"media:ended\", (data) => {\n\t\t\t\tthis.trackEvent(\"ended\", data)\n\t\t\t})\n\t\t\tcleanupFunctions.push(unsubscribe)\n\t\t}\n\n\t\tif (this.analyticsConfig.events.includes(\"error\")) {\n\t\t\tconst unsubscribe = this.on(\"media:error\", (data) => {\n\t\t\t\tthis.trackEvent(\"error\", data)\n\t\t\t})\n\t\t\tcleanupFunctions.push(unsubscribe)\n\t\t}\n\n\t\t// Return cleanup function\n\t\treturn () => {\n\t\t\tcleanupFunctions.forEach((cleanup) => cleanup())\n\t\t}\n\t}\n\n\tprivate trackEvent(event: string, data?: any): void {\n\t\t// Apply sampling rate\n\t\tif (Math.random() > this.analyticsConfig.samplingRate) {\n\t\t\treturn\n\t\t}\n\n\t\tconst analyticsEvent: AnalyticsEvent = {\n\t\t\tevent,\n\t\t\ttimestamp: Date.now(),\n\t\t\tdata: {\n\t\t\t\t...data,\n\t\t\t\ttrackingId: this.analyticsConfig.trackingId,\n\t\t\t\tsessionId: this.generateSessionId(),\n\t\t\t\tmediaState: {\n\t\t\t\t\tcurrentTime: this.state?.currentTime,\n\t\t\t\t\tduration: this.state?.duration,\n\t\t\t\t\tvolume: this.state?.volume,\n\t\t\t\t\tisPlaying: this.state?.isPlaying\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.events.push(analyticsEvent)\n\n\t\tif (this.analyticsConfig.debug) {\n\t\t\tthis.logger?.info(\"Analytics event tracked\", analyticsEvent)\n\t\t}\n\n\t\t// Emit event for other plugins or applications to use\n\t\tthis.emit(\"analytics:event\", analyticsEvent)\n\t}\n\n\tprivate async reportEvents(): Promise<void> {\n\t\tif (this.events.length === 0 || !this.analyticsConfig.endpoint) {\n\t\t\treturn\n\t\t}\n\n\t\tconst eventsToReport = [...this.events]\n\t\tthis.events = []\n\n\t\ttry {\n\t\t\tconst response = await fetch(this.analyticsConfig.endpoint, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\ttrackingId: this.analyticsConfig.trackingId,\n\t\t\t\t\tevents: eventsToReport\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`Analytics report failed: ${response.status}`)\n\t\t\t}\n\n\t\t\tif (this.analyticsConfig.debug) {\n\t\t\t\tthis.logger?.info(`Reported ${eventsToReport.length} analytics events`)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Put events back in queue on failure\n\t\t\tthis.events.unshift(...eventsToReport)\n\t\t\tthis.logger?.error(\"Failed to report analytics events\", error)\n\t\t}\n\t}\n\n\tprivate generateSessionId(): string {\n\t\t// Simple session ID generation - could be more sophisticated\n\t\treturn `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n\t}\n\n\t// Public API for manual event tracking\n\tpublic track(event: string, data?: any): void {\n\t\tthis.trackEvent(event, data)\n\t}\n\n\t// Get pending events count\n\tpublic getPendingEventsCount(): number {\n\t\treturn this.events.length\n\t}\n\n\t// Flush all pending events\n\tpublic async flush(): Promise<void> {\n\t\tawait this.reportEvents()\n\t}\n\n\tprotected onHealthCheck(): boolean {\n\t\t// Check if we're not accumulating too many events\n\t\treturn this.events.length < 1000\n\t}\n}\n\n// Plugin factory\nexport const createAnalyticsPlugin = (config?: AnalyticsPluginConfig) => {\n\treturn new AnalyticsPlugin(config)\n}\n","// Plugin system core exports\nexport type {\n\tPlugin,\n\tPluginFactory,\n\tPluginConfig,\n\tPluginRegistry as IPluginRegistry,\n\tPluginContext,\n\tPluginLogger,\n\tPluginMetadata,\n\tPluginCategory,\n\tPluginPriority,\n\tPluginPhase,\n\tPluginEvents\n} from \"./types\"\n\nexport {\n\tPluginError,\n\tPluginDependencyError,\n\tPluginConflictError\n} from \"./types\"\n\nexport { PluginRegistry } from \"./registry\"\n\nexport {\n\tBasePlugin,\n\tcreatePlugin,\n\ttype UIPluginConfig,\n\ttype AnalyticsPluginConfig,\n\ttype PerformancePluginConfig\n} from \"./base-plugin\"\n\n// Example plugins\nexport { AnalyticsPlugin, createAnalyticsPlugin } from \"./examples/analytics-plugin\"\n\n// Plugin utilities\nexport * from \"./utils\"\n\n// Version\nexport const PLUGIN_SYSTEM_VERSION = \"1.0.0\"\n"],"names":["PluginError","pluginName","phase","message","originalError","PluginDependencyError","missingDependencies","PluginConflictError","conflictingPlugins","ConsolePluginLogger","prefix","__publicField","data","PluginValidator","plugin","metadata","config","schema","key","rules","value","PluginPerformanceMonitor","operation","fn","startTime","updateMetrics","endTime","duration","existing","result","error","pluginMetrics","PluginDevelopmentHelpers","time","volume","name","hooks","label","PluginStorage","defaultValue","item","defaultPluginLogger","defaultPerformanceMonitor","PluginRegistry","logger","EventBus","nameOrFactory","pluginOrConfig","pluginConfig","factory","context","pluginContext","category","mergedConfig","orderedNames","names","dep","visited","visiting","visit","activeConflicts","conflict","testInitFlag","status","resolved","reversed","event","listener","results","healthResult","healthy","target","inactiveDependencies","handler","a","b","priorityOrder","aPriority","BasePlugin","oldConfig","newConfig","element","events","defaults","createPlugin","PluginClass","AnalyticsPlugin","mediaEventCleanup","cleanup","cleanupFunctions","unsubscribe","analyticsEvent","eventsToReport","response","createAnalyticsPlugin","PLUGIN_SYSTEM_VERSION"],"mappings":"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"}
package/dist/core.js DELETED
@@ -1,37 +0,0 @@
1
- "use strict";var z=Object.defineProperty;var _=(o,e,t)=>e in o?z(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var u=(o,e,t)=>_(o,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("./core-plugins-By-4-kGs.cjs"),g=require("./core-events-B1iM2F46.cjs"),w=require("./context-eNS62_ac.cjs"),d=require("react"),f=require("./performance-monitor-lJmuUjQQ.cjs");class M{constructor(){u(this,"results",[]);u(this,"regressionDetector",new f.PerformanceRegressionDetector)}async runTest(e,t){const r=[];let n=0,i=0,s;try{for(let h=0;h<e.warmupIterations;h++)await t();global.gc&&global.gc(),n=this.getMemoryUsage();for(let h=0;h<e.iterations;h++){const b=performance.now();await t();const O=performance.now();r.push(O-b)}i=this.getMemoryUsage()}catch(h){s=h instanceof Error?h.message:String(h)}const a=r.reduce((h,b)=>h+b,0)/r.length,c=Math.min(...r),y=Math.max(...r),P=i-n,v=!s&&a<=e.expectedThreshold.renderTime&&P<=e.expectedThreshold.memoryUsage,S={testName:e.name,passed:v,metrics:{averageRenderTime:a,minRenderTime:isFinite(c)?c:0,maxRenderTime:isFinite(y)?y:0,memoryUsage:P,iterations:e.iterations},threshold:e.expectedThreshold,error:s};return this.results.push(S),S}getMemoryUsage(){return"memory"in performance&&performance.memory.usedJSHeapSize||0}async testComponentRender(e,t,r=16){const n={name:`${e} Render Performance`,iterations:100,warmupIterations:10,timeout:5e3,expectedThreshold:{renderTime:r,memoryUsage:1048576}};return this.runTest(n,t)}async testBundleLoading(e,t=1e3){const r={name:`Bundle Loading: ${e}`,iterations:5,warmupIterations:1,timeout:1e4,expectedThreshold:{renderTime:t,memoryUsage:5242880}};return this.runTest(r,async()=>{const n=performance.now();try{const s=await fetch(e);if(!s.ok)throw new Error(`Failed to load bundle: ${s.status}`);await s.blob()}catch(s){console.warn(`Bundle loading test failed for ${e}:`,s)}return performance.now()-n})}async testMemoryLeaks(e,t=1e3){const r={name:"Memory Leak Detection",iterations:t,warmupIterations:100,timeout:3e4,expectedThreshold:{renderTime:1/0,memoryUsage:10485760}},n=this.getMemoryUsage(),i=await this.runTest(r,e),a=this.getMemoryUsage()-n,c=a>r.expectedThreshold.memoryUsage;return{...i,passed:i.passed&&!c,error:c?`Potential memory leak detected: ${Math.round(a/1024/1024)}MB increase`:i.error}}async testInteractionDelay(e,t=100){const r={name:"Interaction Delay",iterations:50,warmupIterations:5,timeout:5e3,expectedThreshold:{renderTime:t,memoryUsage:1048576}};return this.runTest(r,e)}async runRegressionTests(e,t){t&&this.regressionDetector.setBaseline(t);const r=this.regressionDetector.detectRegression(e);return{passed:r.length===0,regressions:r}}getResults(){return[...this.results]}getSummary(){const e=this.results.length,t=this.results.filter(i=>i.passed).length,r=e-t,n=e>0?t/e*100:0;return{totalTests:e,passedTests:t,failedTests:r,passRate:n}}clearResults(){this.results=[]}generateReport(){const e=this.getSummary();let t=`Performance Test Report
2
- `;return t+=`========================
3
-
4
- `,t+=`Total Tests: ${e.totalTests}
5
- `,t+=`Passed: ${e.passedTests}
6
- `,t+=`Failed: ${e.failedTests}
7
- `,t+=`Pass Rate: ${e.passRate.toFixed(1)}%
8
-
9
- `,this.results.length>0&&(t+=`Detailed Results:
10
- `,t+=`-----------------
11
-
12
- `,this.results.forEach((r,n)=>{t+=`${n+1}. ${r.testName}
13
- `,t+=` Status: ${r.passed?"PASS":"FAIL"}
14
- `,t+=` Average Render Time: ${r.metrics.averageRenderTime.toFixed(2)}ms
15
- `,t+=` Min/Max Render Time: ${r.metrics.minRenderTime.toFixed(2)}ms / ${r.metrics.maxRenderTime.toFixed(2)}ms
16
- `,t+=` Memory Usage: ${Math.round(r.metrics.memoryUsage/1024)} KB
17
- `,t+=` Iterations: ${r.metrics.iterations}
18
- `,r.error&&(t+=` Error: ${r.error}
19
- `),t+=`
20
- `})),t}}const T=new M,V={async testComponent(o,e={},t=16){return T.testComponentRender(o.displayName||o.name||"Component",()=>({type:o,props:e}),t)},async testHook(o,e,t=1){const r={name:`Hook Performance: ${e}`,iterations:1e3,warmupIterations:100,timeout:5e3,expectedThreshold:{renderTime:t,memoryUsage:1048576}};return T.runTest(r,o)},async testAsyncOperation(o,e,t=1e3){const r={name:`Async Operation: ${e}`,iterations:10,warmupIterations:2,timeout:3e4,expectedThreshold:{renderTime:t,memoryUsage:2097152}};return T.runTest(r,o)},async measureBundleImpact(o,e,t){const r=performance.memory?.usedJSHeapSize||0,n=performance.now();o();const i=performance.memory?.usedJSHeapSize||0,s=performance.now();e();const a=performance.memory?.usedJSHeapSize||0,c=performance.now();return{bundleIncrease:a-r,memoryIncrease:i-r,renderTimeImpact:c-s-(s-n)}}};class k{constructor(){u(this,"benchmark",new M);u(this,"suites",new Map)}registerSuite(e,t){this.suites.set(e,t)}async runSuite(e,t){const r=this.suites.get(e);if(!r)throw new Error(`Test suite '${e}' not found`);const n=[];for(const i of r){const s=t.get(i.name);if(!s){console.warn(`No implementation found for test '${i.name}'`);continue}const a=await this.benchmark.runTest(i,s);n.push(a)}return n}async runAllSuites(e){const t=new Map;for(const[r]of this.suites){const n=e.get(r);if(!n){console.warn(`No implementations found for suite '${r}'`);continue}const i=await this.runSuite(r,n);t.set(r,i)}return t}generateComprehensiveReport(){this.benchmark.getSummary();let e=this.benchmark.generateReport();if(this.suites.size>0){e+=`
21
- Test Suites:
22
- `,e+=`============
23
-
24
- `;for(const[t,r]of this.suites)e+=`Suite: ${t}
25
- `,e+=`Tests: ${r.length}
26
-
27
- `}return e}}const H=new k,A=[{name:"Main Bundle Size (ESM)",category:"bundle",limit:250*1024,unit:"bytes",severity:"error",description:"Main bundle should stay under 250KB for fast initial loading"},{name:"Main Bundle Size (CJS)",category:"bundle",limit:200*1024,unit:"bytes",severity:"error",description:"CJS bundle should be smaller due to better compression"},{name:"Core Module Size",category:"bundle",limit:15*1024,unit:"bytes",severity:"warning",description:"Core architecture should remain lightweight"},{name:"Enhanced Components Size",category:"bundle",limit:40*1024,unit:"bytes",severity:"warning",description:"Enhanced components bundle size"},{name:"Component Render Time",category:"runtime",limit:16,unit:"ms",severity:"error",description:"Component rendering should complete within one frame"},{name:"First Input Delay",category:"runtime",limit:100,unit:"ms",severity:"error",description:"First Input Delay should be under 100ms for good UX"},{name:"Largest Contentful Paint",category:"runtime",limit:2500,unit:"ms",severity:"warning",description:"LCP should be under 2.5s for good Core Web Vitals score"},{name:"Cumulative Layout Shift",category:"runtime",limit:.1,unit:"score",severity:"warning",description:"CLS should be under 0.1 for good visual stability"},{name:"Memory Usage",category:"memory",limit:50*1024*1024,unit:"bytes",severity:"warning",description:"Memory usage should stay under 50MB for good performance"},{name:"Memory Increase Per Operation",category:"memory",limit:1024*1024,unit:"bytes",severity:"error",description:"Each operation should not increase memory by more than 1MB"},{name:"Media Load Time",category:"network",limit:3e3,unit:"ms",severity:"warning",description:"Media should start loading within 3 seconds"}];class R{constructor(e=A,t={enabled:!0,channels:[{type:"console",config:{}}],threshold:1,cooldown:300*1e3}){u(this,"budgets",new Map);u(this,"violations",[]);u(this,"alertConfig");u(this,"lastAlertTime",0);e.forEach(r=>{this.budgets.set(r.name,r)}),this.alertConfig=t}checkMetric(e,t,r="runtime"){const n=[];for(const[i,s]of this.budgets)if(s.category===r&&(i.includes(e)||e.includes(i.split(" ")[0]?.toLowerCase()||""))&&t>s.limit){const a={budget:s,actualValue:t,overageAmount:t-s.limit,overagePercentage:(t-s.limit)/s.limit*100,timestamp:Date.now()};n.push(a),this.violations.push(a)}return n.length>0&&this.handleViolations(n),n}async checkBundleSizes(e){const t=[];return typeof window<"u"||typeof process>"u"?(console.warn("Bundle size checking is only available in Node.js environment"),t):(console.warn("Bundle size checking disabled - use Node.js cicdIntegration from @therealtinhtute/baroiplayer/core/performance/cicd for CI/CD environments"),t)}checkRuntimeMetrics(e){const t=[];return e.renderTime!==void 0&&t.push(...this.checkMetric("Component Render Time",e.renderTime,"runtime")),e.fid!==void 0&&t.push(...this.checkMetric("First Input Delay",e.fid,"runtime")),e.lcp!==void 0&&t.push(...this.checkMetric("Largest Contentful Paint",e.lcp,"runtime")),e.cls!==void 0&&t.push(...this.checkMetric("Cumulative Layout Shift",e.cls,"runtime")),e.memoryUsage!==void 0&&t.push(...this.checkMetric("Memory Usage",e.memoryUsage,"memory")),e.mediaLoadTime!==void 0&&t.push(...this.checkMetric("Media Load Time",e.mediaLoadTime,"network")),t}async handleViolations(e){if(!this.alertConfig.enabled)return;const t=Date.now();e.filter(n=>n.budget.severity==="error").length>=this.alertConfig.threshold&&t-this.lastAlertTime>=this.alertConfig.cooldown&&(await this.sendAlerts(e),this.lastAlertTime=t)}async sendAlerts(e){const t=this.formatAlertMessage(e);for(const r of this.alertConfig.channels)try{await this.sendAlert(r,t)}catch(n){console.error(`Failed to send alert via ${r.type}:`,n)}}formatAlertMessage(e){let t=`🚨 Performance Budget Violations Detected!
28
-
29
- `;return e.forEach(r=>{const{budget:n,actualValue:i,overageAmount:s,overagePercentage:a}=r;this.getUnitDisplay(n.unit),t+=`❌ ${n.name}
30
- `,t+=` Limit: ${this.formatValue(n.limit,n.unit)}
31
- `,t+=` Actual: ${this.formatValue(i,n.unit)}
32
- `,t+=` Overage: ${this.formatValue(s,n.unit)} (+${a.toFixed(1)}%)
33
- `,t+=` Severity: ${n.severity.toUpperCase()}
34
-
35
- `}),t+=`Time: ${new Date().toISOString()}
36
- `,t+=`Total Violations: ${e.length}`,t}async sendAlert(e,t){switch(e.type){case"console":console.error(t);break;case"webhook":if(e.config.url){const r=await fetch(e.config.url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:t,timestamp:Date.now()})});if(!r.ok)throw new Error(`Webhook failed: ${r.status}`)}break;case"slack":if(e.config.url){const r=await fetch(e.config.url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:t,channel:e.config.channel,username:"BaroiPlayer Performance Monitor"})});if(!r.ok)throw new Error(`Slack webhook failed: ${r.status}`)}break;default:console.warn(`Unsupported alert channel: ${e.type}`)}}formatValue(e,t){switch(t){case"bytes":return this.formatBytes(e);case"ms":return`${e.toFixed(2)}ms`;case"score":return e.toFixed(3);case"percent":return`${e.toFixed(1)}%`;default:return e.toString()}}formatBytes(e){return e>=1024*1024?`${(e/1024/1024).toFixed(2)}MB`:e>=1024?`${(e/1024).toFixed(2)}KB`:`${e}B`}getUnitDisplay(e){return{bytes:"bytes",ms:"milliseconds",score:"score",percent:"percent"}[e]||e}addBudget(e){this.budgets.set(e.name,e)}removeBudget(e){this.budgets.delete(e)}updateBudget(e,t){const r=this.budgets.get(e);r&&this.budgets.set(e,{...r,...t})}getBudgets(){return Array.from(this.budgets.values())}getViolations(e){return e?this.violations.filter(t=>t.timestamp>=e):[...this.violations]}clearViolations(){this.violations=[]}getViolationSummary(){const e={},t={};return this.violations.forEach(r=>{const n=r.budget.category,i=r.budget.severity;e[n]=(e[n]||0)+1,t[i]=(t[i]||0)+1}),{total:this.violations.length,byCategory:e,bySeverity:t}}}const q=new R,B={preloadStrategy:"metadata",adaptiveBitrate:!0,maxPreloadSize:2*1024*1024,networkThresholds:{"2g":{maxBitrate:128,preload:!1},"3g":{maxBitrate:500,preload:!1},"4g":{maxBitrate:2e3,preload:!0},"5g":{maxBitrate:1e4,preload:!0}},bufferSize:10,enableServiceWorker:!0};class I{constructor(){u(this,"connection");u(this,"listeners",new Set);u(this,"currentInfo");if(typeof window>"u"||typeof navigator>"u"){this.connection=null,this.currentInfo={effectiveType:"unknown",downlink:0,rtt:0,saveData:!1,isOnline:!0};return}this.connection=navigator.connection||navigator.mozConnection||navigator.webkitConnection,this.currentInfo=this.getNetworkInfo(),this.initializeListeners()}getNetworkInfo(){if(typeof navigator>"u")return{effectiveType:"unknown",downlink:0,rtt:0,saveData:!1,isOnline:!0};const e=navigator.onLine;return this.connection?{effectiveType:this.connection.effectiveType||"unknown",downlink:this.connection.downlink||0,rtt:this.connection.rtt||0,saveData:this.connection.saveData||!1,isOnline:e}:{effectiveType:"unknown",downlink:0,rtt:0,saveData:!1,isOnline:e}}initializeListeners(){typeof window>"u"||(this.connection&&this.connection.addEventListener("change",this.handleNetworkChange.bind(this)),window.addEventListener("online",this.handleNetworkChange.bind(this)),window.addEventListener("offline",this.handleNetworkChange.bind(this)))}handleNetworkChange(){const e=this.getNetworkInfo();this.currentInfo=e,this.listeners.forEach(t=>t(e))}getCurrentNetworkInfo(){return{...this.currentInfo}}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}async estimateBandwidth(){if(this.connection&&this.connection.downlink)return this.connection.downlink*1e3;try{const e=performance.now(),n=await(await fetch("/api/bandwidth-test?size=100kb")).blob(),s=(performance.now()-e)/1e3;return n.size*8/s/1e3}catch(e){return console.warn("Bandwidth estimation failed:",e),1e3}}}class L{constructor(e={}){u(this,"config");u(this,"networkMonitor");u(this,"loadingMetrics",new Map);u(this,"preloadCache",new Map);this.config={...B,...e},this.networkMonitor=new I,this.initializeNetworkMonitoring()}initializeNetworkMonitoring(){this.networkMonitor.subscribe(e=>{this.handleNetworkChange(e)})}handleNetworkChange(e){console.log("Network changed:",e),this.config.adaptiveBitrate&&this.adjustQualityForNetwork(e),(e.effectiveType==="2g"||e.saveData)&&this.clearPreloadCache()}async optimizeMediaLoading(e,t,r={}){const n=performance.now(),i=this.networkMonitor.getCurrentNetworkInfo(),s={loadStartTime:n,bytesLoaded:0,loadSpeed:0,networkType:i.effectiveType,quality:r.quality||"auto",bufferHealth:0,stallsCount:0,stallsDuration:0};this.loadingMetrics.set(e,s);try{const a=this.chooseLoadingStrategy(i,r);return a.shouldPreload&&await this.preloadMedia(e,a.preloadAmount),t.preload=a.preloadAttribute,this.monitorLoadingProgress(t,s),this.config.adaptiveBitrate&&a.suggestedQuality&&this.applyQualitySettings(t,a.suggestedQuality),s}catch(a){return console.error("Media loading optimization failed:",a),s}}chooseLoadingStrategy(e,t){const r=e.effectiveType==="unknown"?"4g":e.effectiveType,n=this.config.networkThresholds[r]||this.config.networkThresholds["4g"];return{shouldPreload:t.preload!==!1&&n.preload&&!e.saveData,preloadAmount:e.saveData?0:this.config.maxPreloadSize,preloadAttribute:this.getPreloadAttribute(e),suggestedQuality:this.getSuggestedQuality(e,n.maxBitrate),bufferTarget:this.getBufferTarget(e)}}getPreloadAttribute(e){return e.saveData||e.effectiveType==="2g"?"none":e.effectiveType==="3g"?"metadata":this.config.preloadStrategy}getSuggestedQuality(e,t){const r=e.downlink*1e3;return r>=t*2?"high":r>=t?"medium":"low"}getBufferTarget(e){switch(e.effectiveType){case"2g":return 2;case"3g":return 5;case"4g":return this.config.bufferSize;case"5g":return this.config.bufferSize*1.5;default:return this.config.bufferSize}}async preloadMedia(e,t){if(this.preloadCache.has(e))return;const r=this.fetchWithProgress(e,t);this.preloadCache.set(e,r);try{await r}catch(n){console.warn(`Preload failed for ${e}:`,n),this.preloadCache.delete(e)}}async fetchWithProgress(e,t){const r=await fetch(e,{headers:{Range:`bytes=0-${t-1}`}});if(!r.ok)throw new Error(`Failed to preload: ${r.status}`);const n=r.body?.getReader();if(!n)throw new Error("Response body not readable");const i=[];let s=0;try{for(;s<t;){const{done:a,value:c}=await n.read();if(a)break;i.push(c),s+=c.length}}finally{n.releaseLock()}return new Blob(i)}monitorLoadingProgress(e,t){let r=null;const n=()=>{if(e.buffered.length>0){const v=e.buffered.end(e.buffered.length-1),S=e.currentTime;t.bufferHealth=Math.min((v-S)/this.config.bufferSize,1)}},i=()=>{t.firstByteTime=performance.now()},s=()=>{t.loadCompleteTime=performance.now(),t.totalLoadTime=t.loadCompleteTime-t.loadStartTime,t.totalLoadTime&&t.bytesLoaded>0&&(t.loadSpeed=t.bytesLoaded/(t.totalLoadTime/1e3))},a=()=>{r===null&&(r=performance.now(),t.stallsCount++)},c=()=>{r!==null&&(t.stallsDuration+=performance.now()-r,r=null),n()},y=()=>{if(e.buffered.length>0){const v=e.buffered.end(0)*1e3;t.bytesLoaded=v}n()};e.addEventListener("loadstart",i),e.addEventListener("canplay",s),e.addEventListener("waiting",a),e.addEventListener("playing",c),e.addEventListener("progress",y),setTimeout(()=>{e.removeEventListener("loadstart",i),e.removeEventListener("canplay",s),e.removeEventListener("waiting",a),e.removeEventListener("playing",c),e.removeEventListener("progress",y)},300*1e3)}applyQualitySettings(e,t){console.log(`Applying quality setting: ${t} to`,e)}adjustQualityForNetwork(e){console.log("Adjusting quality for network conditions:",e.effectiveType)}clearPreloadCache(){this.preloadCache.clear()}getLoadingMetrics(e){return this.loadingMetrics.get(e)}getAllMetrics(){return Array.from(this.loadingMetrics.values())}getAverageLoadingTime(){const t=this.getAllMetrics().filter(n=>n.totalLoadTime!==void 0);return t.length===0?0:t.reduce((n,i)=>n+(i.totalLoadTime||0),0)/t.length}getNetworkPerformanceStats(){const e=new Map;return this.getAllMetrics().forEach(t=>{const r=t.networkType;e.has(r)||e.set(r,[]),e.get(r).push(t)}),Array.from(e.entries()).map(([t,r])=>({networkType:t,avgLoadTime:r.reduce((n,i)=>n+(i.totalLoadTime||0),0)/r.length,avgStalls:r.reduce((n,i)=>n+i.stallsCount,0)/r.length,avgBufferHealth:r.reduce((n,i)=>n+i.bufferHealth,0)/r.length}))}}const F=new L;function j(o){const[e]=d.useState(()=>o?new L(o):F),[t,r]=d.useState(null),[n,i]=d.useState([]);d.useEffect(()=>{const a=e.networkMonitor.subscribe(r);r(e.networkMonitor.getCurrentNetworkInfo());const c=setInterval(()=>{i(e.getAllMetrics())},1e3);return()=>{a(),clearInterval(c)}},[e]);const s=d.useCallback((a,c,y)=>e.optimizeMediaLoading(a,c,y),[e]);return{networkInfo:t,loadingMetrics:n,optimizeLoading:s,averageLoadTime:e.getAverageLoadingTime(),networkStats:e.getNetworkPerformanceStats()}}class Y{get(e){try{const t=localStorage.getItem(`baroi-player-${e}`);return t?JSON.parse(t):null}catch{return null}}set(e,t){try{localStorage.setItem(`baroi-player-${e}`,JSON.stringify(t))}catch(r){console.warn("Failed to store data:",r)}}remove(e){try{localStorage.removeItem(`baroi-player-${e}`)}catch(t){console.warn("Failed to remove data:",t)}}clear(){try{Object.keys(localStorage).forEach(e=>{e.startsWith("baroi-player-")&&localStorage.removeItem(e)})}catch(e){console.warn("Failed to clear data:",e)}}}class Q{track(e,t){console.log("Analytics:",e,t)}identify(e,t){console.log("Analytics identify:",e,t)}page(e,t){console.log("Analytics page:",e,t)}}const N=d.createContext(null);function x({children:o,services:e={}}){const t=d.useMemo(()=>{const r=e.logger||new m.ConsolePluginLogger("[BaroiPlayer]"),n=e.eventBus||new g.EventBus,i=e.pluginRegistry||new m.PluginRegistry(r),s=e.storage||new Y,a=e.analytics||new Q;return{eventBus:n,pluginRegistry:i,storage:s,analytics:a,logger:r}},[e]);return w.jsxRuntimeExports.jsx(N.Provider,{value:t,children:o})}function p(){const o=d.useContext(N);if(!o)throw new Error("useServices must be used within ServiceProvider");return o}function K(){return p().eventBus}function W(){return p().pluginRegistry}function J(){return p().storage}function G(){return p().analytics}function X(){return p().logger}function Z(o){return function(t){const r=p();return w.jsxRuntimeExports.jsx(o,{...t,services:r})}}function ee(o={}){return function({children:t}){return w.jsxRuntimeExports.jsx(x,{services:o.services,children:t})}}const l={SUBTITLES:"subtitles",PLAYLISTS:"playlists",ADVANCED_CONTROLS:"advanced_controls",ANALYTICS:"analytics",PICTURE_IN_PICTURE:"picture_in_picture",QUALITY_SELECTOR:"quality_selector",PLAYBACK_SPEED:"playback_speed",CHAPTERS:"chapters",THUMBNAILS:"thumbnails",KEYBOARD_SHORTCUTS:"keyboard_shortcuts"},D={enabledFeatures:[l.SUBTITLES,l.ADVANCED_CONTROLS,l.KEYBOARD_SHORTCUTS],loadingStrategy:"lazy",fallbackTimeout:5e3,retryAttempts:3},te={SubtitleSelector:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.SubtitleSelector}))),PlaylistManager:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.SubtitleSelector}))),QualitySelector:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.QualitySelector}))),PlaybackSpeedSelector:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.PlaybackSpeedSelector}))),ChaptersPanel:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.ChaptersPanel}))),PictureInPictureButton:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.PictureInPictureButton}))),AnalyticsTracker:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.SubtitleSelector})))};class C{static async isSupported(e){if(this.cache.has(e))return this.cache.get(e);const t=await this.checkFeatureSupport(e);return this.cache.set(e,t),t}static async checkFeatureSupport(e){if(typeof window>"u"||typeof document>"u")return!0;switch(e){case l.SUBTITLES:return"TextTrack"in window;case l.PICTURE_IN_PICTURE:return"pictureInPictureEnabled"in document;case l.ADVANCED_CONTROLS:return!0;case l.PLAYLISTS:return"MediaSession"in window;case l.ANALYTICS:return"IntersectionObserver"in window;case l.QUALITY_SELECTOR:return"MediaSource"in window;case l.PLAYBACK_SPEED:return!0;case l.CHAPTERS:return"TextTrack"in window;case l.THUMBNAILS:return"OffscreenCanvas"in window||"canvas"in document.createElement("canvas");case l.KEYBOARD_SHORTCUTS:return"KeyboardEvent"in window;default:return!1}}}u(C,"cache",new Map);class ${constructor(e={}){u(this,"config");u(this,"loadedFeatures",new Set);u(this,"loadingPromises",new Map);this.config={...D,...e}}async loadFeature(e){if(!this.config.enabledFeatures.includes(e))return null;if(this.loadedFeatures.has(e))return this.getLoadedFeature(e);if(this.loadingPromises.has(e))return this.loadingPromises.get(e);if(!await C.isSupported(e))return console.warn(`Feature ${e} is not supported in this browser`),null;const r=this.loadWithRetry(e);this.loadingPromises.set(e,r);try{const n=await r;return this.loadedFeatures.add(e),n}catch(n){return console.error(`Failed to load feature ${e}:`,n),this.loadingPromises.delete(e),null}}async loadWithRetry(e,t=1){try{return await this.loadFeatureModule(e)}catch(r){if(t<this.config.retryAttempts)return console.warn(`Loading feature ${e} failed, retrying (${t}/${this.config.retryAttempts})`),await new Promise(n=>setTimeout(n,1e3*t)),this.loadWithRetry(e,t+1);throw r}}async loadFeatureModule(e){switch(e){case l.SUBTITLES:return Promise.resolve().then(()=>require("./hooks-BXwI8QG6.cjs")).then(t=>t.useEnhancedSubtitles$2);case l.PLAYLISTS:return Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(t=>t.advancedFeatures);case l.ADVANCED_CONTROLS:return Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(t=>t.advancedFeatures);case l.ANALYTICS:return Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(t=>t.advancedFeatures);case l.PICTURE_IN_PICTURE:return Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(t=>t.advancedFeatures);case l.QUALITY_SELECTOR:return Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(t=>t.advancedFeatures);case l.PLAYBACK_SPEED:return Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(t=>t.advancedFeatures);case l.CHAPTERS:return Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(t=>t.advancedFeatures);case l.THUMBNAILS:return Promise.resolve().then(()=>require("./enhanced-components-BspFs9OO.cjs")).then(t=>t.advancedFeatures);case l.KEYBOARD_SHORTCUTS:return Promise.resolve().then(()=>require("./hooks-BXwI8QG6.cjs")).then(t=>t.useKeyboardControls$1);default:throw new Error(`Unknown feature: ${e}`)}}getLoadedFeature(e){return this.loadingPromises.get(e)}async preloadFeatures(e=this.config.enabledFeatures){const t=e.map(r=>this.loadFeature(r));await Promise.allSettled(t)}getLoadingState(){return{loaded:Array.from(this.loadedFeatures),loading:Array.from(this.loadingPromises.keys()),enabled:this.config.enabledFeatures}}}const E=new $;function U(o){const[e,t]=d.useState(null),[r,n]=d.useState(!1),[i,s]=d.useState(null),a=d.useCallback(async()=>{if(!(r||e)){n(!0),s(null);try{const c=await E.loadFeature(o);t(c)}catch(c){s(c)}finally{n(!1)}}},[o,r,e]);return d.useEffect(()=>{E.config.loadingStrategy==="immediate"&&a()},[a]),{feature:e,loading:r,error:i,load:a}}function re(o,e,t){return function(n){const{feature:i,loading:s,error:a}=U(e);if(s)return w.jsxRuntimeExports.jsx("div",{className:"h-8 animate-pulse rounded bg-gray-200"});if(a||!i){const c=t;return c?w.jsxRuntimeExports.jsx(c,{...n}):null}return w.jsxRuntimeExports.jsx(o,{...n})}}const ne="1.0.0";exports.AnalyticsPlugin=m.AnalyticsPlugin;exports.BasePlugin=m.BasePlugin;exports.ConsolePluginLogger=m.ConsolePluginLogger;exports.PLUGIN_SYSTEM_VERSION=m.PLUGIN_SYSTEM_VERSION;exports.PluginConflictError=m.PluginConflictError;exports.PluginDependencyError=m.PluginDependencyError;exports.PluginDevelopmentHelpers=m.PluginDevelopmentHelpers;exports.PluginError=m.PluginError;exports.PluginPerformanceMonitor=m.PluginPerformanceMonitor;exports.PluginRegistry=m.PluginRegistry;exports.PluginStorage=m.PluginStorage;exports.PluginValidator=m.PluginValidator;exports.createAnalyticsPlugin=m.createAnalyticsPlugin;exports.createPlugin=m.createPlugin;exports.defaultPerformanceMonitor=m.defaultPerformanceMonitor;exports.defaultPluginLogger=m.defaultPluginLogger;exports.EVENT_SYSTEM_VERSION=g.EVENT_SYSTEM_VERSION;exports.EventBus=g.EventBus;exports.EventDelegator=g.EventDelegator;exports.MiddlewareBuilder=g.MiddlewareBuilder;exports.commonMiddlewares=g.commonMiddlewares;exports.createMiddleware=g.createMiddleware;exports.defaultEventBus=g.defaultEventBus;exports.eventMiddlewares=g.eventMiddlewares;exports.useConditionalEventListener=g.useConditionalEventListener;exports.useEventBus=g.useEventBus;exports.useEventDebugger=g.useEventDebugger;exports.useEventEffect=g.useEventEffect;exports.useEventEmitter=g.useEventEmitter;exports.useEventHandlers=g.useEventHandlers;exports.useEventHistory=g.useEventHistory;exports.useEventListener=g.useEventListener;exports.useEventMetrics=g.useEventMetrics;exports.useEventOnce=g.useEventOnce;exports.useEventState=g.useEventState;exports.PerformanceDashboard=f.PerformanceDashboard;exports.PerformanceMonitor=f.PerformanceMonitor;exports.PerformanceRegressionDetector=f.PerformanceRegressionDetector;exports.defaultThresholds=f.defaultThresholds;exports.performanceMonitor=f.performanceMonitor;exports.usePerformanceMonitor=f.usePerformanceMonitor;exports.withPerformanceMonitoring=f.withPerformanceMonitoring;exports.CORE_ARCHITECTURE_VERSION=ne;exports.FEATURES=l;exports.FeatureDetector=C;exports.MediaLoadingOptimizer=L;exports.NetworkMonitor=I;exports.PerformanceBenchmark=M;exports.PerformanceBudgetMonitor=R;exports.PerformanceTestFramework=k;exports.ProgressiveLoader=$;exports.ServiceProvider=x;exports.createArchitecture=ee;exports.defaultMediaLoadingConfig=B;exports.defaultPerformanceBudgets=A;exports.defaultProgressiveConfig=D;exports.lazyComponents=te;exports.mediaLoadingOptimizer=F;exports.performanceBenchmark=T;exports.performanceBudgetMonitor=q;exports.performanceTestFramework=H;exports.performanceTestUtils=V;exports.progressiveLoader=E;exports.useAnalytics=G;exports.useLogger=X;exports.useMediaLoadingOptimizer=j;exports.usePluginRegistry=W;exports.useProgressiveFeature=U;exports.useServiceEventBus=K;exports.useServices=p;exports.useStorage=J;exports.withProgressiveFeature=re;exports.withServices=Z;
37
- //# sourceMappingURL=core.js.map
package/dist/core.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.js","sources":["../src/core/performance/performance-testing.ts","../src/core/performance/performance-budgets.ts","../src/core/performance/media-loading-optimizer.ts","../src/core/providers/service-provider.tsx","../src/core/utils.tsx","../src/core/progressive-loading.tsx","../src/core/index.ts"],"sourcesContent":["import { PerformanceRegressionDetector, performanceMonitor } from \"./performance-monitor\"\nimport type { PerformanceMetrics } from \"./performance-monitor\"\n\n// Performance test configuration\nexport interface PerformanceTestConfig {\n\tname: string\n\titerations: number\n\twarmupIterations: number\n\ttimeout: number\n\texpectedThreshold: {\n\t\trenderTime: number\n\t\tmemoryUsage: number\n\t}\n}\n\n// Performance test result\nexport interface PerformanceTestResult {\n\ttestName: string\n\tpassed: boolean\n\tmetrics: {\n\t\taverageRenderTime: number\n\t\tminRenderTime: number\n\t\tmaxRenderTime: number\n\t\tmemoryUsage: number\n\t\titerations: number\n\t}\n\tthreshold: PerformanceTestConfig[\"expectedThreshold\"]\n\terror?: string\n}\n\n// Performance benchmark suite\nexport class PerformanceBenchmark {\n\tprivate results: PerformanceTestResult[] = []\n\tprivate regressionDetector = new PerformanceRegressionDetector()\n\n\tasync runTest(\n\t\tconfig: PerformanceTestConfig,\n\t\ttestFunction: () => any | Promise<any>\n\t): Promise<PerformanceTestResult> {\n\t\tconst renderTimes: number[] = []\n\t\tlet memoryBefore = 0\n\t\tlet memoryAfter = 0\n\t\tlet error: string | undefined\n\n\t\ttry {\n\t\t\t// Warmup iterations\n\t\t\tfor (let i = 0; i < config.warmupIterations; i++) {\n\t\t\t\tawait testFunction()\n\t\t\t}\n\n\t\t\t// Force garbage collection if available\n\t\t\tif (global.gc) {\n\t\t\t\tglobal.gc()\n\t\t\t}\n\n\t\t\tmemoryBefore = this.getMemoryUsage()\n\n\t\t\t// Main test iterations\n\t\t\tfor (let i = 0; i < config.iterations; i++) {\n\t\t\t\tconst startTime = performance.now()\n\t\t\t\tawait testFunction()\n\t\t\t\tconst endTime = performance.now()\n\t\t\t\trenderTimes.push(endTime - startTime)\n\t\t\t}\n\n\t\t\tmemoryAfter = this.getMemoryUsage()\n\t\t} catch (err) {\n\t\t\terror = err instanceof Error ? err.message : String(err)\n\t\t}\n\n\t\tconst averageRenderTime = renderTimes.reduce((sum, time) => sum + time, 0) / renderTimes.length\n\t\tconst minRenderTime = Math.min(...renderTimes)\n\t\tconst maxRenderTime = Math.max(...renderTimes)\n\t\tconst memoryUsage = memoryAfter - memoryBefore\n\n\t\tconst passed =\n\t\t\t!error &&\n\t\t\taverageRenderTime <= config.expectedThreshold.renderTime &&\n\t\t\tmemoryUsage <= config.expectedThreshold.memoryUsage\n\n\t\tconst result: PerformanceTestResult = {\n\t\t\ttestName: config.name,\n\t\t\tpassed,\n\t\t\tmetrics: {\n\t\t\t\taverageRenderTime,\n\t\t\t\tminRenderTime: isFinite(minRenderTime) ? minRenderTime : 0,\n\t\t\t\tmaxRenderTime: isFinite(maxRenderTime) ? maxRenderTime : 0,\n\t\t\t\tmemoryUsage,\n\t\t\t\titerations: config.iterations\n\t\t\t},\n\t\t\tthreshold: config.expectedThreshold,\n\t\t\terror\n\t\t}\n\n\t\tthis.results.push(result)\n\t\treturn result\n\t}\n\n\tprivate getMemoryUsage(): number {\n\t\tif (\"memory\" in performance) {\n\t\t\treturn (performance as any).memory.usedJSHeapSize || 0\n\t\t}\n\t\treturn 0\n\t}\n\n\t// Component rendering performance test\n\tasync testComponentRender(\n\t\tcomponentName: string,\n\t\trenderFunction: () => any,\n\t\texpectedRenderTime = 16 // 60fps target\n\t): Promise<PerformanceTestResult> {\n\t\tconst config: PerformanceTestConfig = {\n\t\t\tname: `${componentName} Render Performance`,\n\t\t\titerations: 100,\n\t\t\twarmupIterations: 10,\n\t\t\ttimeout: 5000,\n\t\t\texpectedThreshold: {\n\t\t\t\trenderTime: expectedRenderTime,\n\t\t\t\tmemoryUsage: 1024 * 1024 // 1MB\n\t\t\t}\n\t\t}\n\n\t\treturn this.runTest(config, renderFunction)\n\t}\n\n\t// Bundle loading performance test\n\tasync testBundleLoading(\n\t\tbundlePath: string,\n\t\texpectedLoadTime = 1000 // 1 second\n\t): Promise<PerformanceTestResult> {\n\t\tconst config: PerformanceTestConfig = {\n\t\t\tname: `Bundle Loading: ${bundlePath}`,\n\t\t\titerations: 5,\n\t\t\twarmupIterations: 1,\n\t\t\ttimeout: 10000,\n\t\t\texpectedThreshold: {\n\t\t\t\trenderTime: expectedLoadTime,\n\t\t\t\tmemoryUsage: 5 * 1024 * 1024 // 5MB\n\t\t\t}\n\t\t}\n\n\t\treturn this.runTest(config, async () => {\n\t\t\t// Simulate bundle loading\n\t\t\tconst startTime = performance.now()\n\t\t\ttry {\n\t\t\t\t// Use fetch instead of dynamic import to avoid bundler issues\n\t\t\t\tconst response = await fetch(bundlePath)\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`Failed to load bundle: ${response.status}`)\n\t\t\t\t}\n\t\t\t\tawait response.blob() // Consume the response\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(`Bundle loading test failed for ${bundlePath}:`, error)\n\t\t\t\t// Return a mock time for testing purposes\n\t\t\t}\n\t\t\tconst endTime = performance.now()\n\t\t\treturn endTime - startTime\n\t\t})\n\t}\n\n\t// Memory leak detection test\n\tasync testMemoryLeaks(\n\t\ttestFunction: () => any,\n\t\titerations = 1000\n\t): Promise<PerformanceTestResult> {\n\t\tconst config: PerformanceTestConfig = {\n\t\t\tname: \"Memory Leak Detection\",\n\t\t\titerations,\n\t\t\twarmupIterations: 100,\n\t\t\ttimeout: 30000,\n\t\t\texpectedThreshold: {\n\t\t\t\trenderTime: Infinity, // Not testing render time\n\t\t\t\tmemoryUsage: 10 * 1024 * 1024 // 10MB max increase\n\t\t\t}\n\t\t}\n\n\t\tconst memoryBefore = this.getMemoryUsage()\n\n\t\tconst result = await this.runTest(config, testFunction)\n\n\t\tconst memoryAfter = this.getMemoryUsage()\n\t\tconst memoryIncrease = memoryAfter - memoryBefore\n\n\t\t// Check for memory leaks (memory should not increase significantly)\n\t\tconst hasMemoryLeak = memoryIncrease > config.expectedThreshold.memoryUsage\n\n\t\treturn {\n\t\t\t...result,\n\t\t\tpassed: result.passed && !hasMemoryLeak,\n\t\t\terror: hasMemoryLeak\n\t\t\t\t? `Potential memory leak detected: ${Math.round(memoryIncrease / 1024 / 1024)}MB increase`\n\t\t\t\t: result.error\n\t\t}\n\t}\n\n\t// Interaction delay test\n\tasync testInteractionDelay(\n\t\tinteractionFunction: () => any,\n\t\texpectedDelay = 100 // 100ms\n\t): Promise<PerformanceTestResult> {\n\t\tconst config: PerformanceTestConfig = {\n\t\t\tname: \"Interaction Delay\",\n\t\t\titerations: 50,\n\t\t\twarmupIterations: 5,\n\t\t\ttimeout: 5000,\n\t\t\texpectedThreshold: {\n\t\t\t\trenderTime: expectedDelay,\n\t\t\t\tmemoryUsage: 1024 * 1024 // 1MB\n\t\t\t}\n\t\t}\n\n\t\treturn this.runTest(config, interactionFunction)\n\t}\n\n\t// Regression testing\n\tasync runRegressionTests(\n\t\tcurrentMetrics: PerformanceMetrics,\n\t\tbaselineMetrics?: PerformanceMetrics\n\t): Promise<{\n\t\tpassed: boolean\n\t\tregressions: ReturnType<PerformanceRegressionDetector[\"detectRegression\"]>\n\t}> {\n\t\tif (baselineMetrics) {\n\t\t\tthis.regressionDetector.setBaseline(baselineMetrics)\n\t\t}\n\n\t\tconst regressions = this.regressionDetector.detectRegression(currentMetrics)\n\t\tconst passed = regressions.length === 0\n\n\t\treturn { passed, regressions }\n\t}\n\n\t// Get all test results\n\tgetResults(): PerformanceTestResult[] {\n\t\treturn [...this.results]\n\t}\n\n\t// Get test summary\n\tgetSummary(): {\n\t\ttotalTests: number\n\t\tpassedTests: number\n\t\tfailedTests: number\n\t\tpassRate: number\n\t} {\n\t\tconst totalTests = this.results.length\n\t\tconst passedTests = this.results.filter((result) => result.passed).length\n\t\tconst failedTests = totalTests - passedTests\n\t\tconst passRate = totalTests > 0 ? (passedTests / totalTests) * 100 : 0\n\n\t\treturn { totalTests, passedTests, failedTests, passRate }\n\t}\n\n\t// Clear test results\n\tclearResults(): void {\n\t\tthis.results = []\n\t}\n\n\t// Generate performance report\n\tgenerateReport(): string {\n\t\tconst summary = this.getSummary()\n\t\tlet report = `Performance Test Report\\n`\n\t\treport += `========================\\n\\n`\n\t\treport += `Total Tests: ${summary.totalTests}\\n`\n\t\treport += `Passed: ${summary.passedTests}\\n`\n\t\treport += `Failed: ${summary.failedTests}\\n`\n\t\treport += `Pass Rate: ${summary.passRate.toFixed(1)}%\\n\\n`\n\n\t\tif (this.results.length > 0) {\n\t\t\treport += `Detailed Results:\\n`\n\t\t\treport += `-----------------\\n\\n`\n\n\t\t\tthis.results.forEach((result, index) => {\n\t\t\t\treport += `${index + 1}. ${result.testName}\\n`\n\t\t\t\treport += ` Status: ${result.passed ? \"PASS\" : \"FAIL\"}\\n`\n\t\t\t\treport += ` Average Render Time: ${result.metrics.averageRenderTime.toFixed(2)}ms\\n`\n\t\t\t\treport += ` Min/Max Render Time: ${result.metrics.minRenderTime.toFixed(2)}ms / ${result.metrics.maxRenderTime.toFixed(2)}ms\\n`\n\t\t\t\treport += ` Memory Usage: ${Math.round(result.metrics.memoryUsage / 1024)} KB\\n`\n\t\t\t\treport += ` Iterations: ${result.metrics.iterations}\\n`\n\n\t\t\t\tif (result.error) {\n\t\t\t\t\treport += ` Error: ${result.error}\\n`\n\t\t\t\t}\n\n\t\t\t\treport += `\\n`\n\t\t\t})\n\t\t}\n\n\t\treturn report\n\t}\n}\n\n// Global performance benchmark instance\nexport const performanceBenchmark = new PerformanceBenchmark()\n\n// Utility functions for common performance tests\nexport const performanceTestUtils = {\n\t// Test component rendering performance\n\tasync testComponent(\n\t\tComponent: any,\n\t\tprops: any = {},\n\t\texpectedRenderTime = 16\n\t): Promise<PerformanceTestResult> {\n\t\treturn performanceBenchmark.testComponentRender(\n\t\t\tComponent.displayName || Component.name || \"Component\",\n\t\t\t() => {\n\t\t\t\t// This would need React Testing Library in a real test environment\n\t\t\t\t// For now, we'll simulate component rendering\n\t\t\t\treturn { type: Component, props } // Mock element\n\t\t\t},\n\t\t\texpectedRenderTime\n\t\t)\n\t},\n\n\t// Test hook performance\n\tasync testHook(\n\t\thookFunction: () => any,\n\t\thookName: string,\n\t\texpectedExecutionTime = 1\n\t): Promise<PerformanceTestResult> {\n\t\tconst config: PerformanceTestConfig = {\n\t\t\tname: `Hook Performance: ${hookName}`,\n\t\t\titerations: 1000,\n\t\t\twarmupIterations: 100,\n\t\t\ttimeout: 5000,\n\t\t\texpectedThreshold: {\n\t\t\t\trenderTime: expectedExecutionTime,\n\t\t\t\tmemoryUsage: 1024 * 1024 // 1MB\n\t\t\t}\n\t\t}\n\n\t\treturn performanceBenchmark.runTest(config, hookFunction)\n\t},\n\n\t// Test async operation performance\n\tasync testAsyncOperation(\n\t\toperation: () => Promise<any>,\n\t\toperationName: string,\n\t\texpectedTime = 1000\n\t): Promise<PerformanceTestResult> {\n\t\tconst config: PerformanceTestConfig = {\n\t\t\tname: `Async Operation: ${operationName}`,\n\t\t\titerations: 10,\n\t\t\twarmupIterations: 2,\n\t\t\ttimeout: 30000,\n\t\t\texpectedThreshold: {\n\t\t\t\trenderTime: expectedTime,\n\t\t\t\tmemoryUsage: 2 * 1024 * 1024 // 2MB\n\t\t\t}\n\t\t}\n\n\t\treturn performanceBenchmark.runTest(config, operation)\n\t},\n\n\t// Test bundle size impact\n\tasync measureBundleImpact(\n\t\tbeforeFunction: () => void,\n\t\tafterFunction: () => void,\n\t\tfeatureName: string\n\t): Promise<{\n\t\tbundleIncrease: number\n\t\tmemoryIncrease: number\n\t\trenderTimeImpact: number\n\t}> {\n\t\tconst beforeMemory = (performance as any).memory?.usedJSHeapSize || 0\n\t\tconst beforeTime = performance.now()\n\n\t\tbeforeFunction()\n\n\t\tconst midMemory = (performance as any).memory?.usedJSHeapSize || 0\n\t\tconst midTime = performance.now()\n\n\t\tafterFunction()\n\n\t\tconst afterMemory = (performance as any).memory?.usedJSHeapSize || 0\n\t\tconst afterTime = performance.now()\n\n\t\treturn {\n\t\t\tbundleIncrease: afterMemory - beforeMemory,\n\t\t\tmemoryIncrease: midMemory - beforeMemory,\n\t\t\trenderTimeImpact: afterTime - midTime - (midTime - beforeTime)\n\t\t}\n\t}\n}\n\n// Performance testing framework\nexport class PerformanceTestFramework {\n\tprivate benchmark = new PerformanceBenchmark()\n\tprivate suites: Map<string, PerformanceTestConfig[]> = new Map()\n\n\t// Register a test suite\n\tregisterSuite(suiteName: string, tests: PerformanceTestConfig[]) {\n\t\tthis.suites.set(suiteName, tests)\n\t}\n\n\t// Run all tests in a suite\n\tasync runSuite(\n\t\tsuiteName: string,\n\t\ttestImplementations: Map<string, () => any>\n\t): Promise<PerformanceTestResult[]> {\n\t\tconst tests = this.suites.get(suiteName)\n\t\tif (!tests) {\n\t\t\tthrow new Error(`Test suite '${suiteName}' not found`)\n\t\t}\n\n\t\tconst results: PerformanceTestResult[] = []\n\n\t\tfor (const test of tests) {\n\t\t\tconst implementation = testImplementations.get(test.name)\n\t\t\tif (!implementation) {\n\t\t\t\tconsole.warn(`No implementation found for test '${test.name}'`)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst result = await this.benchmark.runTest(test, implementation)\n\t\t\tresults.push(result)\n\t\t}\n\n\t\treturn results\n\t}\n\n\t// Run all registered test suites\n\tasync runAllSuites(\n\t\timplementations: Map<string, Map<string, () => any>>\n\t): Promise<Map<string, PerformanceTestResult[]>> {\n\t\tconst allResults = new Map<string, PerformanceTestResult[]>()\n\n\t\tfor (const [suiteName] of this.suites) {\n\t\t\tconst suiteImplementations = implementations.get(suiteName)\n\t\t\tif (!suiteImplementations) {\n\t\t\t\tconsole.warn(`No implementations found for suite '${suiteName}'`)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst results = await this.runSuite(suiteName, suiteImplementations)\n\t\t\tallResults.set(suiteName, results)\n\t\t}\n\n\t\treturn allResults\n\t}\n\n\t// Generate comprehensive report\n\tgenerateComprehensiveReport(): string {\n\t\tconst summary = this.benchmark.getSummary()\n\t\tlet report = this.benchmark.generateReport()\n\n\t\t// Add suite breakdown if available\n\t\tif (this.suites.size > 0) {\n\t\t\treport += `\\nTest Suites:\\n`\n\t\t\treport += `============\\n\\n`\n\n\t\t\tfor (const [suiteName, tests] of this.suites) {\n\t\t\t\treport += `Suite: ${suiteName}\\n`\n\t\t\t\treport += `Tests: ${tests.length}\\n\\n`\n\t\t\t}\n\t\t}\n\n\t\treturn report\n\t}\n}\n\nexport const performanceTestFramework = new PerformanceTestFramework()\n","// Performance budget configuration\nexport interface PerformanceBudget {\n\tname: string\n\tcategory: \"bundle\" | \"runtime\" | \"network\" | \"memory\"\n\tlimit: number\n\tunit: \"bytes\" | \"ms\" | \"score\" | \"percent\"\n\tseverity: \"error\" | \"warning\" | \"info\"\n\tdescription: string\n}\n\n// Performance budget violation\nexport interface BudgetViolation {\n\tbudget: PerformanceBudget\n\tactualValue: number\n\toverageAmount: number\n\toveragePercentage: number\n\ttimestamp: number\n}\n\n// Alert configuration\nexport interface AlertConfig {\n\tenabled: boolean\n\tchannels: AlertChannel[]\n\tthreshold: number // Number of violations before alerting\n\tcooldown: number // Minimum time between alerts (ms)\n}\n\nexport interface AlertChannel {\n\ttype: \"console\" | \"webhook\" | \"email\" | \"slack\"\n\tconfig: {\n\t\turl?: string\n\t\temail?: string\n\t\ttoken?: string\n\t\tchannel?: string\n\t}\n}\n\n// Default performance budgets for media player\nexport const defaultPerformanceBudgets: PerformanceBudget[] = [\n\t// Bundle size budgets\n\t{\n\t\tname: \"Main Bundle Size (ESM)\",\n\t\tcategory: \"bundle\",\n\t\tlimit: 250 * 1024, // 250KB\n\t\tunit: \"bytes\",\n\t\tseverity: \"error\",\n\t\tdescription: \"Main bundle should stay under 250KB for fast initial loading\"\n\t},\n\t{\n\t\tname: \"Main Bundle Size (CJS)\",\n\t\tcategory: \"bundle\",\n\t\tlimit: 200 * 1024, // 200KB\n\t\tunit: \"bytes\",\n\t\tseverity: \"error\",\n\t\tdescription: \"CJS bundle should be smaller due to better compression\"\n\t},\n\t{\n\t\tname: \"Core Module Size\",\n\t\tcategory: \"bundle\",\n\t\tlimit: 15 * 1024, // 15KB\n\t\tunit: \"bytes\",\n\t\tseverity: \"warning\",\n\t\tdescription: \"Core architecture should remain lightweight\"\n\t},\n\t{\n\t\tname: \"Enhanced Components Size\",\n\t\tcategory: \"bundle\",\n\t\tlimit: 40 * 1024, // 40KB\n\t\tunit: \"bytes\",\n\t\tseverity: \"warning\",\n\t\tdescription: \"Enhanced components bundle size\"\n\t},\n\n\t// Runtime performance budgets\n\t{\n\t\tname: \"Component Render Time\",\n\t\tcategory: \"runtime\",\n\t\tlimit: 16, // 16ms for 60fps\n\t\tunit: \"ms\",\n\t\tseverity: \"error\",\n\t\tdescription: \"Component rendering should complete within one frame\"\n\t},\n\t{\n\t\tname: \"First Input Delay\",\n\t\tcategory: \"runtime\",\n\t\tlimit: 100, // 100ms\n\t\tunit: \"ms\",\n\t\tseverity: \"error\",\n\t\tdescription: \"First Input Delay should be under 100ms for good UX\"\n\t},\n\t{\n\t\tname: \"Largest Contentful Paint\",\n\t\tcategory: \"runtime\",\n\t\tlimit: 2500, // 2.5s\n\t\tunit: \"ms\",\n\t\tseverity: \"warning\",\n\t\tdescription: \"LCP should be under 2.5s for good Core Web Vitals score\"\n\t},\n\t{\n\t\tname: \"Cumulative Layout Shift\",\n\t\tcategory: \"runtime\",\n\t\tlimit: 0.1,\n\t\tunit: \"score\",\n\t\tseverity: \"warning\",\n\t\tdescription: \"CLS should be under 0.1 for good visual stability\"\n\t},\n\n\t// Memory budgets\n\t{\n\t\tname: \"Memory Usage\",\n\t\tcategory: \"memory\",\n\t\tlimit: 50 * 1024 * 1024, // 50MB\n\t\tunit: \"bytes\",\n\t\tseverity: \"warning\",\n\t\tdescription: \"Memory usage should stay under 50MB for good performance\"\n\t},\n\t{\n\t\tname: \"Memory Increase Per Operation\",\n\t\tcategory: \"memory\",\n\t\tlimit: 1024 * 1024, // 1MB\n\t\tunit: \"bytes\",\n\t\tseverity: \"error\",\n\t\tdescription: \"Each operation should not increase memory by more than 1MB\"\n\t},\n\n\t// Network budgets (for media loading)\n\t{\n\t\tname: \"Media Load Time\",\n\t\tcategory: \"network\",\n\t\tlimit: 3000, // 3s\n\t\tunit: \"ms\",\n\t\tseverity: \"warning\",\n\t\tdescription: \"Media should start loading within 3 seconds\"\n\t}\n]\n\n// Performance budget monitor\nexport class PerformanceBudgetMonitor {\n\tprivate budgets: Map<string, PerformanceBudget> = new Map()\n\tprivate violations: BudgetViolation[] = []\n\tprivate alertConfig: AlertConfig\n\tprivate lastAlertTime = 0\n\n\tconstructor(\n\t\tbudgets: PerformanceBudget[] = defaultPerformanceBudgets,\n\t\talertConfig: AlertConfig = {\n\t\t\tenabled: true,\n\t\t\tchannels: [{ type: \"console\", config: {} }],\n\t\t\tthreshold: 1,\n\t\t\tcooldown: 5 * 60 * 1000 // 5 minutes\n\t\t}\n\t) {\n\t\tbudgets.forEach((budget) => {\n\t\t\tthis.budgets.set(budget.name, budget)\n\t\t})\n\t\tthis.alertConfig = alertConfig\n\t}\n\n\t// Check a single metric against budgets\n\tcheckMetric(\n\t\tmetricName: string,\n\t\tvalue: number,\n\t\tcategory: PerformanceBudget[\"category\"] = \"runtime\"\n\t): BudgetViolation[] {\n\t\tconst violations: BudgetViolation[] = []\n\n\t\tfor (const [name, budget] of this.budgets) {\n\t\t\tif (\n\t\t\t\tbudget.category === category &&\n\t\t\t\t(name.includes(metricName) || metricName.includes(name.split(\" \")[0]?.toLowerCase() || \"\"))\n\t\t\t) {\n\t\t\t\tif (value > budget.limit) {\n\t\t\t\t\tconst violation: BudgetViolation = {\n\t\t\t\t\t\tbudget,\n\t\t\t\t\t\tactualValue: value,\n\t\t\t\t\t\toverageAmount: value - budget.limit,\n\t\t\t\t\t\toveragePercentage: ((value - budget.limit) / budget.limit) * 100,\n\t\t\t\t\t\ttimestamp: Date.now()\n\t\t\t\t\t}\n\n\t\t\t\t\tviolations.push(violation)\n\t\t\t\t\tthis.violations.push(violation)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (violations.length > 0) {\n\t\t\tthis.handleViolations(violations)\n\t\t}\n\n\t\treturn violations\n\t}\n\n\t// Check bundle sizes\n\tasync checkBundleSizes(distPath: string): Promise<BudgetViolation[]> {\n\t\tconst violations: BudgetViolation[] = []\n\n\t\t// Only check bundle sizes in Node.js environment\n\t\tif (typeof window !== \"undefined\" || typeof process === \"undefined\") {\n\t\t\tconsole.warn(\"Bundle size checking is only available in Node.js environment\")\n\t\t\treturn violations\n\t\t}\n\n\t\t// Bundle size checking is disabled in browser environments\n\t\tconsole.warn(\n\t\t\t\"Bundle size checking disabled - use Node.js cicdIntegration from @therealtinhtute/baroiplayer/core/performance/cicd for CI/CD environments\"\n\t\t)\n\n\t\treturn violations\n\t}\n\n\t// Check runtime performance\n\tcheckRuntimeMetrics(metrics: {\n\t\trenderTime?: number\n\t\tfid?: number\n\t\tlcp?: number\n\t\tcls?: number\n\t\tmemoryUsage?: number\n\t\tmediaLoadTime?: number\n\t}): BudgetViolation[] {\n\t\tconst allViolations: BudgetViolation[] = []\n\n\t\tif (metrics.renderTime !== undefined) {\n\t\t\tallViolations.push(\n\t\t\t\t...this.checkMetric(\"Component Render Time\", metrics.renderTime, \"runtime\")\n\t\t\t)\n\t\t}\n\n\t\tif (metrics.fid !== undefined) {\n\t\t\tallViolations.push(...this.checkMetric(\"First Input Delay\", metrics.fid, \"runtime\"))\n\t\t}\n\n\t\tif (metrics.lcp !== undefined) {\n\t\t\tallViolations.push(...this.checkMetric(\"Largest Contentful Paint\", metrics.lcp, \"runtime\"))\n\t\t}\n\n\t\tif (metrics.cls !== undefined) {\n\t\t\tallViolations.push(...this.checkMetric(\"Cumulative Layout Shift\", metrics.cls, \"runtime\"))\n\t\t}\n\n\t\tif (metrics.memoryUsage !== undefined) {\n\t\t\tallViolations.push(...this.checkMetric(\"Memory Usage\", metrics.memoryUsage, \"memory\"))\n\t\t}\n\n\t\tif (metrics.mediaLoadTime !== undefined) {\n\t\t\tallViolations.push(...this.checkMetric(\"Media Load Time\", metrics.mediaLoadTime, \"network\"))\n\t\t}\n\n\t\treturn allViolations\n\t}\n\n\t// Handle budget violations\n\tprivate async handleViolations(violations: BudgetViolation[]) {\n\t\tif (!this.alertConfig.enabled) return\n\n\t\tconst now = Date.now()\n\t\tconst errorViolations = violations.filter((v) => v.budget.severity === \"error\")\n\n\t\t// Check if we should send an alert based on threshold and cooldown\n\t\tif (\n\t\t\terrorViolations.length >= this.alertConfig.threshold &&\n\t\t\tnow - this.lastAlertTime >= this.alertConfig.cooldown\n\t\t) {\n\t\t\tawait this.sendAlerts(violations)\n\t\t\tthis.lastAlertTime = now\n\t\t}\n\t}\n\n\t// Send alerts through configured channels\n\tprivate async sendAlerts(violations: BudgetViolation[]) {\n\t\tconst message = this.formatAlertMessage(violations)\n\n\t\tfor (const channel of this.alertConfig.channels) {\n\t\t\ttry {\n\t\t\t\tawait this.sendAlert(channel, message)\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Failed to send alert via ${channel.type}:`, error)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Format alert message\n\tprivate formatAlertMessage(violations: BudgetViolation[]): string {\n\t\tlet message = `🚨 Performance Budget Violations Detected!\\n\\n`\n\n\t\tviolations.forEach((violation) => {\n\t\t\tconst { budget, actualValue, overageAmount, overagePercentage } = violation\n\t\t\tconst unit = this.getUnitDisplay(budget.unit)\n\n\t\t\tmessage += `❌ ${budget.name}\\n`\n\t\t\tmessage += ` Limit: ${this.formatValue(budget.limit, budget.unit)}\\n`\n\t\t\tmessage += ` Actual: ${this.formatValue(actualValue, budget.unit)}\\n`\n\t\t\tmessage += ` Overage: ${this.formatValue(overageAmount, budget.unit)} (+${overagePercentage.toFixed(1)}%)\\n`\n\t\t\tmessage += ` Severity: ${budget.severity.toUpperCase()}\\n\\n`\n\t\t})\n\n\t\tmessage += `Time: ${new Date().toISOString()}\\n`\n\t\tmessage += `Total Violations: ${violations.length}`\n\n\t\treturn message\n\t}\n\n\t// Send alert to specific channel\n\tprivate async sendAlert(channel: AlertChannel, message: string) {\n\t\tswitch (channel.type) {\n\t\t\tcase \"console\":\n\t\t\t\tconsole.error(message)\n\t\t\t\tbreak\n\n\t\t\tcase \"webhook\":\n\t\t\t\tif (channel.config.url) {\n\t\t\t\t\tconst response = await fetch(channel.config.url, {\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\t\tbody: JSON.stringify({ text: message, timestamp: Date.now() })\n\t\t\t\t\t})\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tthrow new Error(`Webhook failed: ${response.status}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\n\t\t\tcase \"slack\":\n\t\t\t\tif (channel.config.url) {\n\t\t\t\t\tconst response = await fetch(channel.config.url, {\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\t\ttext: message,\n\t\t\t\t\t\t\tchannel: channel.config.channel,\n\t\t\t\t\t\t\tusername: \"BaroiPlayer Performance Monitor\"\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tthrow new Error(`Slack webhook failed: ${response.status}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn(`Unsupported alert channel: ${channel.type}`)\n\t\t}\n\t}\n\n\t// Helper methods\n\tprivate formatValue(value: number, unit: PerformanceBudget[\"unit\"]): string {\n\t\tswitch (unit) {\n\t\t\tcase \"bytes\":\n\t\t\t\treturn this.formatBytes(value)\n\t\t\tcase \"ms\":\n\t\t\t\treturn `${value.toFixed(2)}ms`\n\t\t\tcase \"score\":\n\t\t\t\treturn value.toFixed(3)\n\t\t\tcase \"percent\":\n\t\t\t\treturn `${value.toFixed(1)}%`\n\t\t\tdefault:\n\t\t\t\treturn value.toString()\n\t\t}\n\t}\n\n\tprivate formatBytes(bytes: number): string {\n\t\tif (bytes >= 1024 * 1024) {\n\t\t\treturn `${(bytes / 1024 / 1024).toFixed(2)}MB`\n\t\t}\n\t\tif (bytes >= 1024) {\n\t\t\treturn `${(bytes / 1024).toFixed(2)}KB`\n\t\t}\n\t\treturn `${bytes}B`\n\t}\n\n\tprivate getUnitDisplay(unit: PerformanceBudget[\"unit\"]): string {\n\t\tconst displays = {\n\t\t\tbytes: \"bytes\",\n\t\t\tms: \"milliseconds\",\n\t\t\tscore: \"score\",\n\t\t\tpercent: \"percent\"\n\t\t}\n\t\treturn displays[unit] || unit\n\t}\n\n\t// Management methods\n\taddBudget(budget: PerformanceBudget) {\n\t\tthis.budgets.set(budget.name, budget)\n\t}\n\n\tremoveBudget(name: string) {\n\t\tthis.budgets.delete(name)\n\t}\n\n\tupdateBudget(name: string, updates: Partial<PerformanceBudget>) {\n\t\tconst existing = this.budgets.get(name)\n\t\tif (existing) {\n\t\t\tthis.budgets.set(name, { ...existing, ...updates })\n\t\t}\n\t}\n\n\tgetBudgets(): PerformanceBudget[] {\n\t\treturn Array.from(this.budgets.values())\n\t}\n\n\tgetViolations(since?: number): BudgetViolation[] {\n\t\tif (since) {\n\t\t\treturn this.violations.filter((v) => v.timestamp >= since)\n\t\t}\n\t\treturn [...this.violations]\n\t}\n\n\tclearViolations() {\n\t\tthis.violations = []\n\t}\n\n\tgetViolationSummary(): {\n\t\ttotal: number\n\t\tbyCategory: Record<string, number>\n\t\tbySeverity: Record<string, number>\n\t} {\n\t\tconst byCategory: Record<string, number> = {}\n\t\tconst bySeverity: Record<string, number> = {}\n\n\t\tthis.violations.forEach((violation) => {\n\t\t\tconst category = violation.budget.category\n\t\t\tconst severity = violation.budget.severity\n\n\t\t\tbyCategory[category] = (byCategory[category] || 0) + 1\n\t\t\tbySeverity[severity] = (bySeverity[severity] || 0) + 1\n\t\t})\n\n\t\treturn {\n\t\t\ttotal: this.violations.length,\n\t\t\tbyCategory,\n\t\t\tbySeverity\n\t\t}\n\t}\n}\n\n// Global performance budget monitor\nexport const performanceBudgetMonitor = new PerformanceBudgetMonitor()\n","import React from \"react\"\n\n// Network monitoring and adaptive loading\nexport interface NetworkInfo {\n\teffectiveType: \"2g\" | \"3g\" | \"4g\" | \"5g\" | \"unknown\"\n\tdownlink: number // Mbps\n\trtt: number // Round trip time in ms\n\tsaveData: boolean\n\tisOnline: boolean\n}\n\nexport interface MediaLoadingConfig {\n\tpreloadStrategy: \"none\" | \"metadata\" | \"auto\"\n\tadaptiveBitrate: boolean\n\tmaxPreloadSize: number // bytes\n\tnetworkThresholds: {\n\t\t\"2g\": { maxBitrate: number; preload: boolean }\n\t\t\"3g\": { maxBitrate: number; preload: boolean }\n\t\t\"4g\": { maxBitrate: number; preload: boolean }\n\t\t\"5g\": { maxBitrate: number; preload: boolean }\n\t}\n\tbufferSize: number // seconds\n\tenableServiceWorker: boolean\n}\n\nexport const defaultMediaLoadingConfig: MediaLoadingConfig = {\n\tpreloadStrategy: \"metadata\",\n\tadaptiveBitrate: true,\n\tmaxPreloadSize: 2 * 1024 * 1024, // 2MB\n\tnetworkThresholds: {\n\t\t\"2g\": { maxBitrate: 128, preload: false }, // 128 kbps\n\t\t\"3g\": { maxBitrate: 500, preload: false }, // 500 kbps\n\t\t\"4g\": { maxBitrate: 2000, preload: true }, // 2 Mbps\n\t\t\"5g\": { maxBitrate: 10000, preload: true } // 10 Mbps\n\t},\n\tbufferSize: 10, // 10 seconds\n\tenableServiceWorker: true\n}\n\n// Media loading performance tracker\nexport interface MediaLoadingMetrics {\n\tloadStartTime: number\n\tfirstByteTime?: number\n\tloadCompleteTime?: number\n\ttotalLoadTime?: number\n\tbytesLoaded: number\n\tloadSpeed: number // bytes per second\n\tnetworkType: string\n\tquality: string\n\tbufferHealth: number // 0-1 scale\n\tstallsCount: number\n\tstallsDuration: number\n}\n\n// Network monitoring utility\nexport class NetworkMonitor {\n\tprivate connection: any\n\tprivate listeners: Set<(info: NetworkInfo) => void> = new Set()\n\tprivate currentInfo: NetworkInfo\n\n\tconstructor() {\n\t\tif (typeof window === \"undefined\" || typeof navigator === \"undefined\") {\n\t\t\t// Server-side rendering fallback\n\t\t\tthis.connection = null\n\t\t\tthis.currentInfo = {\n\t\t\t\teffectiveType: \"unknown\",\n\t\t\t\tdownlink: 0,\n\t\t\t\trtt: 0,\n\t\t\t\tsaveData: false,\n\t\t\t\tisOnline: true\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tthis.connection =\n\t\t\t(navigator as any).connection ||\n\t\t\t(navigator as any).mozConnection ||\n\t\t\t(navigator as any).webkitConnection\n\n\t\tthis.currentInfo = this.getNetworkInfo()\n\t\tthis.initializeListeners()\n\t}\n\n\tprivate getNetworkInfo(): NetworkInfo {\n\t\tif (typeof navigator === \"undefined\") {\n\t\t\t// Server-side rendering fallback\n\t\t\treturn {\n\t\t\t\teffectiveType: \"unknown\",\n\t\t\t\tdownlink: 0,\n\t\t\t\trtt: 0,\n\t\t\t\tsaveData: false,\n\t\t\t\tisOnline: true\n\t\t\t}\n\t\t}\n\n\t\tconst isOnline = navigator.onLine\n\n\t\tif (this.connection) {\n\t\t\treturn {\n\t\t\t\teffectiveType: this.connection.effectiveType || \"unknown\",\n\t\t\t\tdownlink: this.connection.downlink || 0,\n\t\t\t\trtt: this.connection.rtt || 0,\n\t\t\t\tsaveData: this.connection.saveData || false,\n\t\t\t\tisOnline\n\t\t\t}\n\t\t}\n\n\t\t// Fallback for browsers without Network Information API\n\t\treturn {\n\t\t\teffectiveType: \"unknown\",\n\t\t\tdownlink: 0,\n\t\t\trtt: 0,\n\t\t\tsaveData: false,\n\t\t\tisOnline\n\t\t}\n\t}\n\n\tprivate initializeListeners() {\n\t\tif (typeof window === \"undefined\") {\n\t\t\t// Server-side rendering - skip event listeners\n\t\t\treturn\n\t\t}\n\n\t\tif (this.connection) {\n\t\t\tthis.connection.addEventListener(\"change\", this.handleNetworkChange.bind(this))\n\t\t}\n\n\t\twindow.addEventListener(\"online\", this.handleNetworkChange.bind(this))\n\t\twindow.addEventListener(\"offline\", this.handleNetworkChange.bind(this))\n\t}\n\n\tprivate handleNetworkChange() {\n\t\tconst newInfo = this.getNetworkInfo()\n\t\tthis.currentInfo = newInfo\n\t\tthis.listeners.forEach((listener) => listener(newInfo))\n\t}\n\n\tgetCurrentNetworkInfo(): NetworkInfo {\n\t\treturn { ...this.currentInfo }\n\t}\n\n\tsubscribe(listener: (info: NetworkInfo) => void): () => void {\n\t\tthis.listeners.add(listener)\n\t\treturn () => this.listeners.delete(listener)\n\t}\n\n\t// Estimate available bandwidth with fallback detection\n\tasync estimateBandwidth(): Promise<number> {\n\t\tif (this.connection && this.connection.downlink) {\n\t\t\treturn this.connection.downlink * 1000 // Convert to kbps\n\t\t}\n\n\t\t// Fallback: simple bandwidth test\n\t\ttry {\n\t\t\tconst startTime = performance.now()\n\t\t\tconst testUrl = \"/api/bandwidth-test?size=100kb\" // Would need to be implemented\n\t\t\tconst response = await fetch(testUrl)\n\t\t\tconst blob = await response.blob()\n\t\t\tconst endTime = performance.now()\n\n\t\t\tconst timeInSeconds = (endTime - startTime) / 1000\n\t\t\tconst bytesLoaded = blob.size\n\t\t\tconst bitsPerSecond = (bytesLoaded * 8) / timeInSeconds\n\n\t\t\treturn bitsPerSecond / 1000 // Return in kbps\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Bandwidth estimation failed:\", error)\n\t\t\treturn 1000 // Default to 1Mbps\n\t\t}\n\t}\n}\n\n// Media loading optimizer\nexport class MediaLoadingOptimizer {\n\tprivate config: MediaLoadingConfig\n\tprivate networkMonitor: NetworkMonitor\n\tprivate loadingMetrics: Map<string, MediaLoadingMetrics> = new Map()\n\tprivate preloadCache: Map<string, Promise<Blob>> = new Map()\n\n\tconstructor(config: Partial<MediaLoadingConfig> = {}) {\n\t\tthis.config = { ...defaultMediaLoadingConfig, ...config }\n\t\tthis.networkMonitor = new NetworkMonitor()\n\t\tthis.initializeNetworkMonitoring()\n\t}\n\n\tprivate initializeNetworkMonitoring() {\n\t\tthis.networkMonitor.subscribe((networkInfo) => {\n\t\t\tthis.handleNetworkChange(networkInfo)\n\t\t})\n\t}\n\n\tprivate handleNetworkChange(networkInfo: NetworkInfo) {\n\t\tconsole.log(\"Network changed:\", networkInfo)\n\n\t\t// Adjust quality based on network conditions\n\t\tif (this.config.adaptiveBitrate) {\n\t\t\tthis.adjustQualityForNetwork(networkInfo)\n\t\t}\n\n\t\t// Clear preload cache if on slow network\n\t\tif (networkInfo.effectiveType === \"2g\" || networkInfo.saveData) {\n\t\t\tthis.clearPreloadCache()\n\t\t}\n\t}\n\n\t// Optimize media loading based on network conditions\n\tasync optimizeMediaLoading(\n\t\tmediaUrl: string,\n\t\telement: HTMLMediaElement,\n\t\toptions: {\n\t\t\tquality?: string\n\t\t\tpreload?: boolean\n\t\t\tpriority?: \"high\" | \"normal\" | \"low\"\n\t\t} = {}\n\t): Promise<MediaLoadingMetrics> {\n\t\tconst startTime = performance.now()\n\t\tconst networkInfo = this.networkMonitor.getCurrentNetworkInfo()\n\n\t\tconst metrics: MediaLoadingMetrics = {\n\t\t\tloadStartTime: startTime,\n\t\t\tbytesLoaded: 0,\n\t\t\tloadSpeed: 0,\n\t\t\tnetworkType: networkInfo.effectiveType,\n\t\t\tquality: options.quality || \"auto\",\n\t\t\tbufferHealth: 0,\n\t\t\tstallsCount: 0,\n\t\t\tstallsDuration: 0\n\t\t}\n\n\t\tthis.loadingMetrics.set(mediaUrl, metrics)\n\n\t\ttry {\n\t\t\t// Choose optimal loading strategy\n\t\t\tconst loadingStrategy = this.chooseLoadingStrategy(networkInfo, options)\n\n\t\t\t// Apply preload strategy\n\t\t\tif (loadingStrategy.shouldPreload) {\n\t\t\t\tawait this.preloadMedia(mediaUrl, loadingStrategy.preloadAmount)\n\t\t\t}\n\n\t\t\t// Set appropriate preload attribute\n\t\t\telement.preload = loadingStrategy.preloadAttribute\n\n\t\t\t// Monitor loading progress\n\t\t\tthis.monitorLoadingProgress(element, metrics)\n\n\t\t\t// Apply quality adjustments\n\t\t\tif (this.config.adaptiveBitrate && loadingStrategy.suggestedQuality) {\n\t\t\t\tthis.applyQualitySettings(element, loadingStrategy.suggestedQuality)\n\t\t\t}\n\n\t\t\treturn metrics\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Media loading optimization failed:\", error)\n\t\t\treturn metrics\n\t\t}\n\t}\n\n\tprivate chooseLoadingStrategy(\n\t\tnetworkInfo: NetworkInfo,\n\t\toptions: { preload?: boolean; priority?: string; quality?: string }\n\t) {\n\t\tconst effectiveType = networkInfo.effectiveType === \"unknown\" ? \"4g\" : networkInfo.effectiveType\n\t\tconst threshold =\n\t\t\tthis.config.networkThresholds[effectiveType] || this.config.networkThresholds[\"4g\"]\n\n\t\treturn {\n\t\t\tshouldPreload: options.preload !== false && threshold.preload && !networkInfo.saveData,\n\t\t\tpreloadAmount: networkInfo.saveData ? 0 : this.config.maxPreloadSize,\n\t\t\tpreloadAttribute: this.getPreloadAttribute(networkInfo),\n\t\t\tsuggestedQuality: this.getSuggestedQuality(networkInfo, threshold.maxBitrate),\n\t\t\tbufferTarget: this.getBufferTarget(networkInfo)\n\t\t}\n\t}\n\n\tprivate getPreloadAttribute(networkInfo: NetworkInfo): \"none\" | \"metadata\" | \"auto\" {\n\t\tif (networkInfo.saveData || networkInfo.effectiveType === \"2g\") {\n\t\t\treturn \"none\"\n\t\t}\n\n\t\tif (networkInfo.effectiveType === \"3g\") {\n\t\t\treturn \"metadata\"\n\t\t}\n\n\t\treturn this.config.preloadStrategy\n\t}\n\n\tprivate getSuggestedQuality(networkInfo: NetworkInfo, maxBitrate: number): string {\n\t\tconst availableBandwidth = networkInfo.downlink * 1000 // Convert to kbps\n\n\t\tif (availableBandwidth >= maxBitrate * 2) return \"high\"\n\t\tif (availableBandwidth >= maxBitrate) return \"medium\"\n\t\treturn \"low\"\n\t}\n\n\tprivate getBufferTarget(networkInfo: NetworkInfo): number {\n\t\tswitch (networkInfo.effectiveType) {\n\t\t\tcase \"2g\":\n\t\t\t\treturn 2 // 2 seconds\n\t\t\tcase \"3g\":\n\t\t\t\treturn 5 // 5 seconds\n\t\t\tcase \"4g\":\n\t\t\t\treturn this.config.bufferSize\n\t\t\tcase \"5g\":\n\t\t\t\treturn this.config.bufferSize * 1.5\n\t\t\tdefault:\n\t\t\t\treturn this.config.bufferSize\n\t\t}\n\t}\n\n\t// Preload media content\n\tasync preloadMedia(url: string, maxSize: number): Promise<void> {\n\t\tif (this.preloadCache.has(url)) {\n\t\t\treturn // Already preloading or preloaded\n\t\t}\n\n\t\tconst preloadPromise = this.fetchWithProgress(url, maxSize)\n\t\tthis.preloadCache.set(url, preloadPromise)\n\n\t\ttry {\n\t\t\tawait preloadPromise\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Preload failed for ${url}:`, error)\n\t\t\tthis.preloadCache.delete(url)\n\t\t}\n\t}\n\n\tprivate async fetchWithProgress(url: string, maxSize: number): Promise<Blob> {\n\t\tconst response = await fetch(url, {\n\t\t\theaders: {\n\t\t\t\tRange: `bytes=0-${maxSize - 1}` // Limit preload size\n\t\t\t}\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to preload: ${response.status}`)\n\t\t}\n\n\t\tconst reader = response.body?.getReader()\n\t\tif (!reader) {\n\t\t\tthrow new Error(\"Response body not readable\")\n\t\t}\n\n\t\tconst chunks: Uint8Array[] = []\n\t\tlet bytesRead = 0\n\n\t\ttry {\n\t\t\twhile (bytesRead < maxSize) {\n\t\t\t\tconst { done, value } = await reader.read()\n\t\t\t\tif (done) break\n\n\t\t\t\tchunks.push(value)\n\t\t\t\tbytesRead += value.length\n\t\t\t}\n\t\t} finally {\n\t\t\treader.releaseLock()\n\t\t}\n\n\t\treturn new Blob(chunks)\n\t}\n\n\t// Monitor loading progress and update metrics\n\tprivate monitorLoadingProgress(element: HTMLMediaElement, metrics: MediaLoadingMetrics) {\n\t\tlet stallStartTime: number | null = null\n\n\t\tconst updateMetrics = () => {\n\t\t\tif (element.buffered.length > 0) {\n\t\t\t\tconst bufferedEnd = element.buffered.end(element.buffered.length - 1)\n\t\t\t\tconst currentTime = element.currentTime\n\t\t\t\tmetrics.bufferHealth = Math.min((bufferedEnd - currentTime) / this.config.bufferSize, 1)\n\t\t\t}\n\t\t}\n\n\t\t// Track first byte\n\t\tconst onLoadStart = () => {\n\t\t\tmetrics.firstByteTime = performance.now()\n\t\t}\n\n\t\t// Track load completion\n\t\tconst onCanPlay = () => {\n\t\t\tmetrics.loadCompleteTime = performance.now()\n\t\t\tmetrics.totalLoadTime = metrics.loadCompleteTime - metrics.loadStartTime\n\n\t\t\t// Calculate load speed\n\t\t\tif (metrics.totalLoadTime && metrics.bytesLoaded > 0) {\n\t\t\t\tmetrics.loadSpeed = metrics.bytesLoaded / (metrics.totalLoadTime / 1000)\n\t\t\t}\n\t\t}\n\n\t\t// Track stalls\n\t\tconst onWaiting = () => {\n\t\t\tif (stallStartTime === null) {\n\t\t\t\tstallStartTime = performance.now()\n\t\t\t\tmetrics.stallsCount++\n\t\t\t}\n\t\t}\n\n\t\tconst onPlaying = () => {\n\t\t\tif (stallStartTime !== null) {\n\t\t\t\tmetrics.stallsDuration += performance.now() - stallStartTime\n\t\t\t\tstallStartTime = null\n\t\t\t}\n\t\t\tupdateMetrics()\n\t\t}\n\n\t\t// Track progress\n\t\tconst onProgress = () => {\n\t\t\tif (element.buffered.length > 0) {\n\t\t\t\tconst bufferedBytes = element.buffered.end(0) * 1000 // Rough estimate\n\t\t\t\tmetrics.bytesLoaded = bufferedBytes\n\t\t\t}\n\t\t\tupdateMetrics()\n\t\t}\n\n\t\t// Add event listeners\n\t\telement.addEventListener(\"loadstart\", onLoadStart)\n\t\telement.addEventListener(\"canplay\", onCanPlay)\n\t\telement.addEventListener(\"waiting\", onWaiting)\n\t\telement.addEventListener(\"playing\", onPlaying)\n\t\telement.addEventListener(\"progress\", onProgress)\n\n\t\t// Cleanup function\n\t\tconst cleanup = () => {\n\t\t\telement.removeEventListener(\"loadstart\", onLoadStart)\n\t\t\telement.removeEventListener(\"canplay\", onCanPlay)\n\t\t\telement.removeEventListener(\"waiting\", onWaiting)\n\t\t\telement.removeEventListener(\"playing\", onPlaying)\n\t\t\telement.removeEventListener(\"progress\", onProgress)\n\t\t}\n\n\t\t// Auto-cleanup after 5 minutes\n\t\tsetTimeout(cleanup, 5 * 60 * 1000)\n\t}\n\n\t// Apply quality settings (would integrate with HLS.js or similar)\n\tprivate applyQualitySettings(element: HTMLMediaElement, quality: string) {\n\t\t// This would integrate with your video streaming library\n\t\tconsole.log(`Applying quality setting: ${quality} to`, element)\n\n\t\t// Example integration with HLS.js:\n\t\t// if (element.hls) {\n\t\t// element.hls.currentLevel = this.getQualityLevel(quality);\n\t\t// }\n\t}\n\n\tprivate adjustQualityForNetwork(networkInfo: NetworkInfo) {\n\t\t// Auto-adjust quality for all active media elements\n\t\tconsole.log(\"Adjusting quality for network conditions:\", networkInfo.effectiveType)\n\t}\n\n\t// Clear preload cache to save memory\n\tclearPreloadCache() {\n\t\tthis.preloadCache.clear()\n\t}\n\n\t// Get loading metrics for a specific media URL\n\tgetLoadingMetrics(url: string): MediaLoadingMetrics | undefined {\n\t\treturn this.loadingMetrics.get(url)\n\t}\n\n\t// Get all loading metrics\n\tgetAllMetrics(): MediaLoadingMetrics[] {\n\t\treturn Array.from(this.loadingMetrics.values())\n\t}\n\n\t// Calculate average loading performance\n\tgetAverageLoadingTime(): number {\n\t\tconst metrics = this.getAllMetrics()\n\t\tconst completedLoads = metrics.filter((m) => m.totalLoadTime !== undefined)\n\n\t\tif (completedLoads.length === 0) return 0\n\n\t\tconst total = completedLoads.reduce((sum, m) => sum + (m.totalLoadTime || 0), 0)\n\t\treturn total / completedLoads.length\n\t}\n\n\t// Get network-specific performance stats\n\tgetNetworkPerformanceStats(): {\n\t\tnetworkType: string\n\t\tavgLoadTime: number\n\t\tavgStalls: number\n\t\tavgBufferHealth: number\n\t}[] {\n\t\tconst statsByNetwork = new Map<string, MediaLoadingMetrics[]>()\n\n\t\tthis.getAllMetrics().forEach((metrics) => {\n\t\t\tconst network = metrics.networkType\n\t\t\tif (!statsByNetwork.has(network)) {\n\t\t\t\tstatsByNetwork.set(network, [])\n\t\t\t}\n\t\t\tstatsByNetwork.get(network)!.push(metrics)\n\t\t})\n\n\t\treturn Array.from(statsByNetwork.entries()).map(([networkType, metrics]) => ({\n\t\t\tnetworkType,\n\t\t\tavgLoadTime: metrics.reduce((sum, m) => sum + (m.totalLoadTime || 0), 0) / metrics.length,\n\t\t\tavgStalls: metrics.reduce((sum, m) => sum + m.stallsCount, 0) / metrics.length,\n\t\t\tavgBufferHealth: metrics.reduce((sum, m) => sum + m.bufferHealth, 0) / metrics.length\n\t\t}))\n\t}\n}\n\n// Global media loading optimizer instance\nexport const mediaLoadingOptimizer = new MediaLoadingOptimizer()\n\n// React hook for media loading optimization\nexport function useMediaLoadingOptimizer(config?: Partial<MediaLoadingConfig>) {\n\tconst [optimizer] = React.useState(() =>\n\t\tconfig ? new MediaLoadingOptimizer(config) : mediaLoadingOptimizer\n\t)\n\n\tconst [networkInfo, setNetworkInfo] = React.useState<NetworkInfo | null>(null)\n\tconst [loadingMetrics, setLoadingMetrics] = React.useState<MediaLoadingMetrics[]>([])\n\n\tReact.useEffect(() => {\n\t\tconst unsubscribe = optimizer[\"networkMonitor\"].subscribe(setNetworkInfo)\n\t\tsetNetworkInfo(optimizer[\"networkMonitor\"].getCurrentNetworkInfo())\n\n\t\t// Update metrics periodically\n\t\tconst interval = setInterval(() => {\n\t\t\tsetLoadingMetrics(optimizer.getAllMetrics())\n\t\t}, 1000)\n\n\t\treturn () => {\n\t\t\tunsubscribe()\n\t\t\tclearInterval(interval)\n\t\t}\n\t}, [optimizer])\n\n\tconst optimizeLoading = React.useCallback(\n\t\t(mediaUrl: string, element: HTMLMediaElement, options?: any) => {\n\t\t\treturn optimizer.optimizeMediaLoading(mediaUrl, element, options)\n\t\t},\n\t\t[optimizer]\n\t)\n\n\treturn {\n\t\tnetworkInfo,\n\t\tloadingMetrics,\n\t\toptimizeLoading,\n\t\taverageLoadTime: optimizer.getAverageLoadingTime(),\n\t\tnetworkStats: optimizer.getNetworkPerformanceStats()\n\t}\n}\n","import React, { createContext, useContext, useMemo } from \"react\"\nimport { EventBus } from \"../events\"\nimport { ConsolePluginLogger, PluginRegistry } from \"../plugins\"\n\n// Service interfaces\nexport interface MediaService {\n\tloadMedia(src: string): Promise<void>\n\tplay(): Promise<void>\n\tpause(): Promise<void>\n\tseek(time: number): Promise<void>\n\tsetVolume(volume: number): Promise<void>\n}\n\nexport interface StorageService {\n\tget<T>(key: string): T | null\n\tset<T>(key: string, value: T): void\n\tremove(key: string): void\n\tclear(): void\n}\n\nexport interface AnalyticsService {\n\ttrack(event: string, data?: any): void\n\tidentify(userId: string, traits?: any): void\n\tpage(name: string, properties?: any): void\n}\n\nexport interface LoggerService {\n\tinfo(message: string, data?: any): void\n\twarn(message: string, data?: any): void\n\terror(message: string, data?: any): void\n\tdebug(message: string, data?: any): void\n}\n\n// Service implementations\nclass LocalStorageService implements StorageService {\n\tget<T>(key: string): T | null {\n\t\ttry {\n\t\t\tconst item = localStorage.getItem(`baroi-player-${key}`)\n\t\t\treturn item ? (JSON.parse(item) as T) : null\n\t\t} catch {\n\t\t\treturn null\n\t\t}\n\t}\n\n\tset<T>(key: string, value: T): void {\n\t\ttry {\n\t\t\tlocalStorage.setItem(`baroi-player-${key}`, JSON.stringify(value))\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Failed to store data:\", error)\n\t\t}\n\t}\n\n\tremove(key: string): void {\n\t\ttry {\n\t\t\tlocalStorage.removeItem(`baroi-player-${key}`)\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Failed to remove data:\", error)\n\t\t}\n\t}\n\n\tclear(): void {\n\t\ttry {\n\t\t\tObject.keys(localStorage).forEach((key) => {\n\t\t\t\tif (key.startsWith(\"baroi-player-\")) {\n\t\t\t\t\tlocalStorage.removeItem(key)\n\t\t\t\t}\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Failed to clear data:\", error)\n\t\t}\n\t}\n}\n\nclass NoOpAnalyticsService implements AnalyticsService {\n\ttrack(event: string, data?: any): void {\n\t\tconsole.log(\"Analytics:\", event, data)\n\t}\n\n\tidentify(userId: string, traits?: any): void {\n\t\tconsole.log(\"Analytics identify:\", userId, traits)\n\t}\n\n\tpage(name: string, properties?: any): void {\n\t\tconsole.log(\"Analytics page:\", name, properties)\n\t}\n}\n\n// Service container\nexport interface ServiceContainer {\n\teventBus: EventBus\n\tpluginRegistry: PluginRegistry\n\tstorage: StorageService\n\tanalytics: AnalyticsService\n\tlogger: LoggerService\n}\n\n// Service provider context\nconst ServiceContext = createContext<ServiceContainer | null>(null)\n\n// Service provider props\nexport interface ServiceProviderProps {\n\tchildren: React.ReactNode\n\tservices?: Partial<ServiceContainer>\n}\n\n// Service provider component\nexport function ServiceProvider({ children, services = {} }: ServiceProviderProps) {\n\tconst container = useMemo<ServiceContainer>(() => {\n\t\tconst logger = services.logger || new ConsolePluginLogger(\"[BaroiPlayer]\")\n\t\tconst eventBus = services.eventBus || new EventBus()\n\t\tconst pluginRegistry = services.pluginRegistry || new PluginRegistry(logger)\n\t\tconst storage = services.storage || new LocalStorageService()\n\t\tconst analytics = services.analytics || new NoOpAnalyticsService()\n\n\t\treturn {\n\t\t\teventBus,\n\t\t\tpluginRegistry,\n\t\t\tstorage,\n\t\t\tanalytics,\n\t\t\tlogger\n\t\t}\n\t}, [services])\n\n\treturn <ServiceContext.Provider value={container}>{children}</ServiceContext.Provider>\n}\n\n// Service hooks\nexport function useServices(): ServiceContainer {\n\tconst context = useContext(ServiceContext)\n\tif (!context) {\n\t\tthrow new Error(\"useServices must be used within ServiceProvider\")\n\t}\n\treturn context\n}\n\nexport function useServiceEventBus(): EventBus {\n\treturn useServices().eventBus\n}\n\nexport function usePluginRegistry(): PluginRegistry {\n\treturn useServices().pluginRegistry\n}\n\nexport function useStorage(): StorageService {\n\treturn useServices().storage\n}\n\nexport function useAnalytics(): AnalyticsService {\n\treturn useServices().analytics\n}\n\nexport function useLogger(): LoggerService {\n\treturn useServices().logger\n}\n\n// Service decorators for dependency injection\nexport function withServices<P extends object>(\n\tComponent: React.ComponentType<P & { services: ServiceContainer }>\n): React.ComponentType<P> {\n\treturn function WithServicesComponent(props: P) {\n\t\tconst services = useServices()\n\t\treturn <Component {...props} services={services} />\n\t}\n}\n","import React from \"react\"\nimport { EventBus } from \"./events\"\nimport { PluginRegistry } from \"./plugins\"\nimport { type ServiceContainer, ServiceProvider } from \"./providers/service-provider\"\n\n// Architecture configuration\nexport interface ArchitectureConfig {\n\tplugins?: string[]\n\tservices?: Partial<ServiceContainer>\n\teventMiddleware?: any[]\n\tdebug?: boolean\n}\n\n// Create architecture wrapper component\nexport function createArchitecture(config: ArchitectureConfig = {}) {\n\treturn function ArchitectureProvider({ children }: { children: React.ReactNode }) {\n\t\treturn <ServiceProvider services={config.services}>{children}</ServiceProvider>\n\t}\n}\n\n// Architecture health check\nexport async function healthCheck(services: ServiceContainer) {\n\tconst results = {\n\t\teventBus: {\n\t\t\thealthy: true,\n\t\t\tlistenerCount: services.eventBus.getListenerCount(),\n\t\t\teventTypes: services.eventBus.getEventTypes().length\n\t\t},\n\t\tplugins: await services.pluginRegistry.healthCheck(),\n\t\ttimestamp: Date.now()\n\t}\n\n\treturn results\n}\n","import React, { lazy, Suspense } from \"react\"\n\n// Feature flags for progressive loading\nexport const FEATURES = {\n\tSUBTITLES: \"subtitles\",\n\tPLAYLISTS: \"playlists\",\n\tADVANCED_CONTROLS: \"advanced_controls\",\n\tANALYTICS: \"analytics\",\n\tPICTURE_IN_PICTURE: \"picture_in_picture\",\n\tQUALITY_SELECTOR: \"quality_selector\",\n\tPLAYBACK_SPEED: \"playback_speed\",\n\tCHAPTERS: \"chapters\",\n\tTHUMBNAILS: \"thumbnails\",\n\tKEYBOARD_SHORTCUTS: \"keyboard_shortcuts\"\n} as const\n\nexport type FeatureType = (typeof FEATURES)[keyof typeof FEATURES]\n\n// Progressive loading configuration\nexport interface ProgressiveLoadingConfig {\n\tenabledFeatures: FeatureType[]\n\tloadingStrategy: \"lazy\" | \"preload\" | \"immediate\"\n\tfallbackTimeout: number\n\tretryAttempts: number\n}\n\nexport const defaultProgressiveConfig: ProgressiveLoadingConfig = {\n\tenabledFeatures: [FEATURES.SUBTITLES, FEATURES.ADVANCED_CONTROLS, FEATURES.KEYBOARD_SHORTCUTS],\n\tloadingStrategy: \"lazy\",\n\tfallbackTimeout: 5000,\n\tretryAttempts: 3\n}\n\n// Dynamic imports with error handling and retry logic\nexport const lazyComponents = {\n\t// Subtitle system\n\tSubtitleSelector: lazy(() =>\n\t\timport(\"../components/enhanced/advanced-features\").then((module) => ({\n\t\t\tdefault: module.SubtitleSelector\n\t\t}))\n\t),\n\n\t// Playlist functionality\n\tPlaylistManager: lazy(\n\t\t() =>\n\t\t\timport(\"../components/enhanced/advanced-features\").then((module) => ({\n\t\t\t\tdefault: module.SubtitleSelector\n\t\t\t})) // Use existing component as placeholder\n\t),\n\n\t// Advanced controls\n\tQualitySelector: lazy(() =>\n\t\timport(\"../components/enhanced/advanced-features\").then((module) => ({\n\t\t\tdefault: module.QualitySelector\n\t\t}))\n\t),\n\n\tPlaybackSpeedSelector: lazy(() =>\n\t\timport(\"../components/enhanced/advanced-features\").then((module) => ({\n\t\t\tdefault: module.PlaybackSpeedSelector\n\t\t}))\n\t),\n\n\tChaptersPanel: lazy(() =>\n\t\timport(\"../components/enhanced/advanced-features\").then((module) => ({\n\t\t\tdefault: module.ChaptersPanel\n\t\t}))\n\t),\n\n\tPictureInPictureButton: lazy(() =>\n\t\timport(\"../components/enhanced/advanced-features\").then((module) => ({\n\t\t\tdefault: module.PictureInPictureButton\n\t\t}))\n\t),\n\n\t// Analytics\n\tAnalyticsTracker: lazy(\n\t\t() =>\n\t\t\timport(\"../components/enhanced/advanced-features\").then((module) => ({\n\t\t\t\tdefault: module.SubtitleSelector\n\t\t\t})) // Use existing component as placeholder\n\t)\n}\n\n// Feature detection utilities\nexport class FeatureDetector {\n\tprivate static cache = new Map<FeatureType, boolean>()\n\n\tstatic async isSupported(feature: FeatureType): Promise<boolean> {\n\t\tif (this.cache.has(feature)) {\n\t\t\treturn this.cache.get(feature)!\n\t\t}\n\n\t\tconst supported = await this.checkFeatureSupport(feature)\n\t\tthis.cache.set(feature, supported)\n\t\treturn supported\n\t}\n\n\tprivate static async checkFeatureSupport(feature: FeatureType): Promise<boolean> {\n\t\tif (typeof window === \"undefined\" || typeof document === \"undefined\") {\n\t\t\t// Server-side rendering - assume basic support\n\t\t\treturn true\n\t\t}\n\n\t\tswitch (feature) {\n\t\t\tcase FEATURES.SUBTITLES:\n\t\t\t\treturn \"TextTrack\" in window\n\n\t\t\tcase FEATURES.PICTURE_IN_PICTURE:\n\t\t\t\treturn \"pictureInPictureEnabled\" in document\n\n\t\t\tcase FEATURES.ADVANCED_CONTROLS:\n\t\t\t\treturn true // Always supported\n\n\t\t\tcase FEATURES.PLAYLISTS:\n\t\t\t\treturn \"MediaSession\" in window\n\n\t\t\tcase FEATURES.ANALYTICS:\n\t\t\t\treturn \"IntersectionObserver\" in window\n\n\t\t\tcase FEATURES.QUALITY_SELECTOR:\n\t\t\t\treturn \"MediaSource\" in window\n\n\t\t\tcase FEATURES.PLAYBACK_SPEED:\n\t\t\t\treturn true // HTML5 video supports this\n\n\t\t\tcase FEATURES.CHAPTERS:\n\t\t\t\treturn \"TextTrack\" in window\n\n\t\t\tcase FEATURES.THUMBNAILS:\n\t\t\t\treturn \"OffscreenCanvas\" in window || \"canvas\" in document.createElement(\"canvas\")\n\n\t\t\tcase FEATURES.KEYBOARD_SHORTCUTS:\n\t\t\t\treturn \"KeyboardEvent\" in window\n\n\t\t\tdefault:\n\t\t\t\treturn false\n\t\t}\n\t}\n}\n\n// Progressive loading manager\nexport class ProgressiveLoader {\n\tprivate config: ProgressiveLoadingConfig\n\tprivate loadedFeatures = new Set<FeatureType>()\n\tprivate loadingPromises = new Map<FeatureType, Promise<any>>()\n\n\tconstructor(config: Partial<ProgressiveLoadingConfig> = {}) {\n\t\tthis.config = { ...defaultProgressiveConfig, ...config }\n\t}\n\n\tasync loadFeature<T = any>(feature: FeatureType): Promise<T | null> {\n\t\t// Check if feature is enabled\n\t\tif (!this.config.enabledFeatures.includes(feature)) {\n\t\t\treturn null\n\t\t}\n\n\t\t// Check if already loaded\n\t\tif (this.loadedFeatures.has(feature)) {\n\t\t\treturn this.getLoadedFeature(feature)\n\t\t}\n\n\t\t// Check if currently loading\n\t\tif (this.loadingPromises.has(feature)) {\n\t\t\treturn this.loadingPromises.get(feature)\n\t\t}\n\n\t\t// Check browser support\n\t\tconst isSupported = await FeatureDetector.isSupported(feature)\n\t\tif (!isSupported) {\n\t\t\tconsole.warn(`Feature ${feature} is not supported in this browser`)\n\t\t\treturn null\n\t\t}\n\n\t\t// Start loading with retry logic\n\t\tconst loadingPromise = this.loadWithRetry(feature)\n\t\tthis.loadingPromises.set(feature, loadingPromise)\n\n\t\ttry {\n\t\t\tconst result = await loadingPromise\n\t\t\tthis.loadedFeatures.add(feature)\n\t\t\treturn result as T\n\t\t} catch (error) {\n\t\t\tconsole.error(`Failed to load feature ${feature}:`, error)\n\t\t\tthis.loadingPromises.delete(feature)\n\t\t\treturn null\n\t\t}\n\t}\n\n\tprivate async loadWithRetry<T>(feature: FeatureType, attempt = 1): Promise<T> {\n\t\ttry {\n\t\t\tconst result = await this.loadFeatureModule(feature)\n\t\t\treturn result as T\n\t\t} catch (error) {\n\t\t\tif (attempt < this.config.retryAttempts) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Loading feature ${feature} failed, retrying (${attempt}/${this.config.retryAttempts})`\n\t\t\t\t)\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000 * attempt))\n\t\t\t\treturn this.loadWithRetry(feature, attempt + 1)\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tprivate async loadFeatureModule(feature: FeatureType) {\n\t\tswitch (feature) {\n\t\t\tcase FEATURES.SUBTITLES:\n\t\t\t\treturn import(\"../hooks/useEnhancedSubtitles\")\n\n\t\t\tcase FEATURES.PLAYLISTS:\n\t\t\t\treturn import(\"../components/enhanced/advanced-features\") // Use existing features\n\n\t\t\tcase FEATURES.ADVANCED_CONTROLS:\n\t\t\t\treturn import(\"../components/enhanced/advanced-features\")\n\n\t\t\tcase FEATURES.ANALYTICS:\n\t\t\t\treturn import(\"../components/enhanced/advanced-features\") // Use existing features\n\n\t\t\tcase FEATURES.PICTURE_IN_PICTURE:\n\t\t\t\treturn import(\"../components/enhanced/advanced-features\") // Use existing features\n\n\t\t\tcase FEATURES.QUALITY_SELECTOR:\n\t\t\t\treturn import(\"../components/enhanced/advanced-features\") // Use existing features\n\n\t\t\tcase FEATURES.PLAYBACK_SPEED:\n\t\t\t\treturn import(\"../components/enhanced/advanced-features\") // Use existing features\n\n\t\t\tcase FEATURES.CHAPTERS:\n\t\t\t\treturn import(\"../components/enhanced/advanced-features\") // Use existing features\n\n\t\t\tcase FEATURES.THUMBNAILS:\n\t\t\t\treturn import(\"../components/enhanced/advanced-features\") // Use existing features\n\n\t\t\tcase FEATURES.KEYBOARD_SHORTCUTS:\n\t\t\t\treturn import(\"../hooks/use-keyboard-controls\")\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown feature: ${feature}`)\n\t\t}\n\t}\n\n\tprivate getLoadedFeature(feature: FeatureType) {\n\t\t// Return cached feature instance\n\t\treturn this.loadingPromises.get(feature)\n\t}\n\n\t// Preload features for faster access\n\tasync preloadFeatures(features: FeatureType[] = this.config.enabledFeatures) {\n\t\tconst preloadPromises = features.map((feature) => this.loadFeature(feature))\n\t\tawait Promise.allSettled(preloadPromises)\n\t}\n\n\t// Get loading state\n\tgetLoadingState() {\n\t\treturn {\n\t\t\tloaded: Array.from(this.loadedFeatures),\n\t\t\tloading: Array.from(this.loadingPromises.keys()),\n\t\t\tenabled: this.config.enabledFeatures\n\t\t}\n\t}\n}\n\n// Global progressive loader instance\nexport const progressiveLoader = new ProgressiveLoader()\n\n// React hook for progressive loading\nexport function useProgressiveFeature<T = any>(\n\tfeature: FeatureType\n): {\n\tfeature: T | null\n\tloading: boolean\n\terror: Error | null\n\tload: () => Promise<void>\n} {\n\tconst [featureModule, setFeatureModule] = React.useState<T | null>(null)\n\tconst [loading, setLoading] = React.useState(false)\n\tconst [error, setError] = React.useState<Error | null>(null)\n\n\tconst load = React.useCallback(async () => {\n\t\tif (loading || featureModule) return\n\n\t\tsetLoading(true)\n\t\tsetError(null)\n\n\t\ttry {\n\t\t\tconst module = await progressiveLoader.loadFeature<T>(feature)\n\t\t\tsetFeatureModule(module)\n\t\t} catch (err) {\n\t\t\tsetError(err as Error)\n\t\t} finally {\n\t\t\tsetLoading(false)\n\t\t}\n\t}, [feature, loading, featureModule])\n\n\t// Auto-load if strategy is immediate\n\tReact.useEffect(() => {\n\t\tif (progressiveLoader[\"config\"].loadingStrategy === \"immediate\") {\n\t\t\tload()\n\t\t}\n\t}, [load])\n\n\treturn {\n\t\tfeature: featureModule,\n\t\tloading,\n\t\terror,\n\t\tload\n\t}\n}\n\n// HOC for progressive feature loading\nexport function withProgressiveFeature<P extends object>(\n\tWrappedComponent: React.ComponentType<P>,\n\tfeature: FeatureType,\n\tfallback?: React.ComponentType<P>\n) {\n\treturn function ProgressiveFeatureWrapper(props: P) {\n\t\tconst { feature: featureModule, loading, error } = useProgressiveFeature(feature)\n\n\t\tif (loading) {\n\t\t\treturn <div className=\"h-8 animate-pulse rounded bg-gray-200\" />\n\t\t}\n\n\t\tif (error || !featureModule) {\n\t\t\tconst Fallback = fallback\n\t\t\treturn Fallback ? <Fallback {...props} /> : null\n\t\t}\n\n\t\treturn <WrappedComponent {...props} />\n\t}\n}\n","// Core architecture exports\n\n// Plugin system\nexport * from \"./plugins\"\n\n// Event system\nexport * from \"./events\"\n\n// Service providers\nexport * from \"./providers/service-provider\"\n\n// Version\nexport const CORE_ARCHITECTURE_VERSION = \"1.0.0\"\n\n// Architecture utilities\nexport { createArchitecture } from \"./utils\"\n\n// Progressive loading system\nexport * from \"./progressive-loading\"\n\n// Performance monitoring and testing\nexport * from \"./performance\"\n"],"names":["PerformanceBenchmark","__publicField","PerformanceRegressionDetector","config","testFunction","renderTimes","memoryBefore","memoryAfter","error","i","startTime","endTime","err","averageRenderTime","sum","time","minRenderTime","maxRenderTime","memoryUsage","passed","result","componentName","renderFunction","expectedRenderTime","bundlePath","expectedLoadTime","response","iterations","memoryIncrease","hasMemoryLeak","interactionFunction","expectedDelay","currentMetrics","baselineMetrics","regressions","totalTests","passedTests","failedTests","passRate","summary","report","index","performanceBenchmark","performanceTestUtils","Component","props","hookFunction","hookName","expectedExecutionTime","operation","operationName","expectedTime","beforeFunction","afterFunction","featureName","beforeMemory","beforeTime","midMemory","midTime","afterMemory","afterTime","PerformanceTestFramework","suiteName","tests","testImplementations","results","test","implementation","implementations","allResults","suiteImplementations","performanceTestFramework","defaultPerformanceBudgets","PerformanceBudgetMonitor","budgets","alertConfig","budget","metricName","value","category","violations","name","violation","distPath","metrics","allViolations","now","v","message","channel","actualValue","overageAmount","overagePercentage","unit","bytes","updates","existing","since","byCategory","bySeverity","severity","performanceBudgetMonitor","defaultMediaLoadingConfig","NetworkMonitor","isOnline","newInfo","listener","blob","timeInSeconds","MediaLoadingOptimizer","networkInfo","mediaUrl","element","options","loadingStrategy","effectiveType","threshold","maxBitrate","availableBandwidth","url","maxSize","preloadPromise","reader","chunks","bytesRead","done","stallStartTime","updateMetrics","bufferedEnd","currentTime","onLoadStart","onCanPlay","onWaiting","onPlaying","onProgress","bufferedBytes","quality","completedLoads","m","statsByNetwork","network","networkType","mediaLoadingOptimizer","useMediaLoadingOptimizer","optimizer","React","setNetworkInfo","loadingMetrics","setLoadingMetrics","unsubscribe","interval","optimizeLoading","LocalStorageService","key","item","NoOpAnalyticsService","event","data","userId","traits","properties","ServiceContext","createContext","ServiceProvider","children","services","container","useMemo","logger","ConsolePluginLogger","eventBus","EventBus","pluginRegistry","PluginRegistry","storage","analytics","useServices","context","useContext","useServiceEventBus","usePluginRegistry","useStorage","useAnalytics","useLogger","withServices","jsx","createArchitecture","FEATURES","defaultProgressiveConfig","lazyComponents","lazy","n","module","FeatureDetector","feature","supported","ProgressiveLoader","loadingPromise","attempt","resolve","features","preloadPromises","progressiveLoader","useProgressiveFeature","featureModule","setFeatureModule","loading","setLoading","setError","load","withProgressiveFeature","WrappedComponent","fallback","Fallback","CORE_ARCHITECTURE_VERSION"],"mappings":"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"}