@therealtinhtute/baroiplayer 1.0.8 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -2
- package/README.md +15 -15
- package/dist/context/media.js +2 -0
- package/dist/context/media.js.map +1 -0
- package/dist/context/media.mjs +15 -0
- package/dist/context/media.mjs.map +1 -0
- package/dist/context/store.js +2 -0
- package/dist/context/store.js.map +1 -0
- package/dist/context/store.mjs +5 -0
- package/dist/context/store.mjs.map +1 -0
- package/dist/context-BYwDoSRX.js +1172 -0
- package/dist/context-BYwDoSRX.js.map +1 -0
- package/dist/context-eNS62_ac.cjs +23 -0
- package/dist/context-eNS62_ac.cjs.map +1 -0
- package/dist/core-events-B1iM2F46.cjs +2 -0
- package/dist/core-events-B1iM2F46.cjs.map +1 -0
- package/dist/core-events-DunPHKRE.js +484 -0
- package/dist/core-events-DunPHKRE.js.map +1 -0
- package/dist/core-plugins-CROGvQUy.js +686 -0
- package/dist/core-plugins-CROGvQUy.js.map +1 -0
- package/dist/core-plugins-DtsHBOtF.cjs +2 -0
- package/dist/core-plugins-DtsHBOtF.cjs.map +1 -0
- package/dist/core.js +37 -0
- package/dist/core.js.map +1 -0
- package/dist/core.mjs +1233 -0
- package/dist/core.mjs.map +1 -0
- package/dist/enhanced-components-DUw2KrmQ.js +1142 -0
- package/dist/enhanced-components-DUw2KrmQ.js.map +1 -0
- package/dist/enhanced-components-DXBCHU0v.cjs +2 -0
- package/dist/enhanced-components-DXBCHU0v.cjs.map +1 -0
- package/dist/hooks-BW-JjVgP.cjs +4 -0
- package/dist/hooks-BW-JjVgP.cjs.map +1 -0
- package/dist/hooks-CyX6De5M.js +1693 -0
- package/dist/hooks-CyX6De5M.js.map +1 -0
- package/dist/index.css +1 -102
- package/dist/index.js +112 -21
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +6275 -16
- package/dist/index.mjs.map +1 -0
- package/dist/minimal-components-Bdcpxav5.cjs +2 -0
- package/dist/minimal-components-Bdcpxav5.cjs.map +1 -0
- package/dist/minimal-components-DlRK7Qu_.js +1927 -0
- package/dist/minimal-components-DlRK7Qu_.js.map +1 -0
- package/dist/minimal-components.css +1 -589
- package/dist/mona-loading.gif +0 -0
- package/dist/performance-monitor-C5k6FDXw.js +301 -0
- package/dist/performance-monitor-C5k6FDXw.js.map +1 -0
- package/dist/performance-monitor-lJmuUjQQ.cjs +2 -0
- package/dist/performance-monitor-lJmuUjQQ.cjs.map +1 -0
- package/dist/utils-CFOue_9K.cjs +9 -0
- package/dist/utils-CFOue_9K.cjs.map +1 -0
- package/dist/utils-Dzpl2ArK.js +2844 -0
- package/dist/utils-Dzpl2ArK.js.map +1 -0
- package/dist/utils.js +2 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.mjs +11 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +11 -40
- package/src/adapters/videojs-adapter.tsx +441 -441
- package/src/components/AnimateLoading.tsx +85 -93
- package/src/components/LoadingState.tsx +199 -208
- package/src/components/__tests__/media-player-accessibility.test.tsx +510 -0
- package/src/components/__tests__/media-player-react19.test.tsx +457 -0
- package/src/components/accessibility/keyboard-help-overlay.tsx +199 -207
- package/src/components/basic/index.ts +28 -28
- package/src/components/enhanced/advanced-features.tsx +49 -54
- package/src/components/enhanced/debug-panel.tsx +148 -122
- package/src/components/enhanced/enhanced-controls.tsx +117 -120
- package/src/components/enhanced/enhanced-media-player.tsx +228 -214
- package/src/components/enhanced/error-handling.tsx +50 -57
- package/src/components/enhanced/index.ts +27 -27
- package/src/components/enhanced/media-player-enhanced.tsx +117 -83
- package/src/components/examples/basic-video-player.tsx +35 -40
- package/src/components/examples/enhanced-controls-example.tsx +16 -30
- package/src/components/examples/enhanced-media-player-example.tsx +196 -187
- package/src/components/examples/loading-states-demo.tsx +113 -113
- package/src/components/examples/react-19-demo.tsx +88 -116
- package/src/components/examples/volume-orientation-demo.tsx +77 -85
- package/src/components/icon-demo.tsx +189 -202
- package/src/components/icons/svg-icons/ArrowLeftIcon.tsx +13 -13
- package/src/components/icons/svg-icons/ArrowRightIcon.tsx +13 -13
- package/src/components/icons/svg-icons/AudioIcon.tsx +16 -16
- package/src/components/icons/svg-icons/BackwardIcon.tsx +7 -7
- package/src/components/icons/svg-icons/CameraIcon.tsx +13 -13
- package/src/components/icons/svg-icons/CheckIcon.tsx +13 -13
- package/src/components/icons/svg-icons/EnablePiPIcon.tsx +13 -13
- package/src/components/icons/svg-icons/ForwardIcon.tsx +7 -7
- package/src/components/icons/svg-icons/FullscreenEnterIcon.tsx +18 -18
- package/src/components/icons/svg-icons/FullscreenExitIcon.tsx +18 -18
- package/src/components/icons/svg-icons/LoadingIcon.tsx +27 -27
- package/src/components/icons/svg-icons/PauseIcon.tsx +18 -18
- package/src/components/icons/svg-icons/PlayIcon.tsx +16 -16
- package/src/components/icons/svg-icons/PlaybackSpeedIcon.tsx +18 -18
- package/src/components/icons/svg-icons/QualityIcon.tsx +16 -16
- package/src/components/icons/svg-icons/SettingsIcon.tsx +7 -7
- package/src/components/icons/svg-icons/SliderIcon.tsx +16 -16
- package/src/components/icons/svg-icons/SubtitleIcon.tsx +16 -16
- package/src/components/icons/svg-icons/SubtitleOffIcon.tsx +20 -20
- package/src/components/icons/svg-icons/UnPiPIcon.tsx +13 -13
- package/src/components/icons/svg-icons/VolumeMutedIcon.tsx +11 -11
- package/src/components/icons/svg-icons/VolumeOneIcon.tsx +17 -17
- package/src/components/icons/svg-icons/VolumeThreeIcon.tsx +11 -11
- package/src/components/icons/svg-icons/VolumeTwoIcon.tsx +11 -11
- package/src/components/legacy.tsx +8 -14
- package/src/components/media-metadata-display.tsx +78 -79
- package/src/components/media-player-controls.tsx +37 -40
- package/src/components/media-player-error.tsx +2 -2
- package/src/components/media-player-fullscreen.tsx +2 -2
- package/src/components/media-player-hls.tsx +89 -89
- package/src/components/media-player-play.tsx +2 -2
- package/src/components/media-player-root.tsx +20 -22
- package/src/components/media-player-seek.tsx +1 -1
- package/src/components/media-player-tooltip.tsx +1 -1
- package/src/components/media-player-video.tsx +28 -6
- package/src/components/media-player-volume.tsx +3 -3
- package/src/components/media-player.tsx +209 -174
- package/src/components/media-suspense.tsx +71 -89
- package/src/components/player-settings-form.tsx +143 -148
- package/src/components/react-player-wrapper.tsx +23 -23
- package/src/components/simple-video-player.tsx +53 -51
- package/src/components/ui/blur-poster.tsx +93 -0
- package/src/components/ui/empty-state.tsx +91 -0
- package/src/components/ui/enhanced-seek-bar.tsx +75 -56
- package/src/components/ui/error-state.tsx +124 -0
- package/src/components/ui/fullscreen-button.tsx +71 -50
- package/src/components/ui/loading-skeleton.tsx +107 -0
- package/src/components/ui/media-resource-preloader.tsx +265 -198
- package/src/components/ui/offline-message.tsx +98 -0
- package/src/components/ui/play-button.tsx +79 -87
- package/src/components/ui/seek-bar.tsx +170 -140
- package/src/components/ui/time-display.tsx +33 -12
- package/src/components/ui/volume-control.tsx +91 -44
- package/src/components/unified/base-media-player.tsx +45 -51
- package/src/components/unified/media-player.tsx +3 -3
- package/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +508 -502
- package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +108 -87
- package/src/components/variants/minimal/MinimalControls.tsx +100 -118
- package/src/components/variants/minimal/MinimalLoading.tsx +19 -23
- package/src/components/variants/minimal/MinimalMediaPlayer.tsx +283 -280
- package/src/components/variants/minimal/MinimalOverlay.tsx +43 -49
- package/src/components/variants/minimal/MinimalPlayButton.tsx +44 -53
- package/src/components/variants/minimal/MinimalSeekBar.tsx +130 -140
- package/src/components/variants/minimal/MinimalVolumeControl.tsx +59 -64
- package/src/components/variants/minimal/SimpleMinimalPlayer.tsx +29 -32
- package/src/components/variants/minimal/components/CenterPlayButton.tsx +1 -1
- package/src/components/variants/minimal/components/ControlBar.tsx +7 -11
- package/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +381 -330
- package/src/components/variants/minimal/components/PlaybackControls.tsx +6 -11
- package/src/components/variants/minimal/components/RightControls.tsx +8 -17
- package/src/components/variants/minimal/components/SeekBar.tsx +16 -20
- package/src/components/variants/minimal/components/SettingsDropdown.tsx +12 -14
- package/src/components/variants/minimal/components/SubtitleDisplay.tsx +1 -1
- package/src/components/variants/minimal/components/TimeDisplay.tsx +2 -5
- package/src/components/variants/minimal/components/VideoElement.tsx +3 -10
- package/src/components/variants/minimal/components/VolumeControl.tsx +42 -39
- package/src/components/video-player.tsx +10 -10
- package/src/context/__tests__/media-store.test.ts +509 -0
- package/src/context/error-handling.ts +106 -102
- package/src/context/media-context.tsx +56 -10
- package/src/context/media-provider.tsx +16 -17
- package/src/context/media-store.ts +68 -60
- package/src/context/persistence.ts +74 -65
- package/src/core/events/event-system.ts +422 -416
- package/src/core/events/hooks.ts +275 -252
- package/src/core/events/index.ts +14 -14
- package/src/core/events/middleware.ts +269 -252
- package/src/core/index.ts +8 -8
- package/src/core/optimization/bundle-optimizer.tsx +65 -60
- package/src/core/performance/cicd.ts +91 -89
- package/src/core/performance/index.ts +22 -22
- package/src/core/performance/media-loading-optimizer.ts +518 -512
- package/src/core/performance/performance-budgets.ts +414 -409
- package/src/core/performance/performance-monitor.tsx +451 -439
- package/src/core/performance/performance-testing.ts +439 -437
- package/src/core/plugins/__tests__/registry.test.ts +595 -0
- package/src/core/plugins/base-plugin.ts +197 -196
- package/src/core/plugins/enhanced-plugin-system.ts +136 -136
- package/src/core/plugins/examples/analytics-plugin.ts +229 -230
- package/src/core/plugins/index.ts +26 -26
- package/src/core/plugins/registry.ts +315 -323
- package/src/core/plugins/types.ts +97 -105
- package/src/core/plugins/utils.ts +292 -291
- package/src/core/progressive-loading.tsx +297 -288
- package/src/core/providers/enhanced-hls-provider.ts +118 -90
- package/src/core/providers/lazy-provider.tsx +51 -0
- package/src/core/providers/service-provider.tsx +104 -108
- package/src/core/utils.tsx +22 -26
- package/src/features/media-session/media-session-manager.ts +406 -402
- package/src/features/picture-in-picture/pip-manager.ts +364 -365
- package/src/features/playlist/playlist-manager.ts +597 -585
- package/src/features/subtitles/subtitle-manager.ts +424 -430
- package/src/features/subtitles/subtitle-parser.ts +274 -273
- package/src/features/thumbnails/thumbnail-generator.ts +504 -502
- package/src/hooks/__tests__/use-media-player.test.ts +712 -0
- package/src/hooks/__tests__/use-media-state.test.tsx +316 -0
- package/src/hooks/accessibility/index.ts +20 -20
- package/src/hooks/accessibility/use-accessibility-preferences.ts +177 -175
- package/src/hooks/accessibility/use-focus-management.ts +170 -163
- package/src/hooks/accessibility/use-keyboard-shortcuts.ts +132 -124
- package/src/hooks/accessibility/use-screen-reader.ts +191 -161
- package/src/hooks/core/index.ts +30 -30
- package/src/hooks/legacy.ts +3 -9
- package/src/hooks/use-buffer-health.ts +218 -0
- package/src/hooks/use-enhanced-media-player.ts +74 -82
- package/src/hooks/use-focus-trap.tsx +162 -0
- package/src/hooks/use-intelligent-preloading.ts +236 -232
- package/src/hooks/use-keyboard-controls.ts +80 -80
- package/src/hooks/use-keyboard-shortcuts.ts +255 -0
- package/src/hooks/use-media-actions.ts +81 -72
- package/src/hooks/use-media-metadata.ts +75 -73
- package/src/hooks/use-media-optimistic.ts +145 -151
- package/src/hooks/use-media-player.ts +109 -107
- package/src/hooks/use-media-state.ts +63 -59
- package/src/hooks/use-memory-optimization.ts +119 -117
- package/src/hooks/use-network-status.ts +124 -0
- package/src/hooks/use-optimistic-controls.ts +91 -88
- package/src/hooks/use-optimized-media.ts +76 -56
- package/src/hooks/use-smart-preload.ts +230 -0
- package/src/hooks/use-touch-gestures.ts +427 -383
- package/src/hooks/useEnhancedSubtitles.ts +245 -245
- package/src/hooks/useKeyboardShortcuts.ts +52 -52
- package/src/hooks/useMediaControls.ts +22 -22
- package/src/hooks/useScreenshot.ts +51 -47
- package/src/hooks/useSubtitles.ts +53 -53
- package/src/hooks/useVideoPlayer.ts +61 -61
- package/src/icons/components/FullscreenIcon.tsx +34 -35
- package/src/icons/components/SettingsIcon.tsx +35 -36
- package/src/icons/components/animated/LoadingIcon.tsx +25 -41
- package/src/icons/components/animated/PlayPauseIcon.tsx +38 -46
- package/src/icons/components/media/PauseIcon.tsx +36 -37
- package/src/icons/components/media/PlayIcon.tsx +35 -36
- package/src/icons/components/volume/VolumeIcon.tsx +36 -37
- package/src/icons/components/volume/VolumeOffIcon.tsx +36 -37
- package/src/icons/index.ts +38 -38
- package/src/icons/provider.tsx +40 -46
- package/src/icons/types.ts +51 -31
- package/src/index-enhanced.ts +10 -10
- package/src/index-legacy.ts +3 -4
- package/src/index.css +80 -80
- package/src/index.ts +8 -23
- package/src/lib/__tests__/async-utils.test.ts +291 -0
- package/src/lib/async-utils.ts +194 -0
- package/src/lib/deprecation.ts +4 -4
- package/src/lib/index.ts +3 -2
- package/src/lib/utils.ts +3 -3
- package/src/styles/globals.css +3 -3
- package/src/styles/minimal-player.css +606 -574
- package/src/styles/pixel-art.css +23 -28
- package/src/styles/videojs.css +43 -43
- package/src/test/accessibility-utils.ts +208 -0
- package/src/test/browser-simulation.ts +235 -0
- package/src/test/media-mocks.ts +156 -0
- package/src/test/performance-utils.ts +192 -0
- package/src/test/setup.ts +241 -44
- package/src/types/events.ts +30 -30
- package/src/types/formats.ts +56 -72
- package/src/types/index.ts +5 -40
- package/src/types/videojs-plugins.d.ts +6 -6
- package/dist/index.d.ts +0 -1425
- package/dist/package.json +0 -62
- package/dist/src/adapters/videojs-adapter.d.ts +0 -38
- package/dist/src/adapters/videojs-adapter.tsx +0 -470
- package/dist/src/components/AnimateLoading.d.ts +0 -9
- package/dist/src/components/AnimateLoading.tsx +0 -115
- package/dist/src/components/LoadingState.d.ts +0 -33
- package/dist/src/components/LoadingState.tsx +0 -248
- package/dist/src/components/accessibility/keyboard-help-overlay.d.ts +0 -17
- package/dist/src/components/accessibility/keyboard-help-overlay.tsx +0 -213
- package/dist/src/components/audio-player.d.ts +0 -3
- package/dist/src/components/audio-player.tsx +0 -85
- package/dist/src/components/basic/index.d.ts +0 -26
- package/dist/src/components/basic/index.ts +0 -37
- package/dist/src/components/enhanced/advanced-features.d.ts +0 -45
- package/dist/src/components/enhanced/advanced-features.tsx +0 -316
- package/dist/src/components/enhanced/debug-panel.d.ts +0 -70
- package/dist/src/components/enhanced/debug-panel.tsx +0 -422
- package/dist/src/components/enhanced/enhanced-controls.d.ts +0 -50
- package/dist/src/components/enhanced/enhanced-controls.tsx +0 -600
- package/dist/src/components/enhanced/enhanced-media-player.d.ts +0 -26
- package/dist/src/components/enhanced/enhanced-media-player.tsx +0 -509
- package/dist/src/components/enhanced/error-handling.d.ts +0 -36
- package/dist/src/components/enhanced/error-handling.tsx +0 -345
- package/dist/src/components/enhanced/index.d.ts +0 -7
- package/dist/src/components/enhanced/index.ts +0 -39
- package/dist/src/components/enhanced/media-player-enhanced.d.ts +0 -21
- package/dist/src/components/enhanced/media-player-enhanced.tsx +0 -349
- package/dist/src/components/examples/basic-video-player.d.ts +0 -10
- package/dist/src/components/examples/basic-video-player.tsx +0 -55
- package/dist/src/components/examples/custom-controls-example.d.ts +0 -10
- package/dist/src/components/examples/custom-controls-example.tsx +0 -63
- package/dist/src/components/examples/enhanced-controls-example.d.ts +0 -9
- package/dist/src/components/examples/enhanced-controls-example.tsx +0 -114
- package/dist/src/components/examples/enhanced-media-player-example.d.ts +0 -9
- package/dist/src/components/examples/enhanced-media-player-example.tsx +0 -293
- package/dist/src/components/examples/loading-states-demo.d.ts +0 -2
- package/dist/src/components/examples/loading-states-demo.tsx +0 -142
- package/dist/src/components/examples/react-19-demo.d.ts +0 -10
- package/dist/src/components/examples/react-19-demo.tsx +0 -381
- package/dist/src/components/examples/volume-orientation-demo.d.ts +0 -2
- package/dist/src/components/examples/volume-orientation-demo.tsx +0 -114
- package/dist/src/components/icon-demo.d.ts +0 -2
- package/dist/src/components/icon-demo.tsx +0 -209
- package/dist/src/components/icons/index.d.ts +0 -36
- package/dist/src/components/icons/index.tsx +0 -166
- package/dist/src/components/icons/svg-icons/ArrowLeftIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/ArrowLeftIcon.tsx +0 -18
- package/dist/src/components/icons/svg-icons/ArrowRightIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/ArrowRightIcon.tsx +0 -18
- package/dist/src/components/icons/svg-icons/AudioIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/AudioIcon.tsx +0 -22
- package/dist/src/components/icons/svg-icons/BackwardIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/BackwardIcon.tsx +0 -12
- package/dist/src/components/icons/svg-icons/CameraIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/CameraIcon.tsx +0 -19
- package/dist/src/components/icons/svg-icons/CheckIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/CheckIcon.tsx +0 -19
- package/dist/src/components/icons/svg-icons/EnablePiPIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/EnablePiPIcon.tsx +0 -17
- package/dist/src/components/icons/svg-icons/ForwardIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/ForwardIcon.tsx +0 -12
- package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.tsx +0 -23
- package/dist/src/components/icons/svg-icons/FullscreenExitIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/FullscreenExitIcon.tsx +0 -23
- package/dist/src/components/icons/svg-icons/LoadingIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/LoadingIcon.tsx +0 -32
- package/dist/src/components/icons/svg-icons/PauseIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/PauseIcon.tsx +0 -23
- package/dist/src/components/icons/svg-icons/PlayIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/PlayIcon.tsx +0 -21
- package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.tsx +0 -23
- package/dist/src/components/icons/svg-icons/QualityIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/QualityIcon.tsx +0 -21
- package/dist/src/components/icons/svg-icons/SettingsIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/SettingsIcon.tsx +0 -12
- package/dist/src/components/icons/svg-icons/SliderIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/SliderIcon.tsx +0 -21
- package/dist/src/components/icons/svg-icons/SubtitleIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/SubtitleIcon.tsx +0 -21
- package/dist/src/components/icons/svg-icons/SubtitleOffIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/SubtitleOffIcon.tsx +0 -25
- package/dist/src/components/icons/svg-icons/UnPiPIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/UnPiPIcon.tsx +0 -17
- package/dist/src/components/icons/svg-icons/VolumeMutedIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/VolumeMutedIcon.tsx +0 -16
- package/dist/src/components/icons/svg-icons/VolumeOneIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/VolumeOneIcon.tsx +0 -22
- package/dist/src/components/icons/svg-icons/VolumeThreeIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/VolumeThreeIcon.tsx +0 -16
- package/dist/src/components/icons/svg-icons/VolumeTwoIcon.d.ts +0 -4
- package/dist/src/components/icons/svg-icons/VolumeTwoIcon.tsx +0 -16
- package/dist/src/components/legacy.d.ts +0 -13
- package/dist/src/components/legacy.tsx +0 -93
- package/dist/src/components/media-metadata-display.d.ts +0 -11
- package/dist/src/components/media-metadata-display.tsx +0 -100
- package/dist/src/components/media-player-audio.d.ts +0 -9
- package/dist/src/components/media-player-audio.tsx +0 -39
- package/dist/src/components/media-player-controls.d.ts +0 -23
- package/dist/src/components/media-player-controls.tsx +0 -226
- package/dist/src/components/media-player-error.d.ts +0 -16
- package/dist/src/components/media-player-error.tsx +0 -163
- package/dist/src/components/media-player-fullscreen.d.ts +0 -12
- package/dist/src/components/media-player-fullscreen.tsx +0 -109
- package/dist/src/components/media-player-hls.d.ts +0 -23
- package/dist/src/components/media-player-hls.tsx +0 -111
- package/dist/src/components/media-player-loading.d.ts +0 -12
- package/dist/src/components/media-player-loading.tsx +0 -76
- package/dist/src/components/media-player-play.d.ts +0 -11
- package/dist/src/components/media-player-play.tsx +0 -75
- package/dist/src/components/media-player-root.d.ts +0 -28
- package/dist/src/components/media-player-root.tsx +0 -340
- package/dist/src/components/media-player-seek.d.ts +0 -15
- package/dist/src/components/media-player-seek.tsx +0 -168
- package/dist/src/components/media-player-time.d.ts +0 -12
- package/dist/src/components/media-player-time.tsx +0 -99
- package/dist/src/components/media-player-tooltip.d.ts +0 -13
- package/dist/src/components/media-player-tooltip.tsx +0 -58
- package/dist/src/components/media-player-video.d.ts +0 -9
- package/dist/src/components/media-player-video.tsx +0 -39
- package/dist/src/components/media-player-volume.d.ts +0 -13
- package/dist/src/components/media-player-volume.tsx +0 -155
- package/dist/src/components/media-player.d.ts +0 -3
- package/dist/src/components/media-player.tsx +0 -257
- package/dist/src/components/media-suspense.d.ts +0 -78
- package/dist/src/components/media-suspense.tsx +0 -362
- package/dist/src/components/player-settings-form.d.ts +0 -8
- package/dist/src/components/player-settings-form.tsx +0 -163
- package/dist/src/components/react-player-wrapper.d.ts +0 -64
- package/dist/src/components/react-player-wrapper.tsx +0 -651
- package/dist/src/components/simple-video-player.d.ts +0 -9
- package/dist/src/components/simple-video-player.tsx +0 -60
- package/dist/src/components/ui/button.tsx +0 -49
- package/dist/src/components/ui/dropdown-menu.tsx +0 -137
- package/dist/src/components/ui/enhanced-seek-bar.d.ts +0 -3
- package/dist/src/components/ui/enhanced-seek-bar.tsx +0 -235
- package/dist/src/components/ui/fullscreen-button.d.ts +0 -3
- package/dist/src/components/ui/fullscreen-button.tsx +0 -60
- package/dist/src/components/ui/icons.tsx +0 -174
- package/dist/src/components/ui/media-resource-preloader.d.ts +0 -21
- package/dist/src/components/ui/media-resource-preloader.tsx +0 -393
- package/dist/src/components/ui/play-button.d.ts +0 -3
- package/dist/src/components/ui/play-button.tsx +0 -107
- package/dist/src/components/ui/seek-bar.d.ts +0 -3
- package/dist/src/components/ui/seek-bar.tsx +0 -161
- package/dist/src/components/ui/slider.tsx +0 -55
- package/dist/src/components/ui/time-display.d.ts +0 -3
- package/dist/src/components/ui/time-display.tsx +0 -40
- package/dist/src/components/ui/tooltip.tsx +0 -131
- package/dist/src/components/ui/volume-control.d.ts +0 -3
- package/dist/src/components/ui/volume-control.tsx +0 -143
- package/dist/src/components/unified/base-media-player.d.ts +0 -18
- package/dist/src/components/unified/base-media-player.tsx +0 -246
- package/dist/src/components/unified/media-player.d.ts +0 -37
- package/dist/src/components/unified/media-player.tsx +0 -75
- package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.d.ts +0 -42
- package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +0 -561
- package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.d.ts +0 -44
- package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +0 -552
- package/dist/src/components/variants/minimal/MinimalControls.d.ts +0 -19
- package/dist/src/components/variants/minimal/MinimalControls.tsx +0 -142
- package/dist/src/components/variants/minimal/MinimalLoading.d.ts +0 -10
- package/dist/src/components/variants/minimal/MinimalLoading.tsx +0 -32
- package/dist/src/components/variants/minimal/MinimalMediaPlayer.d.ts +0 -38
- package/dist/src/components/variants/minimal/MinimalMediaPlayer.tsx +0 -315
- package/dist/src/components/variants/minimal/MinimalOverlay.d.ts +0 -11
- package/dist/src/components/variants/minimal/MinimalOverlay.tsx +0 -64
- package/dist/src/components/variants/minimal/MinimalPlayButton.d.ts +0 -9
- package/dist/src/components/variants/minimal/MinimalPlayButton.tsx +0 -65
- package/dist/src/components/variants/minimal/MinimalSeekBar.d.ts +0 -7
- package/dist/src/components/variants/minimal/MinimalSeekBar.tsx +0 -150
- package/dist/src/components/variants/minimal/MinimalVolumeControl.d.ts +0 -7
- package/dist/src/components/variants/minimal/MinimalVolumeControl.tsx +0 -80
- package/dist/src/components/variants/minimal/SimpleMinimalPlayer.d.ts +0 -22
- package/dist/src/components/variants/minimal/SimpleMinimalPlayer.tsx +0 -209
- package/dist/src/components/variants/minimal/components/CenterPlayButton.d.ts +0 -7
- package/dist/src/components/variants/minimal/components/CenterPlayButton.tsx +0 -22
- package/dist/src/components/variants/minimal/components/ControlBar.d.ts +0 -43
- package/dist/src/components/variants/minimal/components/ControlBar.tsx +0 -146
- package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.d.ts +0 -24
- package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +0 -361
- package/dist/src/components/variants/minimal/components/PlaybackControls.d.ts +0 -9
- package/dist/src/components/variants/minimal/components/PlaybackControls.tsx +0 -51
- package/dist/src/components/variants/minimal/components/RightControls.d.ts +0 -25
- package/dist/src/components/variants/minimal/components/RightControls.tsx +0 -173
- package/dist/src/components/variants/minimal/components/SeekBar.d.ts +0 -11
- package/dist/src/components/variants/minimal/components/SeekBar.tsx +0 -131
- package/dist/src/components/variants/minimal/components/SettingsDropdown.d.ts +0 -9
- package/dist/src/components/variants/minimal/components/SettingsDropdown.tsx +0 -70
- package/dist/src/components/variants/minimal/components/SubtitleDisplay.d.ts +0 -7
- package/dist/src/components/variants/minimal/components/SubtitleDisplay.tsx +0 -21
- package/dist/src/components/variants/minimal/components/TimeDisplay.d.ts +0 -7
- package/dist/src/components/variants/minimal/components/TimeDisplay.tsx +0 -18
- package/dist/src/components/variants/minimal/components/VideoElement.d.ts +0 -13
- package/dist/src/components/variants/minimal/components/VideoElement.tsx +0 -40
- package/dist/src/components/variants/minimal/components/VolumeControl.d.ts +0 -13
- package/dist/src/components/variants/minimal/components/VolumeControl.tsx +0 -217
- package/dist/src/components/variants/minimal/index.d.ts +0 -17
- package/dist/src/components/variants/minimal/index.ts +0 -23
- package/dist/src/components/video-player.d.ts +0 -3
- package/dist/src/components/video-player.tsx +0 -100
- package/dist/src/context/error-handling.d.ts +0 -72
- package/dist/src/context/error-handling.ts +0 -394
- package/dist/src/context/media-context.d.ts +0 -104
- package/dist/src/context/media-context.tsx +0 -208
- package/dist/src/context/media-provider.d.ts +0 -26
- package/dist/src/context/media-provider.tsx +0 -265
- package/dist/src/context/media-store.d.ts +0 -33
- package/dist/src/context/media-store.ts +0 -379
- package/dist/src/context/persistence.d.ts +0 -83
- package/dist/src/context/persistence.ts +0 -453
- package/dist/src/core/events/event-system.d.ts +0 -170
- package/dist/src/core/events/event-system.ts +0 -442
- package/dist/src/core/events/hooks.d.ts +0 -33
- package/dist/src/core/events/hooks.ts +0 -302
- package/dist/src/core/events/index.d.ts +0 -6
- package/dist/src/core/events/index.ts +0 -22
- package/dist/src/core/events/middleware.d.ts +0 -39
- package/dist/src/core/events/middleware.ts +0 -269
- package/dist/src/core/index.d.ts +0 -8
- package/dist/src/core/index.ts +0 -22
- package/dist/src/core/optimization/bundle-optimizer.d.ts +0 -44
- package/dist/src/core/optimization/bundle-optimizer.tsx +0 -308
- package/dist/src/core/performance/cicd.d.ts +0 -8
- package/dist/src/core/performance/cicd.ts +0 -96
- package/dist/src/core/performance/index.d.ts +0 -10
- package/dist/src/core/performance/index.ts +0 -38
- package/dist/src/core/performance/media-loading-optimizer.d.ts +0 -105
- package/dist/src/core/performance/media-loading-optimizer.ts +0 -538
- package/dist/src/core/performance/performance-budgets.d.ts +0 -68
- package/dist/src/core/performance/performance-budgets.ts +0 -432
- package/dist/src/core/performance/performance-monitor.d.ts +0 -95
- package/dist/src/core/performance/performance-monitor.tsx +0 -476
- package/dist/src/core/performance/performance-testing.d.ts +0 -69
- package/dist/src/core/performance/performance-testing.ts +0 -459
- package/dist/src/core/plugins/base-plugin.d.ts +0 -52
- package/dist/src/core/plugins/base-plugin.ts +0 -224
- package/dist/src/core/plugins/enhanced-plugin-system.d.ts +0 -160
- package/dist/src/core/plugins/enhanced-plugin-system.ts +0 -417
- package/dist/src/core/plugins/examples/analytics-plugin.d.ts +0 -30
- package/dist/src/core/plugins/examples/analytics-plugin.ts +0 -242
- package/dist/src/core/plugins/index.d.ts +0 -8
- package/dist/src/core/plugins/index.ts +0 -39
- package/dist/src/core/plugins/registry.d.ts +0 -31
- package/dist/src/core/plugins/registry.ts +0 -327
- package/dist/src/core/plugins/types.d.ts +0 -101
- package/dist/src/core/plugins/types.ts +0 -159
- package/dist/src/core/plugins/utils.d.ts +0 -38
- package/dist/src/core/plugins/utils.ts +0 -316
- package/dist/src/core/progressive-loading.d.ts +0 -88
- package/dist/src/core/progressive-loading.tsx +0 -322
- package/dist/src/core/providers/enhanced-hls-provider.d.ts +0 -50
- package/dist/src/core/providers/enhanced-hls-provider.ts +0 -308
- package/dist/src/core/providers/service-provider.d.ts +0 -49
- package/dist/src/core/providers/service-provider.tsx +0 -168
- package/dist/src/core/utils.d.ts +0 -25
- package/dist/src/core/utils.tsx +0 -38
- package/dist/src/features/media-session/media-session-manager.d.ts +0 -132
- package/dist/src/features/media-session/media-session-manager.ts +0 -429
- package/dist/src/features/picture-in-picture/pip-manager.d.ts +0 -94
- package/dist/src/features/picture-in-picture/pip-manager.ts +0 -429
- package/dist/src/features/playlist/playlist-manager.d.ts +0 -208
- package/dist/src/features/playlist/playlist-manager.ts +0 -606
- package/dist/src/features/subtitles/subtitle-manager.d.ts +0 -136
- package/dist/src/features/subtitles/subtitle-manager.ts +0 -441
- package/dist/src/features/subtitles/subtitle-parser.d.ts +0 -60
- package/dist/src/features/subtitles/subtitle-parser.ts +0 -280
- package/dist/src/features/thumbnails/thumbnail-generator.d.ts +0 -136
- package/dist/src/features/thumbnails/thumbnail-generator.ts +0 -519
- package/dist/src/hooks/accessibility/index.d.ts +0 -5
- package/dist/src/hooks/accessibility/index.ts +0 -27
- package/dist/src/hooks/accessibility/use-accessibility-preferences.d.ts +0 -14
- package/dist/src/hooks/accessibility/use-accessibility-preferences.ts +0 -188
- package/dist/src/hooks/accessibility/use-focus-management.d.ts +0 -31
- package/dist/src/hooks/accessibility/use-focus-management.ts +0 -176
- package/dist/src/hooks/accessibility/use-keyboard-shortcuts.d.ts +0 -38
- package/dist/src/hooks/accessibility/use-keyboard-shortcuts.ts +0 -144
- package/dist/src/hooks/accessibility/use-screen-reader.d.ts +0 -22
- package/dist/src/hooks/accessibility/use-screen-reader.ts +0 -182
- package/dist/src/hooks/core/index.d.ts +0 -18
- package/dist/src/hooks/core/index.ts +0 -47
- package/dist/src/hooks/legacy.d.ts +0 -18
- package/dist/src/hooks/legacy.ts +0 -27
- package/dist/src/hooks/use-enhanced-media-player.d.ts +0 -88
- package/dist/src/hooks/use-enhanced-media-player.ts +0 -485
- package/dist/src/hooks/use-intelligent-preloading.d.ts +0 -66
- package/dist/src/hooks/use-intelligent-preloading.ts +0 -363
- package/dist/src/hooks/use-keyboard-controls.d.ts +0 -13
- package/dist/src/hooks/use-keyboard-controls.ts +0 -115
- package/dist/src/hooks/use-media-actions.d.ts +0 -62
- package/dist/src/hooks/use-media-actions.ts +0 -175
- package/dist/src/hooks/use-media-metadata.d.ts +0 -11
- package/dist/src/hooks/use-media-metadata.ts +0 -89
- package/dist/src/hooks/use-media-optimistic.d.ts +0 -36
- package/dist/src/hooks/use-media-optimistic.ts +0 -270
- package/dist/src/hooks/use-media-player.d.ts +0 -31
- package/dist/src/hooks/use-media-player.ts +0 -310
- package/dist/src/hooks/use-media-state.d.ts +0 -17
- package/dist/src/hooks/use-media-state.ts +0 -190
- package/dist/src/hooks/use-memory-optimization.d.ts +0 -40
- package/dist/src/hooks/use-memory-optimization.ts +0 -358
- package/dist/src/hooks/use-mobile.ts +0 -125
- package/dist/src/hooks/use-optimistic-controls.d.ts +0 -22
- package/dist/src/hooks/use-optimistic-controls.ts +0 -92
- package/dist/src/hooks/use-optimized-media.d.ts +0 -46
- package/dist/src/hooks/use-optimized-media.ts +0 -263
- package/dist/src/hooks/use-touch-gestures.d.ts +0 -47
- package/dist/src/hooks/use-touch-gestures.ts +0 -417
- package/dist/src/hooks/useEnhancedSubtitles.d.ts +0 -39
- package/dist/src/hooks/useEnhancedSubtitles.ts +0 -258
- package/dist/src/hooks/useKeyboardShortcuts.d.ts +0 -10
- package/dist/src/hooks/useKeyboardShortcuts.ts +0 -74
- package/dist/src/hooks/useMediaControls.d.ts +0 -9
- package/dist/src/hooks/useMediaControls.ts +0 -52
- package/dist/src/hooks/useScreenshot.d.ts +0 -4
- package/dist/src/hooks/useScreenshot.ts +0 -57
- package/dist/src/hooks/useSubtitles.d.ts +0 -8
- package/dist/src/hooks/useSubtitles.ts +0 -91
- package/dist/src/hooks/useVideoPlayer.d.ts +0 -32
- package/dist/src/hooks/useVideoPlayer.ts +0 -232
- package/dist/src/icons/components/FullscreenIcon.d.ts +0 -3
- package/dist/src/icons/components/FullscreenIcon.tsx +0 -37
- package/dist/src/icons/components/SettingsIcon.d.ts +0 -3
- package/dist/src/icons/components/SettingsIcon.tsx +0 -38
- package/dist/src/icons/components/animated/LoadingIcon.d.ts +0 -3
- package/dist/src/icons/components/animated/LoadingIcon.tsx +0 -43
- package/dist/src/icons/components/animated/PlayPauseIcon.d.ts +0 -7
- package/dist/src/icons/components/animated/PlayPauseIcon.tsx +0 -50
- package/dist/src/icons/components/media/PauseIcon.d.ts +0 -3
- package/dist/src/icons/components/media/PauseIcon.tsx +0 -39
- package/dist/src/icons/components/media/PlayIcon.d.ts +0 -3
- package/dist/src/icons/components/media/PlayIcon.tsx +0 -38
- package/dist/src/icons/components/volume/VolumeIcon.d.ts +0 -3
- package/dist/src/icons/components/volume/VolumeIcon.tsx +0 -39
- package/dist/src/icons/components/volume/VolumeOffIcon.d.ts +0 -3
- package/dist/src/icons/components/volume/VolumeOffIcon.tsx +0 -39
- package/dist/src/icons/index.d.ts +0 -28
- package/dist/src/icons/index.ts +0 -56
- package/dist/src/icons/provider.d.ts +0 -13
- package/dist/src/icons/provider.tsx +0 -64
- package/dist/src/icons/types.d.ts +0 -18
- package/dist/src/icons/types.ts +0 -40
- package/dist/src/index-enhanced.d.ts +0 -13
- package/dist/src/index-enhanced.ts +0 -35
- package/dist/src/index-legacy.d.ts +0 -81
- package/dist/src/index-legacy.ts +0 -327
- package/dist/src/index.css +0 -102
- package/dist/src/index.d.ts +0 -38
- package/dist/src/index.minimal.d.ts +0 -2
- package/dist/src/index.minimal.ts +0 -4
- package/dist/src/index.ts +0 -216
- package/dist/src/lib/deprecation.d.ts +0 -7
- package/dist/src/lib/deprecation.ts +0 -51
- package/dist/src/lib/format-time.d.ts +0 -9
- package/dist/src/lib/format-time.ts +0 -37
- package/dist/src/lib/index.d.ts +0 -3
- package/dist/src/lib/index.ts +0 -3
- package/dist/src/lib/utils.d.ts +0 -3
- package/dist/src/lib/utils.ts +0 -6
- package/dist/src/styles/globals.css +0 -462
- package/dist/src/styles/minimal-player.css +0 -589
- package/dist/src/styles/pixel-art.css +0 -46
- package/dist/src/styles/videojs.css +0 -100
- package/dist/src/test/setup.d.ts +0 -2
- package/dist/src/test/setup.ts +0 -79
- package/dist/src/types/events.d.ts +0 -41
- package/dist/src/types/events.ts +0 -47
- package/dist/src/types/formats.d.ts +0 -45
- package/dist/src/types/formats.ts +0 -95
- package/dist/src/types/index.d.ts +0 -128
- package/dist/src/types/index.ts +0 -225
- package/dist/src/types/videojs-plugins.d.ts +0 -14
- package/dist/styles/globals.css +0 -462
- package/dist/styles/minimal-player.css +0 -589
- package/dist/styles/pixel-art.css +0 -46
- package/dist/styles/videojs.css +0 -100
- package/src/adapters/videojs-adapter.d.ts +0 -38
- package/src/adapters/videojs-adapter.d.ts.map +0 -1
- package/src/components/AnimateLoading.d.ts +0 -9
- package/src/components/AnimateLoading.d.ts.map +0 -1
- package/src/components/LoadingState.d.ts +0 -33
- package/src/components/LoadingState.d.ts.map +0 -1
- package/src/components/accessibility/keyboard-help-overlay.d.ts +0 -17
- package/src/components/accessibility/keyboard-help-overlay.d.ts.map +0 -1
- package/src/components/audio-player.d.ts +0 -3
- package/src/components/audio-player.d.ts.map +0 -1
- package/src/components/basic/index.d.ts +0 -26
- package/src/components/basic/index.d.ts.map +0 -1
- package/src/components/enhanced/advanced-features.d.ts +0 -45
- package/src/components/enhanced/advanced-features.d.ts.map +0 -1
- package/src/components/enhanced/debug-panel.d.ts +0 -70
- package/src/components/enhanced/debug-panel.d.ts.map +0 -1
- package/src/components/enhanced/enhanced-controls.d.ts +0 -50
- package/src/components/enhanced/enhanced-controls.d.ts.map +0 -1
- package/src/components/enhanced/enhanced-media-player.d.ts +0 -26
- package/src/components/enhanced/enhanced-media-player.d.ts.map +0 -1
- package/src/components/enhanced/error-handling.d.ts +0 -36
- package/src/components/enhanced/error-handling.d.ts.map +0 -1
- package/src/components/enhanced/index.d.ts +0 -7
- package/src/components/enhanced/index.d.ts.map +0 -1
- package/src/components/enhanced/media-player-enhanced.d.ts +0 -21
- package/src/components/enhanced/media-player-enhanced.d.ts.map +0 -1
- package/src/components/examples/basic-video-player.d.ts +0 -10
- package/src/components/examples/basic-video-player.d.ts.map +0 -1
- package/src/components/examples/custom-controls-example.d.ts +0 -10
- package/src/components/examples/custom-controls-example.d.ts.map +0 -1
- package/src/components/examples/enhanced-controls-example.d.ts +0 -9
- package/src/components/examples/enhanced-controls-example.d.ts.map +0 -1
- package/src/components/examples/enhanced-media-player-example.d.ts +0 -9
- package/src/components/examples/enhanced-media-player-example.d.ts.map +0 -1
- package/src/components/examples/loading-states-demo.d.ts +0 -2
- package/src/components/examples/loading-states-demo.d.ts.map +0 -1
- package/src/components/examples/react-19-demo.d.ts +0 -10
- package/src/components/examples/react-19-demo.d.ts.map +0 -1
- package/src/components/examples/volume-orientation-demo.d.ts +0 -2
- package/src/components/examples/volume-orientation-demo.d.ts.map +0 -1
- package/src/components/icon-demo.d.ts +0 -2
- package/src/components/icon-demo.d.ts.map +0 -1
- package/src/components/icons/index.d.ts +0 -36
- package/src/components/icons/index.d.ts.map +0 -1
- package/src/components/icons/svg-icons/ArrowLeftIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/ArrowRightIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/ArrowRightIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/AudioIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/AudioIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/BackwardIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/BackwardIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/CameraIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/CameraIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/CheckIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/CheckIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/EnablePiPIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/EnablePiPIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/ForwardIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/ForwardIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/FullscreenEnterIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/FullscreenExitIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/LoadingIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/LoadingIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/PauseIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/PauseIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/PlayIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/PlayIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/PlaybackSpeedIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/QualityIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/QualityIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/SettingsIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/SettingsIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/SliderIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/SliderIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/SubtitleIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/SubtitleIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/SubtitleOffIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/UnPiPIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/UnPiPIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/VolumeMutedIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/VolumeOneIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/VolumeOneIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/VolumeThreeIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +0 -1
- package/src/components/icons/svg-icons/VolumeTwoIcon.d.ts +0 -4
- package/src/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +0 -1
- package/src/components/legacy.d.ts +0 -13
- package/src/components/legacy.d.ts.map +0 -1
- package/src/components/media-metadata-display.d.ts +0 -11
- package/src/components/media-metadata-display.d.ts.map +0 -1
- package/src/components/media-player-audio.d.ts +0 -9
- package/src/components/media-player-audio.d.ts.map +0 -1
- package/src/components/media-player-controls.d.ts +0 -23
- package/src/components/media-player-controls.d.ts.map +0 -1
- package/src/components/media-player-error.d.ts +0 -16
- package/src/components/media-player-error.d.ts.map +0 -1
- package/src/components/media-player-fullscreen.d.ts +0 -12
- package/src/components/media-player-fullscreen.d.ts.map +0 -1
- package/src/components/media-player-hls.d.ts +0 -23
- package/src/components/media-player-hls.d.ts.map +0 -1
- package/src/components/media-player-loading.d.ts +0 -12
- package/src/components/media-player-loading.d.ts.map +0 -1
- package/src/components/media-player-play.d.ts +0 -11
- package/src/components/media-player-play.d.ts.map +0 -1
- package/src/components/media-player-root.d.ts +0 -28
- package/src/components/media-player-root.d.ts.map +0 -1
- package/src/components/media-player-seek.d.ts +0 -15
- package/src/components/media-player-seek.d.ts.map +0 -1
- package/src/components/media-player-time.d.ts +0 -12
- package/src/components/media-player-time.d.ts.map +0 -1
- package/src/components/media-player-tooltip.d.ts +0 -13
- package/src/components/media-player-tooltip.d.ts.map +0 -1
- package/src/components/media-player-video.d.ts +0 -9
- package/src/components/media-player-video.d.ts.map +0 -1
- package/src/components/media-player-volume.d.ts +0 -13
- package/src/components/media-player-volume.d.ts.map +0 -1
- package/src/components/media-player.d.ts +0 -3
- package/src/components/media-player.d.ts.map +0 -1
- package/src/components/media-suspense.d.ts +0 -78
- package/src/components/media-suspense.d.ts.map +0 -1
- package/src/components/player-settings-form.d.ts +0 -8
- package/src/components/player-settings-form.d.ts.map +0 -1
- package/src/components/react-player-wrapper.d.ts +0 -64
- package/src/components/react-player-wrapper.d.ts.map +0 -1
- package/src/components/simple-video-player.d.ts +0 -9
- package/src/components/simple-video-player.d.ts.map +0 -1
- package/src/components/ui/button.tsx +0 -49
- package/src/components/ui/dropdown-menu.tsx +0 -137
- package/src/components/ui/enhanced-seek-bar.d.ts +0 -3
- package/src/components/ui/enhanced-seek-bar.d.ts.map +0 -1
- package/src/components/ui/fullscreen-button.d.ts +0 -3
- package/src/components/ui/fullscreen-button.d.ts.map +0 -1
- package/src/components/ui/icons.tsx +0 -174
- package/src/components/ui/media-resource-preloader.d.ts +0 -21
- package/src/components/ui/media-resource-preloader.d.ts.map +0 -1
- package/src/components/ui/play-button.d.ts +0 -3
- package/src/components/ui/play-button.d.ts.map +0 -1
- package/src/components/ui/seek-bar.d.ts +0 -3
- package/src/components/ui/seek-bar.d.ts.map +0 -1
- package/src/components/ui/slider.tsx +0 -55
- package/src/components/ui/time-display.d.ts +0 -3
- package/src/components/ui/time-display.d.ts.map +0 -1
- package/src/components/ui/tooltip.tsx +0 -131
- package/src/components/ui/volume-control.d.ts +0 -3
- package/src/components/ui/volume-control.d.ts.map +0 -1
- package/src/components/unified/base-media-player.d.ts +0 -18
- package/src/components/unified/base-media-player.d.ts.map +0 -1
- package/src/components/unified/media-player.d.ts +0 -37
- package/src/components/unified/media-player.d.ts.map +0 -1
- package/src/components/variants/minimal/AccessibleMinimalPlayer.d.ts +0 -42
- package/src/components/variants/minimal/AccessibleMinimalPlayer.d.ts.map +0 -1
- package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.d.ts +0 -44
- package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.d.ts.map +0 -1
- package/src/components/variants/minimal/MinimalControls.d.ts +0 -19
- package/src/components/variants/minimal/MinimalControls.d.ts.map +0 -1
- package/src/components/variants/minimal/MinimalLoading.d.ts +0 -10
- package/src/components/variants/minimal/MinimalLoading.d.ts.map +0 -1
- package/src/components/variants/minimal/MinimalMediaPlayer.d.ts +0 -38
- package/src/components/variants/minimal/MinimalMediaPlayer.d.ts.map +0 -1
- package/src/components/variants/minimal/MinimalOverlay.d.ts +0 -11
- package/src/components/variants/minimal/MinimalOverlay.d.ts.map +0 -1
- package/src/components/variants/minimal/MinimalPlayButton.d.ts +0 -9
- package/src/components/variants/minimal/MinimalPlayButton.d.ts.map +0 -1
- package/src/components/variants/minimal/MinimalSeekBar.d.ts +0 -7
- package/src/components/variants/minimal/MinimalSeekBar.d.ts.map +0 -1
- package/src/components/variants/minimal/MinimalVolumeControl.d.ts +0 -7
- package/src/components/variants/minimal/MinimalVolumeControl.d.ts.map +0 -1
- package/src/components/variants/minimal/SimpleMinimalPlayer.d.ts +0 -22
- package/src/components/variants/minimal/SimpleMinimalPlayer.d.ts.map +0 -1
- package/src/components/variants/minimal/components/CenterPlayButton.d.ts +0 -7
- package/src/components/variants/minimal/components/CenterPlayButton.d.ts.map +0 -1
- package/src/components/variants/minimal/components/ControlBar.d.ts +0 -43
- package/src/components/variants/minimal/components/ControlBar.d.ts.map +0 -1
- package/src/components/variants/minimal/components/EnhancedSettingsMenu.d.ts +0 -24
- package/src/components/variants/minimal/components/EnhancedSettingsMenu.d.ts.map +0 -1
- package/src/components/variants/minimal/components/PlaybackControls.d.ts +0 -9
- package/src/components/variants/minimal/components/PlaybackControls.d.ts.map +0 -1
- package/src/components/variants/minimal/components/RightControls.d.ts +0 -25
- package/src/components/variants/minimal/components/RightControls.d.ts.map +0 -1
- package/src/components/variants/minimal/components/SeekBar.d.ts +0 -11
- package/src/components/variants/minimal/components/SeekBar.d.ts.map +0 -1
- package/src/components/variants/minimal/components/SettingsDropdown.d.ts +0 -9
- package/src/components/variants/minimal/components/SettingsDropdown.d.ts.map +0 -1
- package/src/components/variants/minimal/components/SubtitleDisplay.d.ts +0 -7
- package/src/components/variants/minimal/components/SubtitleDisplay.d.ts.map +0 -1
- package/src/components/variants/minimal/components/TimeDisplay.d.ts +0 -7
- package/src/components/variants/minimal/components/TimeDisplay.d.ts.map +0 -1
- package/src/components/variants/minimal/components/VideoElement.d.ts +0 -13
- package/src/components/variants/minimal/components/VideoElement.d.ts.map +0 -1
- package/src/components/variants/minimal/components/VolumeControl.d.ts +0 -13
- package/src/components/variants/minimal/components/VolumeControl.d.ts.map +0 -1
- package/src/components/variants/minimal/index.d.ts +0 -17
- package/src/components/variants/minimal/index.d.ts.map +0 -1
- package/src/components/video-player.d.ts +0 -3
- package/src/components/video-player.d.ts.map +0 -1
- package/src/context/error-handling.d.ts +0 -72
- package/src/context/error-handling.d.ts.map +0 -1
- package/src/context/media-context.d.ts +0 -104
- package/src/context/media-context.d.ts.map +0 -1
- package/src/context/media-provider.d.ts +0 -26
- package/src/context/media-provider.d.ts.map +0 -1
- package/src/context/media-store.d.ts +0 -33
- package/src/context/media-store.d.ts.map +0 -1
- package/src/context/persistence.d.ts +0 -83
- package/src/context/persistence.d.ts.map +0 -1
- package/src/core/events/event-system.d.ts +0 -170
- package/src/core/events/event-system.d.ts.map +0 -1
- package/src/core/events/hooks.d.ts +0 -33
- package/src/core/events/hooks.d.ts.map +0 -1
- package/src/core/events/index.d.ts +0 -6
- package/src/core/events/index.d.ts.map +0 -1
- package/src/core/events/middleware.d.ts +0 -39
- package/src/core/events/middleware.d.ts.map +0 -1
- package/src/core/index.d.ts +0 -8
- package/src/core/index.d.ts.map +0 -1
- package/src/core/optimization/bundle-optimizer.d.ts +0 -44
- package/src/core/optimization/bundle-optimizer.d.ts.map +0 -1
- package/src/core/performance/cicd.d.ts +0 -8
- package/src/core/performance/cicd.d.ts.map +0 -1
- package/src/core/performance/index.d.ts +0 -10
- package/src/core/performance/index.d.ts.map +0 -1
- package/src/core/performance/media-loading-optimizer.d.ts +0 -105
- package/src/core/performance/media-loading-optimizer.d.ts.map +0 -1
- package/src/core/performance/performance-budgets.d.ts +0 -68
- package/src/core/performance/performance-budgets.d.ts.map +0 -1
- package/src/core/performance/performance-monitor.d.ts +0 -95
- package/src/core/performance/performance-monitor.d.ts.map +0 -1
- package/src/core/performance/performance-testing.d.ts +0 -69
- package/src/core/performance/performance-testing.d.ts.map +0 -1
- package/src/core/plugins/base-plugin.d.ts +0 -52
- package/src/core/plugins/base-plugin.d.ts.map +0 -1
- package/src/core/plugins/enhanced-plugin-system.d.ts +0 -160
- package/src/core/plugins/enhanced-plugin-system.d.ts.map +0 -1
- package/src/core/plugins/examples/analytics-plugin.d.ts +0 -30
- package/src/core/plugins/examples/analytics-plugin.d.ts.map +0 -1
- package/src/core/plugins/index.d.ts +0 -8
- package/src/core/plugins/index.d.ts.map +0 -1
- package/src/core/plugins/registry.d.ts +0 -31
- package/src/core/plugins/registry.d.ts.map +0 -1
- package/src/core/plugins/types.d.ts +0 -101
- package/src/core/plugins/types.d.ts.map +0 -1
- package/src/core/plugins/utils.d.ts +0 -38
- package/src/core/plugins/utils.d.ts.map +0 -1
- package/src/core/progressive-loading.d.ts +0 -88
- package/src/core/progressive-loading.d.ts.map +0 -1
- package/src/core/providers/enhanced-hls-provider.d.ts +0 -50
- package/src/core/providers/enhanced-hls-provider.d.ts.map +0 -1
- package/src/core/providers/service-provider.d.ts +0 -49
- package/src/core/providers/service-provider.d.ts.map +0 -1
- package/src/core/utils.d.ts +0 -25
- package/src/core/utils.d.ts.map +0 -1
- package/src/features/media-session/media-session-manager.d.ts +0 -132
- package/src/features/media-session/media-session-manager.d.ts.map +0 -1
- package/src/features/picture-in-picture/pip-manager.d.ts +0 -94
- package/src/features/picture-in-picture/pip-manager.d.ts.map +0 -1
- package/src/features/playlist/playlist-manager.d.ts +0 -208
- package/src/features/playlist/playlist-manager.d.ts.map +0 -1
- package/src/features/subtitles/subtitle-manager.d.ts +0 -136
- package/src/features/subtitles/subtitle-manager.d.ts.map +0 -1
- package/src/features/subtitles/subtitle-parser.d.ts +0 -60
- package/src/features/subtitles/subtitle-parser.d.ts.map +0 -1
- package/src/features/thumbnails/thumbnail-generator.d.ts +0 -136
- package/src/features/thumbnails/thumbnail-generator.d.ts.map +0 -1
- package/src/hooks/accessibility/index.d.ts +0 -5
- package/src/hooks/accessibility/index.d.ts.map +0 -1
- package/src/hooks/accessibility/use-accessibility-preferences.d.ts +0 -14
- package/src/hooks/accessibility/use-accessibility-preferences.d.ts.map +0 -1
- package/src/hooks/accessibility/use-focus-management.d.ts +0 -31
- package/src/hooks/accessibility/use-focus-management.d.ts.map +0 -1
- package/src/hooks/accessibility/use-keyboard-shortcuts.d.ts +0 -38
- package/src/hooks/accessibility/use-keyboard-shortcuts.d.ts.map +0 -1
- package/src/hooks/accessibility/use-screen-reader.d.ts +0 -22
- package/src/hooks/accessibility/use-screen-reader.d.ts.map +0 -1
- package/src/hooks/core/index.d.ts +0 -18
- package/src/hooks/core/index.d.ts.map +0 -1
- package/src/hooks/legacy.d.ts +0 -18
- package/src/hooks/legacy.d.ts.map +0 -1
- package/src/hooks/use-enhanced-media-player.d.ts +0 -88
- package/src/hooks/use-enhanced-media-player.d.ts.map +0 -1
- package/src/hooks/use-intelligent-preloading.d.ts +0 -66
- package/src/hooks/use-intelligent-preloading.d.ts.map +0 -1
- package/src/hooks/use-keyboard-controls.d.ts +0 -13
- package/src/hooks/use-keyboard-controls.d.ts.map +0 -1
- package/src/hooks/use-media-actions.d.ts +0 -62
- package/src/hooks/use-media-actions.d.ts.map +0 -1
- package/src/hooks/use-media-metadata.d.ts +0 -11
- package/src/hooks/use-media-metadata.d.ts.map +0 -1
- package/src/hooks/use-media-optimistic.d.ts +0 -36
- package/src/hooks/use-media-optimistic.d.ts.map +0 -1
- package/src/hooks/use-media-player.d.ts +0 -31
- package/src/hooks/use-media-player.d.ts.map +0 -1
- package/src/hooks/use-media-state.d.ts +0 -17
- package/src/hooks/use-media-state.d.ts.map +0 -1
- package/src/hooks/use-memory-optimization.d.ts +0 -40
- package/src/hooks/use-memory-optimization.d.ts.map +0 -1
- package/src/hooks/use-mobile.ts +0 -125
- package/src/hooks/use-optimistic-controls.d.ts +0 -22
- package/src/hooks/use-optimistic-controls.d.ts.map +0 -1
- package/src/hooks/use-optimized-media.d.ts +0 -46
- package/src/hooks/use-optimized-media.d.ts.map +0 -1
- package/src/hooks/use-touch-gestures.d.ts +0 -47
- package/src/hooks/use-touch-gestures.d.ts.map +0 -1
- package/src/hooks/useEnhancedSubtitles.d.ts +0 -39
- package/src/hooks/useEnhancedSubtitles.d.ts.map +0 -1
- package/src/hooks/useKeyboardShortcuts.d.ts +0 -10
- package/src/hooks/useKeyboardShortcuts.d.ts.map +0 -1
- package/src/hooks/useMediaControls.d.ts +0 -9
- package/src/hooks/useMediaControls.d.ts.map +0 -1
- package/src/hooks/useScreenshot.d.ts +0 -4
- package/src/hooks/useScreenshot.d.ts.map +0 -1
- package/src/hooks/useSubtitles.d.ts +0 -8
- package/src/hooks/useSubtitles.d.ts.map +0 -1
- package/src/hooks/useVideoPlayer.d.ts +0 -32
- package/src/hooks/useVideoPlayer.d.ts.map +0 -1
- package/src/icons/components/FullscreenIcon.d.ts +0 -3
- package/src/icons/components/FullscreenIcon.d.ts.map +0 -1
- package/src/icons/components/SettingsIcon.d.ts +0 -3
- package/src/icons/components/SettingsIcon.d.ts.map +0 -1
- package/src/icons/components/animated/LoadingIcon.d.ts +0 -3
- package/src/icons/components/animated/LoadingIcon.d.ts.map +0 -1
- package/src/icons/components/animated/PlayPauseIcon.d.ts +0 -7
- package/src/icons/components/animated/PlayPauseIcon.d.ts.map +0 -1
- package/src/icons/components/media/PauseIcon.d.ts +0 -3
- package/src/icons/components/media/PauseIcon.d.ts.map +0 -1
- package/src/icons/components/media/PlayIcon.d.ts +0 -3
- package/src/icons/components/media/PlayIcon.d.ts.map +0 -1
- package/src/icons/components/volume/VolumeIcon.d.ts +0 -3
- package/src/icons/components/volume/VolumeIcon.d.ts.map +0 -1
- package/src/icons/components/volume/VolumeOffIcon.d.ts +0 -3
- package/src/icons/components/volume/VolumeOffIcon.d.ts.map +0 -1
- package/src/icons/index.d.ts +0 -28
- package/src/icons/index.d.ts.map +0 -1
- package/src/icons/provider.d.ts +0 -13
- package/src/icons/provider.d.ts.map +0 -1
- package/src/icons/types.d.ts +0 -18
- package/src/icons/types.d.ts.map +0 -1
- package/src/index-enhanced.d.ts +0 -13
- package/src/index-enhanced.d.ts.map +0 -1
- package/src/index-legacy.d.ts +0 -81
- package/src/index-legacy.d.ts.map +0 -1
- package/src/index.d.ts +0 -38
- package/src/index.d.ts.map +0 -1
- package/src/index.minimal.d.ts +0 -2
- package/src/index.minimal.d.ts.map +0 -1
- package/src/index.minimal.ts +0 -4
- package/src/lib/deprecation.d.ts +0 -7
- package/src/lib/deprecation.d.ts.map +0 -1
- package/src/lib/format-time.d.ts +0 -9
- package/src/lib/format-time.d.ts.map +0 -1
- package/src/lib/index.d.ts +0 -3
- package/src/lib/index.d.ts.map +0 -1
- package/src/lib/utils.d.ts +0 -3
- package/src/lib/utils.d.ts.map +0 -1
- package/src/test/setup.d.ts +0 -2
- package/src/test/setup.d.ts.map +0 -1
- package/src/types/events.d.ts +0 -41
- package/src/types/events.d.ts.map +0 -1
- package/src/types/formats.d.ts +0 -45
- package/src/types/formats.d.ts.map +0 -1
- package/src/types/index.d.ts +0 -128
- package/src/types/index.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-plugins-CROGvQUy.js","sources":["../src/core/plugins/types.ts","../src/core/plugins/registry.ts","../src/core/plugins/base-plugin.ts","../src/core/plugins/examples/analytics-plugin.ts","../src/core/plugins/utils.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\" | \"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\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(factory: PluginFactory, config?: PluginConfig): Promise<void>\n\tunregister(name: string): Promise<void>\n\tget(name: string): Plugin | undefined\n\tgetAll(): Plugin[]\n\tisEnabled(name: 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 { EventBus } from \"../events/event-system\"\nimport type {\n\tPluginRegistry as IPluginRegistry,\n\tPlugin,\n\tPluginConfig,\n\tPluginContext,\n\tPluginEvents,\n\tPluginFactory,\n\tPluginLogger,\n\tPluginPriority\n} from \"./types\"\nimport { PluginConflictError, PluginDependencyError, PluginError } from \"./types\"\n\n// Plugin registry implementation\nexport class PluginRegistry implements IPluginRegistry {\n\tprivate plugins = new Map<string, Plugin>()\n\tprivate pluginConfigs = new Map<string, PluginConfig>()\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\n\t}\n\n\t// Register a plugin factory\n\tasync register(factory: PluginFactory, config: PluginConfig = {}): Promise<void> {\n\t\ttry {\n\t\t\tconst plugin = factory(config)\n\t\t\tconst { name, dependencies = [], conflicts = [] } = plugin.metadata\n\n\t\t\t// Check if plugin already exists\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\t// Validate dependencies\n\t\t\tconst missingDependencies = dependencies.filter((dep) => !this.plugins.has(dep))\n\t\t\tif (missingDependencies.length > 0) {\n\t\t\t\tthrow new PluginDependencyError(name, missingDependencies)\n\t\t\t}\n\n\t\t\t// Check for conflicts with enabled plugins\n\t\t\tconst activeConflicts = conflicts.filter((conflict) => this.enabledPlugins.has(conflict))\n\t\t\tif (activeConflicts.length > 0) {\n\t\t\t\tthrow new PluginConflictError(name, activeConflicts)\n\t\t\t}\n\n\t\t\t// Store plugin and configuration\n\t\t\tthis.plugins.set(name, plugin)\n\t\t\tthis.pluginConfigs.set(name, config)\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 = factory({}).metadata.name\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\t// Unregister a plugin\n\tasync unregister(name: string): 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\t// Disable plugin if enabled\n\t\t\tif (this.enabledPlugins.has(name)) {\n\t\t\t\tawait this.disable(name)\n\t\t\t}\n\n\t\t\t// Remove from registry\n\t\t\tthis.plugins.delete(name)\n\t\t\tthis.pluginConfigs.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\t// Get a plugin by name\n\tget(name: string): Plugin | undefined {\n\t\treturn this.plugins.get(name)\n\t}\n\n\t// Get all plugins sorted by priority\n\tgetAll(): Plugin[] {\n\t\treturn Array.from(this.plugins.values()).sort(this.sortByPriority)\n\t}\n\n\t// Check if plugin is enabled\n\tisEnabled(name: string): boolean {\n\t\treturn this.enabledPlugins.has(name)\n\t}\n\n\t// Enable a plugin\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\ttry {\n\t\t\tconst context = this.createPluginContext(name)\n\t\t\tconst config = this.pluginConfigs.get(name)\n\n\t\t\t// Initialize plugin\n\t\t\tawait plugin.initialize(context, config)\n\n\t\t\t// Activate plugin\n\t\t\tawait plugin.activate(context)\n\n\t\t\tthis.enabledPlugins.add(name)\n\t\t\tthis.logger.info(`Plugin '${name}' enabled successfully`)\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 enable 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\t// Disable a plugin\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\ttry {\n\t\t\tconst context = this.createPluginContext(name)\n\n\t\t\t// Deactivate plugin\n\t\t\tawait plugin.deactivate(context)\n\n\t\t\t// Destroy plugin resources\n\t\t\tawait plugin.destroy(context)\n\n\t\t\tthis.enabledPlugins.delete(name)\n\t\t\tthis.logger.info(`Plugin '${name}' disabled successfully`)\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 disable 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\t// Configure a plugin\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\t// Update stored configuration\n\t\t\tthis.pluginConfigs.set(name, { ...this.pluginConfigs.get(name), ...config })\n\n\t\t\t// If plugin has configure method, call it\n\t\t\tif (plugin.configure) {\n\t\t\t\tawait plugin.configure(config)\n\t\t\t}\n\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\t// Enable multiple plugins with dependency resolution\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\t// Disable multiple plugins\n\tasync disablePlugins(names: string[]): Promise<void> {\n\t\t// Disable in reverse order to handle dependencies\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\t// Get enabled plugins\n\tgetEnabledPlugins(): Plugin[] {\n\t\treturn Array.from(this.enabledPlugins)\n\t\t\t.map((name) => this.plugins.get(name)!)\n\t\t\t.filter(Boolean)\n\t\t\t.sort(this.sortByPriority)\n\t}\n\n\t// Health check for all enabled plugins\n\tasync healthCheck(): Promise<{ name: string; healthy: boolean; error?: Error }[]> {\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\ttry {\n\t\t\t\tconst healthy = plugin.healthCheck ? await plugin.healthCheck() : true\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\t// Event handling\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\t// Create plugin context (will be implemented when we have the full context)\n\tprivate createPluginContext(pluginName: string): PluginContext {\n\t\t// This will be implemented when we integrate with the media player\n\t\t// For now, return a minimal context\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\t// Create plugin-specific logger\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\t// Resolve plugin dependencies\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\t// Visit dependencies first\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\t// Sort plugins by priority\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\tlow: 1\n\t\t}\n\n\t\treturn priorityOrder[b.metadata.priority] - priorityOrder[a.metadata.priority]\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","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","// 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","PluginRegistry","logger","__publicField","EventBus","factory","config","plugin","name","dependencies","conflicts","dep","activeConflicts","conflict","error","context","names","resolved","reversed","results","healthy","event","listener","data","handler","visiting","visit","a","b","priorityOrder","BasePlugin","metadata","oldConfig","newConfig","element","events","defaults","createPlugin","PluginClass","AnalyticsPlugin","mediaEventCleanup","cleanup","cleanupFunctions","unsubscribe","analyticsEvent","eventsToReport","response","createAnalyticsPlugin","ConsolePluginLogger","prefix","PluginValidator","schema","key","rules","value","PluginPerformanceMonitor","operation","fn","startTime","updateMetrics","endTime","duration","existing","result","pluginMetrics","PluginDevelopmentHelpers","time","volume","hooks","label","PluginStorage","defaultValue","item","defaultPluginLogger","defaultPerformanceMonitor","PLUGIN_SYSTEM_VERSION"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var w=Object.defineProperty;var P=(r,t,e)=>t in r?w(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var o=(r,t,e)=>P(r,typeof t!="symbol"?t+"":t,e);const E=require("./core-events-B1iM2F46.cjs");class a extends Error{constructor(t,e,i,n){super(`Plugin '${t}' failed during ${e}: ${i}`),this.pluginName=t,this.phase=e,this.originalError=n,this.name="PluginError"}}class f extends a{constructor(t,e){super(t,"initialize",`Missing dependencies: ${e.join(", ")}`),this.missingDependencies=e,this.name="PluginDependencyError"}}class p extends a{constructor(t,e){super(t,"activate",`Conflicts with active plugins: ${e.join(", ")}`),this.conflictingPlugins=e,this.name="PluginConflictError"}}class ${constructor(t){o(this,"plugins",new Map);o(this,"pluginConfigs",new Map);o(this,"enabledPlugins",new Set);o(this,"eventBus",new E.EventBus);o(this,"logger");this.logger=t}async register(t,e={}){try{const i=t(e),{name:n,dependencies:s=[],conflicts:c=[]}=i.metadata;if(this.plugins.has(n))throw new a(n,"initialize","Plugin already registered");const u=s.filter(h=>!this.plugins.has(h));if(u.length>0)throw new f(n,u);const l=c.filter(h=>this.enabledPlugins.has(h));if(l.length>0)throw new p(n,l);this.plugins.set(n,i),this.pluginConfigs.set(n,e),this.logger.info(`Plugin '${n}' registered successfully`),this.eventBus.emit("plugin:registered",{name:n,plugin:i})}catch(i){const n=t({}).metadata.name;throw this.logger.error(`Failed to register plugin '${n}'`,i),this.eventBus.emit("plugin:error",{name:n,error:i}),i}}async unregister(t){if(!this.plugins.get(t))throw new a(t,"destroy","Plugin not found");try{this.enabledPlugins.has(t)&&await this.disable(t),this.plugins.delete(t),this.pluginConfigs.delete(t),this.logger.info(`Plugin '${t}' unregistered successfully`)}catch(i){throw this.logger.error(`Failed to unregister plugin '${t}'`,i),i}}get(t){return this.plugins.get(t)}getAll(){return Array.from(this.plugins.values()).sort(this.sortByPriority)}isEnabled(t){return this.enabledPlugins.has(t)}async enable(t){const e=this.plugins.get(t);if(!e)throw new a(t,"activate","Plugin not found");if(this.enabledPlugins.has(t)){this.logger.warn(`Plugin '${t}' is already enabled`);return}try{const i=this.createPluginContext(t),n=this.pluginConfigs.get(t);await e.initialize(i,n),await e.activate(i),this.enabledPlugins.add(t),this.logger.info(`Plugin '${t}' enabled successfully`),this.eventBus.emit("plugin:enabled",{name:t,plugin:e})}catch(i){throw this.logger.error(`Failed to enable plugin '${t}'`,i),this.eventBus.emit("plugin:error",{name:t,error:i}),i}}async disable(t){const e=this.plugins.get(t);if(!e)throw new a(t,"deactivate","Plugin not found");if(!this.enabledPlugins.has(t)){this.logger.warn(`Plugin '${t}' is already disabled`);return}try{const i=this.createPluginContext(t);await e.deactivate(i),await e.destroy(i),this.enabledPlugins.delete(t),this.logger.info(`Plugin '${t}' disabled successfully`),this.eventBus.emit("plugin:disabled",{name:t,plugin:e})}catch(i){throw this.logger.error(`Failed to disable plugin '${t}'`,i),this.eventBus.emit("plugin:error",{name:t,error:i}),i}}async configure(t,e){const i=this.plugins.get(t);if(!i)throw new a(t,"initialize","Plugin not found");try{this.pluginConfigs.set(t,{...this.pluginConfigs.get(t),...e}),i.configure&&await i.configure(e),this.logger.info(`Plugin '${t}' configured successfully`),this.eventBus.emit("plugin:configured",{name:t,config:e})}catch(n){throw this.logger.error(`Failed to configure plugin '${t}'`,n),this.eventBus.emit("plugin:error",{name:t,error:n}),n}}async enablePlugins(t){const e=this.resolveDependencies(t);for(const i of e)this.enabledPlugins.has(i)||await this.enable(i)}async disablePlugins(t){const e=[...t].reverse();for(const i of e)this.enabledPlugins.has(i)&&await this.disable(i)}getEnabledPlugins(){return Array.from(this.enabledPlugins).map(t=>this.plugins.get(t)).filter(Boolean).sort(this.sortByPriority)}async healthCheck(){const t=[];for(const e of this.enabledPlugins){const i=this.plugins.get(e);try{const n=i.healthCheck?await i.healthCheck():!0;t.push({name:e,healthy:n})}catch(n){t.push({name:e,healthy:!1,error:n})}}return t}on(t,e){return this.eventBus.on(t,e),()=>this.eventBus.off(t,e)}createPluginContext(t){return{state:{},controls:{},plugins:this,emit:(e,i)=>this.eventBus.emit(e,i),on:(e,i)=>(this.eventBus.on(e,i),()=>this.eventBus.off(e,i)),element:null,logger:this.createPluginLogger(t)}}createPluginLogger(t){return{info:(e,i)=>this.logger.info(`[${t}] ${e}`,i),warn:(e,i)=>this.logger.warn(`[${t}] ${e}`,i),error:(e,i)=>this.logger.error(`[${t}] ${e}`,i),debug:(e,i)=>this.logger.debug(`[${t}] ${e}`,i)}}resolveDependencies(t){const e=[],i=new Set,n=s=>{if(e.includes(s))return;if(i.has(s))throw new a(s,"initialize","Circular dependency detected");i.add(s);const c=this.plugins.get(s);if(!c)throw new a(s,"initialize","Plugin not found");for(const u of c.metadata.dependencies||[])n(u);i.delete(s),e.push(s)};for(const s of t)n(s);return e}sortByPriority(t,e){const i={high:3,medium:2,low:1};return i[e.metadata.priority]-i[t.metadata.priority]}}class y{constructor(t){o(this,"metadata");o(this,"context");o(this,"config",{});o(this,"initialized",!1);o(this,"active",!1);this.metadata={version:"1.0.0",...t}}async initialize(t,e={}){if(this.initialized){t.logger.warn("Plugin already initialized");return}this.context=t,this.config={...this.config,...e};try{await this.onInitialize(),this.initialized=!0,t.logger.info("Plugin initialized")}catch(i){throw t.logger.error("Failed to initialize plugin",i),i}}async activate(t){if(!this.initialized)throw new Error("Plugin must be initialized before activation");if(this.active){t.logger.warn("Plugin already active");return}try{await this.onActivate(),this.active=!0,t.logger.info("Plugin activated")}catch(e){throw t.logger.error("Failed to activate plugin",e),e}}async deactivate(t){if(!this.active){t.logger.warn("Plugin already inactive");return}try{await this.onDeactivate(),this.active=!1,t.logger.info("Plugin deactivated")}catch(e){throw t.logger.error("Failed to deactivate plugin",e),e}}async destroy(t){this.active&&await this.deactivate(t);try{await this.onDestroy(),this.initialized=!1,t.logger.info("Plugin destroyed")}catch(e){throw t.logger.error("Failed to destroy plugin",e),e}}async configure(t){const e={...this.config};this.config={...this.config,...t};try{await this.onConfigure(t,e),this.context?.logger.info("Plugin configured")}catch(i){throw this.config=e,this.context?.logger.error("Failed to configure plugin",i),i}}healthCheck(){return this.initialized&&this.onHealthCheck()}onDestroy(){}onConfigure(t,e){}onHealthCheck(){return!0}get state(){return this.context?.state}get controls(){return this.context?.controls}get element(){return this.context?.element}get logger(){return this.context?.logger}emit(t,e){this.context?.emit(t,e)}on(t,e){return this.context?.on(t,e)||(()=>{})}addEventListeners(t,e){return Object.entries(e).forEach(([i,n])=>{t.addEventListener(i,n)}),()=>{Object.entries(e).forEach(([i,n])=>{t.removeEventListener(i,n)})}}createConfig(t){return{...t,...this.config}}get isInitialized(){return this.initialized}get isActive(){return this.active}}function C(r){return t=>new r(t)}class v extends y{constructor(e){super({name:"analytics",description:"Media player analytics and tracking",category:"analytics",priority:"low",author:"BaroiPlayer Team"});o(this,"events",[]);o(this,"analyticsConfig");o(this,"cleanupFunctions",[]);o(this,"reportTimer")}onInitialize(){if(this.analyticsConfig=this.createConfig({trackingId:"",events:["play","pause","seek","ended","error"],samplingRate:1,debug:!1,endpoint:"/api/analytics"}),!this.analyticsConfig.trackingId)throw new Error("Analytics plugin requires a tracking ID");this.logger?.info("Analytics plugin initialized",{trackingId:this.analyticsConfig.trackingId,events:this.analyticsConfig.events})}onActivate(){const e=this.setupMediaEventListeners();this.cleanupFunctions.push(e),this.analyticsConfig.endpoint&&(this.reportTimer=setInterval(()=>{this.reportEvents()},3e4),this.cleanupFunctions.push(()=>{this.reportTimer&&clearInterval(this.reportTimer)})),this.trackEvent("plugin_activated",{plugin:"analytics"}),this.logger?.info("Analytics tracking started")}onDeactivate(){this.cleanupFunctions.forEach(e=>e()),this.cleanupFunctions=[],this.events.length>0&&this.reportEvents(),this.trackEvent("plugin_deactivated",{plugin:"analytics"}),this.logger?.info("Analytics tracking stopped")}onConfigure(e){if(this.analyticsConfig={...this.analyticsConfig,...e},e.events){this.cleanupFunctions.forEach(n=>n()),this.cleanupFunctions=[];const i=this.setupMediaEventListeners();this.cleanupFunctions.push(i)}}setupMediaEventListeners(){const e=[];if(this.analyticsConfig.events.includes("play")){const i=this.on("media:play",n=>{this.trackEvent("play",n)});e.push(i)}if(this.analyticsConfig.events.includes("pause")){const i=this.on("media:pause",n=>{this.trackEvent("pause",n)});e.push(i)}if(this.analyticsConfig.events.includes("seek")){const i=this.on("media:seek",n=>{this.trackEvent("seek",n)});e.push(i)}if(this.analyticsConfig.events.includes("ended")){const i=this.on("media:ended",n=>{this.trackEvent("ended",n)});e.push(i)}if(this.analyticsConfig.events.includes("error")){const i=this.on("media:error",n=>{this.trackEvent("error",n)});e.push(i)}return()=>{e.forEach(i=>i())}}trackEvent(e,i){if(Math.random()>this.analyticsConfig.samplingRate)return;const n={event:e,timestamp:Date.now(),data:{...i,trackingId:this.analyticsConfig.trackingId,sessionId:this.generateSessionId(),mediaState:{currentTime:this.state?.currentTime,duration:this.state?.duration,volume:this.state?.volume,isPlaying:this.state?.isPlaying}}};this.events.push(n),this.analyticsConfig.debug&&this.logger?.info("Analytics event tracked",n),this.emit("analytics:event",n)}async reportEvents(){if(this.events.length===0||!this.analyticsConfig.endpoint)return;const e=[...this.events];this.events=[];try{const i=await fetch(this.analyticsConfig.endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({trackingId:this.analyticsConfig.trackingId,events:e})});if(!i.ok)throw new Error(`Analytics report failed: ${i.status}`);this.analyticsConfig.debug&&this.logger?.info(`Reported ${e.length} analytics events`)}catch(i){this.events.unshift(...e),this.logger?.error("Failed to report analytics events",i)}}generateSessionId(){return`session_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}track(e,i){this.trackEvent(e,i)}getPendingEventsCount(){return this.events.length}async flush(){await this.reportEvents()}onHealthCheck(){return this.events.length<1e3}}const b=r=>new v(r);class d{constructor(t="[Plugin]"){o(this,"prefix");this.prefix=t}info(t,e){e?console.info(`${this.prefix} ${t}`,e):console.info(`${this.prefix} ${t}`)}warn(t,e){e?console.warn(`${this.prefix} ${t}`,e):console.warn(`${this.prefix} ${t}`)}error(t,e){e?console.error(`${this.prefix} ${t}`,e):console.error(`${this.prefix} ${t}`)}debug(t,e){process.env.NODE_ENV==="development"&&(e?console.debug(`${this.prefix} ${t}`,e):console.debug(`${this.prefix} ${t}`))}}class k{static validateMetadata(t){const{metadata:e}=t;if(!e.name||typeof e.name!="string")throw new Error("Plugin metadata must include a valid name");if(!e.version||typeof e.version!="string")throw new Error("Plugin metadata must include a valid version");if(!e.description||typeof e.description!="string")throw new Error("Plugin metadata must include a valid description");if(!e.category)throw new Error("Plugin metadata must include a valid category");if(!e.priority)throw new Error("Plugin metadata must include a valid priority");return!0}static validateConfig(t,e){if(!e)return!0;for(const[i,n]of Object.entries(e)){const s=t[i];if(n.required&&s==null)throw new Error(`Configuration property '${i}' is required`);if(s!==void 0&&n.type&&typeof s!==n.type)throw new Error(`Configuration property '${i}' must be of type '${n.type}'`);if(n.enum&&!n.enum.includes(s))throw new Error(`Configuration property '${i}' must be one of: ${n.enum.join(", ")}`);if(n.min!==void 0&&typeof s=="number"&&s<n.min)throw new Error(`Configuration property '${i}' must be at least ${n.min}`);if(n.max!==void 0&&typeof s=="number"&&s>n.max)throw new Error(`Configuration property '${i}' must be at most ${n.max}`)}return!0}}class m{constructor(){o(this,"metrics",new Map)}measure(t,e,i){const n=`${t}.${e}`,s=performance.now(),c=()=>{const l=performance.now(),h=l-s,g=this.metrics.get(n)||{calls:0,totalTime:0,averageTime:0,lastCall:0};g.calls++,g.totalTime+=h,g.averageTime=g.totalTime/g.calls,g.lastCall=l,this.metrics.set(n,g)},u=i();return u instanceof Promise?u.then(l=>(c(),l),l=>{throw c(),l}):(c(),u)}getMetrics(t){if(t){const e={};for(const[i,n]of this.metrics.entries())if(i.startsWith(`${t}.`)){const s=i.substring(t.length+1);e[s]=n}return e}return Object.fromEntries(this.metrics.entries())}reset(t){if(t)for(const e of this.metrics.keys())e.startsWith(`${t}.`)&&this.metrics.delete(e);else this.metrics.clear()}}const x={createMockContext(){return{state:{isPlaying:!1,currentTime:0,duration:0,volume:1,isMuted:!1,isLoading:!1,error:null},controls:{play:()=>Promise.resolve(),pause:()=>Promise.resolve(),seek:r=>Promise.resolve(),setVolume:r=>Promise.resolve(),mute:()=>Promise.resolve(),unmute:()=>Promise.resolve(),toggleMute:()=>Promise.resolve()},plugins:{get:()=>{},getAll:()=>[],isEnabled:()=>!1},emit:()=>{},on:()=>()=>{},element:null,logger:new d("[MockPlugin]")}},createTestPlugin(r,t={}){return{metadata:{name:r,version:"1.0.0",description:`Test plugin: ${r}`,category:"ui",priority:"medium"},initialize:async()=>{},activate:async()=>{},deactivate:async()=>{},destroy:async()=>{},healthCheck:()=>!0,...t}},time:{async:async(r,t)=>{console.time(r);try{const e=await t();return console.timeEnd(r),e}catch(e){throw console.timeEnd(r),e}},sync:(r,t)=>{console.time(r);try{const e=t();return console.timeEnd(r),e}catch(e){throw console.timeEnd(r),e}}}};class I{constructor(t){o(this,"prefix");this.prefix=`baroi-plugin-${t}`}get(t,e){try{const i=localStorage.getItem(`${this.prefix}-${t}`);return i?JSON.parse(i):e}catch{return e}}set(t,e){try{localStorage.setItem(`${this.prefix}-${t}`,JSON.stringify(e))}catch(i){console.warn(`Failed to store plugin data for key: ${t}`,i)}}remove(t){try{localStorage.removeItem(`${this.prefix}-${t}`)}catch(e){console.warn(`Failed to remove plugin data for key: ${t}`,e)}}clear(){try{Object.keys(localStorage).filter(e=>e.startsWith(`${this.prefix}-`)).forEach(e=>localStorage.removeItem(e))}catch(t){console.warn("Failed to clear plugin data",t)}}}const M=new d,z=new m,F="1.0.0";exports.AnalyticsPlugin=v;exports.BasePlugin=y;exports.ConsolePluginLogger=d;exports.PLUGIN_SYSTEM_VERSION=F;exports.PluginConflictError=p;exports.PluginDependencyError=f;exports.PluginDevelopmentHelpers=x;exports.PluginError=a;exports.PluginPerformanceMonitor=m;exports.PluginRegistry=$;exports.PluginStorage=I;exports.PluginValidator=k;exports.createAnalyticsPlugin=b;exports.createPlugin=C;exports.defaultPerformanceMonitor=z;exports.defaultPluginLogger=M;
|
|
2
|
+
//# sourceMappingURL=core-plugins-DtsHBOtF.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-plugins-DtsHBOtF.cjs","sources":["../src/core/plugins/types.ts","../src/core/plugins/registry.ts","../src/core/plugins/base-plugin.ts","../src/core/plugins/examples/analytics-plugin.ts","../src/core/plugins/utils.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\" | \"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\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(factory: PluginFactory, config?: PluginConfig): Promise<void>\n\tunregister(name: string): Promise<void>\n\tget(name: string): Plugin | undefined\n\tgetAll(): Plugin[]\n\tisEnabled(name: 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 { EventBus } from \"../events/event-system\"\nimport type {\n\tPluginRegistry as IPluginRegistry,\n\tPlugin,\n\tPluginConfig,\n\tPluginContext,\n\tPluginEvents,\n\tPluginFactory,\n\tPluginLogger,\n\tPluginPriority\n} from \"./types\"\nimport { PluginConflictError, PluginDependencyError, PluginError } from \"./types\"\n\n// Plugin registry implementation\nexport class PluginRegistry implements IPluginRegistry {\n\tprivate plugins = new Map<string, Plugin>()\n\tprivate pluginConfigs = new Map<string, PluginConfig>()\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\n\t}\n\n\t// Register a plugin factory\n\tasync register(factory: PluginFactory, config: PluginConfig = {}): Promise<void> {\n\t\ttry {\n\t\t\tconst plugin = factory(config)\n\t\t\tconst { name, dependencies = [], conflicts = [] } = plugin.metadata\n\n\t\t\t// Check if plugin already exists\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\t// Validate dependencies\n\t\t\tconst missingDependencies = dependencies.filter((dep) => !this.plugins.has(dep))\n\t\t\tif (missingDependencies.length > 0) {\n\t\t\t\tthrow new PluginDependencyError(name, missingDependencies)\n\t\t\t}\n\n\t\t\t// Check for conflicts with enabled plugins\n\t\t\tconst activeConflicts = conflicts.filter((conflict) => this.enabledPlugins.has(conflict))\n\t\t\tif (activeConflicts.length > 0) {\n\t\t\t\tthrow new PluginConflictError(name, activeConflicts)\n\t\t\t}\n\n\t\t\t// Store plugin and configuration\n\t\t\tthis.plugins.set(name, plugin)\n\t\t\tthis.pluginConfigs.set(name, config)\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 = factory({}).metadata.name\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\t// Unregister a plugin\n\tasync unregister(name: string): 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\t// Disable plugin if enabled\n\t\t\tif (this.enabledPlugins.has(name)) {\n\t\t\t\tawait this.disable(name)\n\t\t\t}\n\n\t\t\t// Remove from registry\n\t\t\tthis.plugins.delete(name)\n\t\t\tthis.pluginConfigs.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\t// Get a plugin by name\n\tget(name: string): Plugin | undefined {\n\t\treturn this.plugins.get(name)\n\t}\n\n\t// Get all plugins sorted by priority\n\tgetAll(): Plugin[] {\n\t\treturn Array.from(this.plugins.values()).sort(this.sortByPriority)\n\t}\n\n\t// Check if plugin is enabled\n\tisEnabled(name: string): boolean {\n\t\treturn this.enabledPlugins.has(name)\n\t}\n\n\t// Enable a plugin\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\ttry {\n\t\t\tconst context = this.createPluginContext(name)\n\t\t\tconst config = this.pluginConfigs.get(name)\n\n\t\t\t// Initialize plugin\n\t\t\tawait plugin.initialize(context, config)\n\n\t\t\t// Activate plugin\n\t\t\tawait plugin.activate(context)\n\n\t\t\tthis.enabledPlugins.add(name)\n\t\t\tthis.logger.info(`Plugin '${name}' enabled successfully`)\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 enable 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\t// Disable a plugin\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\ttry {\n\t\t\tconst context = this.createPluginContext(name)\n\n\t\t\t// Deactivate plugin\n\t\t\tawait plugin.deactivate(context)\n\n\t\t\t// Destroy plugin resources\n\t\t\tawait plugin.destroy(context)\n\n\t\t\tthis.enabledPlugins.delete(name)\n\t\t\tthis.logger.info(`Plugin '${name}' disabled successfully`)\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 disable 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\t// Configure a plugin\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\t// Update stored configuration\n\t\t\tthis.pluginConfigs.set(name, { ...this.pluginConfigs.get(name), ...config })\n\n\t\t\t// If plugin has configure method, call it\n\t\t\tif (plugin.configure) {\n\t\t\t\tawait plugin.configure(config)\n\t\t\t}\n\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\t// Enable multiple plugins with dependency resolution\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\t// Disable multiple plugins\n\tasync disablePlugins(names: string[]): Promise<void> {\n\t\t// Disable in reverse order to handle dependencies\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\t// Get enabled plugins\n\tgetEnabledPlugins(): Plugin[] {\n\t\treturn Array.from(this.enabledPlugins)\n\t\t\t.map((name) => this.plugins.get(name)!)\n\t\t\t.filter(Boolean)\n\t\t\t.sort(this.sortByPriority)\n\t}\n\n\t// Health check for all enabled plugins\n\tasync healthCheck(): Promise<{ name: string; healthy: boolean; error?: Error }[]> {\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\ttry {\n\t\t\t\tconst healthy = plugin.healthCheck ? await plugin.healthCheck() : true\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\t// Event handling\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\t// Create plugin context (will be implemented when we have the full context)\n\tprivate createPluginContext(pluginName: string): PluginContext {\n\t\t// This will be implemented when we integrate with the media player\n\t\t// For now, return a minimal context\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\t// Create plugin-specific logger\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\t// Resolve plugin dependencies\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\t// Visit dependencies first\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\t// Sort plugins by priority\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\tlow: 1\n\t\t}\n\n\t\treturn priorityOrder[b.metadata.priority] - priorityOrder[a.metadata.priority]\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","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","// 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","PluginRegistry","logger","__publicField","EventBus","factory","config","plugin","name","dependencies","conflicts","dep","activeConflicts","conflict","error","context","names","resolved","reversed","results","healthy","event","listener","data","handler","visiting","visit","a","b","priorityOrder","BasePlugin","metadata","oldConfig","newConfig","element","events","defaults","createPlugin","PluginClass","AnalyticsPlugin","mediaEventCleanup","cleanup","cleanupFunctions","unsubscribe","analyticsEvent","eventsToReport","response","createAnalyticsPlugin","ConsolePluginLogger","prefix","PluginValidator","schema","key","rules","value","PluginPerformanceMonitor","operation","fn","startTime","updateMetrics","endTime","duration","existing","result","pluginMetrics","PluginDevelopmentHelpers","time","volume","hooks","label","PluginStorage","defaultValue","item","defaultPluginLogger","defaultPerformanceMonitor","PLUGIN_SYSTEM_VERSION"],"mappings":"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"}
|
package/dist/core.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
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-DtsHBOtF.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-DXBCHU0v.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.SubtitleSelector}))),PlaylistManager:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.SubtitleSelector}))),QualitySelector:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.QualitySelector}))),PlaybackSpeedSelector:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.PlaybackSpeedSelector}))),ChaptersPanel:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.ChaptersPanel}))),PictureInPictureButton:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.PictureInPictureButton}))),AnalyticsTracker:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.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-BW-JjVgP.cjs")).then(t=>t.useEnhancedSubtitles$2);case l.PLAYLISTS:return Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(t=>t.advancedFeatures);case l.ADVANCED_CONTROLS:return Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(t=>t.advancedFeatures);case l.ANALYTICS:return Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(t=>t.advancedFeatures);case l.PICTURE_IN_PICTURE:return Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(t=>t.advancedFeatures);case l.QUALITY_SELECTOR:return Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(t=>t.advancedFeatures);case l.PLAYBACK_SPEED:return Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(t=>t.advancedFeatures);case l.CHAPTERS:return Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(t=>t.advancedFeatures);case l.THUMBNAILS:return Promise.resolve().then(()=>require("./enhanced-components-DXBCHU0v.cjs")).then(t=>t.advancedFeatures);case l.KEYBOARD_SHORTCUTS:return Promise.resolve().then(()=>require("./hooks-BW-JjVgP.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
|