vue-streaming 0.1.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +425 -699
  2. package/dist/WebSocketStream.vue_vue_type_script_setup_true_lang-C_F2vNNk.js +1081 -0
  3. package/dist/WebSocketStream.vue_vue_type_script_setup_true_lang-C_F2vNNk.js.map +1 -0
  4. package/dist/WebSocketStream.vue_vue_type_script_setup_true_lang-EzMJEQkx.cjs +2 -0
  5. package/dist/WebSocketStream.vue_vue_type_script_setup_true_lang-EzMJEQkx.cjs.map +1 -0
  6. package/dist/components/index.cjs +2 -0
  7. package/dist/components/index.cjs.map +1 -0
  8. package/dist/components/index.js +15 -0
  9. package/dist/components/index.js.map +1 -0
  10. package/dist/composables/index.cjs +2 -0
  11. package/dist/composables/index.cjs.map +1 -0
  12. package/dist/composables/index.js +15 -0
  13. package/dist/composables/index.js.map +1 -0
  14. package/dist/index.cjs +1 -3
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.js +62 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/types.cjs +2 -0
  19. package/dist/types.cjs.map +1 -0
  20. package/dist/types.js +2 -0
  21. package/dist/types.js.map +1 -0
  22. package/dist/usePointCloud-D0qcpYFY.js +115 -0
  23. package/dist/usePointCloud-D0qcpYFY.js.map +1 -0
  24. package/dist/usePointCloud-D2csBAs8.cjs +2 -0
  25. package/dist/usePointCloud-D2csBAs8.cjs.map +1 -0
  26. package/dist/useWebSocket-7-qar6to.cjs +4 -0
  27. package/dist/useWebSocket-7-qar6to.cjs.map +1 -0
  28. package/dist/useWebSocket-CrE6QkTW.js +1278 -0
  29. package/dist/useWebSocket-CrE6QkTW.js.map +1 -0
  30. package/dist/utils/index.cjs +2 -0
  31. package/dist/utils/index.cjs.map +1 -0
  32. package/dist/utils/index.js +503 -0
  33. package/dist/utils/index.js.map +1 -0
  34. package/dist/vue-streaming.css +1 -0
  35. package/package.json +126 -69
  36. package/dist/index.d.cts +0 -49
  37. package/dist/index.d.ts +0 -49
  38. package/dist/index.global.js +0 -8
  39. package/dist/index.global.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketStream.vue_vue_type_script_setup_true_lang-C_F2vNNk.js","sources":["../src/components/HLSPlayer.vue","../src/components/PointCloudViewer.vue","../src/components/StreamViewer.vue","../src/components/WebRTCViewer.vue","../src/components/DataStreamView.vue","../src/components/HTTPStream.vue","../src/components/LaravelEchoStream.vue","../src/components/LongPollingStream.vue","../src/components/SocketIOStream.vue","../src/components/SSEStream.vue","../src/components/WebSocketStream.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\n/**\r\n * HLSPlayer - HLS video player component\r\n * Wrapper for useHLS composable with video controls\r\n */\r\nimport { computed, onMounted, ref, watch } from \"vue\";\r\nimport { useHLS, type HLSState } from \"../composables/useHLS\";\r\nimport type { HLSCallbacks, HLSConfig, HLSLevel } from \"../types\";\r\n\r\ninterface Props {\r\n /** HLS stream URL */\r\n src: string;\r\n /** Auto-play video */\r\n autoPlay?: boolean;\r\n /** Show native controls */\r\n controls?: boolean;\r\n /** Muted */\r\n muted?: boolean;\r\n /** Loop */\r\n loop?: boolean;\r\n /** Poster image */\r\n poster?: string;\r\n /** Low latency mode */\r\n lowLatency?: boolean;\r\n /** Start level (-1 for auto) */\r\n startLevel?: number;\r\n /** CSS class for video element */\r\n videoClass?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n autoPlay: true,\r\n controls: true,\r\n muted: false,\r\n loop: false,\r\n lowLatency: false,\r\n startLevel: -1,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: \"ready\"): void;\r\n (e: \"play\"): void;\r\n (e: \"pause\"): void;\r\n (e: \"ended\"): void;\r\n (e: \"error\", error: Error): void;\r\n (e: \"levelChange\", level: number): void;\r\n (e: \"timeUpdate\", time: number): void;\r\n (e: \"stateChange\", state: HLSState): void;\r\n}>();\r\n\r\nconst videoRef = ref<HTMLVideoElement | null>(null);\r\n\r\nconst hlsConfig: HLSConfig = {\r\n url: props.src,\r\n autoPlay: props.autoPlay,\r\n lowLatencyMode: props.lowLatency,\r\n startLevel: props.startLevel,\r\n};\r\n\r\nconst hlsCallbacks: HLSCallbacks = {\r\n onManifestLoaded: (levels) => {\r\n emit(\"ready\");\r\n },\r\n onLevelSwitched: (level) => {\r\n emit(\"levelChange\", level);\r\n },\r\n onPlaybackStarted: () => {\r\n emit(\"play\");\r\n },\r\n onPlaybackEnded: () => {\r\n emit(\"ended\");\r\n },\r\n onError: (error) => {\r\n emit(\"error\", error);\r\n },\r\n};\r\n\r\nconst {\r\n state,\r\n isPlaying,\r\n isBuffering,\r\n levels,\r\n currentLevel,\r\n autoLevelEnabled,\r\n currentTime,\r\n duration,\r\n buffered,\r\n volume,\r\n muted: isMuted,\r\n stats,\r\n error,\r\n isSupported,\r\n attach,\r\n play,\r\n pause,\r\n stop,\r\n seek,\r\n setLevel,\r\n setVolume,\r\n toggleMute,\r\n destroy,\r\n} = useHLS(hlsConfig, hlsCallbacks);\r\n\r\n// Watch state changes\r\nwatch(state, (newState) => {\r\n emit(\"stateChange\", newState);\r\n});\r\n\r\nwatch(currentTime, (time) => {\r\n emit(\"timeUpdate\", time);\r\n});\r\n\r\n// Format time\r\nfunction formatTime(seconds: number): string {\r\n if (!isFinite(seconds)) return \"0:00\";\r\n const mins = Math.floor(seconds / 60);\r\n const secs = Math.floor(seconds % 60);\r\n return `${mins}:${secs.toString().padStart(2, \"0\")}`;\r\n}\r\n\r\n// Current level info\r\nconst currentLevelInfo = computed<HLSLevel | null>(() => {\r\n if (currentLevel.value < 0 || currentLevel.value >= levels.value.length) {\r\n return null;\r\n }\r\n return levels.value[currentLevel.value];\r\n});\r\n\r\n// Initialize on mount\r\nonMounted(async () => {\r\n if (videoRef.value) {\r\n try {\r\n await attach(videoRef.value);\r\n } catch (err) {\r\n console.error(\"[HLSPlayer] Failed to attach:\", err);\r\n }\r\n }\r\n});\r\n\r\n// Watch for src changes\r\nwatch(\r\n () => props.src,\r\n async (newSrc) => {\r\n if (videoRef.value && newSrc) {\r\n destroy();\r\n hlsConfig.url = newSrc;\r\n await attach(videoRef.value);\r\n }\r\n },\r\n);\r\n\r\ndefineExpose({\r\n play,\r\n pause,\r\n stop,\r\n seek,\r\n setLevel,\r\n setVolume,\r\n toggleMute,\r\n state,\r\n levels,\r\n currentLevel,\r\n stats,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"hls-player\">\r\n <div class=\"hls-player__video-container\">\r\n <video\r\n ref=\"videoRef\"\r\n :class=\"['hls-player__video', videoClass]\"\r\n :controls=\"controls\"\r\n :muted=\"muted\"\r\n :loop=\"loop\"\r\n :poster=\"poster\"\r\n playsinline\r\n />\r\n\r\n <!-- Loading overlay -->\r\n <div v-if=\"isBuffering\" class=\"hls-player__overlay\">\r\n <div class=\"hls-player__spinner\" />\r\n </div>\r\n\r\n <!-- Error overlay -->\r\n <div v-if=\"error\" class=\"hls-player__overlay hls-player__overlay--error\">\r\n <div class=\"hls-player__error\">\r\n <span>⚠️ {{ error.message }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Quality selector -->\r\n <div v-if=\"levels.length > 1\" class=\"hls-player__controls\">\r\n <div class=\"hls-player__quality\">\r\n <label>Quality:</label>\r\n <select\r\n :value=\"currentLevel\"\r\n @change=\"setLevel(Number(($event.target as HTMLSelectElement).value))\"\r\n >\r\n <option :value=\"-1\">Auto</option>\r\n <option\r\n v-for=\"level in levels\"\r\n :key=\"level.index\"\r\n :value=\"level.index\"\r\n >\r\n {{ level.height }}p ({{ Math.round(level.bitrate / 1000) }}kbps)\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"hls-player__stats\">\r\n <span v-if=\"currentLevelInfo\">\r\n {{ currentLevelInfo.width }}x{{ currentLevelInfo.height }}\r\n </span>\r\n <span\r\n >{{ Math.round((stats.bandwidth / 1000000) * 10) / 10 }} Mbps</span\r\n >\r\n <span>{{ formatTime(currentTime) }} / {{ formatTime(duration) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.hls-player {\r\n display: flex;\r\n flex-direction: column;\r\n background: #000;\r\n border-radius: 4px;\r\n overflow: hidden;\r\n}\r\n\r\n.hls-player__video-container {\r\n position: relative;\r\n width: 100%;\r\n aspect-ratio: 16 / 9;\r\n}\r\n\r\n.hls-player__video {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n}\r\n\r\n.hls-player__overlay {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: rgba(0, 0, 0, 0.5);\r\n}\r\n\r\n.hls-player__overlay--error {\r\n background: rgba(0, 0, 0, 0.8);\r\n}\r\n\r\n.hls-player__spinner {\r\n width: 48px;\r\n height: 48px;\r\n border: 3px solid rgba(255, 255, 255, 0.3);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n.hls-player__error {\r\n color: #f48771;\r\n text-align: center;\r\n padding: 16px;\r\n}\r\n\r\n.hls-player__controls {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n background: #1e1e1e;\r\n color: #ccc;\r\n font-size: 12px;\r\n}\r\n\r\n.hls-player__quality {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.hls-player__quality select {\r\n padding: 4px 8px;\r\n background: #3c3c3c;\r\n border: none;\r\n border-radius: 3px;\r\n color: #ccc;\r\n cursor: pointer;\r\n}\r\n\r\n.hls-player__stats {\r\n display: flex;\r\n gap: 16px;\r\n color: #858585;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * PointCloudViewer - 3D Point Cloud visualization component\r\n * Uses Three.js for rendering (requires three as peer dependency)\r\n */\r\nimport { computed, onMounted, onUnmounted, ref, watch } from \"vue\";\r\nimport type { DecodedPointCloud, Point3D } from \"../types\";\r\n\r\ninterface Props {\r\n /** Point cloud data */\r\n points: Point3D[];\r\n /** Point size */\r\n pointSize?: number;\r\n /** Default point color (hex) */\r\n pointColor?: number;\r\n /** Use point colors if available */\r\n usePointColors?: boolean;\r\n /** Camera position */\r\n cameraPosition?: { x: number; y: number; z: number };\r\n /** Auto-rotate */\r\n autoRotate?: boolean;\r\n /** Auto-rotate speed */\r\n autoRotateSpeed?: number;\r\n /** Background color */\r\n backgroundColor?: number;\r\n /** Show axes helper */\r\n showAxes?: boolean;\r\n /** Show grid */\r\n showGrid?: boolean;\r\n /** Bounds for camera auto-fit */\r\n bounds?: DecodedPointCloud[\"bounds\"];\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n pointSize: 0.02,\r\n pointColor: 0x00ff00,\r\n usePointColors: true,\r\n cameraPosition: () => ({ x: 5, y: 5, z: 5 }),\r\n autoRotate: false,\r\n autoRotateSpeed: 1,\r\n backgroundColor: 0x1e1e1e,\r\n showAxes: false,\r\n showGrid: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: \"ready\"): void;\r\n (e: \"click\", point: Point3D | null, index: number): void;\r\n (e: \"error\", error: Error): void;\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst isLoading = ref(true);\r\nconst error = ref<Error | null>(null);\r\n\r\n// Three.js objects (loaded dynamically)\r\nlet THREE: typeof import(\"three\") | null = null;\r\nlet scene: InstanceType<typeof import(\"three\").Scene> | null = null;\r\nlet camera: InstanceType<typeof import(\"three\").PerspectiveCamera> | null =\r\n null;\r\nlet renderer: InstanceType<typeof import(\"three\").WebGLRenderer> | null = null;\r\nlet controls: {\r\n update: () => void;\r\n autoRotate: boolean;\r\n autoRotateSpeed: number;\r\n dispose: () => void;\r\n} | null = null;\r\nlet pointsObject: InstanceType<typeof import(\"three\").Points> | null = null;\r\nlet animationId: number | null = null;\r\n\r\n/**\r\n * Initialize Three.js scene\r\n */\r\nasync function initScene(): Promise<void> {\r\n if (!containerRef.value) return;\r\n\r\n try {\r\n // Dynamic import Three.js\r\n THREE = await import(\"three\");\r\n const { OrbitControls } =\r\n await import(\"three/examples/jsm/controls/OrbitControls.js\");\r\n\r\n const container = containerRef.value;\r\n const width = container.clientWidth;\r\n const height = container.clientHeight;\r\n\r\n // Scene\r\n scene = new THREE.Scene();\r\n scene.background = new THREE.Color(props.backgroundColor);\r\n\r\n // Camera\r\n camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);\r\n camera.position.set(\r\n props.cameraPosition.x,\r\n props.cameraPosition.y,\r\n props.cameraPosition.z,\r\n );\r\n\r\n // Renderer\r\n renderer = new THREE.WebGLRenderer({ antialias: true });\r\n renderer.setSize(width, height);\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n container.appendChild(renderer.domElement);\r\n\r\n // Controls\r\n controls = new OrbitControls(camera, renderer.domElement);\r\n controls.autoRotate = props.autoRotate;\r\n controls.autoRotateSpeed = props.autoRotateSpeed;\r\n\r\n // Grid\r\n if (props.showGrid) {\r\n const grid = new THREE.GridHelper(10, 10, 0x444444, 0x333333);\r\n scene.add(grid);\r\n }\r\n\r\n // Axes\r\n if (props.showAxes) {\r\n const axes = new THREE.AxesHelper(5);\r\n scene.add(axes);\r\n }\r\n\r\n // Handle resize\r\n const resizeObserver = new ResizeObserver(() => {\r\n if (!camera || !renderer || !containerRef.value) return;\r\n const w = containerRef.value.clientWidth;\r\n const h = containerRef.value.clientHeight;\r\n camera.aspect = w / h;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(w, h);\r\n });\r\n resizeObserver.observe(container);\r\n\r\n // Start animation loop\r\n animate();\r\n\r\n isLoading.value = false;\r\n emit(\"ready\");\r\n } catch (err) {\r\n const e = err instanceof Error ? err : new Error(String(err));\r\n error.value = e;\r\n emit(\"error\", e);\r\n console.error(\"[PointCloudViewer] Failed to initialize:\", err);\r\n }\r\n}\r\n\r\n/**\r\n * Update point cloud geometry\r\n */\r\nfunction updatePointCloud(): void {\r\n if (!THREE || !scene) return;\r\n\r\n // Remove existing points\r\n if (pointsObject) {\r\n scene.remove(pointsObject);\r\n pointsObject.geometry.dispose();\r\n (\r\n pointsObject.material as InstanceType<typeof THREE.PointsMaterial>\r\n ).dispose();\r\n pointsObject = null;\r\n }\r\n\r\n if (props.points.length === 0) return;\r\n\r\n // Create geometry\r\n const geometry = new THREE.BufferGeometry();\r\n const positions = new Float32Array(props.points.length * 3);\r\n const colors = new Float32Array(props.points.length * 3);\r\n let hasColors = false;\r\n\r\n for (let i = 0; i < props.points.length; i++) {\r\n const point = props.points[i];\r\n positions[i * 3] = point.x;\r\n positions[i * 3 + 1] = point.y;\r\n positions[i * 3 + 2] = point.z;\r\n\r\n if (props.usePointColors && point.r !== undefined) {\r\n hasColors = true;\r\n colors[i * 3] = point.r;\r\n colors[i * 3 + 1] = point.g ?? 0;\r\n colors[i * 3 + 2] = point.b ?? 0;\r\n } else {\r\n const color = new THREE.Color(props.pointColor);\r\n colors[i * 3] = color.r;\r\n colors[i * 3 + 1] = color.g;\r\n colors[i * 3 + 2] = color.b;\r\n }\r\n }\r\n\r\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\r\n geometry.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\r\n\r\n // Create material\r\n const material = new THREE.PointsMaterial({\r\n size: props.pointSize,\r\n vertexColors: true,\r\n sizeAttenuation: true,\r\n });\r\n\r\n // Create points\r\n pointsObject = new THREE.Points(geometry, material);\r\n scene.add(pointsObject);\r\n\r\n // Auto-fit camera if bounds provided\r\n if (props.bounds && camera) {\r\n const center = {\r\n x: (props.bounds.min.x + props.bounds.max.x) / 2,\r\n y: (props.bounds.min.y + props.bounds.max.y) / 2,\r\n z: (props.bounds.min.z + props.bounds.max.z) / 2,\r\n };\r\n\r\n const size = Math.max(\r\n props.bounds.max.x - props.bounds.min.x,\r\n props.bounds.max.y - props.bounds.min.y,\r\n props.bounds.max.z - props.bounds.min.z,\r\n );\r\n\r\n camera.position.set(\r\n center.x + size * 1.5,\r\n center.y + size * 1.5,\r\n center.z + size * 1.5,\r\n );\r\n camera.lookAt(center.x, center.y, center.z);\r\n }\r\n}\r\n\r\n/**\r\n * Animation loop\r\n */\r\nfunction animate(): void {\r\n animationId = requestAnimationFrame(animate);\r\n\r\n if (controls) {\r\n controls.update();\r\n }\r\n\r\n if (renderer && scene && camera) {\r\n renderer.render(scene, camera);\r\n }\r\n}\r\n\r\n/**\r\n * Cleanup\r\n */\r\nfunction cleanup(): void {\r\n if (animationId) {\r\n cancelAnimationFrame(animationId);\r\n animationId = null;\r\n }\r\n\r\n if (pointsObject && scene) {\r\n scene.remove(pointsObject);\r\n pointsObject.geometry.dispose();\r\n (\r\n pointsObject.material as InstanceType<\r\n typeof import(\"three\").PointsMaterial\r\n >\r\n ).dispose();\r\n }\r\n\r\n if (controls) {\r\n controls.dispose();\r\n }\r\n\r\n if (renderer) {\r\n renderer.dispose();\r\n if (containerRef.value && renderer.domElement.parentNode) {\r\n containerRef.value.removeChild(renderer.domElement);\r\n }\r\n }\r\n\r\n scene = null;\r\n camera = null;\r\n renderer = null;\r\n controls = null;\r\n pointsObject = null;\r\n}\r\n\r\n// Watch for points changes\r\nwatch(() => props.points, updatePointCloud, { deep: true });\r\n\r\n// Watch for config changes\r\nwatch(\r\n [() => props.pointSize, () => props.pointColor, () => props.usePointColors],\r\n updatePointCloud,\r\n);\r\n\r\nwatch(\r\n () => props.autoRotate,\r\n (value) => {\r\n if (controls) {\r\n controls.autoRotate = value;\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.autoRotateSpeed,\r\n (value) => {\r\n if (controls) {\r\n controls.autoRotateSpeed = value;\r\n }\r\n },\r\n);\r\n\r\nonMounted(() => {\r\n initScene();\r\n});\r\n\r\nonUnmounted(() => {\r\n cleanup();\r\n});\r\n\r\n// Stats\r\nconst stats = computed(() => ({\r\n pointCount: props.points.length,\r\n hasColors: props.points.length > 0 && props.points[0].r !== undefined,\r\n}));\r\n\r\ndefineExpose({\r\n updatePointCloud,\r\n stats,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"pointcloud-viewer\">\r\n <div ref=\"containerRef\" class=\"pointcloud-viewer__canvas\" />\r\n\r\n <!-- Loading -->\r\n <div v-if=\"isLoading\" class=\"pointcloud-viewer__overlay\">\r\n <div class=\"pointcloud-viewer__spinner\" />\r\n <span>Loading viewer...</span>\r\n </div>\r\n\r\n <!-- Error -->\r\n <div\r\n v-if=\"error\"\r\n class=\"pointcloud-viewer__overlay pointcloud-viewer__overlay--error\"\r\n >\r\n <span>⚠️ {{ error.message }}</span>\r\n <small>Make sure 'three' package is installed</small>\r\n </div>\r\n\r\n <!-- Stats -->\r\n <div class=\"pointcloud-viewer__stats\">\r\n <span>Points: {{ stats.pointCount.toLocaleString() }}</span>\r\n <span v-if=\"stats.hasColors\">🎨 Colored</span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.pointcloud-viewer {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n min-height: 300px;\r\n background: #1e1e1e;\r\n border-radius: 4px;\r\n overflow: hidden;\r\n}\r\n\r\n.pointcloud-viewer__canvas {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.pointcloud-viewer__overlay {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 12px;\r\n background: rgba(30, 30, 30, 0.9);\r\n color: #ccc;\r\n}\r\n\r\n.pointcloud-viewer__overlay--error {\r\n color: #f48771;\r\n}\r\n\r\n.pointcloud-viewer__overlay small {\r\n color: #858585;\r\n}\r\n\r\n.pointcloud-viewer__spinner {\r\n width: 32px;\r\n height: 32px;\r\n border: 3px solid rgba(255, 255, 255, 0.3);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n.pointcloud-viewer__stats {\r\n position: absolute;\r\n bottom: 8px;\r\n left: 8px;\r\n display: flex;\r\n gap: 12px;\r\n padding: 4px 8px;\r\n background: rgba(0, 0, 0, 0.6);\r\n border-radius: 3px;\r\n color: #ccc;\r\n font-size: 11px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * StreamViewer - Generic stream viewer component\r\n * Displays real-time data from various streaming sources\r\n */\r\nimport { computed, ref, watch } from \"vue\";\r\n\r\ninterface Props {\r\n /** Stream data to display */\r\n data?: unknown;\r\n /** Stream type for formatting */\r\n type?: \"json\" | \"text\" | \"binary\" | \"auto\";\r\n /** Maximum lines to display */\r\n maxLines?: number;\r\n /** Auto-scroll to bottom */\r\n autoScroll?: boolean;\r\n /** Show timestamps */\r\n showTimestamps?: boolean;\r\n /** Paused state */\r\n paused?: boolean;\r\n /** Custom formatter function */\r\n formatter?: (data: unknown) => string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: \"auto\",\r\n maxLines: 100,\r\n autoScroll: true,\r\n showTimestamps: true,\r\n paused: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: \"clear\"): void;\r\n (e: \"pause\", paused: boolean): void;\r\n}>();\r\n\r\ninterface LogEntry {\r\n id: number;\r\n timestamp: Date;\r\n data: string;\r\n type: \"data\" | \"error\" | \"info\";\r\n}\r\n\r\nconst logs = ref<LogEntry[]>([]);\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nlet idCounter = 0;\r\n\r\n/**\r\n * Format data based on type\r\n */\r\nfunction formatData(data: unknown): string {\r\n if (props.formatter) {\r\n return props.formatter(data);\r\n }\r\n\r\n if (data === null || data === undefined) {\r\n return String(data);\r\n }\r\n\r\n const type = props.type === \"auto\" ? detectType(data) : props.type;\r\n\r\n switch (type) {\r\n case \"json\":\r\n try {\r\n return JSON.stringify(data, null, 2);\r\n } catch {\r\n return String(data);\r\n }\r\n case \"binary\":\r\n if (data instanceof ArrayBuffer) {\r\n const bytes = new Uint8Array(data);\r\n return `Binary: ${bytes.length} bytes`;\r\n }\r\n return String(data);\r\n default:\r\n return String(data);\r\n }\r\n}\r\n\r\n/**\r\n * Detect data type\r\n */\r\nfunction detectType(data: unknown): \"json\" | \"text\" | \"binary\" {\r\n if (data instanceof ArrayBuffer || data instanceof Uint8Array) {\r\n return \"binary\";\r\n }\r\n if (typeof data === \"object\") {\r\n return \"json\";\r\n }\r\n return \"text\";\r\n}\r\n\r\n/**\r\n * Add log entry\r\n */\r\nfunction addLog(data: unknown, type: LogEntry[\"type\"] = \"data\"): void {\r\n if (props.paused) return;\r\n\r\n const entry: LogEntry = {\r\n id: idCounter++,\r\n timestamp: new Date(),\r\n data: formatData(data),\r\n type,\r\n };\r\n\r\n logs.value = [...logs.value, entry].slice(-props.maxLines);\r\n\r\n if (props.autoScroll) {\r\n scrollToBottom();\r\n }\r\n}\r\n\r\n/**\r\n * Scroll to bottom\r\n */\r\nfunction scrollToBottom(): void {\r\n requestAnimationFrame(() => {\r\n if (containerRef.value) {\r\n containerRef.value.scrollTop = containerRef.value.scrollHeight;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Clear logs\r\n */\r\nfunction clear(): void {\r\n logs.value = [];\r\n emit(\"clear\");\r\n}\r\n\r\n/**\r\n * Toggle pause\r\n */\r\nfunction togglePause(): void {\r\n emit(\"pause\", !props.paused);\r\n}\r\n\r\n/**\r\n * Format timestamp\r\n */\r\nfunction formatTimestamp(date: Date): string {\r\n return date.toLocaleTimeString(\"en-US\", {\r\n hour12: false,\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n fractionalSecondDigits: 3,\r\n });\r\n}\r\n\r\n// Watch for new data\r\nwatch(\r\n () => props.data,\r\n (newData) => {\r\n if (newData !== undefined) {\r\n addLog(newData);\r\n }\r\n },\r\n);\r\n\r\n// Computed stats\r\nconst stats = computed(() => ({\r\n total: logs.value.length,\r\n errors: logs.value.filter((l) => l.type === \"error\").length,\r\n}));\r\n\r\ndefineExpose({\r\n addLog,\r\n clear,\r\n logs,\r\n stats,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"stream-viewer\">\r\n <div class=\"stream-viewer__header\">\r\n <div class=\"stream-viewer__stats\">\r\n <span>Lines: {{ stats.total }}</span>\r\n <span v-if=\"stats.errors > 0\" class=\"stream-viewer__errors\">\r\n Errors: {{ stats.errors }}\r\n </span>\r\n </div>\r\n <div class=\"stream-viewer__actions\">\r\n <button\r\n @click=\"togglePause\"\r\n class=\"stream-viewer__btn\"\r\n :class=\"{ 'stream-viewer__btn--active': paused }\"\r\n >\r\n {{ paused ? \"▶ Resume\" : \"⏸ Pause\" }}\r\n </button>\r\n <button @click=\"clear\" class=\"stream-viewer__btn\">🗑 Clear</button>\r\n </div>\r\n </div>\r\n\r\n <div ref=\"containerRef\" class=\"stream-viewer__content\">\r\n <div\r\n v-for=\"log in logs\"\r\n :key=\"log.id\"\r\n class=\"stream-viewer__entry\"\r\n :class=\"`stream-viewer__entry--${log.type}`\"\r\n >\r\n <span v-if=\"showTimestamps\" class=\"stream-viewer__timestamp\">\r\n {{ formatTimestamp(log.timestamp) }}\r\n </span>\r\n <pre class=\"stream-viewer__data\">{{ log.data }}</pre>\r\n </div>\r\n\r\n <div v-if=\"logs.length === 0\" class=\"stream-viewer__empty\">\r\n Waiting for data...\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.stream-viewer {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n min-height: 200px;\r\n background: #1e1e1e;\r\n border-radius: 4px;\r\n overflow: hidden;\r\n font-family: \"Consolas\", \"Monaco\", monospace;\r\n font-size: 12px;\r\n}\r\n\r\n.stream-viewer__header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n background: #252526;\r\n border-bottom: 1px solid #3c3c3c;\r\n}\r\n\r\n.stream-viewer__stats {\r\n display: flex;\r\n gap: 16px;\r\n color: #858585;\r\n}\r\n\r\n.stream-viewer__errors {\r\n color: #f48771;\r\n}\r\n\r\n.stream-viewer__actions {\r\n display: flex;\r\n gap: 8px;\r\n}\r\n\r\n.stream-viewer__btn {\r\n padding: 4px 8px;\r\n background: #3c3c3c;\r\n border: none;\r\n border-radius: 3px;\r\n color: #cccccc;\r\n cursor: pointer;\r\n font-size: 11px;\r\n}\r\n\r\n.stream-viewer__btn:hover {\r\n background: #4c4c4c;\r\n}\r\n\r\n.stream-viewer__btn--active {\r\n background: #0e639c;\r\n}\r\n\r\n.stream-viewer__content {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 8px;\r\n}\r\n\r\n.stream-viewer__entry {\r\n display: flex;\r\n gap: 8px;\r\n padding: 2px 0;\r\n border-bottom: 1px solid #2d2d2d;\r\n}\r\n\r\n.stream-viewer__entry--error {\r\n background: rgba(244, 135, 113, 0.1);\r\n}\r\n\r\n.stream-viewer__entry--info {\r\n color: #4ec9b0;\r\n}\r\n\r\n.stream-viewer__timestamp {\r\n color: #858585;\r\n white-space: nowrap;\r\n}\r\n\r\n.stream-viewer__data {\r\n margin: 0;\r\n white-space: pre-wrap;\r\n word-break: break-all;\r\n color: #d4d4d4;\r\n}\r\n\r\n.stream-viewer__empty {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n color: #858585;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * WebRTCViewer - WebRTC stream viewer with point cloud and detection support\r\n * Combines video, point cloud, and bounding box visualization\r\n */\r\nimport { computed, onMounted, ref, watch } from \"vue\";\r\nimport { useWebRTC } from \"../composables/useWebRTC\";\r\nimport type {\r\n BoundingBox3D,\r\n DetectionFrame,\r\n PointCloudFrame,\r\n WebRTCCallbacks,\r\n WebRTCConfig,\r\n} from \"../types\";\r\n\r\ninterface Props {\r\n /** Signaling server URL */\r\n signalingUrl: string;\r\n /** ICE servers */\r\n iceServers?: RTCIceServer[];\r\n /** Enable point cloud */\r\n enablePointCloud?: boolean;\r\n /** Enable detections */\r\n enableDetections?: boolean;\r\n /** Auto-connect on mount */\r\n autoConnect?: boolean;\r\n /** Auto-reconnect */\r\n autoReconnect?: boolean;\r\n /** Max reconnect attempts */\r\n maxReconnectAttempts?: number;\r\n /** Show connection status */\r\n showStatus?: boolean;\r\n /** Show stats */\r\n showStats?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n iceServers: () => [{ urls: \"stun:stun.l.google.com:19302\" }],\r\n enablePointCloud: true,\r\n enableDetections: true,\r\n autoConnect: true,\r\n autoReconnect: true,\r\n maxReconnectAttempts: 5,\r\n showStatus: true,\r\n showStats: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: \"connected\"): void;\r\n (e: \"disconnected\"): void;\r\n (e: \"error\", error: Error): void;\r\n (e: \"pointcloud\", frame: PointCloudFrame): void;\r\n (e: \"detections\", frame: DetectionFrame): void;\r\n (e: \"boundingboxes\", boxes: BoundingBox3D[]): void;\r\n (e: \"status\", status: string): void;\r\n}>();\r\n\r\nconst statusMessage = ref(\"Idle\");\r\n\r\nconst config: WebRTCConfig = {\r\n signalingUrl: props.signalingUrl,\r\n iceServers: props.iceServers,\r\n enablePointCloud: props.enablePointCloud,\r\n enableDetections: props.enableDetections,\r\n autoReconnect: props.autoReconnect,\r\n maxReconnectAttempts: props.maxReconnectAttempts,\r\n};\r\n\r\nconst callbacks: WebRTCCallbacks = {\r\n onStatus: (status) => {\r\n statusMessage.value = status;\r\n emit(\"status\", status);\r\n },\r\n onConnectionState: (state) => {\r\n if (state === \"connected\") {\r\n emit(\"connected\");\r\n } else if (\r\n state === \"disconnected\" ||\r\n state === \"closed\" ||\r\n state === \"failed\"\r\n ) {\r\n emit(\"disconnected\");\r\n }\r\n },\r\n onPointCloudFrame: (frame) => {\r\n emit(\"pointcloud\", frame);\r\n },\r\n onDetectionFrame: (frame) => {\r\n emit(\"detections\", frame);\r\n },\r\n onBoundingBoxData: (boxes) => {\r\n emit(\"boundingboxes\", boxes);\r\n },\r\n onError: (error) => {\r\n emit(\"error\", error);\r\n },\r\n};\r\n\r\nconst {\r\n isRunning,\r\n connectionState,\r\n dataChannels,\r\n lastPointCloudFrame,\r\n lastDetectionFrame,\r\n lastBoundingBoxes,\r\n error,\r\n start,\r\n stop,\r\n sendControl,\r\n} = useWebRTC(config, callbacks);\r\n\r\n// Stats\r\nconst stats = computed(() => ({\r\n channels: dataChannels.value.size,\r\n pointCount: lastPointCloudFrame.value?.points.length ?? 0,\r\n detectionCount: lastDetectionFrame.value?.detections.length ?? 0,\r\n bboxCount: lastBoundingBoxes.value.length,\r\n}));\r\n\r\n// Connection state color\r\nconst stateColor = computed(() => {\r\n switch (connectionState.value) {\r\n case \"connected\":\r\n return \"#4caf50\";\r\n case \"connecting\":\r\n return \"#ff9800\";\r\n case \"reconnecting\":\r\n return \"#ff9800\";\r\n case \"error\":\r\n return \"#f44336\";\r\n default:\r\n return \"#9e9e9e\";\r\n }\r\n});\r\n\r\n// Auto-connect on mount\r\nonMounted(() => {\r\n if (props.autoConnect) {\r\n start();\r\n }\r\n});\r\n\r\n// Watch for signalingUrl changes\r\nwatch(\r\n () => props.signalingUrl,\r\n () => {\r\n if (isRunning.value) {\r\n stop();\r\n config.signalingUrl = props.signalingUrl;\r\n start();\r\n }\r\n },\r\n);\r\n\r\ndefineExpose({\r\n isRunning,\r\n connectionState,\r\n start,\r\n stop,\r\n sendControl,\r\n lastPointCloudFrame,\r\n lastDetectionFrame,\r\n lastBoundingBoxes,\r\n stats,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"webrtc-viewer\">\r\n <!-- Header -->\r\n <div v-if=\"showStatus\" class=\"webrtc-viewer__header\">\r\n <div class=\"webrtc-viewer__status\">\r\n <span\r\n class=\"webrtc-viewer__indicator\"\r\n :style=\"{ backgroundColor: stateColor }\"\r\n />\r\n <span>{{ connectionState }}</span>\r\n </div>\r\n\r\n <div class=\"webrtc-viewer__controls\">\r\n <button\r\n v-if=\"!isRunning\"\r\n @click=\"start\"\r\n class=\"webrtc-viewer__btn webrtc-viewer__btn--connect\"\r\n >\r\n ▶ Connect\r\n </button>\r\n <button\r\n v-else\r\n @click=\"stop\"\r\n class=\"webrtc-viewer__btn webrtc-viewer__btn--disconnect\"\r\n >\r\n ⏹ Disconnect\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Main content -->\r\n <div class=\"webrtc-viewer__content\">\r\n <slot\r\n :is-running=\"isRunning\"\r\n :connection-state=\"connectionState\"\r\n :point-cloud-frame=\"lastPointCloudFrame\"\r\n :detection-frame=\"lastDetectionFrame\"\r\n :bounding-boxes=\"lastBoundingBoxes\"\r\n :error=\"error\"\r\n :start=\"start\"\r\n :stop=\"stop\"\r\n :send-control=\"sendControl\"\r\n >\r\n <!-- Default content when no slot provided -->\r\n <div class=\"webrtc-viewer__default\">\r\n <div v-if=\"!isRunning\" class=\"webrtc-viewer__placeholder\">\r\n <span>Click Connect to start WebRTC stream</span>\r\n </div>\r\n\r\n <div\r\n v-else-if=\"connectionState === 'connecting'\"\r\n class=\"webrtc-viewer__loading\"\r\n >\r\n <div class=\"webrtc-viewer__spinner\" />\r\n <span>{{ statusMessage }}</span>\r\n </div>\r\n\r\n <div v-else-if=\"error\" class=\"webrtc-viewer__error\">\r\n <span>⚠️ {{ error.message }}</span>\r\n </div>\r\n\r\n <div v-else class=\"webrtc-viewer__info\">\r\n <p>WebRTC Connected</p>\r\n <p v-if=\"stats.pointCount > 0\">\r\n Points: {{ stats.pointCount.toLocaleString() }}\r\n </p>\r\n <p v-if=\"stats.bboxCount > 0\">\r\n Bounding Boxes: {{ stats.bboxCount }}\r\n </p>\r\n </div>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- Stats footer -->\r\n <div v-if=\"showStats && isRunning\" class=\"webrtc-viewer__footer\">\r\n <span>Channels: {{ stats.channels }}</span>\r\n <span v-if=\"props.enablePointCloud\">\r\n Points: {{ stats.pointCount.toLocaleString() }}\r\n </span>\r\n <span v-if=\"props.enableDetections\">\r\n Detections: {{ stats.detectionCount }}\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.webrtc-viewer {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n min-height: 200px;\r\n background: #1e1e1e;\r\n border-radius: 4px;\r\n overflow: hidden;\r\n}\r\n\r\n.webrtc-viewer__header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n background: #252526;\r\n border-bottom: 1px solid #3c3c3c;\r\n}\r\n\r\n.webrtc-viewer__status {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n color: #ccc;\r\n font-size: 12px;\r\n}\r\n\r\n.webrtc-viewer__indicator {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 50%;\r\n}\r\n\r\n.webrtc-viewer__controls {\r\n display: flex;\r\n gap: 8px;\r\n}\r\n\r\n.webrtc-viewer__btn {\r\n padding: 4px 12px;\r\n border: none;\r\n border-radius: 3px;\r\n font-size: 12px;\r\n cursor: pointer;\r\n}\r\n\r\n.webrtc-viewer__btn--connect {\r\n background: #0e639c;\r\n color: white;\r\n}\r\n\r\n.webrtc-viewer__btn--connect:hover {\r\n background: #1177bb;\r\n}\r\n\r\n.webrtc-viewer__btn--disconnect {\r\n background: #5a5a5a;\r\n color: white;\r\n}\r\n\r\n.webrtc-viewer__btn--disconnect:hover {\r\n background: #6a6a6a;\r\n}\r\n\r\n.webrtc-viewer__content {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 100px;\r\n}\r\n\r\n.webrtc-viewer__default {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 12px;\r\n color: #858585;\r\n text-align: center;\r\n padding: 24px;\r\n}\r\n\r\n.webrtc-viewer__placeholder,\r\n.webrtc-viewer__loading,\r\n.webrtc-viewer__info {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.webrtc-viewer__error {\r\n color: #f48771;\r\n}\r\n\r\n.webrtc-viewer__spinner {\r\n width: 32px;\r\n height: 32px;\r\n border: 3px solid rgba(255, 255, 255, 0.3);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n.webrtc-viewer__info p {\r\n margin: 4px 0;\r\n color: #ccc;\r\n}\r\n\r\n.webrtc-viewer__footer {\r\n display: flex;\r\n gap: 16px;\r\n padding: 6px 12px;\r\n background: #252526;\r\n border-top: 1px solid #3c3c3c;\r\n color: #858585;\r\n font-size: 11px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * DataStreamView - Vue component for generic data streaming\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useDataStream } from \"../composables/useDataStream\";\r\nimport type { DataStreamConfig } from \"../types\";\r\n\r\nexport interface DataStreamViewProps<T = unknown> {\r\n /** Data stream configuration */\r\n config?: DataStreamConfig<T>;\r\n /** Auto-start on mount */\r\n autoStart?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<DataStreamViewProps>(), {\r\n config: () => ({}),\r\n autoStart: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n data: [data: unknown];\r\n batch: [data: unknown[]];\r\n error: [error: Error];\r\n}>();\r\n\r\nconst { config } = toRefs(props);\r\n\r\nconst {\r\n data,\r\n buffer,\r\n bufferSize,\r\n isStreaming,\r\n itemsPerSecond,\r\n totalItems,\r\n error,\r\n start,\r\n stop,\r\n push,\r\n clear,\r\n getBuffer,\r\n subscribe,\r\n} = useDataStream(props.config, {\r\n onData: (data) => emit(\"data\", data),\r\n onBatch: (batch) => emit(\"batch\", batch),\r\n onError: (err) => emit(\"error\", err),\r\n});\r\n\r\n// Watch for config changes\r\nwatch(\r\n config,\r\n () => {\r\n stop();\r\n start();\r\n },\r\n { deep: true },\r\n);\r\n\r\ndefineExpose({\r\n data,\r\n buffer,\r\n bufferSize,\r\n isStreaming,\r\n itemsPerSecond,\r\n totalItems,\r\n error,\r\n start,\r\n stop,\r\n push,\r\n clear,\r\n getBuffer,\r\n subscribe,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :data=\"data\"\r\n :buffer=\"buffer\"\r\n :buffer-size=\"bufferSize\"\r\n :is-streaming=\"isStreaming\"\r\n :items-per-second=\"itemsPerSecond\"\r\n :total-items=\"totalItems\"\r\n :error=\"error\"\r\n :start=\"start\"\r\n :stop=\"stop\"\r\n :push=\"push\"\r\n :clear=\"clear\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * HTTPStream - Vue component for HTTP streaming with Fetch API\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useHTTPStream } from \"../composables/useHTTP\";\r\n\r\nexport interface HTTPStreamProps {\r\n /** HTTP endpoint URL */\r\n url: string;\r\n /** HTTP method */\r\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\";\r\n /** Request headers */\r\n headers?: Record<string, string>;\r\n /** Request body (for POST/PUT/PATCH) */\r\n body?: unknown;\r\n /** Credentials mode */\r\n credentials?: RequestCredentials;\r\n /** Auto-connect on mount */\r\n autoConnect?: boolean;\r\n /** Auto-reconnect on error */\r\n autoReconnect?: boolean;\r\n /** Max reconnection attempts */\r\n maxReconnectAttempts?: number;\r\n /** Reconnection delay in ms */\r\n reconnectDelay?: number;\r\n /** Parse as line-delimited JSON */\r\n ndjson?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<HTTPStreamProps>(), {\r\n method: \"GET\",\r\n headers: () => ({}),\r\n body: undefined,\r\n credentials: \"same-origin\",\r\n autoConnect: true,\r\n autoReconnect: true,\r\n maxReconnectAttempts: 5,\r\n reconnectDelay: 1000,\r\n ndjson: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n open: [];\r\n chunk: [data: unknown, rawChunk: string];\r\n complete: [];\r\n error: [error: Error];\r\n progress: [bytesReceived: number];\r\n reconnecting: [attempt: number, maxAttempts: number];\r\n reconnected: [];\r\n reconnectFailed: [];\r\n}>();\r\n\r\nconst { url } = toRefs(props);\r\n\r\nconst {\r\n isConnected,\r\n isStreaming,\r\n connectionState,\r\n lastChunk,\r\n chunks,\r\n bytesReceived,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n clearChunks,\r\n} = useHTTPStream(\r\n {\r\n url: props.url,\r\n method: props.method,\r\n headers: props.headers,\r\n body: props.body,\r\n credentials: props.credentials,\r\n autoConnect: props.autoConnect,\r\n autoReconnect: props.autoReconnect,\r\n maxReconnectAttempts: props.maxReconnectAttempts,\r\n reconnectDelay: props.reconnectDelay,\r\n ndjson: props.ndjson,\r\n },\r\n {\r\n onOpen: () => emit(\"open\"),\r\n onChunk: (data, raw) => emit(\"chunk\", data, raw),\r\n onComplete: () => emit(\"complete\"),\r\n onError: (err) => emit(\"error\", err),\r\n onProgress: (bytes) => emit(\"progress\", bytes),\r\n onReconnecting: (attempt, max) => emit(\"reconnecting\", attempt, max),\r\n onReconnected: () => emit(\"reconnected\"),\r\n onReconnectFailed: () => emit(\"reconnectFailed\"),\r\n },\r\n);\r\n\r\n// Watch for URL changes\r\nwatch(url, () => {\r\n disconnect();\r\n connect();\r\n});\r\n\r\ndefineExpose({\r\n isConnected,\r\n isStreaming,\r\n connectionState,\r\n lastChunk,\r\n chunks,\r\n bytesReceived,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n clearChunks,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-connected=\"isConnected\"\r\n :is-streaming=\"isStreaming\"\r\n :connection-state=\"connectionState\"\r\n :last-chunk=\"lastChunk\"\r\n :chunks=\"chunks\"\r\n :bytes-received=\"bytesReceived\"\r\n :error=\"error\"\r\n :reconnect-attempts=\"reconnectAttempts\"\r\n :connect=\"connect\"\r\n :disconnect=\"disconnect\"\r\n :clear-chunks=\"clearChunks\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * LaravelEchoStream - Vue component for Laravel Echo streaming\r\n * @component\r\n */\r\nimport { onMounted, toRefs, watch } from \"vue\";\r\nimport {\r\n useLaravelEcho,\r\n type ChannelWrapper,\r\n type PresenceChannelWrapper,\r\n} from \"../composables/useLaravelEcho\";\r\nimport type { LaravelEchoConfig } from \"../types\";\r\n\r\nexport interface LaravelEchoStreamProps {\r\n /** Laravel Echo configuration */\r\n config: LaravelEchoConfig;\r\n /** Channel name to subscribe */\r\n channel?: string;\r\n /** Channel type */\r\n channelType?: \"public\" | \"private\" | \"presence\";\r\n /** Events to listen for on the channel */\r\n events?: string[];\r\n /** Auto-subscribe on mount */\r\n autoSubscribe?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<LaravelEchoStreamProps>(), {\r\n channel: undefined,\r\n channelType: \"public\",\r\n events: () => [],\r\n autoSubscribe: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n connected: [socketId: string];\r\n event: [eventName: string, data: unknown];\r\n error: [error: Error];\r\n subscribed: [channelName: string];\r\n unsubscribed: [channelName: string];\r\n // Presence channel events\r\n here: [members: unknown[]];\r\n joining: [member: unknown];\r\n leaving: [member: unknown];\r\n}>();\r\n\r\nconst { channel: channelRef } = toRefs(props);\r\n\r\nconst {\r\n isConnected,\r\n channels,\r\n channel: subscribePublic,\r\n privateChannel,\r\n presenceChannel,\r\n leave,\r\n leaveAll,\r\n connect,\r\n} = useLaravelEcho(props.config, {\r\n onConnected: (socketId) => emit(\"connected\", socketId),\r\n onError: (err) => emit(\"error\", err),\r\n});\r\n\r\nlet currentChannelWrapper: ChannelWrapper | PresenceChannelWrapper | null =\r\n null;\r\n\r\n// Subscribe to channel and setup event listeners\r\nfunction setupChannel() {\r\n if (!props.channel) return;\r\n\r\n if (props.channelType === \"private\") {\r\n currentChannelWrapper = privateChannel(props.channel);\r\n } else if (props.channelType === \"presence\") {\r\n const presenceWrapper = presenceChannel(props.channel);\r\n currentChannelWrapper = presenceWrapper;\r\n\r\n // Setup presence events\r\n presenceWrapper.here((members) => emit(\"here\", members as unknown[]));\r\n presenceWrapper.joining((member) => emit(\"joining\", member));\r\n presenceWrapper.leaving((member) => emit(\"leaving\", member));\r\n } else {\r\n currentChannelWrapper = subscribePublic(props.channel);\r\n }\r\n\r\n // Setup event listeners\r\n props.events.forEach((eventName) => {\r\n currentChannelWrapper?.listen(eventName, (data: unknown) => {\r\n emit(\"event\", eventName, data);\r\n });\r\n });\r\n\r\n emit(\"subscribed\", props.channel);\r\n}\r\n\r\nonMounted(async () => {\r\n await connect();\r\n if (props.autoSubscribe && props.channel) {\r\n setupChannel();\r\n }\r\n});\r\n\r\n// Watch for channel changes\r\nwatch(channelRef, (newChannel, oldChannel) => {\r\n if (oldChannel) {\r\n leave(oldChannel);\r\n emit(\"unsubscribed\", oldChannel);\r\n }\r\n if (newChannel && props.autoSubscribe) {\r\n setupChannel();\r\n }\r\n});\r\n\r\ndefineExpose({\r\n isConnected,\r\n channels,\r\n subscribePublic,\r\n privateChannel,\r\n presenceChannel,\r\n leave,\r\n leaveAll,\r\n connect,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-connected=\"isConnected\"\r\n :channels=\"channels\"\r\n :subscribe-public=\"subscribePublic\"\r\n :private-channel=\"privateChannel\"\r\n :presence-channel=\"presenceChannel\"\r\n :leave=\"leave\"\r\n :leave-all=\"leaveAll\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * LongPollingStream - Vue component for HTTP Long Polling\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useLongPolling } from \"../composables/useLongPolling\";\r\n\r\nexport interface LongPollingStreamProps {\r\n /** Polling endpoint URL */\r\n url: string;\r\n /** HTTP method */\r\n method?: \"GET\" | \"POST\";\r\n /** Request headers */\r\n headers?: Record<string, string>;\r\n /** Request body (for POST) */\r\n body?: unknown;\r\n /** Credentials mode */\r\n credentials?: RequestCredentials;\r\n /** Polling interval in ms (0 = immediate) */\r\n interval?: number;\r\n /** Request timeout in ms */\r\n timeout?: number;\r\n /** Auto-start on mount */\r\n autoStart?: boolean;\r\n /** Auto-restart on error */\r\n autoRestart?: boolean;\r\n /** Max restart attempts */\r\n maxRestartAttempts?: number;\r\n /** Restart delay in ms */\r\n restartDelay?: number;\r\n /** Include timestamp in requests */\r\n includeTimestamp?: boolean;\r\n /** Timestamp parameter name */\r\n timestampParam?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<LongPollingStreamProps>(), {\r\n method: \"GET\",\r\n headers: () => ({}),\r\n body: undefined,\r\n credentials: \"same-origin\",\r\n interval: 0,\r\n timeout: 30000,\r\n autoStart: true,\r\n autoRestart: true,\r\n maxRestartAttempts: 5,\r\n restartDelay: 1000,\r\n includeTimestamp: false,\r\n timestampParam: \"since\",\r\n});\r\n\r\nconst emit = defineEmits<{\r\n start: [];\r\n data: [data: unknown];\r\n error: [error: Error];\r\n stop: [];\r\n restarting: [attempt: number, maxAttempts: number];\r\n restarted: [];\r\n restartFailed: [];\r\n}>();\r\n\r\nconst { url } = toRefs(props);\r\n\r\nconst {\r\n isPolling,\r\n connectionState,\r\n lastData,\r\n dataHistory,\r\n requestCount,\r\n error,\r\n restartAttempts,\r\n start,\r\n stop,\r\n poll,\r\n clearHistory,\r\n} = useLongPolling(\r\n {\r\n url: props.url,\r\n method: props.method,\r\n headers: props.headers,\r\n body: props.body,\r\n credentials: props.credentials,\r\n interval: props.interval,\r\n timeout: props.timeout,\r\n autoStart: props.autoStart,\r\n autoRestart: props.autoRestart,\r\n maxRestartAttempts: props.maxRestartAttempts,\r\n restartDelay: props.restartDelay,\r\n includeTimestamp: props.includeTimestamp,\r\n timestampParam: props.timestampParam,\r\n },\r\n {\r\n onStart: () => emit(\"start\"),\r\n onData: (data) => emit(\"data\", data),\r\n onError: (err) => emit(\"error\", err),\r\n onStop: () => emit(\"stop\"),\r\n onRestarting: (attempt, max) => emit(\"restarting\", attempt, max),\r\n onRestarted: () => emit(\"restarted\"),\r\n onRestartFailed: () => emit(\"restartFailed\"),\r\n },\r\n);\r\n\r\n// Watch for URL changes\r\nwatch(url, () => {\r\n stop();\r\n start();\r\n});\r\n\r\ndefineExpose({\r\n isPolling,\r\n connectionState,\r\n lastData,\r\n dataHistory,\r\n requestCount,\r\n error,\r\n restartAttempts,\r\n start,\r\n stop,\r\n poll,\r\n clearHistory,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-polling=\"isPolling\"\r\n :connection-state=\"connectionState\"\r\n :last-data=\"lastData\"\r\n :data-history=\"dataHistory\"\r\n :request-count=\"requestCount\"\r\n :error=\"error\"\r\n :restart-attempts=\"restartAttempts\"\r\n :start=\"start\"\r\n :stop=\"stop\"\r\n :poll=\"poll\"\r\n :clear-history=\"clearHistory\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * SocketIOStream - Vue component for Socket.IO streaming\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useSocketIO } from \"../composables/useSocketIO\";\r\nimport type { SocketIOConfig } from \"../types\";\r\n\r\nexport interface SocketIOStreamProps {\r\n /** Socket.IO configuration */\r\n config: SocketIOConfig;\r\n /** Auto-connect on mount */\r\n autoConnect?: boolean;\r\n /** Events to listen for */\r\n events?: string[];\r\n}\r\n\r\nconst props = withDefaults(defineProps<SocketIOStreamProps>(), {\r\n autoConnect: true,\r\n events: () => [],\r\n});\r\n\r\nconst emit = defineEmits<{\r\n connect: [socketId: string];\r\n disconnect: [reason: string];\r\n error: [error: Error];\r\n event: [eventName: string, data: unknown];\r\n reconnecting: [attempt: number];\r\n reconnected: [];\r\n reconnectFailed: [];\r\n}>();\r\n\r\nconst { config } = toRefs(props);\r\n\r\nconst {\r\n isConnected,\r\n connectionState,\r\n socketId,\r\n rooms,\r\n error,\r\n connect,\r\n disconnect,\r\n emit: socketEmit,\r\n on,\r\n off,\r\n join,\r\n leave,\r\n} = useSocketIO(props.config, {\r\n onConnect: (id) => emit(\"connect\", id),\r\n onDisconnect: (reason) => emit(\"disconnect\", reason),\r\n onError: (err) => emit(\"error\", err),\r\n onReconnecting: (attempt) => emit(\"reconnecting\", attempt),\r\n onReconnectFailed: () => emit(\"reconnectFailed\"),\r\n});\r\n\r\n// Setup event listeners from props\r\nprops.events.forEach((eventName) => {\r\n on(eventName, (data: unknown) => {\r\n emit(\"event\", eventName, data);\r\n });\r\n});\r\n\r\n// Watch for config URL changes\r\nwatch(\r\n () => config.value.url,\r\n () => {\r\n disconnect();\r\n connect();\r\n },\r\n);\r\n\r\ndefineExpose({\r\n isConnected,\r\n connectionState,\r\n socketId,\r\n rooms,\r\n error,\r\n connect,\r\n disconnect,\r\n emit: socketEmit,\r\n on,\r\n off,\r\n join,\r\n leave,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-connected=\"isConnected\"\r\n :connection-state=\"connectionState\"\r\n :socket-id=\"socketId\"\r\n :rooms=\"rooms\"\r\n :error=\"error\"\r\n :connect=\"connect\"\r\n :disconnect=\"disconnect\"\r\n :emit=\"socketEmit\"\r\n :on=\"on\"\r\n :off=\"off\"\r\n :join=\"join\"\r\n :leave=\"leave\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * SSEStream - Vue component for Server-Sent Events streaming\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useSSE } from \"../composables/useSSE\";\r\n\r\nexport interface SSEStreamProps {\r\n /** SSE endpoint URL */\r\n url: string;\r\n /** Enable credentials (cookies) */\r\n withCredentials?: boolean;\r\n /** Auto-connect on mount */\r\n autoConnect?: boolean;\r\n /** Auto-reconnect on error */\r\n autoReconnect?: boolean;\r\n /** Max reconnection attempts */\r\n maxReconnectAttempts?: number;\r\n /** Reconnection delay in ms */\r\n reconnectDelay?: number;\r\n /** Event types to listen for */\r\n eventTypes?: string[];\r\n}\r\n\r\nconst props = withDefaults(defineProps<SSEStreamProps>(), {\r\n withCredentials: false,\r\n autoConnect: true,\r\n autoReconnect: true,\r\n maxReconnectAttempts: 5,\r\n reconnectDelay: 1000,\r\n eventTypes: () => [\"message\"],\r\n});\r\n\r\nconst emit = defineEmits<{\r\n open: [];\r\n error: [error: Event];\r\n message: [data: unknown, event: MessageEvent];\r\n event: [eventType: string, data: unknown, event: MessageEvent];\r\n reconnecting: [attempt: number, maxAttempts: number];\r\n reconnected: [];\r\n reconnectFailed: [];\r\n}>();\r\n\r\nconst { url } = toRefs(props);\r\n\r\nconst {\r\n isConnected,\r\n connectionState,\r\n lastMessage,\r\n lastEventType,\r\n lastEventId,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n addEventListener,\r\n removeEventListener,\r\n} = useSSE(\r\n {\r\n url: props.url,\r\n withCredentials: props.withCredentials,\r\n autoConnect: props.autoConnect,\r\n autoReconnect: props.autoReconnect,\r\n maxReconnectAttempts: props.maxReconnectAttempts,\r\n reconnectDelay: props.reconnectDelay,\r\n eventTypes: props.eventTypes,\r\n },\r\n {\r\n onOpen: () => emit(\"open\"),\r\n onError: (err) => emit(\"error\", err),\r\n onMessage: (data, event) => emit(\"message\", data, event),\r\n onEvent: (type, data, event) => emit(\"event\", type, data, event),\r\n onReconnecting: (attempt, max) => emit(\"reconnecting\", attempt, max),\r\n onReconnected: () => emit(\"reconnected\"),\r\n onReconnectFailed: () => emit(\"reconnectFailed\"),\r\n },\r\n);\r\n\r\n// Watch for URL changes\r\nwatch(url, () => {\r\n disconnect();\r\n connect();\r\n});\r\n\r\ndefineExpose({\r\n isConnected,\r\n connectionState,\r\n lastMessage,\r\n lastEventType,\r\n lastEventId,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n addEventListener,\r\n removeEventListener,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-connected=\"isConnected\"\r\n :connection-state=\"connectionState\"\r\n :last-message=\"lastMessage\"\r\n :last-event-type=\"lastEventType\"\r\n :last-event-id=\"lastEventId\"\r\n :error=\"error\"\r\n :reconnect-attempts=\"reconnectAttempts\"\r\n :connect=\"connect\"\r\n :disconnect=\"disconnect\"\r\n :add-event-listener=\"addEventListener\"\r\n :remove-event-listener=\"removeEventListener\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * WebSocketStream - Vue component for WebSocket streaming\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useWebSocket } from \"../composables/useWebSocket\";\r\nimport type { WebSocketConfig } from \"../types\";\r\n\r\nexport interface WebSocketStreamProps {\r\n /** WebSocket configuration */\r\n config: WebSocketConfig;\r\n /** Auto-connect on mount */\r\n autoConnect?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<WebSocketStreamProps>(), {\r\n autoConnect: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n open: [];\r\n close: [code: number, reason: string];\r\n error: [error: Event];\r\n message: [data: unknown, event: MessageEvent];\r\n reconnecting: [attempt: number, maxAttempts: number];\r\n reconnected: [];\r\n reconnectFailed: [];\r\n}>();\r\n\r\nconst { config } = toRefs(props);\r\n\r\nconst {\r\n isConnected,\r\n connectionState,\r\n lastMessage,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n send,\r\n sendJSON,\r\n} = useWebSocket(props.config, {\r\n onOpen: () => emit(\"open\"),\r\n onClose: (code, reason) => emit(\"close\", code, reason),\r\n onError: (err) => emit(\"error\", err),\r\n onMessage: (data, event) => emit(\"message\", data, event),\r\n onReconnecting: (attempt, max) => emit(\"reconnecting\", attempt, max),\r\n onReconnected: () => emit(\"reconnected\"),\r\n onReconnectFailed: () => emit(\"reconnectFailed\"),\r\n});\r\n\r\n// Watch for URL changes\r\nwatch(\r\n () => config.value.url,\r\n () => {\r\n disconnect();\r\n connect();\r\n },\r\n);\r\n\r\ndefineExpose({\r\n isConnected,\r\n connectionState,\r\n lastMessage,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n send,\r\n sendJSON,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-connected=\"isConnected\"\r\n :connection-state=\"connectionState\"\r\n :last-message=\"lastMessage\"\r\n :error=\"error\"\r\n :reconnect-attempts=\"reconnectAttempts\"\r\n :connect=\"connect\"\r\n :disconnect=\"disconnect\"\r\n :send=\"send\"\r\n :send-json=\"sendJSON\"\r\n />\r\n</template>\r\n"],"names":["props","__props","emit","__emit","videoRef","ref","hlsConfig","hlsCallbacks","levels","level","error","state","isPlaying","isBuffering","currentLevel","autoLevelEnabled","currentTime","duration","buffered","volume","isMuted","stats","isSupported","attach","play","pause","stop","seek","setLevel","setVolume","toggleMute","destroy","useHLS","watch","newState","time","formatTime","seconds","mins","secs","currentLevelInfo","computed","onMounted","err","newSrc","__expose","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","videoClass","controls","muted","loop","poster","_unref","_hoisted_4","_cache","_hoisted_5","_hoisted_6","_toDisplayString","_hoisted_7","_hoisted_8","$event","_Fragment","_renderList","_hoisted_10","_hoisted_11","_hoisted_12","containerRef","isLoading","THREE","scene","camera","renderer","pointsObject","animationId","initScene","OrbitControls","container","width","height","grid","axes","w","h","animate","e","updatePointCloud","geometry","positions","colors","i","point","color","material","center","size","cleanup","value","onUnmounted","_hoisted_3","logs","idCounter","formatData","data","detectType","addLog","type","entry","scrollToBottom","clear","togglePause","formatTimestamp","date","newData","l","_normalizeClass","paused","log","showTimestamps","statusMessage","config","callbacks","status","frame","boxes","isRunning","connectionState","dataChannels","lastPointCloudFrame","lastDetectionFrame","lastBoundingBoxes","start","sendControl","useWebRTC","_a","_b","stateColor","showStatus","args","_renderSlot","_ctx","_hoisted_9","showStats","_hoisted_13","_hoisted_15","toRefs","buffer","bufferSize","isStreaming","itemsPerSecond","totalItems","push","getBuffer","subscribe","useDataStream","batch","url","isConnected","lastChunk","chunks","bytesReceived","reconnectAttempts","connect","disconnect","clearChunks","useHTTPStream","raw","bytes","attempt","max","channelRef","channels","subscribePublic","privateChannel","presenceChannel","leave","leaveAll","useLaravelEcho","socketId","currentChannelWrapper","setupChannel","presenceWrapper","members","member","eventName","newChannel","oldChannel","isPolling","lastData","dataHistory","requestCount","restartAttempts","poll","clearHistory","useLongPolling","rooms","socketEmit","on","off","join","useSocketIO","id","reason","lastMessage","lastEventType","lastEventId","addEventListener","removeEventListener","useSSE","event","send","sendJSON","useWebSocket","code"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";var I=Object.create;var T=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var W=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var q=(_,h,b,t)=>{if(h&&typeof h=="object"||typeof h=="function")for(let n of O(h))!U.call(_,n)&&n!==b&&T(_,n,{get:()=>h[n],enumerable:!(t=j(h,n))||t.enumerable});return _};var F=(_,h,b)=>(b=_!=null?I(W(_)):{},q(h||!_||!_.__esModule?T(b,"default",{value:_,enumerable:!0}):b,_));const e=require("vue"),V=require("./useWebSocket-7-qar6to.cjs"),G={class:"hls-player"},J={class:"hls-player__video-container"},Q=["controls","muted","loop","poster"],K={key:0,class:"hls-player__overlay"},X={key:1,class:"hls-player__overlay hls-player__overlay--error"},Y={class:"hls-player__error"},Z={key:0,class:"hls-player__controls"},ee={class:"hls-player__quality"},te=["value"],ne=["value"],oe={class:"hls-player__stats"},re={key:0},ae=e.defineComponent({__name:"HLSPlayer",props:{src:{},autoPlay:{type:Boolean,default:!0},controls:{type:Boolean,default:!0},muted:{type:Boolean,default:!1},loop:{type:Boolean,default:!1},poster:{},lowLatency:{type:Boolean,default:!1},startLevel:{default:-1},videoClass:{}},emits:["ready","play","pause","ended","error","levelChange","timeUpdate","stateChange"],setup(_,{expose:h,emit:b}){const t=_,n=b,v=e.ref(null),y={url:t.src,autoPlay:t.autoPlay,lowLatencyMode:t.lowLatency,startLevel:t.startLevel},C={onManifestLoaded:w=>{n("ready")},onLevelSwitched:w=>{n("levelChange",w)},onPlaybackStarted:()=>{n("play")},onPlaybackEnded:()=>{n("ended")},onError:w=>{n("error",w)}},{state:l,isPlaying:u,isBuffering:f,levels:a,currentLevel:c,autoLevelEnabled:d,currentTime:p,duration:i,buffered:o,volume:r,muted:s,stats:k,error:m,isSupported:g,attach:E,play:P,pause:S,stop:B,seek:x,setLevel:A,setVolume:z,toggleMute:M,destroy:H}=V.useHLS(y,C);e.watch(l,w=>{n("stateChange",w)}),e.watch(p,w=>{n("timeUpdate",w)});function L(w){if(!isFinite(w))return"0:00";const R=Math.floor(w/60),N=Math.floor(w%60);return`${R}:${N.toString().padStart(2,"0")}`}const D=e.computed(()=>c.value<0||c.value>=a.value.length?null:a.value[c.value]);return e.onMounted(async()=>{if(v.value)try{await E(v.value)}catch(w){console.error("[HLSPlayer] Failed to attach:",w)}}),e.watch(()=>t.src,async w=>{v.value&&w&&(H(),y.url=w,await E(v.value))}),h({play:P,pause:S,stop:B,seek:x,setLevel:A,setVolume:z,toggleMute:M,state:l,levels:a,currentLevel:c,stats:k}),(w,R)=>(e.openBlock(),e.createElementBlock("div",G,[e.createElementVNode("div",J,[e.createElementVNode("video",{ref_key:"videoRef",ref:v,class:e.normalizeClass(["hls-player__video",w.videoClass]),controls:w.controls,muted:w.muted,loop:w.loop,poster:w.poster,playsinline:""},null,10,Q),e.unref(f)?(e.openBlock(),e.createElementBlock("div",K,[...R[1]||(R[1]=[e.createElementVNode("div",{class:"hls-player__spinner"},null,-1)])])):e.createCommentVNode("",!0),e.unref(m)?(e.openBlock(),e.createElementBlock("div",X,[e.createElementVNode("div",Y,[e.createElementVNode("span",null,"⚠️ "+e.toDisplayString(e.unref(m).message),1)])])):e.createCommentVNode("",!0)]),e.unref(a).length>1?(e.openBlock(),e.createElementBlock("div",Z,[e.createElementVNode("div",ee,[R[3]||(R[3]=e.createElementVNode("label",null,"Quality:",-1)),e.createElementVNode("select",{value:e.unref(c),onChange:R[0]||(R[0]=N=>e.unref(A)(Number(N.target.value)))},[R[2]||(R[2]=e.createElementVNode("option",{value:-1},"Auto",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(a),N=>(e.openBlock(),e.createElementBlock("option",{key:N.index,value:N.index},e.toDisplayString(N.height)+"p ("+e.toDisplayString(Math.round(N.bitrate/1e3))+"kbps) ",9,ne))),128))],40,te)]),e.createElementVNode("div",oe,[D.value?(e.openBlock(),e.createElementBlock("span",re,e.toDisplayString(D.value.width)+"x"+e.toDisplayString(D.value.height),1)):e.createCommentVNode("",!0),e.createElementVNode("span",null,e.toDisplayString(Math.round(e.unref(k).bandwidth/1e6*10)/10)+" Mbps",1),e.createElementVNode("span",null,e.toDisplayString(L(e.unref(p)))+" / "+e.toDisplayString(L(e.unref(i))),1)])])):e.createCommentVNode("",!0)]))}}),$=(_,h)=>{const b=_.__vccOpts||_;for(const[t,n]of h)b[t]=n;return b},se=$(ae,[["__scopeId","data-v-b04c54da"]]),le={class:"pointcloud-viewer"},ce={key:0,class:"pointcloud-viewer__overlay"},ie={key:1,class:"pointcloud-viewer__overlay pointcloud-viewer__overlay--error"},ue={class:"pointcloud-viewer__stats"},de={key:0},pe=e.defineComponent({__name:"PointCloudViewer",props:{points:{},pointSize:{default:.02},pointColor:{default:65280},usePointColors:{type:Boolean,default:!0},cameraPosition:{default:()=>({x:5,y:5,z:5})},autoRotate:{type:Boolean,default:!1},autoRotateSpeed:{default:1},backgroundColor:{default:1973790},showAxes:{type:Boolean,default:!1},showGrid:{type:Boolean,default:!0},bounds:{}},emits:["ready","click","error"],setup(_,{expose:h,emit:b}){const t=_,n=b,v=e.ref(null),y=e.ref(!0),C=e.ref(null);let l=null,u=null,f=null,a=null,c=null,d=null,p=null;async function i(){if(v.value)try{l=await import("three");const{OrbitControls:m}=await import("three/examples/jsm/controls/OrbitControls.js"),g=v.value,E=g.clientWidth,P=g.clientHeight;if(u=new l.Scene,u.background=new l.Color(t.backgroundColor),f=new l.PerspectiveCamera(75,E/P,.1,1e3),f.position.set(t.cameraPosition.x,t.cameraPosition.y,t.cameraPosition.z),a=new l.WebGLRenderer({antialias:!0}),a.setSize(E,P),a.setPixelRatio(window.devicePixelRatio),g.appendChild(a.domElement),c=new m(f,a.domElement),c.autoRotate=t.autoRotate,c.autoRotateSpeed=t.autoRotateSpeed,t.showGrid){const B=new l.GridHelper(10,10,4473924,3355443);u.add(B)}if(t.showAxes){const B=new l.AxesHelper(5);u.add(B)}new ResizeObserver(()=>{if(!f||!a||!v.value)return;const B=v.value.clientWidth,x=v.value.clientHeight;f.aspect=B/x,f.updateProjectionMatrix(),a.setSize(B,x)}).observe(g),r(),y.value=!1,n("ready")}catch(m){const g=m instanceof Error?m:new Error(String(m));C.value=g,n("error",g),console.error("[PointCloudViewer] Failed to initialize:",m)}}function o(){if(!l||!u||(d&&(u.remove(d),d.geometry.dispose(),d.material.dispose(),d=null),t.points.length===0))return;const m=new l.BufferGeometry,g=new Float32Array(t.points.length*3),E=new Float32Array(t.points.length*3);for(let S=0;S<t.points.length;S++){const B=t.points[S];if(g[S*3]=B.x,g[S*3+1]=B.y,g[S*3+2]=B.z,t.usePointColors&&B.r!==void 0)E[S*3]=B.r,E[S*3+1]=B.g??0,E[S*3+2]=B.b??0;else{const x=new l.Color(t.pointColor);E[S*3]=x.r,E[S*3+1]=x.g,E[S*3+2]=x.b}}m.setAttribute("position",new l.BufferAttribute(g,3)),m.setAttribute("color",new l.BufferAttribute(E,3));const P=new l.PointsMaterial({size:t.pointSize,vertexColors:!0,sizeAttenuation:!0});if(d=new l.Points(m,P),u.add(d),t.bounds&&f){const S={x:(t.bounds.min.x+t.bounds.max.x)/2,y:(t.bounds.min.y+t.bounds.max.y)/2,z:(t.bounds.min.z+t.bounds.max.z)/2},B=Math.max(t.bounds.max.x-t.bounds.min.x,t.bounds.max.y-t.bounds.min.y,t.bounds.max.z-t.bounds.min.z);f.position.set(S.x+B*1.5,S.y+B*1.5,S.z+B*1.5),f.lookAt(S.x,S.y,S.z)}}function r(){p=requestAnimationFrame(r),c&&c.update(),a&&u&&f&&a.render(u,f)}function s(){p&&(cancelAnimationFrame(p),p=null),d&&u&&(u.remove(d),d.geometry.dispose(),d.material.dispose()),c&&c.dispose(),a&&(a.dispose(),v.value&&a.domElement.parentNode&&v.value.removeChild(a.domElement)),u=null,f=null,a=null,c=null,d=null}e.watch(()=>t.points,o,{deep:!0}),e.watch([()=>t.pointSize,()=>t.pointColor,()=>t.usePointColors],o),e.watch(()=>t.autoRotate,m=>{c&&(c.autoRotate=m)}),e.watch(()=>t.autoRotateSpeed,m=>{c&&(c.autoRotateSpeed=m)}),e.onMounted(()=>{i()}),e.onUnmounted(()=>{s()});const k=e.computed(()=>({pointCount:t.points.length,hasColors:t.points.length>0&&t.points[0].r!==void 0}));return h({updatePointCloud:o,stats:k}),(m,g)=>(e.openBlock(),e.createElementBlock("div",le,[e.createElementVNode("div",{ref_key:"containerRef",ref:v,class:"pointcloud-viewer__canvas"},null,512),y.value?(e.openBlock(),e.createElementBlock("div",ce,[...g[0]||(g[0]=[e.createElementVNode("div",{class:"pointcloud-viewer__spinner"},null,-1),e.createElementVNode("span",null,"Loading viewer...",-1)])])):e.createCommentVNode("",!0),C.value?(e.openBlock(),e.createElementBlock("div",ie,[e.createElementVNode("span",null,"⚠️ "+e.toDisplayString(C.value.message),1),g[1]||(g[1]=e.createElementVNode("small",null,"Make sure 'three' package is installed",-1))])):e.createCommentVNode("",!0),e.createElementVNode("div",ue,[e.createElementVNode("span",null,"Points: "+e.toDisplayString(k.value.pointCount.toLocaleString()),1),k.value.hasColors?(e.openBlock(),e.createElementBlock("span",de,"🎨 Colored")):e.createCommentVNode("",!0)])]))}}),me=$(pe,[["__scopeId","data-v-7f487135"]]),fe={class:"stream-viewer"},ve={class:"stream-viewer__header"},_e={class:"stream-viewer__stats"},ye={key:0,class:"stream-viewer__errors"},he={class:"stream-viewer__actions"},ge={key:0,class:"stream-viewer__timestamp"},be={class:"stream-viewer__data"},Ce={key:0,class:"stream-viewer__empty"},we=e.defineComponent({__name:"StreamViewer",props:{data:{},type:{default:"auto"},maxLines:{default:100},autoScroll:{type:Boolean,default:!0},showTimestamps:{type:Boolean,default:!0},paused:{type:Boolean,default:!1},formatter:{}},emits:["clear","pause"],setup(_,{expose:h,emit:b}){const t=_,n=b,v=e.ref([]),y=e.ref(null);let C=0;function l(o){if(t.formatter)return t.formatter(o);if(o==null)return String(o);switch(t.type==="auto"?u(o):t.type){case"json":try{return JSON.stringify(o,null,2)}catch{return String(o)}case"binary":return o instanceof ArrayBuffer?`Binary: ${new Uint8Array(o).length} bytes`:String(o);default:return String(o)}}function u(o){return o instanceof ArrayBuffer||o instanceof Uint8Array?"binary":typeof o=="object"?"json":"text"}function f(o,r="data"){if(t.paused)return;const s={id:C++,timestamp:new Date,data:l(o),type:r};v.value=[...v.value,s].slice(-t.maxLines),t.autoScroll&&a()}function a(){requestAnimationFrame(()=>{y.value&&(y.value.scrollTop=y.value.scrollHeight)})}function c(){v.value=[],n("clear")}function d(){n("pause",!t.paused)}function p(o){return o.toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3})}e.watch(()=>t.data,o=>{o!==void 0&&f(o)});const i=e.computed(()=>({total:v.value.length,errors:v.value.filter(o=>o.type==="error").length}));return h({addLog:f,clear:c,logs:v,stats:i}),(o,r)=>(e.openBlock(),e.createElementBlock("div",fe,[e.createElementVNode("div",ve,[e.createElementVNode("div",_e,[e.createElementVNode("span",null,"Lines: "+e.toDisplayString(i.value.total),1),i.value.errors>0?(e.openBlock(),e.createElementBlock("span",ye," Errors: "+e.toDisplayString(i.value.errors),1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",he,[e.createElementVNode("button",{onClick:d,class:e.normalizeClass(["stream-viewer__btn",{"stream-viewer__btn--active":o.paused}])},e.toDisplayString(o.paused?"▶ Resume":"⏸ Pause"),3),e.createElementVNode("button",{onClick:c,class:"stream-viewer__btn"},"🗑 Clear")])]),e.createElementVNode("div",{ref_key:"containerRef",ref:y,class:"stream-viewer__content"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(v.value,s=>(e.openBlock(),e.createElementBlock("div",{key:s.id,class:e.normalizeClass(["stream-viewer__entry",`stream-viewer__entry--${s.type}`])},[o.showTimestamps?(e.openBlock(),e.createElementBlock("span",ge,e.toDisplayString(p(s.timestamp)),1)):e.createCommentVNode("",!0),e.createElementVNode("pre",be,e.toDisplayString(s.data),1)],2))),128)),v.value.length===0?(e.openBlock(),e.createElementBlock("div",Ce," Waiting for data... ")):e.createCommentVNode("",!0)],512)]))}}),Se=$(we,[["__scopeId","data-v-06dc8d20"]]),ke={class:"webrtc-viewer"},Be={key:0,class:"webrtc-viewer__header"},Ee={class:"webrtc-viewer__status"},Re={class:"webrtc-viewer__controls"},Ve={class:"webrtc-viewer__content"},xe={class:"webrtc-viewer__default"},Ne={key:0,class:"webrtc-viewer__placeholder"},Pe={key:1,class:"webrtc-viewer__loading"},$e={key:2,class:"webrtc-viewer__error"},De={key:3,class:"webrtc-viewer__info"},Ae={key:0},Le={key:1},Te={key:1,class:"webrtc-viewer__footer"},Fe={key:0},ze={key:1},Me=e.defineComponent({__name:"WebRTCViewer",props:{signalingUrl:{},iceServers:{default:()=>[{urls:"stun:stun.l.google.com:19302"}]},enablePointCloud:{type:Boolean,default:!0},enableDetections:{type:Boolean,default:!0},autoConnect:{type:Boolean,default:!0},autoReconnect:{type:Boolean,default:!0},maxReconnectAttempts:{default:5},showStatus:{type:Boolean,default:!0},showStats:{type:Boolean,default:!0}},emits:["connected","disconnected","error","pointcloud","detections","boundingboxes","status"],setup(_,{expose:h,emit:b}){const t=_,n=b,v=e.ref("Idle"),y={signalingUrl:t.signalingUrl,iceServers:t.iceServers,enablePointCloud:t.enablePointCloud,enableDetections:t.enableDetections,autoReconnect:t.autoReconnect,maxReconnectAttempts:t.maxReconnectAttempts},C={onStatus:m=>{v.value=m,n("status",m)},onConnectionState:m=>{m==="connected"?n("connected"):(m==="disconnected"||m==="closed"||m==="failed")&&n("disconnected")},onPointCloudFrame:m=>{n("pointcloud",m)},onDetectionFrame:m=>{n("detections",m)},onBoundingBoxData:m=>{n("boundingboxes",m)},onError:m=>{n("error",m)}},{isRunning:l,connectionState:u,dataChannels:f,lastPointCloudFrame:a,lastDetectionFrame:c,lastBoundingBoxes:d,error:p,start:i,stop:o,sendControl:r}=V.useWebRTC(y,C),s=e.computed(()=>{var m,g;return{channels:f.value.size,pointCount:((m=a.value)==null?void 0:m.points.length)??0,detectionCount:((g=c.value)==null?void 0:g.detections.length)??0,bboxCount:d.value.length}}),k=e.computed(()=>{switch(u.value){case"connected":return"#4caf50";case"connecting":return"#ff9800";case"reconnecting":return"#ff9800";case"error":return"#f44336";default:return"#9e9e9e"}});return e.onMounted(()=>{t.autoConnect&&i()}),e.watch(()=>t.signalingUrl,()=>{l.value&&(o(),y.signalingUrl=t.signalingUrl,i())}),h({isRunning:l,connectionState:u,start:i,stop:o,sendControl:r,lastPointCloudFrame:a,lastDetectionFrame:c,lastBoundingBoxes:d,stats:s}),(m,g)=>(e.openBlock(),e.createElementBlock("div",ke,[m.showStatus?(e.openBlock(),e.createElementBlock("div",Be,[e.createElementVNode("div",Ee,[e.createElementVNode("span",{class:"webrtc-viewer__indicator",style:e.normalizeStyle({backgroundColor:k.value})},null,4),e.createElementVNode("span",null,e.toDisplayString(e.unref(u)),1)]),e.createElementVNode("div",Re,[e.unref(l)?(e.openBlock(),e.createElementBlock("button",{key:1,onClick:g[1]||(g[1]=(...E)=>e.unref(o)&&e.unref(o)(...E)),class:"webrtc-viewer__btn webrtc-viewer__btn--disconnect"}," ⏹ Disconnect ")):(e.openBlock(),e.createElementBlock("button",{key:0,onClick:g[0]||(g[0]=(...E)=>e.unref(i)&&e.unref(i)(...E)),class:"webrtc-viewer__btn webrtc-viewer__btn--connect"}," ▶ Connect "))])])):e.createCommentVNode("",!0),e.createElementVNode("div",Ve,[e.renderSlot(m.$slots,"default",{isRunning:e.unref(l),connectionState:e.unref(u),pointCloudFrame:e.unref(a),detectionFrame:e.unref(c),boundingBoxes:e.unref(d),error:e.unref(p),start:e.unref(i),stop:e.unref(o),sendControl:e.unref(r)},()=>[e.createElementVNode("div",xe,[e.unref(l)?e.unref(u)==="connecting"?(e.openBlock(),e.createElementBlock("div",Pe,[g[3]||(g[3]=e.createElementVNode("div",{class:"webrtc-viewer__spinner"},null,-1)),e.createElementVNode("span",null,e.toDisplayString(v.value),1)])):e.unref(p)?(e.openBlock(),e.createElementBlock("div",$e,[e.createElementVNode("span",null,"⚠️ "+e.toDisplayString(e.unref(p).message),1)])):(e.openBlock(),e.createElementBlock("div",De,[g[4]||(g[4]=e.createElementVNode("p",null,"WebRTC Connected",-1)),s.value.pointCount>0?(e.openBlock(),e.createElementBlock("p",Ae," Points: "+e.toDisplayString(s.value.pointCount.toLocaleString()),1)):e.createCommentVNode("",!0),s.value.bboxCount>0?(e.openBlock(),e.createElementBlock("p",Le," Bounding Boxes: "+e.toDisplayString(s.value.bboxCount),1)):e.createCommentVNode("",!0)])):(e.openBlock(),e.createElementBlock("div",Ne,[...g[2]||(g[2]=[e.createElementVNode("span",null,"Click Connect to start WebRTC stream",-1)])]))])],!0)]),m.showStats&&e.unref(l)?(e.openBlock(),e.createElementBlock("div",Te,[e.createElementVNode("span",null,"Channels: "+e.toDisplayString(s.value.channels),1),t.enablePointCloud?(e.openBlock(),e.createElementBlock("span",Fe," Points: "+e.toDisplayString(s.value.pointCount.toLocaleString()),1)):e.createCommentVNode("",!0),t.enableDetections?(e.openBlock(),e.createElementBlock("span",ze," Detections: "+e.toDisplayString(s.value.detectionCount),1)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)]))}}),He=$(Me,[["__scopeId","data-v-3f83a728"]]),Ie=e.defineComponent({__name:"DataStreamView",props:{config:{default:()=>({})},autoStart:{type:Boolean,default:!0}},emits:["data","batch","error"],setup(_,{expose:h,emit:b}){const t=_,n=b,{config:v}=e.toRefs(t),{data:y,buffer:C,bufferSize:l,isStreaming:u,itemsPerSecond:f,totalItems:a,error:c,start:d,stop:p,push:i,clear:o,getBuffer:r,subscribe:s}=V.useDataStream(t.config,{onData:k=>n("data",k),onBatch:k=>n("batch",k),onError:k=>n("error",k)});return e.watch(v,()=>{p(),d()},{deep:!0}),h({data:y,buffer:C,bufferSize:l,isStreaming:u,itemsPerSecond:f,totalItems:a,error:c,start:d,stop:p,push:i,clear:o,getBuffer:r,subscribe:s}),(k,m)=>e.renderSlot(k.$slots,"default",{data:e.unref(y),buffer:e.unref(C),bufferSize:e.unref(l),isStreaming:e.unref(u),itemsPerSecond:e.unref(f),totalItems:e.unref(a),error:e.unref(c),start:e.unref(d),stop:e.unref(p),push:e.unref(i),clear:e.unref(o)})}}),je=e.defineComponent({__name:"HTTPStream",props:{url:{},method:{default:"GET"},headers:{default:()=>({})},body:{default:void 0},credentials:{default:"same-origin"},autoConnect:{type:Boolean,default:!0},autoReconnect:{type:Boolean,default:!0},maxReconnectAttempts:{default:5},reconnectDelay:{default:1e3},ndjson:{type:Boolean,default:!0}},emits:["open","chunk","complete","error","progress","reconnecting","reconnected","reconnectFailed"],setup(_,{expose:h,emit:b}){const t=_,n=b,{url:v}=e.toRefs(t),{isConnected:y,isStreaming:C,connectionState:l,lastChunk:u,chunks:f,bytesReceived:a,error:c,reconnectAttempts:d,connect:p,disconnect:i,clearChunks:o}=V.useHTTPStream({url:t.url,method:t.method,headers:t.headers,body:t.body,credentials:t.credentials,autoConnect:t.autoConnect,autoReconnect:t.autoReconnect,maxReconnectAttempts:t.maxReconnectAttempts,reconnectDelay:t.reconnectDelay,ndjson:t.ndjson},{onOpen:()=>n("open"),onChunk:(r,s)=>n("chunk",r,s),onComplete:()=>n("complete"),onError:r=>n("error",r),onProgress:r=>n("progress",r),onReconnecting:(r,s)=>n("reconnecting",r,s),onReconnected:()=>n("reconnected"),onReconnectFailed:()=>n("reconnectFailed")});return e.watch(v,()=>{i(),p()}),h({isConnected:y,isStreaming:C,connectionState:l,lastChunk:u,chunks:f,bytesReceived:a,error:c,reconnectAttempts:d,connect:p,disconnect:i,clearChunks:o}),(r,s)=>e.renderSlot(r.$slots,"default",{isConnected:e.unref(y),isStreaming:e.unref(C),connectionState:e.unref(l),lastChunk:e.unref(u),chunks:e.unref(f),bytesReceived:e.unref(a),error:e.unref(c),reconnectAttempts:e.unref(d),connect:e.unref(p),disconnect:e.unref(i),clearChunks:e.unref(o)})}}),Oe=e.defineComponent({__name:"LaravelEchoStream",props:{config:{},channel:{default:void 0},channelType:{default:"public"},events:{default:()=>[]},autoSubscribe:{type:Boolean,default:!0}},emits:["connected","event","error","subscribed","unsubscribed","here","joining","leaving"],setup(_,{expose:h,emit:b}){const t=_,n=b,{channel:v}=e.toRefs(t),{isConnected:y,channels:C,channel:l,privateChannel:u,presenceChannel:f,leave:a,leaveAll:c,connect:d}=V.useLaravelEcho(t.config,{onConnected:o=>n("connected",o),onError:o=>n("error",o)});let p=null;function i(){if(t.channel){if(t.channelType==="private")p=u(t.channel);else if(t.channelType==="presence"){const o=f(t.channel);p=o,o.here(r=>n("here",r)),o.joining(r=>n("joining",r)),o.leaving(r=>n("leaving",r))}else p=l(t.channel);t.events.forEach(o=>{p==null||p.listen(o,r=>{n("event",o,r)})}),n("subscribed",t.channel)}}return e.onMounted(async()=>{await d(),t.autoSubscribe&&t.channel&&i()}),e.watch(v,(o,r)=>{r&&(a(r),n("unsubscribed",r)),o&&t.autoSubscribe&&i()}),h({isConnected:y,channels:C,subscribePublic:l,privateChannel:u,presenceChannel:f,leave:a,leaveAll:c,connect:d}),(o,r)=>e.renderSlot(o.$slots,"default",{isConnected:e.unref(y),channels:e.unref(C),subscribePublic:e.unref(l),privateChannel:e.unref(u),presenceChannel:e.unref(f),leave:e.unref(a),leaveAll:e.unref(c)})}}),We=e.defineComponent({__name:"LongPollingStream",props:{url:{},method:{default:"GET"},headers:{default:()=>({})},body:{default:void 0},credentials:{default:"same-origin"},interval:{default:0},timeout:{default:3e4},autoStart:{type:Boolean,default:!0},autoRestart:{type:Boolean,default:!0},maxRestartAttempts:{default:5},restartDelay:{default:1e3},includeTimestamp:{type:Boolean,default:!1},timestampParam:{default:"since"}},emits:["start","data","error","stop","restarting","restarted","restartFailed"],setup(_,{expose:h,emit:b}){const t=_,n=b,{url:v}=e.toRefs(t),{isPolling:y,connectionState:C,lastData:l,dataHistory:u,requestCount:f,error:a,restartAttempts:c,start:d,stop:p,poll:i,clearHistory:o}=V.useLongPolling({url:t.url,method:t.method,headers:t.headers,body:t.body,credentials:t.credentials,interval:t.interval,timeout:t.timeout,autoStart:t.autoStart,autoRestart:t.autoRestart,maxRestartAttempts:t.maxRestartAttempts,restartDelay:t.restartDelay,includeTimestamp:t.includeTimestamp,timestampParam:t.timestampParam},{onStart:()=>n("start"),onData:r=>n("data",r),onError:r=>n("error",r),onStop:()=>n("stop"),onRestarting:(r,s)=>n("restarting",r,s),onRestarted:()=>n("restarted"),onRestartFailed:()=>n("restartFailed")});return e.watch(v,()=>{p(),d()}),h({isPolling:y,connectionState:C,lastData:l,dataHistory:u,requestCount:f,error:a,restartAttempts:c,start:d,stop:p,poll:i,clearHistory:o}),(r,s)=>e.renderSlot(r.$slots,"default",{isPolling:e.unref(y),connectionState:e.unref(C),lastData:e.unref(l),dataHistory:e.unref(u),requestCount:e.unref(f),error:e.unref(a),restartAttempts:e.unref(c),start:e.unref(d),stop:e.unref(p),poll:e.unref(i),clearHistory:e.unref(o)})}}),Ue=e.defineComponent({__name:"SocketIOStream",props:{config:{},autoConnect:{type:Boolean,default:!0},events:{default:()=>[]}},emits:["connect","disconnect","error","event","reconnecting","reconnected","reconnectFailed"],setup(_,{expose:h,emit:b}){const t=_,n=b,{config:v}=e.toRefs(t),{isConnected:y,connectionState:C,socketId:l,rooms:u,error:f,connect:a,disconnect:c,emit:d,on:p,off:i,join:o,leave:r}=V.useSocketIO(t.config,{onConnect:s=>n("connect",s),onDisconnect:s=>n("disconnect",s),onError:s=>n("error",s),onReconnecting:s=>n("reconnecting",s),onReconnectFailed:()=>n("reconnectFailed")});return t.events.forEach(s=>{p(s,k=>{n("event",s,k)})}),e.watch(()=>v.value.url,()=>{c(),a()}),h({isConnected:y,connectionState:C,socketId:l,rooms:u,error:f,connect:a,disconnect:c,emit:d,on:p,off:i,join:o,leave:r}),(s,k)=>e.renderSlot(s.$slots,"default",{isConnected:e.unref(y),connectionState:e.unref(C),socketId:e.unref(l),rooms:e.unref(u),error:e.unref(f),connect:e.unref(a),disconnect:e.unref(c),emit:e.unref(d),on:e.unref(p),off:e.unref(i),join:e.unref(o),leave:e.unref(r)})}}),qe=e.defineComponent({__name:"SSEStream",props:{url:{},withCredentials:{type:Boolean,default:!1},autoConnect:{type:Boolean,default:!0},autoReconnect:{type:Boolean,default:!0},maxReconnectAttempts:{default:5},reconnectDelay:{default:1e3},eventTypes:{default:()=>["message"]}},emits:["open","error","message","event","reconnecting","reconnected","reconnectFailed"],setup(_,{expose:h,emit:b}){const t=_,n=b,{url:v}=e.toRefs(t),{isConnected:y,connectionState:C,lastMessage:l,lastEventType:u,lastEventId:f,error:a,reconnectAttempts:c,connect:d,disconnect:p,addEventListener:i,removeEventListener:o}=V.useSSE({url:t.url,withCredentials:t.withCredentials,autoConnect:t.autoConnect,autoReconnect:t.autoReconnect,maxReconnectAttempts:t.maxReconnectAttempts,reconnectDelay:t.reconnectDelay,eventTypes:t.eventTypes},{onOpen:()=>n("open"),onError:r=>n("error",r),onMessage:(r,s)=>n("message",r,s),onEvent:(r,s,k)=>n("event",r,s,k),onReconnecting:(r,s)=>n("reconnecting",r,s),onReconnected:()=>n("reconnected"),onReconnectFailed:()=>n("reconnectFailed")});return e.watch(v,()=>{p(),d()}),h({isConnected:y,connectionState:C,lastMessage:l,lastEventType:u,lastEventId:f,error:a,reconnectAttempts:c,connect:d,disconnect:p,addEventListener:i,removeEventListener:o}),(r,s)=>e.renderSlot(r.$slots,"default",{isConnected:e.unref(y),connectionState:e.unref(C),lastMessage:e.unref(l),lastEventType:e.unref(u),lastEventId:e.unref(f),error:e.unref(a),reconnectAttempts:e.unref(c),connect:e.unref(d),disconnect:e.unref(p),addEventListener:e.unref(i),removeEventListener:e.unref(o)})}}),Ge=e.defineComponent({__name:"WebSocketStream",props:{config:{},autoConnect:{type:Boolean,default:!0}},emits:["open","close","error","message","reconnecting","reconnected","reconnectFailed"],setup(_,{expose:h,emit:b}){const t=_,n=b,{config:v}=e.toRefs(t),{isConnected:y,connectionState:C,lastMessage:l,error:u,reconnectAttempts:f,connect:a,disconnect:c,send:d,sendJSON:p}=V.useWebSocket(t.config,{onOpen:()=>n("open"),onClose:(i,o)=>n("close",i,o),onError:i=>n("error",i),onMessage:(i,o)=>n("message",i,o),onReconnecting:(i,o)=>n("reconnecting",i,o),onReconnected:()=>n("reconnected"),onReconnectFailed:()=>n("reconnectFailed")});return e.watch(()=>v.value.url,()=>{c(),a()}),h({isConnected:y,connectionState:C,lastMessage:l,error:u,reconnectAttempts:f,connect:a,disconnect:c,send:d,sendJSON:p}),(i,o)=>e.renderSlot(i.$slots,"default",{isConnected:e.unref(y),connectionState:e.unref(C),lastMessage:e.unref(l),error:e.unref(u),reconnectAttempts:e.unref(f),connect:e.unref(a),disconnect:e.unref(c),send:e.unref(d),sendJson:e.unref(p)})}});exports.HLSPlayer=se;exports.PointCloudViewer=me;exports.StreamViewer=Se;exports.WebRTCViewer=He;exports._sfc_main=Ie;exports._sfc_main$1=je;exports._sfc_main$2=Oe;exports._sfc_main$3=We;exports._sfc_main$4=qe;exports._sfc_main$5=Ue;exports._sfc_main$6=Ge;
2
+ //# sourceMappingURL=WebSocketStream.vue_vue_type_script_setup_true_lang-EzMJEQkx.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketStream.vue_vue_type_script_setup_true_lang-EzMJEQkx.cjs","sources":["../src/components/HLSPlayer.vue","../src/components/PointCloudViewer.vue","../src/components/StreamViewer.vue","../src/components/WebRTCViewer.vue","../src/components/DataStreamView.vue","../src/components/HTTPStream.vue","../src/components/LaravelEchoStream.vue","../src/components/LongPollingStream.vue","../src/components/SocketIOStream.vue","../src/components/SSEStream.vue","../src/components/WebSocketStream.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\n/**\r\n * HLSPlayer - HLS video player component\r\n * Wrapper for useHLS composable with video controls\r\n */\r\nimport { computed, onMounted, ref, watch } from \"vue\";\r\nimport { useHLS, type HLSState } from \"../composables/useHLS\";\r\nimport type { HLSCallbacks, HLSConfig, HLSLevel } from \"../types\";\r\n\r\ninterface Props {\r\n /** HLS stream URL */\r\n src: string;\r\n /** Auto-play video */\r\n autoPlay?: boolean;\r\n /** Show native controls */\r\n controls?: boolean;\r\n /** Muted */\r\n muted?: boolean;\r\n /** Loop */\r\n loop?: boolean;\r\n /** Poster image */\r\n poster?: string;\r\n /** Low latency mode */\r\n lowLatency?: boolean;\r\n /** Start level (-1 for auto) */\r\n startLevel?: number;\r\n /** CSS class for video element */\r\n videoClass?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n autoPlay: true,\r\n controls: true,\r\n muted: false,\r\n loop: false,\r\n lowLatency: false,\r\n startLevel: -1,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: \"ready\"): void;\r\n (e: \"play\"): void;\r\n (e: \"pause\"): void;\r\n (e: \"ended\"): void;\r\n (e: \"error\", error: Error): void;\r\n (e: \"levelChange\", level: number): void;\r\n (e: \"timeUpdate\", time: number): void;\r\n (e: \"stateChange\", state: HLSState): void;\r\n}>();\r\n\r\nconst videoRef = ref<HTMLVideoElement | null>(null);\r\n\r\nconst hlsConfig: HLSConfig = {\r\n url: props.src,\r\n autoPlay: props.autoPlay,\r\n lowLatencyMode: props.lowLatency,\r\n startLevel: props.startLevel,\r\n};\r\n\r\nconst hlsCallbacks: HLSCallbacks = {\r\n onManifestLoaded: (levels) => {\r\n emit(\"ready\");\r\n },\r\n onLevelSwitched: (level) => {\r\n emit(\"levelChange\", level);\r\n },\r\n onPlaybackStarted: () => {\r\n emit(\"play\");\r\n },\r\n onPlaybackEnded: () => {\r\n emit(\"ended\");\r\n },\r\n onError: (error) => {\r\n emit(\"error\", error);\r\n },\r\n};\r\n\r\nconst {\r\n state,\r\n isPlaying,\r\n isBuffering,\r\n levels,\r\n currentLevel,\r\n autoLevelEnabled,\r\n currentTime,\r\n duration,\r\n buffered,\r\n volume,\r\n muted: isMuted,\r\n stats,\r\n error,\r\n isSupported,\r\n attach,\r\n play,\r\n pause,\r\n stop,\r\n seek,\r\n setLevel,\r\n setVolume,\r\n toggleMute,\r\n destroy,\r\n} = useHLS(hlsConfig, hlsCallbacks);\r\n\r\n// Watch state changes\r\nwatch(state, (newState) => {\r\n emit(\"stateChange\", newState);\r\n});\r\n\r\nwatch(currentTime, (time) => {\r\n emit(\"timeUpdate\", time);\r\n});\r\n\r\n// Format time\r\nfunction formatTime(seconds: number): string {\r\n if (!isFinite(seconds)) return \"0:00\";\r\n const mins = Math.floor(seconds / 60);\r\n const secs = Math.floor(seconds % 60);\r\n return `${mins}:${secs.toString().padStart(2, \"0\")}`;\r\n}\r\n\r\n// Current level info\r\nconst currentLevelInfo = computed<HLSLevel | null>(() => {\r\n if (currentLevel.value < 0 || currentLevel.value >= levels.value.length) {\r\n return null;\r\n }\r\n return levels.value[currentLevel.value];\r\n});\r\n\r\n// Initialize on mount\r\nonMounted(async () => {\r\n if (videoRef.value) {\r\n try {\r\n await attach(videoRef.value);\r\n } catch (err) {\r\n console.error(\"[HLSPlayer] Failed to attach:\", err);\r\n }\r\n }\r\n});\r\n\r\n// Watch for src changes\r\nwatch(\r\n () => props.src,\r\n async (newSrc) => {\r\n if (videoRef.value && newSrc) {\r\n destroy();\r\n hlsConfig.url = newSrc;\r\n await attach(videoRef.value);\r\n }\r\n },\r\n);\r\n\r\ndefineExpose({\r\n play,\r\n pause,\r\n stop,\r\n seek,\r\n setLevel,\r\n setVolume,\r\n toggleMute,\r\n state,\r\n levels,\r\n currentLevel,\r\n stats,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"hls-player\">\r\n <div class=\"hls-player__video-container\">\r\n <video\r\n ref=\"videoRef\"\r\n :class=\"['hls-player__video', videoClass]\"\r\n :controls=\"controls\"\r\n :muted=\"muted\"\r\n :loop=\"loop\"\r\n :poster=\"poster\"\r\n playsinline\r\n />\r\n\r\n <!-- Loading overlay -->\r\n <div v-if=\"isBuffering\" class=\"hls-player__overlay\">\r\n <div class=\"hls-player__spinner\" />\r\n </div>\r\n\r\n <!-- Error overlay -->\r\n <div v-if=\"error\" class=\"hls-player__overlay hls-player__overlay--error\">\r\n <div class=\"hls-player__error\">\r\n <span>⚠️ {{ error.message }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Quality selector -->\r\n <div v-if=\"levels.length > 1\" class=\"hls-player__controls\">\r\n <div class=\"hls-player__quality\">\r\n <label>Quality:</label>\r\n <select\r\n :value=\"currentLevel\"\r\n @change=\"setLevel(Number(($event.target as HTMLSelectElement).value))\"\r\n >\r\n <option :value=\"-1\">Auto</option>\r\n <option\r\n v-for=\"level in levels\"\r\n :key=\"level.index\"\r\n :value=\"level.index\"\r\n >\r\n {{ level.height }}p ({{ Math.round(level.bitrate / 1000) }}kbps)\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"hls-player__stats\">\r\n <span v-if=\"currentLevelInfo\">\r\n {{ currentLevelInfo.width }}x{{ currentLevelInfo.height }}\r\n </span>\r\n <span\r\n >{{ Math.round((stats.bandwidth / 1000000) * 10) / 10 }} Mbps</span\r\n >\r\n <span>{{ formatTime(currentTime) }} / {{ formatTime(duration) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.hls-player {\r\n display: flex;\r\n flex-direction: column;\r\n background: #000;\r\n border-radius: 4px;\r\n overflow: hidden;\r\n}\r\n\r\n.hls-player__video-container {\r\n position: relative;\r\n width: 100%;\r\n aspect-ratio: 16 / 9;\r\n}\r\n\r\n.hls-player__video {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n}\r\n\r\n.hls-player__overlay {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: rgba(0, 0, 0, 0.5);\r\n}\r\n\r\n.hls-player__overlay--error {\r\n background: rgba(0, 0, 0, 0.8);\r\n}\r\n\r\n.hls-player__spinner {\r\n width: 48px;\r\n height: 48px;\r\n border: 3px solid rgba(255, 255, 255, 0.3);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n.hls-player__error {\r\n color: #f48771;\r\n text-align: center;\r\n padding: 16px;\r\n}\r\n\r\n.hls-player__controls {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n background: #1e1e1e;\r\n color: #ccc;\r\n font-size: 12px;\r\n}\r\n\r\n.hls-player__quality {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.hls-player__quality select {\r\n padding: 4px 8px;\r\n background: #3c3c3c;\r\n border: none;\r\n border-radius: 3px;\r\n color: #ccc;\r\n cursor: pointer;\r\n}\r\n\r\n.hls-player__stats {\r\n display: flex;\r\n gap: 16px;\r\n color: #858585;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * PointCloudViewer - 3D Point Cloud visualization component\r\n * Uses Three.js for rendering (requires three as peer dependency)\r\n */\r\nimport { computed, onMounted, onUnmounted, ref, watch } from \"vue\";\r\nimport type { DecodedPointCloud, Point3D } from \"../types\";\r\n\r\ninterface Props {\r\n /** Point cloud data */\r\n points: Point3D[];\r\n /** Point size */\r\n pointSize?: number;\r\n /** Default point color (hex) */\r\n pointColor?: number;\r\n /** Use point colors if available */\r\n usePointColors?: boolean;\r\n /** Camera position */\r\n cameraPosition?: { x: number; y: number; z: number };\r\n /** Auto-rotate */\r\n autoRotate?: boolean;\r\n /** Auto-rotate speed */\r\n autoRotateSpeed?: number;\r\n /** Background color */\r\n backgroundColor?: number;\r\n /** Show axes helper */\r\n showAxes?: boolean;\r\n /** Show grid */\r\n showGrid?: boolean;\r\n /** Bounds for camera auto-fit */\r\n bounds?: DecodedPointCloud[\"bounds\"];\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n pointSize: 0.02,\r\n pointColor: 0x00ff00,\r\n usePointColors: true,\r\n cameraPosition: () => ({ x: 5, y: 5, z: 5 }),\r\n autoRotate: false,\r\n autoRotateSpeed: 1,\r\n backgroundColor: 0x1e1e1e,\r\n showAxes: false,\r\n showGrid: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: \"ready\"): void;\r\n (e: \"click\", point: Point3D | null, index: number): void;\r\n (e: \"error\", error: Error): void;\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst isLoading = ref(true);\r\nconst error = ref<Error | null>(null);\r\n\r\n// Three.js objects (loaded dynamically)\r\nlet THREE: typeof import(\"three\") | null = null;\r\nlet scene: InstanceType<typeof import(\"three\").Scene> | null = null;\r\nlet camera: InstanceType<typeof import(\"three\").PerspectiveCamera> | null =\r\n null;\r\nlet renderer: InstanceType<typeof import(\"three\").WebGLRenderer> | null = null;\r\nlet controls: {\r\n update: () => void;\r\n autoRotate: boolean;\r\n autoRotateSpeed: number;\r\n dispose: () => void;\r\n} | null = null;\r\nlet pointsObject: InstanceType<typeof import(\"three\").Points> | null = null;\r\nlet animationId: number | null = null;\r\n\r\n/**\r\n * Initialize Three.js scene\r\n */\r\nasync function initScene(): Promise<void> {\r\n if (!containerRef.value) return;\r\n\r\n try {\r\n // Dynamic import Three.js\r\n THREE = await import(\"three\");\r\n const { OrbitControls } =\r\n await import(\"three/examples/jsm/controls/OrbitControls.js\");\r\n\r\n const container = containerRef.value;\r\n const width = container.clientWidth;\r\n const height = container.clientHeight;\r\n\r\n // Scene\r\n scene = new THREE.Scene();\r\n scene.background = new THREE.Color(props.backgroundColor);\r\n\r\n // Camera\r\n camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);\r\n camera.position.set(\r\n props.cameraPosition.x,\r\n props.cameraPosition.y,\r\n props.cameraPosition.z,\r\n );\r\n\r\n // Renderer\r\n renderer = new THREE.WebGLRenderer({ antialias: true });\r\n renderer.setSize(width, height);\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n container.appendChild(renderer.domElement);\r\n\r\n // Controls\r\n controls = new OrbitControls(camera, renderer.domElement);\r\n controls.autoRotate = props.autoRotate;\r\n controls.autoRotateSpeed = props.autoRotateSpeed;\r\n\r\n // Grid\r\n if (props.showGrid) {\r\n const grid = new THREE.GridHelper(10, 10, 0x444444, 0x333333);\r\n scene.add(grid);\r\n }\r\n\r\n // Axes\r\n if (props.showAxes) {\r\n const axes = new THREE.AxesHelper(5);\r\n scene.add(axes);\r\n }\r\n\r\n // Handle resize\r\n const resizeObserver = new ResizeObserver(() => {\r\n if (!camera || !renderer || !containerRef.value) return;\r\n const w = containerRef.value.clientWidth;\r\n const h = containerRef.value.clientHeight;\r\n camera.aspect = w / h;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(w, h);\r\n });\r\n resizeObserver.observe(container);\r\n\r\n // Start animation loop\r\n animate();\r\n\r\n isLoading.value = false;\r\n emit(\"ready\");\r\n } catch (err) {\r\n const e = err instanceof Error ? err : new Error(String(err));\r\n error.value = e;\r\n emit(\"error\", e);\r\n console.error(\"[PointCloudViewer] Failed to initialize:\", err);\r\n }\r\n}\r\n\r\n/**\r\n * Update point cloud geometry\r\n */\r\nfunction updatePointCloud(): void {\r\n if (!THREE || !scene) return;\r\n\r\n // Remove existing points\r\n if (pointsObject) {\r\n scene.remove(pointsObject);\r\n pointsObject.geometry.dispose();\r\n (\r\n pointsObject.material as InstanceType<typeof THREE.PointsMaterial>\r\n ).dispose();\r\n pointsObject = null;\r\n }\r\n\r\n if (props.points.length === 0) return;\r\n\r\n // Create geometry\r\n const geometry = new THREE.BufferGeometry();\r\n const positions = new Float32Array(props.points.length * 3);\r\n const colors = new Float32Array(props.points.length * 3);\r\n let hasColors = false;\r\n\r\n for (let i = 0; i < props.points.length; i++) {\r\n const point = props.points[i];\r\n positions[i * 3] = point.x;\r\n positions[i * 3 + 1] = point.y;\r\n positions[i * 3 + 2] = point.z;\r\n\r\n if (props.usePointColors && point.r !== undefined) {\r\n hasColors = true;\r\n colors[i * 3] = point.r;\r\n colors[i * 3 + 1] = point.g ?? 0;\r\n colors[i * 3 + 2] = point.b ?? 0;\r\n } else {\r\n const color = new THREE.Color(props.pointColor);\r\n colors[i * 3] = color.r;\r\n colors[i * 3 + 1] = color.g;\r\n colors[i * 3 + 2] = color.b;\r\n }\r\n }\r\n\r\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\r\n geometry.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\r\n\r\n // Create material\r\n const material = new THREE.PointsMaterial({\r\n size: props.pointSize,\r\n vertexColors: true,\r\n sizeAttenuation: true,\r\n });\r\n\r\n // Create points\r\n pointsObject = new THREE.Points(geometry, material);\r\n scene.add(pointsObject);\r\n\r\n // Auto-fit camera if bounds provided\r\n if (props.bounds && camera) {\r\n const center = {\r\n x: (props.bounds.min.x + props.bounds.max.x) / 2,\r\n y: (props.bounds.min.y + props.bounds.max.y) / 2,\r\n z: (props.bounds.min.z + props.bounds.max.z) / 2,\r\n };\r\n\r\n const size = Math.max(\r\n props.bounds.max.x - props.bounds.min.x,\r\n props.bounds.max.y - props.bounds.min.y,\r\n props.bounds.max.z - props.bounds.min.z,\r\n );\r\n\r\n camera.position.set(\r\n center.x + size * 1.5,\r\n center.y + size * 1.5,\r\n center.z + size * 1.5,\r\n );\r\n camera.lookAt(center.x, center.y, center.z);\r\n }\r\n}\r\n\r\n/**\r\n * Animation loop\r\n */\r\nfunction animate(): void {\r\n animationId = requestAnimationFrame(animate);\r\n\r\n if (controls) {\r\n controls.update();\r\n }\r\n\r\n if (renderer && scene && camera) {\r\n renderer.render(scene, camera);\r\n }\r\n}\r\n\r\n/**\r\n * Cleanup\r\n */\r\nfunction cleanup(): void {\r\n if (animationId) {\r\n cancelAnimationFrame(animationId);\r\n animationId = null;\r\n }\r\n\r\n if (pointsObject && scene) {\r\n scene.remove(pointsObject);\r\n pointsObject.geometry.dispose();\r\n (\r\n pointsObject.material as InstanceType<\r\n typeof import(\"three\").PointsMaterial\r\n >\r\n ).dispose();\r\n }\r\n\r\n if (controls) {\r\n controls.dispose();\r\n }\r\n\r\n if (renderer) {\r\n renderer.dispose();\r\n if (containerRef.value && renderer.domElement.parentNode) {\r\n containerRef.value.removeChild(renderer.domElement);\r\n }\r\n }\r\n\r\n scene = null;\r\n camera = null;\r\n renderer = null;\r\n controls = null;\r\n pointsObject = null;\r\n}\r\n\r\n// Watch for points changes\r\nwatch(() => props.points, updatePointCloud, { deep: true });\r\n\r\n// Watch for config changes\r\nwatch(\r\n [() => props.pointSize, () => props.pointColor, () => props.usePointColors],\r\n updatePointCloud,\r\n);\r\n\r\nwatch(\r\n () => props.autoRotate,\r\n (value) => {\r\n if (controls) {\r\n controls.autoRotate = value;\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.autoRotateSpeed,\r\n (value) => {\r\n if (controls) {\r\n controls.autoRotateSpeed = value;\r\n }\r\n },\r\n);\r\n\r\nonMounted(() => {\r\n initScene();\r\n});\r\n\r\nonUnmounted(() => {\r\n cleanup();\r\n});\r\n\r\n// Stats\r\nconst stats = computed(() => ({\r\n pointCount: props.points.length,\r\n hasColors: props.points.length > 0 && props.points[0].r !== undefined,\r\n}));\r\n\r\ndefineExpose({\r\n updatePointCloud,\r\n stats,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"pointcloud-viewer\">\r\n <div ref=\"containerRef\" class=\"pointcloud-viewer__canvas\" />\r\n\r\n <!-- Loading -->\r\n <div v-if=\"isLoading\" class=\"pointcloud-viewer__overlay\">\r\n <div class=\"pointcloud-viewer__spinner\" />\r\n <span>Loading viewer...</span>\r\n </div>\r\n\r\n <!-- Error -->\r\n <div\r\n v-if=\"error\"\r\n class=\"pointcloud-viewer__overlay pointcloud-viewer__overlay--error\"\r\n >\r\n <span>⚠️ {{ error.message }}</span>\r\n <small>Make sure 'three' package is installed</small>\r\n </div>\r\n\r\n <!-- Stats -->\r\n <div class=\"pointcloud-viewer__stats\">\r\n <span>Points: {{ stats.pointCount.toLocaleString() }}</span>\r\n <span v-if=\"stats.hasColors\">🎨 Colored</span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.pointcloud-viewer {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n min-height: 300px;\r\n background: #1e1e1e;\r\n border-radius: 4px;\r\n overflow: hidden;\r\n}\r\n\r\n.pointcloud-viewer__canvas {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.pointcloud-viewer__overlay {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 12px;\r\n background: rgba(30, 30, 30, 0.9);\r\n color: #ccc;\r\n}\r\n\r\n.pointcloud-viewer__overlay--error {\r\n color: #f48771;\r\n}\r\n\r\n.pointcloud-viewer__overlay small {\r\n color: #858585;\r\n}\r\n\r\n.pointcloud-viewer__spinner {\r\n width: 32px;\r\n height: 32px;\r\n border: 3px solid rgba(255, 255, 255, 0.3);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n.pointcloud-viewer__stats {\r\n position: absolute;\r\n bottom: 8px;\r\n left: 8px;\r\n display: flex;\r\n gap: 12px;\r\n padding: 4px 8px;\r\n background: rgba(0, 0, 0, 0.6);\r\n border-radius: 3px;\r\n color: #ccc;\r\n font-size: 11px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * StreamViewer - Generic stream viewer component\r\n * Displays real-time data from various streaming sources\r\n */\r\nimport { computed, ref, watch } from \"vue\";\r\n\r\ninterface Props {\r\n /** Stream data to display */\r\n data?: unknown;\r\n /** Stream type for formatting */\r\n type?: \"json\" | \"text\" | \"binary\" | \"auto\";\r\n /** Maximum lines to display */\r\n maxLines?: number;\r\n /** Auto-scroll to bottom */\r\n autoScroll?: boolean;\r\n /** Show timestamps */\r\n showTimestamps?: boolean;\r\n /** Paused state */\r\n paused?: boolean;\r\n /** Custom formatter function */\r\n formatter?: (data: unknown) => string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: \"auto\",\r\n maxLines: 100,\r\n autoScroll: true,\r\n showTimestamps: true,\r\n paused: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: \"clear\"): void;\r\n (e: \"pause\", paused: boolean): void;\r\n}>();\r\n\r\ninterface LogEntry {\r\n id: number;\r\n timestamp: Date;\r\n data: string;\r\n type: \"data\" | \"error\" | \"info\";\r\n}\r\n\r\nconst logs = ref<LogEntry[]>([]);\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nlet idCounter = 0;\r\n\r\n/**\r\n * Format data based on type\r\n */\r\nfunction formatData(data: unknown): string {\r\n if (props.formatter) {\r\n return props.formatter(data);\r\n }\r\n\r\n if (data === null || data === undefined) {\r\n return String(data);\r\n }\r\n\r\n const type = props.type === \"auto\" ? detectType(data) : props.type;\r\n\r\n switch (type) {\r\n case \"json\":\r\n try {\r\n return JSON.stringify(data, null, 2);\r\n } catch {\r\n return String(data);\r\n }\r\n case \"binary\":\r\n if (data instanceof ArrayBuffer) {\r\n const bytes = new Uint8Array(data);\r\n return `Binary: ${bytes.length} bytes`;\r\n }\r\n return String(data);\r\n default:\r\n return String(data);\r\n }\r\n}\r\n\r\n/**\r\n * Detect data type\r\n */\r\nfunction detectType(data: unknown): \"json\" | \"text\" | \"binary\" {\r\n if (data instanceof ArrayBuffer || data instanceof Uint8Array) {\r\n return \"binary\";\r\n }\r\n if (typeof data === \"object\") {\r\n return \"json\";\r\n }\r\n return \"text\";\r\n}\r\n\r\n/**\r\n * Add log entry\r\n */\r\nfunction addLog(data: unknown, type: LogEntry[\"type\"] = \"data\"): void {\r\n if (props.paused) return;\r\n\r\n const entry: LogEntry = {\r\n id: idCounter++,\r\n timestamp: new Date(),\r\n data: formatData(data),\r\n type,\r\n };\r\n\r\n logs.value = [...logs.value, entry].slice(-props.maxLines);\r\n\r\n if (props.autoScroll) {\r\n scrollToBottom();\r\n }\r\n}\r\n\r\n/**\r\n * Scroll to bottom\r\n */\r\nfunction scrollToBottom(): void {\r\n requestAnimationFrame(() => {\r\n if (containerRef.value) {\r\n containerRef.value.scrollTop = containerRef.value.scrollHeight;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Clear logs\r\n */\r\nfunction clear(): void {\r\n logs.value = [];\r\n emit(\"clear\");\r\n}\r\n\r\n/**\r\n * Toggle pause\r\n */\r\nfunction togglePause(): void {\r\n emit(\"pause\", !props.paused);\r\n}\r\n\r\n/**\r\n * Format timestamp\r\n */\r\nfunction formatTimestamp(date: Date): string {\r\n return date.toLocaleTimeString(\"en-US\", {\r\n hour12: false,\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n fractionalSecondDigits: 3,\r\n });\r\n}\r\n\r\n// Watch for new data\r\nwatch(\r\n () => props.data,\r\n (newData) => {\r\n if (newData !== undefined) {\r\n addLog(newData);\r\n }\r\n },\r\n);\r\n\r\n// Computed stats\r\nconst stats = computed(() => ({\r\n total: logs.value.length,\r\n errors: logs.value.filter((l) => l.type === \"error\").length,\r\n}));\r\n\r\ndefineExpose({\r\n addLog,\r\n clear,\r\n logs,\r\n stats,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"stream-viewer\">\r\n <div class=\"stream-viewer__header\">\r\n <div class=\"stream-viewer__stats\">\r\n <span>Lines: {{ stats.total }}</span>\r\n <span v-if=\"stats.errors > 0\" class=\"stream-viewer__errors\">\r\n Errors: {{ stats.errors }}\r\n </span>\r\n </div>\r\n <div class=\"stream-viewer__actions\">\r\n <button\r\n @click=\"togglePause\"\r\n class=\"stream-viewer__btn\"\r\n :class=\"{ 'stream-viewer__btn--active': paused }\"\r\n >\r\n {{ paused ? \"▶ Resume\" : \"⏸ Pause\" }}\r\n </button>\r\n <button @click=\"clear\" class=\"stream-viewer__btn\">🗑 Clear</button>\r\n </div>\r\n </div>\r\n\r\n <div ref=\"containerRef\" class=\"stream-viewer__content\">\r\n <div\r\n v-for=\"log in logs\"\r\n :key=\"log.id\"\r\n class=\"stream-viewer__entry\"\r\n :class=\"`stream-viewer__entry--${log.type}`\"\r\n >\r\n <span v-if=\"showTimestamps\" class=\"stream-viewer__timestamp\">\r\n {{ formatTimestamp(log.timestamp) }}\r\n </span>\r\n <pre class=\"stream-viewer__data\">{{ log.data }}</pre>\r\n </div>\r\n\r\n <div v-if=\"logs.length === 0\" class=\"stream-viewer__empty\">\r\n Waiting for data...\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.stream-viewer {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n min-height: 200px;\r\n background: #1e1e1e;\r\n border-radius: 4px;\r\n overflow: hidden;\r\n font-family: \"Consolas\", \"Monaco\", monospace;\r\n font-size: 12px;\r\n}\r\n\r\n.stream-viewer__header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n background: #252526;\r\n border-bottom: 1px solid #3c3c3c;\r\n}\r\n\r\n.stream-viewer__stats {\r\n display: flex;\r\n gap: 16px;\r\n color: #858585;\r\n}\r\n\r\n.stream-viewer__errors {\r\n color: #f48771;\r\n}\r\n\r\n.stream-viewer__actions {\r\n display: flex;\r\n gap: 8px;\r\n}\r\n\r\n.stream-viewer__btn {\r\n padding: 4px 8px;\r\n background: #3c3c3c;\r\n border: none;\r\n border-radius: 3px;\r\n color: #cccccc;\r\n cursor: pointer;\r\n font-size: 11px;\r\n}\r\n\r\n.stream-viewer__btn:hover {\r\n background: #4c4c4c;\r\n}\r\n\r\n.stream-viewer__btn--active {\r\n background: #0e639c;\r\n}\r\n\r\n.stream-viewer__content {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 8px;\r\n}\r\n\r\n.stream-viewer__entry {\r\n display: flex;\r\n gap: 8px;\r\n padding: 2px 0;\r\n border-bottom: 1px solid #2d2d2d;\r\n}\r\n\r\n.stream-viewer__entry--error {\r\n background: rgba(244, 135, 113, 0.1);\r\n}\r\n\r\n.stream-viewer__entry--info {\r\n color: #4ec9b0;\r\n}\r\n\r\n.stream-viewer__timestamp {\r\n color: #858585;\r\n white-space: nowrap;\r\n}\r\n\r\n.stream-viewer__data {\r\n margin: 0;\r\n white-space: pre-wrap;\r\n word-break: break-all;\r\n color: #d4d4d4;\r\n}\r\n\r\n.stream-viewer__empty {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n color: #858585;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * WebRTCViewer - WebRTC stream viewer with point cloud and detection support\r\n * Combines video, point cloud, and bounding box visualization\r\n */\r\nimport { computed, onMounted, ref, watch } from \"vue\";\r\nimport { useWebRTC } from \"../composables/useWebRTC\";\r\nimport type {\r\n BoundingBox3D,\r\n DetectionFrame,\r\n PointCloudFrame,\r\n WebRTCCallbacks,\r\n WebRTCConfig,\r\n} from \"../types\";\r\n\r\ninterface Props {\r\n /** Signaling server URL */\r\n signalingUrl: string;\r\n /** ICE servers */\r\n iceServers?: RTCIceServer[];\r\n /** Enable point cloud */\r\n enablePointCloud?: boolean;\r\n /** Enable detections */\r\n enableDetections?: boolean;\r\n /** Auto-connect on mount */\r\n autoConnect?: boolean;\r\n /** Auto-reconnect */\r\n autoReconnect?: boolean;\r\n /** Max reconnect attempts */\r\n maxReconnectAttempts?: number;\r\n /** Show connection status */\r\n showStatus?: boolean;\r\n /** Show stats */\r\n showStats?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n iceServers: () => [{ urls: \"stun:stun.l.google.com:19302\" }],\r\n enablePointCloud: true,\r\n enableDetections: true,\r\n autoConnect: true,\r\n autoReconnect: true,\r\n maxReconnectAttempts: 5,\r\n showStatus: true,\r\n showStats: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: \"connected\"): void;\r\n (e: \"disconnected\"): void;\r\n (e: \"error\", error: Error): void;\r\n (e: \"pointcloud\", frame: PointCloudFrame): void;\r\n (e: \"detections\", frame: DetectionFrame): void;\r\n (e: \"boundingboxes\", boxes: BoundingBox3D[]): void;\r\n (e: \"status\", status: string): void;\r\n}>();\r\n\r\nconst statusMessage = ref(\"Idle\");\r\n\r\nconst config: WebRTCConfig = {\r\n signalingUrl: props.signalingUrl,\r\n iceServers: props.iceServers,\r\n enablePointCloud: props.enablePointCloud,\r\n enableDetections: props.enableDetections,\r\n autoReconnect: props.autoReconnect,\r\n maxReconnectAttempts: props.maxReconnectAttempts,\r\n};\r\n\r\nconst callbacks: WebRTCCallbacks = {\r\n onStatus: (status) => {\r\n statusMessage.value = status;\r\n emit(\"status\", status);\r\n },\r\n onConnectionState: (state) => {\r\n if (state === \"connected\") {\r\n emit(\"connected\");\r\n } else if (\r\n state === \"disconnected\" ||\r\n state === \"closed\" ||\r\n state === \"failed\"\r\n ) {\r\n emit(\"disconnected\");\r\n }\r\n },\r\n onPointCloudFrame: (frame) => {\r\n emit(\"pointcloud\", frame);\r\n },\r\n onDetectionFrame: (frame) => {\r\n emit(\"detections\", frame);\r\n },\r\n onBoundingBoxData: (boxes) => {\r\n emit(\"boundingboxes\", boxes);\r\n },\r\n onError: (error) => {\r\n emit(\"error\", error);\r\n },\r\n};\r\n\r\nconst {\r\n isRunning,\r\n connectionState,\r\n dataChannels,\r\n lastPointCloudFrame,\r\n lastDetectionFrame,\r\n lastBoundingBoxes,\r\n error,\r\n start,\r\n stop,\r\n sendControl,\r\n} = useWebRTC(config, callbacks);\r\n\r\n// Stats\r\nconst stats = computed(() => ({\r\n channels: dataChannels.value.size,\r\n pointCount: lastPointCloudFrame.value?.points.length ?? 0,\r\n detectionCount: lastDetectionFrame.value?.detections.length ?? 0,\r\n bboxCount: lastBoundingBoxes.value.length,\r\n}));\r\n\r\n// Connection state color\r\nconst stateColor = computed(() => {\r\n switch (connectionState.value) {\r\n case \"connected\":\r\n return \"#4caf50\";\r\n case \"connecting\":\r\n return \"#ff9800\";\r\n case \"reconnecting\":\r\n return \"#ff9800\";\r\n case \"error\":\r\n return \"#f44336\";\r\n default:\r\n return \"#9e9e9e\";\r\n }\r\n});\r\n\r\n// Auto-connect on mount\r\nonMounted(() => {\r\n if (props.autoConnect) {\r\n start();\r\n }\r\n});\r\n\r\n// Watch for signalingUrl changes\r\nwatch(\r\n () => props.signalingUrl,\r\n () => {\r\n if (isRunning.value) {\r\n stop();\r\n config.signalingUrl = props.signalingUrl;\r\n start();\r\n }\r\n },\r\n);\r\n\r\ndefineExpose({\r\n isRunning,\r\n connectionState,\r\n start,\r\n stop,\r\n sendControl,\r\n lastPointCloudFrame,\r\n lastDetectionFrame,\r\n lastBoundingBoxes,\r\n stats,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"webrtc-viewer\">\r\n <!-- Header -->\r\n <div v-if=\"showStatus\" class=\"webrtc-viewer__header\">\r\n <div class=\"webrtc-viewer__status\">\r\n <span\r\n class=\"webrtc-viewer__indicator\"\r\n :style=\"{ backgroundColor: stateColor }\"\r\n />\r\n <span>{{ connectionState }}</span>\r\n </div>\r\n\r\n <div class=\"webrtc-viewer__controls\">\r\n <button\r\n v-if=\"!isRunning\"\r\n @click=\"start\"\r\n class=\"webrtc-viewer__btn webrtc-viewer__btn--connect\"\r\n >\r\n ▶ Connect\r\n </button>\r\n <button\r\n v-else\r\n @click=\"stop\"\r\n class=\"webrtc-viewer__btn webrtc-viewer__btn--disconnect\"\r\n >\r\n ⏹ Disconnect\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Main content -->\r\n <div class=\"webrtc-viewer__content\">\r\n <slot\r\n :is-running=\"isRunning\"\r\n :connection-state=\"connectionState\"\r\n :point-cloud-frame=\"lastPointCloudFrame\"\r\n :detection-frame=\"lastDetectionFrame\"\r\n :bounding-boxes=\"lastBoundingBoxes\"\r\n :error=\"error\"\r\n :start=\"start\"\r\n :stop=\"stop\"\r\n :send-control=\"sendControl\"\r\n >\r\n <!-- Default content when no slot provided -->\r\n <div class=\"webrtc-viewer__default\">\r\n <div v-if=\"!isRunning\" class=\"webrtc-viewer__placeholder\">\r\n <span>Click Connect to start WebRTC stream</span>\r\n </div>\r\n\r\n <div\r\n v-else-if=\"connectionState === 'connecting'\"\r\n class=\"webrtc-viewer__loading\"\r\n >\r\n <div class=\"webrtc-viewer__spinner\" />\r\n <span>{{ statusMessage }}</span>\r\n </div>\r\n\r\n <div v-else-if=\"error\" class=\"webrtc-viewer__error\">\r\n <span>⚠️ {{ error.message }}</span>\r\n </div>\r\n\r\n <div v-else class=\"webrtc-viewer__info\">\r\n <p>WebRTC Connected</p>\r\n <p v-if=\"stats.pointCount > 0\">\r\n Points: {{ stats.pointCount.toLocaleString() }}\r\n </p>\r\n <p v-if=\"stats.bboxCount > 0\">\r\n Bounding Boxes: {{ stats.bboxCount }}\r\n </p>\r\n </div>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- Stats footer -->\r\n <div v-if=\"showStats && isRunning\" class=\"webrtc-viewer__footer\">\r\n <span>Channels: {{ stats.channels }}</span>\r\n <span v-if=\"props.enablePointCloud\">\r\n Points: {{ stats.pointCount.toLocaleString() }}\r\n </span>\r\n <span v-if=\"props.enableDetections\">\r\n Detections: {{ stats.detectionCount }}\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.webrtc-viewer {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n min-height: 200px;\r\n background: #1e1e1e;\r\n border-radius: 4px;\r\n overflow: hidden;\r\n}\r\n\r\n.webrtc-viewer__header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n background: #252526;\r\n border-bottom: 1px solid #3c3c3c;\r\n}\r\n\r\n.webrtc-viewer__status {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n color: #ccc;\r\n font-size: 12px;\r\n}\r\n\r\n.webrtc-viewer__indicator {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 50%;\r\n}\r\n\r\n.webrtc-viewer__controls {\r\n display: flex;\r\n gap: 8px;\r\n}\r\n\r\n.webrtc-viewer__btn {\r\n padding: 4px 12px;\r\n border: none;\r\n border-radius: 3px;\r\n font-size: 12px;\r\n cursor: pointer;\r\n}\r\n\r\n.webrtc-viewer__btn--connect {\r\n background: #0e639c;\r\n color: white;\r\n}\r\n\r\n.webrtc-viewer__btn--connect:hover {\r\n background: #1177bb;\r\n}\r\n\r\n.webrtc-viewer__btn--disconnect {\r\n background: #5a5a5a;\r\n color: white;\r\n}\r\n\r\n.webrtc-viewer__btn--disconnect:hover {\r\n background: #6a6a6a;\r\n}\r\n\r\n.webrtc-viewer__content {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 100px;\r\n}\r\n\r\n.webrtc-viewer__default {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 12px;\r\n color: #858585;\r\n text-align: center;\r\n padding: 24px;\r\n}\r\n\r\n.webrtc-viewer__placeholder,\r\n.webrtc-viewer__loading,\r\n.webrtc-viewer__info {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.webrtc-viewer__error {\r\n color: #f48771;\r\n}\r\n\r\n.webrtc-viewer__spinner {\r\n width: 32px;\r\n height: 32px;\r\n border: 3px solid rgba(255, 255, 255, 0.3);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n.webrtc-viewer__info p {\r\n margin: 4px 0;\r\n color: #ccc;\r\n}\r\n\r\n.webrtc-viewer__footer {\r\n display: flex;\r\n gap: 16px;\r\n padding: 6px 12px;\r\n background: #252526;\r\n border-top: 1px solid #3c3c3c;\r\n color: #858585;\r\n font-size: 11px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * DataStreamView - Vue component for generic data streaming\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useDataStream } from \"../composables/useDataStream\";\r\nimport type { DataStreamConfig } from \"../types\";\r\n\r\nexport interface DataStreamViewProps<T = unknown> {\r\n /** Data stream configuration */\r\n config?: DataStreamConfig<T>;\r\n /** Auto-start on mount */\r\n autoStart?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<DataStreamViewProps>(), {\r\n config: () => ({}),\r\n autoStart: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n data: [data: unknown];\r\n batch: [data: unknown[]];\r\n error: [error: Error];\r\n}>();\r\n\r\nconst { config } = toRefs(props);\r\n\r\nconst {\r\n data,\r\n buffer,\r\n bufferSize,\r\n isStreaming,\r\n itemsPerSecond,\r\n totalItems,\r\n error,\r\n start,\r\n stop,\r\n push,\r\n clear,\r\n getBuffer,\r\n subscribe,\r\n} = useDataStream(props.config, {\r\n onData: (data) => emit(\"data\", data),\r\n onBatch: (batch) => emit(\"batch\", batch),\r\n onError: (err) => emit(\"error\", err),\r\n});\r\n\r\n// Watch for config changes\r\nwatch(\r\n config,\r\n () => {\r\n stop();\r\n start();\r\n },\r\n { deep: true },\r\n);\r\n\r\ndefineExpose({\r\n data,\r\n buffer,\r\n bufferSize,\r\n isStreaming,\r\n itemsPerSecond,\r\n totalItems,\r\n error,\r\n start,\r\n stop,\r\n push,\r\n clear,\r\n getBuffer,\r\n subscribe,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :data=\"data\"\r\n :buffer=\"buffer\"\r\n :buffer-size=\"bufferSize\"\r\n :is-streaming=\"isStreaming\"\r\n :items-per-second=\"itemsPerSecond\"\r\n :total-items=\"totalItems\"\r\n :error=\"error\"\r\n :start=\"start\"\r\n :stop=\"stop\"\r\n :push=\"push\"\r\n :clear=\"clear\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * HTTPStream - Vue component for HTTP streaming with Fetch API\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useHTTPStream } from \"../composables/useHTTP\";\r\n\r\nexport interface HTTPStreamProps {\r\n /** HTTP endpoint URL */\r\n url: string;\r\n /** HTTP method */\r\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\";\r\n /** Request headers */\r\n headers?: Record<string, string>;\r\n /** Request body (for POST/PUT/PATCH) */\r\n body?: unknown;\r\n /** Credentials mode */\r\n credentials?: RequestCredentials;\r\n /** Auto-connect on mount */\r\n autoConnect?: boolean;\r\n /** Auto-reconnect on error */\r\n autoReconnect?: boolean;\r\n /** Max reconnection attempts */\r\n maxReconnectAttempts?: number;\r\n /** Reconnection delay in ms */\r\n reconnectDelay?: number;\r\n /** Parse as line-delimited JSON */\r\n ndjson?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<HTTPStreamProps>(), {\r\n method: \"GET\",\r\n headers: () => ({}),\r\n body: undefined,\r\n credentials: \"same-origin\",\r\n autoConnect: true,\r\n autoReconnect: true,\r\n maxReconnectAttempts: 5,\r\n reconnectDelay: 1000,\r\n ndjson: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n open: [];\r\n chunk: [data: unknown, rawChunk: string];\r\n complete: [];\r\n error: [error: Error];\r\n progress: [bytesReceived: number];\r\n reconnecting: [attempt: number, maxAttempts: number];\r\n reconnected: [];\r\n reconnectFailed: [];\r\n}>();\r\n\r\nconst { url } = toRefs(props);\r\n\r\nconst {\r\n isConnected,\r\n isStreaming,\r\n connectionState,\r\n lastChunk,\r\n chunks,\r\n bytesReceived,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n clearChunks,\r\n} = useHTTPStream(\r\n {\r\n url: props.url,\r\n method: props.method,\r\n headers: props.headers,\r\n body: props.body,\r\n credentials: props.credentials,\r\n autoConnect: props.autoConnect,\r\n autoReconnect: props.autoReconnect,\r\n maxReconnectAttempts: props.maxReconnectAttempts,\r\n reconnectDelay: props.reconnectDelay,\r\n ndjson: props.ndjson,\r\n },\r\n {\r\n onOpen: () => emit(\"open\"),\r\n onChunk: (data, raw) => emit(\"chunk\", data, raw),\r\n onComplete: () => emit(\"complete\"),\r\n onError: (err) => emit(\"error\", err),\r\n onProgress: (bytes) => emit(\"progress\", bytes),\r\n onReconnecting: (attempt, max) => emit(\"reconnecting\", attempt, max),\r\n onReconnected: () => emit(\"reconnected\"),\r\n onReconnectFailed: () => emit(\"reconnectFailed\"),\r\n },\r\n);\r\n\r\n// Watch for URL changes\r\nwatch(url, () => {\r\n disconnect();\r\n connect();\r\n});\r\n\r\ndefineExpose({\r\n isConnected,\r\n isStreaming,\r\n connectionState,\r\n lastChunk,\r\n chunks,\r\n bytesReceived,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n clearChunks,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-connected=\"isConnected\"\r\n :is-streaming=\"isStreaming\"\r\n :connection-state=\"connectionState\"\r\n :last-chunk=\"lastChunk\"\r\n :chunks=\"chunks\"\r\n :bytes-received=\"bytesReceived\"\r\n :error=\"error\"\r\n :reconnect-attempts=\"reconnectAttempts\"\r\n :connect=\"connect\"\r\n :disconnect=\"disconnect\"\r\n :clear-chunks=\"clearChunks\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * LaravelEchoStream - Vue component for Laravel Echo streaming\r\n * @component\r\n */\r\nimport { onMounted, toRefs, watch } from \"vue\";\r\nimport {\r\n useLaravelEcho,\r\n type ChannelWrapper,\r\n type PresenceChannelWrapper,\r\n} from \"../composables/useLaravelEcho\";\r\nimport type { LaravelEchoConfig } from \"../types\";\r\n\r\nexport interface LaravelEchoStreamProps {\r\n /** Laravel Echo configuration */\r\n config: LaravelEchoConfig;\r\n /** Channel name to subscribe */\r\n channel?: string;\r\n /** Channel type */\r\n channelType?: \"public\" | \"private\" | \"presence\";\r\n /** Events to listen for on the channel */\r\n events?: string[];\r\n /** Auto-subscribe on mount */\r\n autoSubscribe?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<LaravelEchoStreamProps>(), {\r\n channel: undefined,\r\n channelType: \"public\",\r\n events: () => [],\r\n autoSubscribe: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n connected: [socketId: string];\r\n event: [eventName: string, data: unknown];\r\n error: [error: Error];\r\n subscribed: [channelName: string];\r\n unsubscribed: [channelName: string];\r\n // Presence channel events\r\n here: [members: unknown[]];\r\n joining: [member: unknown];\r\n leaving: [member: unknown];\r\n}>();\r\n\r\nconst { channel: channelRef } = toRefs(props);\r\n\r\nconst {\r\n isConnected,\r\n channels,\r\n channel: subscribePublic,\r\n privateChannel,\r\n presenceChannel,\r\n leave,\r\n leaveAll,\r\n connect,\r\n} = useLaravelEcho(props.config, {\r\n onConnected: (socketId) => emit(\"connected\", socketId),\r\n onError: (err) => emit(\"error\", err),\r\n});\r\n\r\nlet currentChannelWrapper: ChannelWrapper | PresenceChannelWrapper | null =\r\n null;\r\n\r\n// Subscribe to channel and setup event listeners\r\nfunction setupChannel() {\r\n if (!props.channel) return;\r\n\r\n if (props.channelType === \"private\") {\r\n currentChannelWrapper = privateChannel(props.channel);\r\n } else if (props.channelType === \"presence\") {\r\n const presenceWrapper = presenceChannel(props.channel);\r\n currentChannelWrapper = presenceWrapper;\r\n\r\n // Setup presence events\r\n presenceWrapper.here((members) => emit(\"here\", members as unknown[]));\r\n presenceWrapper.joining((member) => emit(\"joining\", member));\r\n presenceWrapper.leaving((member) => emit(\"leaving\", member));\r\n } else {\r\n currentChannelWrapper = subscribePublic(props.channel);\r\n }\r\n\r\n // Setup event listeners\r\n props.events.forEach((eventName) => {\r\n currentChannelWrapper?.listen(eventName, (data: unknown) => {\r\n emit(\"event\", eventName, data);\r\n });\r\n });\r\n\r\n emit(\"subscribed\", props.channel);\r\n}\r\n\r\nonMounted(async () => {\r\n await connect();\r\n if (props.autoSubscribe && props.channel) {\r\n setupChannel();\r\n }\r\n});\r\n\r\n// Watch for channel changes\r\nwatch(channelRef, (newChannel, oldChannel) => {\r\n if (oldChannel) {\r\n leave(oldChannel);\r\n emit(\"unsubscribed\", oldChannel);\r\n }\r\n if (newChannel && props.autoSubscribe) {\r\n setupChannel();\r\n }\r\n});\r\n\r\ndefineExpose({\r\n isConnected,\r\n channels,\r\n subscribePublic,\r\n privateChannel,\r\n presenceChannel,\r\n leave,\r\n leaveAll,\r\n connect,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-connected=\"isConnected\"\r\n :channels=\"channels\"\r\n :subscribe-public=\"subscribePublic\"\r\n :private-channel=\"privateChannel\"\r\n :presence-channel=\"presenceChannel\"\r\n :leave=\"leave\"\r\n :leave-all=\"leaveAll\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * LongPollingStream - Vue component for HTTP Long Polling\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useLongPolling } from \"../composables/useLongPolling\";\r\n\r\nexport interface LongPollingStreamProps {\r\n /** Polling endpoint URL */\r\n url: string;\r\n /** HTTP method */\r\n method?: \"GET\" | \"POST\";\r\n /** Request headers */\r\n headers?: Record<string, string>;\r\n /** Request body (for POST) */\r\n body?: unknown;\r\n /** Credentials mode */\r\n credentials?: RequestCredentials;\r\n /** Polling interval in ms (0 = immediate) */\r\n interval?: number;\r\n /** Request timeout in ms */\r\n timeout?: number;\r\n /** Auto-start on mount */\r\n autoStart?: boolean;\r\n /** Auto-restart on error */\r\n autoRestart?: boolean;\r\n /** Max restart attempts */\r\n maxRestartAttempts?: number;\r\n /** Restart delay in ms */\r\n restartDelay?: number;\r\n /** Include timestamp in requests */\r\n includeTimestamp?: boolean;\r\n /** Timestamp parameter name */\r\n timestampParam?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<LongPollingStreamProps>(), {\r\n method: \"GET\",\r\n headers: () => ({}),\r\n body: undefined,\r\n credentials: \"same-origin\",\r\n interval: 0,\r\n timeout: 30000,\r\n autoStart: true,\r\n autoRestart: true,\r\n maxRestartAttempts: 5,\r\n restartDelay: 1000,\r\n includeTimestamp: false,\r\n timestampParam: \"since\",\r\n});\r\n\r\nconst emit = defineEmits<{\r\n start: [];\r\n data: [data: unknown];\r\n error: [error: Error];\r\n stop: [];\r\n restarting: [attempt: number, maxAttempts: number];\r\n restarted: [];\r\n restartFailed: [];\r\n}>();\r\n\r\nconst { url } = toRefs(props);\r\n\r\nconst {\r\n isPolling,\r\n connectionState,\r\n lastData,\r\n dataHistory,\r\n requestCount,\r\n error,\r\n restartAttempts,\r\n start,\r\n stop,\r\n poll,\r\n clearHistory,\r\n} = useLongPolling(\r\n {\r\n url: props.url,\r\n method: props.method,\r\n headers: props.headers,\r\n body: props.body,\r\n credentials: props.credentials,\r\n interval: props.interval,\r\n timeout: props.timeout,\r\n autoStart: props.autoStart,\r\n autoRestart: props.autoRestart,\r\n maxRestartAttempts: props.maxRestartAttempts,\r\n restartDelay: props.restartDelay,\r\n includeTimestamp: props.includeTimestamp,\r\n timestampParam: props.timestampParam,\r\n },\r\n {\r\n onStart: () => emit(\"start\"),\r\n onData: (data) => emit(\"data\", data),\r\n onError: (err) => emit(\"error\", err),\r\n onStop: () => emit(\"stop\"),\r\n onRestarting: (attempt, max) => emit(\"restarting\", attempt, max),\r\n onRestarted: () => emit(\"restarted\"),\r\n onRestartFailed: () => emit(\"restartFailed\"),\r\n },\r\n);\r\n\r\n// Watch for URL changes\r\nwatch(url, () => {\r\n stop();\r\n start();\r\n});\r\n\r\ndefineExpose({\r\n isPolling,\r\n connectionState,\r\n lastData,\r\n dataHistory,\r\n requestCount,\r\n error,\r\n restartAttempts,\r\n start,\r\n stop,\r\n poll,\r\n clearHistory,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-polling=\"isPolling\"\r\n :connection-state=\"connectionState\"\r\n :last-data=\"lastData\"\r\n :data-history=\"dataHistory\"\r\n :request-count=\"requestCount\"\r\n :error=\"error\"\r\n :restart-attempts=\"restartAttempts\"\r\n :start=\"start\"\r\n :stop=\"stop\"\r\n :poll=\"poll\"\r\n :clear-history=\"clearHistory\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * SocketIOStream - Vue component for Socket.IO streaming\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useSocketIO } from \"../composables/useSocketIO\";\r\nimport type { SocketIOConfig } from \"../types\";\r\n\r\nexport interface SocketIOStreamProps {\r\n /** Socket.IO configuration */\r\n config: SocketIOConfig;\r\n /** Auto-connect on mount */\r\n autoConnect?: boolean;\r\n /** Events to listen for */\r\n events?: string[];\r\n}\r\n\r\nconst props = withDefaults(defineProps<SocketIOStreamProps>(), {\r\n autoConnect: true,\r\n events: () => [],\r\n});\r\n\r\nconst emit = defineEmits<{\r\n connect: [socketId: string];\r\n disconnect: [reason: string];\r\n error: [error: Error];\r\n event: [eventName: string, data: unknown];\r\n reconnecting: [attempt: number];\r\n reconnected: [];\r\n reconnectFailed: [];\r\n}>();\r\n\r\nconst { config } = toRefs(props);\r\n\r\nconst {\r\n isConnected,\r\n connectionState,\r\n socketId,\r\n rooms,\r\n error,\r\n connect,\r\n disconnect,\r\n emit: socketEmit,\r\n on,\r\n off,\r\n join,\r\n leave,\r\n} = useSocketIO(props.config, {\r\n onConnect: (id) => emit(\"connect\", id),\r\n onDisconnect: (reason) => emit(\"disconnect\", reason),\r\n onError: (err) => emit(\"error\", err),\r\n onReconnecting: (attempt) => emit(\"reconnecting\", attempt),\r\n onReconnectFailed: () => emit(\"reconnectFailed\"),\r\n});\r\n\r\n// Setup event listeners from props\r\nprops.events.forEach((eventName) => {\r\n on(eventName, (data: unknown) => {\r\n emit(\"event\", eventName, data);\r\n });\r\n});\r\n\r\n// Watch for config URL changes\r\nwatch(\r\n () => config.value.url,\r\n () => {\r\n disconnect();\r\n connect();\r\n },\r\n);\r\n\r\ndefineExpose({\r\n isConnected,\r\n connectionState,\r\n socketId,\r\n rooms,\r\n error,\r\n connect,\r\n disconnect,\r\n emit: socketEmit,\r\n on,\r\n off,\r\n join,\r\n leave,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-connected=\"isConnected\"\r\n :connection-state=\"connectionState\"\r\n :socket-id=\"socketId\"\r\n :rooms=\"rooms\"\r\n :error=\"error\"\r\n :connect=\"connect\"\r\n :disconnect=\"disconnect\"\r\n :emit=\"socketEmit\"\r\n :on=\"on\"\r\n :off=\"off\"\r\n :join=\"join\"\r\n :leave=\"leave\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * SSEStream - Vue component for Server-Sent Events streaming\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useSSE } from \"../composables/useSSE\";\r\n\r\nexport interface SSEStreamProps {\r\n /** SSE endpoint URL */\r\n url: string;\r\n /** Enable credentials (cookies) */\r\n withCredentials?: boolean;\r\n /** Auto-connect on mount */\r\n autoConnect?: boolean;\r\n /** Auto-reconnect on error */\r\n autoReconnect?: boolean;\r\n /** Max reconnection attempts */\r\n maxReconnectAttempts?: number;\r\n /** Reconnection delay in ms */\r\n reconnectDelay?: number;\r\n /** Event types to listen for */\r\n eventTypes?: string[];\r\n}\r\n\r\nconst props = withDefaults(defineProps<SSEStreamProps>(), {\r\n withCredentials: false,\r\n autoConnect: true,\r\n autoReconnect: true,\r\n maxReconnectAttempts: 5,\r\n reconnectDelay: 1000,\r\n eventTypes: () => [\"message\"],\r\n});\r\n\r\nconst emit = defineEmits<{\r\n open: [];\r\n error: [error: Event];\r\n message: [data: unknown, event: MessageEvent];\r\n event: [eventType: string, data: unknown, event: MessageEvent];\r\n reconnecting: [attempt: number, maxAttempts: number];\r\n reconnected: [];\r\n reconnectFailed: [];\r\n}>();\r\n\r\nconst { url } = toRefs(props);\r\n\r\nconst {\r\n isConnected,\r\n connectionState,\r\n lastMessage,\r\n lastEventType,\r\n lastEventId,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n addEventListener,\r\n removeEventListener,\r\n} = useSSE(\r\n {\r\n url: props.url,\r\n withCredentials: props.withCredentials,\r\n autoConnect: props.autoConnect,\r\n autoReconnect: props.autoReconnect,\r\n maxReconnectAttempts: props.maxReconnectAttempts,\r\n reconnectDelay: props.reconnectDelay,\r\n eventTypes: props.eventTypes,\r\n },\r\n {\r\n onOpen: () => emit(\"open\"),\r\n onError: (err) => emit(\"error\", err),\r\n onMessage: (data, event) => emit(\"message\", data, event),\r\n onEvent: (type, data, event) => emit(\"event\", type, data, event),\r\n onReconnecting: (attempt, max) => emit(\"reconnecting\", attempt, max),\r\n onReconnected: () => emit(\"reconnected\"),\r\n onReconnectFailed: () => emit(\"reconnectFailed\"),\r\n },\r\n);\r\n\r\n// Watch for URL changes\r\nwatch(url, () => {\r\n disconnect();\r\n connect();\r\n});\r\n\r\ndefineExpose({\r\n isConnected,\r\n connectionState,\r\n lastMessage,\r\n lastEventType,\r\n lastEventId,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n addEventListener,\r\n removeEventListener,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-connected=\"isConnected\"\r\n :connection-state=\"connectionState\"\r\n :last-message=\"lastMessage\"\r\n :last-event-type=\"lastEventType\"\r\n :last-event-id=\"lastEventId\"\r\n :error=\"error\"\r\n :reconnect-attempts=\"reconnectAttempts\"\r\n :connect=\"connect\"\r\n :disconnect=\"disconnect\"\r\n :add-event-listener=\"addEventListener\"\r\n :remove-event-listener=\"removeEventListener\"\r\n />\r\n</template>\r\n","<script setup lang=\"ts\">\r\n/**\r\n * WebSocketStream - Vue component for WebSocket streaming\r\n * @component\r\n */\r\nimport { toRefs, watch } from \"vue\";\r\nimport { useWebSocket } from \"../composables/useWebSocket\";\r\nimport type { WebSocketConfig } from \"../types\";\r\n\r\nexport interface WebSocketStreamProps {\r\n /** WebSocket configuration */\r\n config: WebSocketConfig;\r\n /** Auto-connect on mount */\r\n autoConnect?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<WebSocketStreamProps>(), {\r\n autoConnect: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n open: [];\r\n close: [code: number, reason: string];\r\n error: [error: Event];\r\n message: [data: unknown, event: MessageEvent];\r\n reconnecting: [attempt: number, maxAttempts: number];\r\n reconnected: [];\r\n reconnectFailed: [];\r\n}>();\r\n\r\nconst { config } = toRefs(props);\r\n\r\nconst {\r\n isConnected,\r\n connectionState,\r\n lastMessage,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n send,\r\n sendJSON,\r\n} = useWebSocket(props.config, {\r\n onOpen: () => emit(\"open\"),\r\n onClose: (code, reason) => emit(\"close\", code, reason),\r\n onError: (err) => emit(\"error\", err),\r\n onMessage: (data, event) => emit(\"message\", data, event),\r\n onReconnecting: (attempt, max) => emit(\"reconnecting\", attempt, max),\r\n onReconnected: () => emit(\"reconnected\"),\r\n onReconnectFailed: () => emit(\"reconnectFailed\"),\r\n});\r\n\r\n// Watch for URL changes\r\nwatch(\r\n () => config.value.url,\r\n () => {\r\n disconnect();\r\n connect();\r\n },\r\n);\r\n\r\ndefineExpose({\r\n isConnected,\r\n connectionState,\r\n lastMessage,\r\n error,\r\n reconnectAttempts,\r\n connect,\r\n disconnect,\r\n send,\r\n sendJSON,\r\n});\r\n</script>\r\n\r\n<template>\r\n <slot\r\n :is-connected=\"isConnected\"\r\n :connection-state=\"connectionState\"\r\n :last-message=\"lastMessage\"\r\n :error=\"error\"\r\n :reconnect-attempts=\"reconnectAttempts\"\r\n :connect=\"connect\"\r\n :disconnect=\"disconnect\"\r\n :send=\"send\"\r\n :send-json=\"sendJSON\"\r\n />\r\n</template>\r\n"],"names":["props","__props","emit","__emit","videoRef","ref","hlsConfig","hlsCallbacks","levels","level","error","state","isPlaying","isBuffering","currentLevel","autoLevelEnabled","currentTime","duration","buffered","volume","isMuted","stats","isSupported","attach","play","pause","stop","seek","setLevel","setVolume","toggleMute","destroy","useHLS","watch","newState","time","formatTime","seconds","mins","secs","currentLevelInfo","computed","onMounted","err","newSrc","__expose","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","videoClass","controls","muted","loop","poster","_unref","_hoisted_4","_cache","_hoisted_5","_hoisted_6","_toDisplayString","_hoisted_7","_hoisted_8","$event","_Fragment","_renderList","_hoisted_10","_hoisted_11","_hoisted_12","containerRef","isLoading","THREE","scene","camera","renderer","pointsObject","animationId","initScene","OrbitControls","container","width","height","grid","axes","w","h","animate","e","updatePointCloud","geometry","positions","colors","i","point","color","material","center","size","cleanup","value","onUnmounted","_hoisted_3","logs","idCounter","formatData","data","detectType","addLog","type","entry","scrollToBottom","clear","togglePause","formatTimestamp","date","newData","l","_normalizeClass","paused","log","showTimestamps","statusMessage","config","callbacks","status","frame","boxes","isRunning","connectionState","dataChannels","lastPointCloudFrame","lastDetectionFrame","lastBoundingBoxes","start","sendControl","useWebRTC","_a","_b","stateColor","showStatus","args","_renderSlot","_ctx","_hoisted_9","showStats","_hoisted_13","_hoisted_15","toRefs","buffer","bufferSize","isStreaming","itemsPerSecond","totalItems","push","getBuffer","subscribe","useDataStream","batch","url","isConnected","lastChunk","chunks","bytesReceived","reconnectAttempts","connect","disconnect","clearChunks","useHTTPStream","raw","bytes","attempt","max","channelRef","channels","subscribePublic","privateChannel","presenceChannel","leave","leaveAll","useLaravelEcho","socketId","currentChannelWrapper","setupChannel","presenceWrapper","members","member","eventName","newChannel","oldChannel","isPolling","lastData","dataHistory","requestCount","restartAttempts","poll","clearHistory","useLongPolling","rooms","socketEmit","on","off","join","useSocketIO","id","reason","lastMessage","lastEventType","lastEventId","addEventListener","removeEventListener","useSSE","event","send","sendJSON","useWebSocket","code"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../WebSocketStream.vue_vue_type_script_setup_true_lang-EzMJEQkx.cjs");exports.DataStreamView=e._sfc_main;exports.HLSPlayer=e.HLSPlayer;exports.HTTPStream=e._sfc_main$1;exports.LaravelEchoStream=e._sfc_main$2;exports.LongPollingStream=e._sfc_main$3;exports.PointCloudViewer=e.PointCloudViewer;exports.SSEStream=e._sfc_main$4;exports.SocketIOStream=e._sfc_main$5;exports.StreamViewer=e.StreamViewer;exports.WebRTCViewer=e.WebRTCViewer;exports.WebSocketStream=e._sfc_main$6;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { _ as r, H as S, a as t, b as s, c as m, P as o, d as i, e as l, S as P, W as c, f as w } from "../WebSocketStream.vue_vue_type_script_setup_true_lang-C_F2vNNk.js";
2
+ export {
3
+ r as DataStreamView,
4
+ S as HLSPlayer,
5
+ t as HTTPStream,
6
+ s as LaravelEchoStream,
7
+ m as LongPollingStream,
8
+ o as PointCloudViewer,
9
+ i as SSEStream,
10
+ l as SocketIOStream,
11
+ P as StreamViewer,
12
+ c as WebRTCViewer,
13
+ w as WebSocketStream
14
+ };
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../useWebSocket-7-qar6to.cjs"),u=require("../usePointCloud-D2csBAs8.cjs");exports.useDataStream=e.useDataStream;exports.useHLS=e.useHLS;exports.useHTTPStream=e.useHTTPStream;exports.useLaravelEcho=e.useLaravelEcho;exports.useLongPolling=e.useLongPolling;exports.useSSE=e.useSSE;exports.useSocketIO=e.useSocketIO;exports.useWebRTC=e.useWebRTC;exports.useWebSocket=e.useWebSocket;exports.usePointCloud=u.usePointCloud;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { u as a, a as u, b as o, c as t, d as r, e as S, f as c, g as l, h as m } from "../useWebSocket-CrE6QkTW.js";
2
+ import { u as f } from "../usePointCloud-D0qcpYFY.js";
3
+ export {
4
+ a as useDataStream,
5
+ u as useHLS,
6
+ o as useHTTPStream,
7
+ t as useLaravelEcho,
8
+ r as useLongPolling,
9
+ f as usePointCloud,
10
+ S as useSSE,
11
+ c as useSocketIO,
12
+ l as useWebRTC,
13
+ m as useWebSocket
14
+ };
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
package/dist/index.cjs CHANGED
@@ -1,4 +1,2 @@
1
- 'use strict';
2
-
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./WebSocketStream.vue_vue_type_script_setup_true_lang-EzMJEQkx.cjs"),r=require("./useWebSocket-7-qar6to.cjs"),t=require("./usePointCloud-D2csBAs8.cjs"),e=require("./utils/index.cjs");exports.DataStreamView=o._sfc_main;exports.HLSPlayer=o.HLSPlayer;exports.HTTPStream=o._sfc_main$1;exports.LaravelEchoStream=o._sfc_main$2;exports.LongPollingStream=o._sfc_main$3;exports.PointCloudViewer=o.PointCloudViewer;exports.SSEStream=o._sfc_main$4;exports.SocketIOStream=o._sfc_main$5;exports.StreamViewer=o.StreamViewer;exports.WebRTCViewer=o.WebRTCViewer;exports.WebSocketStream=o._sfc_main$6;exports.useDataStream=r.useDataStream;exports.useHLS=r.useHLS;exports.useHTTPStream=r.useHTTPStream;exports.useLaravelEcho=r.useLaravelEcho;exports.useLongPolling=r.useLongPolling;exports.useSSE=r.useSSE;exports.useSocketIO=r.useSocketIO;exports.useWebRTC=r.useWebRTC;exports.useWebSocket=r.useWebSocket;exports.usePointCloud=t.usePointCloud;Object.defineProperty(exports,"BBOX_COLORS",{enumerable:!0,get:()=>e.BBOX_COLORS});Object.defineProperty(exports,"BBOX_COLORS_BY_ID",{enumerable:!0,get:()=>e.BBOX_COLORS_BY_ID});Object.defineProperty(exports,"CLASS_LABELS",{enumerable:!0,get:()=>e.CLASS_LABELS});exports.DEFAULT_BBOX_COLORS=e.DEFAULT_BBOX_COLORS;exports.DEFAULT_BBOX_COLORS_BY_ID=e.DEFAULT_BBOX_COLORS_BY_ID;exports.DEFAULT_CLASS_LABELS=e.DEFAULT_CLASS_LABELS;exports.bbox3DToDetection=e.bbox3DToDetection;exports.bboxesToDetectionFrame=e.bboxesToDetectionFrame;exports.calculateBounds=e.calculateBounds;exports.calculateIoU3D=e.calculateIoU3D;exports.configureBBox=e.configureBBox;exports.createReconnectManager=e.createReconnectManager;exports.delay=e.delay;exports.detectPointCloudFormat=e.detectPointCloudFormat;exports.downsamplePointCloud=e.downsamplePointCloud;exports.filterByConfidence=e.filterByConfidence;exports.getBBoxColors=e.getBBoxColors;exports.getBBoxColorsByClassId=e.getBBoxColorsByClassId;exports.getClassLabels=e.getClassLabels;exports.getColorForClassId=e.getColorForClassId;exports.getColorForLabel=e.getColorForLabel;exports.getLabelForClassId=e.getLabelForClassId;exports.nms3D=e.nms3D;exports.normalizeBboxes=e.normalizeBboxes;exports.parseArrayBboxFormat=e.parseArrayBboxFormat;exports.parseArrayBoundingBox=e.parseArrayBoundingBox;exports.parseArrayBoundingBoxes=e.parseArrayBoundingBoxes;exports.parsePointCloudBinary=e.parsePointCloudBinary;exports.parsePointCloudJSON=e.parsePointCloudJSON;exports.resetBBoxConfig=e.resetBBoxConfig;exports.retryWithBackoff=e.retryWithBackoff;exports.setBBoxColor=e.setBBoxColor;exports.setBBoxColorByClassId=e.setBBoxColorByClassId;exports.setClassLabel=e.setClassLabel;exports.transformPoints=e.transformPoints;
3
2
  //# sourceMappingURL=index.cjs.map
4
- //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}