web-mojo 2.1.974 → 2.1.976
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.es.js +8 -8
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.cjs.js.map +1 -1
- package/dist/auth.es.js +2 -2
- package/dist/auth.es.js.map +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.es.js +2 -2
- package/dist/chunks/ChatView-CwXXC_O3.js +2 -0
- package/dist/chunks/ChatView-CwXXC_O3.js.map +1 -0
- package/dist/chunks/{ChatView-CVywBJ_8.js → ChatView-Dw8d8I1S.js} +13 -4
- package/dist/chunks/ChatView-Dw8d8I1S.js.map +1 -0
- package/dist/chunks/{Dialog-CIKHFSKs.js → Dialog-BhfhmiUl.js} +3 -3
- package/dist/chunks/{Dialog-CIKHFSKs.js.map → Dialog-BhfhmiUl.js.map} +1 -1
- package/dist/chunks/{Dialog-BOweFbZA.js → Dialog-CVKNFrDQ.js} +2 -2
- package/dist/chunks/{Dialog-BOweFbZA.js.map → Dialog-CVKNFrDQ.js.map} +1 -1
- package/dist/chunks/{FormView-D9AoVBWK.js → FormView-C0ZWtQ2P.js} +2 -2
- package/dist/chunks/FormView-C0ZWtQ2P.js.map +1 -0
- package/dist/chunks/{FormView-CTTdiFe7.js → FormView-DZrcAbsL.js} +49 -1
- package/dist/chunks/FormView-DZrcAbsL.js.map +1 -0
- package/dist/chunks/{MetricsMiniChartWidget-Chz9EhOV.js → MetricsMiniChartWidget-BJg3zpf_.js} +3 -3
- package/dist/chunks/{MetricsMiniChartWidget-Chz9EhOV.js.map → MetricsMiniChartWidget-BJg3zpf_.js.map} +1 -1
- package/dist/chunks/{MetricsMiniChartWidget-G_1X9X34.js → MetricsMiniChartWidget-Qpd3wlJ7.js} +2 -2
- package/dist/chunks/{MetricsMiniChartWidget-G_1X9X34.js.map → MetricsMiniChartWidget-Qpd3wlJ7.js.map} +1 -1
- package/dist/chunks/{PDFViewer-xIGvI2HU.js → PDFViewer-B9LCVE-j.js} +2 -2
- package/dist/chunks/{PDFViewer-xIGvI2HU.js.map → PDFViewer-B9LCVE-j.js.map} +1 -1
- package/dist/chunks/{PDFViewer-BOY-LD7G.js → PDFViewer-CFxKF-Kk.js} +2 -2
- package/dist/chunks/{PDFViewer-BOY-LD7G.js.map → PDFViewer-CFxKF-Kk.js.map} +1 -1
- package/dist/chunks/{TopNav-3CBu-J0k.js → TopNav-Br24n27M.js} +2 -2
- package/dist/chunks/{TopNav-3CBu-J0k.js.map → TopNav-Br24n27M.js.map} +1 -1
- package/dist/chunks/{TopNav-CaVVaJGR.js → TopNav-ZyXdW1nn.js} +2 -2
- package/dist/chunks/{TopNav-CaVVaJGR.js.map → TopNav-ZyXdW1nn.js.map} +1 -1
- package/dist/chunks/{WebApp-DMNMKCsV.js → WebApp-B1Wdzno2.js} +13 -13
- package/dist/chunks/{WebApp-DMNMKCsV.js.map → WebApp-B1Wdzno2.js.map} +1 -1
- package/dist/chunks/{WebApp-Bk7vjOB1.js → WebApp-CZZ3PjWM.js} +2 -2
- package/dist/chunks/{WebApp-Bk7vjOB1.js.map → WebApp-CZZ3PjWM.js.map} +1 -1
- package/dist/chunks/{WebSocketClient-Ct992w7K.js → WebSocketClient-D-5DJoMX.js} +2 -2
- package/dist/chunks/WebSocketClient-D-5DJoMX.js.map +1 -0
- package/dist/chunks/WebSocketClient-DzcqAmho.js +2 -0
- package/dist/chunks/WebSocketClient-DzcqAmho.js.map +1 -0
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.es.js +3 -3
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +8 -8
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.es.js +3 -3
- package/package.json +1 -1
- package/dist/chunks/ChatView-CVywBJ_8.js.map +0 -1
- package/dist/chunks/ChatView-CeAqSsgH.js +0 -2
- package/dist/chunks/ChatView-CeAqSsgH.js.map +0 -1
- package/dist/chunks/FormView-CTTdiFe7.js.map +0 -1
- package/dist/chunks/FormView-D9AoVBWK.js.map +0 -1
- package/dist/chunks/WebSocketClient-Ct992w7K.js.map +0 -1
- package/dist/chunks/WebSocketClient-hCY55l61.js +0 -2
- package/dist/chunks/WebSocketClient-hCY55l61.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketClient-Ct992w7K.js","sources":["../../src/core/services/WebSocketClient.js"],"sourcesContent":["/**\n * WebSocketClient - Simple, robust WebSocket client with auto-reconnect\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Heartbeat ping/pong with timeout disconnect\n * - Event-driven architecture using EventEmitter\n * - Token-based authentication\n *\n * Usage:\n * const ws = new WebSocketClient({\n * url: \"wss://api.example.com/ws/realtime\",\n * tokenPrefix: \"bearer\",\n * getToken: () => app.tokenManager.getToken()\n * });\n *\n * ws.on('connected', () => console.log('Connected!'));\n * ws.on('message', (data) => console.log('Received:', data));\n * ws.connect();\n */\n\nimport EventEmitter from '@core/mixins/EventEmitter.js';\n\nclass WebSocketClient {\n constructor(options = {}) {\n // Connection\n this.url = options.url;\n this.socket = null;\n this.isConnected = false;\n this.isConnecting = false;\n\n // Auth\n this.getToken = options.getToken || null;\n this.tokenPrefix = options.tokenPrefix || 'bearer';\n\n // Reconnection\n this.shouldReconnect = options.autoReconnect !== false;\n this.maxReconnectAttempts = options.maxReconnectAttempts || Infinity;\n this.reconnectInterval = options.reconnectInterval || 3000;\n this.reconnectBackoff = options.reconnectBackoff || 1.5;\n this.reconnectAttempts = 0;\n this.reconnectTimer = null;\n\n // Heartbeat\n this.pingInterval = options.pingInterval || 30000;\n this.pongTimeout = options.pongTimeout || 5000;\n this.pingTimer = null;\n this.pongTimer = null;\n\n // Debug\n this.debug = options.debug || false;\n }\n\n /**\n * Connect to WebSocket server\n */\n async connect(url = null) {\n if (url) this.url = url;\n if (!this.url) throw new Error('WebSocket URL is required');\n if (this.isConnected || this.isConnecting) return;\n\n this.isConnecting = true;\n this._log('Connecting to:', this.url);\n\n return new Promise((resolve, reject) => {\n try {\n this.socket = new WebSocket(this.url);\n\n this.socket.onopen = () => {\n this._log('Connected');\n this.isConnected = true;\n this.isConnecting = false;\n this.reconnectAttempts = 0;\n\n this._authenticate();\n this._startHeartbeat();\n\n this.emit('connected');\n resolve();\n };\n\n this.socket.onmessage = (event) => this._handleMessage(event);\n this.socket.onerror = (event) => this._handleError(event, reject);\n this.socket.onclose = (event) => this._handleClose(event);\n\n } catch (error) {\n this.isConnecting = false;\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from server\n */\n disconnect() {\n this.shouldReconnect = false;\n this._clearTimers();\n\n if (this.socket) {\n this._log('Disconnecting');\n this.socket.close(1000, 'Client disconnect');\n }\n }\n\n /**\n * Send data (auto-stringifies objects)\n */\n send(data) {\n if (!this.isConnected) {\n throw new Error('WebSocket not connected');\n }\n\n const message = typeof data === 'string' ? data : JSON.stringify(data);\n this.socket.send(message);\n this._log('Sent:', message);\n }\n\n // Private methods\n\n _authenticate() {\n const token = this.getToken ? this.getToken() : null;\n if (!token) {\n console.warn('[WebSocket] No token available');\n return;\n }\n\n this.send({\n type: 'authenticate',\n token,\n prefix: this.tokenPrefix\n });\n }\n\n _handleMessage(event) {\n this._log('Received:', event.data);\n\n let data;\n try {\n data = JSON.parse(event.data);\n } catch (error) {\n data = event.data;\n }\n\n // Handle pong response\n if (data?.type === 'pong') {\n this._clearPongTimeout();\n return;\n }\n\n // Emit specific event types\n if (data?.type) {\n this.emit(data.type, data);\n }\n\n // Always emit generic message event\n this.emit('message', data);\n }\n\n _handleError(event, rejectFn) {\n console.error('[WebSocket] Error:', event);\n this.emit('error', event);\n\n if (rejectFn) {\n rejectFn(new Error('WebSocket connection failed'));\n }\n }\n\n _handleClose(event) {\n this._log('Closed:', event.code, event.reason);\n\n this.isConnected = false;\n this.isConnecting = false;\n this._clearTimers();\n this.socket = null;\n\n this.emit('disconnected', {\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean\n });\n\n // Auto-reconnect (except for clean closes)\n if (this.shouldReconnect && event.code !== 1000) {\n this._reconnect();\n }\n }\n\n _reconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n this._log('Max reconnect attempts reached');\n this.emit('reconnect-failed', { attempts: this.reconnectAttempts });\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectInterval * Math.pow(this.reconnectBackoff, this.reconnectAttempts - 1);\n\n this._log(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`);\n this.emit('reconnecting', { attempt: this.reconnectAttempts, delay });\n\n this.reconnectTimer = setTimeout(() => {\n if (this.shouldReconnect) {\n this.connect().catch(err => console.error('[WebSocket] Reconnect failed:', err));\n }\n }, delay);\n }\n\n _startHeartbeat() {\n if (!this.pingInterval) return;\n\n this.pingTimer = setInterval(() => {\n if (this.isConnected) {\n this.send({ action: 'ping' });\n this._startPongTimeout();\n }\n }, this.pingInterval);\n }\n\n _startPongTimeout() {\n this._clearPongTimeout();\n\n this.pongTimer = setTimeout(() => {\n console.warn('[WebSocket] Pong timeout - closing connection');\n if (this.socket) {\n this.socket.close(1006, 'Pong timeout');\n }\n }, this.pongTimeout);\n }\n\n _clearPongTimeout() {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = null;\n }\n }\n\n _clearTimers() {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n this._clearPongTimeout();\n }\n\n _log(...args) {\n if (this.debug) {\n console.log('[WebSocket]', ...args);\n }\n }\n\n // Static methods\n\n /**\n * Convert REST API base URL to WebSocket URL\n * @param {string} baseURL - REST API base URL (http/https)\n * @param {string} path - WebSocket path (default: '/ws')\n * @returns {string} WebSocket URL (ws/wss)\n *\n * @example\n * WebSocketClient.deriveURL('https://api.example.com', '/ws/realtime')\n * // Returns: 'wss://api.example.com/ws/realtime'\n *\n * WebSocketClient.deriveURL('http://localhost:3000')\n * // Returns: 'ws://localhost:3000/ws'\n */\n static deriveURL(baseURL, path = '/ws/realtime/') {\n if (!baseURL) throw new Error('baseURL is required');\n\n // Parse the base URL\n const url = new URL(baseURL);\n\n // Convert http(s) to ws(s)\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n\n // Set the path (ensure it starts with /)\n url.pathname = path.startsWith('/') ? path : `/${path}`;\n\n return url.toString();\n }\n}\n\n// Add EventEmitter mixin\nObject.assign(WebSocketClient.prototype, EventEmitter);\n\nexport default WebSocketClient;\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const t=require("./Rest-BNYqGlnP.js");class WebSocketClient{constructor(t={}){this.url=t.url,this.socket=null,this.isConnected=!1,this.isConnecting=!1,this.getToken=t.getToken||null,this.tokenPrefix=t.tokenPrefix||"bearer",this.shouldReconnect=!1!==t.autoReconnect,this.maxReconnectAttempts=t.maxReconnectAttempts||1/0,this.reconnectInterval=t.reconnectInterval||3e3,this.reconnectBackoff=t.reconnectBackoff||1.5,this.reconnectAttempts=0,this.reconnectTimer=null,this.pingInterval=t.pingInterval||3e4,this.pongTimeout=t.pongTimeout||5e3,this.pingTimer=null,this.pongTimer=null,this.debug=t.debug||!1}async connect(t=null){if(t&&(this.url=t),!this.url)throw new Error("WebSocket URL is required");if(!this.isConnected&&!this.isConnecting)return this.isConnecting=!0,this._log("Connecting to:",this.url),new Promise((t,e)=>{try{this.socket=new WebSocket(this.url),this.socket.onopen=()=>{this._log("Connected"),this.isConnected=!0,this.isConnecting=!1,this.reconnectAttempts=0,this._authenticate(),this._startHeartbeat(),this.emit("connected"),t()},this.socket.onmessage=t=>this._handleMessage(t),this.socket.onerror=t=>this._handleError(t,e),this.socket.onclose=t=>this._handleClose(t)}catch(n){this.isConnecting=!1,e(n)}})}disconnect(){this.shouldReconnect=!1,this._clearTimers(),this.socket&&(this._log("Disconnecting"),this.socket.close(1e3,"Client disconnect"))}send(t){if(!this.isConnected)throw new Error("WebSocket not connected");const e="string"==typeof t?t:JSON.stringify(t);this.socket.send(e),this._log("Sent:",e)}_authenticate(){const t=this.getToken?this.getToken():null;t?this.send({type:"authenticate",token:t,prefix:this.tokenPrefix}):console.warn("[WebSocket] No token available")}_handleMessage(t){let e;this._log("Received:",t.data);try{e=JSON.parse(t.data)}catch(n){e=t.data}"pong"!==e?.type?(e?.type&&this.emit(e.type,e),this.emit("message",e)):this._clearPongTimeout()}_handleError(t,e){console.error("[WebSocket] Error:",t),this.emit("error",t),e&&e(new Error("WebSocket connection failed"))}_handleClose(t){this._log("Closed:",t.code,t.reason),this.isConnected=!1,this.isConnecting=!1,this._clearTimers(),this.socket=null,this.emit("disconnected",{code:t.code,reason:t.reason,wasClean:t.wasClean}),this.shouldReconnect&&1e3!==t.code&&this._reconnect()}_reconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts)return this._log("Max reconnect attempts reached"),void this.emit("reconnect-failed",{attempts:this.reconnectAttempts});this.reconnectAttempts++;const t=this.reconnectInterval*Math.pow(this.reconnectBackoff,this.reconnectAttempts-1);this._log(`Reconnecting in ${t}ms (attempt ${this.reconnectAttempts})`),this.emit("reconnecting",{attempt:this.reconnectAttempts,delay:t}),this.reconnectTimer=setTimeout(()=>{this.shouldReconnect&&this.connect().catch(t=>console.error("[WebSocket] Reconnect failed:",t))},t)}_startHeartbeat(){this.pingInterval&&(this.pingTimer=setInterval(()=>{this.isConnected&&(this.send({action:"ping"}),this._startPongTimeout())},this.pingInterval))}_startPongTimeout(){this._clearPongTimeout(),this.pongTimer=setTimeout(()=>{console.warn("[WebSocket] Pong timeout - closing connection"),this.socket&&this.socket.close(1006,"Pong timeout")},this.pongTimeout)}_clearPongTimeout(){this.pongTimer&&(clearTimeout(this.pongTimer),this.pongTimer=null)}_clearTimers(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=null),this._clearPongTimeout()}_log(...t){this.debug}static deriveURL(t,e="/ws/realtime/"){if(!t)throw new Error("baseURL is required");const n=new URL(t);return n.protocol="https:"===n.protocol?"wss:":"ws:",n.pathname=e.startsWith("/")?e:`/${e}`,n.toString()}}Object.assign(WebSocketClient.prototype,t.EventEmitter),exports.WebSocketClient=WebSocketClient;
|
|
2
|
-
//# sourceMappingURL=WebSocketClient-hCY55l61.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketClient-hCY55l61.js","sources":["../../src/core/services/WebSocketClient.js"],"sourcesContent":["/**\n * WebSocketClient - Simple, robust WebSocket client with auto-reconnect\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Heartbeat ping/pong with timeout disconnect\n * - Event-driven architecture using EventEmitter\n * - Token-based authentication\n *\n * Usage:\n * const ws = new WebSocketClient({\n * url: \"wss://api.example.com/ws/realtime\",\n * tokenPrefix: \"bearer\",\n * getToken: () => app.tokenManager.getToken()\n * });\n *\n * ws.on('connected', () => console.log('Connected!'));\n * ws.on('message', (data) => console.log('Received:', data));\n * ws.connect();\n */\n\nimport EventEmitter from '@core/mixins/EventEmitter.js';\n\nclass WebSocketClient {\n constructor(options = {}) {\n // Connection\n this.url = options.url;\n this.socket = null;\n this.isConnected = false;\n this.isConnecting = false;\n\n // Auth\n this.getToken = options.getToken || null;\n this.tokenPrefix = options.tokenPrefix || 'bearer';\n\n // Reconnection\n this.shouldReconnect = options.autoReconnect !== false;\n this.maxReconnectAttempts = options.maxReconnectAttempts || Infinity;\n this.reconnectInterval = options.reconnectInterval || 3000;\n this.reconnectBackoff = options.reconnectBackoff || 1.5;\n this.reconnectAttempts = 0;\n this.reconnectTimer = null;\n\n // Heartbeat\n this.pingInterval = options.pingInterval || 30000;\n this.pongTimeout = options.pongTimeout || 5000;\n this.pingTimer = null;\n this.pongTimer = null;\n\n // Debug\n this.debug = options.debug || false;\n }\n\n /**\n * Connect to WebSocket server\n */\n async connect(url = null) {\n if (url) this.url = url;\n if (!this.url) throw new Error('WebSocket URL is required');\n if (this.isConnected || this.isConnecting) return;\n\n this.isConnecting = true;\n this._log('Connecting to:', this.url);\n\n return new Promise((resolve, reject) => {\n try {\n this.socket = new WebSocket(this.url);\n\n this.socket.onopen = () => {\n this._log('Connected');\n this.isConnected = true;\n this.isConnecting = false;\n this.reconnectAttempts = 0;\n\n this._authenticate();\n this._startHeartbeat();\n\n this.emit('connected');\n resolve();\n };\n\n this.socket.onmessage = (event) => this._handleMessage(event);\n this.socket.onerror = (event) => this._handleError(event, reject);\n this.socket.onclose = (event) => this._handleClose(event);\n\n } catch (error) {\n this.isConnecting = false;\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from server\n */\n disconnect() {\n this.shouldReconnect = false;\n this._clearTimers();\n\n if (this.socket) {\n this._log('Disconnecting');\n this.socket.close(1000, 'Client disconnect');\n }\n }\n\n /**\n * Send data (auto-stringifies objects)\n */\n send(data) {\n if (!this.isConnected) {\n throw new Error('WebSocket not connected');\n }\n\n const message = typeof data === 'string' ? data : JSON.stringify(data);\n this.socket.send(message);\n this._log('Sent:', message);\n }\n\n // Private methods\n\n _authenticate() {\n const token = this.getToken ? this.getToken() : null;\n if (!token) {\n console.warn('[WebSocket] No token available');\n return;\n }\n\n this.send({\n type: 'authenticate',\n token,\n prefix: this.tokenPrefix\n });\n }\n\n _handleMessage(event) {\n this._log('Received:', event.data);\n\n let data;\n try {\n data = JSON.parse(event.data);\n } catch (error) {\n data = event.data;\n }\n\n // Handle pong response\n if (data?.type === 'pong') {\n this._clearPongTimeout();\n return;\n }\n\n // Emit specific event types\n if (data?.type) {\n this.emit(data.type, data);\n }\n\n // Always emit generic message event\n this.emit('message', data);\n }\n\n _handleError(event, rejectFn) {\n console.error('[WebSocket] Error:', event);\n this.emit('error', event);\n\n if (rejectFn) {\n rejectFn(new Error('WebSocket connection failed'));\n }\n }\n\n _handleClose(event) {\n this._log('Closed:', event.code, event.reason);\n\n this.isConnected = false;\n this.isConnecting = false;\n this._clearTimers();\n this.socket = null;\n\n this.emit('disconnected', {\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean\n });\n\n // Auto-reconnect (except for clean closes)\n if (this.shouldReconnect && event.code !== 1000) {\n this._reconnect();\n }\n }\n\n _reconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n this._log('Max reconnect attempts reached');\n this.emit('reconnect-failed', { attempts: this.reconnectAttempts });\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectInterval * Math.pow(this.reconnectBackoff, this.reconnectAttempts - 1);\n\n this._log(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`);\n this.emit('reconnecting', { attempt: this.reconnectAttempts, delay });\n\n this.reconnectTimer = setTimeout(() => {\n if (this.shouldReconnect) {\n this.connect().catch(err => console.error('[WebSocket] Reconnect failed:', err));\n }\n }, delay);\n }\n\n _startHeartbeat() {\n if (!this.pingInterval) return;\n\n this.pingTimer = setInterval(() => {\n if (this.isConnected) {\n this.send({ action: 'ping' });\n this._startPongTimeout();\n }\n }, this.pingInterval);\n }\n\n _startPongTimeout() {\n this._clearPongTimeout();\n\n this.pongTimer = setTimeout(() => {\n console.warn('[WebSocket] Pong timeout - closing connection');\n if (this.socket) {\n this.socket.close(1006, 'Pong timeout');\n }\n }, this.pongTimeout);\n }\n\n _clearPongTimeout() {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = null;\n }\n }\n\n _clearTimers() {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n this._clearPongTimeout();\n }\n\n _log(...args) {\n if (this.debug) {\n console.log('[WebSocket]', ...args);\n }\n }\n\n // Static methods\n\n /**\n * Convert REST API base URL to WebSocket URL\n * @param {string} baseURL - REST API base URL (http/https)\n * @param {string} path - WebSocket path (default: '/ws')\n * @returns {string} WebSocket URL (ws/wss)\n *\n * @example\n * WebSocketClient.deriveURL('https://api.example.com', '/ws/realtime')\n * // Returns: 'wss://api.example.com/ws/realtime'\n *\n * WebSocketClient.deriveURL('http://localhost:3000')\n * // Returns: 'ws://localhost:3000/ws'\n */\n static deriveURL(baseURL, path = '/ws/realtime/') {\n if (!baseURL) throw new Error('baseURL is required');\n\n // Parse the base URL\n const url = new URL(baseURL);\n\n // Convert http(s) to ws(s)\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n\n // Set the path (ensure it starts with /)\n url.pathname = path.startsWith('/') ? path : `/${path}`;\n\n return url.toString();\n }\n}\n\n// Add EventEmitter mixin\nObject.assign(WebSocketClient.prototype, EventEmitter);\n\nexport default WebSocketClient;\n"],"names":["WebSocketClient","constructor","options","this","url","socket","isConnected","isConnecting","getToken","tokenPrefix","shouldReconnect","autoReconnect","maxReconnectAttempts","Infinity","reconnectInterval","reconnectBackoff","reconnectAttempts","reconnectTimer","pingInterval","pongTimeout","pingTimer","pongTimer","debug","connect","Error","_log","Promise","resolve","reject","WebSocket","onopen","_authenticate","_startHeartbeat","emit","onmessage","event","_handleMessage","onerror","_handleError","onclose","_handleClose","error","disconnect","_clearTimers","close","send","data","message","JSON","stringify","token","type","prefix","console","warn","parse","_clearPongTimeout","rejectFn","code","reason","wasClean","_reconnect","attempts","delay","Math","pow","attempt","setTimeout","catch","err","setInterval","action","_startPongTimeout","clearTimeout","clearInterval","args","deriveURL","baseURL","path","URL","protocol","pathname","startsWith","toString","Object","assign","prototype","EventEmitter"],"mappings":"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"}
|