@qontinui/ui-bridge-native 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/control/{action-executor.d.ts → index.d.mts} +14 -6
  2. package/dist/control/index.d.ts +95 -5
  3. package/dist/control/index.js +74 -11
  4. package/dist/control/index.js.map +1 -1
  5. package/dist/control/index.mjs +74 -11
  6. package/dist/control/index.mjs.map +1 -1
  7. package/dist/core/index.d.mts +46 -0
  8. package/dist/core/index.d.ts +43 -6
  9. package/dist/core/index.js +69 -1
  10. package/dist/core/index.js.map +1 -1
  11. package/dist/core/index.mjs +69 -1
  12. package/dist/core/index.mjs.map +1 -1
  13. package/dist/debug/{inspector.d.ts → index.d.mts} +6 -3
  14. package/dist/debug/index.d.ts +44 -4
  15. package/dist/debug/index.js.map +1 -1
  16. package/dist/debug/index.mjs.map +1 -1
  17. package/dist/design/{design-inspector-native.d.ts → index.d.mts} +11 -7
  18. package/dist/design/index.d.ts +60 -5
  19. package/dist/{design/design-types.d.ts → design-types-BHr6Q1FX.d.mts} +11 -10
  20. package/dist/design-types-BHr6Q1FX.d.ts +205 -0
  21. package/dist/http-server-DCdR8WlL.d.mts +622 -0
  22. package/dist/http-server-Dj3grQW4.d.ts +622 -0
  23. package/dist/index.d.mts +89 -0
  24. package/dist/index.d.ts +86 -28
  25. package/dist/index.js +391 -12
  26. package/dist/index.js.map +1 -1
  27. package/dist/index.mjs +386 -13
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/react/{useAutoRegister.d.ts → index.d.mts} +15 -7
  30. package/dist/react/index.d.ts +69 -8
  31. package/dist/react/index.js +388 -12
  32. package/dist/react/index.js.map +1 -1
  33. package/dist/react/index.mjs +386 -13
  34. package/dist/react/index.mjs.map +1 -1
  35. package/dist/registry-Cahd8Gn2.d.mts +230 -0
  36. package/dist/{core/registry.d.ts → registry-z-3WJsxp.d.ts} +28 -10
  37. package/dist/server/index.d.mts +119 -0
  38. package/dist/server/index.d.ts +117 -13
  39. package/dist/server/index.js.map +1 -1
  40. package/dist/server/index.mjs.map +1 -1
  41. package/dist/types-DAfCeWXc.d.mts +197 -0
  42. package/dist/{core/types.d.ts → types-Oz13YLZq.d.mts} +124 -30
  43. package/dist/types-Oz13YLZq.d.ts +477 -0
  44. package/dist/{control/types.d.ts → types-ajakyp-l.d.ts} +36 -15
  45. package/dist/useUIBridgeToast-D32KXyL1.d.ts +720 -0
  46. package/dist/useUIBridgeToast-GmT1TzUe.d.mts +720 -0
  47. package/package.json +1 -1
  48. package/dist/control/action-executor.d.ts.map +0 -1
  49. package/dist/control/index.d.ts.map +0 -1
  50. package/dist/control/types.d.ts.map +0 -1
  51. package/dist/core/element-identifier.d.ts +0 -41
  52. package/dist/core/element-identifier.d.ts.map +0 -1
  53. package/dist/core/index.d.ts.map +0 -1
  54. package/dist/core/registry.d.ts.map +0 -1
  55. package/dist/core/types.d.ts.map +0 -1
  56. package/dist/debug/index.d.ts.map +0 -1
  57. package/dist/debug/inspector.d.ts.map +0 -1
  58. package/dist/design/design-inspector-native.d.ts.map +0 -1
  59. package/dist/design/design-types.d.ts.map +0 -1
  60. package/dist/design/index.d.ts.map +0 -1
  61. package/dist/index.d.ts.map +0 -1
  62. package/dist/react/UIBridgeNativeProvider.d.ts +0 -147
  63. package/dist/react/UIBridgeNativeProvider.d.ts.map +0 -1
  64. package/dist/react/index.d.ts.map +0 -1
  65. package/dist/react/useAutoRegister.d.ts.map +0 -1
  66. package/dist/react/useUIBridge.d.ts +0 -103
  67. package/dist/react/useUIBridge.d.ts.map +0 -1
  68. package/dist/react/useUIComponent.d.ts +0 -112
  69. package/dist/react/useUIComponent.d.ts.map +0 -1
  70. package/dist/react/useUIElement.d.ts +0 -162
  71. package/dist/react/useUIElement.d.ts.map +0 -1
  72. package/dist/server/design-handlers.d.ts +0 -47
  73. package/dist/server/design-handlers.d.ts.map +0 -1
  74. package/dist/server/handlers.d.ts +0 -20
  75. package/dist/server/handlers.d.ts.map +0 -1
  76. package/dist/server/http-server.d.ts +0 -247
  77. package/dist/server/http-server.d.ts.map +0 -1
  78. package/dist/server/index.d.ts.map +0 -1
  79. package/dist/server/types.d.ts +0 -200
  80. package/dist/server/types.d.ts.map +0 -1
  81. package/dist/server/ws-connection.d.ts +0 -48
  82. package/dist/server/ws-connection.d.ts.map +0 -1
  83. package/dist/server/ws-event-bridge.d.ts +0 -113
  84. package/dist/server/ws-event-bridge.d.ts.map +0 -1
  85. package/dist/server/ws-protocol.d.ts +0 -48
  86. package/dist/server/ws-protocol.d.ts.map +0 -1
  87. package/dist/server/ws-types.d.ts +0 -65
  88. package/dist/server/ws-types.d.ts.map +0 -1
  89. package/dist/transport/CloudRelayClient.d.ts +0 -51
  90. package/dist/transport/CloudRelayClient.d.ts.map +0 -1
  91. package/dist/transport/DeviceAnnouncer.d.ts +0 -75
  92. package/dist/transport/DeviceAnnouncer.d.ts.map +0 -1
  93. package/dist/transport/index.d.ts +0 -3
  94. package/dist/transport/index.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/types.ts","../../src/core/registry.ts","../../src/design/design-inspector-native.ts","../../src/server/design-handlers.ts","../../src/server/handlers.ts","../../src/server/ws-types.ts","../../src/server/http-server.ts","../../src/server/ws-protocol.ts","../../src/server/ws-event-bridge.ts","../../src/server/ws-connection.ts"],"names":["success","error"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * UI Bridge Native Server Types\n *\n * Types for the embedded HTTP server.\n */\n\nimport type {\n NativeUIBridgeConfig,\n NativeActionResponse,\n NativeFindResponse,\n NativeBridgeSnapshot,\n} from '../core/types';\nimport type { ComponentActionResponse, PageNavigationResponse } from '../control/types';\nimport type { ElementDesignData, StateStyles, ResponsiveSnapshot } from '../design/design-types';\n\n/**\n * Navigation provider for React Native apps.\n *\n * Apps supply this to enable programmatic navigation via the UI Bridge\n * (e.g., `control/page/navigate` and `control/page/back`).\n * For Expo Router: pass `router.push` and `router.back`.\n */\nexport interface NavigationProvider {\n navigate: (url: string) => void;\n back?: () => void;\n /** Replace current route (no back-stack entry). For Expo Router: router.replace */\n replace?: (url: string) => void;\n /** Refresh the current route. For Expo Router: router.replace(currentPath) */\n refresh?: () => void;\n}\n\n/**\n * Screenshot provider for React Native apps.\n *\n * Apps supply this to enable screen capture via the UI Bridge\n * (`control/screenshot`). For react-native-view-shot: pass a function\n * that calls `captureRef` on the root view and returns base64 PNG data.\n */\nexport interface ScreenshotProvider {\n /** Capture the current screen and return base64-encoded PNG data (no data: prefix). */\n capture: () => Promise<{ base64: string; width: number; height: number }>;\n}\n\n/**\n * Route provider for React Native apps.\n *\n * Apps supply this to expose the current navigation route in UI Bridge snapshots.\n * For Expo Router: render a RouteTracker component inside the router context that\n * calls `usePathname()` / `useSegments()` and writes the result to a module-level ref.\n */\nexport interface RouteProvider {\n /** Return the current route path (e.g. \"/(tabs)/runs\"), or null if unknown. */\n getCurrentRoute: () => string | null;\n /** Return the current route segments (e.g. [\"(tabs)\", \"runs\"]), if available. */\n getSegments?: () => string[];\n /**\n * Subscribe to route changes. Required so the UI Bridge can clear stale\n * layouts on route changes with zero lag.\n *\n * Implementers must invoke `listener` synchronously whenever the route\n * changes, passing the new route (or null if unknown). The returned function\n * must unsubscribe the listener.\n *\n * For Expo Router: wrap your RouteTracker component in a module-level\n * listener set and call each listener from within the tracker's effect.\n */\n subscribe: (listener: (route: string | null) => void) => () => void;\n}\n\n/**\n * Server configuration\n */\nexport interface NativeServerConfig extends NativeUIBridgeConfig {\n /** Enable CORS */\n cors?: boolean;\n /** Allowed origins for CORS */\n allowedOrigins?: string[];\n}\n\n/**\n * Route definition\n */\nexport interface RouteDefinition {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n description: string;\n}\n\n/**\n * All UI Bridge Native routes\n */\nexport const UI_BRIDGE_NATIVE_ROUTES: Record<string, RouteDefinition> = {\n // Control - Elements\n GET_ELEMENTS: {\n method: 'GET',\n path: '/ui-bridge/control/elements',\n description: 'List all registered elements',\n },\n GET_ELEMENT: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id',\n description: 'Get element details',\n },\n GET_ELEMENT_STATE: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id/state',\n description: 'Get element state',\n },\n EXECUTE_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/element/:id/action',\n description: 'Execute action on element',\n },\n\n // Control - Components\n GET_COMPONENTS: {\n method: 'GET',\n path: '/ui-bridge/control/components',\n description: 'List all registered components',\n },\n GET_COMPONENT: {\n method: 'GET',\n path: '/ui-bridge/control/component/:id',\n description: 'Get component details',\n },\n EXECUTE_COMPONENT_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/component/:id/action/:actionId',\n description: 'Execute component action',\n },\n\n // Discovery\n FIND: {\n method: 'POST',\n path: '/ui-bridge/control/find',\n description: 'Find elements matching criteria',\n },\n GET_SNAPSHOT: {\n method: 'GET',\n path: '/ui-bridge/control/snapshot',\n description: 'Get full bridge snapshot',\n },\n\n // Workflows\n GET_WORKFLOWS: {\n method: 'GET',\n path: '/ui-bridge/control/workflows',\n description: 'List all workflows',\n },\n RUN_WORKFLOW: {\n method: 'POST',\n path: '/ui-bridge/control/workflow/:id/run',\n description: 'Run a workflow',\n },\n\n // Page Navigation\n PAGE_REFRESH: {\n method: 'POST',\n path: '/ui-bridge/control/page/refresh',\n description: 'Refresh the current page',\n },\n PAGE_NAVIGATE: {\n method: 'POST',\n path: '/ui-bridge/control/page/navigate',\n description: 'Navigate to a URL',\n },\n PAGE_REPLACE: {\n method: 'POST',\n path: '/ui-bridge/control/page/replace',\n description: 'Replace current route without adding to back stack',\n },\n PAGE_GO_BACK: {\n method: 'POST',\n path: '/ui-bridge/control/page/back',\n description: 'Go back in navigation history',\n },\n PAGE_GO_FORWARD: {\n method: 'POST',\n path: '/ui-bridge/control/page/forward',\n description: 'Go forward in navigation history',\n },\n\n // Design Review\n DESIGN_ELEMENT_STYLES: {\n method: 'GET',\n path: '/ui-bridge/design/element/:id/styles',\n description: 'Get computed styles for an element',\n },\n DESIGN_ELEMENT_STATE_STYLES: {\n method: 'POST',\n path: '/ui-bridge/design/element/:id/state-styles',\n description: 'Get state-specific styles for an element',\n },\n DESIGN_SNAPSHOT: {\n method: 'POST',\n path: '/ui-bridge/design/snapshot',\n description: 'Get design data for all or selected elements',\n },\n DESIGN_RESPONSIVE: {\n method: 'POST',\n path: '/ui-bridge/design/responsive',\n description: 'Get responsive snapshots (current device only on native)',\n },\n DESIGN_AUDIT: {\n method: 'POST',\n path: '/ui-bridge/design/audit',\n description: 'Run style guide audit on elements',\n },\n DESIGN_STYLE_GUIDE_LOAD: {\n method: 'POST',\n path: '/ui-bridge/design/style-guide/load',\n description: 'Load a style guide for audit',\n },\n DESIGN_STYLE_GUIDE_GET: {\n method: 'GET',\n path: '/ui-bridge/design/style-guide',\n description: 'Get currently loaded style guide',\n },\n DESIGN_STYLE_GUIDE_CLEAR: {\n method: 'DELETE',\n path: '/ui-bridge/design/style-guide',\n description: 'Clear loaded style guide',\n },\n\n // Health\n HEALTH: {\n method: 'GET',\n path: '/ui-bridge/health',\n description: 'Health check',\n },\n};\n\n/**\n * API response wrapper\n */\nexport interface APIResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n code?: string;\n timestamp: number;\n}\n\n/**\n * Handler context\n */\nexport interface HandlerContext {\n params: Record<string, string>;\n query: Record<string, string>;\n body: unknown;\n}\n\n/**\n * Handler function type\n */\nexport type HandlerFunction<T = unknown> = (context: HandlerContext) => Promise<APIResponse<T>>;\n\n/**\n * Server handlers interface\n */\nexport interface NativeServerHandlers {\n // Elements\n getElements: HandlerFunction<{ elements: unknown[] }>;\n getElement: HandlerFunction<{ element: unknown }>;\n getElementState: HandlerFunction<{ state: unknown }>;\n executeAction: HandlerFunction<NativeActionResponse>;\n\n // Components\n getComponents: HandlerFunction<{ components: unknown[] }>;\n getComponent: HandlerFunction<{ component: unknown }>;\n executeComponentAction: HandlerFunction<ComponentActionResponse>;\n\n // Discovery\n find: HandlerFunction<NativeFindResponse>;\n getSnapshot: HandlerFunction<NativeBridgeSnapshot>;\n\n // Workflows\n getWorkflows: HandlerFunction<{ workflows: unknown[] }>;\n runWorkflow: HandlerFunction<{\n runId: string;\n status: string;\n steps: Array<{\n stepId: string;\n type: string;\n status: string;\n result?: unknown;\n error?: string;\n durationMs: number;\n }>;\n totalSteps: number;\n completedSteps: number;\n failedSteps: number;\n skippedSteps: number;\n durationMs: number;\n }>;\n\n // Page Navigation\n pageRefresh: HandlerFunction<PageNavigationResponse>;\n pageNavigate: HandlerFunction<PageNavigationResponse>;\n pageReplace: HandlerFunction<PageNavigationResponse>;\n pageGoBack: HandlerFunction<PageNavigationResponse>;\n pageGoForward: HandlerFunction<PageNavigationResponse>;\n\n // Screenshot\n getScreenshot: HandlerFunction<{ screenshot: string; width: number; height: number }>;\n\n // Design Review\n getElementStyles: HandlerFunction<ElementDesignData>;\n getElementStateStyles: HandlerFunction<{ elementId: string; stateStyles: StateStyles[] }>;\n getDesignSnapshot: HandlerFunction<{ elements: ElementDesignData[]; timestamp: number }>;\n getResponsiveSnapshots: HandlerFunction<ResponsiveSnapshot[]>;\n runDesignAudit: HandlerFunction<unknown>;\n loadStyleGuide: HandlerFunction<{ loaded: boolean }>;\n getStyleGuide: HandlerFunction<unknown>;\n clearStyleGuide: HandlerFunction<{ cleared: boolean }>;\n\n // Quality Evaluation\n evaluateQuality: HandlerFunction<unknown>;\n getQualityContexts: HandlerFunction<Array<{ name: string; description: string }>>;\n saveBaseline: HandlerFunction<{ saved: boolean; elementCount: number }>;\n diffBaseline: HandlerFunction<unknown>;\n\n // Meta / Introspection\n getMethods: HandlerFunction<{\n methods: Array<{ method: string; httpMethods?: string[]; description?: string }>;\n }>;\n\n // Health\n health: HandlerFunction<{ status: string; timestamp: number }>;\n}\n","/**\n * Native Element and Component Registry\n *\n * Central registry for all UI elements and components registered with UI Bridge Native.\n * Adapted from ui-bridge for React Native environments.\n */\n\nimport type {\n RegisteredNativeElement,\n RegisteredNativeComponent,\n NativeElementState,\n NativeElementType,\n NativeStandardAction,\n NativeCustomAction,\n NativeBridgeSnapshot,\n NativeElementIdentifier,\n NativeElementRef,\n Workflow,\n BridgeEvent,\n BridgeEventType,\n BridgeEventListener,\n} from './types';\n\n/**\n * Options for registering an element\n */\nexport interface RegisterElementOptions {\n type?: NativeElementType;\n label?: string;\n actions?: NativeStandardAction[];\n customActions?: Record<string, NativeCustomAction>;\n props?: Record<string, unknown>;\n treePath?: string;\n testId?: string;\n accessibilityLabel?: string;\n /** Route path where the element was registered (for page-scoped filtering) */\n registrationRoute?: string | null;\n /** Flattened RN style (from StyleSheet.flatten) for design review */\n flatStyle?: Record<string, unknown>;\n /** State-specific style overrides for design review */\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n };\n}\n\n/**\n * Options for registering a component\n */\nexport interface RegisterComponentOptions {\n name: string;\n description?: string;\n actions?: Array<{\n id: string;\n label?: string;\n description?: string;\n handler: (params?: unknown) => unknown | Promise<unknown>;\n }>;\n elementIds?: string[];\n}\n\n/**\n * Registry configuration\n */\nexport interface NativeRegistryConfig {\n verbose?: boolean;\n onEvent?: BridgeEventListener;\n}\n\n/**\n * Extract handler function names from an element's props.\n * Returns names of props whose values are functions (e.g. ['onPress', 'onChangeText']).\n */\nexport function extractHandlerNames(props?: Record<string, unknown>): string[] {\n if (!props) return [];\n return Object.keys(props).filter((k) => typeof props[k] === 'function');\n}\n\n/**\n * Infer available actions based on element type\n */\nfunction inferActions(type: NativeElementType): NativeStandardAction[] {\n const baseActions: NativeStandardAction[] = ['focus', 'blur'];\n\n switch (type) {\n case 'button':\n case 'touchable':\n case 'pressable':\n return [...baseActions, 'click', 'press', 'longPress', 'doubleTap'];\n case 'input':\n return [...baseActions, 'click', 'press', 'type', 'clear'];\n case 'text':\n return [...baseActions, 'click', 'press', 'longPress'];\n case 'view':\n return [...baseActions, 'click', 'press'];\n case 'scroll':\n return [...baseActions, 'scroll', 'swipe'];\n case 'list':\n return [...baseActions, 'scroll', 'swipe'];\n case 'listItem':\n return [...baseActions, 'click', 'press', 'longPress', 'swipe'];\n case 'switch':\n case 'checkbox':\n return [...baseActions, 'click', 'press', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'press'];\n case 'image':\n return [...baseActions, 'click', 'press', 'longPress'];\n case 'modal':\n return ['focus', 'blur'];\n case 'custom':\n default:\n return [...baseActions, 'click', 'press'];\n }\n}\n\n/**\n * Native UI Bridge Registry\n *\n * Manages registration and lookup of native UI elements and components.\n */\nexport class NativeUIBridgeRegistry {\n private elements = new Map<string, RegisteredNativeElement>();\n private components = new Map<string, RegisteredNativeComponent>();\n private workflows = new Map<string, Workflow>();\n private eventListeners = new Map<BridgeEventType, Set<BridgeEventListener>>();\n private config: NativeRegistryConfig;\n\n constructor(config: NativeRegistryConfig = {}) {\n this.config = config;\n }\n\n // ============================================================================\n // Element Management\n // ============================================================================\n\n /**\n * Register a native element\n */\n registerElement(\n id: string,\n ref: React.RefObject<NativeElementRef>,\n options: RegisterElementOptions = {}\n ): RegisteredNativeElement {\n const {\n type = 'custom',\n label,\n actions = inferActions(type),\n customActions,\n props,\n treePath = id,\n testId,\n accessibilityLabel,\n registrationRoute,\n flatStyle,\n stateStyles,\n } = options;\n\n // Create state getter\n const getState = (): NativeElementState => {\n const element = ref.current;\n if (!element) {\n return {\n mounted: false,\n visible: false,\n enabled: false,\n focused: false,\n layout: null,\n };\n }\n\n // State is populated by the element during onLayout\n // Here we return the stored state from the element's metadata\n const stored = this.elements.get(id);\n if (stored && stored.getState !== getState) {\n return stored.getState();\n }\n\n return {\n mounted: true,\n visible: true,\n enabled: true,\n focused: false,\n layout: null,\n };\n };\n\n // Create identifier getter\n const getIdentifier = (): NativeElementIdentifier => ({\n uiId: id,\n testId: testId || id,\n accessibilityLabel,\n treePath,\n });\n\n const registered: RegisteredNativeElement = {\n id,\n ref,\n type,\n label,\n actions,\n customActions,\n props,\n getState,\n getIdentifier,\n registeredAt: Date.now(),\n mounted: true,\n registrationRoute: registrationRoute ?? null,\n flatStyle,\n stateStyles,\n };\n\n this.elements.set(id, registered);\n\n this.emit('element:registered', { id, type, label });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered element: ${id} (${type})`);\n }\n\n // Seed a sensible initial state so elements are immediately visible in snapshots\n // even before onLayout fires. Layout-measuring code can overwrite this later.\n this.updateElementState(id, {\n mounted: true,\n visible: true,\n enabled: true,\n focused: false,\n layout: null,\n });\n\n return registered;\n }\n\n /**\n * Unregister an element\n */\n unregisterElement(id: string): void {\n const element = this.elements.get(id);\n if (element) {\n this.elements.delete(id);\n this.emit('element:unregistered', { id });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Unregistered element: ${id}`);\n }\n }\n }\n\n /**\n * Get a registered element\n */\n getElement(id: string): RegisteredNativeElement | undefined {\n return this.elements.get(id);\n }\n\n /**\n * Get all registered elements\n */\n getAllElements(): RegisteredNativeElement[] {\n return Array.from(this.elements.values());\n }\n\n /**\n * Get all registered elements that are visible and have a layout\n */\n getVisibleElements(): RegisteredNativeElement[] {\n return this.getAllElements().filter((e) => {\n const state = e.getState();\n return state.visible && state.layout !== null;\n });\n }\n\n /**\n * Get elements registered on a specific route (for page-scoped filtering)\n */\n getElementsForRoute(route: string): RegisteredNativeElement[] {\n return this.getAllElements().filter((e) => e.registrationRoute === route);\n }\n\n /**\n * Mark elements registered on a route as off-screen (visible: false, layout: null).\n *\n * Use this when a screen loses focus but stays mounted — common in React Navigation\n * tab navigators where inactive tabs remain in the tree. Without this call, stale\n * `layout` data lingers in snapshots and makes off-screen elements look rendered.\n *\n * Does NOT unregister the elements — they stay registered so the user's next visit\n * re-measures them via `onLayout` without re-mount cost. Elements without a\n * `registrationRoute` (app-wide registrations) are untouched.\n */\n markRouteOffscreen(route: string): void {\n // Guard against accidental global wipes. Elements registered without a\n // route have `registrationRoute: null` — passing null/empty here would\n // match every globally-registered element and erase their layouts.\n if (route == null || route === '') {\n if (this.config.verbose) {\n console.warn(\n `[ui-bridge-native] markRouteOffscreen called with null/empty route — ignoring`\n );\n }\n return;\n }\n let cleared = 0;\n for (const element of this.elements.values()) {\n if (element.registrationRoute === route) {\n this.updateElementState(element.id, {\n visible: false,\n layout: null,\n });\n cleared++;\n }\n }\n if (this.config.verbose && cleared > 0) {\n console.log(`[ui-bridge-native] Marked ${cleared} elements offscreen for route: ${route}`);\n }\n }\n\n /**\n * Update element state\n */\n updateElementState(id: string, state: Partial<NativeElementState>): void {\n const element = this.elements.get(id);\n if (element) {\n // Create a new getState that includes the updated state\n const currentState = element.getState();\n const newState = { ...currentState, ...state };\n\n const updated: RegisteredNativeElement = {\n ...element,\n getState: () => newState,\n };\n\n this.elements.set(id, updated);\n this.emit('element:stateChanged', { id, state: newState });\n }\n }\n\n /**\n * Update element props (for action execution)\n */\n updateElementProps(id: string, props: Record<string, unknown>): void {\n const element = this.elements.get(id);\n if (element) {\n const updated: RegisteredNativeElement = {\n ...element,\n props: { ...element.props, ...props },\n };\n this.elements.set(id, updated);\n }\n }\n\n /**\n * Update element style for design review\n */\n updateElementStyle(\n id: string,\n flatStyle: Record<string, unknown>,\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n }\n ): void {\n const element = this.elements.get(id);\n if (element) {\n const updated: RegisteredNativeElement = {\n ...element,\n flatStyle,\n ...(stateStyles !== undefined ? { stateStyles } : {}),\n };\n this.elements.set(id, updated);\n }\n }\n\n /**\n * Get element style for design review\n */\n getElementStyle(id: string): Record<string, unknown> | null {\n const element = this.elements.get(id);\n return element?.flatStyle ?? null;\n }\n\n /**\n * Find element by testID\n */\n findByTestId(testId: string): RegisteredNativeElement | undefined {\n for (const element of this.elements.values()) {\n const identifier = element.getIdentifier();\n if (identifier.testId === testId) {\n return element;\n }\n }\n return undefined;\n }\n\n /**\n * Find elements by type\n */\n findByType(type: NativeElementType): RegisteredNativeElement[] {\n return Array.from(this.elements.values()).filter((e) => e.type === type);\n }\n\n // ============================================================================\n // Component Management\n // ============================================================================\n\n /**\n * Register a component\n */\n registerComponent(id: string, options: RegisterComponentOptions): RegisteredNativeComponent {\n const { name, description, actions = [], elementIds } = options;\n\n const registered: RegisteredNativeComponent = {\n id,\n name,\n description,\n actions: actions.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })),\n elementIds,\n registeredAt: Date.now(),\n mounted: true,\n };\n\n this.components.set(id, registered);\n\n this.emit('component:registered', { id, name });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered component: ${id} (${name})`);\n }\n\n return registered;\n }\n\n /**\n * Unregister a component\n */\n unregisterComponent(id: string): void {\n const component = this.components.get(id);\n if (component) {\n this.components.delete(id);\n this.emit('component:unregistered', { id });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Unregistered component: ${id}`);\n }\n }\n }\n\n /**\n * Get a registered component\n */\n getComponent(id: string): RegisteredNativeComponent | undefined {\n return this.components.get(id);\n }\n\n /**\n * Get all registered components\n */\n getAllComponents(): RegisteredNativeComponent[] {\n return Array.from(this.components.values());\n }\n\n // ============================================================================\n // Workflow Management\n // ============================================================================\n\n /**\n * Register a workflow\n */\n registerWorkflow(workflow: Workflow): void {\n this.workflows.set(workflow.id, workflow);\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered workflow: ${workflow.id}`);\n }\n }\n\n /**\n * Unregister a workflow\n */\n unregisterWorkflow(id: string): void {\n this.workflows.delete(id);\n }\n\n /**\n * Get a workflow\n */\n getWorkflow(id: string): Workflow | undefined {\n return this.workflows.get(id);\n }\n\n /**\n * Get all workflows\n */\n getAllWorkflows(): Workflow[] {\n return Array.from(this.workflows.values());\n }\n\n // ============================================================================\n // Event System\n // ============================================================================\n\n /**\n * Subscribe to events\n */\n on<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): () => void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, new Set());\n }\n this.eventListeners.get(type)!.add(listener as BridgeEventListener);\n\n // Return unsubscribe function\n return () => this.off(type, listener);\n }\n\n /**\n * Unsubscribe from events\n */\n off<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): void {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n }\n\n /**\n * Emit an event\n */\n emit(type: BridgeEventType, data: unknown): void {\n const event: BridgeEvent = {\n type,\n timestamp: Date.now(),\n data,\n };\n\n // Notify listeners\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error(`[ui-bridge-native] Event listener error:`, error);\n }\n }\n }\n\n // Notify global handler\n if (this.config.onEvent) {\n try {\n this.config.onEvent(event);\n } catch (error) {\n console.error(`[ui-bridge-native] Global event handler error:`, error);\n }\n }\n }\n\n // ============================================================================\n // Snapshots\n // ============================================================================\n\n /**\n * Create a snapshot of the current state\n */\n createSnapshot(\n routeInfo?: {\n currentRoute?: string | null;\n segments?: string[];\n },\n options?: { visibleOnly?: boolean; currentRouteOnly?: boolean }\n ): NativeBridgeSnapshot {\n let elements = options?.visibleOnly ? this.getVisibleElements() : this.getAllElements();\n\n // Filter to only elements registered on the current route\n if (options?.currentRouteOnly && routeInfo?.currentRoute) {\n const currentRoute = routeInfo.currentRoute;\n elements = elements.filter((e) => e.registrationRoute === currentRoute);\n }\n\n return {\n timestamp: Date.now(),\n elements: elements.map((e) => {\n const handlers = extractHandlerNames(e.props);\n return {\n id: e.id,\n type: e.type,\n label: e.label,\n identifier: e.getIdentifier(),\n state: e.getState(),\n actions: e.actions,\n customActions: e.customActions ? Object.keys(e.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: e.registrationRoute,\n };\n }),\n components: this.getAllComponents().map((c) => ({\n id: c.id,\n name: c.name,\n description: c.description,\n actions: c.actions.map((a) => a.id),\n elementIds: c.elementIds,\n })),\n workflows: this.getAllWorkflows().map((w) => ({\n id: w.id,\n name: w.name,\n description: w.description,\n stepCount: w.steps.length,\n })),\n currentRoute: routeInfo?.currentRoute ?? null,\n segments: routeInfo?.segments,\n };\n }\n\n /**\n * Get registry statistics\n */\n getStats(): { elements: number; components: number; workflows: number } {\n return {\n elements: this.elements.size,\n components: this.components.size,\n workflows: this.workflows.size,\n };\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.elements.clear();\n this.components.clear();\n this.workflows.clear();\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registry cleared`);\n }\n }\n}\n\n// ============================================================================\n// Global Registry\n// ============================================================================\n\nlet globalRegistry: NativeUIBridgeRegistry | null = null;\n\n/**\n * Set the global registry\n */\nexport function setGlobalRegistry(registry: NativeUIBridgeRegistry): void {\n globalRegistry = registry;\n}\n\n/**\n * Get the global registry\n */\nexport function getGlobalRegistry(): NativeUIBridgeRegistry | null {\n return globalRegistry;\n}\n\n/**\n * Reset the global registry\n */\nexport function resetGlobalRegistry(): void {\n globalRegistry?.clear();\n globalRegistry = null;\n}\n","/**\n * Native Design Inspector\n *\n * Pure TypeScript functions that map flattened React Native styles to the\n * web SDK's ExtendedComputedStyles format. No react-native imports — works\n * with already-flattened style objects from the registry.\n *\n * Key differences from web:\n * - No `window.getComputedStyle()` — styles are declarative objects\n * - No hover/active states — uses pressed/focused/disabled\n * - No pseudo-elements (::before/::after)\n * - No CSS grid, cursor, visibility, transitions, background-image\n * - RN default flexDirection is 'column' (not 'row')\n * - Shadows differ: iOS uses shadow* props, Android uses elevation\n * - Numeric values → \"Npx\" strings\n */\n\nimport type {\n ExtendedComputedStyles,\n ElementDesignData,\n StateStyles,\n StyleDiff,\n ResponsiveSnapshot,\n NativeInteractionStateName,\n} from './design-types';\nimport type { NativeLayout } from '../core/types';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert a numeric RN value to a CSS px string.\n * String values (like \"50%\") pass through unchanged.\n */\nfunction toCssValue(value: unknown): string {\n if (value == null) return '';\n if (typeof value === 'number') return `${value}px`;\n return String(value);\n}\n\n/**\n * Convert RN transform array to CSS transform string.\n * e.g. [{translateX: 10}, {rotate: '45deg'}] → \"translateX(10px) rotate(45deg)\"\n */\nfunction transformToCss(transform: unknown): string {\n if (!Array.isArray(transform) || transform.length === 0) return '';\n\n return transform\n .map((t: Record<string, unknown>) => {\n const key = Object.keys(t)[0];\n if (!key) return '';\n const val = t[key];\n // Rotation values are already strings like '45deg'\n if (typeof val === 'string') return `${key}(${val})`;\n // Numeric values need px for translate, unitless for scale\n if (typeof val === 'number') {\n const needsPx = key.startsWith('translate') || key === 'perspective';\n return `${key}(${val}${needsPx ? 'px' : ''})`;\n }\n return '';\n })\n .filter(Boolean)\n .join(' ');\n}\n\n/**\n * Convert RN shadow props (iOS) + elevation (Android) to CSS box-shadow string.\n */\nfunction shadowToCss(style: Record<string, unknown>): string {\n const parts: string[] = [];\n\n // iOS shadow\n const shadowColor = style.shadowColor as string | undefined;\n const shadowOffset = style.shadowOffset as { width: number; height: number } | undefined;\n const shadowOpacity = style.shadowOpacity as number | undefined;\n const shadowRadius = style.shadowRadius as number | undefined;\n\n if (shadowColor && shadowOffset && shadowOpacity != null && shadowOpacity > 0) {\n const { width, height } = shadowOffset;\n parts.push(\n `${width}px ${height}px ${shadowRadius ?? 0}px ${shadowColor}` +\n (shadowOpacity < 1 ? ` /* opacity: ${shadowOpacity} */` : '')\n );\n }\n\n // Android elevation\n const elevation = style.elevation as number | undefined;\n if (elevation != null && elevation > 0) {\n parts.push(`elevation(${elevation})`);\n }\n\n return parts.join(', ');\n}\n\n/**\n * Convert RN border props to CSS border shorthand.\n */\nfunction borderToCss(style: Record<string, unknown>): string {\n const width = style.borderWidth as number | undefined;\n const color = style.borderColor as string | undefined;\n\n if (width == null && color == null) return '';\n return `${width ?? 0}px solid ${color ?? 'transparent'}`;\n}\n\n/**\n * Convert RN borderRadius to CSS border-radius string.\n * Handles both uniform radius and per-corner values.\n */\nfunction borderRadiusToCss(style: Record<string, unknown>): string {\n const uniform = style.borderRadius as number | undefined;\n if (uniform != null) return `${uniform}px`;\n\n const tl = style.borderTopLeftRadius as number | undefined;\n const tr = style.borderTopRightRadius as number | undefined;\n const bl = style.borderBottomLeftRadius as number | undefined;\n const br = style.borderBottomRightRadius as number | undefined;\n\n if (tl == null && tr == null && bl == null && br == null) return '';\n return `${tl ?? 0}px ${tr ?? 0}px ${br ?? 0}px ${bl ?? 0}px`;\n}\n\n/**\n * Resolve margin/padding shorthand + Horizontal/Vertical expansions.\n * Returns top, right, bottom, left values.\n */\nfunction resolveSpacing(\n style: Record<string, unknown>,\n prefix: 'margin' | 'padding'\n): { top: string; right: string; bottom: string; left: string; shorthand: string } {\n const all = style[prefix];\n const top = style[`${prefix}Top`] ?? style[`${prefix}Vertical`] ?? all;\n const bottom = style[`${prefix}Bottom`] ?? style[`${prefix}Vertical`] ?? all;\n const right = style[`${prefix}Right`] ?? style[`${prefix}Horizontal`] ?? all;\n const left = style[`${prefix}Left`] ?? style[`${prefix}Horizontal`] ?? all;\n\n const t = toCssValue(top);\n const r = toCssValue(right);\n const b = toCssValue(bottom);\n const l = toCssValue(left);\n\n // Build shorthand\n let shorthand = '';\n if (t || r || b || l) {\n if (t === r && r === b && b === l) {\n shorthand = t || '0px';\n } else if (t === b && r === l) {\n shorthand = `${t || '0px'} ${r || '0px'}`;\n } else {\n shorthand = `${t || '0px'} ${r || '0px'} ${b || '0px'} ${l || '0px'}`;\n }\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n shorthand,\n };\n}\n\n/**\n * Resolve gap values (gap, rowGap, columnGap).\n */\nfunction resolveGap(style: Record<string, unknown>): string {\n const gap = style.gap as number | undefined;\n const rowGap = style.rowGap as number | undefined;\n const columnGap = style.columnGap as number | undefined;\n\n if (gap != null) return `${gap}px`;\n if (rowGap != null && columnGap != null) return `${rowGap}px ${columnGap}px`;\n if (rowGap != null) return `${rowGap}px`;\n if (columnGap != null) return `${columnGap}px`;\n return '';\n}\n\n// ============================================================================\n// Core mapping function\n// ============================================================================\n\n/**\n * Map a flattened React Native style object to ExtendedComputedStyles.\n *\n * Rules:\n * - Numeric values → \"Npx\"\n * - String values → pass through\n * - textDecorationLine → textDecoration\n * - RN shadow props → boxShadow string\n * - CSS-only properties (cursor, visibility, grid*, etc.) → empty string\n */\nexport function mapNativeStyleToExtended(\n rnStyle: Record<string, unknown> | undefined | null\n): ExtendedComputedStyles {\n const s = rnStyle ?? {};\n\n const margin = resolveSpacing(s, 'margin');\n const padding = resolveSpacing(s, 'padding');\n\n return {\n // Layout\n display: (s.display as string) ?? 'flex',\n position: (s.position as string) ?? 'relative',\n boxSizing: '', // CSS-only\n width: toCssValue(s.width),\n height: toCssValue(s.height),\n minWidth: toCssValue(s.minWidth),\n maxWidth: toCssValue(s.maxWidth),\n minHeight: toCssValue(s.minHeight),\n maxHeight: toCssValue(s.maxHeight),\n margin: margin.shorthand,\n marginTop: margin.top,\n marginRight: margin.right,\n marginBottom: margin.bottom,\n marginLeft: margin.left,\n padding: padding.shorthand,\n paddingTop: padding.top,\n paddingRight: padding.right,\n paddingBottom: padding.bottom,\n paddingLeft: padding.left,\n overflow: (s.overflow as string) ?? '',\n overflowX: '', // CSS-only\n overflowY: '', // CSS-only\n\n // Flex/Grid — RN defaults to column, not row\n flexDirection: (s.flexDirection as string) ?? '',\n flexWrap: (s.flexWrap as string) ?? '',\n justifyContent: (s.justifyContent as string) ?? '',\n alignItems: (s.alignItems as string) ?? '',\n alignSelf: (s.alignSelf as string) ?? '',\n gap: resolveGap(s),\n gridTemplateColumns: '', // CSS-only\n gridTemplateRows: '', // CSS-only\n\n // Typography\n fontFamily: (s.fontFamily as string) ?? '',\n fontSize: toCssValue(s.fontSize),\n fontWeight: (s.fontWeight as string) ?? '',\n lineHeight: toCssValue(s.lineHeight),\n letterSpacing: toCssValue(s.letterSpacing),\n textAlign: (s.textAlign as string) ?? '',\n textTransform: (s.textTransform as string) ?? '',\n textDecoration: (s.textDecorationLine as string) ?? '', // RN name → CSS name\n color: (s.color as string) ?? '',\n\n // Visual\n backgroundColor: (s.backgroundColor as string) ?? '',\n backgroundImage: '', // CSS-only\n border: borderToCss(s),\n borderRadius: borderRadiusToCss(s),\n boxShadow: shadowToCss(s),\n opacity: s.opacity != null ? String(s.opacity) : '',\n outline: '', // CSS-only\n\n // Effects\n transform: transformToCss(s.transform),\n transition: '', // CSS-only\n cursor: '', // CSS-only\n zIndex: s.zIndex != null ? String(s.zIndex) : '',\n visibility: '', // CSS-only\n pointerEvents: (s.pointerEvents as string) ?? '',\n };\n}\n\n// ============================================================================\n// Design data functions\n// ============================================================================\n\n/**\n * Produce ElementDesignData for a single native element.\n */\nexport function getNativeElementDesignData(\n id: string,\n label: string | undefined,\n type: string,\n rnStyle: Record<string, unknown> | undefined | null,\n layout: NativeLayout | null\n): ElementDesignData {\n return {\n elementId: id,\n label,\n type,\n styles: mapNativeStyleToExtended(rnStyle),\n pseudoElements: [], // RN has no pseudo-elements\n rect: layout\n ? {\n x: layout.pageX,\n y: layout.pageY,\n width: layout.width,\n height: layout.height,\n }\n : { x: 0, y: 0, width: 0, height: 0 },\n };\n}\n\n/**\n * Compute style diffs between default and a state variation.\n */\nfunction computeStyleDiff(\n defaultStyles: ExtendedComputedStyles,\n stateStyles: ExtendedComputedStyles\n): StyleDiff[] {\n const diffs: StyleDiff[] = [];\n for (const key of Object.keys(defaultStyles) as Array<keyof ExtendedComputedStyles>) {\n if (defaultStyles[key] !== stateStyles[key]) {\n diffs.push({\n property: key,\n defaultValue: defaultStyles[key],\n stateValue: stateStyles[key],\n });\n }\n }\n return diffs;\n}\n\n/**\n * Merge a base RN style with a state override.\n */\nfunction mergeStyles(\n base: Record<string, unknown>,\n override: Record<string, unknown> | undefined\n): Record<string, unknown> {\n if (!override) return base;\n return { ...base, ...override };\n}\n\n/**\n * Produce StateStyles[] for default/pressed/focused/disabled.\n * Only includes states that have actual overrides or the default state.\n */\nexport function captureNativeStateVariations(\n baseStyle: Record<string, unknown> | undefined | null,\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n }\n): StateStyles[] {\n const base = baseStyle ?? {};\n const defaultExtended = mapNativeStyleToExtended(base);\n\n const results: StateStyles[] = [\n {\n state: 'default',\n styles: defaultExtended,\n diffFromDefault: [],\n },\n ];\n\n if (!stateStyles) return results;\n\n const states: Array<{ name: NativeInteractionStateName; override?: Record<string, unknown> }> = [\n { name: 'pressed', override: stateStyles.pressed },\n { name: 'focused', override: stateStyles.focused },\n { name: 'disabled', override: stateStyles.disabled },\n ];\n\n for (const { name, override } of states) {\n if (!override) continue;\n const merged = mergeStyles(base, override);\n const extended = mapNativeStyleToExtended(merged);\n const diff = computeStyleDiff(defaultExtended, extended);\n if (diff.length > 0) {\n results.push({ state: name, styles: extended, diffFromDefault: diff });\n }\n }\n\n return results;\n}\n\n/**\n * Capture a responsive snapshot.\n *\n * Platform limitation: RN cannot constrain screen width at runtime.\n * This returns a single snapshot at the current device dimensions.\n */\nexport function captureNativeResponsiveSnapshot(\n elements: Array<{\n id: string;\n label?: string;\n type: string;\n flatStyle?: Record<string, unknown>;\n layout: NativeLayout | null;\n }>,\n screenDimensions: { width: number; height: number }\n): ResponsiveSnapshot[] {\n const elementData = elements.map((el) =>\n getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, el.layout)\n );\n\n return [\n {\n viewportWidth: screenDimensions.width,\n viewportLabel: 'current',\n elements: elementData,\n timestamp: Date.now(),\n },\n ];\n}\n","/**\n * UI Bridge Native Design Review Handlers\n *\n * HTTP handlers for the 8 design review endpoints.\n * Maps registered element styles to the web SDK's design data format.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { APIResponse, HandlerContext } from './types';\nimport type { ElementDesignData, StateStyles, ResponsiveSnapshot } from '../design/design-types';\nimport {\n mapNativeStyleToExtended,\n getNativeElementDesignData,\n captureNativeStateVariations,\n captureNativeResponsiveSnapshot,\n} from '../design/design-inspector-native';\n\n// Style guide and baseline stored in closure (same pattern as web SDK)\nlet loadedStyleGuide: unknown = null;\nlet savedBaseline: unknown = null;\n\n// Try to load the style validator from the web SDK (optional peer dep)\nlet styleValidator: {\n runStyleAudit: (\n elements: Array<{ elementId: string; styles: Record<string, string> }>,\n guide: unknown\n ) => unknown;\n} | null = null;\n\n// Try to load quality evaluator from the web SDK (optional peer dep)\nlet qualityEvaluator: {\n evaluateQuality: (\n elements: ElementDesignData[],\n viewport: { width: number; height: number },\n context?: unknown\n ) => unknown;\n listContexts: () => Array<{ name: string; description: string }>;\n createBaseline: (\n elements: ElementDesignData[],\n viewport: { width: number; height: number },\n label?: string\n ) => unknown;\n diffSnapshots: (baseline: unknown, current: ElementDesignData[]) => unknown;\n} | null = null;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const specs = require('@qontinui/ui-bridge/specs');\n styleValidator = specs;\n qualityEvaluator = specs;\n} catch {\n // Optional dependency not installed — audit/evaluate endpoints will return an error\n}\n\nfunction success<T>(data: T): APIResponse<T> {\n return { success: true, data, timestamp: Date.now() };\n}\n\nfunction error<T = unknown>(message: string, code?: string): APIResponse<T> {\n return { success: false, error: message, code, timestamp: Date.now() };\n}\n\n/**\n * Design handler interface (subset of NativeServerHandlers)\n */\nexport interface NativeDesignHandlers {\n getElementStyles: (ctx: HandlerContext) => Promise<APIResponse<ElementDesignData>>;\n getElementStateStyles: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ elementId: string; stateStyles: StateStyles[] }>>;\n getDesignSnapshot: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ elements: ElementDesignData[]; timestamp: number }>>;\n getResponsiveSnapshots: (ctx: HandlerContext) => Promise<APIResponse<ResponsiveSnapshot[]>>;\n runDesignAudit: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n loadStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<{ loaded: boolean }>>;\n getStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n clearStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n evaluateQuality: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n getQualityContexts: (\n ctx: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; description: string }>>>;\n saveBaseline: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ saved: boolean; elementCount: number }>>;\n diffBaseline: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n}\n\n/**\n * Create design review handlers.\n */\nexport function createDesignHandlers(registry: NativeUIBridgeRegistry): NativeDesignHandlers {\n // Helper to get screen dimensions (React Native's Dimensions API must be\n // called at handler time, not import time, so we use a lazy getter).\n function getScreenDimensions(): { width: number; height: number } {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { Dimensions } = require('react-native');\n const screen = Dimensions.get('screen');\n return { width: screen.width, height: screen.height };\n } catch {\n return { width: 0, height: 0 };\n }\n }\n\n return {\n // 1. GET /design/element/:id/styles\n getElementStyles: async (ctx) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error('Element not found: ' + id, 'ELEMENT_NOT_FOUND');\n }\n\n const state = element.getState();\n const data = getNativeElementDesignData(\n id,\n element.label,\n element.type,\n element.flatStyle,\n state.layout\n );\n\n return success(data);\n },\n\n // 2. POST /design/element/:id/state-styles\n getElementStateStyles: async (ctx) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error('Element not found: ' + id, 'ELEMENT_NOT_FOUND');\n }\n\n const stateStyles = captureNativeStateVariations(element.flatStyle, element.stateStyles);\n\n return success({ elementId: id, stateStyles });\n },\n\n // 3. POST /design/snapshot\n getDesignSnapshot: async (ctx) => {\n const body = ctx.body as\n | {\n elementIds?: string[];\n includePseudoElements?: boolean;\n }\n | undefined;\n\n let elements = registry.getAllElements();\n\n // Filter to requested IDs if specified\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n return success({ elements: designData, timestamp: Date.now() });\n },\n\n // 4. POST /design/responsive\n getResponsiveSnapshots: async () => {\n // Platform limitation: RN cannot constrain screen width at runtime.\n // Returns a single snapshot at current device dimensions.\n const elements = registry.getAllElements();\n const elementData = elements.map((el) => {\n const state = el.getState();\n return {\n id: el.id,\n label: el.label,\n type: el.type,\n flatStyle: el.flatStyle,\n layout: state.layout,\n };\n });\n\n const snapshots = captureNativeResponsiveSnapshot(elementData, getScreenDimensions());\n return success(snapshots);\n },\n\n // 5. POST /design/audit\n runDesignAudit: async (ctx) => {\n const body = ctx.body as\n | {\n guide?: unknown;\n elementIds?: string[];\n }\n | undefined;\n\n const guide = body?.guide ?? loadedStyleGuide;\n\n if (!guide) {\n return error('No style guide loaded or provided', 'NO_STYLE_GUIDE');\n }\n\n if (!styleValidator) {\n return error(\n 'Install @qontinui/ui-bridge for style audit support. ' +\n 'Add it as a dependency: npm install @qontinui/ui-bridge',\n 'VALIDATOR_NOT_AVAILABLE'\n );\n }\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n // Map elements to the format expected by the validator\n const auditElements = elements.map((el) => ({\n elementId: el.id,\n styles: mapNativeStyleToExtended(el.flatStyle) as unknown as Record<string, string>,\n }));\n\n try {\n const report = styleValidator.runStyleAudit(auditElements, guide);\n return success(report);\n } catch (err) {\n return error(\n 'Audit failed: ' + (err instanceof Error ? err.message : String(err)),\n 'DESIGN_AUDIT_ERROR'\n );\n }\n },\n\n // 6. POST /design/style-guide/load\n loadStyleGuide: async (ctx) => {\n const body = ctx.body as { guide?: unknown } | undefined;\n\n if (!body?.guide) {\n return error('Style guide is required in request body', 'INVALID_REQUEST');\n }\n\n loadedStyleGuide = body.guide;\n return success({ loaded: true });\n },\n\n // 7. GET /design/style-guide\n getStyleGuide: async () => {\n return success(loadedStyleGuide);\n },\n\n // 8. DELETE /design/style-guide\n clearStyleGuide: async () => {\n loadedStyleGuide = null;\n return success({ cleared: true });\n },\n\n // 9. POST /design/evaluate\n evaluateQuality: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support. ' +\n 'Add it as a dependency: npm install @qontinui/ui-bridge',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n const body = ctx.body as\n | {\n context?: string;\n customContext?: unknown;\n elementIds?: string[];\n viewport?: { width: number; height: number };\n }\n | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n const viewport = body?.viewport ?? getScreenDimensions();\n\n // Resolve context: custom object > style guide context > built-in name\n let context: unknown = body?.customContext ?? body?.context ?? 'general';\n if (typeof context === 'string' && loadedStyleGuide) {\n const guide = loadedStyleGuide as { qualityContexts?: Record<string, unknown> };\n if (guide.qualityContexts?.[context]) {\n context = guide.qualityContexts[context];\n }\n }\n\n try {\n const report = qualityEvaluator.evaluateQuality(designData, viewport, context);\n return success(report);\n } catch (err) {\n return error(\n 'Evaluation failed: ' + (err instanceof Error ? err.message : String(err)),\n 'QUALITY_EVALUATION_ERROR'\n );\n }\n },\n\n // 10. GET /design/evaluate/contexts\n getQualityContexts: async () => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n return success(qualityEvaluator.listContexts());\n },\n\n // 11. POST /design/evaluate/baseline\n saveBaseline: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n const body = ctx.body as\n | {\n label?: string;\n elementIds?: string[];\n }\n | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n const viewport = getScreenDimensions();\n savedBaseline = qualityEvaluator.createBaseline(designData, viewport, body?.label);\n return success({ saved: true, elementCount: designData.length });\n },\n\n // 12. POST /design/evaluate/diff\n diffBaseline: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n if (!savedBaseline) {\n return error('No baseline saved. Call saveBaseline first.', 'NO_BASELINE');\n }\n\n const body = ctx.body as { elementIds?: string[] } | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n try {\n const report = qualityEvaluator.diffSnapshots(savedBaseline, designData);\n return success(report);\n } catch (err) {\n return error(\n 'Diff failed: ' + (err instanceof Error ? err.message : String(err)),\n 'DIFF_BASELINE_ERROR'\n );\n }\n },\n };\n}\n","/**\n * UI Bridge Native Server Handlers\n *\n * Request handlers for the HTTP API endpoints.\n */\n\nimport { type NativeUIBridgeRegistry, extractHandlerNames } from '../core/registry';\nimport type { WorkflowStep } from '../core/types';\nimport type { NativeActionExecutor } from '../control/types';\nimport type { APIResponse, HandlerContext, NativeServerHandlers } from './types';\nimport { createDesignHandlers } from './design-handlers';\n\n/**\n * Result of executing a single workflow step\n */\ninterface WorkflowStepResult {\n stepId: string;\n type: string;\n status: 'completed' | 'failed' | 'skipped';\n result?: unknown;\n error?: string;\n durationMs: number;\n}\n\n/**\n * Execute a single workflow step using the registry and executor\n */\nasync function executeWorkflowStep(\n step: WorkflowStep,\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor\n): Promise<WorkflowStepResult> {\n const startTime = Date.now();\n\n try {\n switch (step.type) {\n case 'element-action': {\n if (!step.target || !step.action) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'element-action step requires target and action',\n durationMs: Date.now() - startTime,\n };\n }\n\n const response = await executor.executeAction(step.target, {\n action: step.action,\n params: step.params,\n waitOptions: step.waitOptions,\n });\n\n return {\n stepId: step.id,\n type: step.type,\n status: response.success ? 'completed' : 'failed',\n result: response.result,\n error: response.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'component-action': {\n if (!step.target || !step.action) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'component-action step requires target and action',\n durationMs: Date.now() - startTime,\n };\n }\n\n const response = await executor.executeComponentAction(step.target, {\n action: step.action,\n params: step.params,\n });\n\n return {\n stepId: step.id,\n type: step.type,\n status: response.success ? 'completed' : 'failed',\n result: response.result,\n error: response.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'wait': {\n if (!step.target) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'wait step requires target element id',\n durationMs: Date.now() - startTime,\n };\n }\n\n const waitResult = await executor.waitForElement(\n step.target,\n step.waitOptions || { visible: true, timeout: 10000, interval: 100 }\n );\n\n return {\n stepId: step.id,\n type: step.type,\n status: waitResult.met ? 'completed' : 'failed',\n result: waitResult.state,\n error: waitResult.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'assert': {\n if (!step.target) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'assert step requires target element id',\n durationMs: Date.now() - startTime,\n };\n }\n\n const element = registry.getElement(step.target);\n if (!element) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: `Element not found: ${step.target}`,\n durationMs: Date.now() - startTime,\n };\n }\n\n const state = element.getState();\n const expected = step.params || {};\n const stateRecord = state as unknown as Record<string, unknown>;\n const mismatches: string[] = [];\n\n for (const [key, value] of Object.entries(expected)) {\n const actual = stateRecord[key];\n const isEqual =\n typeof value === 'object' && value !== null\n ? JSON.stringify(actual) === JSON.stringify(value)\n : actual === value;\n if (!isEqual) {\n mismatches.push(\n `${key}: expected ${JSON.stringify(value)}, got ${JSON.stringify(actual)}`\n );\n }\n }\n\n return {\n stepId: step.id,\n type: step.type,\n status: mismatches.length === 0 ? 'completed' : 'failed',\n result: { state, mismatches },\n error: mismatches.length > 0 ? `Assertion failed: ${mismatches.join('; ')}` : undefined,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'custom': {\n if (!step.handler) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'custom step requires a handler function',\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await step.handler();\n // Allow handlers to signal failure by returning { success: false, error: '...' }\n const failed =\n result &&\n typeof result === 'object' &&\n 'success' in result &&\n (result as Record<string, unknown>).success === false;\n\n return {\n stepId: step.id,\n type: step.type,\n status: failed ? 'failed' : 'completed',\n result,\n error: failed\n ? ((result as Record<string, unknown>).error as string) ||\n 'Custom handler returned failure'\n : undefined,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'log': {\n const message = step.params?.message ?? step.params?.text ?? `[workflow] step ${step.id}`;\n console.log(`[ui-bridge-native] workflow log: ${message}`);\n\n return {\n stepId: step.id,\n type: step.type,\n status: 'completed',\n result: { message },\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'navigate':\n case 'branch':\n case 'loop':\n case 'extract':\n return {\n stepId: step.id,\n type: step.type,\n status: 'skipped',\n error: `Step type \"${step.type}\" is not yet supported in native workflow execution`,\n durationMs: Date.now() - startTime,\n };\n\n default:\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: `Unknown step type: ${step.type}`,\n durationMs: Date.now() - startTime,\n };\n }\n } catch (err) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Create a success response\n */\nfunction success<T>(data: T): APIResponse<T> {\n return {\n success: true,\n data,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create an error response\n */\nfunction error<T = unknown>(message: string, code?: string): APIResponse<T> {\n return {\n success: false,\n error: message,\n code,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create server handlers\n */\nexport function createServerHandlers(\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor,\n config?: { appInfo?: { appId: string; appName: string; appType: string; framework?: string } }\n): NativeServerHandlers {\n const designHandlers = createDesignHandlers(registry);\n\n return {\n // Elements\n getElements: async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx.query?.visibleOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.visibleOnly === true;\n const forRoute = (ctx.query?.route || (ctx.body as Record<string, unknown>)?.route) as\n | string\n | undefined;\n\n let allElements = visibleOnly ? registry.getVisibleElements() : registry.getAllElements();\n\n // Filter by specific route (injected by setRouteProvider override when currentRouteOnly is set)\n if (forRoute) {\n allElements = allElements.filter((e) => e.registrationRoute === forRoute);\n }\n\n const elements = allElements.map((e) => {\n const handlers = extractHandlerNames(e.props);\n return {\n id: e.id,\n type: e.type,\n label: e.label,\n identifier: e.getIdentifier(),\n state: e.getState(),\n actions: e.actions,\n customActions: e.customActions ? Object.keys(e.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: e.registrationRoute,\n };\n });\n\n return success({ elements });\n },\n\n getElement: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error(`Element not found: ${id}`, 'ELEMENT_NOT_FOUND');\n }\n\n const handlers = extractHandlerNames(element.props);\n\n return success({\n element: {\n id: element.id,\n type: element.type,\n label: element.label,\n identifier: element.getIdentifier(),\n state: element.getState(),\n actions: element.actions,\n customActions: element.customActions ? Object.keys(element.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: element.registrationRoute,\n },\n });\n },\n\n getElementState: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error(`Element not found: ${id}`, 'ELEMENT_NOT_FOUND');\n }\n\n return success({ state: element.getState() });\n },\n\n executeAction: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const body = ctx.body as {\n action: string;\n params?: Record<string, unknown>;\n waitOptions?: Record<string, unknown>;\n };\n\n if (!body?.action) {\n return error('Action is required', 'INVALID_REQUEST');\n }\n\n const response = await executor.executeAction(id, {\n action: body.action,\n params: body.params,\n waitOptions: body.waitOptions as any,\n });\n\n if (!response.success) {\n return error(response.error || 'Action failed', 'ACTION_FAILED');\n }\n\n return success(response);\n },\n\n // Components\n getComponents: async () => {\n const components = registry.getAllComponents().map((c) => ({\n id: c.id,\n name: c.name,\n description: c.description,\n actions: c.actions.map((a) => ({ id: a.id, label: a.label })),\n elementIds: c.elementIds,\n }));\n\n return success({ components });\n },\n\n getComponent: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const component = registry.getComponent(id);\n\n if (!component) {\n return error(`Component not found: ${id}`, 'COMPONENT_NOT_FOUND');\n }\n\n return success({\n component: {\n id: component.id,\n name: component.name,\n description: component.description,\n actions: component.actions.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n })),\n elementIds: component.elementIds,\n },\n });\n },\n\n executeComponentAction: async (ctx: HandlerContext) => {\n const { id, actionId } = ctx.params;\n const body = ctx.body as { params?: Record<string, unknown> };\n\n const response = await executor.executeComponentAction(id, {\n action: actionId,\n params: body?.params,\n });\n\n if (!response.success) {\n return error(response.error || 'Action failed', 'ACTION_FAILED');\n }\n\n return success(response);\n },\n\n // Discovery\n find: async (ctx: HandlerContext) => {\n const body = ctx.body as {\n types?: string[];\n testIdPattern?: string;\n accessibilityLabelPattern?: string;\n visibleOnly?: boolean;\n limit?: number;\n };\n\n const response = await executor.find({\n types: body?.types as any,\n testIdPattern: body?.testIdPattern,\n accessibilityLabelPattern: body?.accessibilityLabelPattern,\n visibleOnly: body?.visibleOnly,\n limit: body?.limit,\n });\n\n return success(response);\n },\n\n getSnapshot: async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx.query?.visibleOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.visibleOnly === true;\n const snapshot = registry.createSnapshot(undefined, { visibleOnly });\n return success(snapshot);\n },\n\n // Workflows\n getWorkflows: async () => {\n const workflows = registry.getAllWorkflows().map((w) => ({\n id: w.id,\n name: w.name,\n description: w.description,\n stepCount: w.steps.length,\n }));\n\n return success({ workflows });\n },\n\n runWorkflow: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const workflow = registry.getWorkflow(id);\n\n if (!workflow) {\n return error(`Workflow not found: ${id}`, 'WORKFLOW_NOT_FOUND');\n }\n\n const runId = `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const startTime = Date.now();\n const stepResults: WorkflowStepResult[] = [];\n let status: 'completed' | 'failed' = 'completed';\n\n registry.emit('workflow:started', {\n runId,\n workflowId: id,\n workflowName: workflow.name,\n totalSteps: workflow.steps.length,\n });\n\n for (const step of workflow.steps) {\n const stepResult = await executeWorkflowStep(step, registry, executor);\n stepResults.push(stepResult);\n\n if (stepResult.status === 'completed' || stepResult.status === 'skipped') {\n registry.emit('workflow:stepCompleted', {\n runId,\n workflowId: id,\n step: stepResult,\n });\n }\n\n if (stepResult.status === 'failed') {\n status = 'failed';\n registry.emit('workflow:failed', {\n runId,\n workflowId: id,\n failedStep: stepResult,\n completedSteps: stepResults.length - 1,\n totalSteps: workflow.steps.length,\n });\n break;\n }\n }\n\n if (status === 'completed') {\n registry.emit('workflow:completed', {\n runId,\n workflowId: id,\n steps: stepResults,\n totalDurationMs: Date.now() - startTime,\n });\n }\n\n return success({\n runId,\n status,\n steps: stepResults,\n totalSteps: workflow.steps.length,\n completedSteps: stepResults.filter((s) => s.status === 'completed').length,\n failedSteps: stepResults.filter((s) => s.status === 'failed').length,\n skippedSteps: stepResults.filter((s) => s.status === 'skipped').length,\n durationMs: Date.now() - startTime,\n });\n },\n\n // Page Navigation (stubs — React Native apps should override with their navigation provider)\n pageRefresh: async () => {\n return error('Page refresh not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageNavigate: async () => {\n return error('Page navigation not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageReplace: async () => {\n return error('Page replace not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageGoBack: async () => {\n return error('Page go back not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageGoForward: async () => {\n return error('Page go forward not supported on native platform', 'NOT_SUPPORTED');\n },\n\n // Screenshot (stub — apps should override with their screen capture library)\n getScreenshot: async () => {\n return error(\n 'Screenshot not supported. Provide a screenshotProvider to UIBridgeNativeProvider.',\n 'NOT_SUPPORTED'\n );\n },\n\n // Meta / Introspection (stub — server constructor overrides with real route table)\n getMethods: async () => {\n return error('Methods introspection not configured', 'NOT_SUPPORTED');\n },\n\n // Design Review\n ...designHandlers,\n\n // Health\n health: async () => {\n const stats = registry.getStats();\n const response: Record<string, unknown> = {\n status: 'healthy',\n timestamp: Date.now(),\n ...stats,\n };\n\n if (config?.appInfo) {\n response.uiBridge = {\n version: '0.3.0',\n ...config.appInfo,\n capabilities: ['elements', 'components', 'actions', 'design'],\n elementCount: stats.elements,\n componentCount: stats.components,\n };\n }\n\n return success(response as any);\n },\n };\n}\n","/**\n * WebSocket JSON-RPC message types for the UI Bridge protocol.\n */\n\n// ── Client → Server ─────────────────────────────────────────────────────────\n\n/** Standard JSON-RPC request */\nexport interface JsonRpcRequest {\n id: number | string;\n method: string;\n params?: Record<string, unknown>;\n}\n\n/** Batch request — execute multiple requests concurrently */\nexport interface JsonRpcBatchRequest {\n id: number | string;\n batch: JsonRpcRequest[];\n}\n\n/** Subscribe to registry events */\nexport interface JsonRpcSubscribe {\n id: number | string;\n method: 'subscribe';\n params: {\n events: string[];\n /** Optional throttle in ms — batch rapid events within this window */\n throttleMs?: number;\n };\n}\n\n/** Unsubscribe from registry events */\nexport interface JsonRpcUnsubscribe {\n id: number | string;\n method: 'unsubscribe';\n params: { events: string[] };\n}\n\n/** Any client message */\nexport type JsonRpcClientMessage =\n | JsonRpcRequest\n | JsonRpcBatchRequest\n | JsonRpcSubscribe\n | JsonRpcUnsubscribe;\n\n// ── Server → Client ─────────────────────────────────────────────────────────\n\n/** Standard JSON-RPC response */\nexport interface JsonRpcResponse {\n id: number | string;\n result?: {\n success: boolean;\n data?: unknown;\n error?: string;\n code?: string;\n timestamp?: number;\n };\n}\n\n/** Batch response */\nexport interface JsonRpcBatchResponse {\n id: number | string;\n results: JsonRpcResponse[];\n}\n\n/** Server-pushed event (no id — not a response to a request) */\nexport interface JsonRpcEvent {\n event: string;\n data: unknown;\n timestamp: number;\n}\n\n/** Any server message */\nexport type JsonRpcServerMessage = JsonRpcResponse | JsonRpcBatchResponse | JsonRpcEvent;\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Check if a message is a batch request */\nexport function isBatchRequest(msg: unknown): msg is JsonRpcBatchRequest {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'batch' in msg &&\n Array.isArray((msg as JsonRpcBatchRequest).batch)\n );\n}\n\n/** Check if a message is a subscribe request */\nexport function isSubscribe(msg: unknown): msg is JsonRpcSubscribe {\n return (\n typeof msg === 'object' && msg !== null && (msg as JsonRpcSubscribe).method === 'subscribe'\n );\n}\n\n/** Check if a message is an unsubscribe request */\nexport function isUnsubscribe(msg: unknown): msg is JsonRpcUnsubscribe {\n return (\n typeof msg === 'object' && msg !== null && (msg as JsonRpcUnsubscribe).method === 'unsubscribe'\n );\n}\n","/**\n * UI Bridge Native HTTP Server\n *\n * Abstract HTTP server implementation for React Native.\n * This provides a framework-agnostic server interface that can be\n * implemented using various React Native HTTP server libraries.\n *\n * Supported libraries:\n * - react-native-http-bridge (recommended)\n * - @aspect/react-native-http-server\n * - Custom implementations\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { NativeActionExecutor, PageNavigationResponse } from '../control/types';\nimport type {\n NativeServerConfig,\n NativeServerHandlers,\n NavigationProvider,\n RouteProvider,\n ScreenshotProvider,\n APIResponse,\n HandlerContext,\n} from './types';\nimport type { BridgeEvent } from '../core/types';\nimport { createServerHandlers } from './handlers';\nimport type { WebSocketEventBridge } from './ws-event-bridge';\nimport type { JsonRpcRequest, JsonRpcResponse } from './ws-types';\nimport { isBatchRequest, isSubscribe, isUnsubscribe } from './ws-types';\n\n// ── Path pattern matching ───────────────────────────────────────────────────\n\n/**\n * Match an actual path against a pattern with :name placeholders.\n * Returns extracted params, or null if the pattern does not match.\n *\n * Example: parsePath('control/element/:id/action', 'control/element/tab-runs/action')\n * → { id: 'tab-runs' }\n */\nfunction parsePath(pattern: string, actual: string): Record<string, string> | null {\n const patternParts = pattern.split('/');\n const actualParts = actual.split('/');\n\n if (patternParts.length !== actualParts.length) {\n return null;\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i].startsWith(':')) {\n params[patternParts[i].slice(1)] = actualParts[i];\n } else if (patternParts[i] !== actualParts[i]) {\n return null;\n }\n }\n return params;\n}\n\n// ── WebSocket route table ───────────────────────────────────────────────────\n\n/**\n * Route table for WebSocket JSON-RPC methods.\n *\n * Method strings use the same path structure as HTTP routes (with :id placeholders)\n * but without the /ui-bridge/ prefix. Path params are extracted automatically.\n *\n * Examples:\n * \"health\" → handlers.health\n * \"control/snapshot\" → handlers.getSnapshot\n * \"control/element/tab-runs/action\" → handlers.executeAction ({id: 'tab-runs'})\n * \"control/component/my-comp/action/submit\" → handlers.executeComponentAction\n */\ntype HandlerKey = keyof NativeServerHandlers;\ntype HttpVerb = 'GET' | 'POST' | 'DELETE';\n\ninterface WsRoute {\n pattern: string;\n handler: HandlerKey;\n /**\n * HTTP verbs this route accepts when invoked over HTTP. When absent the\n * route is WS-only (or matches any verb on HTTP). Multiple verbs allow\n * a single pattern to serve GET+POST etc.\n */\n httpMethods?: readonly HttpVerb[];\n}\n\nconst WS_ROUTES: readonly WsRoute[] = [\n // Health\n { pattern: 'health', handler: 'health', httpMethods: ['GET'] },\n\n // Elements\n { pattern: 'control/elements', handler: 'getElements', httpMethods: ['GET'] },\n // Flat alias — matches the runner UI Bridge's `/ui-bridge/elements` path so\n // agents can use the same URL across runner + mobile without remembering\n // the `control/` prefix. Delegates to the same handler.\n { pattern: 'elements', handler: 'getElements', httpMethods: ['GET'] },\n { pattern: 'control/element/:id', handler: 'getElement', httpMethods: ['GET'] },\n { pattern: 'control/element/:id/state', handler: 'getElementState', httpMethods: ['GET'] },\n { pattern: 'control/element/:id/action', handler: 'executeAction', httpMethods: ['POST'] },\n\n // Components\n { pattern: 'control/components', handler: 'getComponents', httpMethods: ['GET'] },\n { pattern: 'control/component/:id', handler: 'getComponent', httpMethods: ['GET'] },\n {\n pattern: 'control/component/:id/action/:actionId',\n handler: 'executeComponentAction',\n httpMethods: ['POST'],\n },\n\n // Discovery\n { pattern: 'control/find', handler: 'find', httpMethods: ['POST'] },\n { pattern: 'control/snapshot', handler: 'getSnapshot', httpMethods: ['GET'] },\n { pattern: 'control/discover', handler: 'getSnapshot' },\n\n // Workflows\n { pattern: 'control/workflows', handler: 'getWorkflows', httpMethods: ['GET'] },\n { pattern: 'control/workflow/:id/run', handler: 'runWorkflow', httpMethods: ['POST'] },\n\n // Page Navigation\n { pattern: 'control/page/refresh', handler: 'pageRefresh', httpMethods: ['POST'] },\n { pattern: 'control/page/navigate', handler: 'pageNavigate', httpMethods: ['POST'] },\n { pattern: 'control/page/replace', handler: 'pageReplace', httpMethods: ['POST'] },\n { pattern: 'control/page/back', handler: 'pageGoBack', httpMethods: ['POST'] },\n { pattern: 'control/page/forward', handler: 'pageGoForward', httpMethods: ['POST'] },\n\n // Screenshot — accepts both GET and POST on HTTP\n { pattern: 'control/screenshot', handler: 'getScreenshot', httpMethods: ['GET', 'POST'] },\n\n // Design Review\n { pattern: 'design/element/:id/styles', handler: 'getElementStyles', httpMethods: ['GET'] },\n {\n pattern: 'design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n httpMethods: ['POST'],\n },\n { pattern: 'design/snapshot', handler: 'getDesignSnapshot', httpMethods: ['POST'] },\n { pattern: 'design/responsive', handler: 'getResponsiveSnapshots', httpMethods: ['POST'] },\n { pattern: 'design/audit', handler: 'runDesignAudit', httpMethods: ['POST'] },\n { pattern: 'design/style-guide/load', handler: 'loadStyleGuide', httpMethods: ['POST'] },\n { pattern: 'design/style-guide', handler: 'getStyleGuide', httpMethods: ['GET'] },\n // style-guide/clear: WS uses this pattern; HTTP uses DELETE on /design/style-guide.\n // We keep a WS-only entry for the explicit \"clear\" subpath, and add a DELETE-on-style-guide entry.\n { pattern: 'design/style-guide/clear', handler: 'clearStyleGuide' },\n { pattern: 'design/style-guide', handler: 'clearStyleGuide', httpMethods: ['DELETE'] },\n\n // Quality Evaluation\n { pattern: 'design/evaluate', handler: 'evaluateQuality', httpMethods: ['POST'] },\n { pattern: 'design/evaluate/contexts', handler: 'getQualityContexts', httpMethods: ['GET'] },\n { pattern: 'design/evaluate/baseline', handler: 'saveBaseline', httpMethods: ['POST'] },\n { pattern: 'design/evaluate/diff', handler: 'diffBaseline', httpMethods: ['POST'] },\n\n // Meta / Introspection\n { pattern: 'meta/methods', handler: 'getMethods', httpMethods: ['GET'] },\n];\n\n// ── _help payload ───────────────────────────────────────────────────────────\n\n/**\n * Short description keyed by handler name — rendered alongside the route\n * list so `_help` is self-documenting. Only needs to cover handlers that\n * appear in WS_ROUTES.\n */\nconst HANDLER_DESCRIPTIONS: Record<string, string> = {\n health: 'Liveness probe; returns app metadata + element count',\n getElements: 'Flat list of registered UI elements',\n getElement: 'Single element by id',\n getElementState: 'Dynamic state (value, focused, checked) for one element',\n executeAction: 'Run an action on an element (see \"actions\" below for names)',\n getComponents: 'Higher-level components with action schemas',\n getComponent: 'Component detail + per-action paramSchema',\n executeComponentAction: 'Invoke a component action directly (preferred over button clicks)',\n find: 'AI-powered element search by natural-language query',\n getSnapshot:\n 'Full snapshot: elements + route + state. Supports ?visibleOnly=true and ?currentRouteOnly=true',\n getWorkflows: 'List registered workflows',\n runWorkflow: 'Trigger a workflow by id',\n pageRefresh: 'Reload the current route',\n pageNavigate: 'Imperative router.push(url) — preferred over tapping tab buttons',\n pageReplace: 'router.replace(url)',\n pageGoBack: 'router.back()',\n pageGoForward: 'router.forward()',\n getScreenshot: 'PNG screenshot of the current screen',\n getElementStyles: 'Computed styles for an element (design review)',\n getElementStateStyles: 'Computed styles per interaction state (hover/focus/disabled)',\n getDesignSnapshot: 'Visual + style snapshot for design review',\n getResponsiveSnapshots: 'Screenshots at multiple viewport widths',\n runDesignAudit: 'Accessibility + visual audit',\n loadStyleGuide: 'Load a design system style guide',\n getStyleGuide: 'Fetch the currently loaded style guide',\n clearStyleGuide: 'Unload the style guide',\n evaluateQuality: 'Score the current UI against a quality context',\n getQualityContexts: 'List available quality evaluation contexts',\n saveBaseline: 'Save a quality baseline snapshot',\n diffBaseline: 'Diff current UI against a saved baseline',\n getMethods: 'List every handler name (legacy introspection)',\n};\n\n/** Static reference for common action names + their params. */\nconst ACTION_REFERENCE = [\n { name: 'press', aliases: ['click'], params: 'PressActionParams (optional position)' },\n { name: 'longPress', params: 'PressActionParams (optional position)' },\n { name: 'doubleTap', params: 'none' },\n {\n name: 'type',\n params:\n 'TypeActionParams { text, delay?, clear? | clearFirst? } — `clear:true` replaces content atomically',\n },\n { name: 'clear', params: 'none — empties the input' },\n { name: 'focus', params: 'none' },\n { name: 'blur', params: 'none' },\n { name: 'scroll', params: 'ScrollActionParams { offset? {x,y}, to? }' },\n { name: 'swipe', params: 'SwipeActionParams { direction, distance }' },\n { name: 'toggle', params: 'none — flips boolean controls' },\n];\n\n/**\n * Minimal `{method, path}` list matching the runner's `/_routes` shape so\n * the same URL works across platforms. Expanded multi-verb routes into one\n * entry per verb.\n */\nfunction buildRoutesPayload() {\n const entries: Array<{ method: string; path: string }> = [];\n for (const r of WS_ROUTES) {\n if (!r.httpMethods) continue;\n for (const m of r.httpMethods) {\n entries.push({ method: m, path: `/ui-bridge/${r.pattern}` });\n }\n }\n // Expose the two discovery endpoints themselves so self-reference is clean.\n entries.push({ method: 'GET', path: '/ui-bridge/_help' });\n entries.push({ method: 'GET', path: '/ui-bridge/_routes' });\n entries.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));\n return { routes: entries, count: entries.length };\n}\n\n/**\n * Build the `/_help` payload: route index + action reference.\n * Cheap to compute; we don't cache since it's rarely called.\n */\nfunction buildHelpPayload() {\n return {\n version: 1,\n description: 'UI Bridge Native HTTP surface. Prefix every path with /ui-bridge/.',\n routes: WS_ROUTES.map((r) => ({\n pattern: r.pattern,\n httpMethods: r.httpMethods ?? [],\n wsOnly: !r.httpMethods,\n handler: r.handler,\n description: HANDLER_DESCRIPTIONS[r.handler] ?? '',\n })),\n actions: ACTION_REFERENCE,\n tips: [\n 'Start with `GET /ui-bridge/control/snapshot?visibleOnly=true` to see what the user actually sees.',\n 'Prefer `control/component/:id/action/:actionId` over button presses — typed paramSchema, no button-id guessing.',\n 'Use `pageNavigate` for tab switches instead of pressing tab buttons; gesture state often swallows clicks.',\n 'The `type` action supports `clear:true` to replace existing text atomically in one call.',\n ],\n };\n}\n\n/**\n * HTTP Request interface (library-agnostic)\n */\nexport interface HTTPRequest {\n method: string;\n path: string;\n headers: Record<string, string>;\n query: Record<string, string>;\n body?: unknown;\n}\n\n/**\n * HTTP Response interface (library-agnostic)\n */\nexport interface HTTPResponse {\n status: number;\n headers: Record<string, string>;\n body: string;\n}\n\n/**\n * Request handler type\n */\nexport type RequestHandler = (request: HTTPRequest) => Promise<HTTPResponse>;\n\n/**\n * Server adapter interface\n *\n * Implement this interface to integrate with your chosen HTTP server library.\n */\nexport interface ServerAdapter {\n /** Start the server */\n start(port: number, handler: RequestHandler): Promise<void>;\n /** Stop the server */\n stop(): Promise<void>;\n /** Check if server is running */\n isRunning(): boolean;\n}\n\n/**\n * WebSocket-aware server adapter interface.\n *\n * Extends ServerAdapter with callbacks for WebSocket connections.\n * The adapter manages the raw TCP/WS layer; these callbacks let the\n * UI Bridge server handle message routing and event broadcasting.\n */\nexport interface WebSocketServerAdapter extends ServerAdapter {\n /** Called when a JSON text frame is received from a WS client. Returns response string or null. */\n onWebSocketMessage?: (connId: string, message: string) => Promise<string | null>;\n /** Called when a new WS connection is established after the HTTP 101 upgrade. */\n onWebSocketConnect?: (connId: string) => void;\n /** Called when a WS connection is closed or drops. */\n onWebSocketDisconnect?: (connId: string) => void;\n /** Send a message to a specific WS connection by ID. */\n sendToConnection?: (connId: string, message: string) => void;\n /** Send a message to all connected WS clients. */\n broadcast?: (message: string) => void;\n}\n\n/**\n * Native UI Bridge HTTP Server\n */\nexport class NativeUIBridgeServer {\n private config: NativeServerConfig;\n private handlers: NativeServerHandlers;\n private adapter?: ServerAdapter;\n private running = false;\n /**\n * Per-connection cleanup thunks for in-flight waiters (waitForElement,\n * waitForCondition, ...). Aborted when a client disconnects so the\n * underlying timers/listeners don't leak.\n */\n private pendingWaiters = new Map<string, Set<() => void>>();\n\n constructor(\n private registry: NativeUIBridgeRegistry,\n private executor: NativeActionExecutor,\n config: NativeServerConfig = {}\n ) {\n this.config = {\n serverPort: 8087,\n cors: true,\n ...config,\n };\n this.handlers = createServerHandlers(registry, executor, {\n appInfo: this.config.appInfo,\n });\n\n // Set up method introspection from the route table\n this.handlers.getMethods = async () => {\n const methods = WS_ROUTES.map((r) => ({\n method: r.pattern,\n httpMethods: r.httpMethods ? [...r.httpMethods] : undefined,\n }));\n // Add special WebSocket-only methods not in the route table\n const wsMethods = [\n { method: 'waitForElement', description: 'Wait for an element to be registered' },\n { method: 'waitForCondition', description: 'Wait for an element state predicate' },\n { method: 'sequence', description: 'Execute a sequence of steps in order' },\n { method: 'events/history', description: 'Replay recent registry events' },\n { method: 'subscriptions/list', description: 'List current event subscriptions' },\n ];\n return {\n success: true,\n data: { methods: [...methods, ...wsMethods] },\n timestamp: Date.now(),\n };\n };\n }\n\n /**\n * Set the server adapter\n */\n setAdapter(adapter: ServerAdapter): void {\n this.adapter = adapter;\n }\n\n /**\n * Set a navigation provider for programmatic route navigation.\n * This enables `control/page/navigate` and `control/page/back` on native.\n */\n setNavigationProvider(provider: NavigationProvider): void {\n this.handlers.pageNavigate = async (ctx): Promise<APIResponse<PageNavigationResponse>> => {\n const body = ctx.body as Record<string, unknown> | undefined;\n const url = body?.url;\n if (!url || typeof url !== 'string') {\n return { success: false, error: 'Missing required \"url\" parameter', timestamp: Date.now() };\n }\n try {\n provider.navigate(url);\n return {\n success: true,\n data: { success: true, url, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: any) {\n return { success: false, error: `Navigation failed: ${e.message}`, timestamp: Date.now() };\n }\n };\n\n this.handlers.pageReplace = async (ctx): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.replace) {\n return {\n success: false,\n error: 'Replace navigation not supported by navigation provider',\n timestamp: Date.now(),\n };\n }\n const body = ctx.body as Record<string, unknown> | undefined;\n const url = body?.url;\n if (!url || typeof url !== 'string') {\n return { success: false, error: 'Missing required \"url\" parameter', timestamp: Date.now() };\n }\n try {\n provider.replace(url);\n return {\n success: true,\n data: { success: true, url, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: any) {\n return {\n success: false,\n error: `Replace navigation failed: ${e.message}`,\n timestamp: Date.now(),\n };\n }\n };\n\n this.handlers.pageGoBack = async (): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.back) {\n return { success: false, error: 'Back navigation not supported', timestamp: Date.now() };\n }\n try {\n provider.back();\n return {\n success: true,\n data: { success: true, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: any) {\n return {\n success: false,\n error: `Back navigation failed: ${e.message}`,\n timestamp: Date.now(),\n };\n }\n };\n\n this.handlers.pageRefresh = async (): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.refresh) {\n return {\n success: false,\n error: 'Page refresh not supported by navigation provider',\n timestamp: Date.now(),\n };\n }\n try {\n provider.refresh();\n return {\n success: true,\n data: { success: true, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: any) {\n return { success: false, error: `Refresh failed: ${e.message}`, timestamp: Date.now() };\n }\n };\n }\n\n /**\n * Set a route provider for reporting the current navigation route.\n * When set, `control/snapshot` responses include `currentRoute` and `segments`.\n */\n setRouteProvider(provider: RouteProvider): void {\n // Override getElements to support currentRouteOnly filtering with real route data\n const baseGetElements = this.handlers.getElements;\n this.handlers.getElements = async (ctx: HandlerContext) => {\n const currentRouteOnly =\n ctx.query?.currentRouteOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.currentRouteOnly === true;\n\n // If currentRouteOnly requested and no explicit route param, inject the current route\n if (currentRouteOnly && !ctx.query?.route && !(ctx.body as Record<string, unknown>)?.route) {\n const currentRoute = provider.getCurrentRoute();\n if (currentRoute) {\n // Inject route into query so the base handler can filter by it\n ctx.query = { ...ctx.query, route: currentRoute };\n }\n }\n return baseGetElements(ctx);\n };\n\n this.handlers.getSnapshot = async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx?.query?.visibleOnly === 'true' ||\n (ctx?.body as Record<string, unknown>)?.visibleOnly === true;\n const currentRouteOnly =\n ctx?.query?.currentRouteOnly === 'true' ||\n (ctx?.body as Record<string, unknown>)?.currentRouteOnly === true;\n const snapshot = this.registry.createSnapshot(\n {\n currentRoute: provider.getCurrentRoute(),\n segments: provider.getSegments?.(),\n },\n { visibleOnly, currentRouteOnly }\n );\n return { success: true, data: snapshot, timestamp: Date.now() };\n };\n }\n\n /**\n * Set a screenshot provider for native screen capture.\n * This enables `control/screenshot` on native.\n */\n setScreenshotProvider(provider: ScreenshotProvider): void {\n const SCREENSHOT_TIMEOUT_MS = 10_000;\n this.handlers.getScreenshot = async () => {\n try {\n const result = await Promise.race([\n provider.capture(),\n new Promise<never>((_, reject) =>\n setTimeout(\n () =>\n reject(new Error(`Screenshot capture timed out after ${SCREENSHOT_TIMEOUT_MS}ms`)),\n SCREENSHOT_TIMEOUT_MS\n )\n ),\n ]);\n return {\n success: true,\n data: { screenshot: result.base64, width: result.width, height: result.height },\n timestamp: Date.now(),\n };\n } catch (e: any) {\n return {\n success: false,\n error: `Screenshot capture failed: ${e.message}`,\n timestamp: Date.now(),\n };\n }\n };\n }\n\n /**\n * Start the HTTP server\n */\n async start(): Promise<void> {\n if (this.running) {\n console.warn('[ui-bridge-native] Server already running');\n return;\n }\n\n if (!this.adapter) {\n console.warn('[ui-bridge-native] No server adapter configured. Call setAdapter() first.');\n console.warn('[ui-bridge-native] See documentation for supported adapters.');\n return;\n }\n\n await this.adapter.start(this.config.serverPort!, this.handleRequest.bind(this));\n this.running = true;\n\n console.log(`[ui-bridge-native] HTTP server started on port ${this.config.serverPort}`);\n }\n\n /**\n * Stop the HTTP server\n */\n async stop(): Promise<void> {\n if (!this.running || !this.adapter) {\n return;\n }\n\n await this.adapter.stop();\n this.running = false;\n\n console.log('[ui-bridge-native] HTTP server stopped');\n }\n\n /**\n * Check if server is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n // ── WebSocket Support ───────────────────────────────────────────────────\n\n private eventBridge?: WebSocketEventBridge;\n\n /**\n * Set the event bridge for WebSocket event broadcasting and subscriptions.\n */\n setEventBridge(bridge: WebSocketEventBridge): void {\n this.eventBridge = bridge;\n }\n\n /**\n * Handle a JSON-RPC message from a WebSocket client.\n * Parses the message, routes to the appropriate handler, and returns\n * a JSON string response (or null for events that need no response).\n */\n async handleWebSocketMessage(connId: string, rawMessage: string): Promise<string | null> {\n let msg: unknown;\n try {\n msg = JSON.parse(rawMessage);\n } catch {\n return JSON.stringify({\n error: 'Invalid JSON',\n timestamp: Date.now(),\n });\n }\n\n if (typeof msg !== 'object' || msg === null) {\n return JSON.stringify({\n error: 'Message must be a JSON object',\n timestamp: Date.now(),\n });\n }\n\n const message = msg as Record<string, unknown>;\n const id = (message.id as string | number | undefined) ?? 0;\n\n // Handle batch requests\n if (isBatchRequest(message)) {\n const results = await this.handleBatchRequest(message.batch);\n return JSON.stringify({ id, results });\n }\n\n // Handle subscribe\n if (isSubscribe(message)) {\n const events = message.params?.events || [];\n const throttleMs = message.params?.throttleMs;\n const ok = this.eventBridge?.handleSubscribe(connId, events, throttleMs) ?? false;\n return JSON.stringify({\n id,\n result: {\n success: ok,\n data: { subscribed: events },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Handle unsubscribe\n if (isUnsubscribe(message)) {\n const events = message.params?.events || [];\n const ok = this.eventBridge?.handleUnsubscribe(connId, events) ?? false;\n return JSON.stringify({\n id,\n result: {\n success: ok,\n data: { unsubscribed: events },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const method = message.method as string;\n const params = (message.params || {}) as Record<string, unknown>;\n\n // ── Connection-aware special methods ──────────────────────────────────\n\n // subscriptions/list — return current subscriptions + throttle for this connection\n if (method === 'subscriptions/list') {\n const events = this.eventBridge?.getSubscriptions(connId) ?? [];\n const throttleMs = this.eventBridge?.getThrottleMs(connId);\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: { events, throttleMs: throttleMs ?? null },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // waitForElement — resolve when element is registered, or timeout\n if (method === 'waitForElement') {\n return this.handleWaitForElement(connId, id, params);\n }\n\n // waitForCondition — resolve when an element state predicate becomes true\n if (method === 'waitForCondition') {\n return this.handleWaitForCondition(connId, id, params);\n }\n\n // sequence — execute steps in order, stop on first failure\n if (method === 'sequence') {\n return this.handleSequence(id, params);\n }\n\n // events/history — replay recent events matching optional filter\n if (method === 'events/history') {\n const eventsFilter = Array.isArray(params.events) ? (params.events as string[]) : undefined;\n const since = typeof params.since === 'number' ? params.since : undefined;\n const limit = typeof params.limit === 'number' ? params.limit : undefined;\n const history = this.eventBridge?.getHistory({ events: eventsFilter, since }) ?? [];\n const sliced =\n limit !== undefined && limit > 0 && history.length > limit\n ? history.slice(history.length - limit)\n : history;\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: { events: sliced },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Standard JSON-RPC request\n\n if (!method) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing \"method\" field',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n try {\n const apiResponse = await this.routeMethodToHandler(method, params);\n return JSON.stringify({ id, result: apiResponse } satisfies JsonRpcResponse);\n } catch (error) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: error instanceof Error ? error.message : 'Internal error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n }\n\n /**\n * Execute a batch of JSON-RPC requests concurrently.\n */\n async handleBatchRequest(batch: JsonRpcRequest[]): Promise<JsonRpcResponse[]> {\n return Promise.all(\n batch.map(async (req) => {\n try {\n const result = await this.routeMethodToHandler(\n req.method,\n (req.params || {}) as Record<string, unknown>\n );\n return { id: req.id, result } as JsonRpcResponse;\n } catch (error) {\n return {\n id: req.id,\n result: {\n success: false,\n error: error instanceof Error ? error.message : 'Internal error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse;\n }\n })\n );\n }\n\n /**\n * Register an in-flight waiter's cleanup thunk under the given connection.\n * Returns an `unregister` thunk that the natural-resolution path should\n * call so the cleanup isn't re-invoked on disconnect.\n */\n private registerWaiter(connId: string, cleanup: () => void): () => void {\n let set = this.pendingWaiters.get(connId);\n if (!set) {\n set = new Set();\n this.pendingWaiters.set(connId, set);\n }\n set.add(cleanup);\n return () => {\n const s = this.pendingWaiters.get(connId);\n if (!s) return;\n s.delete(cleanup);\n if (s.size === 0) this.pendingWaiters.delete(connId);\n };\n }\n\n /**\n * Abort all pending waiters associated with a connection. Called by the\n * provider's WS disconnect handler so timers/listeners don't leak after\n * the client goes away.\n */\n abortWaitersForConnection(connId: string): void {\n const set = this.pendingWaiters.get(connId);\n if (!set) return;\n for (const cleanup of set) {\n try {\n cleanup();\n } catch (err) {\n console.warn('[ui-bridge-native] waiter cleanup threw:', err);\n }\n }\n this.pendingWaiters.delete(connId);\n }\n\n /**\n * Wait for an element to be registered, or resolve immediately if it already exists.\n * Returns a JsonRpcResponse JSON string.\n */\n private async handleWaitForElement(\n connId: string,\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const targetId = params.id;\n const timeout = typeof params.timeout === 'number' ? params.timeout : 10000;\n\n if (!targetId || typeof targetId !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"id\" parameter',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Already registered — return immediately\n const existing = this.registry.getElement(targetId);\n if (existing) {\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: {\n id: targetId,\n state: existing.getState(),\n identifier: existing.getIdentifier(),\n waited: false,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Wait for element:registered event with matching id, or timeout\n return new Promise<string>((resolve) => {\n let settled = false;\n let unsub: (() => void) | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let unregister: (() => void) | null = null;\n\n const cleanup = () => {\n if (settled) return;\n settled = true;\n if (unsub) {\n unsub();\n unsub = null;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (unregister) {\n unregister();\n unregister = null;\n }\n };\n\n // Track this waiter so it can be aborted if the connection closes.\n unregister = this.registerWaiter(connId, () => {\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Connection closed before element was registered',\n code: 'CONNECTION_CLOSED',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n unsub = this.registry.on('element:registered', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n\n cleanup();\n const el = this.registry.getElement(targetId);\n resolve(\n JSON.stringify({\n id,\n result: {\n success: true,\n data: {\n id: targetId,\n state: el?.getState() ?? null,\n identifier: el?.getIdentifier() ?? null,\n waited: true,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n timer = setTimeout(() => {\n if (settled) return;\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: `Timeout waiting for element: ${targetId}`,\n code: 'TIMEOUT',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n }, timeout);\n });\n }\n\n /**\n * Wait for an arbitrary element-state predicate to become true.\n *\n * Supported `condition` shapes:\n * {field: \"mounted\"|\"visible\"|\"enabled\"|\"focused\", equals: boolean}\n * {field: \"layout\", exists: true}\n * {field: string, equals: unknown} // generic: state[field] === equals\n *\n * Resolves immediately with `waited:false` if the predicate already\n * holds. Otherwise subscribes to `element:registered` and\n * `element:stateChanged` until the predicate matches or timeout fires.\n */\n private async handleWaitForCondition(\n connId: string,\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const targetId = params.elementId;\n const condition = params.condition as\n | { field?: string; equals?: unknown; exists?: boolean }\n | undefined;\n const timeout = typeof params.timeout === 'number' ? params.timeout : 10000;\n\n if (!targetId || typeof targetId !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"elementId\" parameter',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n if (!condition || typeof condition.field !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"condition.field\"',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const evaluate = (state: Record<string, unknown> | null | undefined): boolean => {\n if (!state) return false;\n const value = state[condition.field as string];\n if (condition.exists === true) return value !== null && value !== undefined;\n if ('equals' in condition) return value === condition.equals;\n return false;\n };\n\n const makeResult = (state: Record<string, unknown> | null, waited: boolean) =>\n JSON.stringify({\n id,\n result: {\n success: true,\n data: { id: targetId, state, waited },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n\n // Fast path: already holds.\n const existing = this.registry.getElement(targetId);\n if (existing) {\n const state = existing.getState() as unknown as Record<string, unknown> | null;\n if (evaluate(state)) {\n return makeResult(state, false);\n }\n }\n\n return new Promise<string>((resolve) => {\n let settled = false;\n let unsubRegistered: (() => void) | null = null;\n let unsubStateChanged: (() => void) | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let unregister: (() => void) | null = null;\n\n const cleanup = () => {\n if (settled) return;\n settled = true;\n if (unsubRegistered) {\n unsubRegistered();\n unsubRegistered = null;\n }\n if (unsubStateChanged) {\n unsubStateChanged();\n unsubStateChanged = null;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (unregister) {\n unregister();\n unregister = null;\n }\n };\n\n unregister = this.registerWaiter(connId, () => {\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Connection closed before condition was met',\n code: 'CONNECTION_CLOSED',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n const checkAndResolve = () => {\n if (settled) return;\n const el = this.registry.getElement(targetId);\n if (!el) return;\n const state = el.getState() as unknown as Record<string, unknown> | null;\n if (evaluate(state)) {\n cleanup();\n resolve(makeResult(state, true));\n }\n };\n\n unsubRegistered = this.registry.on('element:registered', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n checkAndResolve();\n });\n\n unsubStateChanged = this.registry.on('element:stateChanged', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n checkAndResolve();\n });\n\n timer = setTimeout(() => {\n if (settled) return;\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: `Timeout waiting for condition on element: ${targetId}`,\n code: 'TIMEOUT',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n }, timeout);\n });\n }\n\n /**\n * Execute a sequence of JSON-RPC steps in order, stopping on first failure.\n * Returns a JsonRpcResponse JSON string with per-step results.\n */\n private async handleSequence(\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const rawSteps = params.steps;\n\n if (!Array.isArray(rawSteps) || rawSteps.length === 0) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or empty \"steps\" array',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const steps = rawSteps as Array<{ method: string; params?: Record<string, unknown> }>;\n const results: Array<{ step: number; method: string; result: APIResponse }> = [];\n let allSuccess = true;\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n\n if (!step || typeof step.method !== 'string') {\n results.push({\n step: i,\n method: String(step?.method ?? ''),\n result: {\n success: false,\n error: 'Step is missing \"method\" field',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n });\n allSuccess = false;\n break;\n }\n\n try {\n const stepResult = await this.routeMethodToHandler(step.method, step.params ?? {});\n results.push({ step: i, method: step.method, result: stepResult });\n if (!stepResult.success) {\n allSuccess = false;\n break;\n }\n } catch (err) {\n results.push({\n step: i,\n method: step.method,\n result: {\n success: false,\n error: err instanceof Error ? err.message : 'Step execution failed',\n code: 'STEP_FAILED',\n timestamp: Date.now(),\n },\n });\n allSuccess = false;\n break;\n }\n }\n\n return JSON.stringify({\n id,\n result: {\n success: allSuccess,\n data: {\n completedSteps: results.length,\n totalSteps: steps.length,\n results,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n /**\n * Route a JSON-RPC method string to the appropriate handler using path-style matching.\n *\n * Method strings mirror HTTP routes but without the /ui-bridge/ prefix.\n * Path params are extracted from :name placeholders in the route pattern.\n *\n * Examples:\n * \"health\" → handlers.health\n * \"control/snapshot\" → handlers.getSnapshot\n * \"control/element/tab-runs/action\" → handlers.executeAction ({id:'tab-runs'})\n * \"control/component/my-comp/action/submit\" → handlers.executeComponentAction\n */\n private async routeMethodToHandler(\n method: string,\n params: Record<string, unknown>\n ): Promise<APIResponse> {\n for (const route of WS_ROUTES) {\n const pathParams = parsePath(route.pattern, method);\n if (!pathParams) continue;\n\n const ctx: HandlerContext = {\n params: pathParams,\n query:\n params.query && typeof params.query === 'object'\n ? (params.query as Record<string, string>)\n : {},\n body: params,\n };\n\n return this.handlers[route.handler](ctx);\n }\n\n return {\n success: false,\n error: `Unknown method: ${method}`,\n code: 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n\n /**\n * Handle incoming HTTP request\n *\n * Exposed as public so that CloudRelayClient can call it directly (without\n * loopback TCP overhead) when processing tunneled requests.\n */\n async handleRequest(request: HTTPRequest): Promise<HTTPResponse> {\n // Add CORS headers if enabled\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.cors) {\n headers['Access-Control-Allow-Origin'] = this.config.allowedOrigins\n ? this.config.allowedOrigins.join(',')\n : '*';\n headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS';\n headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization';\n }\n\n // Handle CORS preflight\n if (request.method === 'OPTIONS') {\n return { status: 204, headers, body: '' };\n }\n\n try {\n const response = await this.routeRequest(request);\n return {\n status: response.success ? 200 : 400,\n headers,\n body: JSON.stringify(response),\n };\n } catch (error) {\n const errorResponse: APIResponse = {\n success: false,\n error: error instanceof Error ? error.message : 'Internal server error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n };\n return {\n status: 500,\n headers,\n body: JSON.stringify(errorResponse),\n };\n }\n }\n\n /**\n * Route an HTTP request to the appropriate handler using WS_ROUTES.\n *\n * Strips the `/ui-bridge/` prefix from the path, then iterates the shared\n * WS_ROUTES table. Each route's `pattern` is matched against the stripped\n * path via the module-level `parsePath` helper; path params are merged\n * with the request body into a HandlerContext.\n *\n * `httpMethods` disambiguates routes that share a pattern but differ\n * by verb (e.g. GET vs DELETE on `design/style-guide`). A route without\n * `httpMethods` is WS-only and will not be matched on HTTP.\n */\n private async routeRequest(request: HTTPRequest): Promise<APIResponse> {\n const { method, path, query, body } = request;\n\n const PREFIX = '/ui-bridge/';\n if (!path.startsWith(PREFIX)) {\n return {\n success: false,\n error: `Route not found: ${method} ${path}`,\n code: 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n\n const stripped = path.slice(PREFIX.length);\n\n // Discoverability:\n // - `_help` (rich) — routes + action reference + tips\n // - `_routes` (minimal) — runner-compatible shape for parity\n // Lets agents fetch a single URL on either runner or mobile to see what\n // they can do without reading docs.\n if (method === 'GET' && stripped === '_help') {\n return {\n success: true,\n data: buildHelpPayload(),\n timestamp: Date.now(),\n };\n }\n if (method === 'GET' && stripped === '_routes') {\n return {\n success: true,\n data: buildRoutesPayload(),\n timestamp: Date.now(),\n };\n }\n\n let patternMatchedButWrongVerb = false;\n\n for (const route of WS_ROUTES) {\n const pathParams = parsePath(route.pattern, stripped);\n if (!pathParams) continue;\n\n // Pattern matches — now filter on HTTP verb.\n if (!route.httpMethods) {\n // WS-only route; don't serve on HTTP.\n continue;\n }\n if (!route.httpMethods.includes(method as HttpVerb)) {\n patternMatchedButWrongVerb = true;\n continue;\n }\n\n const ctx: HandlerContext = { params: pathParams, query, body };\n return this.handlers[route.handler](ctx);\n }\n\n return {\n success: false,\n error: patternMatchedButWrongVerb\n ? `Method not allowed: ${method} ${path}`\n : `Route not found: ${method} ${path}`,\n code: patternMatchedButWrongVerb ? 'METHOD_NOT_ALLOWED' : 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Create a UI Bridge Native server\n */\nexport function createNativeServer(\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor,\n config?: NativeServerConfig\n): NativeUIBridgeServer {\n return new NativeUIBridgeServer(registry, executor, config);\n}\n\n/**\n * Example adapter using react-native-http-bridge\n *\n * To use this adapter:\n * 1. Install: npm install react-native-http-bridge\n * 2. Link native modules\n * 3. Create adapter and pass to server\n *\n * ```tsx\n * import httpBridge from 'react-native-http-bridge';\n *\n * const adapter: ServerAdapter = {\n * start: async (port, handler) => {\n * httpBridge.start(port, 'ui-bridge', async (request) => {\n * const response = await handler({\n * method: request.type,\n * path: request.url,\n * headers: request.headers || {},\n * query: parseQuery(request.url),\n * body: request.postData ? JSON.parse(request.postData) : undefined,\n * });\n * httpBridge.respond(\n * request.requestId,\n * response.status,\n * response.headers['Content-Type'],\n * response.body\n * );\n * });\n * },\n * stop: async () => {\n * httpBridge.stop();\n * },\n * isRunning: () => true,\n * };\n *\n * server.setAdapter(adapter);\n * await server.start();\n * ```\n */\n","/**\n * Pure-JS RFC 6455 WebSocket protocol implementation.\n *\n * Provides frame encoding/decoding and handshake utilities for running\n * a WebSocket server on react-native-tcp-socket without native crypto deps.\n */\n\n// ── Constants ───────────────────────────────────────────────────────────────\n\nconst WS_GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';\n\nexport const OPCODE_CONTINUATION = 0x00;\nexport const OPCODE_TEXT = 0x01;\nexport const OPCODE_BINARY = 0x02;\nexport const OPCODE_CLOSE = 0x08;\nexport const OPCODE_PING = 0x09;\nexport const OPCODE_PONG = 0x0a;\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface DecodedFrame {\n opcode: number;\n fin: boolean;\n payload: Uint8Array;\n masked: boolean;\n}\n\nexport interface DecodeResult {\n frames: DecodedFrame[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n remainder: Uint8Array<any>;\n}\n\n// ── SHA-1 (Pure JS) ─────────────────────────────────────────────────────────\n// Minimal inline SHA-1 per FIPS 180-4. Used only for the WS handshake.\n\nfunction sha1Bytes(input: Uint8Array): Uint8Array {\n const ml = input.length * 8;\n\n // Pre-processing: pad to 512-bit blocks\n const padLen = 64 - ((input.length + 9) % 64);\n const total = input.length + 1 + (padLen === 64 ? 0 : padLen) + 8;\n const msg = new Uint8Array(total);\n msg.set(input);\n msg[input.length] = 0x80;\n // Length in bits as 64-bit big-endian (we only use 32-bit since messages are small)\n const dv = new DataView(msg.buffer);\n dv.setUint32(total - 4, ml, false);\n\n // Initialize hash values\n let h0 = 0x67452301;\n let h1 = 0xefcdab89;\n let h2 = 0x98badcfe;\n let h3 = 0x10325476;\n let h4 = 0xc3d2e1f0;\n\n const w = new Uint32Array(80);\n\n for (let offset = 0; offset < total; offset += 64) {\n const block = new DataView(msg.buffer, offset, 64);\n\n for (let i = 0; i < 16; i++) {\n w[i] = block.getUint32(i * 4, false);\n }\n for (let i = 16; i < 80; i++) {\n const x = w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16];\n w[i] = (x << 1) | (x >>> 31);\n }\n\n let a = h0,\n b = h1,\n c = h2,\n d = h3,\n e = h4;\n\n for (let i = 0; i < 80; i++) {\n let f: number, k: number;\n if (i < 20) {\n f = (b & c) | (~b & d);\n k = 0x5a827999;\n } else if (i < 40) {\n f = b ^ c ^ d;\n k = 0x6ed9eba1;\n } else if (i < 60) {\n f = (b & c) | (b & d) | (c & d);\n k = 0x8f1bbcdc;\n } else {\n f = b ^ c ^ d;\n k = 0xca62c1d6;\n }\n\n const temp = (((a << 5) | (a >>> 27)) + f + e + k + w[i]) | 0;\n e = d;\n d = c;\n c = (b << 30) | (b >>> 2);\n b = a;\n a = temp;\n }\n\n h0 = (h0 + a) | 0;\n h1 = (h1 + b) | 0;\n h2 = (h2 + c) | 0;\n h3 = (h3 + d) | 0;\n h4 = (h4 + e) | 0;\n }\n\n const result = new Uint8Array(20);\n const rdv = new DataView(result.buffer);\n rdv.setUint32(0, h0, false);\n rdv.setUint32(4, h1, false);\n rdv.setUint32(8, h2, false);\n rdv.setUint32(12, h3, false);\n rdv.setUint32(16, h4, false);\n return result;\n}\n\nconst B64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n/**\n * Manual base64 encoder — avoids Hermes btoa() which can silently corrupt\n * binary strings containing bytes > 127 (common in SHA-1 output).\n */\nfunction bytesToBase64(bytes: Uint8Array): string {\n let result = '';\n const len = bytes.length;\n for (let i = 0; i < len; i += 3) {\n const b0 = bytes[i];\n const b1 = i + 1 < len ? bytes[i + 1] : 0;\n const b2 = i + 2 < len ? bytes[i + 2] : 0;\n const triplet = (b0 << 16) | (b1 << 8) | b2;\n\n result += B64_CHARS[(triplet >> 18) & 0x3f];\n result += B64_CHARS[(triplet >> 12) & 0x3f];\n result += i + 1 < len ? B64_CHARS[(triplet >> 6) & 0x3f] : '=';\n result += i + 2 < len ? B64_CHARS[triplet & 0x3f] : '=';\n }\n return result;\n}\n\n// ── Handshake ───────────────────────────────────────────────────────────────\n\n/**\n * Compute the Sec-WebSocket-Accept value from the client's Sec-WebSocket-Key.\n */\nexport function computeAcceptKey(clientKey: string): string {\n const input = clientKey + WS_GUID;\n const encoder = new TextEncoder();\n const hash = sha1Bytes(encoder.encode(input));\n return bytesToBase64(hash);\n}\n\n/**\n * Build the HTTP 101 Switching Protocols response for a WebSocket upgrade.\n */\nexport function buildUpgradeResponse(clientKey: string): string {\n const accept = computeAcceptKey(clientKey);\n return (\n 'HTTP/1.1 101 Switching Protocols\\r\\n' +\n 'Upgrade: websocket\\r\\n' +\n 'Connection: Upgrade\\r\\n' +\n `Sec-WebSocket-Accept: ${accept}\\r\\n` +\n '\\r\\n'\n );\n}\n\n// ── Frame Encoding (Server → Client, unmasked) ─────────────────────────────\n\nfunction encodeFrame(opcode: number, payload: Uint8Array): Uint8Array {\n const len = payload.length;\n let headerLen: number;\n\n if (len < 126) {\n headerLen = 2;\n } else if (len < 65536) {\n headerLen = 4;\n } else {\n headerLen = 10;\n }\n\n const frame = new Uint8Array(headerLen + len);\n frame[0] = 0x80 | opcode; // FIN + opcode\n\n if (len < 126) {\n frame[1] = len; // No mask bit (server → client)\n } else if (len < 65536) {\n frame[1] = 126;\n frame[2] = (len >> 8) & 0xff;\n frame[3] = len & 0xff;\n } else {\n frame[1] = 127;\n // For payloads > 65535, use 8-byte length (upper 4 bytes zero for practical sizes)\n const dv = new DataView(frame.buffer, 2, 8);\n dv.setUint32(0, 0, false);\n dv.setUint32(4, len, false);\n }\n\n frame.set(payload, headerLen);\n return frame;\n}\n\n/** Encode a text message as a WebSocket frame. */\nexport function encodeTextFrame(text: string): Uint8Array {\n const payload = new TextEncoder().encode(text);\n return encodeFrame(OPCODE_TEXT, payload);\n}\n\n/** Encode a PING frame with optional payload. */\nexport function encodePingFrame(payload?: Uint8Array): Uint8Array {\n return encodeFrame(OPCODE_PING, payload ?? new Uint8Array(0));\n}\n\n/** Encode a PONG frame with the payload from the PING. */\nexport function encodePongFrame(payload: Uint8Array): Uint8Array {\n return encodeFrame(OPCODE_PONG, payload);\n}\n\n/** Encode a CLOSE frame with optional status code and reason. */\nexport function encodeCloseFrame(code?: number, reason?: string): Uint8Array {\n if (code === undefined) {\n return encodeFrame(OPCODE_CLOSE, new Uint8Array(0));\n }\n const reasonBytes = reason ? new TextEncoder().encode(reason) : new Uint8Array(0);\n const payload = new Uint8Array(2 + reasonBytes.length);\n payload[0] = (code >> 8) & 0xff;\n payload[1] = code & 0xff;\n payload.set(reasonBytes, 2);\n return encodeFrame(OPCODE_CLOSE, payload);\n}\n\n// ── Frame Decoding (Client → Server, masked) ───────────────────────────────\n\n/**\n * Decode one or more WebSocket frames from a byte buffer.\n * Returns decoded frames and any unconsumed bytes (for partial frames).\n */\nexport function decodeFrames(buffer: Uint8Array): DecodeResult {\n const frames: DecodedFrame[] = [];\n let offset = 0;\n\n while (offset < buffer.length) {\n // Need at least 2 bytes for the header\n if (buffer.length - offset < 2) break;\n\n const byte0 = buffer[offset];\n const byte1 = buffer[offset + 1];\n\n const fin = (byte0 & 0x80) !== 0;\n const opcode = byte0 & 0x0f;\n const masked = (byte1 & 0x80) !== 0;\n let payloadLen = byte1 & 0x7f;\n\n let headerLen = 2;\n\n if (payloadLen === 126) {\n if (buffer.length - offset < 4) break;\n payloadLen = (buffer[offset + 2] << 8) | buffer[offset + 3];\n headerLen = 4;\n } else if (payloadLen === 127) {\n if (buffer.length - offset < 10) break;\n const dv = new DataView(buffer.buffer, buffer.byteOffset + offset + 2, 8);\n payloadLen = dv.getUint32(4, false); // Use lower 32 bits only\n headerLen = 10;\n }\n\n if (masked) {\n headerLen += 4; // 4-byte masking key\n }\n\n const totalLen = headerLen + payloadLen;\n if (buffer.length - offset < totalLen) break; // Partial frame\n\n // Extract and unmask payload\n const payload = new Uint8Array(payloadLen);\n const dataStart = offset + headerLen;\n\n if (masked) {\n const maskOffset = offset + headerLen - 4;\n const mask = buffer.slice(maskOffset, maskOffset + 4);\n for (let i = 0; i < payloadLen; i++) {\n payload[i] = buffer[dataStart + i] ^ mask[i % 4];\n }\n } else {\n payload.set(buffer.slice(dataStart, dataStart + payloadLen));\n }\n\n frames.push({ opcode, fin, payload, masked });\n offset += totalLen;\n }\n\n return {\n frames,\n remainder: new Uint8Array(buffer.slice(offset)),\n };\n}\n\n/**\n * Decode a text payload from a Uint8Array.\n */\nexport function decodeTextPayload(payload: Uint8Array): string {\n return new TextDecoder().decode(payload);\n}\n","/**\n * Bridges NativeUIBridgeRegistry events to WebSocket clients.\n *\n * Subscribes to all registry event types and broadcasts them as\n * JsonRpcEvent messages to connected WebSocket clients based on\n * their per-connection subscription sets.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { BridgeEventType, BridgeEvent } from '../core/types';\nimport type { WebSocketConnection } from './ws-connection';\nimport type { JsonRpcEvent } from './ws-types';\n\n/** All event types the bridge can subscribe to */\nconst BRIDGE_EVENT_TYPES: BridgeEventType[] = [\n 'element:registered',\n 'element:unregistered',\n 'element:stateChanged',\n 'component:registered',\n 'component:unregistered',\n 'action:started',\n 'action:completed',\n 'action:failed',\n 'workflow:started',\n 'workflow:stepCompleted',\n 'workflow:completed',\n 'workflow:failed',\n 'render:snapshot',\n 'error',\n];\n\n/** Per-connection throttle state for batching rapid events */\ninterface ThrottleState {\n ms: number;\n pending: JsonRpcEvent[];\n timer: ReturnType<typeof setTimeout> | null;\n}\n\n// ── Glob pattern matching ───────────────────────────────────────────────────\n\n/** Cache of compiled glob→RegExp to avoid recompiling hot patterns. */\nconst GLOB_CACHE = new Map<string, RegExp>();\n\n/**\n * Convert a glob-style pattern (supports `*` / `**` wildcards) to a RegExp.\n * All other regex metacharacters are escaped, so colons and other\n * event-name characters pass through literally.\n *\n * globToRegex(\"*\") → /^.*$/\n * globToRegex(\"element:*\") → /^element:.*$/\n * globToRegex(\"*:stateChanged\") → /^.*:stateChanged$/\n */\nexport function globToRegex(pattern: string): RegExp {\n const cached = GLOB_CACHE.get(pattern);\n if (cached) return cached;\n\n // Normalize ** → * (same semantics for flat event names)\n const normalized = pattern.replace(/\\*\\*/g, '*');\n // Escape regex metacharacters except '*'\n const escaped = normalized.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\n // Replace '*' with '.*'\n const body = escaped.replace(/\\*/g, '.*');\n const regex = new RegExp(`^${body}$`);\n GLOB_CACHE.set(pattern, regex);\n return regex;\n}\n\n/** Options for the WebSocketEventBridge constructor. */\nexport interface WebSocketEventBridgeOptions {\n /** Heartbeat ping interval in ms (default 30000) */\n heartbeatIntervalMs?: number;\n /** Max number of events to retain in the replay history buffer (default 100, 0 disables) */\n maxHistory?: number;\n}\n\nexport class WebSocketEventBridge {\n private connections = new Map<string, WebSocketConnection>();\n private throttles = new Map<string, ThrottleState>();\n private unsubscribers: Array<() => void> = [];\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private registry: NativeUIBridgeRegistry;\n private heartbeatIntervalMs: number;\n /**\n * True ring buffer for event replay history.\n *\n * `historyBuf` is a fixed-capacity slot array; `historyHead` points at the\n * NEXT write position; `historyCount` is the number of valid slots\n * (clamped to capacity). Append is O(1) — no array shifting.\n */\n private historyBuf: (JsonRpcEvent | undefined)[] = [];\n private historyHead = 0;\n private historyCount = 0;\n\n constructor(\n registry: NativeUIBridgeRegistry,\n optionsOrHeartbeatMs: WebSocketEventBridgeOptions | number = {}\n ) {\n this.registry = registry;\n // Accept legacy positional number form\n const opts: WebSocketEventBridgeOptions =\n typeof optionsOrHeartbeatMs === 'number'\n ? { heartbeatIntervalMs: optionsOrHeartbeatMs }\n : optionsOrHeartbeatMs;\n this.heartbeatIntervalMs = opts.heartbeatIntervalMs ?? 30000;\n const cap = Math.max(0, (opts.maxHistory ?? 100) | 0);\n this.historyBuf = cap > 0 ? new Array(cap) : [];\n }\n\n /** Effective ring buffer capacity. 0 means history is disabled. */\n private get historyCapacity(): number {\n return this.historyBuf.length;\n }\n\n /**\n * Start listening to registry events and broadcasting to WS clients.\n * Also starts the heartbeat timer.\n */\n start(): void {\n for (const eventType of BRIDGE_EVENT_TYPES) {\n const unsub = this.registry.on(eventType, (event: BridgeEvent) => {\n this.broadcastEvent(eventType, event.data);\n });\n this.unsubscribers.push(unsub);\n }\n\n this.startHeartbeat();\n }\n\n /** Stop listening to registry events and clear connections. */\n stop(): void {\n for (const unsub of this.unsubscribers) {\n unsub();\n }\n this.unsubscribers = [];\n\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n // Clean up throttle timers\n for (const throttle of this.throttles.values()) {\n if (throttle.timer) clearTimeout(throttle.timer);\n }\n this.throttles.clear();\n\n // Close all connections\n for (const conn of this.connections.values()) {\n conn.close(1001, 'Server shutting down');\n }\n this.connections.clear();\n this.historyBuf.fill(undefined);\n this.historyHead = 0;\n this.historyCount = 0;\n }\n\n /** Register a new WebSocket connection. */\n addConnection(conn: WebSocketConnection): void {\n this.connections.set(conn.id, conn);\n }\n\n /** Remove a WebSocket connection (called on disconnect). */\n removeConnection(connId: string): void {\n this.connections.delete(connId);\n const throttle = this.throttles.get(connId);\n if (throttle?.timer) clearTimeout(throttle.timer);\n this.throttles.delete(connId);\n }\n\n /** Get the number of active connections. */\n get connectionCount(): number {\n return this.connections.size;\n }\n\n /**\n * Add event subscriptions for a connection.\n *\n * Event names are stored as glob patterns. Supported forms:\n * - Exact: \"element:registered\"\n * - Prefix: \"element:*\"\n * - Suffix: \"*:stateChanged\"\n * - All: \"*\"\n *\n * @param throttleMs — if >0, batch rapid events within this window before sending\n */\n handleSubscribe(connId: string, events: string[], throttleMs?: number): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n for (const event of events) {\n conn.subscriptions.add(event);\n }\n if (throttleMs && throttleMs > 0) {\n this.throttles.set(connId, { ms: throttleMs, pending: [], timer: null });\n }\n return true;\n }\n\n /**\n * Remove event subscriptions for a connection.\n * If all subscriptions are cleared, also drops the throttle entry\n * (and any pending flush timer) so a subsequent resubscribe starts clean.\n */\n handleUnsubscribe(connId: string, events: string[]): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n for (const event of events) {\n conn.subscriptions.delete(event);\n }\n if (conn.subscriptions.size === 0) {\n const throttle = this.throttles.get(connId);\n if (throttle?.timer) clearTimeout(throttle.timer);\n this.throttles.delete(connId);\n }\n return true;\n }\n\n /**\n * Get the subscription set for a connection.\n * Returns the original pattern strings (not compiled regexes).\n */\n getSubscriptions(connId: string): string[] {\n const conn = this.connections.get(connId);\n return conn ? Array.from(conn.subscriptions) : [];\n }\n\n /**\n * Check if a connection is subscribed to a specific event.\n * Matches exact names first (fast path), then tests each stored\n * pattern as a glob against the event type.\n */\n isSubscribed(connId: string, eventType: string): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n // Fast path: exact match\n if (conn.subscriptions.has(eventType)) return true;\n // Glob path: test each pattern\n for (const pattern of conn.subscriptions) {\n // Skip exact names with no wildcard — already tested above\n if (!pattern.includes('*')) continue;\n if (globToRegex(pattern).test(eventType)) return true;\n }\n return false;\n }\n\n /** Get the throttle window (in ms) configured for a connection, or undefined if none. */\n getThrottleMs(connId: string): number | undefined {\n return this.throttles.get(connId)?.ms;\n }\n\n /**\n * Get recent events from the replay history buffer.\n *\n * @param filter.events — optional list of glob patterns to match event types against\n * @param filter.since — optional timestamp (ms); only events at or after this time\n */\n getHistory(filter?: { events?: string[]; since?: number }): JsonRpcEvent[] {\n const cap = this.historyCapacity;\n if (cap === 0 || this.historyCount === 0) return [];\n\n const since = filter?.since;\n const regexes = filter?.events?.map((p) => globToRegex(p));\n\n // Walk the ring buffer in chronological (oldest → newest) order.\n const start = (this.historyHead - this.historyCount + cap) % cap;\n const out: JsonRpcEvent[] = [];\n for (let i = 0; i < this.historyCount; i++) {\n const e = this.historyBuf[(start + i) % cap];\n if (!e) continue;\n if (since !== undefined && e.timestamp < since) continue;\n if (regexes && regexes.length > 0 && !regexes.some((r) => r.test(e.event))) continue;\n out.push(e);\n }\n return out;\n }\n\n /**\n * Configure the max history buffer size at runtime. 0 disables history.\n * Reallocates the ring buffer, preserving the most recent\n * min(historyCount, newCapacity) events in chronological order.\n */\n setMaxHistory(maxHistory: number): void {\n const newCap = Math.max(0, maxHistory | 0);\n if (newCap === this.historyCapacity) return;\n\n if (newCap === 0) {\n this.historyBuf = [];\n this.historyHead = 0;\n this.historyCount = 0;\n return;\n }\n\n // Preserve the latest min(count, newCap) events.\n const oldCap = this.historyCapacity;\n const keep = Math.min(this.historyCount, newCap);\n const newBuf: (JsonRpcEvent | undefined)[] = new Array(newCap);\n if (keep > 0 && oldCap > 0) {\n // Source range: the last `keep` events ending just before historyHead.\n const start = (this.historyHead - keep + oldCap) % oldCap;\n for (let i = 0; i < keep; i++) {\n newBuf[i] = this.historyBuf[(start + i) % oldCap];\n }\n }\n this.historyBuf = newBuf;\n this.historyCount = keep;\n this.historyHead = keep % newCap;\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n private broadcastEvent(eventType: string, data: unknown): void {\n const event: JsonRpcEvent = {\n event: eventType,\n data,\n timestamp: Date.now(),\n };\n\n // Append to ring buffer — O(1), no shifting.\n const cap = this.historyCapacity;\n if (cap > 0) {\n this.historyBuf[this.historyHead] = event;\n this.historyHead = (this.historyHead + 1) % cap;\n if (this.historyCount < cap) this.historyCount++;\n }\n\n for (const [connId, conn] of this.connections) {\n const throttle = this.throttles.get(connId);\n if (throttle) {\n this.enqueueThrottled(connId, conn, throttle, event);\n } else {\n conn.sendEvent(event);\n }\n }\n }\n\n /** Queue an event for throttled delivery, flushing after the throttle window. */\n private enqueueThrottled(\n connId: string,\n conn: WebSocketConnection,\n throttle: ThrottleState,\n event: JsonRpcEvent\n ): void {\n throttle.pending.push(event);\n if (throttle.timer) return; // Flush already scheduled\n\n throttle.timer = setTimeout(() => {\n const events = throttle.pending.splice(0);\n throttle.timer = null;\n // Verify connection still exists\n if (!this.connections.has(connId)) return;\n for (const e of events) {\n conn.sendEvent(e);\n }\n }, throttle.ms);\n }\n\n private startHeartbeat(): void {\n this.heartbeatTimer = setInterval(() => {\n for (const [id, conn] of this.connections) {\n if (!conn.isOpen) {\n this.connections.delete(id);\n continue;\n }\n\n if (!conn.alive) {\n // Missed previous ping — connection is dead\n console.warn(`[ws-event-bridge] Connection ${id} missed heartbeat, closing`);\n conn.close(1001, 'Heartbeat timeout');\n this.connections.delete(id);\n continue;\n }\n\n // Mark as not-alive, send ping. If pong arrives, alive is set back to true.\n conn.alive = false;\n conn.ping();\n }\n }, this.heartbeatIntervalMs);\n }\n}\n","/**\n * WebSocket connection wrapper for the UI Bridge server.\n *\n * Manages a single WebSocket connection after the HTTP upgrade handshake,\n * handling frame-level I/O, heartbeat, and event subscriptions.\n */\n\nimport {\n decodeFrames,\n decodeTextPayload,\n encodeTextFrame,\n encodePingFrame,\n encodePongFrame,\n encodeCloseFrame,\n OPCODE_TEXT,\n OPCODE_CLOSE,\n OPCODE_PING,\n OPCODE_PONG,\n OPCODE_CONTINUATION,\n type DecodedFrame,\n} from './ws-protocol';\nimport type { JsonRpcEvent } from './ws-types';\nimport { globToRegex } from './ws-event-bridge';\n\n/**\n * Callback for text messages received from the client.\n * Returns a response string to send back, or null for no response.\n */\nexport type WebSocketMessageHandler = (connId: string, message: string) => Promise<string | null>;\n\nexport class WebSocketConnection {\n readonly id: string;\n readonly subscriptions = new Set<string>();\n\n /** Heartbeat liveness flag — set false before ping, set true on pong */\n alive = true;\n\n private socket: {\n write: (data: Uint8Array | string, encoding?: string, cb?: () => void) => void;\n destroy: () => void;\n on: (event: string, handler: (...args: unknown[]) => void) => void;\n removeAllListeners: (event?: string) => void;\n setNoDelay?: (noDelay: boolean) => void;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private buffer: Uint8Array<any> = new Uint8Array(0);\n private fragmentBuffer: Uint8Array[] = [];\n private fragmentOpcode = 0;\n private closed = false;\n private onMessage: WebSocketMessageHandler;\n private onClose: (connId: string) => void;\n\n constructor(\n id: string,\n socket: WebSocketConnection['socket'],\n onMessage: WebSocketMessageHandler,\n onClose: (connId: string) => void\n ) {\n this.id = id;\n this.socket = socket;\n this.onMessage = onMessage;\n this.onClose = onClose;\n\n // Disable Nagle's algorithm for low latency\n if (socket.setNoDelay) {\n socket.setNoDelay(true);\n }\n\n // Wire up data handler\n socket.on('data', (data: unknown) => {\n if (this.closed) return;\n const chunk =\n data instanceof Uint8Array\n ? data\n : typeof data === 'string'\n ? new TextEncoder().encode(data)\n : new Uint8Array(data as ArrayBuffer);\n this.handleData(chunk);\n });\n\n socket.on('error', () => {\n this.destroy();\n });\n\n socket.on('close', () => {\n this.destroy();\n });\n }\n\n /** Send a text message to the client. */\n send(message: string): void {\n if (this.closed) return;\n try {\n const frame = encodeTextFrame(message);\n this.writeRaw(frame);\n } catch {\n // Socket may be closed\n }\n }\n\n /**\n * Send an event if the client is subscribed to it. Subscription patterns\n * may be exact event names, `*` (all), or glob patterns containing `*`\n * (e.g. `element:*`, `*:stateChanged`). Exact matches and `*` are checked\n * via fast Set lookups; glob patterns fall through to a regex test.\n */\n sendEvent(event: JsonRpcEvent): void {\n if (this.closed) return;\n if (!this.matchesSubscription(event.event)) return;\n this.send(JSON.stringify(event));\n }\n\n private matchesSubscription(eventType: string): boolean {\n // Fast paths\n if (this.subscriptions.has(eventType)) return true;\n if (this.subscriptions.has('*')) return true;\n // Glob fallback — only patterns containing `*` (other than the bare `*`\n // already handled above) need the regex test.\n for (const pattern of this.subscriptions) {\n if (!pattern.includes('*')) continue;\n if (globToRegex(pattern).test(eventType)) return true;\n }\n return false;\n }\n\n /** Send a ping frame for heartbeat. */\n ping(): void {\n if (this.closed) return;\n try {\n this.writeRaw(encodePingFrame());\n } catch {\n // Socket may be closed\n }\n }\n\n /** Close the connection gracefully. */\n close(code = 1000, reason = ''): void {\n if (this.closed) return;\n this.closed = true;\n try {\n this.writeRaw(encodeCloseFrame(code, reason));\n // Give the frame time to flush before destroying\n setTimeout(() => this.socket.destroy(), 100);\n } catch {\n this.socket.destroy();\n }\n this.onClose(this.id);\n }\n\n /** Forcefully destroy the connection without a close frame. */\n destroy(): void {\n if (this.closed) return;\n this.closed = true;\n try {\n this.socket.destroy();\n } catch {\n // Already destroyed\n }\n this.onClose(this.id);\n }\n\n /** Whether the connection is still open. */\n get isOpen(): boolean {\n return !this.closed;\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n private writeRaw(data: Uint8Array): void {\n // react-native-tcp-socket write() accepts Buffer/Uint8Array/string.\n // Convert to binary string for compatibility with all socket implementations.\n // Use chunked String.fromCharCode to avoid call-stack limits on large payloads\n // while staying O(n) instead of O(n^2) from single-char concatenation.\n const CHUNK = 8192;\n const parts: string[] = [];\n for (let i = 0; i < data.length; i += CHUNK) {\n const end = Math.min(i + CHUNK, data.length);\n parts.push(String.fromCharCode.apply(null, data.subarray(i, end) as unknown as number[]));\n }\n this.socket.write(parts.join(''), 'binary');\n }\n\n private handleData(chunk: Uint8Array): void {\n // Append to buffer\n const newBuffer = new Uint8Array(this.buffer.length + chunk.length);\n newBuffer.set(this.buffer);\n newBuffer.set(chunk, this.buffer.length);\n this.buffer = newBuffer;\n\n // Decode frames\n const { frames, remainder } = decodeFrames(this.buffer);\n this.buffer = remainder;\n\n for (const frame of frames) {\n this.handleFrame(frame);\n }\n }\n\n private handleFrame(frame: DecodedFrame): void {\n // Handle fragmented messages\n if (!frame.fin && frame.opcode !== OPCODE_CONTINUATION) {\n // Start of fragmented message\n this.fragmentBuffer = [frame.payload];\n this.fragmentOpcode = frame.opcode;\n return;\n }\n\n if (frame.opcode === OPCODE_CONTINUATION) {\n this.fragmentBuffer.push(frame.payload);\n if (!frame.fin) return; // More fragments coming\n\n // Reassemble\n const totalLen = this.fragmentBuffer.reduce((sum, buf) => sum + buf.length, 0);\n const reassembled = new Uint8Array(totalLen);\n let offset = 0;\n for (const buf of this.fragmentBuffer) {\n reassembled.set(buf, offset);\n offset += buf.length;\n }\n this.fragmentBuffer = [];\n\n // Process as the original opcode\n this.handleFrame({\n opcode: this.fragmentOpcode,\n fin: true,\n payload: reassembled,\n masked: true,\n });\n return;\n }\n\n switch (frame.opcode) {\n case OPCODE_TEXT: {\n const text = decodeTextPayload(frame.payload);\n this.onMessage(this.id, text)\n .then((response) => {\n if (response !== null) {\n this.send(response);\n }\n })\n .catch((err) => {\n console.warn(`[ws-connection] message handler error:`, err);\n this.send(\n JSON.stringify({\n error: 'Internal error',\n timestamp: Date.now(),\n })\n );\n });\n break;\n }\n\n case OPCODE_PING:\n // Respond with PONG carrying the same payload\n try {\n this.writeRaw(encodePongFrame(frame.payload));\n } catch {\n // Socket may be closed\n }\n break;\n\n case OPCODE_PONG:\n this.alive = true;\n break;\n\n case OPCODE_CLOSE:\n this.close();\n break;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/server/types.ts","../../src/core/registry.ts","../../src/design/design-inspector-native.ts","../../src/server/design-handlers.ts","../../src/server/handlers.ts","../../src/server/ws-types.ts","../../src/server/http-server.ts","../../src/server/ws-protocol.ts","../../src/server/ws-event-bridge.ts","../../src/server/ws-connection.ts"],"names":["success","error"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * UI Bridge Native Server Types\n *\n * Types for the embedded HTTP server.\n */\n\nimport type {\n NativeUIBridgeConfig,\n NativeActionResponse,\n NativeFindResponse,\n NativeBridgeSnapshot,\n} from '../core/types';\nimport type { ComponentActionResponse, PageNavigationResponse } from '../control/types';\nimport type { ElementDesignData, StateStyles, ResponsiveSnapshot } from '../design/design-types';\n\n/**\n * Navigation provider for React Native apps.\n *\n * Apps supply this to enable programmatic navigation via the UI Bridge\n * (e.g., `control/page/navigate` and `control/page/back`).\n * For Expo Router: pass `router.push` and `router.back`.\n */\nexport interface NavigationProvider {\n navigate: (url: string) => void;\n back?: () => void;\n /** Replace current route (no back-stack entry). For Expo Router: router.replace */\n replace?: (url: string) => void;\n /** Refresh the current route. For Expo Router: router.replace(currentPath) */\n refresh?: () => void;\n}\n\n/**\n * Screenshot provider for React Native apps.\n *\n * Apps supply this to enable screen capture via the UI Bridge\n * (`control/screenshot`). For react-native-view-shot: pass a function\n * that calls `captureRef` on the root view and returns base64 PNG data.\n */\nexport interface ScreenshotProvider {\n /** Capture the current screen and return base64-encoded PNG data (no data: prefix). */\n capture: () => Promise<{ base64: string; width: number; height: number }>;\n}\n\n/**\n * Route provider for React Native apps.\n *\n * Apps supply this to expose the current navigation route in UI Bridge snapshots.\n * For Expo Router: render a RouteTracker component inside the router context that\n * calls `usePathname()` / `useSegments()` and writes the result to a module-level ref.\n */\nexport interface RouteProvider {\n /** Return the current route path (e.g. \"/(tabs)/runs\"), or null if unknown. */\n getCurrentRoute: () => string | null;\n /** Return the current route segments (e.g. [\"(tabs)\", \"runs\"]), if available. */\n getSegments?: () => string[];\n /**\n * Subscribe to route changes. Required so the UI Bridge can clear stale\n * layouts on route changes with zero lag.\n *\n * Implementers must invoke `listener` synchronously whenever the route\n * changes, passing the new route (or null if unknown). The returned function\n * must unsubscribe the listener.\n *\n * For Expo Router: wrap your RouteTracker component in a module-level\n * listener set and call each listener from within the tracker's effect.\n */\n subscribe: (listener: (route: string | null) => void) => () => void;\n}\n\n/**\n * Server configuration\n */\nexport interface NativeServerConfig extends NativeUIBridgeConfig {\n /** Enable CORS */\n cors?: boolean;\n /** Allowed origins for CORS */\n allowedOrigins?: string[];\n}\n\n/**\n * Route definition\n */\nexport interface RouteDefinition {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n description: string;\n}\n\n/**\n * All UI Bridge Native routes\n */\nexport const UI_BRIDGE_NATIVE_ROUTES: Record<string, RouteDefinition> = {\n // Control - Elements\n GET_ELEMENTS: {\n method: 'GET',\n path: '/ui-bridge/control/elements',\n description: 'List all registered elements',\n },\n GET_ELEMENT: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id',\n description: 'Get element details',\n },\n GET_ELEMENT_STATE: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id/state',\n description: 'Get element state',\n },\n EXECUTE_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/element/:id/action',\n description: 'Execute action on element',\n },\n\n // Control - Components\n GET_COMPONENTS: {\n method: 'GET',\n path: '/ui-bridge/control/components',\n description: 'List all registered components',\n },\n GET_COMPONENT: {\n method: 'GET',\n path: '/ui-bridge/control/component/:id',\n description: 'Get component details',\n },\n EXECUTE_COMPONENT_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/component/:id/action/:actionId',\n description: 'Execute component action',\n },\n\n // Discovery\n FIND: {\n method: 'POST',\n path: '/ui-bridge/control/find',\n description: 'Find elements matching criteria',\n },\n GET_SNAPSHOT: {\n method: 'GET',\n path: '/ui-bridge/control/snapshot',\n description: 'Get full bridge snapshot',\n },\n\n // Workflows\n GET_WORKFLOWS: {\n method: 'GET',\n path: '/ui-bridge/control/workflows',\n description: 'List all workflows',\n },\n RUN_WORKFLOW: {\n method: 'POST',\n path: '/ui-bridge/control/workflow/:id/run',\n description: 'Run a workflow',\n },\n\n // Page Navigation\n PAGE_REFRESH: {\n method: 'POST',\n path: '/ui-bridge/control/page/refresh',\n description: 'Refresh the current page',\n },\n PAGE_NAVIGATE: {\n method: 'POST',\n path: '/ui-bridge/control/page/navigate',\n description: 'Navigate to a URL',\n },\n PAGE_REPLACE: {\n method: 'POST',\n path: '/ui-bridge/control/page/replace',\n description: 'Replace current route without adding to back stack',\n },\n PAGE_GO_BACK: {\n method: 'POST',\n path: '/ui-bridge/control/page/back',\n description: 'Go back in navigation history',\n },\n PAGE_GO_FORWARD: {\n method: 'POST',\n path: '/ui-bridge/control/page/forward',\n description: 'Go forward in navigation history',\n },\n\n // Design Review\n DESIGN_ELEMENT_STYLES: {\n method: 'GET',\n path: '/ui-bridge/design/element/:id/styles',\n description: 'Get computed styles for an element',\n },\n DESIGN_ELEMENT_STATE_STYLES: {\n method: 'POST',\n path: '/ui-bridge/design/element/:id/state-styles',\n description: 'Get state-specific styles for an element',\n },\n DESIGN_SNAPSHOT: {\n method: 'POST',\n path: '/ui-bridge/design/snapshot',\n description: 'Get design data for all or selected elements',\n },\n DESIGN_RESPONSIVE: {\n method: 'POST',\n path: '/ui-bridge/design/responsive',\n description: 'Get responsive snapshots (current device only on native)',\n },\n DESIGN_AUDIT: {\n method: 'POST',\n path: '/ui-bridge/design/audit',\n description: 'Run style guide audit on elements',\n },\n DESIGN_STYLE_GUIDE_LOAD: {\n method: 'POST',\n path: '/ui-bridge/design/style-guide/load',\n description: 'Load a style guide for audit',\n },\n DESIGN_STYLE_GUIDE_GET: {\n method: 'GET',\n path: '/ui-bridge/design/style-guide',\n description: 'Get currently loaded style guide',\n },\n DESIGN_STYLE_GUIDE_CLEAR: {\n method: 'DELETE',\n path: '/ui-bridge/design/style-guide',\n description: 'Clear loaded style guide',\n },\n\n // Health\n HEALTH: {\n method: 'GET',\n path: '/ui-bridge/health',\n description: 'Health check',\n },\n};\n\n/**\n * API response wrapper\n */\nexport interface APIResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n code?: string;\n timestamp: number;\n}\n\n/**\n * Handler context\n */\nexport interface HandlerContext {\n params: Record<string, string>;\n query: Record<string, string>;\n body: unknown;\n}\n\n/**\n * Handler function type\n */\nexport type HandlerFunction<T = unknown> = (context: HandlerContext) => Promise<APIResponse<T>>;\n\n/**\n * Server handlers interface\n */\nexport interface NativeServerHandlers {\n // Elements\n getElements: HandlerFunction<{ elements: unknown[] }>;\n getElement: HandlerFunction<{ element: unknown }>;\n getElementState: HandlerFunction<{ state: unknown }>;\n executeAction: HandlerFunction<NativeActionResponse>;\n\n // Components\n getComponents: HandlerFunction<{ components: unknown[] }>;\n getComponent: HandlerFunction<{ component: unknown }>;\n executeComponentAction: HandlerFunction<ComponentActionResponse>;\n\n // Discovery\n find: HandlerFunction<NativeFindResponse>;\n getSnapshot: HandlerFunction<NativeBridgeSnapshot>;\n\n // Workflows\n getWorkflows: HandlerFunction<{ workflows: unknown[] }>;\n runWorkflow: HandlerFunction<{\n runId: string;\n status: string;\n steps: Array<{\n stepId: string;\n type: string;\n status: string;\n result?: unknown;\n error?: string;\n durationMs: number;\n }>;\n totalSteps: number;\n completedSteps: number;\n failedSteps: number;\n skippedSteps: number;\n durationMs: number;\n }>;\n\n // Page Navigation\n pageRefresh: HandlerFunction<PageNavigationResponse>;\n pageNavigate: HandlerFunction<PageNavigationResponse>;\n pageReplace: HandlerFunction<PageNavigationResponse>;\n pageGoBack: HandlerFunction<PageNavigationResponse>;\n pageGoForward: HandlerFunction<PageNavigationResponse>;\n\n // Screenshot\n getScreenshot: HandlerFunction<{ screenshot: string; width: number; height: number }>;\n\n // Design Review\n getElementStyles: HandlerFunction<ElementDesignData>;\n getElementStateStyles: HandlerFunction<{ elementId: string; stateStyles: StateStyles[] }>;\n getDesignSnapshot: HandlerFunction<{ elements: ElementDesignData[]; timestamp: number }>;\n getResponsiveSnapshots: HandlerFunction<ResponsiveSnapshot[]>;\n runDesignAudit: HandlerFunction<unknown>;\n loadStyleGuide: HandlerFunction<{ loaded: boolean }>;\n getStyleGuide: HandlerFunction<unknown>;\n clearStyleGuide: HandlerFunction<{ cleared: boolean }>;\n\n // Quality Evaluation\n evaluateQuality: HandlerFunction<unknown>;\n getQualityContexts: HandlerFunction<Array<{ name: string; description: string }>>;\n saveBaseline: HandlerFunction<{ saved: boolean; elementCount: number }>;\n diffBaseline: HandlerFunction<unknown>;\n\n // Meta / Introspection\n getMethods: HandlerFunction<{\n methods: Array<{ method: string; httpMethods?: string[]; description?: string }>;\n }>;\n\n // Health\n health: HandlerFunction<{ status: string; timestamp: number }>;\n}\n","/**\n * Native Element and Component Registry\n *\n * Central registry for all UI elements and components registered with UI Bridge Native.\n * Adapted from ui-bridge for React Native environments.\n */\n\nimport type {\n RegisteredNativeElement,\n RegisteredNativeComponent,\n NativeElementState,\n NativeElementType,\n NativeStandardAction,\n NativeCustomAction,\n NativeBridgeSnapshot,\n NativeElementIdentifier,\n NativeElementRef,\n NativeSnapshotEnrichers,\n NativeSnapshotEnricher,\n Workflow,\n BridgeEvent,\n BridgeEventType,\n BridgeEventListener,\n} from './types';\n\n/**\n * Options for registering an element\n */\nexport interface RegisterElementOptions {\n type?: NativeElementType;\n label?: string;\n actions?: NativeStandardAction[];\n customActions?: Record<string, NativeCustomAction>;\n props?: Record<string, unknown>;\n treePath?: string;\n testId?: string;\n accessibilityLabel?: string;\n /** Route path where the element was registered (for page-scoped filtering) */\n registrationRoute?: string | null;\n /** Flattened RN style (from StyleSheet.flatten) for design review */\n flatStyle?: Record<string, unknown>;\n /** State-specific style overrides for design review */\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n };\n}\n\n/**\n * Options for registering a component\n */\nexport interface RegisterComponentOptions {\n name: string;\n description?: string;\n actions?: Array<{\n id: string;\n label?: string;\n description?: string;\n handler: (params?: unknown) => unknown | Promise<unknown>;\n }>;\n elementIds?: string[];\n}\n\n/**\n * Registry configuration\n */\nexport interface NativeRegistryConfig {\n verbose?: boolean;\n onEvent?: BridgeEventListener;\n}\n\n/**\n * Extract handler function names from an element's props.\n * Returns names of props whose values are functions (e.g. ['onPress', 'onChangeText']).\n */\nexport function extractHandlerNames(props?: Record<string, unknown>): string[] {\n if (!props) return [];\n return Object.keys(props).filter((k) => typeof props[k] === 'function');\n}\n\n/**\n * Infer available actions based on element type\n */\nfunction inferActions(type: NativeElementType): NativeStandardAction[] {\n const baseActions: NativeStandardAction[] = ['focus', 'blur'];\n\n switch (type) {\n case 'button':\n case 'touchable':\n case 'pressable':\n return [...baseActions, 'click', 'press', 'longPress', 'doubleTap'];\n case 'input':\n return [...baseActions, 'click', 'press', 'type', 'clear'];\n case 'text':\n return [...baseActions, 'click', 'press', 'longPress'];\n case 'view':\n return [...baseActions, 'click', 'press'];\n case 'scroll':\n return [...baseActions, 'scroll', 'swipe'];\n case 'list':\n return [...baseActions, 'scroll', 'swipe'];\n case 'listItem':\n return [...baseActions, 'click', 'press', 'longPress', 'swipe'];\n case 'switch':\n case 'checkbox':\n return [...baseActions, 'click', 'press', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'press'];\n case 'image':\n return [...baseActions, 'click', 'press', 'longPress'];\n case 'modal':\n return ['focus', 'blur'];\n case 'custom':\n default:\n return [...baseActions, 'click', 'press'];\n }\n}\n\n/**\n * Native UI Bridge Registry\n *\n * Manages registration and lookup of native UI elements and components.\n */\nexport class NativeUIBridgeRegistry {\n private elements = new Map<string, RegisteredNativeElement>();\n private components = new Map<string, RegisteredNativeComponent>();\n private workflows = new Map<string, Workflow>();\n private eventListeners = new Map<BridgeEventType, Set<BridgeEventListener>>();\n private config: NativeRegistryConfig;\n private enrichers: NativeSnapshotEnrichers = {};\n private snapshotExtras = new Map<string, NativeSnapshotEnricher>();\n\n constructor(config: NativeRegistryConfig = {}) {\n this.config = config;\n }\n\n // ============================================================================\n // Snapshot Enricher Slots\n // ============================================================================\n\n /**\n * Register/replace canonical enrichers (modal/toast/undo). HMR-safe — calling\n * with a partial set merges into existing slots instead of clobbering them.\n */\n setEnrichers(e: Partial<NativeSnapshotEnrichers>): void {\n this.enrichers = { ...this.enrichers, ...e };\n }\n\n /**\n * Register a custom snapshot enricher. The returned object will be\n * `Object.assign`ed onto the snapshot, so use unique top-level keys to avoid\n * clobbering canonical fields. Returns a disposer.\n */\n registerSnapshotEnricher(name: string, fn: NativeSnapshotEnricher): () => void {\n this.snapshotExtras.set(name, fn);\n return () => this.unregisterSnapshotEnricher(name);\n }\n\n /** Remove a custom snapshot enricher by name */\n unregisterSnapshotEnricher(name: string): void {\n this.snapshotExtras.delete(name);\n }\n\n // ============================================================================\n // Element Management\n // ============================================================================\n\n /**\n * Register a native element\n */\n registerElement(\n id: string,\n ref: React.RefObject<NativeElementRef>,\n options: RegisterElementOptions = {}\n ): RegisteredNativeElement {\n const {\n type = 'custom',\n label,\n actions = inferActions(type),\n customActions,\n props,\n treePath = id,\n testId,\n accessibilityLabel,\n registrationRoute,\n flatStyle,\n stateStyles,\n } = options;\n\n // Create state getter\n const getState = (): NativeElementState => {\n const element = ref.current;\n if (!element) {\n return {\n mounted: false,\n visible: false,\n enabled: false,\n focused: false,\n layout: null,\n };\n }\n\n // State is populated by the element during onLayout\n // Here we return the stored state from the element's metadata\n const stored = this.elements.get(id);\n if (stored && stored.getState !== getState) {\n return stored.getState();\n }\n\n return {\n mounted: true,\n visible: true,\n enabled: true,\n focused: false,\n layout: null,\n };\n };\n\n // Create identifier getter\n const getIdentifier = (): NativeElementIdentifier => ({\n uiId: id,\n testId: testId || id,\n accessibilityLabel,\n treePath,\n });\n\n const registered: RegisteredNativeElement = {\n id,\n ref,\n type,\n label,\n actions,\n customActions,\n props,\n getState,\n getIdentifier,\n registeredAt: Date.now(),\n mounted: true,\n registrationRoute: registrationRoute ?? null,\n flatStyle,\n stateStyles,\n };\n\n this.elements.set(id, registered);\n\n this.emit('element:registered', { id, type, label });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered element: ${id} (${type})`);\n }\n\n // Seed a sensible initial state so elements are immediately visible in snapshots\n // even before onLayout fires. Layout-measuring code can overwrite this later.\n this.updateElementState(id, {\n mounted: true,\n visible: true,\n enabled: true,\n focused: false,\n layout: null,\n });\n\n return registered;\n }\n\n /**\n * Unregister an element\n */\n unregisterElement(id: string): void {\n const element = this.elements.get(id);\n if (element) {\n this.elements.delete(id);\n this.emit('element:unregistered', { id });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Unregistered element: ${id}`);\n }\n }\n }\n\n /**\n * Get a registered element\n */\n getElement(id: string): RegisteredNativeElement | undefined {\n return this.elements.get(id);\n }\n\n /**\n * Get all registered elements\n */\n getAllElements(): RegisteredNativeElement[] {\n return Array.from(this.elements.values());\n }\n\n /**\n * Get all registered elements that are visible and have a layout\n */\n getVisibleElements(): RegisteredNativeElement[] {\n return this.getAllElements().filter((e) => {\n const state = e.getState();\n return state.visible && state.layout !== null;\n });\n }\n\n /**\n * Get elements registered on a specific route (for page-scoped filtering)\n */\n getElementsForRoute(route: string): RegisteredNativeElement[] {\n return this.getAllElements().filter((e) => e.registrationRoute === route);\n }\n\n /**\n * Mark elements registered on a route as off-screen (visible: false, layout: null).\n *\n * Use this when a screen loses focus but stays mounted — common in React Navigation\n * tab navigators where inactive tabs remain in the tree. Without this call, stale\n * `layout` data lingers in snapshots and makes off-screen elements look rendered.\n *\n * Does NOT unregister the elements — they stay registered so the user's next visit\n * re-measures them via `onLayout` without re-mount cost. Elements without a\n * `registrationRoute` (app-wide registrations) are untouched.\n */\n markRouteOffscreen(route: string): void {\n // Guard against accidental global wipes. Elements registered without a\n // route have `registrationRoute: null` — passing null/empty here would\n // match every globally-registered element and erase their layouts.\n if (route == null || route === '') {\n if (this.config.verbose) {\n console.warn(\n `[ui-bridge-native] markRouteOffscreen called with null/empty route — ignoring`\n );\n }\n return;\n }\n let cleared = 0;\n for (const element of this.elements.values()) {\n if (element.registrationRoute === route) {\n this.updateElementState(element.id, {\n visible: false,\n layout: null,\n });\n cleared++;\n }\n }\n if (this.config.verbose && cleared > 0) {\n console.log(`[ui-bridge-native] Marked ${cleared} elements offscreen for route: ${route}`);\n }\n }\n\n /**\n * Update element state\n */\n updateElementState(id: string, state: Partial<NativeElementState>): void {\n const element = this.elements.get(id);\n if (element) {\n // Create a new getState that includes the updated state\n const currentState = element.getState();\n const newState = { ...currentState, ...state };\n\n const updated: RegisteredNativeElement = {\n ...element,\n getState: () => newState,\n };\n\n this.elements.set(id, updated);\n this.emit('element:stateChanged', { id, state: newState });\n }\n }\n\n /**\n * Update element props (for action execution)\n */\n updateElementProps(id: string, props: Record<string, unknown>): void {\n const element = this.elements.get(id);\n if (element) {\n const updated: RegisteredNativeElement = {\n ...element,\n props: { ...element.props, ...props },\n };\n this.elements.set(id, updated);\n }\n }\n\n /**\n * Update element style for design review\n */\n updateElementStyle(\n id: string,\n flatStyle: Record<string, unknown>,\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n }\n ): void {\n const element = this.elements.get(id);\n if (element) {\n const updated: RegisteredNativeElement = {\n ...element,\n flatStyle,\n ...(stateStyles !== undefined ? { stateStyles } : {}),\n };\n this.elements.set(id, updated);\n }\n }\n\n /**\n * Get element style for design review\n */\n getElementStyle(id: string): Record<string, unknown> | null {\n const element = this.elements.get(id);\n return element?.flatStyle ?? null;\n }\n\n /**\n * Find element by testID\n */\n findByTestId(testId: string): RegisteredNativeElement | undefined {\n for (const element of this.elements.values()) {\n const identifier = element.getIdentifier();\n if (identifier.testId === testId) {\n return element;\n }\n }\n return undefined;\n }\n\n /**\n * Find elements by type\n */\n findByType(type: NativeElementType): RegisteredNativeElement[] {\n return Array.from(this.elements.values()).filter((e) => e.type === type);\n }\n\n // ============================================================================\n // Component Management\n // ============================================================================\n\n /**\n * Register a component\n */\n registerComponent(id: string, options: RegisterComponentOptions): RegisteredNativeComponent {\n const { name, description, actions = [], elementIds } = options;\n\n const registered: RegisteredNativeComponent = {\n id,\n name,\n description,\n actions: actions.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })),\n elementIds,\n registeredAt: Date.now(),\n mounted: true,\n };\n\n this.components.set(id, registered);\n\n this.emit('component:registered', { id, name });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered component: ${id} (${name})`);\n }\n\n return registered;\n }\n\n /**\n * Unregister a component\n */\n unregisterComponent(id: string): void {\n const component = this.components.get(id);\n if (component) {\n this.components.delete(id);\n this.emit('component:unregistered', { id });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Unregistered component: ${id}`);\n }\n }\n }\n\n /**\n * Get a registered component\n */\n getComponent(id: string): RegisteredNativeComponent | undefined {\n return this.components.get(id);\n }\n\n /**\n * Get all registered components\n */\n getAllComponents(): RegisteredNativeComponent[] {\n return Array.from(this.components.values());\n }\n\n // ============================================================================\n // Workflow Management\n // ============================================================================\n\n /**\n * Register a workflow\n */\n registerWorkflow(workflow: Workflow): void {\n this.workflows.set(workflow.id, workflow);\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered workflow: ${workflow.id}`);\n }\n }\n\n /**\n * Unregister a workflow\n */\n unregisterWorkflow(id: string): void {\n this.workflows.delete(id);\n }\n\n /**\n * Get a workflow\n */\n getWorkflow(id: string): Workflow | undefined {\n return this.workflows.get(id);\n }\n\n /**\n * Get all workflows\n */\n getAllWorkflows(): Workflow[] {\n return Array.from(this.workflows.values());\n }\n\n // ============================================================================\n // Event System\n // ============================================================================\n\n /**\n * Subscribe to events\n */\n on<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): () => void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, new Set());\n }\n this.eventListeners.get(type)!.add(listener as BridgeEventListener);\n\n // Return unsubscribe function\n return () => this.off(type, listener);\n }\n\n /**\n * Unsubscribe from events\n */\n off<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): void {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n }\n\n /**\n * Emit an event\n */\n emit(type: BridgeEventType, data: unknown): void {\n const event: BridgeEvent = {\n type,\n timestamp: Date.now(),\n data,\n };\n\n // Notify listeners\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error(`[ui-bridge-native] Event listener error:`, error);\n }\n }\n }\n\n // Notify global handler\n if (this.config.onEvent) {\n try {\n this.config.onEvent(event);\n } catch (error) {\n console.error(`[ui-bridge-native] Global event handler error:`, error);\n }\n }\n }\n\n // ============================================================================\n // Snapshots\n // ============================================================================\n\n /**\n * Create a snapshot of the current state\n */\n createSnapshot(\n routeInfo?: {\n currentRoute?: string | null;\n segments?: string[];\n },\n options?: { visibleOnly?: boolean; currentRouteOnly?: boolean }\n ): NativeBridgeSnapshot {\n let elements = options?.visibleOnly ? this.getVisibleElements() : this.getAllElements();\n\n // Filter to only elements registered on the current route\n if (options?.currentRouteOnly && routeInfo?.currentRoute) {\n const currentRoute = routeInfo.currentRoute;\n elements = elements.filter((e) => e.registrationRoute === currentRoute);\n }\n\n const snapshot: NativeBridgeSnapshot = {\n timestamp: Date.now(),\n elements: elements.map((e) => {\n const handlers = extractHandlerNames(e.props);\n return {\n id: e.id,\n type: e.type,\n label: e.label,\n identifier: e.getIdentifier(),\n state: e.getState(),\n actions: e.actions,\n customActions: e.customActions ? Object.keys(e.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: e.registrationRoute,\n };\n }),\n components: this.getAllComponents().map((c) => ({\n id: c.id,\n name: c.name,\n description: c.description,\n actions: c.actions.map((a) => a.id),\n elementIds: c.elementIds,\n })),\n workflows: this.getAllWorkflows().map((w) => ({\n id: w.id,\n name: w.name,\n description: w.description,\n stepCount: w.steps.length,\n })),\n currentRoute: routeInfo?.currentRoute ?? null,\n segments: routeInfo?.segments,\n };\n\n // Canonical enrichers — each in its own try/catch so a misbehaving tracker\n // can never break the rest of the snapshot.\n if (this.enrichers.modalDetector) {\n try {\n snapshot.modalStack = this.enrichers.modalDetector.getSnapshotModalContext();\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] modalDetector enricher threw:`, error);\n }\n }\n }\n if (this.enrichers.toastCapture) {\n try {\n snapshot.toasts = this.enrichers.toastCapture.getSnapshotToastContext();\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] toastCapture enricher threw:`, error);\n }\n }\n }\n if (this.enrichers.undoTracker) {\n try {\n snapshot.undoRedo = this.enrichers.undoTracker.getSnapshotUndoContext();\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] undoTracker enricher threw:`, error);\n }\n }\n }\n\n // Custom enrichers — keys assign-merged onto the snapshot\n if (this.snapshotExtras.size > 0) {\n const ctx = { elements, currentRoute: routeInfo?.currentRoute ?? null };\n for (const [name, fn] of this.snapshotExtras) {\n try {\n const extra = fn(ctx);\n if (extra && typeof extra === 'object') {\n Object.assign(snapshot, extra);\n }\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] snapshot enricher \"${name}\" threw:`, error);\n }\n }\n }\n }\n\n return snapshot;\n }\n\n /**\n * Get registry statistics\n */\n getStats(): { elements: number; components: number; workflows: number } {\n return {\n elements: this.elements.size,\n components: this.components.size,\n workflows: this.workflows.size,\n };\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.elements.clear();\n this.components.clear();\n this.workflows.clear();\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registry cleared`);\n }\n }\n}\n\n// ============================================================================\n// Global Registry\n// ============================================================================\n\nlet globalRegistry: NativeUIBridgeRegistry | null = null;\n\n/**\n * Set the global registry\n */\nexport function setGlobalRegistry(registry: NativeUIBridgeRegistry): void {\n globalRegistry = registry;\n}\n\n/**\n * Get the global registry\n */\nexport function getGlobalRegistry(): NativeUIBridgeRegistry | null {\n return globalRegistry;\n}\n\n/**\n * Reset the global registry\n */\nexport function resetGlobalRegistry(): void {\n globalRegistry?.clear();\n globalRegistry = null;\n}\n","/**\n * Native Design Inspector\n *\n * Pure TypeScript functions that map flattened React Native styles to the\n * web SDK's ExtendedComputedStyles format. No react-native imports — works\n * with already-flattened style objects from the registry.\n *\n * Key differences from web:\n * - No `window.getComputedStyle()` — styles are declarative objects\n * - No hover/active states — uses pressed/focused/disabled\n * - No pseudo-elements (::before/::after)\n * - No CSS grid, cursor, visibility, transitions, background-image\n * - RN default flexDirection is 'column' (not 'row')\n * - Shadows differ: iOS uses shadow* props, Android uses elevation\n * - Numeric values → \"Npx\" strings\n */\n\nimport type {\n ExtendedComputedStyles,\n ElementDesignData,\n StateStyles,\n StyleDiff,\n ResponsiveSnapshot,\n NativeInteractionStateName,\n} from './design-types';\nimport type { NativeLayout } from '../core/types';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert a numeric RN value to a CSS px string.\n * String values (like \"50%\") pass through unchanged.\n */\nfunction toCssValue(value: unknown): string {\n if (value == null) return '';\n if (typeof value === 'number') return `${value}px`;\n return String(value);\n}\n\n/**\n * Convert RN transform array to CSS transform string.\n * e.g. [{translateX: 10}, {rotate: '45deg'}] → \"translateX(10px) rotate(45deg)\"\n */\nfunction transformToCss(transform: unknown): string {\n if (!Array.isArray(transform) || transform.length === 0) return '';\n\n return transform\n .map((t: Record<string, unknown>) => {\n const key = Object.keys(t)[0];\n if (!key) return '';\n const val = t[key];\n // Rotation values are already strings like '45deg'\n if (typeof val === 'string') return `${key}(${val})`;\n // Numeric values need px for translate, unitless for scale\n if (typeof val === 'number') {\n const needsPx = key.startsWith('translate') || key === 'perspective';\n return `${key}(${val}${needsPx ? 'px' : ''})`;\n }\n return '';\n })\n .filter(Boolean)\n .join(' ');\n}\n\n/**\n * Convert RN shadow props (iOS) + elevation (Android) to CSS box-shadow string.\n */\nfunction shadowToCss(style: Record<string, unknown>): string {\n const parts: string[] = [];\n\n // iOS shadow\n const shadowColor = style.shadowColor as string | undefined;\n const shadowOffset = style.shadowOffset as { width: number; height: number } | undefined;\n const shadowOpacity = style.shadowOpacity as number | undefined;\n const shadowRadius = style.shadowRadius as number | undefined;\n\n if (shadowColor && shadowOffset && shadowOpacity != null && shadowOpacity > 0) {\n const { width, height } = shadowOffset;\n parts.push(\n `${width}px ${height}px ${shadowRadius ?? 0}px ${shadowColor}` +\n (shadowOpacity < 1 ? ` /* opacity: ${shadowOpacity} */` : '')\n );\n }\n\n // Android elevation\n const elevation = style.elevation as number | undefined;\n if (elevation != null && elevation > 0) {\n parts.push(`elevation(${elevation})`);\n }\n\n return parts.join(', ');\n}\n\n/**\n * Convert RN border props to CSS border shorthand.\n */\nfunction borderToCss(style: Record<string, unknown>): string {\n const width = style.borderWidth as number | undefined;\n const color = style.borderColor as string | undefined;\n\n if (width == null && color == null) return '';\n return `${width ?? 0}px solid ${color ?? 'transparent'}`;\n}\n\n/**\n * Convert RN borderRadius to CSS border-radius string.\n * Handles both uniform radius and per-corner values.\n */\nfunction borderRadiusToCss(style: Record<string, unknown>): string {\n const uniform = style.borderRadius as number | undefined;\n if (uniform != null) return `${uniform}px`;\n\n const tl = style.borderTopLeftRadius as number | undefined;\n const tr = style.borderTopRightRadius as number | undefined;\n const bl = style.borderBottomLeftRadius as number | undefined;\n const br = style.borderBottomRightRadius as number | undefined;\n\n if (tl == null && tr == null && bl == null && br == null) return '';\n return `${tl ?? 0}px ${tr ?? 0}px ${br ?? 0}px ${bl ?? 0}px`;\n}\n\n/**\n * Resolve margin/padding shorthand + Horizontal/Vertical expansions.\n * Returns top, right, bottom, left values.\n */\nfunction resolveSpacing(\n style: Record<string, unknown>,\n prefix: 'margin' | 'padding'\n): { top: string; right: string; bottom: string; left: string; shorthand: string } {\n const all = style[prefix];\n const top = style[`${prefix}Top`] ?? style[`${prefix}Vertical`] ?? all;\n const bottom = style[`${prefix}Bottom`] ?? style[`${prefix}Vertical`] ?? all;\n const right = style[`${prefix}Right`] ?? style[`${prefix}Horizontal`] ?? all;\n const left = style[`${prefix}Left`] ?? style[`${prefix}Horizontal`] ?? all;\n\n const t = toCssValue(top);\n const r = toCssValue(right);\n const b = toCssValue(bottom);\n const l = toCssValue(left);\n\n // Build shorthand\n let shorthand = '';\n if (t || r || b || l) {\n if (t === r && r === b && b === l) {\n shorthand = t || '0px';\n } else if (t === b && r === l) {\n shorthand = `${t || '0px'} ${r || '0px'}`;\n } else {\n shorthand = `${t || '0px'} ${r || '0px'} ${b || '0px'} ${l || '0px'}`;\n }\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n shorthand,\n };\n}\n\n/**\n * Resolve gap values (gap, rowGap, columnGap).\n */\nfunction resolveGap(style: Record<string, unknown>): string {\n const gap = style.gap as number | undefined;\n const rowGap = style.rowGap as number | undefined;\n const columnGap = style.columnGap as number | undefined;\n\n if (gap != null) return `${gap}px`;\n if (rowGap != null && columnGap != null) return `${rowGap}px ${columnGap}px`;\n if (rowGap != null) return `${rowGap}px`;\n if (columnGap != null) return `${columnGap}px`;\n return '';\n}\n\n// ============================================================================\n// Core mapping function\n// ============================================================================\n\n/**\n * Map a flattened React Native style object to ExtendedComputedStyles.\n *\n * Rules:\n * - Numeric values → \"Npx\"\n * - String values → pass through\n * - textDecorationLine → textDecoration\n * - RN shadow props → boxShadow string\n * - CSS-only properties (cursor, visibility, grid*, etc.) → empty string\n */\nexport function mapNativeStyleToExtended(\n rnStyle: Record<string, unknown> | undefined | null\n): ExtendedComputedStyles {\n const s = rnStyle ?? {};\n\n const margin = resolveSpacing(s, 'margin');\n const padding = resolveSpacing(s, 'padding');\n\n return {\n // Layout\n display: (s.display as string) ?? 'flex',\n position: (s.position as string) ?? 'relative',\n boxSizing: '', // CSS-only\n width: toCssValue(s.width),\n height: toCssValue(s.height),\n minWidth: toCssValue(s.minWidth),\n maxWidth: toCssValue(s.maxWidth),\n minHeight: toCssValue(s.minHeight),\n maxHeight: toCssValue(s.maxHeight),\n margin: margin.shorthand,\n marginTop: margin.top,\n marginRight: margin.right,\n marginBottom: margin.bottom,\n marginLeft: margin.left,\n padding: padding.shorthand,\n paddingTop: padding.top,\n paddingRight: padding.right,\n paddingBottom: padding.bottom,\n paddingLeft: padding.left,\n overflow: (s.overflow as string) ?? '',\n overflowX: '', // CSS-only\n overflowY: '', // CSS-only\n\n // Flex/Grid — RN defaults to column, not row\n flexDirection: (s.flexDirection as string) ?? '',\n flexWrap: (s.flexWrap as string) ?? '',\n justifyContent: (s.justifyContent as string) ?? '',\n alignItems: (s.alignItems as string) ?? '',\n alignSelf: (s.alignSelf as string) ?? '',\n gap: resolveGap(s),\n gridTemplateColumns: '', // CSS-only\n gridTemplateRows: '', // CSS-only\n\n // Typography\n fontFamily: (s.fontFamily as string) ?? '',\n fontSize: toCssValue(s.fontSize),\n fontWeight: (s.fontWeight as string) ?? '',\n lineHeight: toCssValue(s.lineHeight),\n letterSpacing: toCssValue(s.letterSpacing),\n textAlign: (s.textAlign as string) ?? '',\n textTransform: (s.textTransform as string) ?? '',\n textDecoration: (s.textDecorationLine as string) ?? '', // RN name → CSS name\n color: (s.color as string) ?? '',\n\n // Visual\n backgroundColor: (s.backgroundColor as string) ?? '',\n backgroundImage: '', // CSS-only\n border: borderToCss(s),\n borderRadius: borderRadiusToCss(s),\n boxShadow: shadowToCss(s),\n opacity: s.opacity != null ? String(s.opacity) : '',\n outline: '', // CSS-only\n\n // Effects\n transform: transformToCss(s.transform),\n transition: '', // CSS-only\n cursor: '', // CSS-only\n zIndex: s.zIndex != null ? String(s.zIndex) : '',\n visibility: '', // CSS-only\n pointerEvents: (s.pointerEvents as string) ?? '',\n };\n}\n\n// ============================================================================\n// Design data functions\n// ============================================================================\n\n/**\n * Produce ElementDesignData for a single native element.\n */\nexport function getNativeElementDesignData(\n id: string,\n label: string | undefined,\n type: string,\n rnStyle: Record<string, unknown> | undefined | null,\n layout: NativeLayout | null\n): ElementDesignData {\n return {\n elementId: id,\n label,\n type,\n styles: mapNativeStyleToExtended(rnStyle),\n pseudoElements: [], // RN has no pseudo-elements\n rect: layout\n ? {\n x: layout.pageX,\n y: layout.pageY,\n width: layout.width,\n height: layout.height,\n }\n : { x: 0, y: 0, width: 0, height: 0 },\n };\n}\n\n/**\n * Compute style diffs between default and a state variation.\n */\nfunction computeStyleDiff(\n defaultStyles: ExtendedComputedStyles,\n stateStyles: ExtendedComputedStyles\n): StyleDiff[] {\n const diffs: StyleDiff[] = [];\n for (const key of Object.keys(defaultStyles) as Array<keyof ExtendedComputedStyles>) {\n if (defaultStyles[key] !== stateStyles[key]) {\n diffs.push({\n property: key,\n defaultValue: defaultStyles[key],\n stateValue: stateStyles[key],\n });\n }\n }\n return diffs;\n}\n\n/**\n * Merge a base RN style with a state override.\n */\nfunction mergeStyles(\n base: Record<string, unknown>,\n override: Record<string, unknown> | undefined\n): Record<string, unknown> {\n if (!override) return base;\n return { ...base, ...override };\n}\n\n/**\n * Produce StateStyles[] for default/pressed/focused/disabled.\n * Only includes states that have actual overrides or the default state.\n */\nexport function captureNativeStateVariations(\n baseStyle: Record<string, unknown> | undefined | null,\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n }\n): StateStyles[] {\n const base = baseStyle ?? {};\n const defaultExtended = mapNativeStyleToExtended(base);\n\n const results: StateStyles[] = [\n {\n state: 'default',\n styles: defaultExtended,\n diffFromDefault: [],\n },\n ];\n\n if (!stateStyles) return results;\n\n const states: Array<{ name: NativeInteractionStateName; override?: Record<string, unknown> }> = [\n { name: 'pressed', override: stateStyles.pressed },\n { name: 'focused', override: stateStyles.focused },\n { name: 'disabled', override: stateStyles.disabled },\n ];\n\n for (const { name, override } of states) {\n if (!override) continue;\n const merged = mergeStyles(base, override);\n const extended = mapNativeStyleToExtended(merged);\n const diff = computeStyleDiff(defaultExtended, extended);\n if (diff.length > 0) {\n results.push({ state: name, styles: extended, diffFromDefault: diff });\n }\n }\n\n return results;\n}\n\n/**\n * Capture a responsive snapshot.\n *\n * Platform limitation: RN cannot constrain screen width at runtime.\n * This returns a single snapshot at the current device dimensions.\n */\nexport function captureNativeResponsiveSnapshot(\n elements: Array<{\n id: string;\n label?: string;\n type: string;\n flatStyle?: Record<string, unknown>;\n layout: NativeLayout | null;\n }>,\n screenDimensions: { width: number; height: number }\n): ResponsiveSnapshot[] {\n const elementData = elements.map((el) =>\n getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, el.layout)\n );\n\n return [\n {\n viewportWidth: screenDimensions.width,\n viewportLabel: 'current',\n elements: elementData,\n timestamp: Date.now(),\n },\n ];\n}\n","/**\n * UI Bridge Native Design Review Handlers\n *\n * HTTP handlers for the 8 design review endpoints.\n * Maps registered element styles to the web SDK's design data format.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { APIResponse, HandlerContext } from './types';\nimport type { ElementDesignData, StateStyles, ResponsiveSnapshot } from '../design/design-types';\nimport {\n mapNativeStyleToExtended,\n getNativeElementDesignData,\n captureNativeStateVariations,\n captureNativeResponsiveSnapshot,\n} from '../design/design-inspector-native';\n\n// Style guide and baseline stored in closure (same pattern as web SDK)\nlet loadedStyleGuide: unknown = null;\nlet savedBaseline: unknown = null;\n\n// Try to load the style validator from the web SDK (optional peer dep)\nlet styleValidator: {\n runStyleAudit: (\n elements: Array<{ elementId: string; styles: Record<string, string> }>,\n guide: unknown\n ) => unknown;\n} | null = null;\n\n// Try to load quality evaluator from the web SDK (optional peer dep)\nlet qualityEvaluator: {\n evaluateQuality: (\n elements: ElementDesignData[],\n viewport: { width: number; height: number },\n context?: unknown\n ) => unknown;\n listContexts: () => Array<{ name: string; description: string }>;\n createBaseline: (\n elements: ElementDesignData[],\n viewport: { width: number; height: number },\n label?: string\n ) => unknown;\n diffSnapshots: (baseline: unknown, current: ElementDesignData[]) => unknown;\n} | null = null;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const specs = require('@qontinui/ui-bridge/specs');\n styleValidator = specs;\n qualityEvaluator = specs;\n} catch {\n // Optional dependency not installed — audit/evaluate endpoints will return an error\n}\n\nfunction success<T>(data: T): APIResponse<T> {\n return { success: true, data, timestamp: Date.now() };\n}\n\nfunction error<T = unknown>(message: string, code?: string): APIResponse<T> {\n return { success: false, error: message, code, timestamp: Date.now() };\n}\n\n/**\n * Design handler interface (subset of NativeServerHandlers)\n */\nexport interface NativeDesignHandlers {\n getElementStyles: (ctx: HandlerContext) => Promise<APIResponse<ElementDesignData>>;\n getElementStateStyles: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ elementId: string; stateStyles: StateStyles[] }>>;\n getDesignSnapshot: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ elements: ElementDesignData[]; timestamp: number }>>;\n getResponsiveSnapshots: (ctx: HandlerContext) => Promise<APIResponse<ResponsiveSnapshot[]>>;\n runDesignAudit: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n loadStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<{ loaded: boolean }>>;\n getStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n clearStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n evaluateQuality: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n getQualityContexts: (\n ctx: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; description: string }>>>;\n saveBaseline: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ saved: boolean; elementCount: number }>>;\n diffBaseline: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n}\n\n/**\n * Create design review handlers.\n */\nexport function createDesignHandlers(registry: NativeUIBridgeRegistry): NativeDesignHandlers {\n // Helper to get screen dimensions (React Native's Dimensions API must be\n // called at handler time, not import time, so we use a lazy getter).\n function getScreenDimensions(): { width: number; height: number } {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { Dimensions } = require('react-native');\n const screen = Dimensions.get('screen');\n return { width: screen.width, height: screen.height };\n } catch {\n return { width: 0, height: 0 };\n }\n }\n\n return {\n // 1. GET /design/element/:id/styles\n getElementStyles: async (ctx) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error('Element not found: ' + id, 'ELEMENT_NOT_FOUND');\n }\n\n const state = element.getState();\n const data = getNativeElementDesignData(\n id,\n element.label,\n element.type,\n element.flatStyle,\n state.layout\n );\n\n return success(data);\n },\n\n // 2. POST /design/element/:id/state-styles\n getElementStateStyles: async (ctx) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error('Element not found: ' + id, 'ELEMENT_NOT_FOUND');\n }\n\n const stateStyles = captureNativeStateVariations(element.flatStyle, element.stateStyles);\n\n return success({ elementId: id, stateStyles });\n },\n\n // 3. POST /design/snapshot\n getDesignSnapshot: async (ctx) => {\n const body = ctx.body as\n | {\n elementIds?: string[];\n includePseudoElements?: boolean;\n }\n | undefined;\n\n let elements = registry.getAllElements();\n\n // Filter to requested IDs if specified\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n return success({ elements: designData, timestamp: Date.now() });\n },\n\n // 4. POST /design/responsive\n getResponsiveSnapshots: async () => {\n // Platform limitation: RN cannot constrain screen width at runtime.\n // Returns a single snapshot at current device dimensions.\n const elements = registry.getAllElements();\n const elementData = elements.map((el) => {\n const state = el.getState();\n return {\n id: el.id,\n label: el.label,\n type: el.type,\n flatStyle: el.flatStyle,\n layout: state.layout,\n };\n });\n\n const snapshots = captureNativeResponsiveSnapshot(elementData, getScreenDimensions());\n return success(snapshots);\n },\n\n // 5. POST /design/audit\n runDesignAudit: async (ctx) => {\n const body = ctx.body as\n | {\n guide?: unknown;\n elementIds?: string[];\n }\n | undefined;\n\n const guide = body?.guide ?? loadedStyleGuide;\n\n if (!guide) {\n return error('No style guide loaded or provided', 'NO_STYLE_GUIDE');\n }\n\n if (!styleValidator) {\n return error(\n 'Install @qontinui/ui-bridge for style audit support. ' +\n 'Add it as a dependency: npm install @qontinui/ui-bridge',\n 'VALIDATOR_NOT_AVAILABLE'\n );\n }\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n // Map elements to the format expected by the validator\n const auditElements = elements.map((el) => ({\n elementId: el.id,\n styles: mapNativeStyleToExtended(el.flatStyle) as unknown as Record<string, string>,\n }));\n\n try {\n const report = styleValidator.runStyleAudit(auditElements, guide);\n return success(report);\n } catch (err) {\n return error(\n 'Audit failed: ' + (err instanceof Error ? err.message : String(err)),\n 'DESIGN_AUDIT_ERROR'\n );\n }\n },\n\n // 6. POST /design/style-guide/load\n loadStyleGuide: async (ctx) => {\n const body = ctx.body as { guide?: unknown } | undefined;\n\n if (!body?.guide) {\n return error('Style guide is required in request body', 'INVALID_REQUEST');\n }\n\n loadedStyleGuide = body.guide;\n return success({ loaded: true });\n },\n\n // 7. GET /design/style-guide\n getStyleGuide: async () => {\n return success(loadedStyleGuide);\n },\n\n // 8. DELETE /design/style-guide\n clearStyleGuide: async () => {\n loadedStyleGuide = null;\n return success({ cleared: true });\n },\n\n // 9. POST /design/evaluate\n evaluateQuality: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support. ' +\n 'Add it as a dependency: npm install @qontinui/ui-bridge',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n const body = ctx.body as\n | {\n context?: string;\n customContext?: unknown;\n elementIds?: string[];\n viewport?: { width: number; height: number };\n }\n | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n const viewport = body?.viewport ?? getScreenDimensions();\n\n // Resolve context: custom object > style guide context > built-in name\n let context: unknown = body?.customContext ?? body?.context ?? 'general';\n if (typeof context === 'string' && loadedStyleGuide) {\n const guide = loadedStyleGuide as { qualityContexts?: Record<string, unknown> };\n if (guide.qualityContexts?.[context]) {\n context = guide.qualityContexts[context];\n }\n }\n\n try {\n const report = qualityEvaluator.evaluateQuality(designData, viewport, context);\n return success(report);\n } catch (err) {\n return error(\n 'Evaluation failed: ' + (err instanceof Error ? err.message : String(err)),\n 'QUALITY_EVALUATION_ERROR'\n );\n }\n },\n\n // 10. GET /design/evaluate/contexts\n getQualityContexts: async () => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n return success(qualityEvaluator.listContexts());\n },\n\n // 11. POST /design/evaluate/baseline\n saveBaseline: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n const body = ctx.body as\n | {\n label?: string;\n elementIds?: string[];\n }\n | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n const viewport = getScreenDimensions();\n savedBaseline = qualityEvaluator.createBaseline(designData, viewport, body?.label);\n return success({ saved: true, elementCount: designData.length });\n },\n\n // 12. POST /design/evaluate/diff\n diffBaseline: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n if (!savedBaseline) {\n return error('No baseline saved. Call saveBaseline first.', 'NO_BASELINE');\n }\n\n const body = ctx.body as { elementIds?: string[] } | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n try {\n const report = qualityEvaluator.diffSnapshots(savedBaseline, designData);\n return success(report);\n } catch (err) {\n return error(\n 'Diff failed: ' + (err instanceof Error ? err.message : String(err)),\n 'DIFF_BASELINE_ERROR'\n );\n }\n },\n };\n}\n","/**\n * UI Bridge Native Server Handlers\n *\n * Request handlers for the HTTP API endpoints.\n */\n\nimport { type NativeUIBridgeRegistry, extractHandlerNames } from '../core/registry';\nimport type { WorkflowStep } from '../core/types';\nimport type { NativeActionExecutor } from '../control/types';\nimport type { APIResponse, HandlerContext, NativeServerHandlers } from './types';\nimport { createDesignHandlers } from './design-handlers';\n\n/**\n * Result of executing a single workflow step\n */\ninterface WorkflowStepResult {\n stepId: string;\n type: string;\n status: 'completed' | 'failed' | 'skipped';\n result?: unknown;\n error?: string;\n durationMs: number;\n}\n\n/**\n * Execute a single workflow step using the registry and executor\n */\nasync function executeWorkflowStep(\n step: WorkflowStep,\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor\n): Promise<WorkflowStepResult> {\n const startTime = Date.now();\n\n try {\n switch (step.type) {\n case 'element-action': {\n if (!step.target || !step.action) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'element-action step requires target and action',\n durationMs: Date.now() - startTime,\n };\n }\n\n const response = await executor.executeAction(step.target, {\n action: step.action,\n params: step.params,\n waitOptions: step.waitOptions,\n });\n\n return {\n stepId: step.id,\n type: step.type,\n status: response.success ? 'completed' : 'failed',\n result: response.result,\n error: response.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'component-action': {\n if (!step.target || !step.action) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'component-action step requires target and action',\n durationMs: Date.now() - startTime,\n };\n }\n\n const response = await executor.executeComponentAction(step.target, {\n action: step.action,\n params: step.params,\n });\n\n return {\n stepId: step.id,\n type: step.type,\n status: response.success ? 'completed' : 'failed',\n result: response.result,\n error: response.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'wait': {\n if (!step.target) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'wait step requires target element id',\n durationMs: Date.now() - startTime,\n };\n }\n\n const waitResult = await executor.waitForElement(\n step.target,\n step.waitOptions || { visible: true, timeout: 10000, interval: 100 }\n );\n\n return {\n stepId: step.id,\n type: step.type,\n status: waitResult.met ? 'completed' : 'failed',\n result: waitResult.state,\n error: waitResult.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'assert': {\n if (!step.target) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'assert step requires target element id',\n durationMs: Date.now() - startTime,\n };\n }\n\n const element = registry.getElement(step.target);\n if (!element) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: `Element not found: ${step.target}`,\n durationMs: Date.now() - startTime,\n };\n }\n\n const state = element.getState();\n const expected = step.params || {};\n const stateRecord = state as unknown as Record<string, unknown>;\n const mismatches: string[] = [];\n\n for (const [key, value] of Object.entries(expected)) {\n const actual = stateRecord[key];\n const isEqual =\n typeof value === 'object' && value !== null\n ? JSON.stringify(actual) === JSON.stringify(value)\n : actual === value;\n if (!isEqual) {\n mismatches.push(\n `${key}: expected ${JSON.stringify(value)}, got ${JSON.stringify(actual)}`\n );\n }\n }\n\n return {\n stepId: step.id,\n type: step.type,\n status: mismatches.length === 0 ? 'completed' : 'failed',\n result: { state, mismatches },\n error: mismatches.length > 0 ? `Assertion failed: ${mismatches.join('; ')}` : undefined,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'custom': {\n if (!step.handler) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'custom step requires a handler function',\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await step.handler();\n // Allow handlers to signal failure by returning { success: false, error: '...' }\n const failed =\n result &&\n typeof result === 'object' &&\n 'success' in result &&\n (result as Record<string, unknown>).success === false;\n\n return {\n stepId: step.id,\n type: step.type,\n status: failed ? 'failed' : 'completed',\n result,\n error: failed\n ? ((result as Record<string, unknown>).error as string) ||\n 'Custom handler returned failure'\n : undefined,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'log': {\n const message = step.params?.message ?? step.params?.text ?? `[workflow] step ${step.id}`;\n console.log(`[ui-bridge-native] workflow log: ${message}`);\n\n return {\n stepId: step.id,\n type: step.type,\n status: 'completed',\n result: { message },\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'navigate':\n case 'branch':\n case 'loop':\n case 'extract':\n return {\n stepId: step.id,\n type: step.type,\n status: 'skipped',\n error: `Step type \"${step.type}\" is not yet supported in native workflow execution`,\n durationMs: Date.now() - startTime,\n };\n\n default:\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: `Unknown step type: ${step.type}`,\n durationMs: Date.now() - startTime,\n };\n }\n } catch (err) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Create a success response\n */\nfunction success<T>(data: T): APIResponse<T> {\n return {\n success: true,\n data,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create an error response\n */\nfunction error<T = unknown>(message: string, code?: string): APIResponse<T> {\n return {\n success: false,\n error: message,\n code,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create server handlers\n */\nexport function createServerHandlers(\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor,\n config?: { appInfo?: { appId: string; appName: string; appType: string; framework?: string } }\n): NativeServerHandlers {\n const designHandlers = createDesignHandlers(registry);\n\n return {\n // Elements\n getElements: async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx.query?.visibleOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.visibleOnly === true;\n const forRoute = (ctx.query?.route || (ctx.body as Record<string, unknown>)?.route) as\n | string\n | undefined;\n\n let allElements = visibleOnly ? registry.getVisibleElements() : registry.getAllElements();\n\n // Filter by specific route (injected by setRouteProvider override when currentRouteOnly is set)\n if (forRoute) {\n allElements = allElements.filter((e) => e.registrationRoute === forRoute);\n }\n\n const elements = allElements.map((e) => {\n const handlers = extractHandlerNames(e.props);\n return {\n id: e.id,\n type: e.type,\n label: e.label,\n identifier: e.getIdentifier(),\n state: e.getState(),\n actions: e.actions,\n customActions: e.customActions ? Object.keys(e.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: e.registrationRoute,\n };\n });\n\n return success({ elements });\n },\n\n getElement: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error(`Element not found: ${id}`, 'ELEMENT_NOT_FOUND');\n }\n\n const handlers = extractHandlerNames(element.props);\n\n return success({\n element: {\n id: element.id,\n type: element.type,\n label: element.label,\n identifier: element.getIdentifier(),\n state: element.getState(),\n actions: element.actions,\n customActions: element.customActions ? Object.keys(element.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: element.registrationRoute,\n },\n });\n },\n\n getElementState: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error(`Element not found: ${id}`, 'ELEMENT_NOT_FOUND');\n }\n\n return success({ state: element.getState() });\n },\n\n executeAction: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const body = ctx.body as {\n action: string;\n params?: Record<string, unknown>;\n waitOptions?: Record<string, unknown>;\n };\n\n if (!body?.action) {\n return error('Action is required', 'INVALID_REQUEST');\n }\n\n const response = await executor.executeAction(id, {\n action: body.action,\n params: body.params,\n waitOptions: body.waitOptions as any,\n });\n\n if (!response.success) {\n return error(response.error || 'Action failed', 'ACTION_FAILED');\n }\n\n return success(response);\n },\n\n // Components\n getComponents: async () => {\n const components = registry.getAllComponents().map((c) => ({\n id: c.id,\n name: c.name,\n description: c.description,\n actions: c.actions.map((a) => ({ id: a.id, label: a.label })),\n elementIds: c.elementIds,\n }));\n\n return success({ components });\n },\n\n getComponent: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const component = registry.getComponent(id);\n\n if (!component) {\n return error(`Component not found: ${id}`, 'COMPONENT_NOT_FOUND');\n }\n\n return success({\n component: {\n id: component.id,\n name: component.name,\n description: component.description,\n actions: component.actions.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n })),\n elementIds: component.elementIds,\n },\n });\n },\n\n executeComponentAction: async (ctx: HandlerContext) => {\n const { id, actionId } = ctx.params;\n const body = ctx.body as { params?: Record<string, unknown> };\n\n const response = await executor.executeComponentAction(id, {\n action: actionId,\n params: body?.params,\n });\n\n if (!response.success) {\n return error(response.error || 'Action failed', 'ACTION_FAILED');\n }\n\n return success(response);\n },\n\n // Discovery\n find: async (ctx: HandlerContext) => {\n const body = ctx.body as {\n types?: string[];\n testIdPattern?: string;\n accessibilityLabelPattern?: string;\n visibleOnly?: boolean;\n limit?: number;\n };\n\n const response = await executor.find({\n types: body?.types as any,\n testIdPattern: body?.testIdPattern,\n accessibilityLabelPattern: body?.accessibilityLabelPattern,\n visibleOnly: body?.visibleOnly,\n limit: body?.limit,\n });\n\n return success(response);\n },\n\n getSnapshot: async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx.query?.visibleOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.visibleOnly === true;\n const snapshot = registry.createSnapshot(undefined, { visibleOnly });\n return success(snapshot);\n },\n\n // Workflows\n getWorkflows: async () => {\n const workflows = registry.getAllWorkflows().map((w) => ({\n id: w.id,\n name: w.name,\n description: w.description,\n stepCount: w.steps.length,\n }));\n\n return success({ workflows });\n },\n\n runWorkflow: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const workflow = registry.getWorkflow(id);\n\n if (!workflow) {\n return error(`Workflow not found: ${id}`, 'WORKFLOW_NOT_FOUND');\n }\n\n const runId = `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const startTime = Date.now();\n const stepResults: WorkflowStepResult[] = [];\n let status: 'completed' | 'failed' = 'completed';\n\n registry.emit('workflow:started', {\n runId,\n workflowId: id,\n workflowName: workflow.name,\n totalSteps: workflow.steps.length,\n });\n\n for (const step of workflow.steps) {\n const stepResult = await executeWorkflowStep(step, registry, executor);\n stepResults.push(stepResult);\n\n if (stepResult.status === 'completed' || stepResult.status === 'skipped') {\n registry.emit('workflow:stepCompleted', {\n runId,\n workflowId: id,\n step: stepResult,\n });\n }\n\n if (stepResult.status === 'failed') {\n status = 'failed';\n registry.emit('workflow:failed', {\n runId,\n workflowId: id,\n failedStep: stepResult,\n completedSteps: stepResults.length - 1,\n totalSteps: workflow.steps.length,\n });\n break;\n }\n }\n\n if (status === 'completed') {\n registry.emit('workflow:completed', {\n runId,\n workflowId: id,\n steps: stepResults,\n totalDurationMs: Date.now() - startTime,\n });\n }\n\n return success({\n runId,\n status,\n steps: stepResults,\n totalSteps: workflow.steps.length,\n completedSteps: stepResults.filter((s) => s.status === 'completed').length,\n failedSteps: stepResults.filter((s) => s.status === 'failed').length,\n skippedSteps: stepResults.filter((s) => s.status === 'skipped').length,\n durationMs: Date.now() - startTime,\n });\n },\n\n // Page Navigation (stubs — React Native apps should override with their navigation provider)\n pageRefresh: async () => {\n return error('Page refresh not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageNavigate: async () => {\n return error('Page navigation not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageReplace: async () => {\n return error('Page replace not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageGoBack: async () => {\n return error('Page go back not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageGoForward: async () => {\n return error('Page go forward not supported on native platform', 'NOT_SUPPORTED');\n },\n\n // Screenshot (stub — apps should override with their screen capture library)\n getScreenshot: async () => {\n return error(\n 'Screenshot not supported. Provide a screenshotProvider to UIBridgeNativeProvider.',\n 'NOT_SUPPORTED'\n );\n },\n\n // Meta / Introspection (stub — server constructor overrides with real route table)\n getMethods: async () => {\n return error('Methods introspection not configured', 'NOT_SUPPORTED');\n },\n\n // Design Review\n ...designHandlers,\n\n // Health\n health: async () => {\n const stats = registry.getStats();\n const response: Record<string, unknown> = {\n status: 'healthy',\n timestamp: Date.now(),\n ...stats,\n };\n\n if (config?.appInfo) {\n response.uiBridge = {\n version: '0.3.0',\n ...config.appInfo,\n capabilities: ['elements', 'components', 'actions', 'design'],\n elementCount: stats.elements,\n componentCount: stats.components,\n };\n }\n\n return success(response as any);\n },\n };\n}\n","/**\n * WebSocket JSON-RPC message types for the UI Bridge protocol.\n */\n\n// ── Client → Server ─────────────────────────────────────────────────────────\n\n/** Standard JSON-RPC request */\nexport interface JsonRpcRequest {\n id: number | string;\n method: string;\n params?: Record<string, unknown>;\n}\n\n/** Batch request — execute multiple requests concurrently */\nexport interface JsonRpcBatchRequest {\n id: number | string;\n batch: JsonRpcRequest[];\n}\n\n/** Subscribe to registry events */\nexport interface JsonRpcSubscribe {\n id: number | string;\n method: 'subscribe';\n params: {\n events: string[];\n /** Optional throttle in ms — batch rapid events within this window */\n throttleMs?: number;\n };\n}\n\n/** Unsubscribe from registry events */\nexport interface JsonRpcUnsubscribe {\n id: number | string;\n method: 'unsubscribe';\n params: { events: string[] };\n}\n\n/** Any client message */\nexport type JsonRpcClientMessage =\n | JsonRpcRequest\n | JsonRpcBatchRequest\n | JsonRpcSubscribe\n | JsonRpcUnsubscribe;\n\n// ── Server → Client ─────────────────────────────────────────────────────────\n\n/** Standard JSON-RPC response */\nexport interface JsonRpcResponse {\n id: number | string;\n result?: {\n success: boolean;\n data?: unknown;\n error?: string;\n code?: string;\n timestamp?: number;\n };\n}\n\n/** Batch response */\nexport interface JsonRpcBatchResponse {\n id: number | string;\n results: JsonRpcResponse[];\n}\n\n/** Server-pushed event (no id — not a response to a request) */\nexport interface JsonRpcEvent {\n event: string;\n data: unknown;\n timestamp: number;\n}\n\n/** Any server message */\nexport type JsonRpcServerMessage = JsonRpcResponse | JsonRpcBatchResponse | JsonRpcEvent;\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Check if a message is a batch request */\nexport function isBatchRequest(msg: unknown): msg is JsonRpcBatchRequest {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'batch' in msg &&\n Array.isArray((msg as JsonRpcBatchRequest).batch)\n );\n}\n\n/** Check if a message is a subscribe request */\nexport function isSubscribe(msg: unknown): msg is JsonRpcSubscribe {\n return (\n typeof msg === 'object' && msg !== null && (msg as JsonRpcSubscribe).method === 'subscribe'\n );\n}\n\n/** Check if a message is an unsubscribe request */\nexport function isUnsubscribe(msg: unknown): msg is JsonRpcUnsubscribe {\n return (\n typeof msg === 'object' && msg !== null && (msg as JsonRpcUnsubscribe).method === 'unsubscribe'\n );\n}\n","/**\n * UI Bridge Native HTTP Server\n *\n * Abstract HTTP server implementation for React Native.\n * This provides a framework-agnostic server interface that can be\n * implemented using various React Native HTTP server libraries.\n *\n * Supported libraries:\n * - react-native-http-bridge (recommended)\n * - @aspect/react-native-http-server\n * - Custom implementations\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { NativeActionExecutor, PageNavigationResponse } from '../control/types';\nimport type {\n NativeServerConfig,\n NativeServerHandlers,\n NavigationProvider,\n RouteProvider,\n ScreenshotProvider,\n APIResponse,\n HandlerContext,\n} from './types';\nimport type { BridgeEvent } from '../core/types';\nimport { createServerHandlers } from './handlers';\nimport type { WebSocketEventBridge } from './ws-event-bridge';\nimport type { JsonRpcRequest, JsonRpcResponse } from './ws-types';\nimport { isBatchRequest, isSubscribe, isUnsubscribe } from './ws-types';\n\n// ── Path pattern matching ───────────────────────────────────────────────────\n\n/**\n * Match an actual path against a pattern with :name placeholders.\n * Returns extracted params, or null if the pattern does not match.\n *\n * Example: parsePath('control/element/:id/action', 'control/element/tab-runs/action')\n * → { id: 'tab-runs' }\n */\nfunction parsePath(pattern: string, actual: string): Record<string, string> | null {\n const patternParts = pattern.split('/');\n const actualParts = actual.split('/');\n\n if (patternParts.length !== actualParts.length) {\n return null;\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i].startsWith(':')) {\n params[patternParts[i].slice(1)] = actualParts[i];\n } else if (patternParts[i] !== actualParts[i]) {\n return null;\n }\n }\n return params;\n}\n\n// ── WebSocket route table ───────────────────────────────────────────────────\n\n/**\n * Route table for WebSocket JSON-RPC methods.\n *\n * Method strings use the same path structure as HTTP routes (with :id placeholders)\n * but without the /ui-bridge/ prefix. Path params are extracted automatically.\n *\n * Examples:\n * \"health\" → handlers.health\n * \"control/snapshot\" → handlers.getSnapshot\n * \"control/element/tab-runs/action\" → handlers.executeAction ({id: 'tab-runs'})\n * \"control/component/my-comp/action/submit\" → handlers.executeComponentAction\n */\ntype HandlerKey = keyof NativeServerHandlers;\ntype HttpVerb = 'GET' | 'POST' | 'DELETE';\n\ninterface WsRoute {\n pattern: string;\n handler: HandlerKey;\n /**\n * HTTP verbs this route accepts when invoked over HTTP. When absent the\n * route is WS-only (or matches any verb on HTTP). Multiple verbs allow\n * a single pattern to serve GET+POST etc.\n */\n httpMethods?: readonly HttpVerb[];\n}\n\nconst WS_ROUTES: readonly WsRoute[] = [\n // Health\n { pattern: 'health', handler: 'health', httpMethods: ['GET'] },\n\n // Elements\n { pattern: 'control/elements', handler: 'getElements', httpMethods: ['GET'] },\n // Flat alias — matches the runner UI Bridge's `/ui-bridge/elements` path so\n // agents can use the same URL across runner + mobile without remembering\n // the `control/` prefix. Delegates to the same handler.\n { pattern: 'elements', handler: 'getElements', httpMethods: ['GET'] },\n { pattern: 'control/element/:id', handler: 'getElement', httpMethods: ['GET'] },\n { pattern: 'control/element/:id/state', handler: 'getElementState', httpMethods: ['GET'] },\n { pattern: 'control/element/:id/action', handler: 'executeAction', httpMethods: ['POST'] },\n\n // Components\n { pattern: 'control/components', handler: 'getComponents', httpMethods: ['GET'] },\n { pattern: 'control/component/:id', handler: 'getComponent', httpMethods: ['GET'] },\n {\n pattern: 'control/component/:id/action/:actionId',\n handler: 'executeComponentAction',\n httpMethods: ['POST'],\n },\n\n // Discovery\n { pattern: 'control/find', handler: 'find', httpMethods: ['POST'] },\n { pattern: 'control/snapshot', handler: 'getSnapshot', httpMethods: ['GET'] },\n { pattern: 'control/discover', handler: 'getSnapshot' },\n\n // Workflows\n { pattern: 'control/workflows', handler: 'getWorkflows', httpMethods: ['GET'] },\n { pattern: 'control/workflow/:id/run', handler: 'runWorkflow', httpMethods: ['POST'] },\n\n // Page Navigation\n { pattern: 'control/page/refresh', handler: 'pageRefresh', httpMethods: ['POST'] },\n { pattern: 'control/page/navigate', handler: 'pageNavigate', httpMethods: ['POST'] },\n { pattern: 'control/page/replace', handler: 'pageReplace', httpMethods: ['POST'] },\n { pattern: 'control/page/back', handler: 'pageGoBack', httpMethods: ['POST'] },\n { pattern: 'control/page/forward', handler: 'pageGoForward', httpMethods: ['POST'] },\n\n // Screenshot — accepts both GET and POST on HTTP\n { pattern: 'control/screenshot', handler: 'getScreenshot', httpMethods: ['GET', 'POST'] },\n\n // Design Review\n { pattern: 'design/element/:id/styles', handler: 'getElementStyles', httpMethods: ['GET'] },\n {\n pattern: 'design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n httpMethods: ['POST'],\n },\n { pattern: 'design/snapshot', handler: 'getDesignSnapshot', httpMethods: ['POST'] },\n { pattern: 'design/responsive', handler: 'getResponsiveSnapshots', httpMethods: ['POST'] },\n { pattern: 'design/audit', handler: 'runDesignAudit', httpMethods: ['POST'] },\n { pattern: 'design/style-guide/load', handler: 'loadStyleGuide', httpMethods: ['POST'] },\n { pattern: 'design/style-guide', handler: 'getStyleGuide', httpMethods: ['GET'] },\n // style-guide/clear: WS uses this pattern; HTTP uses DELETE on /design/style-guide.\n // We keep a WS-only entry for the explicit \"clear\" subpath, and add a DELETE-on-style-guide entry.\n { pattern: 'design/style-guide/clear', handler: 'clearStyleGuide' },\n { pattern: 'design/style-guide', handler: 'clearStyleGuide', httpMethods: ['DELETE'] },\n\n // Quality Evaluation\n { pattern: 'design/evaluate', handler: 'evaluateQuality', httpMethods: ['POST'] },\n { pattern: 'design/evaluate/contexts', handler: 'getQualityContexts', httpMethods: ['GET'] },\n { pattern: 'design/evaluate/baseline', handler: 'saveBaseline', httpMethods: ['POST'] },\n { pattern: 'design/evaluate/diff', handler: 'diffBaseline', httpMethods: ['POST'] },\n\n // Meta / Introspection\n { pattern: 'meta/methods', handler: 'getMethods', httpMethods: ['GET'] },\n];\n\n// ── _help payload ───────────────────────────────────────────────────────────\n\n/**\n * Short description keyed by handler name — rendered alongside the route\n * list so `_help` is self-documenting. Only needs to cover handlers that\n * appear in WS_ROUTES.\n */\nconst HANDLER_DESCRIPTIONS: Record<string, string> = {\n health: 'Liveness probe; returns app metadata + element count',\n getElements: 'Flat list of registered UI elements',\n getElement: 'Single element by id',\n getElementState: 'Dynamic state (value, focused, checked) for one element',\n executeAction: 'Run an action on an element (see \"actions\" below for names)',\n getComponents: 'Higher-level components with action schemas',\n getComponent: 'Component detail + per-action paramSchema',\n executeComponentAction: 'Invoke a component action directly (preferred over button clicks)',\n find: 'AI-powered element search by natural-language query',\n getSnapshot:\n 'Full snapshot: elements + route + state. Supports ?visibleOnly=true and ?currentRouteOnly=true',\n getWorkflows: 'List registered workflows',\n runWorkflow: 'Trigger a workflow by id',\n pageRefresh: 'Reload the current route',\n pageNavigate: 'Imperative router.push(url) — preferred over tapping tab buttons',\n pageReplace: 'router.replace(url)',\n pageGoBack: 'router.back()',\n pageGoForward: 'router.forward()',\n getScreenshot: 'PNG screenshot of the current screen',\n getElementStyles: 'Computed styles for an element (design review)',\n getElementStateStyles: 'Computed styles per interaction state (hover/focus/disabled)',\n getDesignSnapshot: 'Visual + style snapshot for design review',\n getResponsiveSnapshots: 'Screenshots at multiple viewport widths',\n runDesignAudit: 'Accessibility + visual audit',\n loadStyleGuide: 'Load a design system style guide',\n getStyleGuide: 'Fetch the currently loaded style guide',\n clearStyleGuide: 'Unload the style guide',\n evaluateQuality: 'Score the current UI against a quality context',\n getQualityContexts: 'List available quality evaluation contexts',\n saveBaseline: 'Save a quality baseline snapshot',\n diffBaseline: 'Diff current UI against a saved baseline',\n getMethods: 'List every handler name (legacy introspection)',\n};\n\n/** Static reference for common action names + their params. */\nconst ACTION_REFERENCE = [\n { name: 'press', aliases: ['click'], params: 'PressActionParams (optional position)' },\n { name: 'longPress', params: 'PressActionParams (optional position)' },\n { name: 'doubleTap', params: 'none' },\n {\n name: 'type',\n params:\n 'TypeActionParams { text, delay?, clear? | clearFirst? } — `clear:true` replaces content atomically',\n },\n { name: 'clear', params: 'none — empties the input' },\n { name: 'focus', params: 'none' },\n { name: 'blur', params: 'none' },\n { name: 'scroll', params: 'ScrollActionParams { offset? {x,y}, to? }' },\n { name: 'swipe', params: 'SwipeActionParams { direction, distance }' },\n { name: 'toggle', params: 'none — flips boolean controls' },\n];\n\n/**\n * Minimal `{method, path}` list matching the runner's `/_routes` shape so\n * the same URL works across platforms. Expanded multi-verb routes into one\n * entry per verb.\n */\nfunction buildRoutesPayload() {\n const entries: Array<{ method: string; path: string }> = [];\n for (const r of WS_ROUTES) {\n if (!r.httpMethods) continue;\n for (const m of r.httpMethods) {\n entries.push({ method: m, path: `/ui-bridge/${r.pattern}` });\n }\n }\n // Expose the two discovery endpoints themselves so self-reference is clean.\n entries.push({ method: 'GET', path: '/ui-bridge/_help' });\n entries.push({ method: 'GET', path: '/ui-bridge/_routes' });\n entries.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));\n return { routes: entries, count: entries.length };\n}\n\n/**\n * Build the `/_help` payload: route index + action reference.\n * Cheap to compute; we don't cache since it's rarely called.\n */\nfunction buildHelpPayload() {\n return {\n version: 1,\n description: 'UI Bridge Native HTTP surface. Prefix every path with /ui-bridge/.',\n routes: WS_ROUTES.map((r) => ({\n pattern: r.pattern,\n httpMethods: r.httpMethods ?? [],\n wsOnly: !r.httpMethods,\n handler: r.handler,\n description: HANDLER_DESCRIPTIONS[r.handler] ?? '',\n })),\n actions: ACTION_REFERENCE,\n tips: [\n 'Start with `GET /ui-bridge/control/snapshot?visibleOnly=true` to see what the user actually sees.',\n 'Prefer `control/component/:id/action/:actionId` over button presses — typed paramSchema, no button-id guessing.',\n 'Use `pageNavigate` for tab switches instead of pressing tab buttons; gesture state often swallows clicks.',\n 'The `type` action supports `clear:true` to replace existing text atomically in one call.',\n ],\n };\n}\n\n/**\n * HTTP Request interface (library-agnostic)\n */\nexport interface HTTPRequest {\n method: string;\n path: string;\n headers: Record<string, string>;\n query: Record<string, string>;\n body?: unknown;\n}\n\n/**\n * HTTP Response interface (library-agnostic)\n */\nexport interface HTTPResponse {\n status: number;\n headers: Record<string, string>;\n body: string;\n}\n\n/**\n * Request handler type\n */\nexport type RequestHandler = (request: HTTPRequest) => Promise<HTTPResponse>;\n\n/**\n * Server adapter interface\n *\n * Implement this interface to integrate with your chosen HTTP server library.\n */\nexport interface ServerAdapter {\n /** Start the server */\n start(port: number, handler: RequestHandler): Promise<void>;\n /** Stop the server */\n stop(): Promise<void>;\n /** Check if server is running */\n isRunning(): boolean;\n}\n\n/**\n * WebSocket-aware server adapter interface.\n *\n * Extends ServerAdapter with callbacks for WebSocket connections.\n * The adapter manages the raw TCP/WS layer; these callbacks let the\n * UI Bridge server handle message routing and event broadcasting.\n */\nexport interface WebSocketServerAdapter extends ServerAdapter {\n /** Called when a JSON text frame is received from a WS client. Returns response string or null. */\n onWebSocketMessage?: (connId: string, message: string) => Promise<string | null>;\n /** Called when a new WS connection is established after the HTTP 101 upgrade. */\n onWebSocketConnect?: (connId: string) => void;\n /** Called when a WS connection is closed or drops. */\n onWebSocketDisconnect?: (connId: string) => void;\n /** Send a message to a specific WS connection by ID. */\n sendToConnection?: (connId: string, message: string) => void;\n /** Send a message to all connected WS clients. */\n broadcast?: (message: string) => void;\n}\n\n/**\n * Native UI Bridge HTTP Server\n */\nexport class NativeUIBridgeServer {\n private config: NativeServerConfig;\n private handlers: NativeServerHandlers;\n private adapter?: ServerAdapter;\n private running = false;\n /**\n * Per-connection cleanup thunks for in-flight waiters (waitForElement,\n * waitForCondition, ...). Aborted when a client disconnects so the\n * underlying timers/listeners don't leak.\n */\n private pendingWaiters = new Map<string, Set<() => void>>();\n\n constructor(\n private registry: NativeUIBridgeRegistry,\n private executor: NativeActionExecutor,\n config: NativeServerConfig = {}\n ) {\n this.config = {\n serverPort: 8087,\n cors: true,\n ...config,\n };\n this.handlers = createServerHandlers(registry, executor, {\n appInfo: this.config.appInfo,\n });\n\n // Set up method introspection from the route table\n this.handlers.getMethods = async () => {\n const methods = WS_ROUTES.map((r) => ({\n method: r.pattern,\n httpMethods: r.httpMethods ? [...r.httpMethods] : undefined,\n }));\n // Add special WebSocket-only methods not in the route table\n const wsMethods = [\n { method: 'waitForElement', description: 'Wait for an element to be registered' },\n { method: 'waitForCondition', description: 'Wait for an element state predicate' },\n { method: 'sequence', description: 'Execute a sequence of steps in order' },\n { method: 'events/history', description: 'Replay recent registry events' },\n { method: 'subscriptions/list', description: 'List current event subscriptions' },\n ];\n return {\n success: true,\n data: { methods: [...methods, ...wsMethods] },\n timestamp: Date.now(),\n };\n };\n }\n\n /**\n * Set the server adapter\n */\n setAdapter(adapter: ServerAdapter): void {\n this.adapter = adapter;\n }\n\n /**\n * Set a navigation provider for programmatic route navigation.\n * This enables `control/page/navigate` and `control/page/back` on native.\n */\n setNavigationProvider(provider: NavigationProvider): void {\n this.handlers.pageNavigate = async (ctx): Promise<APIResponse<PageNavigationResponse>> => {\n const body = ctx.body as Record<string, unknown> | undefined;\n const url = body?.url;\n if (!url || typeof url !== 'string') {\n return { success: false, error: 'Missing required \"url\" parameter', timestamp: Date.now() };\n }\n try {\n provider.navigate(url);\n return {\n success: true,\n data: { success: true, url, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: any) {\n return { success: false, error: `Navigation failed: ${e.message}`, timestamp: Date.now() };\n }\n };\n\n this.handlers.pageReplace = async (ctx): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.replace) {\n return {\n success: false,\n error: 'Replace navigation not supported by navigation provider',\n timestamp: Date.now(),\n };\n }\n const body = ctx.body as Record<string, unknown> | undefined;\n const url = body?.url;\n if (!url || typeof url !== 'string') {\n return { success: false, error: 'Missing required \"url\" parameter', timestamp: Date.now() };\n }\n try {\n provider.replace(url);\n return {\n success: true,\n data: { success: true, url, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: any) {\n return {\n success: false,\n error: `Replace navigation failed: ${e.message}`,\n timestamp: Date.now(),\n };\n }\n };\n\n this.handlers.pageGoBack = async (): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.back) {\n return { success: false, error: 'Back navigation not supported', timestamp: Date.now() };\n }\n try {\n provider.back();\n return {\n success: true,\n data: { success: true, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: any) {\n return {\n success: false,\n error: `Back navigation failed: ${e.message}`,\n timestamp: Date.now(),\n };\n }\n };\n\n this.handlers.pageRefresh = async (): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.refresh) {\n return {\n success: false,\n error: 'Page refresh not supported by navigation provider',\n timestamp: Date.now(),\n };\n }\n try {\n provider.refresh();\n return {\n success: true,\n data: { success: true, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: any) {\n return { success: false, error: `Refresh failed: ${e.message}`, timestamp: Date.now() };\n }\n };\n }\n\n /**\n * Set a route provider for reporting the current navigation route.\n * When set, `control/snapshot` responses include `currentRoute` and `segments`.\n */\n setRouteProvider(provider: RouteProvider): void {\n // Override getElements to support currentRouteOnly filtering with real route data\n const baseGetElements = this.handlers.getElements;\n this.handlers.getElements = async (ctx: HandlerContext) => {\n const currentRouteOnly =\n ctx.query?.currentRouteOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.currentRouteOnly === true;\n\n // If currentRouteOnly requested and no explicit route param, inject the current route\n if (currentRouteOnly && !ctx.query?.route && !(ctx.body as Record<string, unknown>)?.route) {\n const currentRoute = provider.getCurrentRoute();\n if (currentRoute) {\n // Inject route into query so the base handler can filter by it\n ctx.query = { ...ctx.query, route: currentRoute };\n }\n }\n return baseGetElements(ctx);\n };\n\n this.handlers.getSnapshot = async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx?.query?.visibleOnly === 'true' ||\n (ctx?.body as Record<string, unknown>)?.visibleOnly === true;\n const currentRouteOnly =\n ctx?.query?.currentRouteOnly === 'true' ||\n (ctx?.body as Record<string, unknown>)?.currentRouteOnly === true;\n const snapshot = this.registry.createSnapshot(\n {\n currentRoute: provider.getCurrentRoute(),\n segments: provider.getSegments?.(),\n },\n { visibleOnly, currentRouteOnly }\n );\n return { success: true, data: snapshot, timestamp: Date.now() };\n };\n }\n\n /**\n * Set a screenshot provider for native screen capture.\n * This enables `control/screenshot` on native.\n */\n setScreenshotProvider(provider: ScreenshotProvider): void {\n const SCREENSHOT_TIMEOUT_MS = 10_000;\n this.handlers.getScreenshot = async () => {\n try {\n const result = await Promise.race([\n provider.capture(),\n new Promise<never>((_, reject) =>\n setTimeout(\n () =>\n reject(new Error(`Screenshot capture timed out after ${SCREENSHOT_TIMEOUT_MS}ms`)),\n SCREENSHOT_TIMEOUT_MS\n )\n ),\n ]);\n return {\n success: true,\n data: { screenshot: result.base64, width: result.width, height: result.height },\n timestamp: Date.now(),\n };\n } catch (e: any) {\n return {\n success: false,\n error: `Screenshot capture failed: ${e.message}`,\n timestamp: Date.now(),\n };\n }\n };\n }\n\n /**\n * Start the HTTP server\n */\n async start(): Promise<void> {\n if (this.running) {\n console.warn('[ui-bridge-native] Server already running');\n return;\n }\n\n if (!this.adapter) {\n console.warn('[ui-bridge-native] No server adapter configured. Call setAdapter() first.');\n console.warn('[ui-bridge-native] See documentation for supported adapters.');\n return;\n }\n\n await this.adapter.start(this.config.serverPort!, this.handleRequest.bind(this));\n this.running = true;\n\n console.log(`[ui-bridge-native] HTTP server started on port ${this.config.serverPort}`);\n }\n\n /**\n * Stop the HTTP server\n */\n async stop(): Promise<void> {\n if (!this.running || !this.adapter) {\n return;\n }\n\n await this.adapter.stop();\n this.running = false;\n\n console.log('[ui-bridge-native] HTTP server stopped');\n }\n\n /**\n * Check if server is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n // ── WebSocket Support ───────────────────────────────────────────────────\n\n private eventBridge?: WebSocketEventBridge;\n\n /**\n * Set the event bridge for WebSocket event broadcasting and subscriptions.\n */\n setEventBridge(bridge: WebSocketEventBridge): void {\n this.eventBridge = bridge;\n }\n\n /**\n * Handle a JSON-RPC message from a WebSocket client.\n * Parses the message, routes to the appropriate handler, and returns\n * a JSON string response (or null for events that need no response).\n */\n async handleWebSocketMessage(connId: string, rawMessage: string): Promise<string | null> {\n let msg: unknown;\n try {\n msg = JSON.parse(rawMessage);\n } catch {\n return JSON.stringify({\n error: 'Invalid JSON',\n timestamp: Date.now(),\n });\n }\n\n if (typeof msg !== 'object' || msg === null) {\n return JSON.stringify({\n error: 'Message must be a JSON object',\n timestamp: Date.now(),\n });\n }\n\n const message = msg as Record<string, unknown>;\n const id = (message.id as string | number | undefined) ?? 0;\n\n // Handle batch requests\n if (isBatchRequest(message)) {\n const results = await this.handleBatchRequest(message.batch);\n return JSON.stringify({ id, results });\n }\n\n // Handle subscribe\n if (isSubscribe(message)) {\n const events = message.params?.events || [];\n const throttleMs = message.params?.throttleMs;\n const ok = this.eventBridge?.handleSubscribe(connId, events, throttleMs) ?? false;\n return JSON.stringify({\n id,\n result: {\n success: ok,\n data: { subscribed: events },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Handle unsubscribe\n if (isUnsubscribe(message)) {\n const events = message.params?.events || [];\n const ok = this.eventBridge?.handleUnsubscribe(connId, events) ?? false;\n return JSON.stringify({\n id,\n result: {\n success: ok,\n data: { unsubscribed: events },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const method = message.method as string;\n const params = (message.params || {}) as Record<string, unknown>;\n\n // ── Connection-aware special methods ──────────────────────────────────\n\n // subscriptions/list — return current subscriptions + throttle for this connection\n if (method === 'subscriptions/list') {\n const events = this.eventBridge?.getSubscriptions(connId) ?? [];\n const throttleMs = this.eventBridge?.getThrottleMs(connId);\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: { events, throttleMs: throttleMs ?? null },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // waitForElement — resolve when element is registered, or timeout\n if (method === 'waitForElement') {\n return this.handleWaitForElement(connId, id, params);\n }\n\n // waitForCondition — resolve when an element state predicate becomes true\n if (method === 'waitForCondition') {\n return this.handleWaitForCondition(connId, id, params);\n }\n\n // sequence — execute steps in order, stop on first failure\n if (method === 'sequence') {\n return this.handleSequence(id, params);\n }\n\n // events/history — replay recent events matching optional filter\n if (method === 'events/history') {\n const eventsFilter = Array.isArray(params.events) ? (params.events as string[]) : undefined;\n const since = typeof params.since === 'number' ? params.since : undefined;\n const limit = typeof params.limit === 'number' ? params.limit : undefined;\n const history = this.eventBridge?.getHistory({ events: eventsFilter, since }) ?? [];\n const sliced =\n limit !== undefined && limit > 0 && history.length > limit\n ? history.slice(history.length - limit)\n : history;\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: { events: sliced },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Standard JSON-RPC request\n\n if (!method) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing \"method\" field',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n try {\n const apiResponse = await this.routeMethodToHandler(method, params);\n return JSON.stringify({ id, result: apiResponse } satisfies JsonRpcResponse);\n } catch (error) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: error instanceof Error ? error.message : 'Internal error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n }\n\n /**\n * Execute a batch of JSON-RPC requests concurrently.\n */\n async handleBatchRequest(batch: JsonRpcRequest[]): Promise<JsonRpcResponse[]> {\n return Promise.all(\n batch.map(async (req) => {\n try {\n const result = await this.routeMethodToHandler(\n req.method,\n (req.params || {}) as Record<string, unknown>\n );\n return { id: req.id, result } as JsonRpcResponse;\n } catch (error) {\n return {\n id: req.id,\n result: {\n success: false,\n error: error instanceof Error ? error.message : 'Internal error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse;\n }\n })\n );\n }\n\n /**\n * Register an in-flight waiter's cleanup thunk under the given connection.\n * Returns an `unregister` thunk that the natural-resolution path should\n * call so the cleanup isn't re-invoked on disconnect.\n */\n private registerWaiter(connId: string, cleanup: () => void): () => void {\n let set = this.pendingWaiters.get(connId);\n if (!set) {\n set = new Set();\n this.pendingWaiters.set(connId, set);\n }\n set.add(cleanup);\n return () => {\n const s = this.pendingWaiters.get(connId);\n if (!s) return;\n s.delete(cleanup);\n if (s.size === 0) this.pendingWaiters.delete(connId);\n };\n }\n\n /**\n * Abort all pending waiters associated with a connection. Called by the\n * provider's WS disconnect handler so timers/listeners don't leak after\n * the client goes away.\n */\n abortWaitersForConnection(connId: string): void {\n const set = this.pendingWaiters.get(connId);\n if (!set) return;\n for (const cleanup of set) {\n try {\n cleanup();\n } catch (err) {\n console.warn('[ui-bridge-native] waiter cleanup threw:', err);\n }\n }\n this.pendingWaiters.delete(connId);\n }\n\n /**\n * Wait for an element to be registered, or resolve immediately if it already exists.\n * Returns a JsonRpcResponse JSON string.\n */\n private async handleWaitForElement(\n connId: string,\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const targetId = params.id;\n const timeout = typeof params.timeout === 'number' ? params.timeout : 10000;\n\n if (!targetId || typeof targetId !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"id\" parameter',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Already registered — return immediately\n const existing = this.registry.getElement(targetId);\n if (existing) {\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: {\n id: targetId,\n state: existing.getState(),\n identifier: existing.getIdentifier(),\n waited: false,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Wait for element:registered event with matching id, or timeout\n return new Promise<string>((resolve) => {\n let settled = false;\n let unsub: (() => void) | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let unregister: (() => void) | null = null;\n\n const cleanup = () => {\n if (settled) return;\n settled = true;\n if (unsub) {\n unsub();\n unsub = null;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (unregister) {\n unregister();\n unregister = null;\n }\n };\n\n // Track this waiter so it can be aborted if the connection closes.\n unregister = this.registerWaiter(connId, () => {\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Connection closed before element was registered',\n code: 'CONNECTION_CLOSED',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n unsub = this.registry.on('element:registered', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n\n cleanup();\n const el = this.registry.getElement(targetId);\n resolve(\n JSON.stringify({\n id,\n result: {\n success: true,\n data: {\n id: targetId,\n state: el?.getState() ?? null,\n identifier: el?.getIdentifier() ?? null,\n waited: true,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n timer = setTimeout(() => {\n if (settled) return;\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: `Timeout waiting for element: ${targetId}`,\n code: 'TIMEOUT',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n }, timeout);\n });\n }\n\n /**\n * Wait for an arbitrary element-state predicate to become true.\n *\n * Supported `condition` shapes:\n * {field: \"mounted\"|\"visible\"|\"enabled\"|\"focused\", equals: boolean}\n * {field: \"layout\", exists: true}\n * {field: string, equals: unknown} // generic: state[field] === equals\n *\n * Resolves immediately with `waited:false` if the predicate already\n * holds. Otherwise subscribes to `element:registered` and\n * `element:stateChanged` until the predicate matches or timeout fires.\n */\n private async handleWaitForCondition(\n connId: string,\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const targetId = params.elementId;\n const condition = params.condition as\n | { field?: string; equals?: unknown; exists?: boolean }\n | undefined;\n const timeout = typeof params.timeout === 'number' ? params.timeout : 10000;\n\n if (!targetId || typeof targetId !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"elementId\" parameter',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n if (!condition || typeof condition.field !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"condition.field\"',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const evaluate = (state: Record<string, unknown> | null | undefined): boolean => {\n if (!state) return false;\n const value = state[condition.field as string];\n if (condition.exists === true) return value !== null && value !== undefined;\n if ('equals' in condition) return value === condition.equals;\n return false;\n };\n\n const makeResult = (state: Record<string, unknown> | null, waited: boolean) =>\n JSON.stringify({\n id,\n result: {\n success: true,\n data: { id: targetId, state, waited },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n\n // Fast path: already holds.\n const existing = this.registry.getElement(targetId);\n if (existing) {\n const state = existing.getState() as unknown as Record<string, unknown> | null;\n if (evaluate(state)) {\n return makeResult(state, false);\n }\n }\n\n return new Promise<string>((resolve) => {\n let settled = false;\n let unsubRegistered: (() => void) | null = null;\n let unsubStateChanged: (() => void) | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let unregister: (() => void) | null = null;\n\n const cleanup = () => {\n if (settled) return;\n settled = true;\n if (unsubRegistered) {\n unsubRegistered();\n unsubRegistered = null;\n }\n if (unsubStateChanged) {\n unsubStateChanged();\n unsubStateChanged = null;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (unregister) {\n unregister();\n unregister = null;\n }\n };\n\n unregister = this.registerWaiter(connId, () => {\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Connection closed before condition was met',\n code: 'CONNECTION_CLOSED',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n const checkAndResolve = () => {\n if (settled) return;\n const el = this.registry.getElement(targetId);\n if (!el) return;\n const state = el.getState() as unknown as Record<string, unknown> | null;\n if (evaluate(state)) {\n cleanup();\n resolve(makeResult(state, true));\n }\n };\n\n unsubRegistered = this.registry.on('element:registered', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n checkAndResolve();\n });\n\n unsubStateChanged = this.registry.on('element:stateChanged', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n checkAndResolve();\n });\n\n timer = setTimeout(() => {\n if (settled) return;\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: `Timeout waiting for condition on element: ${targetId}`,\n code: 'TIMEOUT',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n }, timeout);\n });\n }\n\n /**\n * Execute a sequence of JSON-RPC steps in order, stopping on first failure.\n * Returns a JsonRpcResponse JSON string with per-step results.\n */\n private async handleSequence(\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const rawSteps = params.steps;\n\n if (!Array.isArray(rawSteps) || rawSteps.length === 0) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or empty \"steps\" array',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const steps = rawSteps as Array<{ method: string; params?: Record<string, unknown> }>;\n const results: Array<{ step: number; method: string; result: APIResponse }> = [];\n let allSuccess = true;\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n\n if (!step || typeof step.method !== 'string') {\n results.push({\n step: i,\n method: String(step?.method ?? ''),\n result: {\n success: false,\n error: 'Step is missing \"method\" field',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n });\n allSuccess = false;\n break;\n }\n\n try {\n const stepResult = await this.routeMethodToHandler(step.method, step.params ?? {});\n results.push({ step: i, method: step.method, result: stepResult });\n if (!stepResult.success) {\n allSuccess = false;\n break;\n }\n } catch (err) {\n results.push({\n step: i,\n method: step.method,\n result: {\n success: false,\n error: err instanceof Error ? err.message : 'Step execution failed',\n code: 'STEP_FAILED',\n timestamp: Date.now(),\n },\n });\n allSuccess = false;\n break;\n }\n }\n\n return JSON.stringify({\n id,\n result: {\n success: allSuccess,\n data: {\n completedSteps: results.length,\n totalSteps: steps.length,\n results,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n /**\n * Route a JSON-RPC method string to the appropriate handler using path-style matching.\n *\n * Method strings mirror HTTP routes but without the /ui-bridge/ prefix.\n * Path params are extracted from :name placeholders in the route pattern.\n *\n * Examples:\n * \"health\" → handlers.health\n * \"control/snapshot\" → handlers.getSnapshot\n * \"control/element/tab-runs/action\" → handlers.executeAction ({id:'tab-runs'})\n * \"control/component/my-comp/action/submit\" → handlers.executeComponentAction\n */\n private async routeMethodToHandler(\n method: string,\n params: Record<string, unknown>\n ): Promise<APIResponse> {\n for (const route of WS_ROUTES) {\n const pathParams = parsePath(route.pattern, method);\n if (!pathParams) continue;\n\n const ctx: HandlerContext = {\n params: pathParams,\n query:\n params.query && typeof params.query === 'object'\n ? (params.query as Record<string, string>)\n : {},\n body: params,\n };\n\n return this.handlers[route.handler](ctx);\n }\n\n return {\n success: false,\n error: `Unknown method: ${method}`,\n code: 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n\n /**\n * Handle incoming HTTP request\n *\n * Exposed as public so that CloudRelayClient can call it directly (without\n * loopback TCP overhead) when processing tunneled requests.\n */\n async handleRequest(request: HTTPRequest): Promise<HTTPResponse> {\n // Add CORS headers if enabled\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.cors) {\n headers['Access-Control-Allow-Origin'] = this.config.allowedOrigins\n ? this.config.allowedOrigins.join(',')\n : '*';\n headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS';\n headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization';\n }\n\n // Handle CORS preflight\n if (request.method === 'OPTIONS') {\n return { status: 204, headers, body: '' };\n }\n\n try {\n const response = await this.routeRequest(request);\n return {\n status: response.success ? 200 : 400,\n headers,\n body: JSON.stringify(response),\n };\n } catch (error) {\n const errorResponse: APIResponse = {\n success: false,\n error: error instanceof Error ? error.message : 'Internal server error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n };\n return {\n status: 500,\n headers,\n body: JSON.stringify(errorResponse),\n };\n }\n }\n\n /**\n * Route an HTTP request to the appropriate handler using WS_ROUTES.\n *\n * Strips the `/ui-bridge/` prefix from the path, then iterates the shared\n * WS_ROUTES table. Each route's `pattern` is matched against the stripped\n * path via the module-level `parsePath` helper; path params are merged\n * with the request body into a HandlerContext.\n *\n * `httpMethods` disambiguates routes that share a pattern but differ\n * by verb (e.g. GET vs DELETE on `design/style-guide`). A route without\n * `httpMethods` is WS-only and will not be matched on HTTP.\n */\n private async routeRequest(request: HTTPRequest): Promise<APIResponse> {\n const { method, path, query, body } = request;\n\n const PREFIX = '/ui-bridge/';\n if (!path.startsWith(PREFIX)) {\n return {\n success: false,\n error: `Route not found: ${method} ${path}`,\n code: 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n\n const stripped = path.slice(PREFIX.length);\n\n // Discoverability:\n // - `_help` (rich) — routes + action reference + tips\n // - `_routes` (minimal) — runner-compatible shape for parity\n // Lets agents fetch a single URL on either runner or mobile to see what\n // they can do without reading docs.\n if (method === 'GET' && stripped === '_help') {\n return {\n success: true,\n data: buildHelpPayload(),\n timestamp: Date.now(),\n };\n }\n if (method === 'GET' && stripped === '_routes') {\n return {\n success: true,\n data: buildRoutesPayload(),\n timestamp: Date.now(),\n };\n }\n\n let patternMatchedButWrongVerb = false;\n\n for (const route of WS_ROUTES) {\n const pathParams = parsePath(route.pattern, stripped);\n if (!pathParams) continue;\n\n // Pattern matches — now filter on HTTP verb.\n if (!route.httpMethods) {\n // WS-only route; don't serve on HTTP.\n continue;\n }\n if (!route.httpMethods.includes(method as HttpVerb)) {\n patternMatchedButWrongVerb = true;\n continue;\n }\n\n const ctx: HandlerContext = { params: pathParams, query, body };\n return this.handlers[route.handler](ctx);\n }\n\n return {\n success: false,\n error: patternMatchedButWrongVerb\n ? `Method not allowed: ${method} ${path}`\n : `Route not found: ${method} ${path}`,\n code: patternMatchedButWrongVerb ? 'METHOD_NOT_ALLOWED' : 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Create a UI Bridge Native server\n */\nexport function createNativeServer(\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor,\n config?: NativeServerConfig\n): NativeUIBridgeServer {\n return new NativeUIBridgeServer(registry, executor, config);\n}\n\n/**\n * Example adapter using react-native-http-bridge\n *\n * To use this adapter:\n * 1. Install: npm install react-native-http-bridge\n * 2. Link native modules\n * 3. Create adapter and pass to server\n *\n * ```tsx\n * import httpBridge from 'react-native-http-bridge';\n *\n * const adapter: ServerAdapter = {\n * start: async (port, handler) => {\n * httpBridge.start(port, 'ui-bridge', async (request) => {\n * const response = await handler({\n * method: request.type,\n * path: request.url,\n * headers: request.headers || {},\n * query: parseQuery(request.url),\n * body: request.postData ? JSON.parse(request.postData) : undefined,\n * });\n * httpBridge.respond(\n * request.requestId,\n * response.status,\n * response.headers['Content-Type'],\n * response.body\n * );\n * });\n * },\n * stop: async () => {\n * httpBridge.stop();\n * },\n * isRunning: () => true,\n * };\n *\n * server.setAdapter(adapter);\n * await server.start();\n * ```\n */\n","/**\n * Pure-JS RFC 6455 WebSocket protocol implementation.\n *\n * Provides frame encoding/decoding and handshake utilities for running\n * a WebSocket server on react-native-tcp-socket without native crypto deps.\n */\n\n// ── Constants ───────────────────────────────────────────────────────────────\n\nconst WS_GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';\n\nexport const OPCODE_CONTINUATION = 0x00;\nexport const OPCODE_TEXT = 0x01;\nexport const OPCODE_BINARY = 0x02;\nexport const OPCODE_CLOSE = 0x08;\nexport const OPCODE_PING = 0x09;\nexport const OPCODE_PONG = 0x0a;\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface DecodedFrame {\n opcode: number;\n fin: boolean;\n payload: Uint8Array;\n masked: boolean;\n}\n\nexport interface DecodeResult {\n frames: DecodedFrame[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n remainder: Uint8Array<any>;\n}\n\n// ── SHA-1 (Pure JS) ─────────────────────────────────────────────────────────\n// Minimal inline SHA-1 per FIPS 180-4. Used only for the WS handshake.\n\nfunction sha1Bytes(input: Uint8Array): Uint8Array {\n const ml = input.length * 8;\n\n // Pre-processing: pad to 512-bit blocks\n const padLen = 64 - ((input.length + 9) % 64);\n const total = input.length + 1 + (padLen === 64 ? 0 : padLen) + 8;\n const msg = new Uint8Array(total);\n msg.set(input);\n msg[input.length] = 0x80;\n // Length in bits as 64-bit big-endian (we only use 32-bit since messages are small)\n const dv = new DataView(msg.buffer);\n dv.setUint32(total - 4, ml, false);\n\n // Initialize hash values\n let h0 = 0x67452301;\n let h1 = 0xefcdab89;\n let h2 = 0x98badcfe;\n let h3 = 0x10325476;\n let h4 = 0xc3d2e1f0;\n\n const w = new Uint32Array(80);\n\n for (let offset = 0; offset < total; offset += 64) {\n const block = new DataView(msg.buffer, offset, 64);\n\n for (let i = 0; i < 16; i++) {\n w[i] = block.getUint32(i * 4, false);\n }\n for (let i = 16; i < 80; i++) {\n const x = w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16];\n w[i] = (x << 1) | (x >>> 31);\n }\n\n let a = h0,\n b = h1,\n c = h2,\n d = h3,\n e = h4;\n\n for (let i = 0; i < 80; i++) {\n let f: number, k: number;\n if (i < 20) {\n f = (b & c) | (~b & d);\n k = 0x5a827999;\n } else if (i < 40) {\n f = b ^ c ^ d;\n k = 0x6ed9eba1;\n } else if (i < 60) {\n f = (b & c) | (b & d) | (c & d);\n k = 0x8f1bbcdc;\n } else {\n f = b ^ c ^ d;\n k = 0xca62c1d6;\n }\n\n const temp = (((a << 5) | (a >>> 27)) + f + e + k + w[i]) | 0;\n e = d;\n d = c;\n c = (b << 30) | (b >>> 2);\n b = a;\n a = temp;\n }\n\n h0 = (h0 + a) | 0;\n h1 = (h1 + b) | 0;\n h2 = (h2 + c) | 0;\n h3 = (h3 + d) | 0;\n h4 = (h4 + e) | 0;\n }\n\n const result = new Uint8Array(20);\n const rdv = new DataView(result.buffer);\n rdv.setUint32(0, h0, false);\n rdv.setUint32(4, h1, false);\n rdv.setUint32(8, h2, false);\n rdv.setUint32(12, h3, false);\n rdv.setUint32(16, h4, false);\n return result;\n}\n\nconst B64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n/**\n * Manual base64 encoder — avoids Hermes btoa() which can silently corrupt\n * binary strings containing bytes > 127 (common in SHA-1 output).\n */\nfunction bytesToBase64(bytes: Uint8Array): string {\n let result = '';\n const len = bytes.length;\n for (let i = 0; i < len; i += 3) {\n const b0 = bytes[i];\n const b1 = i + 1 < len ? bytes[i + 1] : 0;\n const b2 = i + 2 < len ? bytes[i + 2] : 0;\n const triplet = (b0 << 16) | (b1 << 8) | b2;\n\n result += B64_CHARS[(triplet >> 18) & 0x3f];\n result += B64_CHARS[(triplet >> 12) & 0x3f];\n result += i + 1 < len ? B64_CHARS[(triplet >> 6) & 0x3f] : '=';\n result += i + 2 < len ? B64_CHARS[triplet & 0x3f] : '=';\n }\n return result;\n}\n\n// ── Handshake ───────────────────────────────────────────────────────────────\n\n/**\n * Compute the Sec-WebSocket-Accept value from the client's Sec-WebSocket-Key.\n */\nexport function computeAcceptKey(clientKey: string): string {\n const input = clientKey + WS_GUID;\n const encoder = new TextEncoder();\n const hash = sha1Bytes(encoder.encode(input));\n return bytesToBase64(hash);\n}\n\n/**\n * Build the HTTP 101 Switching Protocols response for a WebSocket upgrade.\n */\nexport function buildUpgradeResponse(clientKey: string): string {\n const accept = computeAcceptKey(clientKey);\n return (\n 'HTTP/1.1 101 Switching Protocols\\r\\n' +\n 'Upgrade: websocket\\r\\n' +\n 'Connection: Upgrade\\r\\n' +\n `Sec-WebSocket-Accept: ${accept}\\r\\n` +\n '\\r\\n'\n );\n}\n\n// ── Frame Encoding (Server → Client, unmasked) ─────────────────────────────\n\nfunction encodeFrame(opcode: number, payload: Uint8Array): Uint8Array {\n const len = payload.length;\n let headerLen: number;\n\n if (len < 126) {\n headerLen = 2;\n } else if (len < 65536) {\n headerLen = 4;\n } else {\n headerLen = 10;\n }\n\n const frame = new Uint8Array(headerLen + len);\n frame[0] = 0x80 | opcode; // FIN + opcode\n\n if (len < 126) {\n frame[1] = len; // No mask bit (server → client)\n } else if (len < 65536) {\n frame[1] = 126;\n frame[2] = (len >> 8) & 0xff;\n frame[3] = len & 0xff;\n } else {\n frame[1] = 127;\n // For payloads > 65535, use 8-byte length (upper 4 bytes zero for practical sizes)\n const dv = new DataView(frame.buffer, 2, 8);\n dv.setUint32(0, 0, false);\n dv.setUint32(4, len, false);\n }\n\n frame.set(payload, headerLen);\n return frame;\n}\n\n/** Encode a text message as a WebSocket frame. */\nexport function encodeTextFrame(text: string): Uint8Array {\n const payload = new TextEncoder().encode(text);\n return encodeFrame(OPCODE_TEXT, payload);\n}\n\n/** Encode a PING frame with optional payload. */\nexport function encodePingFrame(payload?: Uint8Array): Uint8Array {\n return encodeFrame(OPCODE_PING, payload ?? new Uint8Array(0));\n}\n\n/** Encode a PONG frame with the payload from the PING. */\nexport function encodePongFrame(payload: Uint8Array): Uint8Array {\n return encodeFrame(OPCODE_PONG, payload);\n}\n\n/** Encode a CLOSE frame with optional status code and reason. */\nexport function encodeCloseFrame(code?: number, reason?: string): Uint8Array {\n if (code === undefined) {\n return encodeFrame(OPCODE_CLOSE, new Uint8Array(0));\n }\n const reasonBytes = reason ? new TextEncoder().encode(reason) : new Uint8Array(0);\n const payload = new Uint8Array(2 + reasonBytes.length);\n payload[0] = (code >> 8) & 0xff;\n payload[1] = code & 0xff;\n payload.set(reasonBytes, 2);\n return encodeFrame(OPCODE_CLOSE, payload);\n}\n\n// ── Frame Decoding (Client → Server, masked) ───────────────────────────────\n\n/**\n * Decode one or more WebSocket frames from a byte buffer.\n * Returns decoded frames and any unconsumed bytes (for partial frames).\n */\nexport function decodeFrames(buffer: Uint8Array): DecodeResult {\n const frames: DecodedFrame[] = [];\n let offset = 0;\n\n while (offset < buffer.length) {\n // Need at least 2 bytes for the header\n if (buffer.length - offset < 2) break;\n\n const byte0 = buffer[offset];\n const byte1 = buffer[offset + 1];\n\n const fin = (byte0 & 0x80) !== 0;\n const opcode = byte0 & 0x0f;\n const masked = (byte1 & 0x80) !== 0;\n let payloadLen = byte1 & 0x7f;\n\n let headerLen = 2;\n\n if (payloadLen === 126) {\n if (buffer.length - offset < 4) break;\n payloadLen = (buffer[offset + 2] << 8) | buffer[offset + 3];\n headerLen = 4;\n } else if (payloadLen === 127) {\n if (buffer.length - offset < 10) break;\n const dv = new DataView(buffer.buffer, buffer.byteOffset + offset + 2, 8);\n payloadLen = dv.getUint32(4, false); // Use lower 32 bits only\n headerLen = 10;\n }\n\n if (masked) {\n headerLen += 4; // 4-byte masking key\n }\n\n const totalLen = headerLen + payloadLen;\n if (buffer.length - offset < totalLen) break; // Partial frame\n\n // Extract and unmask payload\n const payload = new Uint8Array(payloadLen);\n const dataStart = offset + headerLen;\n\n if (masked) {\n const maskOffset = offset + headerLen - 4;\n const mask = buffer.slice(maskOffset, maskOffset + 4);\n for (let i = 0; i < payloadLen; i++) {\n payload[i] = buffer[dataStart + i] ^ mask[i % 4];\n }\n } else {\n payload.set(buffer.slice(dataStart, dataStart + payloadLen));\n }\n\n frames.push({ opcode, fin, payload, masked });\n offset += totalLen;\n }\n\n return {\n frames,\n remainder: new Uint8Array(buffer.slice(offset)),\n };\n}\n\n/**\n * Decode a text payload from a Uint8Array.\n */\nexport function decodeTextPayload(payload: Uint8Array): string {\n return new TextDecoder().decode(payload);\n}\n","/**\n * Bridges NativeUIBridgeRegistry events to WebSocket clients.\n *\n * Subscribes to all registry event types and broadcasts them as\n * JsonRpcEvent messages to connected WebSocket clients based on\n * their per-connection subscription sets.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { BridgeEventType, BridgeEvent } from '../core/types';\nimport type { WebSocketConnection } from './ws-connection';\nimport type { JsonRpcEvent } from './ws-types';\n\n/** All event types the bridge can subscribe to */\nconst BRIDGE_EVENT_TYPES: BridgeEventType[] = [\n 'element:registered',\n 'element:unregistered',\n 'element:stateChanged',\n 'component:registered',\n 'component:unregistered',\n 'action:started',\n 'action:completed',\n 'action:failed',\n 'workflow:started',\n 'workflow:stepCompleted',\n 'workflow:completed',\n 'workflow:failed',\n 'render:snapshot',\n 'error',\n];\n\n/** Per-connection throttle state for batching rapid events */\ninterface ThrottleState {\n ms: number;\n pending: JsonRpcEvent[];\n timer: ReturnType<typeof setTimeout> | null;\n}\n\n// ── Glob pattern matching ───────────────────────────────────────────────────\n\n/** Cache of compiled glob→RegExp to avoid recompiling hot patterns. */\nconst GLOB_CACHE = new Map<string, RegExp>();\n\n/**\n * Convert a glob-style pattern (supports `*` / `**` wildcards) to a RegExp.\n * All other regex metacharacters are escaped, so colons and other\n * event-name characters pass through literally.\n *\n * globToRegex(\"*\") → /^.*$/\n * globToRegex(\"element:*\") → /^element:.*$/\n * globToRegex(\"*:stateChanged\") → /^.*:stateChanged$/\n */\nexport function globToRegex(pattern: string): RegExp {\n const cached = GLOB_CACHE.get(pattern);\n if (cached) return cached;\n\n // Normalize ** → * (same semantics for flat event names)\n const normalized = pattern.replace(/\\*\\*/g, '*');\n // Escape regex metacharacters except '*'\n const escaped = normalized.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\n // Replace '*' with '.*'\n const body = escaped.replace(/\\*/g, '.*');\n const regex = new RegExp(`^${body}$`);\n GLOB_CACHE.set(pattern, regex);\n return regex;\n}\n\n/** Options for the WebSocketEventBridge constructor. */\nexport interface WebSocketEventBridgeOptions {\n /** Heartbeat ping interval in ms (default 30000) */\n heartbeatIntervalMs?: number;\n /** Max number of events to retain in the replay history buffer (default 100, 0 disables) */\n maxHistory?: number;\n}\n\nexport class WebSocketEventBridge {\n private connections = new Map<string, WebSocketConnection>();\n private throttles = new Map<string, ThrottleState>();\n private unsubscribers: Array<() => void> = [];\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private registry: NativeUIBridgeRegistry;\n private heartbeatIntervalMs: number;\n /**\n * True ring buffer for event replay history.\n *\n * `historyBuf` is a fixed-capacity slot array; `historyHead` points at the\n * NEXT write position; `historyCount` is the number of valid slots\n * (clamped to capacity). Append is O(1) — no array shifting.\n */\n private historyBuf: (JsonRpcEvent | undefined)[] = [];\n private historyHead = 0;\n private historyCount = 0;\n\n constructor(\n registry: NativeUIBridgeRegistry,\n optionsOrHeartbeatMs: WebSocketEventBridgeOptions | number = {}\n ) {\n this.registry = registry;\n // Accept legacy positional number form\n const opts: WebSocketEventBridgeOptions =\n typeof optionsOrHeartbeatMs === 'number'\n ? { heartbeatIntervalMs: optionsOrHeartbeatMs }\n : optionsOrHeartbeatMs;\n this.heartbeatIntervalMs = opts.heartbeatIntervalMs ?? 30000;\n const cap = Math.max(0, (opts.maxHistory ?? 100) | 0);\n this.historyBuf = cap > 0 ? new Array(cap) : [];\n }\n\n /** Effective ring buffer capacity. 0 means history is disabled. */\n private get historyCapacity(): number {\n return this.historyBuf.length;\n }\n\n /**\n * Start listening to registry events and broadcasting to WS clients.\n * Also starts the heartbeat timer.\n */\n start(): void {\n for (const eventType of BRIDGE_EVENT_TYPES) {\n const unsub = this.registry.on(eventType, (event: BridgeEvent) => {\n this.broadcastEvent(eventType, event.data);\n });\n this.unsubscribers.push(unsub);\n }\n\n this.startHeartbeat();\n }\n\n /** Stop listening to registry events and clear connections. */\n stop(): void {\n for (const unsub of this.unsubscribers) {\n unsub();\n }\n this.unsubscribers = [];\n\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n // Clean up throttle timers\n for (const throttle of this.throttles.values()) {\n if (throttle.timer) clearTimeout(throttle.timer);\n }\n this.throttles.clear();\n\n // Close all connections\n for (const conn of this.connections.values()) {\n conn.close(1001, 'Server shutting down');\n }\n this.connections.clear();\n this.historyBuf.fill(undefined);\n this.historyHead = 0;\n this.historyCount = 0;\n }\n\n /** Register a new WebSocket connection. */\n addConnection(conn: WebSocketConnection): void {\n this.connections.set(conn.id, conn);\n }\n\n /** Remove a WebSocket connection (called on disconnect). */\n removeConnection(connId: string): void {\n this.connections.delete(connId);\n const throttle = this.throttles.get(connId);\n if (throttle?.timer) clearTimeout(throttle.timer);\n this.throttles.delete(connId);\n }\n\n /** Get the number of active connections. */\n get connectionCount(): number {\n return this.connections.size;\n }\n\n /**\n * Add event subscriptions for a connection.\n *\n * Event names are stored as glob patterns. Supported forms:\n * - Exact: \"element:registered\"\n * - Prefix: \"element:*\"\n * - Suffix: \"*:stateChanged\"\n * - All: \"*\"\n *\n * @param throttleMs — if >0, batch rapid events within this window before sending\n */\n handleSubscribe(connId: string, events: string[], throttleMs?: number): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n for (const event of events) {\n conn.subscriptions.add(event);\n }\n if (throttleMs && throttleMs > 0) {\n this.throttles.set(connId, { ms: throttleMs, pending: [], timer: null });\n }\n return true;\n }\n\n /**\n * Remove event subscriptions for a connection.\n * If all subscriptions are cleared, also drops the throttle entry\n * (and any pending flush timer) so a subsequent resubscribe starts clean.\n */\n handleUnsubscribe(connId: string, events: string[]): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n for (const event of events) {\n conn.subscriptions.delete(event);\n }\n if (conn.subscriptions.size === 0) {\n const throttle = this.throttles.get(connId);\n if (throttle?.timer) clearTimeout(throttle.timer);\n this.throttles.delete(connId);\n }\n return true;\n }\n\n /**\n * Get the subscription set for a connection.\n * Returns the original pattern strings (not compiled regexes).\n */\n getSubscriptions(connId: string): string[] {\n const conn = this.connections.get(connId);\n return conn ? Array.from(conn.subscriptions) : [];\n }\n\n /**\n * Check if a connection is subscribed to a specific event.\n * Matches exact names first (fast path), then tests each stored\n * pattern as a glob against the event type.\n */\n isSubscribed(connId: string, eventType: string): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n // Fast path: exact match\n if (conn.subscriptions.has(eventType)) return true;\n // Glob path: test each pattern\n for (const pattern of conn.subscriptions) {\n // Skip exact names with no wildcard — already tested above\n if (!pattern.includes('*')) continue;\n if (globToRegex(pattern).test(eventType)) return true;\n }\n return false;\n }\n\n /** Get the throttle window (in ms) configured for a connection, or undefined if none. */\n getThrottleMs(connId: string): number | undefined {\n return this.throttles.get(connId)?.ms;\n }\n\n /**\n * Get recent events from the replay history buffer.\n *\n * @param filter.events — optional list of glob patterns to match event types against\n * @param filter.since — optional timestamp (ms); only events at or after this time\n */\n getHistory(filter?: { events?: string[]; since?: number }): JsonRpcEvent[] {\n const cap = this.historyCapacity;\n if (cap === 0 || this.historyCount === 0) return [];\n\n const since = filter?.since;\n const regexes = filter?.events?.map((p) => globToRegex(p));\n\n // Walk the ring buffer in chronological (oldest → newest) order.\n const start = (this.historyHead - this.historyCount + cap) % cap;\n const out: JsonRpcEvent[] = [];\n for (let i = 0; i < this.historyCount; i++) {\n const e = this.historyBuf[(start + i) % cap];\n if (!e) continue;\n if (since !== undefined && e.timestamp < since) continue;\n if (regexes && regexes.length > 0 && !regexes.some((r) => r.test(e.event))) continue;\n out.push(e);\n }\n return out;\n }\n\n /**\n * Configure the max history buffer size at runtime. 0 disables history.\n * Reallocates the ring buffer, preserving the most recent\n * min(historyCount, newCapacity) events in chronological order.\n */\n setMaxHistory(maxHistory: number): void {\n const newCap = Math.max(0, maxHistory | 0);\n if (newCap === this.historyCapacity) return;\n\n if (newCap === 0) {\n this.historyBuf = [];\n this.historyHead = 0;\n this.historyCount = 0;\n return;\n }\n\n // Preserve the latest min(count, newCap) events.\n const oldCap = this.historyCapacity;\n const keep = Math.min(this.historyCount, newCap);\n const newBuf: (JsonRpcEvent | undefined)[] = new Array(newCap);\n if (keep > 0 && oldCap > 0) {\n // Source range: the last `keep` events ending just before historyHead.\n const start = (this.historyHead - keep + oldCap) % oldCap;\n for (let i = 0; i < keep; i++) {\n newBuf[i] = this.historyBuf[(start + i) % oldCap];\n }\n }\n this.historyBuf = newBuf;\n this.historyCount = keep;\n this.historyHead = keep % newCap;\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n private broadcastEvent(eventType: string, data: unknown): void {\n const event: JsonRpcEvent = {\n event: eventType,\n data,\n timestamp: Date.now(),\n };\n\n // Append to ring buffer — O(1), no shifting.\n const cap = this.historyCapacity;\n if (cap > 0) {\n this.historyBuf[this.historyHead] = event;\n this.historyHead = (this.historyHead + 1) % cap;\n if (this.historyCount < cap) this.historyCount++;\n }\n\n for (const [connId, conn] of this.connections) {\n const throttle = this.throttles.get(connId);\n if (throttle) {\n this.enqueueThrottled(connId, conn, throttle, event);\n } else {\n conn.sendEvent(event);\n }\n }\n }\n\n /** Queue an event for throttled delivery, flushing after the throttle window. */\n private enqueueThrottled(\n connId: string,\n conn: WebSocketConnection,\n throttle: ThrottleState,\n event: JsonRpcEvent\n ): void {\n throttle.pending.push(event);\n if (throttle.timer) return; // Flush already scheduled\n\n throttle.timer = setTimeout(() => {\n const events = throttle.pending.splice(0);\n throttle.timer = null;\n // Verify connection still exists\n if (!this.connections.has(connId)) return;\n for (const e of events) {\n conn.sendEvent(e);\n }\n }, throttle.ms);\n }\n\n private startHeartbeat(): void {\n this.heartbeatTimer = setInterval(() => {\n for (const [id, conn] of this.connections) {\n if (!conn.isOpen) {\n this.connections.delete(id);\n continue;\n }\n\n if (!conn.alive) {\n // Missed previous ping — connection is dead\n console.warn(`[ws-event-bridge] Connection ${id} missed heartbeat, closing`);\n conn.close(1001, 'Heartbeat timeout');\n this.connections.delete(id);\n continue;\n }\n\n // Mark as not-alive, send ping. If pong arrives, alive is set back to true.\n conn.alive = false;\n conn.ping();\n }\n }, this.heartbeatIntervalMs);\n }\n}\n","/**\n * WebSocket connection wrapper for the UI Bridge server.\n *\n * Manages a single WebSocket connection after the HTTP upgrade handshake,\n * handling frame-level I/O, heartbeat, and event subscriptions.\n */\n\nimport {\n decodeFrames,\n decodeTextPayload,\n encodeTextFrame,\n encodePingFrame,\n encodePongFrame,\n encodeCloseFrame,\n OPCODE_TEXT,\n OPCODE_CLOSE,\n OPCODE_PING,\n OPCODE_PONG,\n OPCODE_CONTINUATION,\n type DecodedFrame,\n} from './ws-protocol';\nimport type { JsonRpcEvent } from './ws-types';\nimport { globToRegex } from './ws-event-bridge';\n\n/**\n * Callback for text messages received from the client.\n * Returns a response string to send back, or null for no response.\n */\nexport type WebSocketMessageHandler = (connId: string, message: string) => Promise<string | null>;\n\nexport class WebSocketConnection {\n readonly id: string;\n readonly subscriptions = new Set<string>();\n\n /** Heartbeat liveness flag — set false before ping, set true on pong */\n alive = true;\n\n private socket: {\n write: (data: Uint8Array | string, encoding?: string, cb?: () => void) => void;\n destroy: () => void;\n on: (event: string, handler: (...args: unknown[]) => void) => void;\n removeAllListeners: (event?: string) => void;\n setNoDelay?: (noDelay: boolean) => void;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private buffer: Uint8Array<any> = new Uint8Array(0);\n private fragmentBuffer: Uint8Array[] = [];\n private fragmentOpcode = 0;\n private closed = false;\n private onMessage: WebSocketMessageHandler;\n private onClose: (connId: string) => void;\n\n constructor(\n id: string,\n socket: WebSocketConnection['socket'],\n onMessage: WebSocketMessageHandler,\n onClose: (connId: string) => void\n ) {\n this.id = id;\n this.socket = socket;\n this.onMessage = onMessage;\n this.onClose = onClose;\n\n // Disable Nagle's algorithm for low latency\n if (socket.setNoDelay) {\n socket.setNoDelay(true);\n }\n\n // Wire up data handler\n socket.on('data', (data: unknown) => {\n if (this.closed) return;\n const chunk =\n data instanceof Uint8Array\n ? data\n : typeof data === 'string'\n ? new TextEncoder().encode(data)\n : new Uint8Array(data as ArrayBuffer);\n this.handleData(chunk);\n });\n\n socket.on('error', () => {\n this.destroy();\n });\n\n socket.on('close', () => {\n this.destroy();\n });\n }\n\n /** Send a text message to the client. */\n send(message: string): void {\n if (this.closed) return;\n try {\n const frame = encodeTextFrame(message);\n this.writeRaw(frame);\n } catch {\n // Socket may be closed\n }\n }\n\n /**\n * Send an event if the client is subscribed to it. Subscription patterns\n * may be exact event names, `*` (all), or glob patterns containing `*`\n * (e.g. `element:*`, `*:stateChanged`). Exact matches and `*` are checked\n * via fast Set lookups; glob patterns fall through to a regex test.\n */\n sendEvent(event: JsonRpcEvent): void {\n if (this.closed) return;\n if (!this.matchesSubscription(event.event)) return;\n this.send(JSON.stringify(event));\n }\n\n private matchesSubscription(eventType: string): boolean {\n // Fast paths\n if (this.subscriptions.has(eventType)) return true;\n if (this.subscriptions.has('*')) return true;\n // Glob fallback — only patterns containing `*` (other than the bare `*`\n // already handled above) need the regex test.\n for (const pattern of this.subscriptions) {\n if (!pattern.includes('*')) continue;\n if (globToRegex(pattern).test(eventType)) return true;\n }\n return false;\n }\n\n /** Send a ping frame for heartbeat. */\n ping(): void {\n if (this.closed) return;\n try {\n this.writeRaw(encodePingFrame());\n } catch {\n // Socket may be closed\n }\n }\n\n /** Close the connection gracefully. */\n close(code = 1000, reason = ''): void {\n if (this.closed) return;\n this.closed = true;\n try {\n this.writeRaw(encodeCloseFrame(code, reason));\n // Give the frame time to flush before destroying\n setTimeout(() => this.socket.destroy(), 100);\n } catch {\n this.socket.destroy();\n }\n this.onClose(this.id);\n }\n\n /** Forcefully destroy the connection without a close frame. */\n destroy(): void {\n if (this.closed) return;\n this.closed = true;\n try {\n this.socket.destroy();\n } catch {\n // Already destroyed\n }\n this.onClose(this.id);\n }\n\n /** Whether the connection is still open. */\n get isOpen(): boolean {\n return !this.closed;\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n private writeRaw(data: Uint8Array): void {\n // react-native-tcp-socket write() accepts Buffer/Uint8Array/string.\n // Convert to binary string for compatibility with all socket implementations.\n // Use chunked String.fromCharCode to avoid call-stack limits on large payloads\n // while staying O(n) instead of O(n^2) from single-char concatenation.\n const CHUNK = 8192;\n const parts: string[] = [];\n for (let i = 0; i < data.length; i += CHUNK) {\n const end = Math.min(i + CHUNK, data.length);\n parts.push(String.fromCharCode.apply(null, data.subarray(i, end) as unknown as number[]));\n }\n this.socket.write(parts.join(''), 'binary');\n }\n\n private handleData(chunk: Uint8Array): void {\n // Append to buffer\n const newBuffer = new Uint8Array(this.buffer.length + chunk.length);\n newBuffer.set(this.buffer);\n newBuffer.set(chunk, this.buffer.length);\n this.buffer = newBuffer;\n\n // Decode frames\n const { frames, remainder } = decodeFrames(this.buffer);\n this.buffer = remainder;\n\n for (const frame of frames) {\n this.handleFrame(frame);\n }\n }\n\n private handleFrame(frame: DecodedFrame): void {\n // Handle fragmented messages\n if (!frame.fin && frame.opcode !== OPCODE_CONTINUATION) {\n // Start of fragmented message\n this.fragmentBuffer = [frame.payload];\n this.fragmentOpcode = frame.opcode;\n return;\n }\n\n if (frame.opcode === OPCODE_CONTINUATION) {\n this.fragmentBuffer.push(frame.payload);\n if (!frame.fin) return; // More fragments coming\n\n // Reassemble\n const totalLen = this.fragmentBuffer.reduce((sum, buf) => sum + buf.length, 0);\n const reassembled = new Uint8Array(totalLen);\n let offset = 0;\n for (const buf of this.fragmentBuffer) {\n reassembled.set(buf, offset);\n offset += buf.length;\n }\n this.fragmentBuffer = [];\n\n // Process as the original opcode\n this.handleFrame({\n opcode: this.fragmentOpcode,\n fin: true,\n payload: reassembled,\n masked: true,\n });\n return;\n }\n\n switch (frame.opcode) {\n case OPCODE_TEXT: {\n const text = decodeTextPayload(frame.payload);\n this.onMessage(this.id, text)\n .then((response) => {\n if (response !== null) {\n this.send(response);\n }\n })\n .catch((err) => {\n console.warn(`[ws-connection] message handler error:`, err);\n this.send(\n JSON.stringify({\n error: 'Internal error',\n timestamp: Date.now(),\n })\n );\n });\n break;\n }\n\n case OPCODE_PING:\n // Respond with PONG carrying the same payload\n try {\n this.writeRaw(encodePongFrame(frame.payload));\n } catch {\n // Socket may be closed\n }\n break;\n\n case OPCODE_PONG:\n this.alive = true;\n break;\n\n case OPCODE_CLOSE:\n this.close();\n break;\n }\n }\n}\n"]}