@djangocfg/centrifugo 2.1.102 ā 2.1.104
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/package.json +22 -27
- package/src/components/CentrifugoMonitor/CentrifugoMonitor.tsx +1 -1
- package/src/components/CentrifugoMonitor/CentrifugoMonitorDialog.tsx +2 -2
- package/src/components/CentrifugoMonitor/CentrifugoMonitorWidget.tsx +1 -1
- package/src/components/ConnectionStatus/ConnectionStatus.tsx +1 -1
- package/src/components/ConnectionStatus/ConnectionStatusCard.tsx +1 -1
- package/src/components/MessagesFeed/MessageFilters.tsx +1 -1
- package/src/components/MessagesFeed/MessagesFeed.tsx +1 -1
- package/src/components/SubscriptionsList/SubscriptionsList.tsx +1 -1
- package/src/components/index.ts +2 -0
- package/src/debug/ConnectionTab/ConnectionTab.tsx +1 -1
- package/src/debug/DebugPanel/DebugPanel.tsx +1 -1
- package/src/debug/LogsTab/LogsTab.tsx +1 -1
- package/src/debug/SubscriptionsTab/SubscriptionsTab.tsx +1 -1
- package/src/hooks/index.ts +2 -0
- package/src/index.ts +2 -0
- package/dist/components.cjs +0 -871
- package/dist/components.cjs.map +0 -1
- package/dist/components.d.mts +0 -129
- package/dist/components.d.ts +0 -129
- package/dist/components.mjs +0 -857
- package/dist/components.mjs.map +0 -1
- package/dist/hooks.cjs +0 -379
- package/dist/hooks.cjs.map +0 -1
- package/dist/hooks.d.mts +0 -128
- package/dist/hooks.d.ts +0 -128
- package/dist/hooks.mjs +0 -374
- package/dist/hooks.mjs.map +0 -1
- package/dist/index.cjs +0 -3007
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.mts +0 -838
- package/dist/index.d.ts +0 -838
- package/dist/index.mjs +0 -2948
- package/dist/index.mjs.map +0 -1
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/events.ts","../src/core/logger/consolaLogger.ts","../src/core/client/connection.ts","../src/core/client/subscriptions.ts","../src/core/errors/RPCError.ts","../src/core/client/rpc.ts","../src/core/client/version.ts","../src/core/client/CentrifugoRPCClient.ts","../src/core/logger/LogsStore.ts","../src/core/logger/createLogger.ts","../src/components/ConnectionStatus/ConnectionStatus.tsx","../src/components/ConnectionStatus/ConnectionStatusCard.tsx","../src/components/MessagesFeed/MessageFilters.tsx","../src/components/MessagesFeed/MessagesFeed.tsx","../src/components/SubscriptionsList/SubscriptionsList.tsx","../src/components/CentrifugoMonitor/CentrifugoMonitor.tsx","../src/components/CentrifugoMonitor/CentrifugoMonitorDialog.tsx","../src/config.ts","../src/hooks/useCodegenTip.ts","../src/hooks/usePageVisibility.ts","../src/providers/LogsProvider/LogsProvider.tsx","../src/providers/CentrifugoProvider/CentrifugoProvider.tsx","../src/core/utils/channelValidator.ts","../src/hooks/useSubscription.ts","../src/hooks/useRPC.ts","../src/hooks/useNamedRPC.ts","../src/core/errors/RPCRetryHandler.ts","../src/components/CentrifugoMonitor/CentrifugoMonitorFAB.tsx","../src/components/CentrifugoMonitor/CentrifugoMonitorWidget.tsx","../src/debug/ConnectionTab/ConnectionTab.tsx","../src/debug/LogsTab/LogsTab.tsx","../src/debug/SubscriptionsTab/SubscriptionsTab.tsx","../src/debug/DebugPanel/DebugPanel.tsx"],"names":["logger","subscribe","unsubscribe","namedRPC","isDevelopment","createConsola","moment","jsxs","jsx","Wifi","WifiOff","Badge","useState","useEffect","Card","CardHeader","CardTitle","Button","CardContent","Radio","ScrollArea","Trash2","Activity","useRef","useCallback","createContext","useMemo","error","connect","disconnect","useContext","call","RefreshCw","Clock","Search","Input","Filter","Fragment","Separator","Sheet","SheetContent","SheetHeader","SheetTitle","SheetDescription","Tabs","TabsList","TabsTrigger","TabsContent"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Centrifugo Package Events\n *\n * Unified event system for Centrifugo client.\n * All events use single 'centrifugo' CustomEvent with type discriminator.\n */\n\nimport { events } from '@djangocfg/ui-core/hooks';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Event Constants\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n/**\n * Single event name for all Centrifugo events.\n * Use `type` field in payload to distinguish event types.\n */\nexport const CENTRIFUGO_EVENT = 'centrifugo' as const;\n\n/**\n * Internal events for UI components (via events.publish)\n */\nexport const CENTRIFUGO_MONITOR_EVENTS = {\n OPEN_MONITOR_DIALOG: 'CENTRIFUGO_OPEN_MONITOR_DIALOG',\n CLOSE_MONITOR_DIALOG: 'CENTRIFUGO_CLOSE_MONITOR_DIALOG',\n} as const;\n\n// Legacy exports for backwards compatibility\nexport const CENTRIFUGO_ERROR_EVENT = CENTRIFUGO_EVENT;\nexport const CENTRIFUGO_VERSION_MISMATCH_EVENT = CENTRIFUGO_EVENT;\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Event Types\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport type CentrifugoEventType =\n | 'error'\n | 'version_mismatch'\n | 'connected'\n | 'disconnected'\n | 'reconnecting';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Event Payloads\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface CentrifugoErrorData {\n /** RPC method that failed */\n method: string;\n /** Error message */\n error: string;\n /** Error code from Centrifugo */\n code?: number;\n /** Additional data sent with the request */\n data?: any;\n}\n\nexport interface CentrifugoVersionMismatchData {\n /** Client API version hash */\n clientVersion: string;\n /** Server API version hash */\n serverVersion: string;\n /** Human-readable message */\n message: string;\n}\n\nexport interface CentrifugoConnectionData {\n /** User ID */\n userId?: string;\n /** Reconnect attempt number (for reconnecting) */\n attempt?: number;\n /** Reason for disconnect */\n reason?: string;\n}\n\n/**\n * Unified Centrifugo event payload\n */\nexport type CentrifugoEventPayload =\n | { type: 'error'; data: CentrifugoErrorData }\n | { type: 'version_mismatch'; data: CentrifugoVersionMismatchData }\n | { type: 'connected'; data: CentrifugoConnectionData }\n | { type: 'disconnected'; data: CentrifugoConnectionData }\n | { type: 'reconnecting'; data: CentrifugoConnectionData };\n\n/**\n * Full event detail (includes timestamp)\n */\nexport type CentrifugoEventDetail = CentrifugoEventPayload & {\n timestamp: Date;\n};\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Monitor Dialog Payloads (internal events)\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface OpenMonitorDialogPayload {\n variant?: 'compact' | 'full' | 'minimal';\n defaultTab?: 'connection' | 'messages' | 'subscriptions';\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Legacy Types (for backwards compatibility)\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n/** @deprecated Use CentrifugoErrorData */\nexport type CentrifugoErrorPayload = CentrifugoErrorData;\n\n/** @deprecated Use CentrifugoVersionMismatchData */\nexport type VersionMismatchPayload = CentrifugoVersionMismatchData;\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Event Dispatcher\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n/**\n * Dispatch unified Centrifugo event\n *\n * @example\n * ```ts\n * // Dispatch error\n * dispatchCentrifugoEvent({\n * type: 'error',\n * data: { method: 'terminal.input', error: 'timeout' }\n * });\n *\n * // Listen to all Centrifugo events\n * window.addEventListener('centrifugo', (e) => {\n * const { type, data, timestamp } = e.detail;\n * switch (type) {\n * case 'error':\n * console.error('RPC error:', data.method, data.error);\n * break;\n * case 'version_mismatch':\n * toast.warning('Please refresh the page');\n * break;\n * }\n * });\n * ```\n */\nexport const dispatchCentrifugoEvent = (payload: CentrifugoEventPayload): void => {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n const detail: CentrifugoEventDetail = {\n ...payload,\n timestamp: new Date(),\n };\n\n window.dispatchEvent(new CustomEvent(CENTRIFUGO_EVENT, {\n detail,\n bubbles: true,\n cancelable: false,\n }));\n } catch (error) {\n // Silently fail - event dispatch should never crash the app\n }\n};\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Convenience Dispatchers\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n/**\n * Dispatch error event\n */\nexport const dispatchCentrifugoError = (data: CentrifugoErrorData): void => {\n dispatchCentrifugoEvent({ type: 'error', data });\n};\n\n/**\n * Dispatch version mismatch event\n */\nexport const dispatchVersionMismatch = (data: CentrifugoVersionMismatchData): void => {\n dispatchCentrifugoEvent({ type: 'version_mismatch', data });\n};\n\n/**\n * Dispatch connected event\n */\nexport const dispatchConnected = (data: CentrifugoConnectionData = {}): void => {\n dispatchCentrifugoEvent({ type: 'connected', data });\n};\n\n/**\n * Dispatch disconnected event\n */\nexport const dispatchDisconnected = (data: CentrifugoConnectionData = {}): void => {\n dispatchCentrifugoEvent({ type: 'disconnected', data });\n};\n\n/**\n * Dispatch reconnecting event\n */\nexport const dispatchReconnecting = (data: CentrifugoConnectionData = {}): void => {\n dispatchCentrifugoEvent({ type: 'reconnecting', data });\n};\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Monitor Dialog Emitters (internal, uses events.publish)\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport const emitOpenMonitorDialog = (payload?: OpenMonitorDialogPayload) => {\n events.publish({\n type: CENTRIFUGO_MONITOR_EVENTS.OPEN_MONITOR_DIALOG,\n payload: payload || {},\n });\n};\n\nexport const emitCloseMonitorDialog = () => {\n events.publish({\n type: CENTRIFUGO_MONITOR_EVENTS.CLOSE_MONITOR_DIALOG,\n payload: {},\n });\n};\n","/**\n * Shared Consola Logger\n *\n * Single consola instance used across the package for development logging.\n */\n\nimport { createConsola } from 'consola';\n\nimport type { Logger } from './createLogger';\n\nconst isDevelopment = process.env.NODE_ENV === 'development';\n\n/**\n * Shared consola logger for Centrifugo package\n */\nexport const consolaLogger = createConsola({\n level: isDevelopment ? 4 : 3,\n formatOptions: {\n colors: true,\n date: false,\n compact: !isDevelopment,\n },\n}).withTag('[Centrifugo]');\n\n/**\n * Get a consola logger with custom tag wrapped to match Logger interface\n */\nexport function getConsolaLogger(tag: string): Logger {\n const consola = consolaLogger.withTag(`[${tag}]`);\n\n return {\n debug: (message: string, data?: unknown) => consola.debug(message, data || ''),\n info: (message: string, data?: unknown) => consola.info(message, data || ''),\n success: (message: string, data?: unknown) => consola.success(message, data || ''),\n warning: (message: string, data?: unknown) => consola.warn(message, data || ''),\n error: (message: string, error?: Error | unknown) => consola.error(message, error || ''),\n };\n}\n","/**\n * Connection Management Module\n *\n * Handles Centrifuge WebSocket connection lifecycle.\n */\n\nimport { Centrifuge, type Subscription } from 'centrifuge';\n\nimport { dispatchConnected, dispatchDisconnected, dispatchReconnecting } from '../../events';\nimport { getConsolaLogger } from '../logger/consolaLogger';\n\nimport type { Logger } from '../logger';\nimport type { CentrifugoClientOptions, PendingRequest } from './types';\n\nexport interface ConnectionState {\n centrifuge: Centrifuge;\n replySubscription: Subscription | null;\n pendingRequests: Map<string, PendingRequest>;\n channelSubscriptions: Map<string, Subscription>;\n userId: string;\n replyChannel: string;\n timeout: number;\n logger: Logger;\n}\n\n/**\n * Create connection state from options.\n * Handles both old positional args and new options-based API.\n */\nexport function createConnectionState(\n urlOrOptions: string | CentrifugoClientOptions,\n token?: string,\n userId?: string,\n timeout: number = 30000,\n logger?: Logger\n): ConnectionState {\n // Parse arguments\n let url: string;\n let actualToken: string;\n let actualUserId: string;\n let actualTimeout: number;\n let actualLogger: Logger | undefined;\n let getToken: (() => Promise<string>) | undefined;\n\n if (typeof urlOrOptions === 'object') {\n url = urlOrOptions.url;\n actualToken = urlOrOptions.token;\n actualUserId = urlOrOptions.userId;\n actualTimeout = urlOrOptions.timeout ?? 30000;\n actualLogger = urlOrOptions.logger;\n getToken = urlOrOptions.getToken;\n } else {\n url = urlOrOptions;\n actualToken = token!;\n actualUserId = userId!;\n actualTimeout = timeout;\n actualLogger = logger;\n }\n\n const log = actualLogger || getConsolaLogger('client');\n const replyChannel = `user#${actualUserId}`;\n\n // Build Centrifuge options\n const centrifugeOptions: any = {\n token: actualToken,\n };\n\n // Add getToken callback for automatic token refresh\n if (getToken) {\n centrifugeOptions.getToken = async () => {\n log.info('Token expired, refreshing...');\n try {\n const newToken = await getToken();\n log.success('Token refreshed successfully');\n return newToken;\n } catch (error) {\n log.error('Failed to refresh token', error);\n throw error;\n }\n };\n }\n\n const centrifuge = new Centrifuge(url, centrifugeOptions);\n\n return {\n centrifuge,\n replySubscription: null,\n pendingRequests: new Map(),\n channelSubscriptions: new Map(),\n userId: actualUserId,\n replyChannel,\n timeout: actualTimeout,\n logger: log,\n };\n}\n\n/**\n * Setup connection event handlers.\n */\nexport function setupConnectionHandlers(\n state: ConnectionState,\n onResponse: (data: any) => void\n): void {\n const { centrifuge, pendingRequests, logger, userId } = state;\n\n // Handle disconnection - reject all pending requests\n centrifuge.on('disconnected', (ctx) => {\n pendingRequests.forEach(({ reject }) => {\n reject(new Error('Disconnected from Centrifugo'));\n });\n pendingRequests.clear();\n\n dispatchDisconnected({\n userId,\n reason: ctx.reason,\n });\n\n logger.info('Disconnected from Centrifugo', { reason: ctx.reason });\n });\n\n // Handle successful connection\n centrifuge.on('connected', () => {\n dispatchConnected({ userId });\n logger.success('Connected to Centrifugo');\n });\n\n // Handle reconnecting state\n centrifuge.on('connecting', (ctx) => {\n if (ctx.reason === 'transport closed') {\n dispatchReconnecting({\n userId,\n attempt: 1,\n reason: ctx.reason,\n });\n logger.info('Reconnecting to Centrifugo...', { reason: ctx.reason });\n }\n });\n}\n\n/**\n * Connect to Centrifugo server.\n */\nexport async function connect(\n state: ConnectionState,\n onResponse: (data: any) => void\n): Promise<void> {\n const { centrifuge, replyChannel, logger } = state;\n\n return new Promise((resolve, reject) => {\n let resolved = false;\n\n const onConnected = () => {\n if (!resolved) {\n resolved = true;\n resolve();\n }\n };\n\n const onError = (ctx: any) => {\n if (!resolved) {\n resolved = true;\n reject(new Error(ctx.message || 'Connection error'));\n }\n };\n\n centrifuge.on('connected', onConnected);\n centrifuge.on('error', onError);\n\n // Start connection\n centrifuge.connect();\n\n // Subscribe to reply channel for RPC responses\n const subscription = centrifuge.newSubscription(replyChannel);\n state.replySubscription = subscription;\n\n subscription.on('publication', (ctx: any) => {\n onResponse(ctx.data);\n });\n\n subscription.on('subscribed', () => {\n logger.success(`Subscribed to reply channel: ${replyChannel}`);\n });\n\n subscription.on('error', (ctx: any) => {\n // Error code 105 = \"already subscribed\" (server-side subscription from JWT)\n if (ctx.error?.code === 105) {\n // This is fine, server-side subscription exists\n } else {\n logger.error(`Subscription error for ${replyChannel}:`, ctx.error);\n }\n });\n\n subscription.subscribe();\n });\n}\n\n/**\n * Disconnect from Centrifugo server.\n */\nexport function disconnect(state: ConnectionState): void {\n const { centrifuge, replySubscription, channelSubscriptions, logger } = state;\n\n // Unsubscribe from all event channels\n channelSubscriptions.forEach((sub, channel) => {\n try {\n sub.unsubscribe();\n centrifuge.removeSubscription(sub);\n } catch (error) {\n logger.error(`Error unsubscribing from ${channel}`, error);\n }\n });\n channelSubscriptions.clear();\n\n // Unsubscribe from RPC reply channel\n if (replySubscription) {\n replySubscription.unsubscribe();\n state.replySubscription = null;\n }\n\n centrifuge.disconnect();\n logger.info('Disconnected from Centrifugo');\n}\n\n/**\n * Generate unique correlation ID for RPC requests.\n */\nexport function generateCorrelationId(): string {\n return `rpc-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n","/**\n * Subscription Management Module\n *\n * Handles Centrifugo channel subscriptions (pub/sub pattern).\n */\n\nimport type { Centrifuge, Subscription } from 'centrifuge';\nimport type { Logger } from '../logger';\n\nexport interface SubscriptionManager {\n channelSubscriptions: Map<string, Subscription>;\n centrifuge: Centrifuge;\n logger: Logger;\n}\n\n/**\n * Subscribe to a Centrifugo channel for real-time events.\n *\n * @param manager - Subscription manager state\n * @param channel - Channel name (e.g., 'bot#bot-123#heartbeat')\n * @param callback - Callback for received messages\n * @returns Unsubscribe function\n *\n * @example\n * const unsubscribe = subscribe(manager, 'bot#bot-123#heartbeat', (data) => {\n * console.log('Heartbeat:', data);\n * });\n *\n * // Later: unsubscribe when done\n * unsubscribe();\n */\nexport function subscribe(\n manager: SubscriptionManager,\n channel: string,\n callback: (data: any) => void\n): () => void {\n const { channelSubscriptions, centrifuge, logger } = manager;\n\n // Check if already subscribed - reuse existing subscription\n const existingSub = channelSubscriptions.get(channel);\n if (existingSub) {\n logger.warning(`Already subscribed to ${channel}, reusing existing subscription`);\n\n // Add new callback handler to existing subscription\n const handler = (ctx: any) => {\n try {\n callback(ctx.data);\n } catch (error) {\n logger.error(`Error in subscription callback for ${channel}`, error);\n }\n };\n\n existingSub.on('publication', handler);\n\n // Return unsubscribe that only removes this specific handler\n return () => {\n existingSub.off('publication', handler);\n };\n }\n\n // Create new subscription using Centrifuge's getSubscription or newSubscription\n let sub = centrifuge.getSubscription(channel);\n if (!sub) {\n sub = centrifuge.newSubscription(channel);\n }\n\n // Handle publications with error handling\n const publicationHandler = (ctx: any) => {\n try {\n callback(ctx.data);\n } catch (error) {\n logger.error(`Error in subscription callback for ${channel}`, error);\n }\n };\n\n sub.on('publication', publicationHandler);\n\n // Handle subscription lifecycle\n sub.on('subscribed', () => {\n logger.success(`Subscribed to ${channel}`);\n });\n\n sub.on('error', (ctx: any) => {\n logger.error(`Subscription error for ${channel}`, ctx.error);\n });\n\n // Start subscription\n sub.subscribe();\n\n // Store subscription\n channelSubscriptions.set(channel, sub);\n\n // Return unsubscribe function\n return () => unsubscribe(manager, channel);\n}\n\n/**\n * Unsubscribe from a channel.\n * Properly removes subscription from both internal map and Centrifuge client.\n */\nexport function unsubscribe(manager: SubscriptionManager, channel: string): void {\n const { channelSubscriptions, centrifuge, logger } = manager;\n const sub = channelSubscriptions.get(channel);\n\n if (!sub) {\n return;\n }\n\n try {\n sub.unsubscribe();\n centrifuge.removeSubscription(sub);\n channelSubscriptions.delete(channel);\n logger.info(`Unsubscribed from ${channel}`);\n } catch (error) {\n logger.error(`Error unsubscribing from ${channel}`, error);\n channelSubscriptions.delete(channel);\n }\n}\n\n/**\n * Unsubscribe from all channels.\n */\nexport function unsubscribeAll(manager: SubscriptionManager): void {\n const { channelSubscriptions, centrifuge, logger } = manager;\n\n if (channelSubscriptions.size === 0) {\n return;\n }\n\n channelSubscriptions.forEach((sub, channel) => {\n try {\n sub.unsubscribe();\n centrifuge.removeSubscription(sub);\n } catch (error) {\n logger.error(`Error unsubscribing from ${channel}`, error);\n }\n });\n\n channelSubscriptions.clear();\n logger.info('Unsubscribed from all channels');\n}\n\n/**\n * Get list of active client-side subscriptions.\n */\nexport function getActiveSubscriptions(manager: SubscriptionManager): string[] {\n return Array.from(manager.channelSubscriptions.keys());\n}\n\n/**\n * Get list of server-side subscriptions (from JWT token).\n *\n * These are channels automatically subscribed by Centrifugo server\n * based on the 'channels' claim in the JWT token.\n */\nexport function getServerSideSubscriptions(manager: SubscriptionManager): string[] {\n try {\n // Access Centrifuge.js internal state for server-side subs\n // @ts-ignore - accessing internal property\n const serverSubs = manager.centrifuge._serverSubs || {};\n return Object.keys(serverSubs);\n } catch {\n return [];\n }\n}\n\n/**\n * Get all active subscriptions (both client-side and server-side).\n */\nexport function getAllSubscriptions(manager: SubscriptionManager): string[] {\n const clientSubs = getActiveSubscriptions(manager);\n const serverSubs = getServerSideSubscriptions(manager);\n\n // Combine and deduplicate\n return Array.from(new Set([...clientSubs, ...serverSubs]));\n}\n","/**\n * RPC Error with classification for retry logic.\n *\n * Mirrors Swift's RPCError implementation with:\n * - isRetryable: Whether the error should trigger a retry\n * - suggestedRetryDelay: Recommended delay before retry\n * - userMessage: User-friendly error message\n */\n\nexport type RPCErrorCode =\n | 'not_connected'\n | 'timeout'\n | 'server_error'\n | 'encoding_error'\n | 'decoding_error'\n | 'websocket_error'\n | 'connection_failed'\n | 'cancelled'\n | 'network_error'\n | 'unknown';\n\nexport class RPCError extends Error {\n readonly code: RPCErrorCode;\n readonly serverCode?: number;\n readonly method?: string;\n readonly isRetryable: boolean;\n readonly suggestedRetryDelay: number;\n readonly userMessage: string;\n\n constructor(\n code: RPCErrorCode,\n message: string,\n options?: {\n serverCode?: number;\n method?: string;\n cause?: unknown;\n }\n ) {\n super(message);\n this.name = 'RPCError';\n this.code = code;\n this.serverCode = options?.serverCode;\n this.method = options?.method;\n this.isRetryable = this.determineRetryable();\n this.suggestedRetryDelay = this.determineSuggestedDelay();\n this.userMessage = this.determineUserMessage();\n\n // Set cause manually for compatibility with older TypeScript targets\n if (options?.cause) {\n (this as any).cause = options.cause;\n }\n }\n\n /**\n * Determine if this error should trigger a retry.\n * Transient errors (timeout, network) are retryable.\n * Permanent errors (encoding, 4xx) are not.\n */\n private determineRetryable(): boolean {\n switch (this.code) {\n // Transient errors - retry\n case 'timeout':\n case 'websocket_error':\n case 'connection_failed':\n case 'network_error':\n return true;\n\n // Server errors - retry only 5xx\n case 'server_error':\n return this.serverCode ? this.serverCode >= 500 : false;\n\n // Permanent errors - don't retry\n case 'not_connected':\n case 'encoding_error':\n case 'decoding_error':\n case 'cancelled':\n case 'unknown':\n return false;\n\n default:\n return false;\n }\n }\n\n /**\n * Suggested delay before retry based on error type.\n */\n private determineSuggestedDelay(): number {\n switch (this.code) {\n case 'timeout':\n return 1000;\n case 'websocket_error':\n return 2000;\n case 'server_error':\n return 3000;\n case 'connection_failed':\n return 2000;\n case 'network_error':\n return 1500;\n default:\n return 1000;\n }\n }\n\n /**\n * User-friendly message for UI display.\n */\n private determineUserMessage(): string {\n switch (this.code) {\n case 'not_connected':\n return 'Not connected. Please check your internet connection.';\n case 'timeout':\n return 'Request timed out. Please try again.';\n case 'server_error':\n return this.message || 'Server error. Please try again later.';\n case 'websocket_error':\n return 'Connection error. Please try again.';\n case 'connection_failed':\n return 'Unable to connect. Please check your internet connection.';\n case 'encoding_error':\n case 'decoding_error':\n return 'Data error. Please try again or contact support.';\n case 'cancelled':\n return 'Request cancelled.';\n case 'network_error':\n return 'Network error. Please check your connection.';\n default:\n return 'An unexpected error occurred. Please try again.';\n }\n }\n\n /**\n * Create RPCError from Centrifugo/unknown error.\n */\n static fromError(error: unknown, method?: string): RPCError {\n if (error instanceof RPCError) {\n return error;\n }\n\n // Handle Centrifugo error object\n if (typeof error === 'object' && error !== null) {\n const err = error as Record<string, unknown>;\n const code = err.code as number | undefined;\n const message =\n (err.message as string) || (err.error as string) || 'Unknown error';\n\n // Timeout detection\n if (message.includes('timeout') || message.includes('Timeout')) {\n return new RPCError('timeout', message, { method });\n }\n\n // Connection issues\n if (\n message.includes('disconnect') ||\n message.includes('connection') ||\n message.includes('not connected')\n ) {\n return new RPCError('connection_failed', message, { method });\n }\n\n // Server error codes\n if (code !== undefined) {\n if (code >= 500) {\n return new RPCError('server_error', message, {\n serverCode: code,\n method,\n });\n }\n if (code >= 400) {\n return new RPCError('server_error', message, {\n serverCode: code,\n method,\n });\n }\n }\n\n return new RPCError('unknown', message, { method, cause: error });\n }\n\n // Standard Error\n if (error instanceof Error) {\n // Check for abort/cancel\n if (error.name === 'AbortError') {\n return new RPCError('cancelled', 'Request cancelled', { method });\n }\n\n return new RPCError('unknown', error.message, { method, cause: error });\n }\n\n return new RPCError('unknown', String(error), { method });\n }\n}\n","/**\n * RPC Module\n *\n * Handles Centrifugo RPC patterns (request-response and fire-and-forget).\n */\n\nimport type { Centrifuge, Subscription } from 'centrifuge';\n\nimport { dispatchCentrifugoError } from '../../events';\nimport { RPCError } from '../errors/RPCError';\n\nimport type { Logger } from '../logger';\nimport type { PendingRequest, RPCOptions, RetryOptions } from './types';\nimport { generateCorrelationId } from './connection';\n\n/** Default RPC timeout in milliseconds */\nconst DEFAULT_RPC_TIMEOUT = 30000;\n\nexport interface RPCManager {\n centrifuge: Centrifuge;\n pendingRequests: Map<string, PendingRequest>;\n channelSubscriptions: Map<string, Subscription>;\n userId: string;\n timeout: number;\n logger: Logger;\n subscribe: (channel: string, callback: (data: any) => void) => () => void;\n}\n\n/**\n * Handle RPC response from reply channel.\n */\nexport function handleResponse(\n pendingRequests: Map<string, PendingRequest>,\n data: any\n): void {\n const correlationId = data.correlation_id;\n if (!correlationId) {\n return;\n }\n\n const pending = pendingRequests.get(correlationId);\n if (!pending) {\n return;\n }\n\n pendingRequests.delete(correlationId);\n\n if (data.error) {\n pending.reject(new Error(data.error.message || 'RPC error'));\n } else {\n pending.resolve(data.result);\n }\n}\n\n/**\n * Legacy RPC call via publish/subscribe pattern.\n *\n * @deprecated Use namedRPC for Centrifugo RPC Proxy\n */\nexport async function call<T = any>(\n manager: RPCManager,\n method: string,\n params: any,\n replyChannel: string\n): Promise<T> {\n const { centrifuge, pendingRequests, timeout, logger } = manager;\n const correlationId = generateCorrelationId();\n\n const message = {\n method,\n params,\n correlation_id: correlationId,\n reply_to: replyChannel,\n };\n\n const promise = new Promise<T>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n pendingRequests.delete(correlationId);\n reject(new Error(`RPC timeout: ${method}`));\n }, timeout);\n\n pendingRequests.set(correlationId, {\n resolve: (result: T) => {\n clearTimeout(timeoutId);\n resolve(result);\n },\n reject: (error: Error) => {\n clearTimeout(timeoutId);\n reject(error);\n },\n });\n });\n\n await centrifuge.publish('rpc.requests', message);\n\n return promise;\n}\n\n/**\n * RPC Pattern API (Request-Response via Correlation ID).\n *\n * @deprecated Use namedRPC for Centrifugo RPC Proxy\n */\nexport async function rpc<TRequest = any, TResponse = any>(\n manager: RPCManager,\n method: string,\n params: TRequest,\n options: RPCOptions = {}\n): Promise<TResponse> {\n const { centrifuge, logger, subscribe, userId } = manager;\n const { timeout = 10000, replyChannel = `user#${userId}` } = options;\n\n const correlationId = generateCorrelationId();\n\n logger.info(`RPC request: ${method}`, { correlationId, params });\n\n return new Promise<TResponse>((resolve, reject) => {\n let timeoutId: NodeJS.Timeout | null = null;\n let unsubscribe: (() => void) | null = null;\n\n const cleanup = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n if (unsubscribe) {\n unsubscribe();\n unsubscribe = null;\n }\n };\n\n timeoutId = setTimeout(() => {\n cleanup();\n const error = new Error(`RPC timeout: ${method} (${timeout}ms)`);\n logger.error(`RPC timeout: ${method}`, { correlationId, timeout });\n reject(error);\n }, timeout);\n\n try {\n unsubscribe = subscribe(replyChannel, (data: any) => {\n try {\n if (data.correlation_id === correlationId) {\n cleanup();\n\n if (data.error) {\n logger.error(`RPC error: ${method}`, {\n correlationId,\n error: data.error,\n });\n reject(new Error(data.error.message || 'RPC error'));\n return;\n }\n\n logger.success(`RPC response: ${method}`, {\n correlationId,\n hasResult: !!data.result,\n });\n resolve(data.result as TResponse);\n }\n } catch (error) {\n cleanup();\n logger.error(`Error processing RPC response: ${method}`, error);\n reject(error);\n }\n });\n\n const rpcChannel = `rpc#${method}`;\n const sub = centrifuge.getSubscription(rpcChannel);\n\n if (sub) {\n sub\n .publish({\n correlation_id: correlationId,\n method,\n params,\n reply_to: replyChannel,\n timestamp: Date.now(),\n })\n .catch((error: any) => {\n cleanup();\n logger.error(`Failed to publish RPC request: ${method}`, error);\n reject(error);\n });\n } else {\n cleanup();\n reject(\n new Error(\n `Cannot publish RPC request: no subscription to ${rpcChannel}. ` +\n `Backend should provide a publish endpoint or use server-side subscriptions.`\n )\n );\n }\n } catch (error) {\n cleanup();\n logger.error(`Failed to setup RPC: ${method}`, error);\n reject(error);\n }\n });\n}\n\n/**\n * Create a timeout promise that rejects after specified ms.\n */\nfunction createTimeoutPromise(timeoutMs: number, method: string): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new RPCError('timeout', `RPC timeout after ${timeoutMs}ms: ${method}`, { method }));\n }, timeoutMs);\n });\n}\n\n/**\n * Call RPC method via native Centrifugo RPC proxy.\n *\n * This uses Centrifugo's built-in RPC mechanism which proxies\n * requests to the backend (Django) via HTTP.\n *\n * Flow:\n * 1. Client calls namedRPC('terminal.input', data)\n * 2. Centrifuge.js sends RPC over WebSocket\n * 3. Centrifugo proxies to Django: POST /centrifugo/rpc/\n * 4. Django routes to @websocket_rpc handler\n * 5. Response returned to client\n *\n * Features:\n * - Configurable timeout (default: 30s)\n * - Returns typed RPCError for better error handling\n * - Dispatches error events for monitoring\n */\nexport async function namedRPC<TRequest = any, TResponse = any>(\n manager: RPCManager,\n method: string,\n data: TRequest,\n options?: { timeout?: number }\n): Promise<TResponse> {\n const { centrifuge, logger } = manager;\n const timeoutMs = options?.timeout ?? DEFAULT_RPC_TIMEOUT;\n\n logger.info(`Native RPC: ${method}`, { data, timeout: timeoutMs });\n\n try {\n // Race between RPC call and timeout\n const result = await Promise.race([\n centrifuge.rpc(method, data),\n createTimeoutPromise(timeoutMs, method),\n ]);\n\n logger.success(`Native RPC success: ${method}`, {\n hasData: !!result.data,\n });\n\n return result.data as TResponse;\n } catch (error) {\n // Convert to RPCError for consistent error handling\n const rpcError = RPCError.fromError(error, method);\n\n logger.error(`Native RPC failed: ${method}`, {\n code: rpcError.code,\n isRetryable: rpcError.isRetryable,\n message: rpcError.message,\n });\n\n // Dispatch error event for ErrorsTracker\n dispatchCentrifugoError({\n method,\n error: rpcError.message,\n code: rpcError.serverCode,\n data,\n });\n\n throw rpcError;\n }\n}\n\n/**\n * Fire-and-forget RPC call - sends without waiting for response.\n * Use for latency-sensitive operations like terminal input.\n *\n * Features:\n * - Returns immediately (non-blocking)\n * - Automatic retry with exponential backoff on failure\n * - Configurable max retries and delays\n */\nexport function namedRPCNoWait<TRequest = any>(\n manager: RPCManager,\n method: string,\n data: TRequest,\n options?: RetryOptions\n): void {\n const { centrifuge, logger } = manager;\n\n const maxRetries = options?.maxRetries ?? 3;\n const baseDelayMs = options?.baseDelayMs ?? 100;\n const maxDelayMs = options?.maxDelayMs ?? 2000;\n\n const attemptSend = (attempt: number): void => {\n centrifuge.rpc(method, data).catch((error) => {\n const rpcError = RPCError.fromError(error, method);\n\n if (attempt < maxRetries && rpcError.isRetryable) {\n // Exponential backoff with jitter\n const baseDelay = rpcError.suggestedRetryDelay || baseDelayMs;\n const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelayMs);\n const jitter = delay * 0.2 * (Math.random() * 2 - 1);\n const finalDelay = Math.max(0, Math.round(delay + jitter));\n\n logger.warning(\n `Fire-and-forget RPC failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${finalDelay}ms: ${method}`,\n { code: rpcError.code, isRetryable: rpcError.isRetryable }\n );\n\n setTimeout(() => attemptSend(attempt + 1), finalDelay);\n } else {\n // All retries exhausted or non-retryable error\n logger.error(\n `Fire-and-forget RPC failed after ${attempt + 1} attempts: ${method}`,\n { code: rpcError.code, message: rpcError.message }\n );\n }\n });\n };\n\n // Start first attempt immediately\n attemptSend(0);\n}\n\nexport interface NamedRPCWithRetryOptions {\n timeout?: number;\n maxRetries?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n onRetry?: (attempt: number, error: RPCError, delayMs: number) => void;\n}\n\n/**\n * Call RPC method with timeout and automatic retry.\n *\n * Combines namedRPC timeout with retry logic for robust RPC calls.\n * Uses RPCError.isRetryable to determine if retry should happen.\n *\n * @example\n * const files = await namedRPCWithRetry(manager, 'files.list', { path: '/' }, {\n * timeout: 5000,\n * maxRetries: 3,\n * onRetry: (attempt, error, delay) => {\n * console.log(`Retry ${attempt} after ${delay}ms: ${error.userMessage}`);\n * }\n * });\n */\nexport async function namedRPCWithRetry<TRequest = any, TResponse = any>(\n manager: RPCManager,\n method: string,\n data: TRequest,\n options?: NamedRPCWithRetryOptions\n): Promise<TResponse> {\n const { logger } = manager;\n const maxRetries = options?.maxRetries ?? 3;\n const baseDelayMs = options?.baseDelayMs ?? 1000;\n const maxDelayMs = options?.maxDelayMs ?? 10000;\n\n let lastError: RPCError | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await namedRPC<TRequest, TResponse>(manager, method, data, {\n timeout: options?.timeout,\n });\n } catch (error) {\n lastError = error instanceof RPCError ? error : RPCError.fromError(error, method);\n\n // Don't retry non-retryable errors\n if (!lastError.isRetryable) {\n throw lastError;\n }\n\n // Check if we have retries left\n if (attempt >= maxRetries) {\n throw lastError;\n }\n\n // Calculate delay with exponential backoff and jitter\n const suggestedDelay = lastError.suggestedRetryDelay || baseDelayMs;\n const exponentialDelay = suggestedDelay * Math.pow(2, attempt);\n const cappedDelay = Math.min(exponentialDelay, maxDelayMs);\n const jitter = cappedDelay * 0.2 * (Math.random() * 2 - 1);\n const delayMs = Math.max(0, Math.round(cappedDelay + jitter));\n\n logger.warning(\n `RPC retry (${attempt + 1}/${maxRetries}): ${method} in ${delayMs}ms`,\n { code: lastError.code, message: lastError.message }\n );\n\n // Notify callback if provided\n if (options?.onRetry) {\n options.onRetry(attempt + 1, lastError, delayMs);\n }\n\n // Wait before retry\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n // Should not reach here, but TypeScript needs this\n throw lastError ?? new RPCError('unknown', 'Retry failed', { method });\n}\n","/**\n * API Version Checking Module\n *\n * Validates that client and server API versions are compatible.\n */\n\nimport { dispatchVersionMismatch } from '../../events';\n\nimport type { Logger } from '../logger';\nimport type { VersionCheckResult } from './types';\n\nexport interface VersionChecker {\n namedRPC: <TRequest, TResponse>(method: string, data: TRequest) => Promise<TResponse>;\n logger: Logger;\n}\n\ninterface CheckVersionResponse {\n compatible: boolean;\n client_version: string;\n server_version: string;\n message: string;\n}\n\n/**\n * Check if client API version matches server version.\n *\n * Calls system.check_version RPC and dispatches a CustomEvent\n * if versions don't match. Listen to 'centrifugo' event to handle globally.\n *\n * @example\n * ```ts\n * import { API_VERSION } from '@/_ws';\n *\n * // Check version after connect\n * const result = await checkApiVersion(checker, API_VERSION);\n * if (!result.compatible) {\n * // Event already dispatched, but you can handle here too\n * console.warn('Please refresh the page');\n * }\n *\n * // Listen to event globally\n * window.addEventListener('centrifugo', (e) => {\n * if (e.detail.type === 'version_mismatch') {\n * toast.warning('New version available. Please refresh.');\n * }\n * });\n * ```\n */\nexport async function checkApiVersion(\n checker: VersionChecker,\n clientVersion: string\n): Promise<VersionCheckResult> {\n const { namedRPC, logger } = checker;\n\n try {\n const result = await namedRPC<{ client_version: string }, CheckVersionResponse>(\n 'system.check_version',\n { client_version: clientVersion }\n );\n\n if (!result.compatible) {\n logger.warning(\n `API version mismatch: client=${clientVersion}, server=${result.server_version}`\n );\n\n // Dispatch event for global handling\n dispatchVersionMismatch({\n clientVersion,\n serverVersion: result.server_version,\n message: result.message || 'API version mismatch. Please refresh the page.',\n });\n } else {\n logger.success(`API version check passed: ${clientVersion}`);\n }\n\n return {\n compatible: result.compatible,\n clientVersion,\n serverVersion: result.server_version,\n message: result.message,\n };\n } catch (error) {\n // If endpoint doesn't exist (old server), assume compatible\n logger.warning('API version check endpoint not available');\n return {\n compatible: true,\n clientVersion,\n serverVersion: 'unknown',\n message: 'Version check endpoint not available',\n };\n }\n}\n","/**\n * Centrifugo RPC Client\n *\n * Facade for WebSocket connection and RPC call handling.\n * Provides both RPC (request/response) and Subscription (pub/sub) patterns.\n *\n * Architecture:\n * - connection.ts - Connection lifecycle management\n * - subscriptions.ts - Channel subscription management\n * - rpc.ts - RPC methods (namedRPC, namedRPCNoWait)\n * - version.ts - API version checking\n * - types.ts - Type definitions\n */\n\nimport type { Centrifuge, Subscription } from 'centrifuge';\n\nimport type { Logger } from '../logger';\nimport type {\n CentrifugoClientOptions,\n PendingRequest,\n RPCOptions,\n RetryOptions,\n VersionCheckResult,\n} from './types';\n\nimport {\n createConnectionState,\n setupConnectionHandlers,\n connect as connectToServer,\n disconnect as disconnectFromServer,\n type ConnectionState,\n} from './connection';\n\nimport {\n subscribe as subscribeToChannel,\n unsubscribe as unsubscribeFromChannel,\n unsubscribeAll as unsubscribeFromAllChannels,\n getActiveSubscriptions as getClientSubscriptions,\n getServerSideSubscriptions as getServerSubscriptions,\n getAllSubscriptions as getCombinedSubscriptions,\n type SubscriptionManager,\n} from './subscriptions';\n\nimport {\n handleResponse,\n call as legacyCall,\n rpc as legacyRpc,\n namedRPC as nativeNamedRPC,\n namedRPCNoWait as nativeNamedRPCNoWait,\n namedRPCWithRetry as nativeNamedRPCWithRetry,\n type RPCManager,\n type NamedRPCWithRetryOptions,\n} from './rpc';\n\nimport { checkApiVersion as checkVersion } from './version';\n\n// Re-export types for backwards compatibility\nexport type { CentrifugoClientOptions } from './types';\n\nexport class CentrifugoRPCClient {\n private state: ConnectionState;\n\n constructor(options: CentrifugoClientOptions);\n /** @deprecated Use options object instead */\n constructor(\n url: string,\n token: string,\n userId: string,\n timeout?: number,\n logger?: Logger\n );\n constructor(\n urlOrOptions: string | CentrifugoClientOptions,\n token?: string,\n userId?: string,\n timeout: number = 30000,\n logger?: Logger\n ) {\n this.state = createConnectionState(urlOrOptions, token, userId, timeout, logger);\n setupConnectionHandlers(this.state, (data) => this.handleResponse(data));\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // Connection API\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n async connect(): Promise<void> {\n return connectToServer(this.state, (data) => this.handleResponse(data));\n }\n\n async disconnect(): Promise<void> {\n disconnectFromServer(this.state);\n }\n\n getCentrifuge(): Centrifuge {\n return this.state.centrifuge;\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // Subscription API\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n subscribe(channel: string, callback: (data: any) => void): () => void {\n return subscribeToChannel(this.subscriptionManager, channel, callback);\n }\n\n unsubscribe(channel: string): void {\n unsubscribeFromChannel(this.subscriptionManager, channel);\n }\n\n unsubscribeAll(): void {\n unsubscribeFromAllChannels(this.subscriptionManager);\n }\n\n getActiveSubscriptions(): string[] {\n return getClientSubscriptions(this.subscriptionManager);\n }\n\n getServerSideSubscriptions(): string[] {\n return getServerSubscriptions(this.subscriptionManager);\n }\n\n getAllSubscriptions(): string[] {\n return getCombinedSubscriptions(this.subscriptionManager);\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // RPC Pattern API (Legacy - Correlation ID)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n async call<T = any>(method: string, params: any): Promise<T> {\n return legacyCall(this.rpcManager, method, params, this.state.replyChannel);\n }\n\n async rpc<TRequest = any, TResponse = any>(\n method: string,\n params: TRequest,\n options: RPCOptions = {}\n ): Promise<TResponse> {\n return legacyRpc(this.rpcManager, method, params, options);\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // Native Centrifugo RPC (via RPC Proxy)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n async namedRPC<TRequest = any, TResponse = any>(\n method: string,\n data: TRequest,\n options?: { timeout?: number }\n ): Promise<TResponse> {\n return nativeNamedRPC(this.rpcManager, method, data, options);\n }\n\n namedRPCNoWait<TRequest = any>(\n method: string,\n data: TRequest,\n options?: RetryOptions\n ): void {\n nativeNamedRPCNoWait(this.rpcManager, method, data, options);\n }\n\n async namedRPCWithRetry<TRequest = any, TResponse = any>(\n method: string,\n data: TRequest,\n options?: NamedRPCWithRetryOptions\n ): Promise<TResponse> {\n return nativeNamedRPCWithRetry(this.rpcManager, method, data, options);\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // API Version Checking\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n async checkApiVersion(clientVersion: string): Promise<VersionCheckResult> {\n return checkVersion(\n {\n namedRPC: (method, data) => this.namedRPC(method, data),\n logger: this.state.logger,\n },\n clientVersion\n );\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // Internal Helpers\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n private handleResponse(data: any): void {\n handleResponse(this.state.pendingRequests, data);\n }\n\n private get subscriptionManager(): SubscriptionManager {\n return {\n channelSubscriptions: this.state.channelSubscriptions,\n centrifuge: this.state.centrifuge,\n logger: this.state.logger,\n };\n }\n\n private get rpcManager(): RPCManager {\n return {\n centrifuge: this.state.centrifuge,\n pendingRequests: this.state.pendingRequests,\n channelSubscriptions: this.state.channelSubscriptions,\n userId: this.state.userId,\n timeout: this.state.timeout,\n logger: this.state.logger,\n subscribe: (channel, callback) => this.subscribe(channel, callback),\n };\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // Getters for Testing/Debugging\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n /** @internal */\n get logger(): Logger {\n return this.state.logger;\n }\n\n /** @internal */\n get userId(): string {\n return this.state.userId;\n }\n\n /** @internal */\n get replyChannel(): string {\n return this.state.replyChannel;\n }\n}\n","/**\n * Logs Store\n *\n * In-memory store for accumulated logs with circular buffer.\n * Thread-safe, max capacity, auto-cleanup.\n */\n\nimport type { LogEntry, LogLevel } from '../types';\n\nexport class LogsStore {\n private logs: LogEntry[] = [];\n private listeners: Set<(logs: LogEntry[]) => void> = new Set();\n private maxLogs: number;\n\n constructor(maxLogs: number = 500) {\n this.maxLogs = maxLogs;\n }\n\n /**\n * Add log entry\n */\n add(entry: Omit<LogEntry, 'id' | 'timestamp'>): void {\n const logEntry: LogEntry = {\n ...entry,\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n timestamp: new Date(),\n };\n\n this.logs.push(logEntry);\n\n // Keep only last N logs (circular buffer)\n if (this.logs.length > this.maxLogs) {\n this.logs = this.logs.slice(-this.maxLogs);\n }\n\n // Notify listeners\n this.notify();\n }\n\n /**\n * Get all logs\n */\n getAll(): LogEntry[] {\n return [...this.logs];\n }\n\n /**\n * Get logs by level\n */\n getByLevel(level: LogLevel): LogEntry[] {\n return this.logs.filter((log) => log.level === level);\n }\n\n /**\n * Get logs by source\n */\n getBySource(source: LogEntry['source']): LogEntry[] {\n return this.logs.filter((log) => log.source === source);\n }\n\n /**\n * Clear all logs\n */\n clear(): void {\n this.logs = [];\n this.notify();\n }\n\n /**\n * Subscribe to log changes\n */\n subscribe(listener: (logs: LogEntry[]) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Notify all listeners\n */\n private notify(): void {\n const logs = this.getAll();\n this.listeners.forEach((listener) => listener(logs));\n }\n\n /**\n * Get logs count\n */\n get count(): number {\n return this.logs.length;\n }\n}\n\n// Singleton instance\nlet globalStore: LogsStore | null = null;\n\nexport function getGlobalLogsStore(): LogsStore {\n if (!globalStore) {\n globalStore = new LogsStore();\n }\n return globalStore;\n}\n","/**\n * Create Logger\n *\n * Creates logger that writes to both console (consola) and LogsStore.\n * Dual output: developer console + UI logs viewer.\n */\n\nimport { createConsola } from 'consola';\n\nimport { getGlobalLogsStore } from './LogsStore';\n\nimport type { LogEntry, LogLevel } from '../types';\nexport interface Logger {\n debug: (message: string, data?: unknown) => void;\n info: (message: string, data?: unknown) => void;\n success: (message: string, data?: unknown) => void;\n warning: (message: string, data?: unknown) => void;\n error: (message: string, error?: Error | unknown) => void;\n}\n\nexport interface LoggerConfig {\n source: LogEntry['source'];\n isDevelopment?: boolean;\n tag?: string;\n}\n\n/**\n * Create a logger instance\n * \n * @param configOrPrefix - Either a full LoggerConfig object or a simple string prefix\n * @returns Logger instance\n * \n * @example\n * // Simple usage with prefix\n * const logger = createLogger('MyComponent');\n * \n * @example\n * // Advanced usage with full config\n * const logger = createLogger({\n * source: 'client',\n * tag: 'MyComponent',\n * isDevelopment: true\n * });\n */\nexport function createLogger(configOrPrefix: LoggerConfig | string): Logger {\n // Normalize input to LoggerConfig\n const config: LoggerConfig = typeof configOrPrefix === 'string'\n ? { source: 'client', tag: configOrPrefix }\n : configOrPrefix;\n\n const { source, isDevelopment = process.env.NODE_ENV === 'development', tag = 'Centrifugo' } = config;\n\n const logsStore = getGlobalLogsStore();\n\n // Console logger (consola) with prefix tag\n const consola = createConsola({\n level: isDevelopment ? 4 : 3,\n formatOptions: {\n colors: true,\n date: false,\n compact: !isDevelopment,\n },\n }).withTag(`[${tag}]`);\n\n const log = (level: LogLevel, message: string, data?: unknown) => {\n // Add to LogsStore (always)\n logsStore.add({\n level,\n source,\n message,\n data,\n });\n\n // Write to console (only in development)\n if (!isDevelopment) return;\n\n switch (level) {\n case 'debug':\n consola.debug(message, data || '');\n break;\n case 'info':\n consola.info(message, data || '');\n break;\n case 'success':\n consola.success(message, data || '');\n break;\n case 'warning':\n consola.warn(message, data || '');\n break;\n case 'error':\n consola.error(message, data || '');\n break;\n }\n };\n\n return {\n debug: (message, data) => log('debug', message, data),\n info: (message, data) => log('info', message, data),\n success: (message, data) => log('success', message, data),\n warning: (message, data) => log('warning', message, data),\n error: (message, error) => log('error', message, error),\n };\n}\n","/**\n * Connection Status Component\n *\n * Universal component for displaying Centrifugo connection status\n * Supports multiple variants: badge, inline, card, detailed\n */\n\n'use client';\n\nimport { Clock, Radio, Wifi, WifiOff } from 'lucide-react';\nimport moment from 'moment';\nimport React, { useEffect, useState } from 'react';\n\nimport { Badge } from '@djangocfg/ui-nextjs';\n\nimport { getConsolaLogger } from '../../core/logger/consolaLogger';\nimport { useCentrifugo } from '../../providers/CentrifugoProvider';\n\nconst logger = getConsolaLogger('ConnectionStatus');\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Types\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface ConnectionStatusProps {\n variant?: 'badge' | 'inline' | 'detailed';\n showUptime?: boolean;\n showSubscriptions?: boolean;\n className?: string;\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function ConnectionStatus({\n variant = 'badge',\n showUptime = false,\n showSubscriptions = false,\n className = '',\n}: ConnectionStatusProps) {\n const { isConnected, client } = useCentrifugo();\n const [connectionTime, setConnectionTime] = useState<moment.Moment | null>(null);\n const [uptime, setUptime] = useState<string>('');\n const [activeSubscriptions, setActiveSubscriptions] = useState<number>(0);\n\n // Track connection time\n useEffect(() => {\n if (isConnected && !connectionTime) {\n setConnectionTime(moment.utc());\n } else if (!isConnected) {\n setConnectionTime(null);\n }\n }, [isConnected, connectionTime]);\n\n // Update uptime every second\n useEffect(() => {\n if (!isConnected || !connectionTime) {\n setUptime('');\n return;\n }\n\n const updateUptime = () => {\n const now = moment.utc();\n const duration = moment.duration(now.diff(connectionTime));\n\n const hours = Math.floor(duration.asHours());\n const minutes = duration.minutes();\n const seconds = duration.seconds();\n\n if (hours > 0) {\n setUptime(`${hours}h ${minutes}m`);\n } else if (minutes > 0) {\n setUptime(`${minutes}m ${seconds}s`);\n } else {\n setUptime(`${seconds}s`);\n }\n };\n\n updateUptime();\n const interval = setInterval(updateUptime, 1000);\n\n return () => clearInterval(interval);\n }, [isConnected, connectionTime]);\n\n // Update active subscriptions count\n useEffect(() => {\n if (!client || !isConnected) {\n setActiveSubscriptions(0);\n return;\n }\n\n const updateCount = () => {\n try {\n const centrifuge = client.getCentrifuge();\n const subs = centrifuge.subscriptions();\n setActiveSubscriptions(Object.keys(subs).length);\n } catch (error) {\n logger.error('Failed to get active subscriptions', error);\n }\n };\n\n updateCount();\n const interval = setInterval(updateCount, 2000);\n\n return () => clearInterval(interval);\n }, [client, isConnected]);\n\n // Badge variant\n if (variant === 'badge') {\n return (\n <Badge\n variant={isConnected ? 'default' : 'destructive'}\n className={`flex items-center gap-1 ${isConnected ? 'animate-pulse' : ''} ${className}`}\n >\n <span className={`h-2 w-2 rounded-full ${isConnected ? 'bg-green-500' : 'bg-red-500'}`} />\n {isConnected ? 'Connected' : 'Disconnected'}\n </Badge>\n );\n }\n\n // Inline variant\n if (variant === 'inline') {\n return (\n <div className={`flex items-center gap-2 ${className}`}>\n {isConnected ? (\n <Wifi className=\"h-4 w-4 text-green-600\" />\n ) : (\n <WifiOff className=\"h-4 w-4 text-red-600\" />\n )}\n <span className=\"text-sm font-medium\">\n {isConnected ? 'Connected' : 'Disconnected'}\n </span>\n {showUptime && uptime && (\n <span className=\"text-xs text-muted-foreground\">({uptime})</span>\n )}\n {showSubscriptions && (\n <span className=\"text-xs text-muted-foreground flex items-center gap-1\">\n <Radio className=\"h-3 w-3\" />\n {activeSubscriptions}\n </span>\n )}\n </div>\n );\n }\n\n // Detailed variant\n return (\n <div className={`space-y-3 ${className}`}>\n {/* Status Badge */}\n <div className=\"flex items-center gap-2\">\n <Badge\n variant={isConnected ? 'default' : 'destructive'}\n className={`flex items-center gap-1 ${isConnected ? 'animate-pulse' : ''}`}\n >\n <span className={`h-2 w-2 rounded-full ${isConnected ? 'bg-green-500' : 'bg-red-500'}`} />\n {isConnected ? 'Connected' : 'Disconnected'}\n </Badge>\n </div>\n\n {/* Connection Info */}\n {isConnected ? (\n <div className=\"space-y-2\">\n {/* Uptime */}\n {showUptime && uptime && (\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n Uptime:\n </span>\n <span className=\"font-mono font-medium\">{uptime}</span>\n </div>\n )}\n\n {/* Active Subscriptions */}\n {showSubscriptions && (\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground flex items-center gap-1\">\n <Radio className=\"h-3 w-3\" />\n Subscriptions:\n </span>\n <span className=\"font-mono font-medium\">{activeSubscriptions}</span>\n </div>\n )}\n </div>\n ) : (\n <div className=\"text-xs text-muted-foreground p-2 rounded bg-red-50 dark:bg-red-950/20\">\n Real-time features unavailable\n </div>\n )}\n </div>\n );\n}\n\n","/**\n * Connection Status Card Component\n *\n * Card wrapper for ConnectionStatus - ready for dashboard widgets\n * Clickable - opens CentrifugoMonitorDialog on click via events\n */\n\n'use client';\n\nimport { Wifi, WifiOff } from 'lucide-react';\nimport React from 'react';\n\nimport { Card, CardContent, CardHeader, CardTitle } from '@djangocfg/ui-nextjs';\n\nimport { emitOpenMonitorDialog } from '../../events';\nimport { useCentrifugo } from '../../providers/CentrifugoProvider';\nimport { ConnectionStatus } from './ConnectionStatus';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Types\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface ConnectionStatusCardProps {\n showUptime?: boolean;\n showSubscriptions?: boolean;\n className?: string;\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function ConnectionStatusCard({\n showUptime = true,\n showSubscriptions = true,\n className = '',\n}: ConnectionStatusCardProps) {\n const { isConnected } = useCentrifugo();\n\n const statusColor = isConnected ? 'border-green-500' : 'border-red-500';\n\n const handleClick = () => {\n emitOpenMonitorDialog({ variant: 'full' });\n };\n\n return (\n <Card \n className={`${statusColor} ${className} cursor-pointer hover:shadow-lg transition-shadow`} \n style={{ borderLeftWidth: '4px' }}\n onClick={handleClick}\n >\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">WebSocket</CardTitle>\n <div className={isConnected ? 'text-green-600' : 'text-red-600'}>\n {isConnected ? <Wifi className=\"h-4 w-4\" /> : <WifiOff className=\"h-4 w-4\" />}\n </div>\n </CardHeader>\n <CardContent>\n <ConnectionStatus\n variant=\"detailed\"\n showUptime={showUptime}\n showSubscriptions={showSubscriptions}\n />\n </CardContent>\n </Card>\n );\n}\n\n","/**\n * Message Filters Component\n *\n * Filtering controls for MessagesFeed\n */\n\n'use client';\n\nimport { Filter, Search, X } from 'lucide-react';\nimport React from 'react';\n\nimport { Badge, Button, Input } from '@djangocfg/ui-nextjs';\n\nimport type { MessageFilters as MessageFiltersType } from './types';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Types\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface MessageFiltersProps {\n filters: MessageFiltersType;\n onFiltersChange: (filters: MessageFiltersType) => void;\n autoScroll?: boolean;\n onAutoScrollChange?: (enabled: boolean) => void;\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function MessageFilters({\n filters,\n onFiltersChange,\n autoScroll,\n onAutoScrollChange,\n}: MessageFiltersProps) {\n const hasActiveFilters =\n (filters.channels && filters.channels.length > 0) ||\n (filters.types && filters.types.length > 0) ||\n (filters.levels && filters.levels.length > 0) ||\n filters.searchQuery;\n\n const handleClearFilters = () => {\n onFiltersChange({});\n };\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onFiltersChange({ ...filters, searchQuery: e.target.value });\n };\n\n const handleToggleLevel = (level: 'info' | 'success' | 'warning' | 'error') => {\n const currentLevels = filters.levels || [];\n const newLevels = currentLevels.includes(level)\n ? currentLevels.filter((l) => l !== level)\n : [...currentLevels, level];\n\n onFiltersChange({\n ...filters,\n levels: newLevels.length > 0 ? newLevels : undefined,\n });\n };\n\n const handleToggleType = (type: 'connection' | 'subscription' | 'publication' | 'error' | 'system' | 'unsubscription') => {\n const currentTypes = filters.types || [];\n const newTypes = currentTypes.includes(type)\n ? currentTypes.filter((t) => t !== type)\n : [...currentTypes, type];\n\n onFiltersChange({\n ...filters,\n types: newTypes.length > 0 ? newTypes : undefined,\n });\n };\n\n return (\n <div className=\"space-y-3 p-3 border rounded-lg bg-muted/30\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Filter className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium\">Filters</span>\n {hasActiveFilters && (\n <Badge variant=\"secondary\" className=\"text-xs\">\n Active\n </Badge>\n )}\n </div>\n {hasActiveFilters && (\n <Button size=\"sm\" variant=\"ghost\" onClick={handleClearFilters}>\n <X className=\"h-3 w-3 mr-1\" />\n Clear\n </Button>\n )}\n </div>\n\n {/* Search */}\n <div className=\"flex items-center gap-2\">\n <Search className=\"h-4 w-4 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder=\"Search messages...\"\n value={filters.searchQuery || ''}\n onChange={handleSearchChange}\n className=\"flex-1\"\n />\n </div>\n\n {/* Level Filters */}\n <div className=\"space-y-2\">\n <span className=\"text-xs text-muted-foreground\">Level:</span>\n <div className=\"flex flex-wrap gap-2\">\n {(['info', 'success', 'warning', 'error'] as const).map((level) => {\n const isActive = filters.levels?.includes(level);\n return (\n <Badge\n key={level}\n variant={isActive ? 'default' : 'outline'}\n className=\"cursor-pointer\"\n onClick={() => handleToggleLevel(level)}\n >\n {level}\n </Badge>\n );\n })}\n </div>\n </div>\n\n {/* Type Filters */}\n <div className=\"space-y-2\">\n <span className=\"text-xs text-muted-foreground\">Type:</span>\n <div className=\"flex flex-wrap gap-2\">\n {(['connection', 'subscription', 'publication', 'unsubscription', 'error', 'system'] as const).map((type) => {\n const isActive = filters.types?.includes(type);\n return (\n <Badge\n key={type}\n variant={isActive ? 'default' : 'outline'}\n className=\"cursor-pointer\"\n onClick={() => handleToggleType(type)}\n >\n {type}\n </Badge>\n );\n })}\n </div>\n </div>\n\n {/* Options */}\n {onAutoScrollChange && (\n <div className=\"pt-2 border-t\">\n <label className=\"flex items-center gap-2 text-sm cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={autoScroll}\n onChange={(e) => onAutoScrollChange(e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300\"\n />\n <span>Auto-scroll to latest</span>\n </label>\n </div>\n )}\n </div>\n );\n}\n\n","/**\n * Messages Feed Component\n *\n * Universal component for displaying real-time Centrifugo messages\n * Supports filtering, search, pause/play, and export\n */\n\n'use client';\n\nimport {\n Activity, AlertCircle, CheckCircle2, Circle, Download, Info, Pause, Play, Trash2\n} from 'lucide-react';\nimport moment from 'moment';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport {\n Badge, Button, Card, CardContent, CardHeader, CardTitle, ScrollArea\n} from '@djangocfg/ui-nextjs';\n\nimport { useCentrifugo } from '../../providers/CentrifugoProvider';\nimport { MessageFilters as MessageFiltersComponent } from './MessageFilters';\n\nimport type { CentrifugoMessage, MessageFilters, MessagesFeedProps } from './types';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function MessagesFeed({\n maxMessages = 100,\n showFilters = true,\n showControls = true,\n channels = [],\n autoScroll: initialAutoScroll = true,\n onMessageClick,\n className = '',\n}: MessagesFeedProps) {\n const { isConnected, client } = useCentrifugo();\n const [messages, setMessages] = useState<CentrifugoMessage[]>([]);\n const [isPaused, setIsPaused] = useState(false);\n const [autoScroll, setAutoScroll] = useState(initialAutoScroll);\n const [filters, setFilters] = useState<MessageFilters>({\n channels: channels.length > 0 ? channels : undefined,\n });\n const scrollRef = useRef<HTMLDivElement>(null);\n\n // Add message\n const addMessage = useCallback(\n (message: CentrifugoMessage) => {\n if (isPaused) return;\n\n setMessages((prev) => {\n const newMessages = [message, ...prev];\n return newMessages.slice(0, maxMessages);\n });\n },\n [isPaused, maxMessages]\n );\n\n // Listen to connection events\n useEffect(() => {\n if (!client) return;\n\n const centrifuge = client.getCentrifuge();\n\n const handleConnected = () => {\n const now = moment.utc().valueOf();\n addMessage({\n id: `conn-${now}`,\n timestamp: now,\n type: 'connection',\n level: 'success',\n message: 'Connected to Centrifugo',\n });\n };\n\n const handleDisconnected = () => {\n const now = moment.utc().valueOf();\n addMessage({\n id: `disconn-${now}`,\n timestamp: now,\n type: 'connection',\n level: 'error',\n message: 'Disconnected from Centrifugo',\n });\n };\n\n const handleError = (ctx: any) => {\n const now = moment.utc().valueOf();\n addMessage({\n id: `error-${now}`,\n timestamp: now,\n type: 'error',\n level: 'error',\n message: ctx.error?.message || 'Connection error',\n data: ctx,\n });\n };\n\n centrifuge.on('connected', handleConnected);\n centrifuge.on('disconnected', handleDisconnected);\n centrifuge.on('error', handleError);\n\n return () => {\n centrifuge.off('connected', handleConnected);\n centrifuge.off('disconnected', handleDisconnected);\n centrifuge.off('error', handleError);\n };\n }, [client, addMessage]);\n\n // Listen to subscription events\n useEffect(() => {\n if (!client) return;\n\n const centrifuge = client.getCentrifuge();\n\n const handleSubscribed = (ctx: any) => {\n const now = moment.utc().valueOf();\n addMessage({\n id: `sub-${now}`,\n timestamp: now,\n type: 'subscription',\n level: 'info',\n channel: ctx.channel,\n message: `Subscribed to ${ctx.channel}`,\n data: ctx,\n });\n };\n\n const handleUnsubscribed = (ctx: any) => {\n const now = moment.utc().valueOf();\n addMessage({\n id: `unsub-${now}`,\n timestamp: now,\n type: 'unsubscription',\n level: 'info',\n channel: ctx.channel,\n message: `Unsubscribed from ${ctx.channel}`,\n data: ctx,\n });\n };\n\n const handlePublication = (ctx: any) => {\n const now = moment.utc().valueOf();\n addMessage({\n id: `pub-${now}-${Math.random()}`,\n timestamp: now,\n type: 'publication',\n level: 'success',\n channel: ctx.channel,\n message: `Message from ${ctx.channel}`,\n data: ctx.data,\n });\n };\n\n centrifuge.on('subscribed', handleSubscribed);\n centrifuge.on('unsubscribed', handleUnsubscribed);\n centrifuge.on('publication', handlePublication);\n\n return () => {\n centrifuge.off('subscribed', handleSubscribed);\n centrifuge.off('unsubscribed', handleUnsubscribed);\n centrifuge.off('publication', handlePublication);\n };\n }, [client, addMessage]);\n\n // Auto-scroll to top when new messages arrive\n useEffect(() => {\n if (autoScroll && scrollRef.current) {\n scrollRef.current.scrollTop = 0;\n }\n }, [messages, autoScroll]);\n\n // Filter and prepare messages with pre-computed values\n const filteredMessages = useMemo(() => {\n return messages\n .filter((msg) => {\n if (filters.channels && filters.channels.length > 0) {\n if (!msg.channel || !filters.channels.includes(msg.channel)) {\n return false;\n }\n }\n\n if (filters.types && filters.types.length > 0) {\n if (!filters.types.includes(msg.type)) {\n return false;\n }\n }\n\n if (filters.levels && filters.levels.length > 0) {\n if (!filters.levels.includes(msg.level)) {\n return false;\n }\n }\n\n if (filters.searchQuery) {\n const query = filters.searchQuery.toLowerCase();\n const searchableText = [\n msg.message,\n msg.channel,\n JSON.stringify(msg.data),\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n\n if (!searchableText.includes(query)) {\n return false;\n }\n }\n\n return true;\n })\n .map((msg) => ({\n ...msg,\n formattedTime: moment.utc(msg.timestamp).format('HH:mm:ss'),\n formattedData: msg.data ? JSON.stringify(msg.data, null, 2) : null,\n }));\n }, [messages, filters]);\n\n // Clear messages\n const handleClear = () => {\n setMessages([]);\n };\n\n // Download messages\n const handleDownload = () => {\n const json = JSON.stringify(filteredMessages, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `centrifugo-messages-${moment.utc().format('YYYY-MM-DD-HHmmss')}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n // Get icon for message level\n const getLevelIcon = (level: CentrifugoMessage['level']) => {\n switch (level) {\n case 'error':\n return <AlertCircle className=\"h-4 w-4 text-red-500\" />;\n case 'warning':\n return <AlertCircle className=\"h-4 w-4 text-yellow-500\" />;\n case 'success':\n return <CheckCircle2 className=\"h-4 w-4 text-green-500\" />;\n case 'info':\n return <Info className=\"h-4 w-4 text-blue-500\" />;\n default:\n return <Circle className=\"h-4 w-4 text-gray-500\" />;\n }\n };\n\n // Get badge variant for level\n const getLevelVariant = (level: CentrifugoMessage['level']): 'default' | 'destructive' | 'outline' | 'secondary' => {\n switch (level) {\n case 'error':\n return 'destructive';\n case 'warning':\n return 'secondary';\n case 'success':\n return 'outline';\n default:\n return 'default';\n }\n };\n\n return (\n <Card className={className}>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"flex items-center gap-2\">\n <Activity className=\"h-5 w-5\" />\n Messages Feed\n <Badge variant=\"outline\">{filteredMessages.length}</Badge>\n </CardTitle>\n\n {showControls && (\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setIsPaused(!isPaused)}\n >\n {isPaused ? (\n <Play className=\"h-4 w-4\" />\n ) : (\n <Pause className=\"h-4 w-4\" />\n )}\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleClear}\n disabled={messages.length === 0}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleDownload}\n disabled={filteredMessages.length === 0}\n >\n <Download className=\"h-4 w-4\" />\n </Button>\n </div>\n )}\n </div>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n {showFilters && (\n <MessageFiltersComponent\n filters={filters}\n onFiltersChange={setFilters}\n autoScroll={autoScroll}\n onAutoScrollChange={setAutoScroll}\n />\n )}\n\n <ScrollArea className=\"h-[400px]\" viewportRef={scrollRef}>\n {filteredMessages.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Activity className=\"h-12 w-12 text-muted-foreground mb-4\" />\n <p className=\"text-sm text-muted-foreground\">\n {isPaused ? 'Paused - Click play to resume' : 'No messages yet'}\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {filteredMessages.map((msg) => (\n <div\n key={msg.id}\n className=\"p-3 rounded border hover:bg-muted/50 transition-colors cursor-pointer\"\n onClick={() => onMessageClick?.(msg)}\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-shrink-0 mt-0.5\">{getLevelIcon(msg.level)}</div>\n <div className=\"flex-1 min-w-0 space-y-1\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <Badge variant={getLevelVariant(msg.level)} className=\"text-xs\">\n {msg.type}\n </Badge>\n {msg.channel && (\n <Badge variant=\"outline\" className=\"text-xs\">\n {msg.channel}\n </Badge>\n )}\n <span className=\"text-xs text-muted-foreground\">\n {msg.formattedTime}\n </span>\n </div>\n {msg.message && (\n <p className=\"text-sm break-words\">{msg.message}</p>\n )}\n {msg.formattedData && (\n <details className=\"text-xs\">\n <summary className=\"cursor-pointer text-muted-foreground hover:text-foreground\">\n View data\n </summary>\n <pre className=\"mt-2 p-2 bg-muted rounded overflow-x-auto\">\n {msg.formattedData}\n </pre>\n </details>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </ScrollArea>\n </CardContent>\n </Card>\n );\n}\n\n","/**\n * Subscriptions List Component\n *\n * Displays active Centrifugo subscriptions with status and controls\n */\n\n'use client';\n\nimport { Subscription, SubscriptionState } from 'centrifuge';\nimport { Radio, RefreshCw, Trash2 } from 'lucide-react';\nimport React, { useEffect, useState } from 'react';\n\nimport {\n Badge, Button, Card, CardContent, CardHeader, CardTitle, ScrollArea\n} from '@djangocfg/ui-nextjs';\n\nimport { getConsolaLogger } from '../../core/logger/consolaLogger';\nimport { useCentrifugo } from '../../providers/CentrifugoProvider';\n\nconst logger = getConsolaLogger('SubscriptionsList');\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Types\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\ninterface SubscriptionItem {\n channel: string;\n state: SubscriptionState;\n}\n\nexport interface SubscriptionsListProps {\n showControls?: boolean;\n onSubscriptionClick?: (channel: string) => void;\n className?: string;\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function SubscriptionsList({\n showControls = true,\n onSubscriptionClick,\n className = '',\n}: SubscriptionsListProps) {\n const { isConnected, client } = useCentrifugo();\n const [subscriptions, setSubscriptions] = useState<SubscriptionItem[]>([]);\n\n // Update subscriptions list\n const updateSubscriptions = () => {\n if (!client || !isConnected) {\n setSubscriptions([]);\n return;\n }\n\n try {\n const centrifuge = client.getCentrifuge();\n const subs = centrifuge.subscriptions();\n const subscriptionsList: SubscriptionItem[] = [];\n \n for (const [channel, sub] of Object.entries(subs)) {\n subscriptionsList.push({\n channel,\n state: sub.state,\n });\n }\n \n setSubscriptions(subscriptionsList);\n } catch (error) {\n logger.error('Failed to get subscriptions', error);\n setSubscriptions([]);\n }\n };\n\n // Auto-update subscriptions\n useEffect(() => {\n updateSubscriptions();\n\n if (!client) return;\n\n const centrifuge = client.getCentrifuge();\n\n const handleSubscribed = () => updateSubscriptions();\n const handleUnsubscribed = () => updateSubscriptions();\n\n centrifuge.on('subscribed', handleSubscribed);\n centrifuge.on('unsubscribed', handleUnsubscribed);\n\n const interval = setInterval(updateSubscriptions, 3000);\n\n return () => {\n centrifuge.off('subscribed', handleSubscribed);\n centrifuge.off('unsubscribed', handleUnsubscribed);\n clearInterval(interval);\n };\n }, [client, isConnected]);\n\n // Unsubscribe from channel\n const handleUnsubscribe = async (channel: string) => {\n if (!client) return;\n\n try {\n await client.unsubscribe(channel);\n updateSubscriptions();\n } catch (error) {\n logger.error('Failed to unsubscribe', error);\n }\n };\n\n return (\n <Card className={className}>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"flex items-center gap-2\">\n <Radio className=\"h-5 w-5\" />\n Active Subscriptions\n <Badge variant=\"outline\">{subscriptions.length}</Badge>\n </CardTitle>\n\n {showControls && (\n <Button size=\"sm\" variant=\"outline\" onClick={updateSubscriptions}>\n <RefreshCw className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </CardHeader>\n\n <CardContent>\n {!isConnected ? (\n <div className=\"text-center py-8 text-sm text-muted-foreground\">\n Not connected to Centrifugo\n </div>\n ) : subscriptions.length === 0 ? (\n <div className=\"text-center py-8 text-sm text-muted-foreground\">\n No active subscriptions\n </div>\n ) : (\n <ScrollArea className=\"h-[300px]\">\n <div className=\"space-y-2\">\n {subscriptions.map((sub) => (\n <div\n key={sub.channel}\n className=\"flex items-center justify-between p-3 rounded border hover:bg-muted/50 transition-colors\"\n >\n <div\n className=\"flex-1 min-w-0 cursor-pointer\"\n onClick={() => onSubscriptionClick?.(sub.channel)}\n >\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {sub.state}\n </Badge>\n <span className=\"text-sm font-mono truncate\">{sub.channel}</span>\n </div>\n </div>\n\n {showControls && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => handleUnsubscribe(sub.channel)}\n >\n <Trash2 className=\"h-4 w-4 text-destructive\" />\n </Button>\n )}\n </div>\n ))}\n </div>\n </ScrollArea>\n )}\n </CardContent>\n </Card>\n );\n}\n\n","/**\n * Centrifugo Monitor Component\n *\n * Universal monitoring component that can be embedded anywhere\n * Combines ConnectionStatus, MessagesFeed, and SubscriptionsList\n */\n\n'use client';\n\nimport React from 'react';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@djangocfg/ui-nextjs';\n\nimport { ConnectionStatus } from '../ConnectionStatus';\nimport { MessagesFeed } from '../MessagesFeed';\nimport { SubscriptionsList } from '../SubscriptionsList';\n\nimport type { CentrifugoMessage } from '../MessagesFeed';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Types\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface CentrifugoMonitorProps {\n variant?: 'compact' | 'full' | 'minimal';\n showConnectionStatus?: boolean;\n showMessagesFeed?: boolean;\n showSubscriptions?: boolean;\n showFilters?: boolean;\n showControls?: boolean;\n maxMessages?: number;\n channels?: string[]; // Pre-filter by channels\n autoScroll?: boolean;\n onMessageClick?: (message: CentrifugoMessage) => void;\n onSubscriptionClick?: (channel: string) => void;\n className?: string;\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function CentrifugoMonitor({\n variant = 'full',\n showConnectionStatus = true,\n showMessagesFeed = true,\n showSubscriptions = true,\n showFilters = true,\n showControls = true,\n maxMessages = 100,\n channels = [],\n autoScroll = true,\n onMessageClick,\n onSubscriptionClick,\n className = '',\n}: CentrifugoMonitorProps) {\n // Minimal variant - only connection status\n if (variant === 'minimal') {\n return (\n <div className={className}>\n <ConnectionStatus variant=\"detailed\" showUptime showSubscriptions />\n </div>\n );\n }\n\n // Compact variant - connection status + messages feed\n if (variant === 'compact') {\n return (\n <div className={`space-y-4 ${className}`}>\n {showConnectionStatus && (\n <ConnectionStatus variant=\"detailed\" showUptime showSubscriptions />\n )}\n {showMessagesFeed && (\n <MessagesFeed\n maxMessages={maxMessages}\n showFilters={false}\n showControls={showControls}\n channels={channels}\n autoScroll={autoScroll}\n onMessageClick={onMessageClick}\n />\n )}\n </div>\n );\n }\n\n // Full variant - tabs with all features\n const tabsToShow = [\n showConnectionStatus && { value: 'connection', label: 'Connection' },\n showMessagesFeed && { value: 'messages', label: 'Messages' },\n showSubscriptions && { value: 'subscriptions', label: 'Subscriptions' },\n ].filter(Boolean) as { value: string; label: string }[];\n\n if (tabsToShow.length === 0) {\n return null;\n }\n\n return (\n <div className={className}>\n <Tabs defaultValue={tabsToShow[0].value}>\n <TabsList className={`grid w-full grid-cols-${tabsToShow.length}`}>\n {tabsToShow.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {showConnectionStatus && (\n <TabsContent value=\"connection\" className=\"mt-4\">\n <ConnectionStatus variant=\"detailed\" showUptime showSubscriptions />\n </TabsContent>\n )}\n\n {showMessagesFeed && (\n <TabsContent value=\"messages\" className=\"mt-4\">\n <MessagesFeed\n maxMessages={maxMessages}\n showFilters={showFilters}\n showControls={showControls}\n channels={channels}\n autoScroll={autoScroll}\n onMessageClick={onMessageClick}\n />\n </TabsContent>\n )}\n\n {showSubscriptions && (\n <TabsContent value=\"subscriptions\" className=\"mt-4\">\n <SubscriptionsList\n showControls={showControls}\n onSubscriptionClick={onSubscriptionClick}\n />\n </TabsContent>\n )}\n </Tabs>\n </div>\n );\n}\n\n","/**\n * Centrifugo Monitor Dialog Component\n *\n * Sheet/Dialog wrapper for CentrifugoMonitor\n * Uses event-driven approach - listens to OPEN_MONITOR_DIALOG event\n */\n\n'use client';\n\nimport { Activity } from 'lucide-react';\nimport React, { useState } from 'react';\n\nimport { useEventListener } from '@djangocfg/ui-core/hooks';\nimport {\n Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle\n} from '@djangocfg/ui-nextjs';\n\nimport { CENTRIFUGO_MONITOR_EVENTS, OpenMonitorDialogPayload} from '../../events';\nimport { CentrifugoMonitor } from './CentrifugoMonitor';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function CentrifugoMonitorDialog() {\n const [open, setOpen] = useState(false);\n const [variant, setVariant] = useState<'compact' | 'full' | 'minimal'>('full');\n\n // Listen for dialog open event\n useEventListener<typeof CENTRIFUGO_MONITOR_EVENTS.OPEN_MONITOR_DIALOG, OpenMonitorDialogPayload>(\n CENTRIFUGO_MONITOR_EVENTS.OPEN_MONITOR_DIALOG,\n (payload) => {\n if (payload?.variant) {\n setVariant(payload.variant);\n }\n setOpen(true);\n }\n );\n\n // Listen for dialog close event\n useEventListener(\n CENTRIFUGO_MONITOR_EVENTS.CLOSE_MONITOR_DIALOG,\n () => {\n setOpen(false);\n }\n );\n\n const handleClose = () => {\n setOpen(false);\n };\n\n return (\n <Sheet open={open} onOpenChange={(isOpen) => !isOpen && handleClose()}>\n <SheetContent \n side=\"right\" \n className=\"max-w-2xl w-[90vw] sm:w-[672px]\"\n >\n <SheetHeader>\n <SheetTitle className=\"flex items-center gap-2\">\n <Activity className=\"h-5 w-5\" />\n Centrifugo Monitor\n </SheetTitle>\n <SheetDescription>\n Real-time WebSocket monitoring and debugging\n </SheetDescription>\n </SheetHeader>\n\n <div className=\"mt-6\">\n <CentrifugoMonitor variant={variant} />\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n\n","/**\n * Centrifugo Package Configuration\n */\n\nexport const isDevelopment = process.env.NODE_ENV === 'development';\nexport const isProduction = !isDevelopment;\nexport const isStaticBuild = process.env.NEXT_PUBLIC_STATIC_BUILD === 'true';\n\nconst showDebugPanel = isDevelopment && !isStaticBuild;\n\n/**\n * Reconnect configuration with exponential backoff\n */\nexport const reconnectConfig = {\n // Initial delay before first reconnect attempt (ms)\n initialDelay: isDevelopment ? 2000 : 1000,\n // Maximum delay between reconnect attempts (ms)\n maxDelay: isDevelopment ? 30000 : 60000,\n // Multiplier for exponential backoff\n multiplier: 1.5,\n // Maximum number of reconnect attempts\n // Dev: 3 attempts then stop (server probably not running)\n // Prod: 10 attempts then stop (avoid infinite reconnection spam)\n maxAttempts: isDevelopment ? 3 : 10,\n // Jitter factor to randomize delays (0-1)\n jitter: 0.1,\n} as const;\n\nexport const centrifugoConfig = {\n // Show debug panel only in development and not in static builds\n showDebugPanel,\n // Reconnect settings\n reconnect: reconnectConfig,\n} as const;\n\nexport type CentrifugoConfig = typeof centrifugoConfig;\nexport type ReconnectConfig = typeof reconnectConfig;\n","/**\n * useCodegenTip Hook\n *\n * Shows development tip about client generation once per session.\n */\n\nimport { useEffect, useRef } from 'react';\n\nimport { consolaLogger } from '../core/logger/consolaLogger';\n\nconst isDevelopment = process.env.NODE_ENV === 'development';\nlet tipShown = false; // Global flag to show tip once across all components\n\n/**\n * Show dev tip about generating type-safe clients from @websocket_rpc handlers\n *\n * @example\n * function MyComponent() {\n * useCodegenTip();\n * // ... rest of component\n * }\n */\nexport function useCodegenTip() {\n const mountedRef = useRef(false);\n\n useEffect(() => {\n if (!isDevelopment) return;\n if (tipShown) return;\n if (mountedRef.current) return;\n\n mountedRef.current = true;\n tipShown = true;\n\n consolaLogger.info(\n 'š” Generate type-safe clients from @websocket_rpc handlers:\\n\\n' +\n 'python manage.py generate_centrifugo_clients --typescript\\n\\n' +\n 'Learn more: https://djangocfg.com/docs/features/integrations/centrifugo/client-generation/'\n );\n }, []);\n}\n","/**\n * usePageVisibility Hook\n *\n * Tracks browser tab visibility state using the Page Visibility API.\n * Returns true when the page is visible, false when hidden.\n *\n * Use cases:\n * - Pause/resume WebSocket connections\n * - Pause expensive operations when tab is inactive\n * - Trigger data sync when tab becomes visible\n */\n\n'use client';\n\nimport { useEffect, useState, useCallback, useRef } from 'react';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PageVisibilityState {\n /** Whether the page is currently visible */\n isVisible: boolean;\n /** Whether the page was ever hidden during this session */\n wasHidden: boolean;\n /** Timestamp when page became visible (for uptime tracking) */\n visibleSince: number | null;\n /** How long the page was hidden (ms), reset when visible */\n hiddenDuration: number;\n}\n\nexport interface UsePageVisibilityOptions {\n /** Callback when page becomes visible */\n onVisible?: () => void;\n /** Callback when page becomes hidden */\n onHidden?: () => void;\n /** Callback with visibility state change */\n onChange?: (isVisible: boolean) => void;\n}\n\nexport interface UsePageVisibilityResult extends PageVisibilityState {\n /** Force check visibility state */\n checkVisibility: () => boolean;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Get current visibility state\n * SSR-safe: returns true on server\n */\nfunction getVisibilityState(): boolean {\n if (typeof document === 'undefined') return true;\n return document.visibilityState === 'visible';\n}\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\nexport function usePageVisibility(\n options: UsePageVisibilityOptions = {}\n): UsePageVisibilityResult {\n const { onVisible, onHidden, onChange } = options;\n\n const [state, setState] = useState<PageVisibilityState>(() => ({\n isVisible: getVisibilityState(),\n wasHidden: false,\n visibleSince: getVisibilityState() ? Date.now() : null,\n hiddenDuration: 0,\n }));\n\n // Refs to avoid stale closures in callbacks\n const onVisibleRef = useRef(onVisible);\n const onHiddenRef = useRef(onHidden);\n const onChangeRef = useRef(onChange);\n const hiddenAtRef = useRef<number | null>(null);\n\n // Keep refs updated\n onVisibleRef.current = onVisible;\n onHiddenRef.current = onHidden;\n onChangeRef.current = onChange;\n\n const checkVisibility = useCallback((): boolean => {\n return getVisibilityState();\n }, []);\n\n useEffect(() => {\n if (typeof document === 'undefined') return;\n\n const handleVisibilityChange = () => {\n const isNowVisible = getVisibilityState();\n\n setState((prev) => {\n // Calculate hidden duration if becoming visible\n let hiddenDuration = prev.hiddenDuration;\n if (isNowVisible && hiddenAtRef.current !== null) {\n hiddenDuration = Date.now() - hiddenAtRef.current;\n hiddenAtRef.current = null;\n }\n\n // Track when we became hidden\n if (!isNowVisible) {\n hiddenAtRef.current = Date.now();\n }\n\n return {\n isVisible: isNowVisible,\n wasHidden: prev.wasHidden || !isNowVisible,\n visibleSince: isNowVisible ? (prev.visibleSince ?? Date.now()) : null,\n hiddenDuration,\n };\n });\n\n // Trigger callbacks\n onChangeRef.current?.(isNowVisible);\n\n if (isNowVisible) {\n onVisibleRef.current?.();\n } else {\n onHiddenRef.current?.();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, []);\n\n return {\n ...state,\n checkVisibility,\n };\n}\n\nexport default usePageVisibility;\n","/**\n * Logs Provider\n *\n * Provides access to accumulated logs via React Context.\n * Wraps LogsStore and exposes logs + controls.\n */\n\n'use client';\n\nimport {\n createContext, ReactNode, useCallback, useContext, useEffect, useState\n} from 'react';\n\nimport { getGlobalLogsStore } from '../../core/logger';\n\nimport type { LogEntry, LogLevel } from '../../core/types';\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Context\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface LogsContextValue {\n logs: LogEntry[];\n filteredLogs: LogEntry[];\n filter: LogsFilter;\n setFilter: (filter: Partial<LogsFilter>) => void;\n clearLogs: () => void;\n count: number;\n}\n\nexport interface LogsFilter {\n level?: LogLevel;\n source?: LogEntry['source'];\n search?: string;\n}\n\nconst LogsContext = createContext<LogsContextValue | undefined>(undefined);\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Provider\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface LogsProviderProps {\n children: ReactNode;\n}\n\nexport function LogsProvider({ children }: LogsProviderProps) {\n const [logs, setLogs] = useState<LogEntry[]>([]);\n const [filter, setFilterState] = useState<LogsFilter>({});\n\n const logsStore = getGlobalLogsStore();\n\n // Subscribe to log changes\n useEffect(() => {\n // Initial load\n setLogs(logsStore.getAll());\n\n // Subscribe to updates\n const unsubscribe = logsStore.subscribe((updatedLogs) => {\n setLogs(updatedLogs);\n });\n\n return unsubscribe;\n }, [logsStore]);\n\n // Filter logs\n const filteredLogs = logs.filter((log) => {\n if (filter.level && log.level !== filter.level) return false;\n if (filter.source && log.source !== filter.source) return false;\n if (filter.search) {\n const searchLower = filter.search.toLowerCase();\n return log.message.toLowerCase().includes(searchLower);\n }\n return true;\n });\n\n // Set filter (merge with existing)\n const setFilter = useCallback((partialFilter: Partial<LogsFilter>) => {\n setFilterState((prev) => ({ ...prev, ...partialFilter }));\n }, []);\n\n // Clear all logs\n const clearLogs = useCallback(() => {\n logsStore.clear();\n }, [logsStore]);\n\n const value: LogsContextValue = {\n logs,\n filteredLogs,\n filter,\n setFilter,\n clearLogs,\n count: logs.length,\n };\n\n return <LogsContext.Provider value={value}>{children}</LogsContext.Provider>;\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Hook\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function useLogs(): LogsContextValue {\n const context = useContext(LogsContext);\n\n if (context === undefined) {\n throw new Error('useLogs must be used within a LogsProvider');\n }\n\n return context;\n}\n","/**\n * Centrifugo Provider\n *\n * Main provider that manages WebSocket connection.\n * Wraps LogsProvider to provide logs accumulation.\n */\n\n'use client';\n\nimport {\n createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState\n} from 'react';\n\nimport { useAuth } from '@djangocfg/api/auth';\n\nimport {\n CentrifugoMonitorDialog\n} from '../../components/CentrifugoMonitor/CentrifugoMonitorDialog';\nimport { isDevelopment, isStaticBuild, reconnectConfig } from '../../config';\nimport { CentrifugoRPCClient } from '../../core/client';\nimport { getConsolaLogger } from '../../core/logger/consolaLogger';\nimport { useCodegenTip } from '../../hooks/useCodegenTip';\nimport { usePageVisibility } from '../../hooks/usePageVisibility';\nimport { LogsProvider } from '../LogsProvider';\n\nimport type { ConnectionState, CentrifugoToken, ActiveSubscription } from '../../core/types';\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Context\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface CentrifugoContextValue {\n // Client\n client: CentrifugoRPCClient | null;\n\n // Connection State\n isConnected: boolean;\n isConnecting: boolean;\n error: Error | null;\n connectionState: ConnectionState;\n\n // Connection Info\n uptime: number; // seconds\n subscriptions: string[];\n activeSubscriptions: ActiveSubscription[];\n\n // Controls\n connect: () => Promise<void>;\n disconnect: () => void;\n reconnect: () => Promise<void>;\n unsubscribe: (channel: string) => void;\n\n // Config\n enabled: boolean;\n}\n\nconst CentrifugoContext = createContext<CentrifugoContextValue | undefined>(undefined);\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Provider Props\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface CentrifugoProviderProps {\n children: ReactNode;\n enabled?: boolean;\n url?: string;\n autoConnect?: boolean;\n /**\n * Callback to refresh the Centrifugo token when it expires.\n * If provided, centrifuge-js will automatically call this when token expires.\n * Should return a fresh JWT token string.\n *\n * @example\n * onTokenRefresh={async () => {\n * const response = await getCentrifugoAuthTokenRetrieve();\n * return response.token;\n * }}\n */\n onTokenRefresh?: () => Promise<string>;\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Inner Provider (has access to LogsProvider)\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nfunction CentrifugoProviderInner({\n children,\n enabled = false,\n url,\n autoConnect: autoConnectProp = true,\n onTokenRefresh,\n}: CentrifugoProviderProps) {\n // useAuth is SSR-safe - returns default state when outside AuthProvider\n const { isAuthenticated, isLoading, user } = useAuth();\n\n const [client, setClient] = useState<CentrifugoRPCClient | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [isConnecting, setIsConnecting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [connectionTime, setConnectionTime] = useState<Date | null>(null);\n const [uptime, setUptime] = useState<number>(0);\n const [subscriptions, setSubscriptions] = useState<string[]>([]);\n const [activeSubscriptions, setActiveSubscriptions] = useState<ActiveSubscription[]>([]);\n\n const logger = useMemo(() => getConsolaLogger('provider'), []);\n\n // Show dev tip about client generation\n useCodegenTip();\n\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const hasConnectedRef = useRef(false);\n const isConnectingRef = useRef(false);\n const isMountedRef = useRef(true);\n const reconnectAttemptRef = useRef(0);\n const reconnectStoppedRef = useRef(false); // Track if we should stop reconnecting\n const devWarningShownRef = useRef(false); // Track if server unavailable warning was shown\n const connectRef = useRef<(() => Promise<void>) | null>(null);\n const disconnectRef = useRef<(() => void) | null>(null);\n const wasConnectedBeforeHiddenRef = useRef(false); // Track connection state before page hidden\n const clientInstanceRef = useRef<CentrifugoRPCClient | null>(null); // Stable client reference for reconnection\n\n const centrifugoToken: CentrifugoToken | undefined = user?.centrifugo;\n const hasCentrifugoToken = !!centrifugoToken?.token;\n\n // Calculate reconnect delay with exponential backoff\n const getReconnectDelay = useCallback((attempt: number): number => {\n const { initialDelay, maxDelay, multiplier, jitter } = reconnectConfig;\n\n // Exponential backoff: initialDelay * multiplier^attempt\n let delay = initialDelay * Math.pow(multiplier, attempt);\n\n // Cap at maxDelay\n delay = Math.min(delay, maxDelay);\n\n // Add jitter to prevent thundering herd\n const jitterAmount = delay * jitter * (Math.random() * 2 - 1);\n delay = Math.round(delay + jitterAmount);\n\n return delay;\n }, []);\n\n const wsUrl = useMemo(() => {\n if (url) return url;\n if (centrifugoToken?.centrifugo_url) return centrifugoToken.centrifugo_url;\n return '';\n }, [url, centrifugoToken?.centrifugo_url]);\n\n const autoConnect = autoConnectProp &&\n (isAuthenticated && !isLoading) &&\n enabled &&\n hasCentrifugoToken;\n\n // Log connection decision\n useEffect(() => {\n if (!isLoading) {\n logger.info(`Auto-connect: ${autoConnect ? 'YES' : 'NO'}`, {\n authenticated: isAuthenticated,\n loading: isLoading,\n enabled,\n hasToken: hasCentrifugoToken,\n url: wsUrl,\n });\n }\n }, [autoConnect, isAuthenticated, isLoading, enabled, hasCentrifugoToken, logger, wsUrl]);\n\n // Update uptime every second\n useEffect(() => {\n if (!isConnected || !connectionTime) {\n setUptime(0);\n return;\n }\n\n const updateUptime = () => {\n const now = new Date();\n const diff = Math.floor((now.getTime() - connectionTime.getTime()) / 1000);\n setUptime(diff);\n };\n\n updateUptime();\n const interval = setInterval(updateUptime, 1000);\n\n return () => clearInterval(interval);\n }, [isConnected, connectionTime]);\n\n // Update subscriptions periodically\n useEffect(() => {\n if (!client || !isConnected) {\n setSubscriptions([]);\n setActiveSubscriptions([]);\n return;\n }\n\n const updateSubs = () => {\n try {\n const subs = client.getAllSubscriptions?.() || [];\n setSubscriptions(subs);\n\n // Convert to ActiveSubscription format\n const activeSubs: ActiveSubscription[] = subs.map((channel) => ({\n channel,\n type: 'client' as const,\n subscribedAt: Date.now(),\n }));\n setActiveSubscriptions(activeSubs);\n } catch (error) {\n logger.error('Failed to get subscriptions', error);\n }\n };\n\n updateSubs();\n const interval = setInterval(updateSubs, 2000);\n\n return () => clearInterval(interval);\n }, [client, isConnected, logger]);\n\n // Connect function\n const connect = useCallback(async () => {\n // Don't reconnect if we've decided to stop (dev mode hit max attempts)\n if (reconnectStoppedRef.current) return;\n if (hasConnectedRef.current || isConnectingRef.current) return;\n if (isConnecting || isConnected) return;\n\n isConnectingRef.current = true;\n setIsConnecting(true);\n setError(null);\n\n try {\n // Check if we can reuse existing client (reconnection scenario)\n if (clientInstanceRef.current) {\n logger.info('Reconnecting to WebSocket server (reusing client)...');\n await clientInstanceRef.current.connect();\n\n if (!isMountedRef.current) {\n isConnectingRef.current = false;\n return;\n }\n\n hasConnectedRef.current = true;\n isConnectingRef.current = false;\n\n // Clear any pending reconnect timeout\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n }\n\n // Use existing client reference - NO setClient() call to keep reference stable\n setIsConnected(true);\n setConnectionTime(new Date());\n setError(null);\n\n logger.success('WebSocket reconnected');\n\n // Reset reconnect state on successful connection\n reconnectAttemptRef.current = 0;\n devWarningShownRef.current = false;\n reconnectStoppedRef.current = false;\n return;\n }\n\n // First connection - create new client\n logger.info('Connecting to WebSocket server...');\n\n if (!centrifugoToken?.token) {\n throw new Error('No Centrifugo token available');\n }\n\n const token = centrifugoToken.token;\n let userId = user?.id?.toString() || '1';\n\n if (!user?.id) {\n try {\n const tokenPayload = JSON.parse(atob(token.split('.')[1]));\n userId = tokenPayload.user_id?.toString() || tokenPayload.sub?.toString() || '1';\n } catch (err) {\n // Fallback\n }\n }\n\n const rpcClient = new CentrifugoRPCClient({\n url: wsUrl,\n token,\n userId,\n timeout: 30000,\n logger,\n getToken: onTokenRefresh,\n });\n await rpcClient.connect();\n\n if (!isMountedRef.current) {\n rpcClient.disconnect();\n isConnectingRef.current = false;\n return;\n }\n\n hasConnectedRef.current = true;\n isConnectingRef.current = false;\n\n // Clear any pending reconnect timeout\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n }\n\n // Store client in ref for future reconnections\n clientInstanceRef.current = rpcClient;\n setClient(rpcClient);\n setIsConnected(true);\n setConnectionTime(new Date());\n setError(null);\n\n logger.success('WebSocket connected');\n\n // Reset reconnect state on successful connection\n reconnectAttemptRef.current = 0;\n devWarningShownRef.current = false;\n reconnectStoppedRef.current = false;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Connection failed');\n setError(error);\n setClient(null);\n setIsConnected(false);\n setConnectionTime(null);\n hasConnectedRef.current = false;\n isConnectingRef.current = false;\n\n const isAuthError = error.message.includes('token') ||\n error.message.includes('auth') ||\n error.message.includes('expired');\n\n if (isAuthError) {\n logger.error('Authentication failed', error);\n } else {\n // Check if we should attempt reconnect\n const { maxAttempts } = reconnectConfig;\n const currentAttempt = reconnectAttemptRef.current;\n\n // In dev mode: show warning once and stop after maxAttempts\n if (isDevelopment) {\n if (!devWarningShownRef.current) {\n devWarningShownRef.current = true;\n logger.warning(\n 'š Centrifugo server is not running. ' +\n 'Start it with: docker compose -f docker-compose-local-services.yml up centrifugo'\n );\n }\n\n // Stop reconnecting after maxAttempts in dev mode\n if (maxAttempts > 0 && currentAttempt >= maxAttempts) {\n reconnectStoppedRef.current = true; // Mark as stopped permanently\n logger.info(`Stopped reconnecting after ${maxAttempts} attempts (dev mode)`);\n return;\n }\n }\n\n // Try to reconnect with exponential backoff (respects maxAttempts)\n if (currentAttempt < maxAttempts) {\n const delay = getReconnectDelay(currentAttempt);\n reconnectAttemptRef.current = currentAttempt + 1;\n\n if (!isDevelopment || currentAttempt < 2) {\n // Only log in prod, or first 2 attempts in dev\n logger.info(`Reconnecting in ${Math.round(delay / 1000)}s (attempt ${currentAttempt + 1}/${maxAttempts})...`);\n }\n\n reconnectTimeoutRef.current = setTimeout(() => {\n connectRef.current?.();\n }, delay);\n } else {\n // Max attempts reached - stop reconnecting\n reconnectStoppedRef.current = true;\n logger.warning(`Stopped reconnecting after ${maxAttempts} attempts. WebSocket server may be unavailable.`);\n }\n }\n } finally {\n setIsConnecting(false);\n }\n }, [wsUrl, centrifugoToken, user, logger, isConnecting, isConnected, getReconnectDelay, onTokenRefresh]);\n\n // Disconnect function\n const disconnect = useCallback(() => {\n if (isConnectingRef.current) return;\n\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n }\n\n if (client) {\n logger.info('Disconnecting from WebSocket server...');\n client.disconnect();\n setClient(null);\n setIsConnected(false);\n setConnectionTime(null);\n setError(null);\n setSubscriptions([]);\n }\n\n hasConnectedRef.current = false;\n isConnectingRef.current = false;\n reconnectAttemptRef.current = 0;\n devWarningShownRef.current = false;\n reconnectStoppedRef.current = false; // Reset so manual reconnect works\n }, [client, logger]);\n\n // Reconnect function\n const reconnect = useCallback(async () => {\n disconnect();\n await connect();\n }, [connect, disconnect]);\n\n // Unsubscribe function\n const unsubscribe = useCallback((channel: string) => {\n if (!client) {\n logger.warning('Cannot unsubscribe: client not connected');\n return;\n }\n\n try {\n client.unsubscribe?.(channel);\n logger.info(`Unsubscribed from channel: ${channel}`);\n\n // Update state immediately\n setSubscriptions((prev) => prev.filter((ch) => ch !== channel));\n setActiveSubscriptions((prev) => prev.filter((sub) => sub.channel !== channel));\n } catch (error) {\n logger.error(`Failed to unsubscribe from ${channel}`, error);\n }\n }, [client, logger]);\n\n // Keep refs up-to-date\n connectRef.current = connect;\n disconnectRef.current = disconnect;\n\n // Auto-connect on mount - uses refs to avoid recreation issues\n useEffect(() => {\n isMountedRef.current = true;\n\n if (autoConnect && !hasConnectedRef.current && !reconnectStoppedRef.current) {\n connectRef.current?.();\n }\n\n return () => {\n if (isConnectingRef.current && !hasConnectedRef.current) {\n return;\n }\n\n if (!hasConnectedRef.current) {\n return;\n }\n\n isMountedRef.current = false;\n disconnectRef.current?.();\n };\n }, [autoConnect]); // Only depend on autoConnect, not on connect/disconnect\n\n // ==========================================================================\n // PAGE VISIBILITY HANDLING\n // ==========================================================================\n // When tab becomes hidden: pause reconnect attempts (save battery)\n // When tab becomes visible: trigger reconnect if needed\n\n usePageVisibility({\n onHidden: () => {\n // Save connection state before hiding\n wasConnectedBeforeHiddenRef.current = isConnected;\n\n // Pause reconnect attempts while tab is hidden (save battery)\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n logger.debug('Paused reconnect attempts (tab hidden)');\n }\n },\n onVisible: () => {\n // Only attempt reconnect if:\n // 1. We should auto-connect\n // 2. We're not already connected or connecting\n // 3. We haven't stopped reconnecting\n // 4. We were previously connected (or never connected yet)\n const shouldReconnect =\n autoConnect &&\n !isConnected &&\n !isConnectingRef.current &&\n !reconnectStoppedRef.current &&\n (wasConnectedBeforeHiddenRef.current || !hasConnectedRef.current);\n\n if (shouldReconnect) {\n // Reset reconnect attempts for fresh start\n reconnectAttemptRef.current = 0;\n devWarningShownRef.current = false;\n\n logger.info('Tab visible - attempting reconnect...');\n connectRef.current?.();\n } else if (isConnected) {\n logger.debug('Tab visible - connection still active');\n }\n },\n });\n\n const connectionState: ConnectionState = isConnected\n ? 'connected'\n : isConnecting\n ? 'connecting'\n : error\n ? 'error'\n : 'disconnected';\n\n const value: CentrifugoContextValue = {\n client,\n isConnected,\n isConnecting,\n error,\n connectionState,\n uptime,\n subscriptions,\n activeSubscriptions,\n connect,\n disconnect,\n reconnect,\n unsubscribe,\n enabled,\n };\n\n return (\n <CentrifugoContext.Provider value={value}>\n {children}\n </CentrifugoContext.Provider>\n );\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Main Provider (wraps LogsProvider and includes Dialog)\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function CentrifugoProvider(props: CentrifugoProviderProps) {\n return (\n <LogsProvider>\n <CentrifugoProviderInner {...props}>\n {props.children}\n <CentrifugoMonitorDialog />\n </CentrifugoProviderInner>\n </LogsProvider>\n );\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Hook\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function useCentrifugo(): CentrifugoContextValue {\n const context = useContext(CentrifugoContext);\n\n if (context === undefined) {\n throw new Error('useCentrifugo must be used within a CentrifugoProvider');\n }\n\n return context;\n}\n","/**\n * Channel name validation utilities for Centrifugo\n *\n * Helps detect common mistakes with channel naming that can lead to permission errors.\n */\n\nexport interface ChannelValidationResult {\n valid: boolean;\n warning?: string;\n suggestion?: string;\n}\n\n/**\n * Validates Centrifugo channel name and detects potential issues.\n *\n * Common issues:\n * - Using `#` for namespace separator (should use `:`)\n * - User-limited channels without proper JWT token setup\n *\n * @param channel - Channel name to validate\n * @returns Validation result with warnings and suggestions\n *\n * @example\n * ```ts\n * // ā Bad: might be interpreted as user-limited channel\n * validateChannelName('terminal#session#abc123')\n * // Returns: { valid: false, warning: \"...\", suggestion: \"Use terminal:session:abc123\" }\n *\n * // ā
Good: proper namespace separator\n * validateChannelName('terminal:session:abc123')\n * // Returns: { valid: true }\n * ```\n */\nexport function validateChannelName(channel: string): ChannelValidationResult {\n // Check for multiple # symbols (potential user-limited channel misuse)\n const hashCount = (channel.match(/#/g) || []).length;\n\n if (hashCount >= 2) {\n // Pattern: namespace#something#something\n // This might be interpreted as user-limited channel: namespace#user_id#channel\n const parts = channel.split('#');\n const [namespace, possibleUserId, ...rest] = parts;\n\n // Check if second part looks like a user ID (numeric)\n const isNumericUserId = /^\\d+$/.test(possibleUserId);\n\n if (!isNumericUserId && possibleUserId) {\n // Non-numeric second part after # - likely a mistake\n const suggestion = channel.replace(/#/g, ':');\n\n return {\n valid: false,\n warning: `Channel \"${channel}\" uses '#' separator which Centrifugo interprets as user-limited channel boundary. ` +\n `The part \"${possibleUserId}\" will be treated as user_id, which may cause permission errors if not in JWT token.`,\n suggestion: `Use ':' for namespace separation: \"${suggestion}\"`\n };\n }\n\n if (isNumericUserId) {\n return {\n valid: true,\n warning: `Channel \"${channel}\" appears to be a user-limited channel (user_id: ${possibleUserId}). ` +\n `Make sure your JWT token's \"sub\" field matches \"${possibleUserId}\".`,\n };\n }\n }\n\n // Single # is okay for user-limited channels like \"user#123\"\n if (hashCount === 1) {\n const [namespace, userId] = channel.split('#');\n if (userId && !/^\\d+$/.test(userId) && userId !== '*') {\n // Non-numeric user_id (not a wildcard) - might be a mistake\n const suggestion = channel.replace('#', ':');\n return {\n valid: false,\n warning: `Channel \"${channel}\" uses '#' but \"${userId}\" doesn't look like a user_id. ` +\n `This might cause permission issues.`,\n suggestion: `Consider using ':' instead: \"${suggestion}\"`\n };\n }\n }\n\n return { valid: true };\n}\n\n/**\n * Log channel validation warnings to console (development only).\n *\n * @param channel - Channel name to validate\n * @param logger - Logger instance (optional)\n */\nexport function logChannelWarnings(\n channel: string,\n logger?: { warning: (msg: string) => void }\n): void {\n if (process.env.NODE_ENV === 'production') {\n return; // Skip in production\n }\n\n const result = validateChannelName(channel);\n\n if (!result.valid && result.warning) {\n const message = `[Centrifugo Channel Warning]\\n${result.warning}${\n result.suggestion ? `\\nš” Suggestion: ${result.suggestion}` : ''\n }`;\n\n if (logger?.warning) {\n logger.warning(message);\n } else {\n console.warn(message);\n }\n } else if (result.warning) {\n // Valid but has informational warning\n if (logger?.warning) {\n logger.warning(`[Centrifugo] ${result.warning}`);\n }\n }\n}\n","/**\n * useSubscription Hook\n *\n * Subscribe to Centrifugo channel with auto-cleanup.\n * \n * Best practices:\n * - Callbacks are stored in refs to avoid re-subscriptions\n * - Proper error handling in callbacks (as recommended by centrifuge-js)\n * - Cleanup on unmount\n * - Stable unsubscribe function\n */\n\n'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { getConsolaLogger } from '../core/logger/consolaLogger';\nimport { logChannelWarnings } from '../core/utils/channelValidator';\nimport { useCentrifugo } from '../providers/CentrifugoProvider';\n\nexport interface UseSubscriptionOptions<T = any> {\n channel: string;\n enabled?: boolean;\n onPublication?: (data: T) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UseSubscriptionResult<T = any> {\n data: T | null;\n error: Error | null;\n isSubscribed: boolean;\n unsubscribe: () => void;\n}\n\nexport function useSubscription<T = any>(\n options: UseSubscriptionOptions<T>\n): UseSubscriptionResult<T> {\n const { client, isConnected } = useCentrifugo();\n const { channel, enabled = true, onPublication, onError } = options;\n\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isSubscribed, setIsSubscribed] = useState(false);\n\n const unsubscribeRef = useRef<(() => void) | null>(null);\n const logger = useRef(getConsolaLogger('useSubscription')).current;\n \n // Store callbacks in refs to avoid re-subscriptions when they change\n const onPublicationRef = useRef(onPublication);\n const onErrorRef = useRef(onError);\n \n useEffect(() => {\n onPublicationRef.current = onPublication;\n onErrorRef.current = onError;\n }, [onPublication, onError]);\n\n // Unsubscribe function\n const unsubscribe = useCallback(() => {\n if (unsubscribeRef.current) {\n try {\n unsubscribeRef.current();\n unsubscribeRef.current = null;\n setIsSubscribed(false);\n logger.info(`Unsubscribed from channel: ${channel}`);\n } catch (err) {\n logger.error(`Error during unsubscribe from ${channel}`, err);\n }\n }\n }, [channel, logger]);\n\n // Subscribe effect\n useEffect(() => {\n if (!client || !isConnected || !enabled) {\n // Reset state when not connected\n if (!isConnected && isSubscribed) {\n setIsSubscribed(false);\n }\n return;\n }\n\n // Validate channel name and log warnings (dev only)\n logChannelWarnings(channel, logger);\n\n logger.info(`Subscribing to channel: ${channel}`);\n\n try {\n const unsub = client.subscribe(channel, (receivedData: T) => {\n try {\n // Error handling in callback as recommended by centrifuge-js docs\n setData(receivedData);\n setError(null);\n onPublicationRef.current?.(receivedData);\n } catch (callbackError) {\n logger.error(`Error in onPublication callback for ${channel}`, callbackError);\n }\n });\n\n unsubscribeRef.current = unsub;\n setIsSubscribed(true);\n logger.success(`Subscribed to channel: ${channel}`);\n } catch (err) {\n const subscriptionError = err instanceof Error ? err : new Error('Subscription failed');\n setError(subscriptionError);\n \n try {\n onErrorRef.current?.(subscriptionError);\n } catch (callbackError) {\n logger.error(`Error in onError callback for ${channel}`, callbackError);\n }\n \n logger.error(`Subscription failed: ${channel}`, subscriptionError);\n }\n\n // Cleanup on unmount or deps change\n return () => {\n unsubscribe();\n };\n }, [client, isConnected, enabled, channel, unsubscribe, logger, isSubscribed]);\n\n return {\n data,\n error,\n isSubscribed,\n unsubscribe,\n };\n}\n","/**\n * useRPC Hook\n *\n * React hook for making RPC calls via Centrifugo using correlation ID pattern.\n * Provides type-safe request-response communication over WebSocket.\n * \n * Pattern:\n * 1. Client sends request with correlation_id to rpc#{method}\n * 2. Backend processes and sends response to user#{userId} with same correlation_id\n * 3. Client matches response by correlation_id and resolves Promise\n * \n * @example\n * const { call, isLoading, error } = useRPC();\n * \n * const handleGetStats = async () => {\n * const result = await call('tasks.get_stats', { bot_id: '123' });\n * console.log('Stats:', result);\n * };\n */\n\n'use client';\n\nimport { useCallback, useRef, useState } from 'react';\n\nimport { getConsolaLogger } from '../core/logger/consolaLogger';\nimport { useCentrifugo } from '../providers/CentrifugoProvider';\n\nexport interface UseRPCOptions {\n timeout?: number;\n replyChannel?: string;\n onError?: (error: Error) => void;\n}\n\nexport interface UseRPCResult {\n call: <TRequest = any, TResponse = any>(\n method: string,\n params: TRequest,\n options?: UseRPCOptions\n ) => Promise<TResponse>;\n isLoading: boolean;\n error: Error | null;\n reset: () => void;\n}\n\nexport function useRPC(defaultOptions: UseRPCOptions = {}): UseRPCResult {\n const { client, isConnected } = useCentrifugo();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const logger = useRef(getConsolaLogger('useRPC')).current;\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const reset = useCallback(() => {\n setIsLoading(false);\n setError(null);\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n }, []);\n\n const call = useCallback(\n async <TRequest = any, TResponse = any>(\n method: string,\n params: TRequest,\n options: UseRPCOptions = {}\n ): Promise<TResponse> => {\n if (!client) {\n const error = new Error('Centrifugo client not available');\n setError(error);\n throw error;\n }\n\n if (!isConnected) {\n const error = new Error('Not connected to Centrifugo');\n setError(error);\n throw error;\n }\n\n // Reset previous state\n setError(null);\n setIsLoading(true);\n\n // Create abort controller for this call\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const mergedOptions = {\n ...defaultOptions,\n ...options,\n };\n\n logger.info(`RPC call: ${method}`, { params });\n\n const result = await client.rpc<TRequest, TResponse>(\n method,\n params,\n {\n timeout: mergedOptions.timeout,\n replyChannel: mergedOptions.replyChannel,\n }\n );\n\n // Check if aborted\n if (abortController.signal.aborted) {\n throw new Error('RPC call aborted');\n }\n\n logger.success(`RPC success: ${method}`);\n setIsLoading(false);\n return result;\n } catch (err) {\n const rpcError = err instanceof Error ? err : new Error('RPC call failed');\n \n // Don't set error if aborted\n if (!abortController.signal.aborted) {\n setError(rpcError);\n logger.error(`RPC failed: ${method}`, rpcError);\n \n // Call error callback if provided\n const onError = options.onError || defaultOptions.onError;\n if (onError) {\n try {\n onError(rpcError);\n } catch (callbackError) {\n logger.error('Error in onError callback', callbackError);\n }\n }\n }\n \n setIsLoading(false);\n throw rpcError;\n } finally {\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n }\n },\n [client, isConnected, defaultOptions, logger]\n );\n\n return {\n call,\n isLoading,\n error,\n reset,\n };\n}\n\n","/**\n * useNamedRPC Hook\n *\n * React hook for making native Centrifugo RPC calls via RPC proxy.\n * Uses Centrifugo's built-in RPC mechanism which proxies to Django.\n *\n * Flow:\n * 1. Client calls namedRPC('terminal.input', data)\n * 2. Centrifuge.js sends RPC over WebSocket\n * 3. Centrifugo proxies to Django: POST /centrifugo/rpc/\n * 4. Django routes to @websocket_rpc handler\n * 5. Response returned to client\n *\n * @example\n * const { call, isLoading, error } = useNamedRPC();\n *\n * const handleSendInput = async () => {\n * const result = await call('terminal.input', {\n * session_id: 'abc-123',\n * data: btoa('ls -la')\n * });\n * console.log('Result:', result);\n * };\n */\n\n'use client';\n\nimport { useCallback, useRef, useState } from 'react';\n\nimport { getConsolaLogger } from '../core/logger/consolaLogger';\nimport { useCentrifugo } from '../providers/CentrifugoProvider';\n\nexport interface UseNamedRPCOptions {\n onError?: (error: Error) => void;\n}\n\nexport interface UseNamedRPCResult {\n call: <TRequest = any, TResponse = any>(\n method: string,\n data: TRequest\n ) => Promise<TResponse>;\n isLoading: boolean;\n error: Error | null;\n reset: () => void;\n}\n\nexport function useNamedRPC(\n defaultOptions: UseNamedRPCOptions = {}\n): UseNamedRPCResult {\n const { client, isConnected } = useCentrifugo();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const logger = useRef(getConsolaLogger('useNamedRPC')).current;\n\n const reset = useCallback(() => {\n setIsLoading(false);\n setError(null);\n }, []);\n\n const call = useCallback(\n async <TRequest = any, TResponse = any>(\n method: string,\n data: TRequest\n ): Promise<TResponse> => {\n if (!client) {\n const error = new Error('Centrifugo client not available');\n setError(error);\n throw error;\n }\n\n if (!isConnected) {\n const error = new Error('Not connected to Centrifugo');\n setError(error);\n throw error;\n }\n\n // Reset previous state\n setError(null);\n setIsLoading(true);\n\n try {\n logger.info(`Native RPC call: ${method}`, { data });\n\n const result = await client.namedRPC<TRequest, TResponse>(method, data);\n\n logger.success(`Native RPC success: ${method}`);\n setIsLoading(false);\n return result;\n } catch (err) {\n const rpcError =\n err instanceof Error ? err : new Error('Native RPC call failed');\n\n setError(rpcError);\n logger.error(`Native RPC failed: ${method}`, rpcError);\n\n // Call error callback if provided\n if (defaultOptions.onError) {\n try {\n defaultOptions.onError(rpcError);\n } catch (callbackError) {\n logger.error('Error in onError callback', callbackError);\n }\n }\n\n setIsLoading(false);\n throw rpcError;\n }\n },\n [client, isConnected, defaultOptions, logger]\n );\n\n return {\n call,\n isLoading,\n error,\n reset,\n };\n}\n","/**\n * RPC Retry Handler with exponential backoff.\n *\n * Mirrors Swift's RPCRetryHandler implementation with:\n * - Configurable max retries and delays\n * - Exponential backoff with jitter\n * - Retry decision based on RPCError.isRetryable\n */\n\nimport { RPCError } from './RPCError';\n\nexport interface RetryConfig {\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n jitterFactor: number;\n}\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n baseDelayMs: 1000,\n maxDelayMs: 10000,\n jitterFactor: 0.2,\n};\n\nexport interface RetryState {\n attempt: number;\n lastError: RPCError | null;\n totalDelayMs: number;\n}\n\n/**\n * Calculate delay with exponential backoff and jitter.\n */\nexport function calculateDelay(\n attempt: number,\n config: RetryConfig,\n error?: RPCError\n): number {\n // Use error's suggested delay if available\n const baseDelay = error?.suggestedRetryDelay ?? config.baseDelayMs;\n\n // Exponential: base * 2^attempt\n const exponentialDelay = baseDelay * Math.pow(2, attempt);\n\n // Cap at max\n const cappedDelay = Math.min(exponentialDelay, config.maxDelayMs);\n\n // Add jitter: delay * (1 ± jitterFactor * random)\n const jitter = cappedDelay * config.jitterFactor * (Math.random() * 2 - 1);\n\n return Math.max(0, Math.round(cappedDelay + jitter));\n}\n\n/**\n * Sleep for specified milliseconds.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Execute operation with retry logic.\n *\n * @param operation - Async function to execute\n * @param config - Retry configuration\n * @param onRetry - Optional callback before each retry\n * @returns Promise with operation result\n * @throws RPCError after all retries exhausted\n */\nexport async function withRetry<T>(\n operation: () => Promise<T>,\n config: Partial<RetryConfig> = {},\n onRetry?: (state: RetryState, delayMs: number) => void\n): Promise<T> {\n const fullConfig: RetryConfig = { ...DEFAULT_RETRY_CONFIG, ...config };\n const state: RetryState = {\n attempt: 0,\n lastError: null,\n totalDelayMs: 0,\n };\n\n while (state.attempt <= fullConfig.maxRetries) {\n try {\n return await operation();\n } catch (error) {\n const rpcError = RPCError.fromError(error);\n state.lastError = rpcError;\n\n // Don't retry non-retryable errors\n if (!rpcError.isRetryable) {\n throw rpcError;\n }\n\n // Check if we have retries left\n if (state.attempt >= fullConfig.maxRetries) {\n throw rpcError;\n }\n\n // Calculate delay and wait\n const delayMs = calculateDelay(state.attempt, fullConfig, rpcError);\n state.totalDelayMs += delayMs;\n\n // Notify about retry\n if (onRetry) {\n onRetry(state, delayMs);\n }\n\n await sleep(delayMs);\n state.attempt++;\n }\n }\n\n // Should not reach here, but TypeScript needs this\n throw state.lastError ?? new RPCError('unknown', 'Retry failed');\n}\n\n/**\n * Create a retry wrapper for RPC calls.\n */\nexport function createRetryHandler(config: Partial<RetryConfig> = {}) {\n const fullConfig: RetryConfig = { ...DEFAULT_RETRY_CONFIG, ...config };\n\n return {\n config: fullConfig,\n\n /**\n * Execute with retry.\n */\n execute: <T>(\n operation: () => Promise<T>,\n onRetry?: (state: RetryState, delayMs: number) => void\n ) => withRetry(operation, fullConfig, onRetry),\n\n /**\n * Check if error should be retried.\n */\n shouldRetry: (error: unknown, attempt: number): boolean => {\n if (attempt >= fullConfig.maxRetries) {\n return false;\n }\n const rpcError = RPCError.fromError(error);\n return rpcError.isRetryable;\n },\n\n /**\n * Get delay for next retry.\n */\n getDelay: (attempt: number, error?: unknown): number => {\n const rpcError = error ? RPCError.fromError(error) : undefined;\n return calculateDelay(attempt, fullConfig, rpcError);\n },\n };\n}\n","/**\n * Centrifugo Monitor FAB Component\n *\n * Floating Action Button that opens CentrifugoMonitorDialog via events\n * Replaces the old DebugPanel FAB\n */\n\n'use client';\n\nimport { Activity } from 'lucide-react';\nimport React from 'react';\n\nimport { emitOpenMonitorDialog, OpenMonitorDialogPayload} from '../../events';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Types\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface CentrifugoMonitorFABProps {\n position?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';\n size?: 'sm' | 'md' | 'lg';\n variant?: OpenMonitorDialogPayload['variant'];\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function CentrifugoMonitorFAB({\n position = 'bottom-left',\n size = 'md',\n variant = 'full',\n}: CentrifugoMonitorFABProps) {\n\n // Position styles\n const positionStyles = {\n 'bottom-left': { bottom: '1rem', left: '1rem' },\n 'bottom-right': { bottom: '1rem', right: '1rem' },\n 'top-left': { top: '1rem', left: '1rem' },\n 'top-right': { top: '1rem', right: '1rem' },\n };\n\n // Size styles\n const sizeStyles = {\n sm: { width: '48px', height: '48px' },\n md: { width: '56px', height: '56px' },\n lg: { width: '64px', height: '64px' },\n };\n\n const iconSizes = {\n sm: 'h-5 w-5',\n md: 'h-6 w-6',\n lg: 'h-7 w-7',\n };\n\n const handleClick = () => {\n emitOpenMonitorDialog({ variant });\n };\n\n return (\n <button\n onClick={handleClick}\n className=\"rounded-full bg-primary text-primary-foreground shadow-lg hover:bg-primary/90 transition-all duration-200 flex items-center justify-center hover:scale-110\"\n style={{\n position: 'fixed',\n ...positionStyles[position],\n ...sizeStyles[size],\n zIndex: 9999,\n }}\n aria-label=\"Open Centrifugo Monitor\"\n >\n <Activity className={iconSizes[size]} />\n </button>\n );\n}\n\n","/**\n * Centrifugo Monitor Widget Component\n *\n * Card-based widget for dashboards\n * Opens monitor dialog via events\n */\n\n'use client';\n\nimport { Activity, Maximize2 } from 'lucide-react';\nimport React from 'react';\n\nimport { Button, Card, CardContent, CardHeader, CardTitle } from '@djangocfg/ui-nextjs';\n\nimport { emitOpenMonitorDialog } from '../../events';\nimport { ConnectionStatus } from '../ConnectionStatus';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Types\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface CentrifugoMonitorWidgetProps {\n title?: string;\n showExpandButton?: boolean;\n className?: string;\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function CentrifugoMonitorWidget({\n title = 'WebSocket Monitor',\n showExpandButton = true,\n className = '',\n}: CentrifugoMonitorWidgetProps) {\n const handleExpand = () => {\n emitOpenMonitorDialog({ variant: 'full' });\n };\n\n return (\n <Card className={className}>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium flex items-center gap-2\">\n <Activity className=\"h-4 w-4\" />\n {title}\n </CardTitle>\n {showExpandButton && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={handleExpand}\n >\n <Maximize2 className=\"h-4 w-4\" />\n </Button>\n )}\n </CardHeader>\n <CardContent>\n <ConnectionStatus variant=\"detailed\" showUptime showSubscriptions />\n </CardContent>\n </Card>\n );\n}\n\n","/**\n * Connection Tab\n *\n * Shows WebSocket connection status, uptime, and controls.\n */\n\n'use client';\n\nimport { Clock, RefreshCw, Wifi, WifiOff } from 'lucide-react';\n\nimport {\n Badge, Button, Card, CardContent, CardHeader, CardTitle, Separator\n} from '@djangocfg/ui-nextjs';\n\nimport { useCentrifugo } from '../../providers/CentrifugoProvider';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Helper: Format uptime\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nfunction formatUptime(seconds: number): string {\n if (seconds === 0) return '0s';\n\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n if (hours > 0) {\n return `${hours}h ${minutes}m ${secs}s`;\n } else if (minutes > 0) {\n return `${minutes}m ${secs}s`;\n } else {\n return `${secs}s`;\n }\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function ConnectionTab() {\n const {\n isConnected,\n isConnecting,\n connectionState,\n error,\n uptime,\n connect,\n disconnect,\n reconnect,\n } = useCentrifugo();\n\n const statusIcon = isConnected ? (\n <Wifi className=\"h-5 w-5 text-green-600\" />\n ) : (\n <WifiOff className=\"h-5 w-5 text-red-600\" />\n );\n\n const statusBadge = isConnected ? (\n <Badge variant=\"default\" className=\"flex items-center gap-1\">\n <span className=\"h-2 w-2 rounded-full bg-green-500 animate-pulse\" />\n Connected\n </Badge>\n ) : isConnecting ? (\n <Badge variant=\"secondary\" className=\"flex items-center gap-1\">\n <RefreshCw className=\"h-3 w-3 animate-spin\" />\n Connecting...\n </Badge>\n ) : (\n <Badge variant=\"destructive\">Disconnected</Badge>\n );\n\n return (\n <div className=\"space-y-4\">\n {/* Status Card */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2\">\n {statusIcon}\n Connection Status\n </span>\n {statusBadge}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {/* State */}\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">State:</span>\n <span className=\"font-mono font-medium capitalize\">{connectionState}</span>\n </div>\n\n {/* Uptime */}\n {isConnected && (\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">Uptime:</span>\n <span className=\"font-mono font-medium flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {formatUptime(uptime)}\n </span>\n </div>\n )}\n\n {/* Error */}\n {error && (\n <>\n <Separator />\n <div className=\"space-y-2\">\n <span className=\"text-sm text-muted-foreground\">Error:</span>\n <div className=\"text-xs text-red-600 bg-red-50 dark:bg-red-950/20 p-2 rounded\">\n {error.message}\n </div>\n </div>\n </>\n )}\n\n {/* Controls */}\n <Separator />\n <div className=\"flex gap-2\">\n {isConnected ? (\n <>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={disconnect}\n className=\"flex-1\"\n >\n Disconnect\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={reconnect}\n className=\"flex-1\"\n >\n <RefreshCw className=\"h-3 w-3 mr-1\" />\n Reconnect\n </Button>\n </>\n ) : (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={connect}\n disabled={isConnecting}\n className=\"flex-1\"\n >\n {isConnecting ? 'Connecting...' : 'Connect'}\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n","/**\n * Logs Tab\n *\n * Bash-like logs viewer with filters, search, and auto-scroll.\n * Uses PrettyCode for syntax highlighting.\n */\n\n'use client';\n\nimport { Filter, Search, Trash2 } from 'lucide-react';\nimport moment from 'moment';\nimport { useEffect, useRef, useState } from 'react';\n\nimport {\n Badge, Button, Card, CardContent, CardHeader, CardTitle, Input, ScrollArea, Select,\n SelectContent, SelectItem, SelectTrigger, SelectValue\n} from '@djangocfg/ui-nextjs';\nimport { PrettyCode } from '@djangocfg/ui-tools';\n\nimport { useLogs } from '../../providers/LogsProvider';\n\nimport type { LogLevel, LogEntry } from '../../core/types';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Helpers\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nfunction formatTimestamp(date: Date): string {\n return moment(date).format('HH:mm:ss.SSS');\n}\n\nfunction getLevelColor(level: LogLevel): string {\n switch (level) {\n case 'debug':\n return 'text-blue-600 dark:text-blue-400';\n case 'info':\n return 'text-gray-600 dark:text-gray-400';\n case 'success':\n return 'text-green-600 dark:text-green-400';\n case 'warning':\n return 'text-yellow-600 dark:text-yellow-400';\n case 'error':\n return 'text-red-600 dark:text-red-400';\n }\n}\n\nfunction getLevelBadgeVariant(level: LogLevel): 'default' | 'secondary' | 'destructive' | 'outline' {\n switch (level) {\n case 'error':\n return 'destructive';\n case 'warning':\n return 'outline';\n case 'success':\n return 'default';\n default:\n return 'secondary';\n }\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function LogsTab() {\n const { filteredLogs, filter, setFilter, clearLogs, count } = useLogs();\n const [search, setSearch] = useState('');\n const [autoScroll, setAutoScroll] = useState(true);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll to bottom when new logs arrive\n useEffect(() => {\n if (autoScroll && scrollRef.current) {\n scrollRef.current.scrollTop = scrollRef.current.scrollHeight;\n }\n }, [filteredLogs, autoScroll]);\n\n // Handle search with debounce\n useEffect(() => {\n const timeout = setTimeout(() => {\n setFilter({ search: search || undefined });\n }, 300);\n\n return () => clearTimeout(timeout);\n }, [search, setFilter]);\n\n return (\n <div className=\"space-y-4\">\n {/* Controls */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2\">\n Logs\n <Badge variant=\"secondary\">{count}</Badge>\n </span>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setAutoScroll(!autoScroll)}\n >\n Auto-scroll: {autoScroll ? 'ON' : 'OFF'}\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={clearLogs}\n >\n <Trash2 className=\"h-3 w-3 mr-1\" />\n Clear\n </Button>\n </div>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {/* Search */}\n <div className=\"flex gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search logs...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-8\"\n />\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"flex gap-2\">\n <Select\n value={filter.level || 'all'}\n onValueChange={(value) =>\n setFilter({ level: value === 'all' ? undefined : (value as LogLevel) })\n }\n >\n <SelectTrigger className=\"w-[140px]\">\n <Filter className=\"h-3 w-3 mr-1\" />\n <SelectValue placeholder=\"Level\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All Levels</SelectItem>\n <SelectItem value=\"debug\">Debug</SelectItem>\n <SelectItem value=\"info\">Info</SelectItem>\n <SelectItem value=\"success\">Success</SelectItem>\n <SelectItem value=\"warning\">Warning</SelectItem>\n <SelectItem value=\"error\">Error</SelectItem>\n </SelectContent>\n </Select>\n\n <Select\n value={filter.source || 'all'}\n onValueChange={(value) =>\n setFilter({ source: value === 'all' ? undefined : (value as LogEntry['source']) })\n }\n >\n <SelectTrigger className=\"w-[140px]\">\n <Filter className=\"h-3 w-3 mr-1\" />\n <SelectValue placeholder=\"Source\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All Sources</SelectItem>\n <SelectItem value=\"client\">Client</SelectItem>\n <SelectItem value=\"provider\">Provider</SelectItem>\n <SelectItem value=\"subscription\">Subscription</SelectItem>\n <SelectItem value=\"system\">System</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </CardContent>\n </Card>\n\n {/* Logs Viewer (Bash-like) */}\n <Card>\n <CardContent className=\"p-0\">\n <ScrollArea viewportRef={scrollRef} className=\"h-[400px] w-full\">\n <div className=\"p-4 font-mono text-xs space-y-1 bg-slate-950 text-slate-50\">\n {filteredLogs.length === 0 ? (\n <div className=\"text-slate-500 text-center py-8\">\n No logs to display\n </div>\n ) : (\n filteredLogs.map((log) => (\n <div key={log.id} className=\"flex gap-2 hover:bg-slate-900 px-1 py-0.5 rounded\">\n {/* Timestamp */}\n <span className=\"text-slate-500 shrink-0\">\n [{formatTimestamp(log.timestamp)}]\n </span>\n\n {/* Level */}\n <span className={`${getLevelColor(log.level)} font-bold uppercase shrink-0 w-16`}>\n {log.level}\n </span>\n\n {/* Source */}\n <span className=\"text-blue-400 shrink-0 w-24\">\n [{log.source}]\n </span>\n\n {/* Message */}\n <span className=\"text-slate-200\">{log.message}</span>\n\n {/* Data (if present) */}\n {log.data && (\n <details className=\"text-slate-400 cursor-pointer\">\n <summary className=\"inline\">\n <Badge variant=\"outline\" className=\"text-xs ml-2\">\n data\n </Badge>\n </summary>\n <div className=\"mt-2 ml-4\">\n <PrettyCode\n data={typeof log.data === 'object' ? log.data : { value: log.data }}\n language=\"json\"\n />\n </div>\n </details>\n )}\n </div>\n ))\n )}\n </div>\n </ScrollArea>\n </CardContent>\n </Card>\n </div>\n );\n}\n","/**\n * Subscriptions Tab\n *\n * Shows active channel subscriptions with controls.\n */\n\n'use client';\n\nimport { Radio, Trash2 } from 'lucide-react';\nimport { Fragment } from 'react';\n\nimport {\n Badge, Button, Card, CardContent, CardHeader, CardTitle, ScrollArea, Separator\n} from '@djangocfg/ui-nextjs';\n\nimport { useCentrifugo } from '../../providers/CentrifugoProvider';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Helper: Format subscription time\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nfunction formatSubscribedTime(timestamp: number): string {\n const now = Date.now();\n const diff = Math.floor((now - timestamp) / 1000);\n\n if (diff < 60) {\n return `${diff}s ago`;\n } else if (diff < 3600) {\n return `${Math.floor(diff / 60)}m ago`;\n } else if (diff < 86400) {\n return `${Math.floor(diff / 3600)}h ago`;\n } else {\n return `${Math.floor(diff / 86400)}d ago`;\n }\n}\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function SubscriptionsTab() {\n const { activeSubscriptions, unsubscribe } = useCentrifugo();\n\n const handleUnsubscribe = (channel: string) => {\n unsubscribe(channel);\n };\n\n return (\n <div className=\"space-y-4\">\n {/* Header Card */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2\">\n <Radio className=\"h-5 w-5\" />\n Active Subscriptions\n </span>\n <Badge variant=\"secondary\">{activeSubscriptions.length}</Badge>\n </CardTitle>\n </CardHeader>\n </Card>\n\n {/* Subscriptions List */}\n <Card>\n <CardContent className=\"p-0\">\n {activeSubscriptions.length === 0 ? (\n <div className=\"p-8 text-center text-muted-foreground\">\n No active subscriptions\n </div>\n ) : (\n <ScrollArea className=\"h-[450px]\">\n <div className=\"p-4 space-y-3\">\n {activeSubscriptions.map((sub, index) => (\n <Fragment key={sub.channel}>\n {index > 0 && <Separator />}\n <div className=\"flex items-start justify-between gap-4 p-3 rounded-lg hover:bg-muted/50 transition-colors\">\n <div className=\"flex-1 space-y-2\">\n {/* Channel Name */}\n <div className=\"flex items-center gap-2\">\n <Radio className=\"h-4 w-4 text-green-600 animate-pulse\" />\n <span className=\"font-mono text-sm font-medium\">\n {sub.channel}\n </span>\n </div>\n\n {/* Metadata */}\n <div className=\"flex gap-3 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {sub.type}\n </Badge>\n </span>\n <span>\n Subscribed: {formatSubscribedTime(sub.subscribedAt)}\n </span>\n </div>\n\n {/* Additional Info */}\n {sub.data && (\n <div className=\"text-xs text-muted-foreground\">\n <details className=\"cursor-pointer\">\n <summary className=\"inline\">View data</summary>\n <pre className=\"mt-2 p-2 bg-muted rounded text-xs overflow-auto\">\n {JSON.stringify(sub.data, null, 2)}\n </pre>\n </details>\n </div>\n )}\n </div>\n\n {/* Unsubscribe Button */}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handleUnsubscribe(sub.channel)}\n className=\"shrink-0\"\n >\n <Trash2 className=\"h-3 w-3 text-red-600\" />\n </Button>\n </div>\n </Fragment>\n ))}\n </div>\n </ScrollArea>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n","/**\n * Debug Panel\n *\n * Main debug UI with FAB button + Sheet modal + Tabs.\n * Visibility controlled by CentrifugoProvider (dev mode OR admin users).\n */\n\n'use client';\n\nimport { Bug } from 'lucide-react';\nimport { useState } from 'react';\n\nimport {\n Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, Tabs, TabsContent, TabsList,\n TabsTrigger\n} from '@djangocfg/ui-nextjs';\n\nimport { ConnectionTab } from '../ConnectionTab';\nimport { LogsTab } from '../LogsTab';\nimport { SubscriptionsTab } from '../SubscriptionsTab';\n\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n// Component\n// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport function DebugPanel() {\n const [isOpen, setIsOpen] = useState(false);\n const [activeTab, setActiveTab] = useState('connection');\n\n return (\n <>\n {/* FAB Button (fixed bottom-left) */}\n <button\n onClick={() => setIsOpen(true)}\n className=\"rounded-full bg-primary text-primary-foreground shadow-lg hover:bg-primary/90 transition-all duration-200 flex items-center justify-center\"\n style={{\n position: 'fixed',\n bottom: '1rem',\n left: '1rem',\n width: '56px',\n height: '56px',\n zIndex: 9999,\n }}\n aria-label=\"Open Centrifugo Debug Panel\"\n >\n <Bug className=\"h-6 w-6\" />\n </button>\n\n {/* Sheet Modal */}\n <Sheet open={isOpen} onOpenChange={setIsOpen}>\n <SheetContent side=\"right\" className=\"w-full sm:max-w-2xl\">\n <SheetHeader>\n <SheetTitle>Centrifugo Debug</SheetTitle>\n <SheetDescription>\n WebSocket connection status, logs, and subscriptions\n </SheetDescription>\n </SheetHeader>\n\n {/* Tabs */}\n <Tabs value={activeTab} onValueChange={setActiveTab} className=\"mt-6\">\n <TabsList className=\"grid w-full grid-cols-3\">\n <TabsTrigger value=\"connection\">Connection</TabsTrigger>\n <TabsTrigger value=\"logs\">Logs</TabsTrigger>\n <TabsTrigger value=\"subscriptions\">Subscriptions</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"connection\" className=\"mt-4\">\n <ConnectionTab />\n </TabsContent>\n\n <TabsContent value=\"logs\" className=\"mt-4\">\n <LogsTab />\n </TabsContent>\n\n <TabsContent value=\"subscriptions\" className=\"mt-4\">\n <SubscriptionsTab />\n </TabsContent>\n </Tabs>\n </SheetContent>\n </Sheet>\n </>\n );\n}\n"]}
|