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
package/dist/index.js CHANGED
@@ -1,3 +1,63 @@
1
-
1
+ import { _ as o, H as s, a as r, b as t, c as l, P as B, d as S, e as n, S as C, W as i, f as u } from "./WebSocketStream.vue_vue_type_script_setup_true_lang-C_F2vNNk.js";
2
+ import { u as c, a as m, b as d, c as b, d as g, e as x, f as O, g as _, h as f } from "./useWebSocket-CrE6QkTW.js";
3
+ import { u as D } from "./usePointCloud-D0qcpYFY.js";
4
+ import { BBOX_COLORS as p, BBOX_COLORS_BY_ID as y, CLASS_LABELS as A, DEFAULT_BBOX_COLORS as E, DEFAULT_BBOX_COLORS_BY_ID as F, DEFAULT_CLASS_LABELS as I, bbox3DToDetection as R, bboxesToDetectionFrame as W, calculateBounds as k, calculateIoU3D as w, configureBBox as H, createReconnectManager as h, delay as U, detectPointCloudFormat as V, downsamplePointCloud as X, filterByConfidence as v, getBBoxColors as Y, getBBoxColorsByClassId as z, getClassLabels as J, getColorForClassId as M, getColorForLabel as N, getLabelForClassId as j, nms3D as q, normalizeBboxes as G, parseArrayBboxFormat as K, parseArrayBoundingBox as Q, parseArrayBoundingBoxes as Z, parsePointCloudBinary as $, parsePointCloudJSON as ee, resetBBoxConfig as ae, retryWithBackoff as oe, setBBoxColor as se, setBBoxColorByClassId as re, setClassLabel as te, transformPoints as le } from "./utils/index.js";
5
+ export {
6
+ p as BBOX_COLORS,
7
+ y as BBOX_COLORS_BY_ID,
8
+ A as CLASS_LABELS,
9
+ E as DEFAULT_BBOX_COLORS,
10
+ F as DEFAULT_BBOX_COLORS_BY_ID,
11
+ I as DEFAULT_CLASS_LABELS,
12
+ o as DataStreamView,
13
+ s as HLSPlayer,
14
+ r as HTTPStream,
15
+ t as LaravelEchoStream,
16
+ l as LongPollingStream,
17
+ B as PointCloudViewer,
18
+ S as SSEStream,
19
+ n as SocketIOStream,
20
+ C as StreamViewer,
21
+ i as WebRTCViewer,
22
+ u as WebSocketStream,
23
+ R as bbox3DToDetection,
24
+ W as bboxesToDetectionFrame,
25
+ k as calculateBounds,
26
+ w as calculateIoU3D,
27
+ H as configureBBox,
28
+ h as createReconnectManager,
29
+ U as delay,
30
+ V as detectPointCloudFormat,
31
+ X as downsamplePointCloud,
32
+ v as filterByConfidence,
33
+ Y as getBBoxColors,
34
+ z as getBBoxColorsByClassId,
35
+ J as getClassLabels,
36
+ M as getColorForClassId,
37
+ N as getColorForLabel,
38
+ j as getLabelForClassId,
39
+ q as nms3D,
40
+ G as normalizeBboxes,
41
+ K as parseArrayBboxFormat,
42
+ Q as parseArrayBoundingBox,
43
+ Z as parseArrayBoundingBoxes,
44
+ $ as parsePointCloudBinary,
45
+ ee as parsePointCloudJSON,
46
+ ae as resetBBoxConfig,
47
+ oe as retryWithBackoff,
48
+ se as setBBoxColor,
49
+ re as setBBoxColorByClassId,
50
+ te as setClassLabel,
51
+ le as transformPoints,
52
+ c as useDataStream,
53
+ m as useHLS,
54
+ d as useHTTPStream,
55
+ b as useLaravelEcho,
56
+ g as useLongPolling,
57
+ D as usePointCloud,
58
+ x as useSSE,
59
+ O as useSocketIO,
60
+ _ as useWebRTC,
61
+ f as useWebSocket
62
+ };
2
63
  //# sourceMappingURL=index.js.map
