@therealtinhtute/baroiplayer 1.2.0 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -73
- package/dist/components/icons/index.d.ts +36 -0
- package/dist/components/icons/index.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts +4 -0
- package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/AudioIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/AudioIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/BackwardIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/BackwardIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/CameraIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/CameraIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/CheckIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/CheckIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts +4 -0
- package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/ForwardIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/ForwardIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/LoadingIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/LoadingIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/PauseIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/PauseIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/PlayIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/PlayIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/QualityIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/QualityIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SettingsIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SettingsIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SliderIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SliderIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SubtitleIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SubtitleIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/UnPiPIcon.d.ts +4 -0
- package/dist/components/icons/svg-icons/UnPiPIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-audio.d.ts +13 -0
- package/dist/components/variants/gradient/gradient-audio.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-controls.d.ts +4 -0
- package/dist/components/variants/gradient/gradient-controls.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-glyphs.d.ts +30 -0
- package/dist/components/variants/gradient/gradient-glyphs.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-video.d.ts +16 -0
- package/dist/components/variants/gradient/gradient-video.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -112
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +786 -6271
- package/dist/index.mjs.map +1 -1
- package/dist/package.json +3 -0
- package/package.json +110 -108
- package/src/components/variants/gradient/gradient-audio.tsx +47 -0
- package/src/components/variants/gradient/gradient-controls.tsx +254 -0
- package/src/components/variants/gradient/gradient-glyphs.test.tsx +69 -0
- package/src/components/variants/gradient/gradient-glyphs.tsx +129 -0
- package/src/components/variants/gradient/gradient-skin.css +211 -0
- package/src/components/variants/gradient/gradient-video.tsx +70 -0
- package/src/index.ts +5 -198
- package/src/test/accessibility-utils.ts +0 -59
- package/dist/context/media.js +0 -2
- package/dist/context/media.js.map +0 -1
- package/dist/context/media.mjs +0 -15
- package/dist/context/media.mjs.map +0 -1
- package/dist/context/store.js +0 -2
- package/dist/context/store.js.map +0 -1
- package/dist/context/store.mjs +0 -5
- package/dist/context/store.mjs.map +0 -1
- package/dist/context-BYwDoSRX.js +0 -1172
- package/dist/context-BYwDoSRX.js.map +0 -1
- package/dist/context-eNS62_ac.cjs +0 -23
- package/dist/context-eNS62_ac.cjs.map +0 -1
- package/dist/core-events-B1iM2F46.cjs +0 -2
- package/dist/core-events-B1iM2F46.cjs.map +0 -1
- package/dist/core-events-DunPHKRE.js +0 -484
- package/dist/core-events-DunPHKRE.js.map +0 -1
- package/dist/core-plugins-By-4-kGs.cjs +0 -2
- package/dist/core-plugins-By-4-kGs.cjs.map +0 -1
- package/dist/core-plugins-DSBWcTuX.js +0 -821
- package/dist/core-plugins-DSBWcTuX.js.map +0 -1
- package/dist/core.js +0 -37
- package/dist/core.js.map +0 -1
- package/dist/core.mjs +0 -1233
- package/dist/core.mjs.map +0 -1
- package/dist/enhanced-components-B_l3cist.js +0 -1142
- package/dist/enhanced-components-B_l3cist.js.map +0 -1
- package/dist/enhanced-components-BspFs9OO.cjs +0 -2
- package/dist/enhanced-components-BspFs9OO.cjs.map +0 -1
- package/dist/hooks-BXwI8QG6.cjs +0 -4
- package/dist/hooks-BXwI8QG6.cjs.map +0 -1
- package/dist/hooks-Bpi-jDiO.js +0 -1816
- package/dist/hooks-Bpi-jDiO.js.map +0 -1
- package/dist/minimal-components-C4z900Ro.js +0 -1926
- package/dist/minimal-components-C4z900Ro.js.map +0 -1
- package/dist/minimal-components-v4qBp6jv.cjs +0 -2
- package/dist/minimal-components-v4qBp6jv.cjs.map +0 -1
- package/dist/minimal-components.css +0 -1
- package/dist/mona-loading.gif +0 -0
- package/dist/performance-monitor-C5k6FDXw.js +0 -301
- package/dist/performance-monitor-C5k6FDXw.js.map +0 -1
- package/dist/performance-monitor-lJmuUjQQ.cjs +0 -2
- package/dist/performance-monitor-lJmuUjQQ.cjs.map +0 -1
- package/dist/utils-CFOue_9K.cjs +0 -9
- package/dist/utils-CFOue_9K.cjs.map +0 -1
- package/dist/utils-Dzpl2ArK.js +0 -2844
- package/dist/utils-Dzpl2ArK.js.map +0 -1
- package/dist/utils.js +0 -2
- package/dist/utils.js.map +0 -1
- package/dist/utils.mjs +0 -11
- package/dist/utils.mjs.map +0 -1
- package/src/adapters/videojs-adapter.tsx +0 -470
- package/src/assets/mona-loading.gif +0 -0
- package/src/components/AnimateLoading.tsx +0 -107
- package/src/components/LoadingState.tsx +0 -239
- package/src/components/__tests__/media-player-accessibility.test.tsx +0 -510
- package/src/components/__tests__/media-player-react19.test.tsx +0 -457
- package/src/components/accessibility/keyboard-help-overlay.tsx +0 -207
- package/src/components/audio-player.tsx +0 -85
- package/src/components/basic/index.ts +0 -37
- package/src/components/enhanced/advanced-features.tsx +0 -311
- package/src/components/enhanced/debug-panel.tsx +0 -448
- package/src/components/enhanced/enhanced-controls.tsx +0 -597
- package/src/components/enhanced/enhanced-media-player.tsx +0 -566
- package/src/components/enhanced/error-handling.tsx +0 -338
- package/src/components/enhanced/index.ts +0 -39
- package/src/components/enhanced/media-player-enhanced.tsx +0 -383
- package/src/components/examples/basic-video-player.tsx +0 -50
- package/src/components/examples/custom-controls-example.tsx +0 -63
- package/src/components/examples/enhanced-controls-example.tsx +0 -100
- package/src/components/examples/enhanced-media-player-example.tsx +0 -302
- package/src/components/examples/loading-states-demo.tsx +0 -142
- package/src/components/examples/react-19-demo.tsx +0 -353
- package/src/components/examples/volume-orientation-demo.tsx +0 -106
- package/src/components/icon-demo.tsx +0 -196
- package/src/components/legacy.tsx +0 -87
- package/src/components/media-metadata-display.tsx +0 -99
- package/src/components/media-player-audio.tsx +0 -39
- package/src/components/media-player-controls.tsx +0 -223
- package/src/components/media-player-error.tsx +0 -163
- package/src/components/media-player-fullscreen.tsx +0 -109
- package/src/components/media-player-hls.tsx +0 -111
- package/src/components/media-player-loading.tsx +0 -76
- package/src/components/media-player-play.tsx +0 -75
- package/src/components/media-player-root.tsx +0 -338
- package/src/components/media-player-seek.tsx +0 -168
- package/src/components/media-player-time.tsx +0 -99
- package/src/components/media-player-tooltip.tsx +0 -58
- package/src/components/media-player-video.tsx +0 -54
- package/src/components/media-player-volume.tsx +0 -155
- package/src/components/media-player.tsx +0 -292
- package/src/components/media-suspense.tsx +0 -344
- package/src/components/player-settings-form.tsx +0 -158
- package/src/components/react-player-wrapper.tsx +0 -651
- package/src/components/simple-video-player.tsx +0 -62
- package/src/components/ui/blur-poster.tsx +0 -93
- package/src/components/ui/empty-state.tsx +0 -91
- package/src/components/ui/enhanced-seek-bar.tsx +0 -254
- package/src/components/ui/error-state.tsx +0 -124
- package/src/components/ui/fullscreen-button.tsx +0 -81
- package/src/components/ui/loading-skeleton.tsx +0 -107
- package/src/components/ui/media-resource-preloader.tsx +0 -458
- package/src/components/ui/offline-message.tsx +0 -98
- package/src/components/ui/play-button.tsx +0 -99
- package/src/components/ui/seek-bar.tsx +0 -191
- package/src/components/ui/time-display.tsx +0 -61
- package/src/components/ui/volume-control.tsx +0 -190
- package/src/components/unified/base-media-player.tsx +0 -252
- package/src/components/unified/media-player.tsx +0 -75
- package/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +0 -587
- package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +0 -573
- package/src/components/variants/minimal/MinimalControls.tsx +0 -124
- package/src/components/variants/minimal/MinimalLoading.tsx +0 -28
- package/src/components/variants/minimal/MinimalMediaPlayer.tsx +0 -318
- package/src/components/variants/minimal/MinimalOverlay.tsx +0 -58
- package/src/components/variants/minimal/MinimalPlayButton.tsx +0 -56
- package/src/components/variants/minimal/MinimalSeekBar.tsx +0 -140
- package/src/components/variants/minimal/MinimalVolumeControl.tsx +0 -75
- package/src/components/variants/minimal/SimpleMinimalPlayer.tsx +0 -206
- package/src/components/variants/minimal/components/CenterPlayButton.tsx +0 -22
- package/src/components/variants/minimal/components/ControlBar.tsx +0 -142
- package/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +0 -412
- package/src/components/variants/minimal/components/PlaybackControls.tsx +0 -46
- package/src/components/variants/minimal/components/RightControls.tsx +0 -164
- package/src/components/variants/minimal/components/SeekBar.tsx +0 -127
- package/src/components/variants/minimal/components/SettingsDropdown.tsx +0 -68
- package/src/components/variants/minimal/components/SubtitleDisplay.tsx +0 -21
- package/src/components/variants/minimal/components/TimeDisplay.tsx +0 -15
- package/src/components/variants/minimal/components/VideoElement.tsx +0 -33
- package/src/components/variants/minimal/components/VolumeControl.tsx +0 -220
- package/src/components/variants/minimal/index.ts +0 -23
- package/src/components/video-player.tsx +0 -100
- package/src/context/__tests__/media-store.test.ts +0 -509
- package/src/context/error-handling.ts +0 -398
- package/src/context/media-context.tsx +0 -254
- package/src/context/media-provider.tsx +0 -264
- package/src/context/media-store.ts +0 -387
- package/src/context/persistence.ts +0 -462
- package/src/core/events/event-system.ts +0 -448
- package/src/core/events/hooks.ts +0 -325
- package/src/core/events/index.ts +0 -22
- package/src/core/events/middleware.ts +0 -286
- package/src/core/index.ts +0 -22
- package/src/core/optimization/bundle-optimizer.tsx +0 -312
- package/src/core/performance/cicd.ts +0 -98
- package/src/core/performance/index.ts +0 -38
- package/src/core/performance/media-loading-optimizer.ts +0 -544
- package/src/core/performance/performance-budgets.ts +0 -437
- package/src/core/performance/performance-monitor.tsx +0 -488
- package/src/core/performance/performance-testing.ts +0 -461
- package/src/core/plugins/__tests__/registry.test.ts +0 -595
- package/src/core/plugins/base-plugin.ts +0 -225
- package/src/core/plugins/enhanced-plugin-system.ts +0 -435
- package/src/core/plugins/examples/analytics-plugin.ts +0 -241
- package/src/core/plugins/index.ts +0 -39
- package/src/core/plugins/registry.ts +0 -546
- package/src/core/plugins/types.ts +0 -169
- package/src/core/plugins/utils.ts +0 -317
- package/src/core/progressive-loading.tsx +0 -331
- package/src/core/providers/enhanced-hls-provider.ts +0 -307
- package/src/core/providers/lazy-provider.tsx +0 -14
- package/src/core/providers/service-provider.tsx +0 -164
- package/src/core/utils.tsx +0 -34
- package/src/features/media-session/media-session-manager.ts +0 -411
- package/src/features/picture-in-picture/pip-manager.ts +0 -428
- package/src/features/playlist/playlist-manager.ts +0 -626
- package/src/features/subtitles/subtitle-manager.ts +0 -435
- package/src/features/subtitles/subtitle-parser.ts +0 -284
- package/src/features/thumbnails/thumbnail-generator.ts +0 -528
- package/src/hooks/__tests__/currentTime-fix.test.ts +0 -149
- package/src/hooks/__tests__/use-media-player.test.ts +0 -712
- package/src/hooks/__tests__/use-media-state.test.tsx +0 -316
- package/src/hooks/accessibility/index.ts +0 -27
- package/src/hooks/accessibility/use-accessibility-preferences.ts +0 -190
- package/src/hooks/accessibility/use-focus-management.ts +0 -183
- package/src/hooks/accessibility/use-keyboard-shortcuts.ts +0 -152
- package/src/hooks/accessibility/use-screen-reader.ts +0 -212
- package/src/hooks/core/index.ts +0 -47
- package/src/hooks/legacy.ts +0 -21
- package/src/hooks/use-buffer-health.ts +0 -218
- package/src/hooks/use-enhanced-media-player.ts +0 -575
- package/src/hooks/use-focus-trap.tsx +0 -162
- package/src/hooks/use-intelligent-preloading.ts +0 -387
- package/src/hooks/use-keyboard-controls.ts +0 -115
- package/src/hooks/use-keyboard-shortcuts.ts +0 -255
- package/src/hooks/use-media-actions.ts +0 -184
- package/src/hooks/use-media-metadata.ts +0 -91
- package/src/hooks/use-media-optimistic.ts +0 -264
- package/src/hooks/use-media-player.ts +0 -343
- package/src/hooks/use-media-state.ts +0 -194
- package/src/hooks/use-memory-optimization.ts +0 -360
- package/src/hooks/use-network-status.ts +0 -124
- package/src/hooks/use-optimistic-controls.ts +0 -95
- package/src/hooks/use-optimized-media.ts +0 -283
- package/src/hooks/use-smart-preload.ts +0 -229
- package/src/hooks/use-touch-gestures.ts +0 -461
- package/src/hooks/useEnhancedSubtitles.ts +0 -258
- package/src/hooks/useKeyboardShortcuts.ts +0 -106
- package/src/hooks/useMediaControls.ts +0 -52
- package/src/hooks/useScreenshot.ts +0 -61
- package/src/hooks/useSubtitles.ts +0 -91
- package/src/hooks/useVideoPlayer.ts +0 -278
- package/src/icons/components/FullscreenIcon.tsx +0 -36
- package/src/icons/components/SettingsIcon.tsx +0 -37
- package/src/icons/components/animated/LoadingIcon.tsx +0 -27
- package/src/icons/components/animated/PlayPauseIcon.tsx +0 -42
- package/src/icons/components/media/PauseIcon.tsx +0 -38
- package/src/icons/components/media/PlayIcon.tsx +0 -37
- package/src/icons/components/volume/VolumeIcon.tsx +0 -38
- package/src/icons/components/volume/VolumeOffIcon.tsx +0 -38
- package/src/icons/index.ts +0 -56
- package/src/icons/provider.tsx +0 -58
- package/src/icons/types.ts +0 -60
- package/src/index-enhanced.ts +0 -35
- package/src/index-legacy.ts +0 -324
- package/src/index.css +0 -102
- package/src/lib/__tests__/async-utils.test.ts +0 -291
- package/src/lib/async-utils.ts +0 -194
- package/src/lib/deprecation.ts +0 -51
- package/src/lib/format-time.ts +0 -37
- package/src/lib/index.ts +0 -4
- package/src/lib/utils.ts +0 -6
- package/src/styles/globals.css +0 -462
- package/src/styles/minimal-player.css +0 -621
- package/src/styles/pixel-art.css +0 -41
- package/src/styles/videojs.css +0 -100
- package/src/types/events.ts +0 -47
- package/src/types/formats.ts +0 -79
- package/src/types/index.ts +0 -203
- package/src/types/videojs-plugins.d.ts +0 -14
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"core-events-DunPHKRE.js","sources":["../src/core/events/event-system.ts","../src/core/events/middleware.ts","../src/core/events/hooks.ts","../src/core/events/index.ts"],"sourcesContent":["// Event system types\nexport interface MediaPlayerEvent {\n\ttype: string\n\ttimestamp: number\n\ttarget?: string\n\tdetail?: any\n\tbubbles?: boolean\n\tcancelable?: boolean\n\tdefaultPrevented?: boolean\n}\n\nexport type EventHandler<T = any> = (event: MediaPlayerEvent & { detail: T }) => void\nexport type EventUnsubscriber = () => void\n\nexport interface EventOptions {\n\tonce?: boolean\n\tpassive?: boolean\n\tpriority?: \"high\" | \"normal\" | \"low\"\n\tfilter?: (event: MediaPlayerEvent) => boolean\n}\n\n// Event categories for organization\nexport type EventCategory =\n\t| \"media\" // Media playback events\n\t| \"user\" // User interaction events\n\t| \"system\" // System/internal events\n\t| \"plugin\" // Plugin events\n\t| \"error\" // Error events\n\t| \"performance\" // Performance events\n\n// Standard media events\nexport interface MediaEvents {\n\t// Playback events\n\t\"media:loadstart\": { src: string }\n\t\"media:loadeddata\": { duration: number }\n\t\"media:canplay\": {}\n\t\"media:canplaythrough\": {}\n\t\"media:play\": { currentTime: number }\n\t\"media:pause\": { currentTime: number }\n\t\"media:ended\": { duration: number }\n\t\"media:seeking\": { currentTime: number; targetTime: number }\n\t\"media:seeked\": { currentTime: number; previousTime: number }\n\t\"media:timeupdate\": { currentTime: number; duration: number }\n\t\"media:durationchange\": { duration: number }\n\t\"media:volumechange\": { volume: number; muted: boolean }\n\t\"media:ratechange\": { playbackRate: number }\n\n\t// Loading events\n\t\"media:loadedmetadata\": { src: string }\n\t\"media:progress\": { buffered: TimeRanges }\n\t\"media:suspend\": {}\n\t\"media:abort\": {}\n\t\"media:error\": { error: Error }\n\t\"media:stalled\": {}\n\t\"media:waiting\": {}\n\n\t// User interaction events\n\t\"user:click\": { x: number; y: number; element: string }\n\t\"user:hover\": { element: string }\n\t\"user:focus\": { element: string }\n\t\"user:keyboard\": {\n\t\tkey: string\n\t\tcode: string\n\t\taltKey: boolean\n\t\tctrlKey: boolean\n\t\tshiftKey: boolean\n\t}\n\t\"user:gesture\": { type: string; data: any }\n\n\t// System events\n\t\"system:ready\": {}\n\t\"system:resize\": { width: number; height: number }\n\t\"system:fullscreen\": { isFullscreen: boolean }\n\t\"system:pip\": { isPictureInPicture: boolean }\n\t\"system:visibility\": { isVisible: boolean }\n\n\t// Plugin events\n\t\"plugin:loaded\": { name: string }\n\t\"plugin:enabled\": { name: string }\n\t\"plugin:disabled\": { name: string }\n\t\"plugin:error\": { name: string; error: Error }\n\n\t// Performance events\n\t\"performance:fps\": { fps: number }\n\t\"performance:memory\": { used: number; total: number }\n\t\"performance:load\": { loadTime: number }\n}\n\n// Event bus implementation\nexport class EventBus {\n\tprivate listeners = new Map<\n\t\tstring,\n\t\tArray<{\n\t\t\thandler: EventHandler\n\t\t\toptions: EventOptions\n\t\t\tid: string\n\t\t}>\n\t>()\n\n\tprivate eventQueue: MediaPlayerEvent[] = []\n\tprivate isProcessing = false\n\tprivate middlewares: Array<(event: MediaPlayerEvent) => MediaPlayerEvent | null> = []\n\tprivate eventHistory: MediaPlayerEvent[] = []\n\tprivate maxHistorySize = 1000\n\n\t// Subscribe to events\n\ton<K extends keyof MediaEvents>(\n\t\ttype: K,\n\t\thandler: EventHandler<MediaEvents[K]>,\n\t\toptions: EventOptions = {}\n\t): EventUnsubscriber {\n\t\treturn this.addEventListener(type, handler as EventHandler, options)\n\t}\n\n\t// Subscribe to events (one-time)\n\tonce<K extends keyof MediaEvents>(\n\t\ttype: K,\n\t\thandler: EventHandler<MediaEvents[K]>,\n\t\toptions: EventOptions = {}\n\t): EventUnsubscriber {\n\t\treturn this.addEventListener(type, handler as EventHandler, { ...options, once: true })\n\t}\n\n\t// Subscribe to events with wildcard support\n\taddEventListener(\n\t\ttype: string,\n\t\thandler: EventHandler,\n\t\toptions: EventOptions = {}\n\t): EventUnsubscriber {\n\t\tconst id = this.generateId()\n\t\tconst listener = { handler, options, id }\n\n\t\tif (!this.listeners.has(type)) {\n\t\t\tthis.listeners.set(type, [])\n\t\t}\n\n\t\tconst listeners = this.listeners.get(type)!\n\n\t\t// Insert based on priority\n\t\tconst priority = options.priority || \"normal\"\n\t\tconst priorityValue = { high: 2, normal: 1, low: 0 }[priority]\n\n\t\tlet insertIndex = listeners.length\n\t\tfor (let i = 0; i < listeners.length; i++) {\n\t\t\tconst listener = listeners[i]\n\t\t\tif (!listener) continue\n\t\t\tconst listenerPriority = listener.options.priority || \"normal\"\n\t\t\tif (priorityValue > { high: 2, normal: 1, low: 0 }[listenerPriority]) {\n\t\t\t\tinsertIndex = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tlisteners.splice(insertIndex, 0, listener)\n\n\t\t// Return unsubscriber\n\t\treturn () => {\n\t\t\tconst index = listeners.findIndex((l) => l.id === id)\n\t\t\tif (index !== -1) {\n\t\t\t\tlisteners.splice(index, 1)\n\t\t\t}\n\t\t\tif (listeners.length === 0) {\n\t\t\t\tthis.listeners.delete(type)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove event listener\n\tremoveEventListener(type: string, handler?: EventHandler): void {\n\t\tconst listeners = this.listeners.get(type)\n\t\tif (!listeners) return\n\n\t\tif (handler) {\n\t\t\tconst index = listeners.findIndex((l) => l.handler === handler)\n\t\t\tif (index !== -1) {\n\t\t\t\tlisteners.splice(index, 1)\n\t\t\t}\n\t\t} else {\n\t\t\tthis.listeners.delete(type)\n\t\t}\n\n\t\tif (listeners && listeners.length === 0) {\n\t\t\tthis.listeners.delete(type)\n\t\t}\n\t}\n\n\t// Emit events\n\temit<K extends keyof MediaEvents>(\n\t\ttype: K,\n\t\tdetail?: MediaEvents[K],\n\t\toptions?: Partial<MediaPlayerEvent>\n\t): boolean {\n\t\tconst event: MediaPlayerEvent = {\n\t\t\ttype,\n\t\t\ttimestamp: Date.now(),\n\t\t\tdetail,\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t\tdefaultPrevented: false,\n\t\t\t...options\n\t\t}\n\n\t\treturn this.dispatchEvent(event)\n\t}\n\n\t// Dispatch event\n\tdispatchEvent(event: MediaPlayerEvent): boolean {\n\t\t// Apply middlewares\n\t\tlet processedEvent: MediaPlayerEvent | null = event\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tprocessedEvent = middleware(processedEvent)\n\t\t\tif (!processedEvent) {\n\t\t\t\treturn false // Event was cancelled by middleware\n\t\t\t}\n\t\t}\n\n\t\t// Add to history\n\t\tthis.addToHistory(processedEvent)\n\n\t\t// Queue event for processing\n\t\tthis.eventQueue.push(processedEvent)\n\n\t\tif (!this.isProcessing) {\n\t\t\tthis.processEventQueue()\n\t\t}\n\n\t\treturn !processedEvent.defaultPrevented\n\t}\n\n\t// Process event queue with React 19 concurrent scheduling\n\tprivate processEventQueue(): void {\n\t\tif (this.isProcessing) return\n\n\t\tthis.isProcessing = true\n\n\t\t// Use scheduler for non-blocking event processing\n\t\tconst schedule =\n\t\t\ttypeof window !== \"undefined\" && \"scheduler\" in window\n\t\t\t\t? (window as any).scheduler.postTask\n\t\t\t\t: (cb: () => void) => setTimeout(cb, 0)\n\n\t\tconst processNext = () => {\n\t\t\tif (this.eventQueue.length === 0) {\n\t\t\t\tthis.isProcessing = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst batchSize = Math.min(this.eventQueue.length, 5) // Process max 5 events per frame\n\t\t\tconst events = this.eventQueue.splice(0, batchSize)\n\n\t\t\t// Process events in parallel using Promise.all\n\t\t\tPromise.all(events.map((event) => this.processEvent(event).catch(console.error)))\n\t\t\t\t.then(() => {\n\t\t\t\t\t// Schedule next batch in next frame\n\t\t\t\t\tschedule(processNext)\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\tthis.isProcessing = false\n\t\t\t\t})\n\t\t}\n\n\t\tschedule(processNext)\n\t}\n\n\t// Process individual event\n\tprivate async processEvent(event: MediaPlayerEvent): Promise<void> {\n\t\tconst { type } = event\n\n\t\t// Get exact matches\n\t\tconst exactListeners = this.listeners.get(type) || []\n\n\t\t// Get wildcard matches\n\t\tconst wildcardListeners: typeof exactListeners = []\n\t\tfor (const [pattern, listeners] of this.listeners.entries()) {\n\t\t\tif (pattern.includes(\"*\") && this.matchPattern(type, pattern)) {\n\t\t\t\twildcardListeners.push(...listeners)\n\t\t\t}\n\t\t}\n\n\t\t// Combine and sort by priority\n\t\tconst allListeners = [...exactListeners, ...wildcardListeners].sort((a, b) => {\n\t\t\tconst priorityA = { high: 2, normal: 1, low: 0 }[a.options.priority || \"normal\"]\n\t\t\tconst priorityB = { high: 2, normal: 1, low: 0 }[b.options.priority || \"normal\"]\n\t\t\treturn priorityB - priorityA\n\t\t})\n\n\t\t// Execute listeners\n\t\tconst listenersToRemove: string[] = []\n\n\t\tfor (const listener of allListeners) {\n\t\t\t// Apply filter if present\n\t\t\tif (listener.options.filter && !listener.options.filter(event)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// Execute handler\n\t\t\t\tawait Promise.resolve(listener.handler(event as any))\n\n\t\t\t\t// Mark for removal if once\n\t\t\t\tif (listener.options.once) {\n\t\t\t\t\tlistenersToRemove.push(listener.id)\n\t\t\t\t}\n\n\t\t\t\t// Stop propagation if event was cancelled\n\t\t\t\tif (event.defaultPrevented && !event.bubbles) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Error in event handler for ${type}:`, error)\n\n\t\t\t\t// Log error instead\n\t\t\t\tconsole.error(`Event handler error for ${type}:`, error)\n\t\t\t}\n\t\t}\n\n\t\t// Remove one-time listeners\n\t\tfor (const id of listenersToRemove) {\n\t\t\tfor (const [eventType, listeners] of this.listeners.entries()) {\n\t\t\t\tconst index = listeners.findIndex((l) => l.id === id)\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tlisteners.splice(index, 1)\n\t\t\t\t\tif (listeners.length === 0) {\n\t\t\t\t\t\tthis.listeners.delete(eventType)\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add middleware\n\tuse(middleware: (event: MediaPlayerEvent) => MediaPlayerEvent | null): () => void {\n\t\tthis.middlewares.push(middleware)\n\t\treturn () => {\n\t\t\tconst index = this.middlewares.indexOf(middleware)\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.middlewares.splice(index, 1)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Event history management\n\tprivate addToHistory(event: MediaPlayerEvent): void {\n\t\tthis.eventHistory.push(event)\n\t\tif (this.eventHistory.length > this.maxHistorySize) {\n\t\t\tthis.eventHistory.shift()\n\t\t}\n\t}\n\n\t// Get event history\n\tgetHistory(filter?: (event: MediaPlayerEvent) => boolean): MediaPlayerEvent[] {\n\t\treturn filter ? this.eventHistory.filter(filter) : [...this.eventHistory]\n\t}\n\n\t// Clear event history\n\tclearHistory(): void {\n\t\tthis.eventHistory = []\n\t}\n\n\t// Pattern matching for wildcards\n\tprivate matchPattern(eventType: string, pattern: string): boolean {\n\t\tconst regex = new RegExp(\"^\" + pattern.replace(/\\*/g, \".*\").replace(/\\?/g, \".\") + \"$\")\n\t\treturn regex.test(eventType)\n\t}\n\n\t// Generate unique ID\n\tprivate generateId(): string {\n\t\treturn `event_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n\t}\n\n\t// Get listener count\n\tgetListenerCount(type?: string): number {\n\t\tif (type) {\n\t\t\treturn this.listeners.get(type)?.length || 0\n\t\t}\n\t\treturn Array.from(this.listeners.values()).reduce((sum, listeners) => sum + listeners.length, 0)\n\t}\n\n\t// Get all event types\n\tgetEventTypes(): string[] {\n\t\treturn Array.from(this.listeners.keys())\n\t}\n\n\t// Clear all listeners\n\tremoveAllListeners(type?: string): void {\n\t\tif (type) {\n\t\t\tthis.listeners.delete(type)\n\t\t} else {\n\t\t\tthis.listeners.clear()\n\t\t}\n\t}\n\n\t// Destroy event bus\n\tdestroy(): void {\n\t\tthis.listeners.clear()\n\t\tthis.eventQueue = []\n\t\tthis.middlewares = []\n\t\tthis.eventHistory = []\n\t\tthis.isProcessing = false\n\t}\n}\n\n// Default event bus instance\nexport const defaultEventBus = new EventBus()\n\n// Event delegation helper\nexport class EventDelegator {\n\tprivate eventBus: EventBus\n\tprivate element: HTMLElement\n\tprivate delegatedEvents = new Set<string>()\n\n\tconstructor(eventBus: EventBus, element: HTMLElement) {\n\t\tthis.eventBus = eventBus\n\t\tthis.element = element\n\t}\n\n\t// Delegate DOM events to event bus\n\tdelegate(domEvent: string, mediaEvent?: string): void {\n\t\tif (this.delegatedEvents.has(domEvent)) return\n\n\t\tconst handler = (e: Event) => {\n\t\t\tthis.eventBus.emit(mediaEvent || (`dom:${domEvent}` as any), {\n\t\t\t\toriginalEvent: e,\n\t\t\t\ttarget: (e.target as HTMLElement)?.tagName.toLowerCase(),\n\t\t\t\tcurrentTarget: (e.currentTarget as HTMLElement)?.tagName.toLowerCase()\n\t\t\t})\n\t\t}\n\n\t\tthis.element.addEventListener(domEvent, handler, { passive: true })\n\t\tthis.delegatedEvents.add(domEvent)\n\t}\n\n\t// Setup common delegations\n\tsetupCommonDelegations(): void {\n\t\tthis.delegate(\"click\", \"user:click\")\n\t\tthis.delegate(\"mouseenter\", \"user:hover\")\n\t\tthis.delegate(\"mouseleave\", \"user:hover\")\n\t\tthis.delegate(\"focus\", \"user:focus\")\n\t\tthis.delegate(\"blur\", \"user:focus\")\n\t\tthis.delegate(\"keydown\", \"user:keyboard\")\n\t\tthis.delegate(\"keyup\", \"user:keyboard\")\n\t}\n\n\tdestroy(): void {\n\t\tthis.delegatedEvents.clear()\n\t}\n}\n","import type { MediaPlayerEvent } from \"./event-system\"\n\n// Middleware function type\nexport type EventMiddleware = (event: MediaPlayerEvent) => MediaPlayerEvent | null\n\n// Common middleware implementations\nexport const eventMiddlewares = {\n\t// Logging middleware\n\tlogger:\n\t\t(prefix = \"[Event]\"): EventMiddleware =>\n\t\t(event) => {\n\t\t\tif (process.env.NODE_ENV === \"development\") {\n\t\t\t\tconsole.log(`${prefix} ${event.type}`, event.detail)\n\t\t\t}\n\t\t\treturn event\n\t\t},\n\n\t// Throttling middleware\n\tthrottle: (eventTypes: string[], delay = 100): EventMiddleware => {\n\t\tconst lastTimes = new Map<string, number>()\n\n\t\treturn (event) => {\n\t\t\tif (eventTypes.includes(event.type)) {\n\t\t\t\tconst lastTime = lastTimes.get(event.type) || 0\n\t\t\t\tconst now = event.timestamp\n\n\t\t\t\tif (now - lastTime < delay) {\n\t\t\t\t\treturn null // Throttle this event\n\t\t\t\t}\n\n\t\t\t\tlastTimes.set(event.type, now)\n\t\t\t}\n\n\t\t\treturn event\n\t\t}\n\t},\n\n\t// Debouncing middleware\n\tdebounce: (eventTypes: string[], delay = 100): EventMiddleware => {\n\t\tconst timeouts = new Map<string, NodeJS.Timeout>()\n\t\tconst eventQueue = new Map<string, MediaPlayerEvent>()\n\n\t\treturn (event) => {\n\t\t\tif (eventTypes.includes(event.type)) {\n\t\t\t\t// Clear existing timeout\n\t\t\t\tconst existingTimeout = timeouts.get(event.type)\n\t\t\t\tif (existingTimeout) {\n\t\t\t\t\tclearTimeout(existingTimeout)\n\t\t\t\t}\n\n\t\t\t\t// Store the latest event\n\t\t\t\teventQueue.set(event.type, event)\n\n\t\t\t\t// Set new timeout\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\tconst queuedEvent = eventQueue.get(event.type)\n\t\t\t\t\tif (queuedEvent) {\n\t\t\t\t\t\t// Process the debounced event\n\t\t\t\t\t\t// Note: This is a simplified approach - in a real implementation,\n\t\t\t\t\t\t// you'd need to re-inject the event into the processing pipeline\n\t\t\t\t\t\teventQueue.delete(event.type)\n\t\t\t\t\t\ttimeouts.delete(event.type)\n\t\t\t\t\t}\n\t\t\t\t}, delay)\n\n\t\t\t\ttimeouts.set(event.type, timeout)\n\n\t\t\t\treturn null // Don't process immediately\n\t\t\t}\n\n\t\t\treturn event\n\t\t}\n\t},\n\n\t// Filtering middleware\n\tfilter:\n\t\t(predicate: (event: MediaPlayerEvent) => boolean): EventMiddleware =>\n\t\t(event) => {\n\t\t\treturn predicate(event) ? event : null\n\t\t},\n\n\t// Event transformation middleware\n\ttransform:\n\t\t(transformer: (event: MediaPlayerEvent) => MediaPlayerEvent): EventMiddleware =>\n\t\t(event) => {\n\t\t\ttry {\n\t\t\t\treturn transformer(event)\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Error in event transformer:\", error)\n\t\t\t\treturn event\n\t\t\t}\n\t\t},\n\n\t// Performance monitoring middleware\n\tperformance: (): EventMiddleware => {\n\t\tconst metrics = new Map<string, { count: number; totalTime: number }>()\n\n\t\treturn (event) => {\n\t\t\tconst startTime = performance.now()\n\n\t\t\t// Update metrics\n\t\t\tconst existing = metrics.get(event.type) || { count: 0, totalTime: 0 }\n\t\t\texisting.count++\n\t\t\texisting.totalTime += performance.now() - startTime\n\t\t\tmetrics.set(event.type, existing)\n\n\t\t\t// Log metrics periodically (every 100 events)\n\t\t\tif (existing.count % 100 === 0) {\n\t\t\t\tconst avgTime = existing.totalTime / existing.count\n\t\t\t\tconsole.log(`Event ${event.type}: ${existing.count} calls, avg ${avgTime.toFixed(2)}ms`)\n\t\t\t}\n\n\t\t\treturn event\n\t\t}\n\t},\n\n\t// Error handling middleware\n\terrorHandler:\n\t\t(onError?: (error: Error, event: MediaPlayerEvent) => void): EventMiddleware =>\n\t\t(event) => {\n\t\t\ttry {\n\t\t\t\t// Validate event structure\n\t\t\t\tif (!event.type || typeof event.type !== \"string\") {\n\t\t\t\t\tthrow new Error(\"Invalid event: missing or invalid type\")\n\t\t\t\t}\n\n\t\t\t\tif (!event.timestamp || typeof event.timestamp !== \"number\") {\n\t\t\t\t\tthrow new Error(\"Invalid event: missing or invalid timestamp\")\n\t\t\t\t}\n\n\t\t\t\treturn event\n\t\t\t} catch (error) {\n\t\t\t\tif (onError) {\n\t\t\t\t\tonError(error as Error, event)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Event validation error:\", error)\n\t\t\t\t}\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t// Security middleware (prevent certain events or sanitize data)\n\tsecurity:\n\t\t(\n\t\t\toptions: {\n\t\t\t\tblockedEventTypes?: string[]\n\t\t\t\tsanitizeDetail?: boolean\n\t\t\t\tmaxDetailSize?: number\n\t\t\t} = {}\n\t\t): EventMiddleware =>\n\t\t(event) => {\n\t\t\tconst { blockedEventTypes = [], sanitizeDetail = true, maxDetailSize = 10000 } = options\n\n\t\t\t// Block certain event types\n\t\t\tif (blockedEventTypes.includes(event.type)) {\n\t\t\t\tconsole.warn(`Blocked event type: ${event.type}`)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Sanitize detail if needed\n\t\t\tif (sanitizeDetail && event.detail) {\n\t\t\t\ttry {\n\t\t\t\t\tconst detailStr = JSON.stringify(event.detail)\n\t\t\t\t\tif (detailStr.length > maxDetailSize) {\n\t\t\t\t\t\tconsole.warn(`Event detail too large, truncating: ${event.type}`)\n\t\t\t\t\t\tevent.detail = { ...event.detail, _truncated: true }\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.warn(`Failed to serialize event detail: ${event.type}`)\n\t\t\t\t\tevent.detail = { _serializationError: true }\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn event\n\t\t},\n\n\t// Conditional middleware\n\twhen:\n\t\t(\n\t\t\tcondition: (event: MediaPlayerEvent) => boolean,\n\t\t\tmiddleware: EventMiddleware\n\t\t): EventMiddleware =>\n\t\t(event) => {\n\t\t\treturn condition(event) ? middleware(event) : event\n\t\t},\n\n\t// Chain multiple middleware\n\tchain:\n\t\t(...middlewares: EventMiddleware[]): EventMiddleware =>\n\t\t(event) => {\n\t\t\tlet currentEvent: MediaPlayerEvent | null = event\n\n\t\t\tfor (const middleware of middlewares) {\n\t\t\t\tif (currentEvent === null) break\n\t\t\t\tcurrentEvent = middleware(currentEvent)\n\t\t\t}\n\n\t\t\treturn currentEvent\n\t\t}\n}\n\n// Middleware builder class\nexport class MiddlewareBuilder {\n\tprivate middlewares: EventMiddleware[] = []\n\n\t// Add middleware\n\tuse(middleware: EventMiddleware): this {\n\t\tthis.middlewares.push(middleware)\n\t\treturn this\n\t}\n\n\t// Add logging\n\tlog(prefix?: string): this {\n\t\treturn this.use(eventMiddlewares.logger(prefix))\n\t}\n\n\t// Add throttling\n\tthrottle(eventTypes: string[], delay?: number): this {\n\t\treturn this.use(eventMiddlewares.throttle(eventTypes, delay))\n\t}\n\n\t// Add debouncing\n\tdebounce(eventTypes: string[], delay?: number): this {\n\t\treturn this.use(eventMiddlewares.debounce(eventTypes, delay))\n\t}\n\n\t// Add filtering\n\tfilter(predicate: (event: MediaPlayerEvent) => boolean): this {\n\t\treturn this.use(eventMiddlewares.filter(predicate))\n\t}\n\n\t// Add transformation\n\ttransform(transformer: (event: MediaPlayerEvent) => MediaPlayerEvent): this {\n\t\treturn this.use(eventMiddlewares.transform(transformer))\n\t}\n\n\t// Add performance monitoring\n\tperformance(): this {\n\t\treturn this.use(eventMiddlewares.performance())\n\t}\n\n\t// Add error handling\n\terrorHandler(onError?: (error: Error, event: MediaPlayerEvent) => void): this {\n\t\treturn this.use(eventMiddlewares.errorHandler(onError))\n\t}\n\n\t// Add security\n\tsecurity(options?: Parameters<typeof eventMiddlewares.security>[0]): this {\n\t\treturn this.use(eventMiddlewares.security(options))\n\t}\n\n\t// Add conditional middleware\n\twhen(condition: (event: MediaPlayerEvent) => boolean, middleware: EventMiddleware): this {\n\t\treturn this.use(eventMiddlewares.when(condition, middleware))\n\t}\n\n\t// Build the final middleware\n\tbuild(): EventMiddleware {\n\t\treturn eventMiddlewares.chain(...this.middlewares)\n\t}\n}\n\n// Helper to create middleware builder\nexport const createMiddleware = () => new MiddlewareBuilder()\n\n// Export commonly used middleware combinations\nexport const commonMiddlewares = {\n\t// Development middleware stack\n\tdevelopment: () => createMiddleware().log(\"[Dev Event]\").performance().errorHandler().build(),\n\n\t// Production middleware stack\n\tproduction: () =>\n\t\tcreateMiddleware()\n\t\t\t.security()\n\t\t\t.errorHandler()\n\t\t\t.throttle([\"media:timeupdate\", \"user:mousemove\"], 16) // ~60fps\n\t\t\t.build(),\n\n\t// Testing middleware stack\n\ttesting: () =>\n\t\tcreateMiddleware()\n\t\t\t.errorHandler((error, event) => {\n\t\t\t\tthrow new Error(`Event error in test: ${error.message} for event ${event.type}`)\n\t\t\t})\n\t\t\t.build()\n}\n","import React, { useEffect, useRef, useCallback, useMemo, useState } from \"react\"\nimport {\n\tEventBus,\n\ttype EventHandler,\n\ttype EventOptions,\n\ttype EventUnsubscriber,\n\ttype MediaEvents\n} from \"./event-system\"\n\n// Hook to use event bus with React\nexport function useEventBus(eventBus?: EventBus): EventBus {\n\tconst [eventBusInstance, setEventBusInstance] = useState(() => eventBus || new EventBus())\n\n\tuseEffect(() => {\n\t\t// If an external eventBus is provided, we don't manage its lifecycle\n\t\tif (eventBus) {\n\t\t\tsetEventBusInstance(eventBus)\n\t\t\treturn () => {\n\t\t\t\t// Don't destroy externally provided event bus\n\t\t\t}\n\t\t}\n\n\t\treturn () => {\n\t\t\t// Cleanup internally created event bus on unmount\n\t\t\teventBusInstance.destroy()\n\t\t}\n\t}, [eventBus, eventBusInstance])\n\n\treturn eventBusInstance\n}\n\n// Hook to listen to events\nexport function useEventListener<K extends keyof MediaEvents>(\n\teventBus: EventBus,\n\ttype: K,\n\thandler: EventHandler<MediaEvents[K]>,\n\toptions?: EventOptions,\n\tdeps?: React.DependencyList\n): void {\n\tconst handlerRef = useRef(handler)\n\tconst optionsRef = useRef(options)\n\n\t// Update refs when dependencies change\n\tuseEffect(() => {\n\t\thandlerRef.current = handler\n\t\toptionsRef.current = options\n\t})\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = eventBus.on(type, handlerRef.current, optionsRef.current)\n\t\treturn unsubscribe\n\t}, [eventBus, type])\n}\n\n// Hook to emit events\nexport function useEventEmitter(eventBus: EventBus) {\n\treturn useCallback(\n\t\t<K extends keyof MediaEvents>(\n\t\t\ttype: K,\n\t\t\tdetail?: MediaEvents[K],\n\t\t\toptions?: Partial<MediaEvents[K]>\n\t\t) => {\n\t\t\treturn eventBus.emit(type, detail, options)\n\t\t},\n\t\t[eventBus]\n\t)\n}\n\n// Hook for one-time event listeners\nexport function useEventOnce<K extends keyof MediaEvents>(\n\teventBus: EventBus,\n\ttype: K,\n\thandler: EventHandler<MediaEvents[K]>,\n\tdeps?: React.DependencyList\n): void {\n\tuseEventListener(eventBus, type, handler, { once: true }, deps)\n}\n\n// Hook to create event handlers with automatic cleanup\nexport function useEventHandlers(eventBus: EventBus) {\n\tconst handlersRef = useRef<EventUnsubscriber[]>([])\n\n\tconst addHandler = useCallback(\n\t\t<K extends keyof MediaEvents>(\n\t\t\ttype: K,\n\t\t\thandler: EventHandler<MediaEvents[K]>,\n\t\t\toptions?: EventOptions\n\t\t) => {\n\t\t\tconst unsubscribe = eventBus.on(type, handler, options)\n\t\t\thandlersRef.current.push(unsubscribe)\n\t\t\treturn unsubscribe\n\t\t},\n\t\t[eventBus]\n\t)\n\n\tconst removeAllHandlers = useCallback(() => {\n\t\thandlersRef.current.forEach((unsubscribe) => unsubscribe())\n\t\thandlersRef.current = []\n\t}, [])\n\n\tuseEffect(() => {\n\t\treturn removeAllHandlers\n\t}, [removeAllHandlers])\n\n\treturn {\n\t\ton: addHandler,\n\t\tremoveAll: removeAllHandlers\n\t}\n}\n\n// Hook for event history\nexport function useEventHistory(\n\teventBus: EventBus,\n\tfilter?: (event: any) => boolean,\n\tmaxSize = 100\n) {\n\tconst [history, setHistory] = useState<any[]>([])\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = eventBus.addEventListener(\"*\", (event) => {\n\t\t\tif (!filter || filter(event)) {\n\t\t\t\tsetHistory((prevHistory) => {\n\t\t\t\t\tconst newHistory = [...prevHistory, event]\n\n\t\t\t\t\t// Limit history size\n\t\t\t\t\tif (newHistory.length > maxSize) {\n\t\t\t\t\t\treturn newHistory.slice(-maxSize)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn newHistory\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\treturn unsubscribe\n\t}, [eventBus, filter, maxSize])\n\n\tconst clearHistory = useCallback(() => {\n\t\tsetHistory([])\n\t}, [])\n\n\treturn {\n\t\thistory,\n\t\tclearHistory\n\t}\n}\n\n// Hook for event metrics/analytics\nexport function useEventMetrics(eventBus: EventBus) {\n\tconst metricsRef = useRef<\n\t\tMap<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tcount: number\n\t\t\t\tlastTimestamp: number\n\t\t\t\tfrequency: number // events per second\n\t\t\t}\n\t\t>\n\t>(new Map())\n\n\tuseEffect(() => {\n\t\tconst updateMetrics = (event: any) => {\n\t\t\tconst existing = metricsRef.current.get(event.type) || {\n\t\t\t\tcount: 0,\n\t\t\t\tlastTimestamp: 0,\n\t\t\t\tfrequency: 0\n\t\t\t}\n\n\t\t\texisting.count++\n\n\t\t\tif (existing.lastTimestamp > 0) {\n\t\t\t\tconst timeDiff = (event.timestamp - existing.lastTimestamp) / 1000 // seconds\n\t\t\t\texisting.frequency = timeDiff > 0 ? 1 / timeDiff : 0\n\t\t\t}\n\n\t\t\texisting.lastTimestamp = event.timestamp\n\t\t\tmetricsRef.current.set(event.type, existing)\n\t\t}\n\n\t\tconst unsubscribe = eventBus.addEventListener(\"*\", updateMetrics)\n\t\treturn unsubscribe\n\t}, [eventBus])\n\n\tconst getMetrics = useCallback(() => {\n\t\treturn Object.fromEntries(metricsRef.current.entries())\n\t}, [])\n\n\tconst resetMetrics = useCallback(() => {\n\t\tmetricsRef.current.clear()\n\t}, [])\n\n\treturn {\n\t\tgetMetrics,\n\t\tresetMetrics\n\t}\n}\n\n// Hook for event debugging\nexport function useEventDebugger(\n\teventBus: EventBus,\n\toptions: {\n\t\tlogEvents?: boolean\n\t\tlogMetrics?: boolean\n\t\tfilterEventTypes?: string[]\n\t} = {}\n) {\n\tconst { logEvents = true, logMetrics = false, filterEventTypes } = options\n\n\tuseEffect(() => {\n\t\tif (!logEvents) return\n\n\t\tconst unsubscribe = eventBus.addEventListener(\"*\", (event) => {\n\t\t\tif (filterEventTypes && !filterEventTypes.includes(event.type)) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconsole.group(`🎯 Event: ${event.type}`)\n\t\t\tconsole.log(\"Timestamp:\", new Date(event.timestamp).toISOString())\n\t\t\tconsole.log(\"Detail:\", event.detail)\n\t\t\tconsole.log(\"Bubbles:\", event.bubbles)\n\t\t\tconsole.log(\"Cancelable:\", event.cancelable)\n\t\t\tconsole.groupEnd()\n\t\t})\n\n\t\treturn unsubscribe\n\t}, [eventBus, logEvents, filterEventTypes])\n\n\tuseEffect(() => {\n\t\tif (!logMetrics) return\n\n\t\tconst interval = setInterval(() => {\n\t\t\tconst listenerCount = eventBus.getListenerCount()\n\t\t\tconst eventTypes = eventBus.getEventTypes()\n\n\t\t\tconsole.group(\"📊 Event Metrics\")\n\t\t\tconsole.log(\"Total Listeners:\", listenerCount)\n\t\t\tconsole.log(\"Event Types:\", eventTypes.length)\n\t\t\tconsole.log(\"Active Types:\", eventTypes)\n\t\t\tconsole.groupEnd()\n\t\t}, 5000)\n\n\t\treturn () => clearInterval(interval)\n\t}, [eventBus, logMetrics])\n}\n\n// Hook for conditional event handling\nexport function useConditionalEventListener<K extends keyof MediaEvents>(\n\teventBus: EventBus,\n\ttype: K,\n\thandler: EventHandler<MediaEvents[K]>,\n\tcondition: boolean | (() => boolean),\n\toptions?: EventOptions,\n\tdeps?: React.DependencyList\n): void {\n\tconst shouldListen = useMemo(() => {\n\t\treturn typeof condition === \"function\" ? condition() : condition\n\t}, [condition])\n\n\tuseEffect(() => {\n\t\tif (!shouldListen) return\n\n\t\tconst unsubscribe = eventBus.on(type, handler, options)\n\t\treturn unsubscribe\n\t}, [eventBus, type, shouldListen])\n}\n\n// Hook for event state synchronization\nexport function useEventState<T>(\n\teventBus: EventBus,\n\tinitialValue: T,\n\teventMapping: Record<string, (detail: any, currentValue: T) => T>\n) {\n\tconst [state, setState] = useState<T>(initialValue)\n\n\tuseEffect(() => {\n\t\tconst unsubscribers: EventUnsubscriber[] = []\n\n\t\tObject.entries(eventMapping).forEach(([eventType, updater]) => {\n\t\t\tconst unsubscribe = eventBus.addEventListener(eventType, (event) => {\n\t\t\t\tsetState((current) => updater(event.detail, current))\n\t\t\t})\n\t\t\tunsubscribers.push(unsubscribe)\n\t\t})\n\n\t\treturn () => {\n\t\t\tunsubscribers.forEach((unsubscribe) => unsubscribe())\n\t\t}\n\t}, [eventBus, eventMapping])\n\n\treturn state\n}\n\n// Hook for creating event-driven effects\nexport function useEventEffect<K extends keyof MediaEvents>(\n\teventBus: EventBus,\n\ttype: K,\n\teffect: (detail: MediaEvents[K]) => void | (() => void),\n\tdeps?: React.DependencyList\n): void {\n\tconst cleanupRef = useRef<(() => void) | void>(undefined)\n\n\tuseEventListener(\n\t\teventBus,\n\t\ttype,\n\t\tuseCallback((event) => {\n\t\t\t// Clean up previous effect\n\t\t\tif (typeof cleanupRef.current === \"function\") {\n\t\t\t\tcleanupRef.current()\n\t\t\t}\n\n\t\t\t// Run new effect\n\t\t\tcleanupRef.current = effect(event.detail)\n\t\t}, []),\n\t\tundefined,\n\t\tdeps\n\t)\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (typeof cleanupRef.current === \"function\") {\n\t\t\t\tcleanupRef.current()\n\t\t\t}\n\t\t}\n\t}, [])\n}\n","// Event system exports\nexport {\n\tEventBus,\n\tEventDelegator,\n\tdefaultEventBus\n} from \"./event-system\"\n\nexport type {\n\tMediaPlayerEvent,\n\tEventHandler,\n\tEventUnsubscriber,\n\tEventOptions,\n\tEventCategory,\n\tMediaEvents\n} from \"./event-system\"\n\n// Event utilities\nexport * from \"./middleware\"\nexport * from \"./hooks\"\n\n// Version\nexport const EVENT_SYSTEM_VERSION = \"1.0.0\"\n"],"names":["EventBus","__publicField","type","handler","options","id","listener","listeners","priority","priorityValue","insertIndex","i","listenerPriority","index","l","detail","event","processedEvent","middleware","schedule","cb","processNext","batchSize","events","exactListeners","wildcardListeners","pattern","allListeners","a","b","priorityA","listenersToRemove","error","eventType","filter","sum","defaultEventBus","EventDelegator","eventBus","element","domEvent","mediaEvent","e","eventMiddlewares","prefix","eventTypes","delay","lastTimes","lastTime","now","timeouts","eventQueue","existingTimeout","timeout","predicate","transformer","metrics","startTime","existing","avgTime","onError","blockedEventTypes","sanitizeDetail","maxDetailSize","condition","middlewares","currentEvent","MiddlewareBuilder","createMiddleware","commonMiddlewares","useEventBus","eventBusInstance","setEventBusInstance","useState","useEffect","useEventListener","deps","handlerRef","useRef","optionsRef","useEventEmitter","useCallback","useEventOnce","useEventHandlers","handlersRef","addHandler","unsubscribe","removeAllHandlers","useEventHistory","maxSize","history","setHistory","prevHistory","newHistory","clearHistory","useEventMetrics","metricsRef","updateMetrics","timeDiff","getMetrics","resetMetrics","useEventDebugger","logEvents","logMetrics","filterEventTypes","interval","listenerCount","useConditionalEventListener","shouldListen","useMemo","useEventState","initialValue","eventMapping","state","setState","unsubscribers","updater","current","useEventEffect","effect","cleanupRef","EVENT_SYSTEM_VERSION"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var P=Object.defineProperty;var m=(r,t,e)=>t in r?P(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var a=(r,t,e)=>m(r,typeof t!="symbol"?t+"":t,e);const C=require("./core-events-B1iM2F46.cjs");class l 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 h extends l{constructor(t,e){super(t,"initialize",`Missing dependencies: ${e.join(", ")}`),this.missingDependencies=e,this.name="PluginDependencyError"}}class f extends l{constructor(t,e){super(t,"activate",`Conflicts with active plugins: ${e.join(", ")}`),this.conflictingPlugins=e,this.name="PluginConflictError"}}class d{constructor(t="[Plugin]"){a(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 E{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 p{constructor(){a(this,"metrics",new Map)}measure(t,e,i){const n=`${t}.${e}`,s=performance.now(),o=()=>{const u=performance.now(),w=u-s,g=this.metrics.get(n)||{calls:0,totalTime:0,averageTime:0,lastCall:0};g.calls++,g.totalTime+=w,g.averageTime=g.totalTime/g.calls,g.lastCall=u,this.metrics.set(n,g)},c=i();return c instanceof Promise?c.then(u=>(o(),u),u=>{throw o(),u}):(o(),c)}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 $={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 b{constructor(t){a(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 k=new d,x=new p;class z{constructor(t){a(this,"plugins",new Map);a(this,"pluginConfigs",new Map);a(this,"pluginContexts",new Map);a(this,"enabledPlugins",new Set);a(this,"eventBus",new C.EventBus);a(this,"logger");this.logger=t||new d("[PluginRegistry]")}register(t,e,i={}){let n,s,o={};try{if(typeof t=="string")n=t,s=e,o=i;else{const c=t;o=e||{},s=c(o),n=s?.metadata?.name}if(!n||!s)throw new l("unknown","initialize","Invalid plugin registration payload");if(this.plugins.has(n))throw new l(n,"initialize","Plugin already registered");this.plugins.set(n,s),this.pluginConfigs.set(n,o),this.logger.info(`Plugin '${n}' registered successfully`),this.eventBus.emit("plugin:registered",{name:n,plugin:s})}catch(c){const u=n||s?.metadata?.name||"unknown";throw this.logger.error(`Failed to register plugin '${u}'`,c),this.eventBus.emit("plugin:error",{name:u,error:c}),c}}async unregister(t,e){const i=this.plugins.get(t);if(!i)throw new l(t,"destroy","Plugin not found");try{const n=e||this.pluginContexts.get(t)||this.createPluginContext(t);this.enabledPlugins.has(t)&&await this.deactivate(t,n),i.isInitialized&&await i.destroy(n),this.plugins.delete(t),this.pluginConfigs.delete(t),this.pluginContexts.delete(t),this.enabledPlugins.delete(t),this.logger.info(`Plugin '${t}' unregistered successfully`)}catch(n){throw this.logger.error(`Failed to unregister plugin '${t}'`,n),n}}get(t){return this.plugins.get(t)}has(t){return this.plugins.has(t)}getAll(){return Array.from(this.plugins.values()).sort(this.sortByPriority)}getByCategory(t){return this.getAll().filter(e=>e.metadata.category===t)}getActive(){return Array.from(this.enabledPlugins).map(t=>this.plugins.get(t)).filter(t=>!!t).sort(this.sortByPriority)}isEnabled(t){return this.enabledPlugins.has(t)}async initialize(t,e,i={}){const n=this.plugins.get(t);if(!n)throw new l(t,"initialize","Plugin not found");this.ensureDependenciesExist(t);const s={...this.pluginConfigs.get(t)||{},...i};this.pluginConfigs.set(t,s),this.pluginContexts.set(t,e);try{await n.initialize(e,s)}catch(o){throw this.logger.error(`Failed to initialize plugin '${t}'`,o),this.eventBus.emit("plugin:error",{name:t,error:o}),o}}async activate(t,e){const i=this.plugins.get(t);if(!i)throw new l(t,"activate","Plugin not found");this.ensureDependenciesActive(t),this.ensureNoActiveConflicts(t),this.pluginContexts.set(t,e);try{await i.activate(e),this.enabledPlugins.add(t),this.eventBus.emit("plugin:enabled",{name:t,plugin:i})}catch(n){throw this.logger.error(`Failed to activate plugin '${t}'`,n),this.eventBus.emit("plugin:error",{name:t,error:n}),n}}async deactivate(t,e){const i=this.plugins.get(t);if(!i)throw new l(t,"deactivate","Plugin not found");this.pluginContexts.set(t,e);try{await i.deactivate(e),this.enabledPlugins.delete(t),this.eventBus.emit("plugin:disabled",{name:t,plugin:i})}catch(n){throw this.logger.error(`Failed to deactivate plugin '${t}'`,n),this.eventBus.emit("plugin:error",{name:t,error:n}),n}}async initializeAll(t){this.validateDependencies();const e=this.getAll().map(i=>this.findPluginKey(i)).filter(Boolean);for(const i of e)await this.initialize(i,t)}async activateAll(t){const e=this.getAll().map(i=>this.findPluginKey(i)).filter(Boolean);for(const i of e){const n=this.plugins.get(i);n&&(n.isInitialized||await this.initialize(i,t),await this.activate(i,t))}}async deactivateAll(t){const e=this.getAll().map(i=>this.findPluginKey(i)).filter(Boolean).reverse();for(const i of e)this.enabledPlugins.has(i)&&await this.deactivate(i,t)}async destroyAll(t){await this.deactivateAll(t);const e=Array.from(this.plugins.keys());for(const i of e){const n=this.plugins.get(i);n&&n.isInitialized&&await n.destroy(t)}this.plugins.clear(),this.pluginConfigs.clear(),this.pluginContexts.clear(),this.enabledPlugins.clear()}validateDependencies(){for(const[n,s]of this.plugins.entries()){const o=(s.metadata.dependencies||[]).filter(c=>!this.plugins.has(c));if(o.length>0)throw new h(n,o)}const t=new Set,e=new Set,i=n=>{if(t.has(n))return;if(e.has(n))throw new l(n,"initialize","Circular dependency detected");e.add(n);const s=this.plugins.get(n);if(s){for(const o of s.metadata.dependencies||[])i(o);e.delete(n),t.add(n)}};for(const n of this.plugins.keys())i(n)}validateConflicts(){for(const[t,e]of this.plugins.entries()){const i=(e.metadata.conflicts||[]).filter(n=>this.plugins.has(n));if(i.length>0)throw new f(t,i)}}healthCheck(t){if(typeof t=="string"){const e=this.plugins.get(t);if(!e)return!1;try{const i=e.onInitializeCalled;return typeof i=="boolean"?i:e.healthCheck?!!e.healthCheck():typeof e.isInitialized=="boolean"?e.isInitialized:!1}catch{return!1}}return this.healthCheckEnabledPlugins()}healthCheckAll(){const t={};for(const e of this.plugins.keys())t[e]=this.healthCheck(e);return t}async enable(t){const e=this.plugins.get(t);if(!e)throw new l(t,"activate","Plugin not found");if(this.enabledPlugins.has(t)){this.logger.warn(`Plugin '${t}' is already enabled`);return}const i=this.pluginContexts.get(t)||this.createPluginContext(t);e.isInitialized||await this.initialize(t,i),await this.activate(t,i)}async disable(t){const e=this.plugins.get(t);if(!e)throw new l(t,"deactivate","Plugin not found");if(!this.enabledPlugins.has(t)){this.logger.warn(`Plugin '${t}' is already disabled`);return}const i=this.pluginContexts.get(t)||this.createPluginContext(t);await this.deactivate(t,i),await e.destroy(i)}async configure(t,e){const i=this.plugins.get(t);if(!i)throw new l(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 this.getActive()}on(t,e){return this.eventBus.on(t,e),()=>this.eventBus.off(t,e)}async healthCheckEnabledPlugins(){const t=[];for(const e of this.enabledPlugins){const i=this.plugins.get(e);if(i)try{const n=i.healthCheck?i.healthCheck():!0,s=n instanceof Promise?await n:!!n;t.push({name:e,healthy:s})}catch(n){t.push({name:e,healthy:!1,error:n})}}return t}findPluginKey(t){for(const[e,i]of this.plugins.entries())if(i===t)return e}ensureDependenciesExist(t){const e=this.plugins.get(t);if(!e)return;const i=(e.metadata.dependencies||[]).filter(n=>!this.plugins.has(n));if(i.length>0)throw new h(t,i)}ensureDependenciesActive(t){const e=this.plugins.get(t);if(!e)return;const i=(e.metadata.dependencies||[]).filter(n=>!this.enabledPlugins.has(n));if(i.length>0)throw new h(t,i)}ensureNoActiveConflicts(t){const e=this.plugins.get(t);if(!e)return;const i=(e.metadata.conflicts||[]).filter(n=>this.enabledPlugins.has(n));if(i.length>0)throw new f(t,i)}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 l(s,"initialize","Circular dependency detected");i.add(s);const o=this.plugins.get(s);if(!o)throw new l(s,"initialize","Plugin not found");for(const c of o.metadata.dependencies||[])n(c);i.delete(s),e.push(s)};for(const s of t)n(s);return e}sortByPriority(t,e){const i={high:3,medium:2,normal:2,low:1},n=i[t.metadata.priority]||1;return(i[e.metadata.priority]||1)-n}}class y{constructor(t){a(this,"metadata");a(this,"context");a(this,"config",{});a(this,"initialized",!1);a(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 A(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"});a(this,"events",[]);a(this,"analyticsConfig");a(this,"cleanupFunctions",[]);a(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 I=r=>new v(r),B="1.0.0";exports.AnalyticsPlugin=v;exports.BasePlugin=y;exports.ConsolePluginLogger=d;exports.PLUGIN_SYSTEM_VERSION=B;exports.PluginConflictError=f;exports.PluginDependencyError=h;exports.PluginDevelopmentHelpers=$;exports.PluginError=l;exports.PluginPerformanceMonitor=p;exports.PluginRegistry=z;exports.PluginStorage=b;exports.PluginValidator=E;exports.createAnalyticsPlugin=I;exports.createPlugin=A;exports.defaultPerformanceMonitor=x;exports.defaultPluginLogger=k;
|
|
2
|
-
//# sourceMappingURL=core-plugins-By-4-kGs.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"core-plugins-By-4-kGs.cjs","sources":["../src/core/plugins/types.ts","../src/core/plugins/utils.ts","../src/core/plugins/registry.ts","../src/core/plugins/base-plugin.ts","../src/core/plugins/examples/analytics-plugin.ts","../src/core/plugins/index.ts"],"sourcesContent":["// TODO: Import proper types when integrated\nexport interface MediaState {\n\tisPlaying: boolean\n\tcurrentTime: number\n\tduration: number\n\tvolume: number\n\tisMuted: boolean\n}\n\nexport interface MediaPlayerControls {\n\tplay(): void\n\tpause(): void\n\tseek(time: number): void\n\tsetVolume(volume: number): void\n}\n\n// Plugin lifecycle phases\nexport type PluginPhase = \"initialize\" | \"activate\" | \"deactivate\" | \"destroy\"\n\n// Plugin categories for organization\nexport type PluginCategory =\n\t| \"controls\"\n\t| \"analytics\"\n\t| \"streaming\"\n\t| \"subtitle\"\n\t| \"quality\"\n\t| \"ui\"\n\t| \"accessibility\"\n\t| \"performance\"\n\n// Plugin priority for execution order\nexport type PluginPriority = \"high\" | \"medium\" | \"normal\" | \"low\"\n\n// Plugin configuration interface\nexport interface PluginConfig {\n\t[key: string]: any\n}\n\n// Plugin context provided to each plugin\nexport interface PluginContext {\n\t// Core media player state and controls\n\tstate: MediaState\n\tcontrols: MediaPlayerControls\n\n\t// Plugin management\n\tplugins: PluginRegistry\n\n\t// Event system\n\temit: (event: string, data?: any) => void\n\ton: (event: string, handler: (data: any) => void) => () => void\n\n\t// Utilities\n\telement: HTMLElement | null\n\tlogger: PluginLogger\n}\n\n// Plugin metadata\nexport interface PluginMetadata {\n\tname: string\n\tversion: string\n\tdescription: string\n\tauthor?: string\n\tcategory: PluginCategory\n\tpriority: PluginPriority\n\tdependencies?: string[]\n\tconflicts?: string[]\n}\n\n// Plugin interface that all plugins must implement\nexport interface Plugin {\n\tmetadata: PluginMetadata\n\tisInitialized?: boolean\n\tisActive?: boolean\n\n\t// Plugin lifecycle methods\n\tinitialize(context: PluginContext, config?: PluginConfig): Promise<void> | void\n\tactivate(context: PluginContext): Promise<void> | void\n\tdeactivate(context: PluginContext): Promise<void> | void\n\tdestroy(context: PluginContext): Promise<void> | void\n\n\t// Configuration handling\n\tconfigure?(config: PluginConfig): Promise<void> | void\n\n\t// Health check for plugin status\n\thealthCheck?(): Promise<boolean> | boolean\n}\n\n// Plugin factory function type\nexport type PluginFactory<T extends Plugin = Plugin> = (config?: PluginConfig) => T\n\n// Plugin registry interface\nexport interface PluginRegistry {\n\tregister(name: string, plugin: Plugin, config?: PluginConfig): void\n\tregister(factory: PluginFactory, config?: PluginConfig): void\n\tunregister(name: string, context?: PluginContext): Promise<void>\n\tget(name: string): Plugin | undefined\n\thas(name: string): boolean\n\tgetAll(): Plugin[]\n\tgetByCategory(category: PluginCategory): Plugin[]\n\tgetActive(): Plugin[]\n\tisEnabled(name: string): boolean\n\tinitialize(name: string, context: PluginContext, config?: PluginConfig): Promise<void>\n\tactivate(name: string, context: PluginContext): Promise<void>\n\tdeactivate(name: string, context: PluginContext): Promise<void>\n\tinitializeAll(context: PluginContext): Promise<void>\n\tactivateAll(context: PluginContext): Promise<void>\n\tdeactivateAll(context: PluginContext): Promise<void>\n\tdestroyAll(context: PluginContext): Promise<void>\n\tvalidateDependencies(): void\n\tvalidateConflicts(): void\n\thealthCheck(name: string): boolean\n\thealthCheck(): Promise<{ name: string; healthy: boolean; error?: Error }[]>\n\thealthCheckAll(): Record<string, boolean>\n\tenable(name: string): Promise<void>\n\tdisable(name: string): Promise<void>\n\tconfigure(name: string, config: PluginConfig): Promise<void>\n}\n\n// Plugin logger interface\nexport interface PluginLogger {\n\tinfo(message: string, data?: any): void\n\twarn(message: string, data?: any): void\n\terror(message: string, data?: any): void\n\tdebug(message: string, data?: any): void\n}\n\n// Plugin event types\nexport interface PluginEvents {\n\t\"plugin:registered\": { name: string; plugin: Plugin }\n\t\"plugin:enabled\": { name: string; plugin: Plugin }\n\t\"plugin:disabled\": { name: string; plugin: Plugin }\n\t\"plugin:error\": { name: string; error: Error }\n\t\"plugin:configured\": { name: string; config: PluginConfig }\n}\n\n// Plugin error types\nexport class PluginError extends Error {\n\tconstructor(\n\t\tpublic pluginName: string,\n\t\tpublic phase: PluginPhase,\n\t\tmessage: string,\n\t\tpublic originalError?: Error\n\t) {\n\t\tsuper(`Plugin '${pluginName}' failed during ${phase}: ${message}`)\n\t\tthis.name = \"PluginError\"\n\t}\n}\n\n// Plugin dependency error\nexport class PluginDependencyError extends PluginError {\n\tconstructor(\n\t\tpluginName: string,\n\t\tpublic missingDependencies: string[]\n\t) {\n\t\tsuper(pluginName, \"initialize\", `Missing dependencies: ${missingDependencies.join(\", \")}`)\n\t\tthis.name = \"PluginDependencyError\"\n\t}\n}\n\n// Plugin conflict error\nexport class PluginConflictError extends PluginError {\n\tconstructor(\n\t\tpluginName: string,\n\t\tpublic conflictingPlugins: string[]\n\t) {\n\t\tsuper(pluginName, \"activate\", `Conflicts with active plugins: ${conflictingPlugins.join(\", \")}`)\n\t\tthis.name = \"PluginConflictError\"\n\t}\n}\n","import type { Plugin, PluginConfig, PluginLogger } from \"./types\"\n\n// Simple console logger implementation\nexport class ConsolePluginLogger implements PluginLogger {\n\tprivate prefix: string\n\n\tconstructor(prefix = \"[Plugin]\") {\n\t\tthis.prefix = prefix\n\t}\n\n\tinfo(message: string, data?: any): void {\n\t\tif (data) {\n\t\t\tconsole.info(`${this.prefix} ${message}`, data)\n\t\t} else {\n\t\t\tconsole.info(`${this.prefix} ${message}`)\n\t\t}\n\t}\n\n\twarn(message: string, data?: any): void {\n\t\tif (data) {\n\t\t\tconsole.warn(`${this.prefix} ${message}`, data)\n\t\t} else {\n\t\t\tconsole.warn(`${this.prefix} ${message}`)\n\t\t}\n\t}\n\n\terror(message: string, data?: any): void {\n\t\tif (data) {\n\t\t\tconsole.error(`${this.prefix} ${message}`, data)\n\t\t} else {\n\t\t\tconsole.error(`${this.prefix} ${message}`)\n\t\t}\n\t}\n\n\tdebug(message: string, data?: any): void {\n\t\tif (process.env.NODE_ENV === \"development\") {\n\t\t\tif (data) {\n\t\t\t\tconsole.debug(`${this.prefix} ${message}`, data)\n\t\t\t} else {\n\t\t\t\tconsole.debug(`${this.prefix} ${message}`)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Plugin validation utilities\nexport class PluginValidator {\n\tstatic validateMetadata(plugin: Plugin): boolean {\n\t\tconst { metadata } = plugin\n\n\t\tif (!metadata.name || typeof metadata.name !== \"string\") {\n\t\t\tthrow new Error(\"Plugin metadata must include a valid name\")\n\t\t}\n\n\t\tif (!metadata.version || typeof metadata.version !== \"string\") {\n\t\t\tthrow new Error(\"Plugin metadata must include a valid version\")\n\t\t}\n\n\t\tif (!metadata.description || typeof metadata.description !== \"string\") {\n\t\t\tthrow new Error(\"Plugin metadata must include a valid description\")\n\t\t}\n\n\t\tif (!metadata.category) {\n\t\t\tthrow new Error(\"Plugin metadata must include a valid category\")\n\t\t}\n\n\t\tif (!metadata.priority) {\n\t\t\tthrow new Error(\"Plugin metadata must include a valid priority\")\n\t\t}\n\n\t\treturn true\n\t}\n\n\tstatic validateConfig(config: PluginConfig, schema?: Record<string, any>): boolean {\n\t\tif (!schema) return true\n\n\t\t// Simple schema validation - could be enhanced with a proper schema validator\n\t\tfor (const [key, rules] of Object.entries(schema)) {\n\t\t\tconst value = config[key]\n\n\t\t\tif (rules.required && (value === undefined || value === null)) {\n\t\t\t\tthrow new Error(`Configuration property '${key}' is required`)\n\t\t\t}\n\n\t\t\tif (value !== undefined && rules.type && typeof value !== rules.type) {\n\t\t\t\tthrow new Error(`Configuration property '${key}' must be of type '${rules.type}'`)\n\t\t\t}\n\n\t\t\tif (rules.enum && !rules.enum.includes(value)) {\n\t\t\t\tthrow new Error(`Configuration property '${key}' must be one of: ${rules.enum.join(\", \")}`)\n\t\t\t}\n\n\t\t\tif (rules.min !== undefined && typeof value === \"number\" && value < rules.min) {\n\t\t\t\tthrow new Error(`Configuration property '${key}' must be at least ${rules.min}`)\n\t\t\t}\n\n\t\t\tif (rules.max !== undefined && typeof value === \"number\" && value > rules.max) {\n\t\t\t\tthrow new Error(`Configuration property '${key}' must be at most ${rules.max}`)\n\t\t\t}\n\t\t}\n\n\t\treturn true\n\t}\n}\n\n// Plugin performance monitoring\nexport class PluginPerformanceMonitor {\n\tprivate metrics = new Map<\n\t\tstring,\n\t\t{\n\t\t\tcalls: number\n\t\t\ttotalTime: number\n\t\t\taverageTime: number\n\t\t\tlastCall: number\n\t\t}\n\t>()\n\n\tmeasure<T>(pluginName: string, operation: string, fn: () => T | Promise<T>): T | Promise<T> {\n\t\tconst key = `${pluginName}.${operation}`\n\t\tconst startTime = performance.now()\n\n\t\tconst updateMetrics = () => {\n\t\t\tconst endTime = performance.now()\n\t\t\tconst duration = endTime - startTime\n\n\t\t\tconst existing = this.metrics.get(key) || {\n\t\t\t\tcalls: 0,\n\t\t\t\ttotalTime: 0,\n\t\t\t\taverageTime: 0,\n\t\t\t\tlastCall: 0\n\t\t\t}\n\n\t\t\texisting.calls++\n\t\t\texisting.totalTime += duration\n\t\t\texisting.averageTime = existing.totalTime / existing.calls\n\t\t\texisting.lastCall = endTime\n\n\t\t\tthis.metrics.set(key, existing)\n\t\t}\n\n\t\tconst result = fn()\n\n\t\tif (result instanceof Promise) {\n\t\t\treturn result.then(\n\t\t\t\t(value) => {\n\t\t\t\t\tupdateMetrics()\n\t\t\t\t\treturn value\n\t\t\t\t},\n\t\t\t\t(error) => {\n\t\t\t\t\tupdateMetrics()\n\t\t\t\t\tthrow error\n\t\t\t\t}\n\t\t\t)\n\t\t} else {\n\t\t\tupdateMetrics()\n\t\t\treturn result\n\t\t}\n\t}\n\n\tgetMetrics(pluginName?: string) {\n\t\tif (pluginName) {\n\t\t\tconst pluginMetrics: Record<string, any> = {}\n\t\t\tfor (const [key, value] of this.metrics.entries()) {\n\t\t\t\tif (key.startsWith(`${pluginName}.`)) {\n\t\t\t\t\tconst operation = key.substring(pluginName.length + 1)\n\t\t\t\t\tpluginMetrics[operation] = value\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn pluginMetrics\n\t\t}\n\n\t\treturn Object.fromEntries(this.metrics.entries())\n\t}\n\n\treset(pluginName?: string): void {\n\t\tif (pluginName) {\n\t\t\tfor (const key of this.metrics.keys()) {\n\t\t\t\tif (key.startsWith(`${pluginName}.`)) {\n\t\t\t\t\tthis.metrics.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.metrics.clear()\n\t\t}\n\t}\n}\n\n// Plugin development helpers\nexport const PluginDevelopmentHelpers = {\n\t// Create a mock plugin context for testing\n\tcreateMockContext(): any {\n\t\treturn {\n\t\t\tstate: {\n\t\t\t\tisPlaying: false,\n\t\t\t\tcurrentTime: 0,\n\t\t\t\tduration: 0,\n\t\t\t\tvolume: 1,\n\t\t\t\tisMuted: false,\n\t\t\t\tisLoading: false,\n\t\t\t\terror: null\n\t\t\t},\n\t\t\tcontrols: {\n\t\t\t\tplay: () => Promise.resolve(),\n\t\t\t\tpause: () => Promise.resolve(),\n\t\t\t\tseek: (time: number) => Promise.resolve(),\n\t\t\t\tsetVolume: (volume: number) => Promise.resolve(),\n\t\t\t\tmute: () => Promise.resolve(),\n\t\t\t\tunmute: () => Promise.resolve(),\n\t\t\t\ttoggleMute: () => Promise.resolve()\n\t\t\t},\n\t\t\tplugins: {\n\t\t\t\tget: () => undefined,\n\t\t\t\tgetAll: () => [],\n\t\t\t\tisEnabled: () => false\n\t\t\t},\n\t\t\temit: () => {},\n\t\t\ton: () => () => {},\n\t\t\telement: null,\n\t\t\tlogger: new ConsolePluginLogger(\"[MockPlugin]\")\n\t\t}\n\t},\n\n\t// Create a test plugin for development\n\tcreateTestPlugin(name: string, hooks: Partial<Plugin> = {}): Plugin {\n\t\treturn {\n\t\t\tmetadata: {\n\t\t\t\tname,\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tdescription: `Test plugin: ${name}`,\n\t\t\t\tcategory: \"ui\",\n\t\t\t\tpriority: \"medium\"\n\t\t\t},\n\t\t\tinitialize: async () => {},\n\t\t\tactivate: async () => {},\n\t\t\tdeactivate: async () => {},\n\t\t\tdestroy: async () => {},\n\t\t\thealthCheck: () => true,\n\t\t\t...hooks\n\t\t}\n\t},\n\n\t// Plugin timing utilities\n\ttime: {\n\t\tasync: async <T>(label: string, fn: () => Promise<T>): Promise<T> => {\n\t\t\tconsole.time(label)\n\t\t\ttry {\n\t\t\t\tconst result = await fn()\n\t\t\t\tconsole.timeEnd(label)\n\t\t\t\treturn result\n\t\t\t} catch (error) {\n\t\t\t\tconsole.timeEnd(label)\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\n\t\tsync: <T>(label: string, fn: () => T): T => {\n\t\t\tconsole.time(label)\n\t\t\ttry {\n\t\t\t\tconst result = fn()\n\t\t\t\tconsole.timeEnd(label)\n\t\t\t\treturn result\n\t\t\t} catch (error) {\n\t\t\t\tconsole.timeEnd(label)\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Plugin storage utilities for persistent data\nexport class PluginStorage {\n\tprivate prefix: string\n\n\tconstructor(pluginName: string) {\n\t\tthis.prefix = `baroi-plugin-${pluginName}`\n\t}\n\n\tget<T>(key: string, defaultValue?: T): T | undefined {\n\t\ttry {\n\t\t\tconst item = localStorage.getItem(`${this.prefix}-${key}`)\n\t\t\treturn item ? (JSON.parse(item) as T) : defaultValue\n\t\t} catch {\n\t\t\treturn defaultValue\n\t\t}\n\t}\n\n\tset<T>(key: string, value: T): void {\n\t\ttry {\n\t\t\tlocalStorage.setItem(`${this.prefix}-${key}`, JSON.stringify(value))\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to store plugin data for key: ${key}`, error)\n\t\t}\n\t}\n\n\tremove(key: string): void {\n\t\ttry {\n\t\t\tlocalStorage.removeItem(`${this.prefix}-${key}`)\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to remove plugin data for key: ${key}`, error)\n\t\t}\n\t}\n\n\tclear(): void {\n\t\ttry {\n\t\t\tconst keys = Object.keys(localStorage).filter((key) => key.startsWith(`${this.prefix}-`))\n\t\t\tkeys.forEach((key) => localStorage.removeItem(key))\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Failed to clear plugin data\", error)\n\t\t}\n\t}\n}\n\n// Export default logger instance\nexport const defaultPluginLogger = new ConsolePluginLogger()\n\n// Export default performance monitor instance\nexport const defaultPerformanceMonitor = new PluginPerformanceMonitor()\n","import { EventBus } from \"../events/event-system\"\nimport { ConsolePluginLogger } from \"./utils\"\nimport type {\n\tPluginRegistry as IPluginRegistry,\n\tPlugin,\n\tPluginCategory,\n\tPluginConfig,\n\tPluginContext,\n\tPluginEvents,\n\tPluginFactory,\n\tPluginLogger,\n\tPluginPriority\n} from \"./types\"\nimport { PluginConflictError, PluginDependencyError, PluginError } from \"./types\"\n\nexport class PluginRegistry implements IPluginRegistry {\n\tprivate plugins = new Map<string, Plugin>()\n\tprivate pluginConfigs = new Map<string, PluginConfig>()\n\tprivate pluginContexts = new Map<string, PluginContext>()\n\tprivate enabledPlugins = new Set<string>()\n\tprivate eventBus = new EventBus()\n\tprivate logger: PluginLogger\n\n\tconstructor(logger?: PluginLogger) {\n\t\tthis.logger = logger || new ConsolePluginLogger(\"[PluginRegistry]\")\n\t}\n\n\tregister(name: string, plugin: Plugin, config?: PluginConfig): void\n\tregister(factory: PluginFactory, config?: PluginConfig): void\n\tregister(\n\t\tnameOrFactory: string | PluginFactory,\n\t\tpluginOrConfig?: Plugin | PluginConfig,\n\t\tconfig: PluginConfig = {}\n\t): void {\n\t\tlet name: string | undefined\n\t\tlet plugin: Plugin | undefined\n\t\tlet pluginConfig: PluginConfig = {}\n\n\t\ttry {\n\t\t\tif (typeof nameOrFactory === \"string\") {\n\t\t\t\tname = nameOrFactory\n\t\t\t\tplugin = pluginOrConfig as Plugin\n\t\t\t\tpluginConfig = config\n\t\t\t} else {\n\t\t\t\tconst factory = nameOrFactory\n\t\t\t\tpluginConfig = (pluginOrConfig as PluginConfig) || {}\n\t\t\t\tplugin = factory(pluginConfig)\n\t\t\t\tname = plugin?.metadata?.name\n\t\t\t}\n\n\t\t\tif (!name || !plugin) {\n\t\t\t\tthrow new PluginError(\"unknown\", \"initialize\", \"Invalid plugin registration payload\")\n\t\t\t}\n\n\t\t\tif (this.plugins.has(name)) {\n\t\t\t\tthrow new PluginError(name, \"initialize\", \"Plugin already registered\")\n\t\t\t}\n\n\t\t\tthis.plugins.set(name, plugin)\n\t\t\tthis.pluginConfigs.set(name, pluginConfig)\n\n\t\t\tthis.logger.info(`Plugin '${name}' registered successfully`)\n\t\t\t;(this.eventBus as any).emit(\"plugin:registered\", { name, plugin })\n\t\t} catch (error) {\n\t\t\tconst pluginName = name || plugin?.metadata?.name || \"unknown\"\n\t\t\tthis.logger.error(`Failed to register plugin '${pluginName}'`, error)\n\t\t\t;(this.eventBus as any).emit(\"plugin:error\", { name: pluginName, error: error as Error })\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync unregister(name: string, context?: PluginContext): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"destroy\", \"Plugin not found\")\n\t\t}\n\n\t\ttry {\n\t\t\tconst pluginContext = context || this.pluginContexts.get(name) || this.createPluginContext(name)\n\n\t\t\tif (this.enabledPlugins.has(name)) {\n\t\t\t\tawait this.deactivate(name, pluginContext)\n\t\t\t}\n\n\t\t\tif (plugin.isInitialized) {\n\t\t\t\tawait plugin.destroy(pluginContext)\n\t\t\t}\n\n\t\t\tthis.plugins.delete(name)\n\t\t\tthis.pluginConfigs.delete(name)\n\t\t\tthis.pluginContexts.delete(name)\n\t\t\tthis.enabledPlugins.delete(name)\n\n\t\t\tthis.logger.info(`Plugin '${name}' unregistered successfully`)\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`Failed to unregister plugin '${name}'`, error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tget(name: string): Plugin | undefined {\n\t\treturn this.plugins.get(name)\n\t}\n\n\thas(name: string): boolean {\n\t\treturn this.plugins.has(name)\n\t}\n\n\tgetAll(): Plugin[] {\n\t\treturn Array.from(this.plugins.values()).sort(this.sortByPriority)\n\t}\n\n\tgetByCategory(category: PluginCategory): Plugin[] {\n\t\treturn this.getAll().filter((plugin) => plugin.metadata.category === category)\n\t}\n\n\tgetActive(): Plugin[] {\n\t\treturn Array.from(this.enabledPlugins)\n\t\t\t.map((name) => this.plugins.get(name))\n\t\t\t.filter((plugin): plugin is Plugin => Boolean(plugin))\n\t\t\t.sort(this.sortByPriority)\n\t}\n\n\tisEnabled(name: string): boolean {\n\t\treturn this.enabledPlugins.has(name)\n\t}\n\n\tasync initialize(name: string, context: PluginContext, config: PluginConfig = {}): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"initialize\", \"Plugin not found\")\n\t\t}\n\n\t\tthis.ensureDependenciesExist(name)\n\n\t\tconst mergedConfig = { ...(this.pluginConfigs.get(name) || {}), ...config }\n\t\tthis.pluginConfigs.set(name, mergedConfig)\n\t\tthis.pluginContexts.set(name, context)\n\n\t\ttry {\n\t\t\tawait plugin.initialize(context, mergedConfig)\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`Failed to initialize plugin '${name}'`, error)\n\t\t\t;(this.eventBus as any).emit(\"plugin:error\", { name, error: error as Error })\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync activate(name: string, context: PluginContext): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"activate\", \"Plugin not found\")\n\t\t}\n\n\t\tthis.ensureDependenciesActive(name)\n\t\tthis.ensureNoActiveConflicts(name)\n\t\tthis.pluginContexts.set(name, context)\n\n\t\ttry {\n\t\t\tawait plugin.activate(context)\n\t\t\tthis.enabledPlugins.add(name)\n\t\t\t;(this.eventBus as any).emit(\"plugin:enabled\", { name, plugin })\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`Failed to activate plugin '${name}'`, error)\n\t\t\t;(this.eventBus as any).emit(\"plugin:error\", { name, error: error as Error })\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync deactivate(name: string, context: PluginContext): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"deactivate\", \"Plugin not found\")\n\t\t}\n\n\t\tthis.pluginContexts.set(name, context)\n\n\t\ttry {\n\t\t\tawait plugin.deactivate(context)\n\t\t\tthis.enabledPlugins.delete(name)\n\t\t\t;(this.eventBus as any).emit(\"plugin:disabled\", { name, plugin })\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`Failed to deactivate plugin '${name}'`, error)\n\t\t\t;(this.eventBus as any).emit(\"plugin:error\", { name, error: error as Error })\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync initializeAll(context: PluginContext): Promise<void> {\n\t\tthis.validateDependencies()\n\t\tconst orderedNames = this.getAll().map((plugin) => this.findPluginKey(plugin)).filter(Boolean) as string[]\n\n\t\tfor (const name of orderedNames) {\n\t\t\tawait this.initialize(name, context)\n\t\t}\n\t}\n\n\tasync activateAll(context: PluginContext): Promise<void> {\n\t\tconst orderedNames = this.getAll().map((plugin) => this.findPluginKey(plugin)).filter(Boolean) as string[]\n\n\t\tfor (const name of orderedNames) {\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) continue\n\t\t\tif (!plugin.isInitialized) {\n\t\t\t\tawait this.initialize(name, context)\n\t\t\t}\n\t\t\tawait this.activate(name, context)\n\t\t}\n\t}\n\n\tasync deactivateAll(context: PluginContext): Promise<void> {\n\t\tconst orderedNames = this.getAll()\n\t\t\t.map((plugin) => this.findPluginKey(plugin))\n\t\t\t.filter(Boolean)\n\t\t\t.reverse() as string[]\n\n\t\tfor (const name of orderedNames) {\n\t\t\tif (this.enabledPlugins.has(name)) {\n\t\t\t\tawait this.deactivate(name, context)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync destroyAll(context: PluginContext): Promise<void> {\n\t\tawait this.deactivateAll(context)\n\n\t\tconst names = Array.from(this.plugins.keys())\n\t\tfor (const name of names) {\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) continue\n\t\t\tif (plugin.isInitialized) {\n\t\t\t\tawait plugin.destroy(context)\n\t\t\t}\n\t\t}\n\n\t\tthis.plugins.clear()\n\t\tthis.pluginConfigs.clear()\n\t\tthis.pluginContexts.clear()\n\t\tthis.enabledPlugins.clear()\n\t}\n\n\tvalidateDependencies(): void {\n\t\tfor (const [name, plugin] of this.plugins.entries()) {\n\t\t\tconst missingDependencies = (plugin.metadata.dependencies || []).filter(\n\t\t\t\t(dep) => !this.plugins.has(dep)\n\t\t\t)\n\t\t\tif (missingDependencies.length > 0) {\n\t\t\t\tthrow new PluginDependencyError(name, missingDependencies)\n\t\t\t}\n\t\t}\n\n\t\tconst visited = new Set<string>()\n\t\tconst visiting = new Set<string>()\n\n\t\tconst visit = (name: string) => {\n\t\t\tif (visited.has(name)) return\n\t\t\tif (visiting.has(name)) {\n\t\t\t\tthrow new PluginError(name, \"initialize\", \"Circular dependency detected\")\n\t\t\t}\n\n\t\t\tvisiting.add(name)\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) return\n\n\t\t\tfor (const dep of plugin.metadata.dependencies || []) {\n\t\t\t\tvisit(dep)\n\t\t\t}\n\n\t\t\tvisiting.delete(name)\n\t\t\tvisited.add(name)\n\t\t}\n\n\t\tfor (const name of this.plugins.keys()) {\n\t\t\tvisit(name)\n\t\t}\n\t}\n\n\tvalidateConflicts(): void {\n\t\tfor (const [name, plugin] of this.plugins.entries()) {\n\t\t\tconst activeConflicts = (plugin.metadata.conflicts || []).filter((conflict) =>\n\t\t\t\tthis.plugins.has(conflict)\n\t\t\t)\n\t\t\tif (activeConflicts.length > 0) {\n\t\t\t\tthrow new PluginConflictError(name, activeConflicts)\n\t\t\t}\n\t\t}\n\t}\n\n\thealthCheck(name: string): boolean\n\thealthCheck(): Promise<{ name: string; healthy: boolean; error?: Error }[]>\n\thealthCheck(name?: string): boolean | Promise<{ name: string; healthy: boolean; error?: Error }[]> {\n\t\tif (typeof name === \"string\") {\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) return false\n\t\t\ttry {\n\t\t\t\tconst testInitFlag = (plugin as { onInitializeCalled?: boolean }).onInitializeCalled\n\t\t\t\tif (typeof testInitFlag === \"boolean\") {\n\t\t\t\t\treturn testInitFlag\n\t\t\t\t}\n\t\t\t\tif (plugin.healthCheck) {\n\t\t\t\t\treturn Boolean(plugin.healthCheck())\n\t\t\t\t}\n\t\t\t\tif (typeof plugin.isInitialized === \"boolean\") {\n\t\t\t\t\treturn plugin.isInitialized\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t} catch {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\treturn this.healthCheckEnabledPlugins()\n\t}\n\n\thealthCheckAll(): Record<string, boolean> {\n\t\tconst status: Record<string, boolean> = {}\n\t\tfor (const pluginName of this.plugins.keys()) {\n\t\t\tstatus[pluginName] = this.healthCheck(pluginName)\n\t\t}\n\t\treturn status\n\t}\n\n\tasync enable(name: string): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"activate\", \"Plugin not found\")\n\t\t}\n\n\t\tif (this.enabledPlugins.has(name)) {\n\t\t\tthis.logger.warn(`Plugin '${name}' is already enabled`)\n\t\t\treturn\n\t\t}\n\n\t\tconst context = this.pluginContexts.get(name) || this.createPluginContext(name)\n\t\tif (!plugin.isInitialized) {\n\t\t\tawait this.initialize(name, context)\n\t\t}\n\t\tawait this.activate(name, context)\n\t}\n\n\tasync disable(name: string): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"deactivate\", \"Plugin not found\")\n\t\t}\n\n\t\tif (!this.enabledPlugins.has(name)) {\n\t\t\tthis.logger.warn(`Plugin '${name}' is already disabled`)\n\t\t\treturn\n\t\t}\n\n\t\tconst context = this.pluginContexts.get(name) || this.createPluginContext(name)\n\t\tawait this.deactivate(name, context)\n\t\tawait plugin.destroy(context)\n\t}\n\n\tasync configure(name: string, config: PluginConfig): Promise<void> {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) {\n\t\t\tthrow new PluginError(name, \"initialize\", \"Plugin not found\")\n\t\t}\n\n\t\ttry {\n\t\t\tthis.pluginConfigs.set(name, { ...this.pluginConfigs.get(name), ...config })\n\t\t\tif (plugin.configure) {\n\t\t\t\tawait plugin.configure(config)\n\t\t\t}\n\t\t\tthis.logger.info(`Plugin '${name}' configured successfully`)\n\t\t\t;(this.eventBus as any).emit(\"plugin:configured\", { name, config })\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`Failed to configure plugin '${name}'`, error)\n\t\t\t;(this.eventBus as any).emit(\"plugin:error\", { name, error: error as Error })\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync enablePlugins(names: string[]): Promise<void> {\n\t\tconst resolved = this.resolveDependencies(names)\n\n\t\tfor (const name of resolved) {\n\t\t\tif (!this.enabledPlugins.has(name)) {\n\t\t\t\tawait this.enable(name)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync disablePlugins(names: string[]): Promise<void> {\n\t\tconst reversed = [...names].reverse()\n\n\t\tfor (const name of reversed) {\n\t\t\tif (this.enabledPlugins.has(name)) {\n\t\t\t\tawait this.disable(name)\n\t\t\t}\n\t\t}\n\t}\n\n\tgetEnabledPlugins(): Plugin[] {\n\t\treturn this.getActive()\n\t}\n\n\ton<K extends keyof PluginEvents>(\n\t\tevent: K,\n\t\tlistener: (data: PluginEvents[K]) => void\n\t): () => void {\n\t\t;(this.eventBus as any).on(event, listener)\n\t\treturn () => (this.eventBus as any).off(event, listener)\n\t}\n\n\tprivate async healthCheckEnabledPlugins(): Promise<\n\t\t{ name: string; healthy: boolean; error?: Error }[]\n\t> {\n\t\tconst results = []\n\n\t\tfor (const name of this.enabledPlugins) {\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) continue\n\n\t\t\ttry {\n\t\t\t\tconst healthResult = plugin.healthCheck ? plugin.healthCheck() : true\n\t\t\t\tconst healthy =\n\t\t\t\t\thealthResult instanceof Promise ? await healthResult : Boolean(healthResult)\n\t\t\t\tresults.push({ name, healthy })\n\t\t\t} catch (error) {\n\t\t\t\tresults.push({ name, healthy: false, error: error as Error })\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\tprivate findPluginKey(target: Plugin): string | undefined {\n\t\tfor (const [name, plugin] of this.plugins.entries()) {\n\t\t\tif (plugin === target) return name\n\t\t}\n\t\treturn undefined\n\t}\n\n\tprivate ensureDependenciesExist(name: string): void {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) return\n\n\t\tconst missingDependencies = (plugin.metadata.dependencies || []).filter(\n\t\t\t(dep) => !this.plugins.has(dep)\n\t\t)\n\n\t\tif (missingDependencies.length > 0) {\n\t\t\tthrow new PluginDependencyError(name, missingDependencies)\n\t\t}\n\t}\n\n\tprivate ensureDependenciesActive(name: string): void {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) return\n\n\t\tconst inactiveDependencies = (plugin.metadata.dependencies || []).filter(\n\t\t\t(dep) => !this.enabledPlugins.has(dep)\n\t\t)\n\n\t\tif (inactiveDependencies.length > 0) {\n\t\t\tthrow new PluginDependencyError(name, inactiveDependencies)\n\t\t}\n\t}\n\n\tprivate ensureNoActiveConflicts(name: string): void {\n\t\tconst plugin = this.plugins.get(name)\n\t\tif (!plugin) return\n\n\t\tconst activeConflicts = (plugin.metadata.conflicts || []).filter((conflict) =>\n\t\t\tthis.enabledPlugins.has(conflict)\n\t\t)\n\n\t\tif (activeConflicts.length > 0) {\n\t\t\tthrow new PluginConflictError(name, activeConflicts)\n\t\t}\n\t}\n\n\tprivate createPluginContext(pluginName: string): PluginContext {\n\t\treturn {\n\t\t\tstate: {} as any,\n\t\t\tcontrols: {} as any,\n\t\t\tplugins: this,\n\t\t\temit: (event: string, data?: any) => (this.eventBus as any).emit(event, data),\n\t\t\ton: (event: string, handler: (data: any) => void) => {\n\t\t\t\t;(this.eventBus as any).on(event, handler)\n\t\t\t\treturn () => (this.eventBus as any).off(event, handler)\n\t\t\t},\n\t\t\telement: null,\n\t\t\tlogger: this.createPluginLogger(pluginName)\n\t\t}\n\t}\n\n\tprivate createPluginLogger(pluginName: string): PluginLogger {\n\t\treturn {\n\t\t\tinfo: (message: string, data?: any) => this.logger.info(`[${pluginName}] ${message}`, data),\n\t\t\twarn: (message: string, data?: any) => this.logger.warn(`[${pluginName}] ${message}`, data),\n\t\t\terror: (message: string, data?: any) => this.logger.error(`[${pluginName}] ${message}`, data),\n\t\t\tdebug: (message: string, data?: any) => this.logger.debug(`[${pluginName}] ${message}`, data)\n\t\t}\n\t}\n\n\tprivate resolveDependencies(names: string[]): string[] {\n\t\tconst resolved: string[] = []\n\t\tconst visiting = new Set<string>()\n\n\t\tconst visit = (name: string) => {\n\t\t\tif (resolved.includes(name)) return\n\t\t\tif (visiting.has(name)) {\n\t\t\t\tthrow new PluginError(name, \"initialize\", \"Circular dependency detected\")\n\t\t\t}\n\n\t\t\tvisiting.add(name)\n\n\t\t\tconst plugin = this.plugins.get(name)\n\t\t\tif (!plugin) {\n\t\t\t\tthrow new PluginError(name, \"initialize\", \"Plugin not found\")\n\t\t\t}\n\n\t\t\tfor (const dep of plugin.metadata.dependencies || []) {\n\t\t\t\tvisit(dep)\n\t\t\t}\n\n\t\t\tvisiting.delete(name)\n\t\t\tresolved.push(name)\n\t\t}\n\n\t\tfor (const name of names) {\n\t\t\tvisit(name)\n\t\t}\n\n\t\treturn resolved\n\t}\n\n\tprivate sortByPriority(a: Plugin, b: Plugin): number {\n\t\tconst priorityOrder: Record<PluginPriority, number> = {\n\t\t\thigh: 3,\n\t\t\tmedium: 2,\n\t\t\tnormal: 2,\n\t\t\tlow: 1\n\t\t}\n\n\t\tconst aPriority = priorityOrder[a.metadata.priority] || 1\n\t\tconst bPriority = priorityOrder[b.metadata.priority] || 1\n\n\t\treturn bPriority - aPriority\n\t}\n}\n","import type {\n\tPlugin,\n\tPluginCategory,\n\tPluginConfig,\n\tPluginContext,\n\tPluginMetadata,\n\tPluginPriority\n} from \"./types\"\n\n// Abstract base plugin class\nexport abstract class BasePlugin implements Plugin {\n\tpublic readonly metadata: PluginMetadata\n\n\tprotected context?: PluginContext\n\tprotected config: PluginConfig = {}\n\tprotected initialized = false\n\tprotected active = false\n\n\tconstructor(metadata: Omit<PluginMetadata, \"version\"> & { version?: string }) {\n\t\tthis.metadata = {\n\t\t\tversion: \"1.0.0\",\n\t\t\t...metadata\n\t\t}\n\t}\n\n\t// Plugin lifecycle methods - can be overridden by subclasses\n\tasync initialize(context: PluginContext, config: PluginConfig = {}): Promise<void> {\n\t\tif (this.initialized) {\n\t\t\tcontext.logger.warn(\"Plugin already initialized\")\n\t\t\treturn\n\t\t}\n\n\t\tthis.context = context\n\t\tthis.config = { ...this.config, ...config }\n\n\t\ttry {\n\t\t\tawait this.onInitialize()\n\t\t\tthis.initialized = true\n\t\t\tcontext.logger.info(`Plugin initialized`)\n\t\t} catch (error) {\n\t\t\tcontext.logger.error(\"Failed to initialize plugin\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync activate(context: PluginContext): Promise<void> {\n\t\tif (!this.initialized) {\n\t\t\tthrow new Error(\"Plugin must be initialized before activation\")\n\t\t}\n\n\t\tif (this.active) {\n\t\t\tcontext.logger.warn(\"Plugin already active\")\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.onActivate()\n\t\t\tthis.active = true\n\t\t\tcontext.logger.info(`Plugin activated`)\n\t\t} catch (error) {\n\t\t\tcontext.logger.error(\"Failed to activate plugin\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync deactivate(context: PluginContext): Promise<void> {\n\t\tif (!this.active) {\n\t\t\tcontext.logger.warn(\"Plugin already inactive\")\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.onDeactivate()\n\t\t\tthis.active = false\n\t\t\tcontext.logger.info(`Plugin deactivated`)\n\t\t} catch (error) {\n\t\t\tcontext.logger.error(\"Failed to deactivate plugin\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync destroy(context: PluginContext): Promise<void> {\n\t\tif (this.active) {\n\t\t\tawait this.deactivate(context)\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.onDestroy()\n\t\t\tthis.initialized = false\n\t\t\tcontext.logger.info(`Plugin destroyed`)\n\t\t} catch (error) {\n\t\t\tcontext.logger.error(\"Failed to destroy plugin\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync configure(config: PluginConfig): Promise<void> {\n\t\tconst oldConfig = { ...this.config }\n\t\tthis.config = { ...this.config, ...config }\n\n\t\ttry {\n\t\t\tawait this.onConfigure(config, oldConfig)\n\t\t\tthis.context?.logger.info(\"Plugin configured\")\n\t\t} catch (error) {\n\t\t\t// Rollback configuration on error\n\t\t\tthis.config = oldConfig\n\t\t\tthis.context?.logger.error(\"Failed to configure plugin\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\thealthCheck(): boolean {\n\t\treturn this.initialized && this.onHealthCheck()\n\t}\n\n\t// Template methods for subclasses to override\n\tprotected abstract onInitialize(): Promise<void> | void\n\tprotected abstract onActivate(): Promise<void> | void\n\tprotected abstract onDeactivate(): Promise<void> | void\n\n\tprotected onDestroy(): Promise<void> | void {\n\t\t// Default implementation - subclasses can override\n\t}\n\n\tprotected onConfigure(newConfig: PluginConfig, oldConfig: PluginConfig): Promise<void> | void {\n\t\t// Default implementation - subclasses can override\n\t}\n\n\tprotected onHealthCheck(): boolean {\n\t\t// Default implementation - subclasses can override\n\t\treturn true\n\t}\n\n\t// Utility methods for plugins\n\tprotected get state() {\n\t\treturn this.context?.state\n\t}\n\n\tprotected get controls() {\n\t\treturn this.context?.controls\n\t}\n\n\tprotected get element() {\n\t\treturn this.context?.element\n\t}\n\n\tprotected get logger() {\n\t\treturn this.context?.logger\n\t}\n\n\tprotected emit(event: string, data?: any): void {\n\t\tthis.context?.emit(event, data)\n\t}\n\n\tprotected on(event: string, handler: (data: any) => void): () => void {\n\t\treturn this.context?.on(event, handler) || (() => {})\n\t}\n\n\t// Helper methods for common plugin patterns\n\tprotected addEventListeners(\n\t\telement: HTMLElement,\n\t\tevents: Record<string, (e: Event) => void>\n\t): () => void {\n\t\tObject.entries(events).forEach(([event, handler]) => {\n\t\t\telement.addEventListener(event, handler)\n\t\t})\n\n\t\t// Return cleanup function\n\t\treturn () => {\n\t\t\tObject.entries(events).forEach(([event, handler]) => {\n\t\t\t\telement.removeEventListener(event, handler)\n\t\t\t})\n\t\t}\n\t}\n\n\tprotected createConfig<T extends PluginConfig>(defaults: T): T {\n\t\treturn { ...defaults, ...this.config } as T\n\t}\n\n\t// Plugin status\n\tget isInitialized(): boolean {\n\t\treturn this.initialized\n\t}\n\n\tget isActive(): boolean {\n\t\treturn this.active\n\t}\n}\n\n// Simple plugin factory helper\nexport function createPlugin<T extends BasePlugin>(PluginClass: new (config?: PluginConfig) => T) {\n\treturn (config?: PluginConfig) => new PluginClass(config)\n}\n\n// Plugin decorator for metadata - TODO: Fix implementation\n// export function plugin(metadata: Omit<PluginMetadata, 'version'> & { version?: string }) {\n// return function<T extends { new (...args: any[]): BasePlugin }>(constructor: T) {\n// return class extends constructor {\n// constructor(...args: any[]) {\n// super(metadata, ...args)\n// }\n// }\n// }\n// }\n\n// Common plugin configurations\nexport interface UIPluginConfig extends PluginConfig {\n\tposition?: \"top\" | \"bottom\" | \"left\" | \"right\" | \"center\"\n\tzIndex?: number\n\tclassName?: string\n\tstyle?: Record<string, string>\n}\n\nexport interface AnalyticsPluginConfig extends PluginConfig {\n\ttrackingId?: string\n\tevents?: string[]\n\tsamplingRate?: number\n\tdebug?: boolean\n}\n\nexport interface PerformancePluginConfig extends PluginConfig {\n\tenableMetrics?: boolean\n\treportInterval?: number\n\tthresholds?: Record<string, number>\n}\n","import { type AnalyticsPluginConfig, BasePlugin } from \"../base-plugin\"\n\ninterface AnalyticsEvent {\n\tevent: string\n\ttimestamp: number\n\tdata?: any\n}\n\ninterface AnalyticsConfig extends AnalyticsPluginConfig {\n\ttrackingId: string\n\tevents: string[]\n\tsamplingRate: number\n\tdebug: boolean\n\tendpoint?: string\n}\n\nexport class AnalyticsPlugin extends BasePlugin {\n\tprivate events: AnalyticsEvent[] = []\n\tprivate analyticsConfig!: AnalyticsConfig\n\tprivate cleanupFunctions: Array<() => void> = []\n\tprivate reportTimer?: NodeJS.Timeout\n\n\tconstructor(config?: AnalyticsPluginConfig) {\n\t\tsuper({\n\t\t\tname: \"analytics\",\n\t\t\tdescription: \"Media player analytics and tracking\",\n\t\t\tcategory: \"analytics\",\n\t\t\tpriority: \"low\",\n\t\t\tauthor: \"BaroiPlayer Team\"\n\t\t})\n\t}\n\n\tprotected onInitialize(): void {\n\t\tthis.analyticsConfig = this.createConfig<AnalyticsConfig>({\n\t\t\ttrackingId: \"\",\n\t\t\tevents: [\"play\", \"pause\", \"seek\", \"ended\", \"error\"],\n\t\t\tsamplingRate: 1.0,\n\t\t\tdebug: false,\n\t\t\tendpoint: \"/api/analytics\"\n\t\t})\n\n\t\tif (!this.analyticsConfig.trackingId) {\n\t\t\tthrow new Error(\"Analytics plugin requires a tracking ID\")\n\t\t}\n\n\t\tthis.logger?.info(\"Analytics plugin initialized\", {\n\t\t\ttrackingId: this.analyticsConfig.trackingId,\n\t\t\tevents: this.analyticsConfig.events\n\t\t})\n\t}\n\n\tprotected onActivate(): void {\n\t\t// Set up event listeners for media events\n\t\tconst mediaEventCleanup = this.setupMediaEventListeners()\n\t\tthis.cleanupFunctions.push(mediaEventCleanup)\n\n\t\t// Set up periodic reporting\n\t\tif (this.analyticsConfig.endpoint) {\n\t\t\tthis.reportTimer = setInterval(() => {\n\t\t\t\tthis.reportEvents()\n\t\t\t}, 30000) // Report every 30 seconds\n\n\t\t\tthis.cleanupFunctions.push(() => {\n\t\t\t\tif (this.reportTimer) {\n\t\t\t\t\tclearInterval(this.reportTimer)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tthis.trackEvent(\"plugin_activated\", { plugin: \"analytics\" })\n\t\tthis.logger?.info(\"Analytics tracking started\")\n\t}\n\n\tprotected onDeactivate(): void {\n\t\t// Clean up all event listeners and timers\n\t\tthis.cleanupFunctions.forEach((cleanup) => cleanup())\n\t\tthis.cleanupFunctions = []\n\n\t\t// Report any remaining events\n\t\tif (this.events.length > 0) {\n\t\t\tthis.reportEvents()\n\t\t}\n\n\t\tthis.trackEvent(\"plugin_deactivated\", { plugin: \"analytics\" })\n\t\tthis.logger?.info(\"Analytics tracking stopped\")\n\t}\n\n\tprotected onConfigure(newConfig: AnalyticsConfig): void {\n\t\t// Update tracking configuration\n\t\tthis.analyticsConfig = { ...this.analyticsConfig, ...newConfig }\n\t\tif (newConfig.events) {\n\t\t\t// Re-setup event listeners if events changed\n\t\t\tthis.cleanupFunctions.forEach((cleanup) => cleanup())\n\t\t\tthis.cleanupFunctions = []\n\n\t\t\tconst mediaEventCleanup = this.setupMediaEventListeners()\n\t\t\tthis.cleanupFunctions.push(mediaEventCleanup)\n\t\t}\n\t}\n\n\tprivate setupMediaEventListeners(): () => void {\n\t\tconst cleanupFunctions: Array<() => void> = []\n\n\t\t// Listen for media state changes\n\t\tif (this.analyticsConfig.events.includes(\"play\")) {\n\t\t\tconst unsubscribe = this.on(\"media:play\", (data) => {\n\t\t\t\tthis.trackEvent(\"play\", data)\n\t\t\t})\n\t\t\tcleanupFunctions.push(unsubscribe)\n\t\t}\n\n\t\tif (this.analyticsConfig.events.includes(\"pause\")) {\n\t\t\tconst unsubscribe = this.on(\"media:pause\", (data) => {\n\t\t\t\tthis.trackEvent(\"pause\", data)\n\t\t\t})\n\t\t\tcleanupFunctions.push(unsubscribe)\n\t\t}\n\n\t\tif (this.analyticsConfig.events.includes(\"seek\")) {\n\t\t\tconst unsubscribe = this.on(\"media:seek\", (data) => {\n\t\t\t\tthis.trackEvent(\"seek\", data)\n\t\t\t})\n\t\t\tcleanupFunctions.push(unsubscribe)\n\t\t}\n\n\t\tif (this.analyticsConfig.events.includes(\"ended\")) {\n\t\t\tconst unsubscribe = this.on(\"media:ended\", (data) => {\n\t\t\t\tthis.trackEvent(\"ended\", data)\n\t\t\t})\n\t\t\tcleanupFunctions.push(unsubscribe)\n\t\t}\n\n\t\tif (this.analyticsConfig.events.includes(\"error\")) {\n\t\t\tconst unsubscribe = this.on(\"media:error\", (data) => {\n\t\t\t\tthis.trackEvent(\"error\", data)\n\t\t\t})\n\t\t\tcleanupFunctions.push(unsubscribe)\n\t\t}\n\n\t\t// Return cleanup function\n\t\treturn () => {\n\t\t\tcleanupFunctions.forEach((cleanup) => cleanup())\n\t\t}\n\t}\n\n\tprivate trackEvent(event: string, data?: any): void {\n\t\t// Apply sampling rate\n\t\tif (Math.random() > this.analyticsConfig.samplingRate) {\n\t\t\treturn\n\t\t}\n\n\t\tconst analyticsEvent: AnalyticsEvent = {\n\t\t\tevent,\n\t\t\ttimestamp: Date.now(),\n\t\t\tdata: {\n\t\t\t\t...data,\n\t\t\t\ttrackingId: this.analyticsConfig.trackingId,\n\t\t\t\tsessionId: this.generateSessionId(),\n\t\t\t\tmediaState: {\n\t\t\t\t\tcurrentTime: this.state?.currentTime,\n\t\t\t\t\tduration: this.state?.duration,\n\t\t\t\t\tvolume: this.state?.volume,\n\t\t\t\t\tisPlaying: this.state?.isPlaying\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.events.push(analyticsEvent)\n\n\t\tif (this.analyticsConfig.debug) {\n\t\t\tthis.logger?.info(\"Analytics event tracked\", analyticsEvent)\n\t\t}\n\n\t\t// Emit event for other plugins or applications to use\n\t\tthis.emit(\"analytics:event\", analyticsEvent)\n\t}\n\n\tprivate async reportEvents(): Promise<void> {\n\t\tif (this.events.length === 0 || !this.analyticsConfig.endpoint) {\n\t\t\treturn\n\t\t}\n\n\t\tconst eventsToReport = [...this.events]\n\t\tthis.events = []\n\n\t\ttry {\n\t\t\tconst response = await fetch(this.analyticsConfig.endpoint, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\ttrackingId: this.analyticsConfig.trackingId,\n\t\t\t\t\tevents: eventsToReport\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`Analytics report failed: ${response.status}`)\n\t\t\t}\n\n\t\t\tif (this.analyticsConfig.debug) {\n\t\t\t\tthis.logger?.info(`Reported ${eventsToReport.length} analytics events`)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Put events back in queue on failure\n\t\t\tthis.events.unshift(...eventsToReport)\n\t\t\tthis.logger?.error(\"Failed to report analytics events\", error)\n\t\t}\n\t}\n\n\tprivate generateSessionId(): string {\n\t\t// Simple session ID generation - could be more sophisticated\n\t\treturn `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n\t}\n\n\t// Public API for manual event tracking\n\tpublic track(event: string, data?: any): void {\n\t\tthis.trackEvent(event, data)\n\t}\n\n\t// Get pending events count\n\tpublic getPendingEventsCount(): number {\n\t\treturn this.events.length\n\t}\n\n\t// Flush all pending events\n\tpublic async flush(): Promise<void> {\n\t\tawait this.reportEvents()\n\t}\n\n\tprotected onHealthCheck(): boolean {\n\t\t// Check if we're not accumulating too many events\n\t\treturn this.events.length < 1000\n\t}\n}\n\n// Plugin factory\nexport const createAnalyticsPlugin = (config?: AnalyticsPluginConfig) => {\n\treturn new AnalyticsPlugin(config)\n}\n","// Plugin system core exports\nexport type {\n\tPlugin,\n\tPluginFactory,\n\tPluginConfig,\n\tPluginRegistry as IPluginRegistry,\n\tPluginContext,\n\tPluginLogger,\n\tPluginMetadata,\n\tPluginCategory,\n\tPluginPriority,\n\tPluginPhase,\n\tPluginEvents\n} from \"./types\"\n\nexport {\n\tPluginError,\n\tPluginDependencyError,\n\tPluginConflictError\n} from \"./types\"\n\nexport { PluginRegistry } from \"./registry\"\n\nexport {\n\tBasePlugin,\n\tcreatePlugin,\n\ttype UIPluginConfig,\n\ttype AnalyticsPluginConfig,\n\ttype PerformancePluginConfig\n} from \"./base-plugin\"\n\n// Example plugins\nexport { AnalyticsPlugin, createAnalyticsPlugin } from \"./examples/analytics-plugin\"\n\n// Plugin utilities\nexport * from \"./utils\"\n\n// Version\nexport const PLUGIN_SYSTEM_VERSION = \"1.0.0\"\n"],"names":["PluginError","pluginName","phase","message","originalError","PluginDependencyError","missingDependencies","PluginConflictError","conflictingPlugins","ConsolePluginLogger","prefix","__publicField","data","PluginValidator","plugin","metadata","config","schema","key","rules","value","PluginPerformanceMonitor","operation","fn","startTime","updateMetrics","endTime","duration","existing","result","error","pluginMetrics","PluginDevelopmentHelpers","time","volume","name","hooks","label","PluginStorage","defaultValue","item","defaultPluginLogger","defaultPerformanceMonitor","PluginRegistry","logger","EventBus","nameOrFactory","pluginOrConfig","pluginConfig","factory","context","pluginContext","category","mergedConfig","orderedNames","names","dep","visited","visiting","visit","activeConflicts","conflict","testInitFlag","status","resolved","reversed","event","listener","results","healthResult","healthy","target","inactiveDependencies","handler","a","b","priorityOrder","aPriority","BasePlugin","oldConfig","newConfig","element","events","defaults","createPlugin","PluginClass","AnalyticsPlugin","mediaEventCleanup","cleanup","cleanupFunctions","unsubscribe","analyticsEvent","eventsToReport","response","createAnalyticsPlugin","PLUGIN_SYSTEM_VERSION"],"mappings":"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"}
|