3
- //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
package/dist/types.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,115 @@
1
+ import { ref as n, computed as _, onUnmounted as q } from "vue";
2
+ import { transformPoints as U, calculateBounds as z, downsamplePointCloud as H, detectPointCloudFormat as K, parsePointCloudJSON as j, parsePointCloudBinary as M } from "./utils/index.js";
3
+ const Q = {
4
+ format: "auto",
5
+ maxPoints: 1e6,
6
+ scale: 1,
7
+ offset: { x: 0, y: 0, z: 0 },
8
+ dracoDecoderPath: "/draco/",
9
+ dracoPath: "/draco/",
10
+ downsampleFactor: 1,
11
+ colorize: !0,
12
+ transform: void 0
13
+ };
14
+ function X(A = {}, u = {}) {
15
+ const r = { ...Q, ...A }, a = n([]), f = n(0), o = n({
16
+ min: { x: 0, y: 0, z: 0 },
17
+ max: { x: 0, y: 0, z: 0 }
18
+ }), d = n(!1), h = n(!1), w = n("auto"), v = n(0), x = n(0), y = n(0), g = n(!1), p = n(null);
19
+ let m = r.scale, i = r.offset, P = 0;
20
+ const N = _(() => ({
21
+ x: (o.value.min.x + o.value.max.x) / 2,
22
+ y: (o.value.min.y + o.value.max.y) / 2,
23
+ z: (o.value.min.z + o.value.max.z) / 2
24
+ }));
25
+ async function W(t) {
26
+ var T, F;
27
+ g.value = !0, p.value = null;
28
+ const s = performance.now();
29
+ try {
30
+ const l = r.format === "auto" ? K(t) : r.format;
31
+ w.value = l;
32
+ let e = [];
33
+ if (typeof t == "string") {
34
+ const c = j(t);
35
+ c && (e = c);
36
+ } else {
37
+ try {
38
+ const c = new TextDecoder().decode(t);
39
+ if (c.startsWith("[") || c.startsWith("{")) {
40
+ const C = j(c);
41
+ C && C.length > 0 && (e = C);
42
+ }
43
+ } catch {
44
+ }
45
+ e.length === 0 && (e = M(
46
+ t instanceof Uint8Array ? t.buffer : t
47
+ ));
48
+ }
49
+ (m !== 1 || i.x !== 0 || i.y !== 0 || i.z !== 0) && (e = U(
50
+ e,
51
+ m,
52
+ i
53
+ )), r.maxPoints && e.length > r.maxPoints && (e = e.slice(0, r.maxPoints));
54
+ const E = z(e), I = e.length > 0 && e[0].r !== void 0, S = e.length > 0 && e[0].intensity !== void 0, B = performance.now() - s;
55
+ a.value = e, f.value = e.length, o.value = E, d.value = I, h.value = S, v.value++, x.value += e.length, P += B, y.value = P / v.value;
56
+ const O = {
57
+ points: e,
58
+ bounds: E,
59
+ pointCount: e.length,
60
+ hasColor: I,
61
+ hasIntensity: S,
62
+ format: l,
63
+ decodingTime: B
64
+ };
65
+ return (T = u.onDecoded) == null || T.call(u, O), O;
66
+ } catch (l) {
67
+ const e = l instanceof Error ? l : new Error(String(l));
68
+ throw p.value = e, (F = u.onError) == null || F.call(u, e), e;
69
+ } finally {
70
+ g.value = !1;
71
+ }
72
+ }
73
+ function D() {
74
+ a.value = [], f.value = 0, o.value = {
75
+ min: { x: 0, y: 0, z: 0 },
76
+ max: { x: 0, y: 0, z: 0 }
77
+ }, d.value = !1, h.value = !1;
78
+ }
79
+ function G(t) {
80
+ if (a.value.length === 0) return;
81
+ const s = H(a.value, t);
82
+ a.value = s, f.value = s.length, o.value = z(s);
83
+ }
84
+ function J(t, s) {
85
+ t !== void 0 && (m = t), s !== void 0 && (i = s), a.value.length > 0 && (a.value = U(a.value, m, i), o.value = z(a.value));
86
+ }
87
+ function L() {
88
+ v.value = 0, x.value = 0, y.value = 0, P = 0;
89
+ }
90
+ return q(() => {
91
+ D();
92
+ }), {
93
+ points: a,
94
+ pointCount: f,
95
+ bounds: o,
96
+ hasColor: d,
97
+ hasIntensity: h,
98
+ format: w,
99
+ frameCount: v,
100
+ totalPointsDecoded: x,
101
+ avgDecodingTime: y,
102
+ isProcessing: g,
103
+ error: p,
104
+ center: N,
105
+ decode: W,
106
+ clear: D,
107
+ downsample: G,
108
+ setTransform: J,
109
+ resetStats: L
110
+ };
111
+ }
112
+ export {
113
+ X as u
114
+ };
115
+ //# sourceMappingURL=usePointCloud-D0qcpYFY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePointCloud-D0qcpYFY.js","sources":["../src/composables/usePointCloud.ts"],"sourcesContent":["/**\r\n * usePointCloud - Vue 3 Point Cloud composable for streaming and decoding\r\n * @module vue-streaming/composables/usePointCloud\r\n */\r\n\r\nimport { computed, onUnmounted, ref, type Ref } from \"vue\";\r\nimport type {\r\n DecodedPointCloud,\r\n Point3D,\r\n PointCloudCallbacks,\r\n PointCloudConfig,\r\n PointCloudFormat,\r\n} from \"../types\";\r\nimport {\r\n calculateBounds,\r\n detectPointCloudFormat,\r\n downsamplePointCloud,\r\n parsePointCloudBinary,\r\n parsePointCloudJSON,\r\n transformPoints,\r\n} from \"../utils/pointcloud\";\r\n\r\nexport interface UsePointCloudReturn {\r\n /** Current points */\r\n points: Ref<Point3D[]>;\r\n /** Point count */\r\n pointCount: Ref<number>;\r\n /** Bounds */\r\n bounds: Ref<DecodedPointCloud[\"bounds\"]>;\r\n /** Has color data */\r\n hasColor: Ref<boolean>;\r\n /** Has intensity data */\r\n hasIntensity: Ref<boolean>;\r\n /** Detected format */\r\n format: Ref<PointCloudFormat>;\r\n /** Total frames decoded */\r\n frameCount: Ref<number>;\r\n /** Total points decoded */\r\n totalPointsDecoded: Ref<number>;\r\n /** Average decoding time */\r\n avgDecodingTime: Ref<number>;\r\n /** Is processing */\r\n isProcessing: Ref<boolean>;\r\n /** Last error */\r\n error: Ref<Error | null>;\r\n /** Center point (computed) */\r\n center: Ref<{ x: number; y: number; z: number }>;\r\n /** Decode point cloud data */\r\n decode: (\r\n data: ArrayBuffer | Uint8Array | string,\r\n ) => Promise<DecodedPointCloud>;\r\n /** Clear current points */\r\n clear: () => void;\r\n /** Downsample current points */\r\n downsample: (voxelSize: number) => void;\r\n /** Set transform parameters */\r\n setTransform: (\r\n scale?: number,\r\n offset?: { x: number; y: number; z: number },\r\n ) => void;\r\n /** Reset statistics */\r\n resetStats: () => void;\r\n}\r\n\r\nconst DEFAULT_CONFIG = {\r\n format: \"auto\" as const,\r\n maxPoints: 1000000,\r\n scale: 1,\r\n offset: { x: 0, y: 0, z: 0 },\r\n dracoDecoderPath: \"/draco/\",\r\n dracoPath: \"/draco/\",\r\n downsampleFactor: 1,\r\n colorize: true,\r\n transform: undefined as\r\n | undefined\r\n | {\r\n position?: { x: number; y: number; z: number };\r\n rotation?: { x: number; y: number; z: number };\r\n scale?: { x: number; y: number; z: number } | number;\r\n },\r\n};\r\n\r\n/**\r\n * Vue 3 composable for point cloud streaming and decoding\r\n *\r\n * @example\r\n * ```typescript\r\n * const {\r\n * points,\r\n * pointCount,\r\n * bounds,\r\n * center,\r\n * decode,\r\n * clear,\r\n * downsample\r\n * } = usePointCloud({\r\n * format: 'auto',\r\n * maxPoints: 500000,\r\n * scale: 0.01\r\n * }, {\r\n * onDecoded: (result) => console.log('Decoded:', result.pointCount, 'points')\r\n * })\r\n *\r\n * // Use with WebRTC\r\n * const webrtc = useWebRTC({\r\n * signalingUrl: 'http://server/webrtc/signaling'\r\n * }, {\r\n * onPointCloudData: async (data) => {\r\n * const result = await decode(data)\r\n * // Points are automatically updated in refs\r\n * }\r\n * })\r\n *\r\n * // Use in template\r\n * // <PointCloudViewer :points=\"points\" :bounds=\"bounds\" />\r\n * ```\r\n */\r\nexport function usePointCloud(\r\n config: PointCloudConfig = {},\r\n callbacks: PointCloudCallbacks = {},\r\n): UsePointCloudReturn {\r\n const cfg = { ...DEFAULT_CONFIG, ...config };\r\n\r\n // Reactive state\r\n const points = ref<Point3D[]>([]);\r\n const pointCount = ref(0);\r\n const bounds = ref<DecodedPointCloud[\"bounds\"]>({\r\n min: { x: 0, y: 0, z: 0 },\r\n max: { x: 0, y: 0, z: 0 },\r\n });\r\n const hasColor = ref(false);\r\n const hasIntensity = ref(false);\r\n const format = ref<PointCloudFormat>(\"auto\");\r\n const frameCount = ref(0);\r\n const totalPointsDecoded = ref(0);\r\n const avgDecodingTime = ref(0);\r\n const isProcessing = ref(false);\r\n const error = ref<Error | null>(null);\r\n\r\n // Transform state\r\n let currentScale = cfg.scale;\r\n let currentOffset = cfg.offset;\r\n\r\n // Stats tracking\r\n let totalDecodingTime = 0;\r\n\r\n // Computed center point\r\n const center = computed(() => ({\r\n x: (bounds.value.min.x + bounds.value.max.x) / 2,\r\n y: (bounds.value.min.y + bounds.value.max.y) / 2,\r\n z: (bounds.value.min.z + bounds.value.max.z) / 2,\r\n }));\r\n\r\n /**\r\n * Decode point cloud data\r\n */\r\n async function decode(\r\n data: ArrayBuffer | Uint8Array | string,\r\n ): Promise<DecodedPointCloud> {\r\n isProcessing.value = true;\r\n error.value = null;\r\n\r\n const startTime = performance.now();\r\n\r\n try {\r\n // Detect format\r\n const detectedFormat =\r\n cfg.format === \"auto\" ? detectPointCloudFormat(data) : cfg.format;\r\n\r\n format.value = detectedFormat;\r\n\r\n let decodedPoints: Point3D[] = [];\r\n\r\n // Parse based on format\r\n if (typeof data === \"string\") {\r\n const jsonPoints = parsePointCloudJSON(data);\r\n if (jsonPoints) {\r\n decodedPoints = jsonPoints;\r\n }\r\n } else {\r\n // Try JSON first for binary data\r\n try {\r\n const text = new TextDecoder().decode(data);\r\n if (text.startsWith(\"[\") || text.startsWith(\"{\")) {\r\n const jsonPoints = parsePointCloudJSON(text);\r\n if (jsonPoints && jsonPoints.length > 0) {\r\n decodedPoints = jsonPoints;\r\n }\r\n }\r\n } catch {\r\n // Not valid text\r\n }\r\n\r\n // Parse as binary if JSON didn't work\r\n if (decodedPoints.length === 0) {\r\n decodedPoints = parsePointCloudBinary(\r\n data instanceof Uint8Array ? data.buffer : data,\r\n );\r\n }\r\n }\r\n\r\n // Apply transformations\r\n if (\r\n currentScale !== 1 ||\r\n currentOffset.x !== 0 ||\r\n currentOffset.y !== 0 ||\r\n currentOffset.z !== 0\r\n ) {\r\n decodedPoints = transformPoints(\r\n decodedPoints,\r\n currentScale,\r\n currentOffset,\r\n );\r\n }\r\n\r\n // Limit points if needed\r\n if (cfg.maxPoints && decodedPoints.length > cfg.maxPoints) {\r\n decodedPoints = decodedPoints.slice(0, cfg.maxPoints);\r\n }\r\n\r\n // Calculate bounds and detect features\r\n const pointBounds = calculateBounds(decodedPoints);\r\n const hasColorData =\r\n decodedPoints.length > 0 && decodedPoints[0].r !== undefined;\r\n const hasIntensityData =\r\n decodedPoints.length > 0 && decodedPoints[0].intensity !== undefined;\r\n\r\n const decodingTime = performance.now() - startTime;\r\n\r\n // Update state\r\n points.value = decodedPoints;\r\n pointCount.value = decodedPoints.length;\r\n bounds.value = pointBounds;\r\n hasColor.value = hasColorData;\r\n hasIntensity.value = hasIntensityData;\r\n\r\n // Update stats\r\n frameCount.value++;\r\n totalPointsDecoded.value += decodedPoints.length;\r\n totalDecodingTime += decodingTime;\r\n avgDecodingTime.value = totalDecodingTime / frameCount.value;\r\n\r\n const result: DecodedPointCloud = {\r\n points: decodedPoints,\r\n bounds: pointBounds,\r\n pointCount: decodedPoints.length,\r\n hasColor: hasColorData,\r\n hasIntensity: hasIntensityData,\r\n format: detectedFormat,\r\n decodingTime,\r\n };\r\n\r\n callbacks.onDecoded?.(result);\r\n return result;\r\n } catch (err) {\r\n const e = err instanceof Error ? err : new Error(String(err));\r\n error.value = e;\r\n callbacks.onError?.(e);\r\n throw e;\r\n } finally {\r\n isProcessing.value = false;\r\n }\r\n }\r\n\r\n /**\r\n * Clear current points\r\n */\r\n function clear(): void {\r\n points.value = [];\r\n pointCount.value = 0;\r\n bounds.value = {\r\n min: { x: 0, y: 0, z: 0 },\r\n max: { x: 0, y: 0, z: 0 },\r\n };\r\n hasColor.value = false;\r\n hasIntensity.value = false;\r\n }\r\n\r\n /**\r\n * Downsample current points using voxel grid\r\n */\r\n function downsample(voxelSize: number): void {\r\n if (points.value.length === 0) return;\r\n\r\n const downsampled = downsamplePointCloud(points.value, voxelSize);\r\n points.value = downsampled;\r\n pointCount.value = downsampled.length;\r\n bounds.value = calculateBounds(downsampled);\r\n }\r\n\r\n /**\r\n * Set transform parameters\r\n */\r\n function setTransform(\r\n scale?: number,\r\n offset?: { x: number; y: number; z: number },\r\n ): void {\r\n if (scale !== undefined) currentScale = scale;\r\n if (offset !== undefined) currentOffset = offset;\r\n\r\n // Re-apply transform to current points if any\r\n if (points.value.length > 0) {\r\n points.value = transformPoints(points.value, currentScale, currentOffset);\r\n bounds.value = calculateBounds(points.value);\r\n }\r\n }\r\n\r\n /**\r\n * Reset statistics\r\n */\r\n function resetStats(): void {\r\n frameCount.value = 0;\r\n totalPointsDecoded.value = 0;\r\n avgDecodingTime.value = 0;\r\n totalDecodingTime = 0;\r\n }\r\n\r\n // Cleanup on unmount\r\n onUnmounted(() => {\r\n clear();\r\n });\r\n\r\n return {\r\n points,\r\n pointCount,\r\n bounds,\r\n hasColor,\r\n hasIntensity,\r\n format,\r\n frameCount,\r\n totalPointsDecoded,\r\n avgDecodingTime,\r\n isProcessing,\r\n error,\r\n center,\r\n decode,\r\n clear,\r\n downsample,\r\n setTransform,\r\n resetStats,\r\n };\r\n}\r\n"],"names":["DEFAULT_CONFIG","usePointCloud","config","callbacks","cfg","points","ref","pointCount","bounds","hasColor","hasIntensity","format","frameCount","totalPointsDecoded","avgDecodingTime","isProcessing","error","currentScale","currentOffset","totalDecodingTime","center","computed","decode","data","startTime","detectedFormat","detectPointCloudFormat","decodedPoints","jsonPoints","parsePointCloudJSON","text","parsePointCloudBinary","transformPoints","pointBounds","calculateBounds","hasColorData","hasIntensityData","decodingTime","result","_a","err","_b","clear","downsample","voxelSize","downsampled","downsamplePointCloud","setTransform","scale","offset","resetStats","onUnmounted"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const t=require("vue"),s=require("./utils/index.cjs"),W={format:"auto",maxPoints:1e6,scale:1,offset:{x:0,y:0,z:0},dracoDecoderPath:"/draco/",dracoPath:"/draco/",downsampleFactor:1,colorize:!0,transform:void 0};function _(N={},i={}){const u={...W,...N},r=t.ref([]),v=t.ref(0),n=t.ref({min:{x:0,y:0,z:0},max:{x:0,y:0,z:0}}),h=t.ref(!1),x=t.ref(!1),w=t.ref("auto"),d=t.ref(0),y=t.ref(0),P=t.ref(0),g=t.ref(!1),p=t.ref(null);let m=u.scale,l=u.offset,C=0;const U=t.computed(()=>({x:(n.value.min.x+n.value.max.x)/2,y:(n.value.min.y+n.value.max.y)/2,z:(n.value.min.z+n.value.max.z)/2}));async function j(o){var T,B;g.value=!0,p.value=null;const a=performance.now();try{const c=u.format==="auto"?s.detectPointCloudFormat(o):u.format;w.value=c;let e=[];if(typeof o=="string"){const f=s.parsePointCloudJSON(o);f&&(e=f)}else{try{const f=new TextDecoder().decode(o);if(f.startsWith("[")||f.startsWith("{")){const z=s.parsePointCloudJSON(f);z&&z.length>0&&(e=z)}}catch{}e.length===0&&(e=s.parsePointCloudBinary(o instanceof Uint8Array?o.buffer:o))}(m!==1||l.x!==0||l.y!==0||l.z!==0)&&(e=s.transformPoints(e,m,l)),u.maxPoints&&e.length>u.maxPoints&&(e=e.slice(0,u.maxPoints));const F=s.calculateBounds(e),S=e.length>0&&e[0].r!==void 0,E=e.length>0&&e[0].intensity!==void 0,I=performance.now()-a;r.value=e,v.value=e.length,n.value=F,h.value=S,x.value=E,d.value++,y.value+=e.length,C+=I,P.value=C/d.value;const O={points:e,bounds:F,pointCount:e.length,hasColor:S,hasIntensity:E,format:c,decodingTime:I};return(T=i.onDecoded)==null||T.call(i,O),O}catch(c){const e=c instanceof Error?c:new Error(String(c));throw p.value=e,(B=i.onError)==null||B.call(i,e),e}finally{g.value=!1}}function D(){r.value=[],v.value=0,n.value={min:{x:0,y:0,z:0},max:{x:0,y:0,z:0}},h.value=!1,x.value=!1}function q(o){if(r.value.length===0)return;const a=s.downsamplePointCloud(r.value,o);r.value=a,v.value=a.length,n.value=s.calculateBounds(a)}function A(o,a){o!==void 0&&(m=o),a!==void 0&&(l=a),r.value.length>0&&(r.value=s.transformPoints(r.value,m,l),n.value=s.calculateBounds(r.value))}function J(){d.value=0,y.value=0,P.value=0,C=0}return t.onUnmounted(()=>{D()}),{points:r,pointCount:v,bounds:n,hasColor:h,hasIntensity:x,format:w,frameCount:d,totalPointsDecoded:y,avgDecodingTime:P,isProcessing:g,error:p,center:U,decode:j,clear:D,downsample:q,setTransform:A,resetStats:J}}exports.usePointCloud=_;
2
+ //# sourceMappingURL=usePointCloud-D2csBAs8.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePointCloud-D2csBAs8.cjs","sources":["../src/composables/usePointCloud.ts"],"sourcesContent":["/**\r\n * usePointCloud - Vue 3 Point Cloud composable for streaming and decoding\r\n * @module vue-streaming/composables/usePointCloud\r\n */\r\n\r\nimport { computed, onUnmounted, ref, type Ref } from \"vue\";\r\nimport type {\r\n DecodedPointCloud,\r\n Point3D,\r\n PointCloudCallbacks,\r\n PointCloudConfig,\r\n PointCloudFormat,\r\n} from \"../types\";\r\nimport {\r\n calculateBounds,\r\n detectPointCloudFormat,\r\n downsamplePointCloud,\r\n parsePointCloudBinary,\r\n parsePointCloudJSON,\r\n transformPoints,\r\n} from \"../utils/pointcloud\";\r\n\r\nexport interface UsePointCloudReturn {\r\n /** Current points */\r\n points: Ref<Point3D[]>;\r\n /** Point count */\r\n pointCount: Ref<number>;\r\n /** Bounds */\r\n bounds: Ref<DecodedPointCloud[\"bounds\"]>;\r\n /** Has color data */\r\n hasColor: Ref<boolean>;\r\n /** Has intensity data */\r\n hasIntensity: Ref<boolean>;\r\n /** Detected format */\r\n format: Ref<PointCloudFormat>;\r\n /** Total frames decoded */\r\n frameCount: Ref<number>;\r\n /** Total points decoded */\r\n totalPointsDecoded: Ref<number>;\r\n /** Average decoding time */\r\n avgDecodingTime: Ref<number>;\r\n /** Is processing */\r\n isProcessing: Ref<boolean>;\r\n /** Last error */\r\n error: Ref<Error | null>;\r\n /** Center point (computed) */\r\n center: Ref<{ x: number; y: number; z: number }>;\r\n /** Decode point cloud data */\r\n decode: (\r\n data: ArrayBuffer | Uint8Array | string,\r\n ) => Promise<DecodedPointCloud>;\r\n /** Clear current points */\r\n clear: () => void;\r\n /** Downsample current points */\r\n downsample: (voxelSize: number) => void;\r\n /** Set transform parameters */\r\n setTransform: (\r\n scale?: number,\r\n offset?: { x: number; y: number; z: number },\r\n ) => void;\r\n /** Reset statistics */\r\n resetStats: () => void;\r\n}\r\n\r\nconst DEFAULT_CONFIG = {\r\n format: \"auto\" as const,\r\n maxPoints: 1000000,\r\n scale: 1,\r\n offset: { x: 0, y: 0, z: 0 },\r\n dracoDecoderPath: \"/draco/\",\r\n dracoPath: \"/draco/\",\r\n downsampleFactor: 1,\r\n colorize: true,\r\n transform: undefined as\r\n | undefined\r\n | {\r\n position?: { x: number; y: number; z: number };\r\n rotation?: { x: number; y: number; z: number };\r\n scale?: { x: number; y: number; z: number } | number;\r\n },\r\n};\r\n\r\n/**\r\n * Vue 3 composable for point cloud streaming and decoding\r\n *\r\n * @example\r\n * ```typescript\r\n * const {\r\n * points,\r\n * pointCount,\r\n * bounds,\r\n * center,\r\n * decode,\r\n * clear,\r\n * downsample\r\n * } = usePointCloud({\r\n * format: 'auto',\r\n * maxPoints: 500000,\r\n * scale: 0.01\r\n * }, {\r\n * onDecoded: (result) => console.log('Decoded:', result.pointCount, 'points')\r\n * })\r\n *\r\n * // Use with WebRTC\r\n * const webrtc = useWebRTC({\r\n * signalingUrl: 'http://server/webrtc/signaling'\r\n * }, {\r\n * onPointCloudData: async (data) => {\r\n * const result = await decode(data)\r\n * // Points are automatically updated in refs\r\n * }\r\n * })\r\n *\r\n * // Use in template\r\n * // <PointCloudViewer :points=\"points\" :bounds=\"bounds\" />\r\n * ```\r\n */\r\nexport function usePointCloud(\r\n config: PointCloudConfig = {},\r\n callbacks: PointCloudCallbacks = {},\r\n): UsePointCloudReturn {\r\n const cfg = { ...DEFAULT_CONFIG, ...config };\r\n\r\n // Reactive state\r\n const points = ref<Point3D[]>([]);\r\n const pointCount = ref(0);\r\n const bounds = ref<DecodedPointCloud[\"bounds\"]>({\r\n min: { x: 0, y: 0, z: 0 },\r\n max: { x: 0, y: 0, z: 0 },\r\n });\r\n const hasColor = ref(false);\r\n const hasIntensity = ref(false);\r\n const format = ref<PointCloudFormat>(\"auto\");\r\n const frameCount = ref(0);\r\n const totalPointsDecoded = ref(0);\r\n const avgDecodingTime = ref(0);\r\n const isProcessing = ref(false);\r\n const error = ref<Error | null>(null);\r\n\r\n // Transform state\r\n let currentScale = cfg.scale;\r\n let currentOffset = cfg.offset;\r\n\r\n // Stats tracking\r\n let totalDecodingTime = 0;\r\n\r\n // Computed center point\r\n const center = computed(() => ({\r\n x: (bounds.value.min.x + bounds.value.max.x) / 2,\r\n y: (bounds.value.min.y + bounds.value.max.y) / 2,\r\n z: (bounds.value.min.z + bounds.value.max.z) / 2,\r\n }));\r\n\r\n /**\r\n * Decode point cloud data\r\n */\r\n async function decode(\r\n data: ArrayBuffer | Uint8Array | string,\r\n ): Promise<DecodedPointCloud> {\r\n isProcessing.value = true;\r\n error.value = null;\r\n\r\n const startTime = performance.now();\r\n\r\n try {\r\n // Detect format\r\n const detectedFormat =\r\n cfg.format === \"auto\" ? detectPointCloudFormat(data) : cfg.format;\r\n\r\n format.value = detectedFormat;\r\n\r\n let decodedPoints: Point3D[] = [];\r\n\r\n // Parse based on format\r\n if (typeof data === \"string\") {\r\n const jsonPoints = parsePointCloudJSON(data);\r\n if (jsonPoints) {\r\n decodedPoints = jsonPoints;\r\n }\r\n } else {\r\n // Try JSON first for binary data\r\n try {\r\n const text = new TextDecoder().decode(data);\r\n if (text.startsWith(\"[\") || text.startsWith(\"{\")) {\r\n const jsonPoints = parsePointCloudJSON(text);\r\n if (jsonPoints && jsonPoints.length > 0) {\r\n decodedPoints = jsonPoints;\r\n }\r\n }\r\n } catch {\r\n // Not valid text\r\n }\r\n\r\n // Parse as binary if JSON didn't work\r\n if (decodedPoints.length === 0) {\r\n decodedPoints = parsePointCloudBinary(\r\n data instanceof Uint8Array ? data.buffer : data,\r\n );\r\n }\r\n }\r\n\r\n // Apply transformations\r\n if (\r\n currentScale !== 1 ||\r\n currentOffset.x !== 0 ||\r\n currentOffset.y !== 0 ||\r\n currentOffset.z !== 0\r\n ) {\r\n decodedPoints = transformPoints(\r\n decodedPoints,\r\n currentScale,\r\n currentOffset,\r\n );\r\n }\r\n\r\n // Limit points if needed\r\n if (cfg.maxPoints && decodedPoints.length > cfg.maxPoints) {\r\n decodedPoints = decodedPoints.slice(0, cfg.maxPoints);\r\n }\r\n\r\n // Calculate bounds and detect features\r\n const pointBounds = calculateBounds(decodedPoints);\r\n const hasColorData =\r\n decodedPoints.length > 0 && decodedPoints[0].r !== undefined;\r\n const hasIntensityData =\r\n decodedPoints.length > 0 && decodedPoints[0].intensity !== undefined;\r\n\r\n const decodingTime = performance.now() - startTime;\r\n\r\n // Update state\r\n points.value = decodedPoints;\r\n pointCount.value = decodedPoints.length;\r\n bounds.value = pointBounds;\r\n hasColor.value = hasColorData;\r\n hasIntensity.value = hasIntensityData;\r\n\r\n // Update stats\r\n frameCount.value++;\r\n totalPointsDecoded.value += decodedPoints.length;\r\n totalDecodingTime += decodingTime;\r\n avgDecodingTime.value = totalDecodingTime / frameCount.value;\r\n\r\n const result: DecodedPointCloud = {\r\n points: decodedPoints,\r\n bounds: pointBounds,\r\n pointCount: decodedPoints.length,\r\n hasColor: hasColorData,\r\n hasIntensity: hasIntensityData,\r\n format: detectedFormat,\r\n decodingTime,\r\n };\r\n\r\n callbacks.onDecoded?.(result);\r\n return result;\r\n } catch (err) {\r\n const e = err instanceof Error ? err : new Error(String(err));\r\n error.value = e;\r\n callbacks.onError?.(e);\r\n throw e;\r\n } finally {\r\n isProcessing.value = false;\r\n }\r\n }\r\n\r\n /**\r\n * Clear current points\r\n */\r\n function clear(): void {\r\n points.value = [];\r\n pointCount.value = 0;\r\n bounds.value = {\r\n min: { x: 0, y: 0, z: 0 },\r\n max: { x: 0, y: 0, z: 0 },\r\n };\r\n hasColor.value = false;\r\n hasIntensity.value = false;\r\n }\r\n\r\n /**\r\n * Downsample current points using voxel grid\r\n */\r\n function downsample(voxelSize: number): void {\r\n if (points.value.length === 0) return;\r\n\r\n const downsampled = downsamplePointCloud(points.value, voxelSize);\r\n points.value = downsampled;\r\n pointCount.value = downsampled.length;\r\n bounds.value = calculateBounds(downsampled);\r\n }\r\n\r\n /**\r\n * Set transform parameters\r\n */\r\n function setTransform(\r\n scale?: number,\r\n offset?: { x: number; y: number; z: number },\r\n ): void {\r\n if (scale !== undefined) currentScale = scale;\r\n if (offset !== undefined) currentOffset = offset;\r\n\r\n // Re-apply transform to current points if any\r\n if (points.value.length > 0) {\r\n points.value = transformPoints(points.value, currentScale, currentOffset);\r\n bounds.value = calculateBounds(points.value);\r\n }\r\n }\r\n\r\n /**\r\n * Reset statistics\r\n */\r\n function resetStats(): void {\r\n frameCount.value = 0;\r\n totalPointsDecoded.value = 0;\r\n avgDecodingTime.value = 0;\r\n totalDecodingTime = 0;\r\n }\r\n\r\n // Cleanup on unmount\r\n onUnmounted(() => {\r\n clear();\r\n });\r\n\r\n return {\r\n points,\r\n pointCount,\r\n bounds,\r\n hasColor,\r\n hasIntensity,\r\n format,\r\n frameCount,\r\n totalPointsDecoded,\r\n avgDecodingTime,\r\n isProcessing,\r\n error,\r\n center,\r\n decode,\r\n clear,\r\n downsample,\r\n setTransform,\r\n resetStats,\r\n };\r\n}\r\n"],"names":["DEFAULT_CONFIG","usePointCloud","config","callbacks","cfg","points","ref","pointCount","bounds","hasColor","hasIntensity","format","frameCount","totalPointsDecoded","avgDecodingTime","isProcessing","error","currentScale","currentOffset","totalDecodingTime","center","computed","decode","data","startTime","detectedFormat","detectPointCloudFormat","decodedPoints","jsonPoints","parsePointCloudJSON","text","parsePointCloudBinary","transformPoints","pointBounds","calculateBounds","hasColorData","hasIntensityData","decodingTime","result","_a","err","_b","clear","downsample","voxelSize","downsampled","downsamplePointCloud","setTransform","scale","offset","resetStats","onUnmounted"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ "use strict";var q=Object.create;var J=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var Y=(D,e,n,v)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of V(e))!X.call(D,a)&&a!==n&&J(D,a,{get:()=>e[a],enumerable:!(v=K(e,a))||v.enumerable});return D};var G=(D,e,n)=>(n=D!=null?q(Q(D)):{},Y(e||!D||!D.__esModule?J(n,"default",{value:D,enumerable:!0}):n,D));const d=require("vue"),_=require("./utils/index.cjs"),Z={autoPlay:!0,startLevel:-1,lowLatencyMode:!1,maxBufferLength:30,maxMaxBufferLength:600,enableWorker:!0,startPosition:-1,hlsConfig:{}};function b(D,e={}){const n={...Z,...D},v=d.ref("idle"),a=d.ref(!1),l=d.ref(!1),c=d.ref([]),P=d.ref(-1),m=d.ref(!0),p=d.ref(0),u=d.ref(0),y=d.ref(0),w=d.ref(1),C=d.ref(!1),x=d.ref({bandwidth:0,currentLevel:-1,bufferedDuration:0,droppedFrames:0,latency:0}),I=d.ref(null),M=d.ref(!1);let S=null,L=null,h=null,T=null;async function t(){if(L)return L;try{const g=await import("hls.js");return L=g.default||g,M.value=L.isSupported(),L}catch{return console.error("[useHLS] hls.js not installed. Run: npm install hls.js"),null}}function s(){if(h&&(p.value=h.currentTime,u.value=h.duration||0,h.buffered.length>0)){const g=h.buffered.end(h.buffered.length-1);y.value=u.value>0?g/u.value*100:0,x.value.bufferedDuration=g-h.currentTime}}function r(g){g.onplay=()=>{var E;a.value=!0,v.value="playing",(E=e.onPlaybackStarted)==null||E.call(e)},g.onpause=()=>{a.value=!1,v.value="paused"},g.onended=()=>{var E;a.value=!1,v.value="ended",(E=e.onPlaybackEnded)==null||E.call(e)},g.onwaiting=()=>{var E;l.value=!0,v.value="buffering",(E=e.onBuffering)==null||E.call(e,!0)},g.onplaying=()=>{var E;l.value=!1,v.value==="buffering"&&(v.value="playing"),(E=e.onBuffering)==null||E.call(e,!1)},g.onseeking=()=>{v.value="seeking"},g.onseeked=()=>{v.value=a.value?"playing":"paused"},g.onvolumechange=()=>{w.value=g.volume,C.value=g.muted},g.onerror=()=>{var B,H;const E=new Error(((B=g.error)==null?void 0:B.message)||"Video playback error");I.value=E,v.value="error",(H=e.onError)==null||H.call(e,E,!0)},T=setInterval(s,250)}function i(){!S||!L||(S.on(L.Events.MANIFEST_PARSED,(g,E)=>{var B;c.value=E.levels.map((H,z)=>({index:z,bitrate:H.bitrate,width:H.width,height:H.height,codec:H.codec,name:`${H.height}p`})),v.value="loaded",(B=e.onManifestLoaded)==null||B.call(e,c.value)}),S.on(L.Events.LEVEL_SWITCHED,(g,E)=>{var B;P.value=E.level,x.value.currentLevel=E.level,(B=e.onLevelSwitched)==null||B.call(e,E.level)}),S.on(L.Events.FRAG_LOADED,(g,E)=>{x.value.bandwidth=E.frag.duration*8*1e6/(E.stats.loading.end-E.stats.loading.start)}),S.on(L.Events.ERROR,(g,E)=>{var H;const B=new Error(`HLS Error: ${E.type} - ${E.details}`);I.value=B,E.fatal&&(v.value="error",E.type===L.ErrorTypes.MEDIA_ERROR&&(S==null||S.recoverMediaError())),(H=e.onError)==null||H.call(e,B,E.fatal)}))}async function o(g){const E=await t();if(!E)throw new Error("HLS.js is not available");if(!E.isSupported()){if(g.canPlayType("application/vnd.apple.mpegurl")){g.src=n.url,h=g,r(g),v.value="loaded",n.autoPlay&&await N();return}throw new Error("HLS is not supported in this browser")}h=g,v.value="loading",S=new E({startLevel:n.startLevel,lowLatencyMode:n.lowLatencyMode,maxBufferLength:n.maxBufferLength,enableWorker:n.enableWorker,startPosition:n.startPosition}),i(),r(g),S.loadSource(n.url),S.attachMedia(g),n.autoPlay&&S.on(E.Events.MANIFEST_PARSED,()=>{N()})}function f(){S&&S.detachMedia(),T&&(clearInterval(T),T=null),h=null}function A(g){const E=g||n.url;S?S.loadSource(E):h&&(h.src=E),v.value="loading"}async function N(){if(!h)throw new Error("No video element attached");try{await h.play()}catch(g){if(g.name==="NotAllowedError")C.value=!0,h.muted=!0,await h.play();else throw g}}function O(){h==null||h.pause()}function R(){S&&S.stopLoad(),h&&(h.pause(),h.currentTime=0),a.value=!1,v.value="idle"}function F(g){h&&(h.currentTime=g)}function W(g){S&&(S.currentLevel=g,m.value=g===-1)}function U(g){h&&(h.volume=Math.max(0,Math.min(1,g)))}function j(){h&&(h.muted=!h.muted)}function $(){T&&(clearInterval(T),T=null),S&&(S.destroy(),S=null),h=null,v.value="idle",c.value=[],P.value=-1}return d.onUnmounted(()=>{$()}),{state:v,isPlaying:a,isBuffering:l,levels:c,currentLevel:P,autoLevelEnabled:m,currentTime:p,duration:u,buffered:y,volume:w,muted:C,stats:x,error:I,isSupported:M,attach:o,detach:f,load:A,play:N,pause:O,stop:R,seek:F,setLevel:W,setVolume:U,toggleMute:j,destroy:$}}const k={iceServers:[{urls:"stun:stun.l.google.com:19302"}],iceGatheringTimeout:2e3,enablePointCloud:!0,enableDetections:!0,autoReconnect:!0,maxReconnectAttempts:5,reconnectDelay:3e3};function ee(D,e){return new Promise(n=>{if(D.iceGatheringState==="complete"){n();return}const v=setTimeout(()=>{n()},e);D.onicegatheringstatechange=()=>{D.iceGatheringState==="complete"&&(clearTimeout(v),n())}})}function ne(D,e={}){const n={...k,...D},v=d.ref(!1),a=d.ref("idle"),l=d.ref(new Map),c=d.ref(null),P=d.ref(null),m=d.ref([]),p=d.ref(null);let u=null,y=null,w=null,C=null,x=0,I=null;function M(o,f){if(!y||y.readyState!=="open")return;const A={type:"control",stream:o,enabled:f};y.send(JSON.stringify(A))}function S(o,f){const A=l.value.get(o);if(!A||A.readyState!=="open")return console.warn(`[useWebRTC] Channel ${o} not available`),!1;try{return A.send(f),!0}catch(N){return console.error(`[useWebRTC] Send error on ${o}:`,N),!1}}function L(o){var f;switch(l.value.set(o.label,o),(f=e.onDataChannel)==null||f.call(e,o),o.label){case"pointcloud":h(o);break;case"pointcloud_b":case"bbox":case"bounding_boxes":case"detections":T(o);break}}function h(o){w=o,w.binaryType="arraybuffer",w.onopen=()=>{var f;(f=e.onStatus)==null||f.call(e,"Pointcloud channel open"),n.enablePointCloud&&M("pointcloud",!0)},w.onmessage=f=>{var A,N;try{let O=[];if(f.data instanceof ArrayBuffer&&f.data.byteLength>0){const R=f.data;(A=e.onPointCloudData)==null||A.call(e,R);try{const F=new TextDecoder().decode(R);if(F.startsWith("[")||F.startsWith("{")){const W=_.parsePointCloudJSON(F);W&&W.length>0&&(O=W)}}catch{}O.length===0&&(O=_.parsePointCloudBinary(R))}else if(typeof f.data=="string"){const R=_.parsePointCloudJSON(f.data);R&&(O=R)}if(O.length>0){const R={points:O,timestamp:Date.now(),format:"parsed"};c.value=R,(N=e.onPointCloudFrame)==null||N.call(e,R)}}catch(O){console.error("[useWebRTC] Error parsing pointcloud data:",O)}},w.onerror=f=>{var A;console.error("[useWebRTC] Pointcloud channel error:",f),(A=e.onStatus)==null||A.call(e,"Pointcloud channel error")},w.onclose=()=>{var f;(f=e.onStatus)==null||f.call(e,"Pointcloud channel closed")}}function T(o){C=o,C.binaryType="arraybuffer",C.onopen=()=>{var f;(f=e.onStatus)==null||f.call(e,"BBox channel open"),n.enableDetections&&M("bbox",!0)},C.onmessage=f=>{var A,N;try{let O;if(typeof f.data=="string")O=JSON.parse(f.data);else if(f.data instanceof ArrayBuffer){const R=new TextDecoder().decode(f.data);try{O=JSON.parse(R)}catch{return}}else return;if(Array.isArray(O)){let R;if(O.length>0&&Array.isArray(O[0])&&typeof O[0][0]=="number"?R=_.parseArrayBboxFormat(O):R=_.normalizeBboxes(O),R.length>0){m.value=R,(A=e.onBoundingBoxData)==null||A.call(e,R);const F=_.bboxesToDetectionFrame(R);P.value=F,(N=e.onDetectionFrame)==null||N.call(e,F)}}}catch(O){console.error("[useWebRTC] Error parsing bbox data:",O)}},C.onerror=f=>{console.error("[useWebRTC] BBox channel error:",f)},C.onclose=()=>{var f;(f=e.onStatus)==null||f.call(e,"BBox channel closed")}}async function t(){var o,f,A,N,O,R;if(!v.value){(o=e.onStatus)==null||o.call(e,"Creating WebRTC connection..."),a.value="connecting",p.value=null;try{u&&(u.close(),u=null),u=new RTCPeerConnection({iceServers:n.iceServers}),u.onconnectionstatechange=()=>{var g,E;const $=(u==null?void 0:u.connectionState)??"closed";if(a.value=$,(g=e.onConnectionState)==null||g.call(e,$),$==="failed"||$==="disconnected"){const B=new Error(`Connection ${$}`);p.value=B,(E=e.onError)==null||E.call(e,B),n.autoReconnect&&x<n.maxReconnectAttempts&&r()}$==="connected"&&(x=0)},u.ondatachannel=$=>{L($.channel)},y=u.createDataChannel("control"),y.onopen=()=>{var $;($=e.onStatus)==null||$.call(e,"Control channel open"),l.value.set("control",y)};const F=await u.createOffer();await u.setLocalDescription(F),await ee(u,n.iceGatheringTimeout);const W=((f=u.localDescription)==null?void 0:f.sdp)??"";if(!W)throw new Error("Empty SDP offer");const U=await fetch(n.signalingUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({offer:W})});if(!U.ok)throw new Error(`Signaling failed: HTTP ${U.status}`);const j=await U.json();if(!j.answer)throw new Error("No answer SDP in response");await u.setRemoteDescription({type:"answer",sdp:j.answer}),v.value=!0,(A=e.onStatus)==null||A.call(e,"Connected, waiting for data..."),(N=e.onConnectionState)==null||N.call(e,u.connectionState)}catch(F){const W=F instanceof Error?F:new Error(String(F));p.value=W,a.value="error",(O=e.onStatus)==null||O.call(e,`Error: ${W.message}`),(R=e.onError)==null||R.call(e,W),s(),n.autoReconnect&&x<n.maxReconnectAttempts&&r()}}}function s(){var o,f;v.value=!1,a.value="closed",(o=e.onStatus)==null||o.call(e,"Stopped"),(f=e.onConnectionState)==null||f.call(e,"closed"),I&&(clearTimeout(I),I=null),l.value.forEach(A=>A.close()),l.value.clear(),y=null,w=null,C=null,u&&(u.close(),u=null)}function r(){var o;I||(x++,(o=e.onStatus)==null||o.call(e,`Reconnecting in ${n.reconnectDelay/1e3}s (attempt ${x}/${n.maxReconnectAttempts})...`),I=setTimeout(()=>{I=null,t()},n.reconnectDelay))}function i(){return u}return d.onUnmounted(()=>{s()}),{isRunning:v,connectionState:a,dataChannels:l,lastPointCloudFrame:c,lastDetectionFrame:P,lastBoundingBoxes:m,error:p,start:t,stop:s,sendControl:M,sendOnChannel:S,getPeerConnection:i}}const te={transform:D=>D,filter:()=>!0,bufferSize:100,throttleMs:0,flushInterval:0,deduplicate:!1,dedupeKey:null,deduplicateKey:null,batchSize:0,batchTimeoutMs:0};function re(D={},e={}){const n={...te,...D},v=d.ref(null),a=d.ref([]),l=d.ref(n.bufferSize),c=d.ref(!1),P=d.ref(0),m=d.ref(0),p=d.ref(null),u=new Set,y=new Set;let w=0,C=null,x=null,I=[];function M(){C||(C=setInterval(()=>{P.value=w,w=0},1e3))}function S(){C&&(clearInterval(C),C=null),P.value=0}function L(){!n.flushInterval||n.flushInterval<=0||x||(x=setInterval(()=>{var f;I.length>0&&((f=e.onBatch)==null||f.call(e,I),I=[])},n.flushInterval))}function h(){var f;x&&(clearInterval(x),x=null),I.length>0&&((f=e.onBatch)==null||f.call(e,I),I=[])}function T(){c.value||(c.value=!0,M(),L())}function t(){c.value=!1,S(),h()}function s(f){var A,N,O;if(c.value)try{const R=n.transform(f);if(n.deduplicate){const F=n.dedupeKey(R);if(F&&y.has(F))return;F&&(y.add(F),y.size>n.bufferSize*2&&Array.from(y).slice(0,n.bufferSize).forEach(U=>y.delete(U)))}v.value=R,m.value++,w++,a.value=[...a.value,R].slice(-n.bufferSize),a.value.length>=n.bufferSize&&((A=e.onBufferFull)==null||A.call(e)),n.flushInterval&&n.flushInterval>0&&I.push(R),(N=e.onData)==null||N.call(e,R),u.forEach(F=>F(R))}catch(R){const F=R instanceof Error?R:new Error(String(R));p.value=F,(O=e.onError)==null||O.call(e,F)}}function r(){v.value=null,a.value=[],y.clear(),m.value=0,I=[]}function i(){return[...a.value]}function o(f){return u.add(f),()=>{u.delete(f)}}return d.onUnmounted(()=>{t(),u.clear(),r()}),{data:v,buffer:a,bufferSize:l,isStreaming:c,itemsPerSecond:P,totalItems:m,error:p,start:T,stop:t,push:s,clear:r,getBuffer:i,subscribe:o}}const oe={method:"GET",headers:{},credentials:"same-origin",autoConnect:!0,autoReconnect:!0,maxReconnectAttempts:5,reconnectDelay:1e3,maxReconnectDelay:3e4,ndjson:!0};function ue(D,e={}){const n={...oe,...D},v=d.ref(!1),a=d.ref(!1),l=d.ref("disconnected"),c=d.ref(null),P=d.ref([]),m=d.ref(0),p=d.ref(null),u=d.ref(0);let y=null,w=!1;const C=_.createReconnectManager({maxAttempts:n.maxReconnectAttempts,delay:n.reconnectDelay,delayMax:n.maxReconnectDelay,onAttempt:(h,T)=>{var t;u.value=h,l.value="reconnecting",(t=e.onReconnecting)==null||t.call(e,h,T)},onSuccess:()=>{var h;u.value=0,(h=e.onReconnected)==null||h.call(e)},onFailure:()=>{var h;l.value="failed",(h=e.onReconnectFailed)==null||h.call(e)}});function x(h){const T=h.trim();if(!T)return null;try{return JSON.parse(T)}catch{return T}}function I(h){var t,s;if(!h)return;let T;if(n.parseChunk)T=n.parseChunk(h);else if(n.ndjson){const r=h.split(`
2
+ `);for(const i of r){const o=x(i);o!==null&&(c.value=o,P.value.push(o),(t=e.onChunk)==null||t.call(e,o,i))}return}else T=h;T!=null&&(c.value=T,P.value.push(T),(s=e.onChunk)==null||s.call(e,T,h))}async function M(){var h,T,t,s;if(!a.value){w=!1,l.value="connecting",p.value=null,y=new AbortController;try{const r={method:n.method,headers:{Accept:"text/event-stream, application/x-ndjson, application/json, text/plain",...n.headers},credentials:n.credentials,signal:y.signal};n.body&&["POST","PUT","PATCH"].includes(n.method)&&(r.body=typeof n.body=="string"?n.body:JSON.stringify(n.body));const i=await fetch(n.url,r);if(!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);if(!i.body)throw new Error("Response body is not readable");v.value=!0,a.value=!0,l.value="connected",(h=e.onOpen)==null||h.call(e);const o=i.body.getReader(),f=new TextDecoder;let A="";for(;;){const{done:N,value:O}=await o.read();if(N){A&&I(A);break}const R=f.decode(O,{stream:!0});m.value+=O.length,(T=e.onProgress)==null||T.call(e,m.value),A+=R;const F=A.lastIndexOf(`
3
+ `);if(F!==-1){const W=A.slice(0,F);A=A.slice(F+1),I(W)}}a.value=!1,l.value="disconnected",(t=e.onComplete)==null||t.call(e)}catch(r){if(r.name==="AbortError")return;p.value=r,v.value=!1,a.value=!1,l.value="error",(s=e.onError)==null||s.call(e,r),!w&&n.autoReconnect&&C.scheduleReconnect(async()=>{try{return await M(),!0}catch{return!1}})}}}function S(){w=!0,C.cancel(),y&&(y.abort(),y=null),v.value=!1,a.value=!1,l.value="disconnected"}function L(){P.value=[],c.value=null,m.value=0}return n.autoConnect&&M(),d.onUnmounted(()=>{S()}),{isConnected:v,isStreaming:a,connectionState:l,lastChunk:c,chunks:P,bytesReceived:m,error:p,reconnectAttempts:u,connect:M,disconnect:S,clearChunks:L}}const ie={broadcaster:"pusher",wsPort:6001,wssPort:6001,forceTLS:!1,disableStats:!1,cluster:"mt1",authEndpoint:"/broadcasting/auth",authHeaders:{},auth:{headers:{}},enabledTransports:["ws","wss"],options:{}};function fe(D,e={}){const n={...ie,...D},v=d.ref(!1),a=d.ref("idle"),l=d.ref(null),c=d.ref([]),P=d.ref(null);let m=null;async function p(){if(m)return m;try{const[{default:t},{default:s}]=await Promise.all([import("laravel-echo"),import("pusher-js")]);return window.Pusher=s,m=new t({broadcaster:"pusher",key:n.key,wsHost:n.wsHost,wsPort:n.wsPort,wssPort:n.wssPort,forceTLS:n.forceTLS,cluster:n.cluster,authEndpoint:n.authEndpoint,auth:{headers:n.authHeaders},enabledTransports:n.enabledTransports,disableStats:!0}),m}catch{throw new Error("laravel-echo and/or pusher-js not installed. Run: npm install laravel-echo pusher-js")}}function u(t,s){var i;c.value.find(o=>o.name===t)||(c.value=[...c.value,{name:t,type:s,subscribedAt:new Date}],(i=e.onSubscribed)==null||i.call(e,t))}function y(t){c.value=c.value.filter(s=>s.name!==t)}async function w(){var t;a.value="connecting",P.value=null;try{const r=(await p()).connector.pusher;r.connection.bind("connected",()=>{var i;v.value=!0,a.value="connected",l.value=r.connection.socket_id||null,(i=e.onConnected)==null||i.call(e,l.value||"")}),r.connection.bind("disconnected",()=>{var i;v.value=!1,a.value="disconnected",l.value=null,(i=e.onDisconnected)==null||i.call(e)}),r.connection.bind("error",i=>{var o;P.value=i,a.value="error",(o=e.onError)==null||o.call(e,i)}),r.connection.state==="connected"&&(v.value=!0,a.value="connected",l.value=r.connection.socket_id||null,(t=e.onConnected)==null||t.call(e,l.value||""))}catch(s){const r=s instanceof Error?s:new Error(String(s));throw P.value=r,a.value="error",r}}function C(){m&&(m.disconnect(),m=null),v.value=!1,a.value="closed",l.value=null,c.value=[]}function x(t,s){return{listen(r,i){return t.bind(r.startsWith(".")?r:`.${r}`,i),this},stopListening(r,i){return t.unbind(r.startsWith(".")?r:`.${r}`,i),this},listenForWhisper(r,i){return t.bind(`client-${r}`,i),this},whisper(r,i){return t.trigger(`client-${r}`,i),this}}}function I(t,s){return{...x(t),here(i){return t.here(i),this},joining(i){return t.joining(o=>{var f;(f=e.onMemberJoined)==null||f.call(e,s,o),i(o)}),this},leaving(i){return t.leaving(o=>{var f;(f=e.onMemberLeft)==null||f.call(e,s,o),i(o)}),this}}}function M(t){if(!m)throw new Error("Echo not connected. Call connect() first.");const s=m.channel(t);return u(t,"public"),x(s)}function S(t){if(!m)throw new Error("Echo not connected. Call connect() first.");const s=m.private(t);return u(`private-${t}`,"private"),x(s)}function L(t){if(!m)throw new Error("Echo not connected. Call connect() first.");const s=m.join(t);return u(`presence-${t}`,"presence"),I(s,t)}function h(t){m&&(m.leaveChannel(t),y(t),y(`private-${t}`),y(`presence-${t}`))}function T(){[...c.value.map(s=>s.name)].forEach(s=>h(s))}return d.onUnmounted(()=>{C()}),{isConnected:v,connectionState:a,socketId:l,channels:c,error:P,connect:w,disconnect:C,channel:M,privateChannel:S,presenceChannel:L,leave:h,leaveAll:T}}const se={method:"GET",headers:{},credentials:"same-origin",interval:0,timeout:3e4,autoStart:!0,autoRestart:!0,maxRestartAttempts:5,restartDelay:1e3,maxRestartDelay:3e4,includeTimestamp:!1,timestampParam:"since"};function ae(D,e={}){const n={...se,...D},v=d.ref(!1),a=d.ref("disconnected"),l=d.ref(null),c=d.ref([]),P=d.ref(0),m=d.ref(null),p=d.ref(0);let u=null,y=null,w=!1,C=null;const x=_.createReconnectManager({maxAttempts:n.maxRestartAttempts,delay:n.restartDelay,delayMax:n.maxRestartDelay,onAttempt:(r,i)=>{var o;p.value=r,a.value="reconnecting",(o=e.onRestarting)==null||o.call(e,r,i)},onSuccess:()=>{var r;p.value=0,(r=e.onRestarted)==null||r.call(e)},onFailure:()=>{var r;a.value="failed",(r=e.onRestartFailed)==null||r.call(e)}});function I(){if(!n.includeTimestamp||!C)return n.url;const r=new URL(n.url);return r.searchParams.set(n.timestampParam,C.toString()),r.toString()}async function M(){u=new AbortController;const r=setTimeout(()=>{u==null||u.abort()},n.timeout);try{const i={method:n.method,headers:{Accept:"application/json",...n.headers},credentials:n.credentials,signal:u.signal};n.body&&n.method==="POST"&&(i.body=typeof n.body=="string"?n.body:JSON.stringify(n.body),i.headers={...i.headers,"Content-Type":"application/json"});const o=await fetch(I(),i);if(clearTimeout(r),!o.ok)throw new Error(`HTTP ${o.status}: ${o.statusText}`);return await o.json()}catch(i){throw clearTimeout(r),i}}async function S(){var r,i;for(;v.value&&!w;)try{P.value++;const o=await M();C=Date.now(),l.value=o,c.value.push(o),m.value=null,(r=e.onData)==null||r.call(e,o),n.interval>0&&v.value&&!w&&await new Promise(f=>{y=setTimeout(f,n.interval)})}catch(o){if(o.name==="AbortError"){if(w)break;continue}if(m.value=o,(i=e.onError)==null||i.call(e,o),!w&&n.autoRestart){v.value=!1,a.value="error",x.scheduleReconnect(async()=>{try{return await L(),!0}catch{return!1}});return}break}w||(v.value=!1,a.value="disconnected")}async function L(){var r;v.value||(w=!1,v.value=!0,a.value="connected",m.value=null,(r=e.onStart)==null||r.call(e),S())}function h(){L()}function T(){var r;w=!0,x.cancel(),y&&(clearTimeout(y),y=null),u&&(u.abort(),u=null),v.value=!1,a.value="disconnected",(r=e.onStop)==null||r.call(e)}async function t(){var i,o;const r=v.value;y&&(clearTimeout(y),y=null);try{const f=await M();C=Date.now(),l.value=f,c.value.push(f),(i=e.onData)==null||i.call(e,f)}catch(f){f.name!=="AbortError"&&(m.value=f,(o=e.onError)==null||o.call(e,f))}r&&!w&&S()}function s(){c.value=[],l.value=null,P.value=0}return n.autoStart&&h(),d.onUnmounted(()=>{T()}),{isPolling:v,connectionState:a,lastData:l,dataHistory:c,requestCount:P,error:m,restartAttempts:p,start:h,stop:T,poll:t,clearHistory:s}}const de={path:"/socket.io",namespace:"/",reconnection:!0,reconnectionAttempts:5,reconnectionDelay:1e3,transports:["websocket","polling"],extraHeaders:{},options:{},autoConnect:!0,autoReconnect:!0,maxReconnectAttempts:5,reconnectDelay:1e3};function ve(D,e={}){const n={...de,...D},v=d.ref(!1),a=d.ref("idle"),l=d.ref(null),c=d.ref([]),P=d.ref(0),m=d.ref(null);let p=null,u=null;async function y(){if(u)return u;try{const t=await import("socket.io-client");return u=t.io||t.default,u}catch{throw new Error("socket.io-client is not installed. Run: npm install socket.io-client")}}async function w(){if(!(p!=null&&p.connected))return a.value="connecting",m.value=null,new Promise(async(t,s)=>{try{const r=await y();if(!r)throw new Error("Socket.IO client not available");const i=n.namespace==="/"?n.url:`${n.url}${n.namespace}`;p=r(i,{path:n.path,auth:n.auth,reconnection:n.reconnection,reconnectionAttempts:n.reconnectionAttempts,reconnectionDelay:n.reconnectionDelay,transports:n.transports,extraHeaders:n.extraHeaders}),p.on("connect",()=>{var o;v.value=!0,a.value="connected",l.value=(p==null?void 0:p.id)||null,P.value=0,(o=e.onConnect)==null||o.call(e,l.value||""),t()}),p.on("disconnect",o=>{var f;v.value=!1,a.value="disconnected",l.value=null,(f=e.onDisconnect)==null||f.call(e,o)}),p.on("connect_error",o=>{var f;m.value=o,a.value="error",(f=e.onError)==null||f.call(e,o),s(o)}),p.io.on("reconnect_attempt",o=>{var f;P.value=o,a.value="reconnecting",(f=e.onReconnecting)==null||f.call(e,o)}),p.io.on("reconnect_failed",()=>{var o;a.value="error",(o=e.onReconnectFailed)==null||o.call(e)}),p.connect()}catch(r){const i=r instanceof Error?r:new Error(String(r));m.value=i,a.value="error",s(i)}})}function C(){p&&(p.disconnect(),p=null),v.value=!1,a.value="closed",l.value=null,c.value=[]}function x(t,s){if(!(p!=null&&p.connected)){console.warn("[useSocketIO] Cannot emit: Socket is not connected");return}p.emit(t,s)}function I(t,s,r=5e3){return new Promise((i,o)=>{if(!(p!=null&&p.connected)){o(new Error("Socket is not connected"));return}const f=setTimeout(()=>{o(new Error(`Emit timeout for event: ${t}`))},r);p.emit(t,s,A=>{clearTimeout(f),i(A)})})}function M(t,s){if(!p){console.warn("[useSocketIO] Cannot listen: Socket not initialized");return}p.on(t,s)}function S(t,s){p&&p.off(t,s)}async function L(t){if(!(p!=null&&p.connected))throw new Error("Socket is not connected");return new Promise((s,r)=>{p.emit("join",t,i=>{if(i!=null&&i.error)r(new Error(i.error));else{const o={name:t,joinedAt:new Date};c.value=[...c.value,o],s()}}),setTimeout(s,1e3)})}async function h(t){if(p!=null&&p.connected)return new Promise(s=>{p.emit("leave",t,()=>{c.value=c.value.filter(r=>r.name!==t),s()}),setTimeout(()=>{c.value=c.value.filter(r=>r.name!==t),s()},1e3)})}function T(){return p}return d.onUnmounted(()=>{C()}),{isConnected:v,connectionState:a,socketId:l,rooms:c,reconnectAttempts:P,error:m,connect:w,disconnect:C,emit:x,emitWithAck:I,on:M,off:S,join:L,leave:h,getSocket:T}}const pe={withCredentials:!1,autoConnect:!0,autoReconnect:!0,maxReconnectAttempts:5,reconnectDelay:1e3,maxReconnectDelay:3e4,eventTypes:["message"]};function he(D,e={}){const n={...pe,...D},v=d.ref(!1),a=d.ref("disconnected"),l=d.ref(null),c=d.ref(""),P=d.ref(null),m=d.ref(null),p=d.ref(0);let u=null,y=!1;const w=new Map,C=_.createReconnectManager({maxAttempts:n.maxReconnectAttempts,delay:n.reconnectDelay,delayMax:n.maxReconnectDelay,onAttempt:(t,s)=>{var r;p.value=t,a.value="reconnecting",(r=e.onReconnecting)==null||r.call(e,t,s)},onSuccess:()=>{var t;p.value=0,(t=e.onReconnected)==null||t.call(e)},onFailure:()=>{var t;a.value="failed",(t=e.onReconnectFailed)==null||t.call(e)}});function x(t){var s,r;try{let i;try{i=JSON.parse(t.data)}catch{i=t.data}l.value=i,c.value=t.type||"message",P.value=t.lastEventId||null,(s=e.onMessage)==null||s.call(e,i,t),(r=e.onEvent)==null||r.call(e,t.type||"message",i,t);const o=w.get(t.type||"message");o&&o.forEach(f=>f(i))}catch(i){console.error("[useSSE] Error processing message:",i)}}function I(){var t;v.value=!0,a.value="connected",m.value=null,C.reset(),(t=e.onOpen)==null||t.call(e)}function M(t){var s;m.value=t,(s=e.onError)==null||s.call(e,t),(u==null?void 0:u.readyState)===EventSource.CLOSED&&(v.value=!1,a.value="error",!y&&n.autoReconnect&&C.scheduleReconnect(async()=>{try{return S(),!0}catch{return!1}}))}function S(){var t;if(!(u&&u.readyState!==EventSource.CLOSED)){y=!1,a.value="connecting";try{u=new EventSource(n.url,{withCredentials:n.withCredentials}),u.onmessage=x,u.onopen=I,u.onerror=M,n.eventTypes.forEach(s=>{s!=="message"&&u&&u.addEventListener(s,x)})}catch(s){a.value="error",m.value=s,(t=e.onError)==null||t.call(e,s)}}}function L(){y=!0,C.cancel(),u&&(u.close(),u=null),v.value=!1,a.value="disconnected"}function h(t,s){w.has(t)||(w.set(t,new Set),u&&t!=="message"&&u.addEventListener(t,x)),w.get(t).add(s)}function T(t,s){const r=w.get(t);r&&(r.delete(s),r.size===0&&w.delete(t))}return n.autoConnect&&S(),d.onUnmounted(()=>{L(),w.clear()}),{isConnected:v,connectionState:a,lastMessage:l,lastEventType:c,lastEventId:P,error:m,reconnectAttempts:p,connect:S,disconnect:L,addEventListener:h,removeEventListener:T}}const me={autoReconnect:!0,maxReconnectAttempts:5,reconnectDelay:1e3,reconnectDelayMax:3e4,pingInterval:0,binaryType:"arraybuffer"};function le(D,e={}){const n={...me,...D},v=d.ref(!1),a=d.ref("idle"),l=d.ref(WebSocket.CLOSED),c=d.ref(0),P=d.ref(null),m=d.ref(null),p=d.ref(0);let u=null,y=null,w=!1;const C=_.createReconnectManager({maxAttempts:n.maxReconnectAttempts,delay:n.reconnectDelay,delayMax:n.reconnectDelayMax,onAttempt:(t,s)=>{var r;p.value=t,a.value="reconnecting",(r=e.onReconnecting)==null||r.call(e,t,s)},onSuccess:()=>{p.value=0},onFailure:()=>{var t;a.value="error",(t=e.onReconnectFailed)==null||t.call(e)}});function x(){!n.pingInterval||n.pingInterval<=0||(y=setInterval(()=>{u&&u.readyState===WebSocket.OPEN&&u.send(JSON.stringify({type:"ping",timestamp:Date.now()}))},n.pingInterval))}function I(){y&&(clearInterval(y),y=null)}function M(){u&&(c.value=u.bufferedAmount)}async function S(){if(!(u&&u.readyState===WebSocket.OPEN))return w=!1,a.value="connecting",m.value=null,new Promise((t,s)=>{try{u=new WebSocket(n.url,n.protocols),u.binaryType=n.binaryType,u.onopen=()=>{var r;v.value=!0,a.value="connected",l.value=WebSocket.OPEN,C.reset(),p.value=0,x(),(r=e.onOpen)==null||r.call(e),t()},u.onclose=r=>{var i;v.value=!1,a.value="disconnected",l.value=WebSocket.CLOSED,I(),(i=e.onClose)==null||i.call(e,r.code,r.reason),!w&&n.autoReconnect&&C.scheduleReconnect(async()=>{try{return await S(),!0}catch{return!1}})},u.onerror=r=>{var i;m.value=r,a.value="error",(i=e.onError)==null||i.call(e,r),s(r)},u.onmessage=r=>{var o;P.value=r.data,M();let i=r.data;if(typeof r.data=="string")try{i=JSON.parse(r.data)}catch{}(o=e.onMessage)==null||o.call(e,i,r)},l.value=u.readyState}catch(r){a.value="error",s(r)}})}function L(){w=!0,C.cancel(),I(),u&&(u.close(1e3,"Client disconnect"),u=null),v.value=!1,a.value="closed",l.value=WebSocket.CLOSED}function h(t){if(!u||u.readyState!==WebSocket.OPEN)return console.warn("[useWebSocket] Cannot send: WebSocket is not connected"),!1;try{return u.send(t),M(),!0}catch(s){return console.error("[useWebSocket] Send error:",s),!1}}function T(t){return h(JSON.stringify(t))}return d.onUnmounted(()=>{L()}),{isConnected:v,connectionState:a,readyState:l,bufferedAmount:c,lastMessage:P,error:m,reconnectAttempts:p,connect:S,disconnect:L,send:h,sendJSON:T}}exports.useDataStream=re;exports.useHLS=b;exports.useHTTPStream=ue;exports.useLaravelEcho=fe;exports.useLongPolling=ae;exports.useSSE=he;exports.useSocketIO=ve;exports.useWebRTC=ne;exports.useWebSocket=le;
4
+ //# sourceMappingURL=useWebSocket-7-qar6to.cjs.map