@qontinui/ui-bridge-native 0.3.1 → 0.4.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 (108) hide show
  1. package/dist/control/{index.d.mts → action-executor.d.ts} +6 -10
  2. package/dist/control/action-executor.d.ts.map +1 -0
  3. package/dist/control/index.d.ts +5 -95
  4. package/dist/control/index.d.ts.map +1 -0
  5. package/dist/{types-CjEKTDYT.d.ts → control/types.d.ts} +17 -20
  6. package/dist/control/types.d.ts.map +1 -0
  7. package/dist/core/element-identifier.d.ts +41 -0
  8. package/dist/core/element-identifier.d.ts.map +1 -0
  9. package/dist/core/index.d.ts +6 -43
  10. package/dist/core/index.d.ts.map +1 -0
  11. package/dist/{registry-pAUpQq2O.d.ts → core/registry.d.ts} +10 -13
  12. package/dist/core/registry.d.ts.map +1 -0
  13. package/dist/{types-CGVut7mc.d.mts → core/types.d.ts} +41 -41
  14. package/dist/core/types.d.ts.map +1 -0
  15. package/dist/debug/index.d.ts +4 -44
  16. package/dist/debug/index.d.ts.map +1 -0
  17. package/dist/debug/index.js +1 -1
  18. package/dist/debug/index.js.map +1 -1
  19. package/dist/debug/index.mjs +2 -2
  20. package/dist/debug/index.mjs.map +1 -1
  21. package/dist/debug/{index.d.mts → inspector.d.ts} +3 -6
  22. package/dist/debug/inspector.d.ts.map +1 -0
  23. package/dist/design/{index.d.mts → design-inspector-native.d.ts} +7 -11
  24. package/dist/design/design-inspector-native.d.ts.map +1 -0
  25. package/dist/{design-types-BHr6Q1FX.d.mts → design/design-types.d.ts} +10 -11
  26. package/dist/design/design-types.d.ts.map +1 -0
  27. package/dist/design/index.d.ts +5 -60
  28. package/dist/design/index.d.ts.map +1 -0
  29. package/dist/index.d.ts +37 -86
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +3 -3
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.mjs +4 -4
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/modal/index.d.ts +2 -0
  36. package/dist/modal/index.d.ts.map +1 -0
  37. package/dist/modal/modal-detector.d.ts +29 -0
  38. package/dist/modal/modal-detector.d.ts.map +1 -0
  39. package/dist/react/StateAnnotation.d.ts +30 -0
  40. package/dist/react/StateAnnotation.d.ts.map +1 -0
  41. package/dist/react/UIBridgeNativeProvider.d.ts +156 -0
  42. package/dist/react/UIBridgeNativeProvider.d.ts.map +1 -0
  43. package/dist/react/index.d.ts +14 -69
  44. package/dist/react/index.d.ts.map +1 -0
  45. package/dist/react/index.js +3 -3
  46. package/dist/react/index.js.map +1 -1
  47. package/dist/react/index.mjs +4 -4
  48. package/dist/react/index.mjs.map +1 -1
  49. package/dist/react/{index.d.mts → useAutoRegister.d.ts} +7 -15
  50. package/dist/react/useAutoRegister.d.ts.map +1 -0
  51. package/dist/react/useUIBridge.d.ts +103 -0
  52. package/dist/react/useUIBridge.d.ts.map +1 -0
  53. package/dist/react/useUIBridgeModal.d.ts +14 -0
  54. package/dist/react/useUIBridgeModal.d.ts.map +1 -0
  55. package/dist/react/useUIBridgeToast.d.ts +25 -0
  56. package/dist/react/useUIBridgeToast.d.ts.map +1 -0
  57. package/dist/react/useUIComponent.d.ts +112 -0
  58. package/dist/react/useUIComponent.d.ts.map +1 -0
  59. package/dist/react/useUIElement.d.ts +162 -0
  60. package/dist/react/useUIElement.d.ts.map +1 -0
  61. package/dist/server/design-handlers.d.ts +47 -0
  62. package/dist/server/design-handlers.d.ts.map +1 -0
  63. package/dist/server/handlers.d.ts +25 -0
  64. package/dist/server/handlers.d.ts.map +1 -0
  65. package/dist/server/http-server.d.ts +262 -0
  66. package/dist/server/http-server.d.ts.map +1 -0
  67. package/dist/server/index.d.ts +14 -176
  68. package/dist/server/index.d.ts.map +1 -0
  69. package/dist/server/observability.d.ts +55 -0
  70. package/dist/server/observability.d.ts.map +1 -0
  71. package/dist/server/types.d.ts +368 -0
  72. package/dist/server/types.d.ts.map +1 -0
  73. package/dist/server/ws-connection.d.ts +48 -0
  74. package/dist/server/ws-connection.d.ts.map +1 -0
  75. package/dist/server/ws-event-bridge.d.ts +113 -0
  76. package/dist/server/ws-event-bridge.d.ts.map +1 -0
  77. package/dist/server/ws-protocol.d.ts +48 -0
  78. package/dist/server/ws-protocol.d.ts.map +1 -0
  79. package/dist/server/ws-types.d.ts +65 -0
  80. package/dist/server/ws-types.d.ts.map +1 -0
  81. package/dist/toast/index.d.ts +2 -0
  82. package/dist/toast/index.d.ts.map +1 -0
  83. package/dist/toast/toast-capture.d.ts +27 -0
  84. package/dist/toast/toast-capture.d.ts.map +1 -0
  85. package/dist/transport/CloudRelayClient.d.ts +51 -0
  86. package/dist/transport/CloudRelayClient.d.ts.map +1 -0
  87. package/dist/transport/DeviceAnnouncer.d.ts +75 -0
  88. package/dist/transport/DeviceAnnouncer.d.ts.map +1 -0
  89. package/dist/transport/index.d.ts +3 -0
  90. package/dist/transport/index.d.ts.map +1 -0
  91. package/dist/transport/logger.d.ts +23 -0
  92. package/dist/transport/logger.d.ts.map +1 -0
  93. package/dist/undo/index.d.ts +3 -0
  94. package/dist/undo/index.d.ts.map +1 -0
  95. package/dist/undo/undo-tracker.d.ts +59 -0
  96. package/dist/undo/undo-tracker.d.ts.map +1 -0
  97. package/package.json +3 -3
  98. package/dist/StateAnnotation--zm0Jfqj.d.ts +0 -755
  99. package/dist/StateAnnotation-BgFoVWFy.d.mts +0 -755
  100. package/dist/core/index.d.mts +0 -46
  101. package/dist/design-types-BHr6Q1FX.d.ts +0 -205
  102. package/dist/http-server--550eD1F.d.mts +0 -805
  103. package/dist/http-server-C9NaNBEP.d.ts +0 -805
  104. package/dist/index.d.mts +0 -89
  105. package/dist/registry-B5JadBN9.d.mts +0 -300
  106. package/dist/server/index.d.mts +0 -178
  107. package/dist/types-B0XA4vOF.d.mts +0 -197
  108. package/dist/types-CGVut7mc.d.ts +0 -567
@@ -0,0 +1,368 @@
1
+ /**
2
+ * UI Bridge Native Server Types
3
+ *
4
+ * Types for the embedded HTTP server.
5
+ */
6
+ import type { NativeUIBridgeConfig, NativeActionResponse, NativeFindResponse, NativeBridgeSnapshot } from '../core/types';
7
+ import type { ComponentActionResponse, PageNavigationResponse } from '../control/types';
8
+ import type { ElementDesignData, StateStyles, ResponsiveSnapshot } from '../design/design-types';
9
+ /**
10
+ * Navigation provider for React Native apps.
11
+ *
12
+ * Apps supply this to enable programmatic navigation via the UI Bridge
13
+ * (e.g., `control/page/navigate` and `control/page/back`).
14
+ * For Expo Router: pass `router.push` and `router.back`.
15
+ */
16
+ export interface NavigationProvider {
17
+ navigate: (url: string) => void;
18
+ back?: () => void;
19
+ /** Replace current route (no back-stack entry). For Expo Router: router.replace */
20
+ replace?: (url: string) => void;
21
+ /** Refresh the current route. For Expo Router: router.replace(currentPath) */
22
+ refresh?: () => void;
23
+ }
24
+ /**
25
+ * Screenshot provider for React Native apps.
26
+ *
27
+ * Apps supply this to enable screen capture via the UI Bridge
28
+ * (`control/screenshot`). For react-native-view-shot: pass a function
29
+ * that calls `captureRef` on the root view and returns base64 PNG data.
30
+ */
31
+ export interface ScreenshotProvider {
32
+ /** Capture the current screen and return base64-encoded PNG data (no data: prefix). */
33
+ capture: () => Promise<{
34
+ base64: string;
35
+ width: number;
36
+ height: number;
37
+ }>;
38
+ }
39
+ /**
40
+ * Route provider for React Native apps.
41
+ *
42
+ * Apps supply this to expose the current navigation route in UI Bridge snapshots.
43
+ * For Expo Router: render a RouteTracker component inside the router context that
44
+ * calls `usePathname()` / `useSegments()` and writes the result to a module-level ref.
45
+ */
46
+ export interface RouteProvider {
47
+ /** Return the current route path (e.g. "/(tabs)/runs"), or null if unknown. */
48
+ getCurrentRoute: () => string | null;
49
+ /** Return the current route segments (e.g. ["(tabs)", "runs"]), if available. */
50
+ getSegments?: () => string[];
51
+ /**
52
+ * Subscribe to route changes. Required so the UI Bridge can clear stale
53
+ * layouts on route changes with zero lag.
54
+ *
55
+ * Implementers must invoke `listener` synchronously whenever the route
56
+ * changes, passing the new route (or null if unknown). The returned function
57
+ * must unsubscribe the listener.
58
+ *
59
+ * For Expo Router: wrap your RouteTracker component in a module-level
60
+ * listener set and call each listener from within the tracker's effect.
61
+ */
62
+ subscribe: (listener: (route: string | null) => void) => () => void;
63
+ }
64
+ /**
65
+ * Server configuration
66
+ */
67
+ export interface NativeServerConfig extends NativeUIBridgeConfig {
68
+ /** Enable CORS */
69
+ cors?: boolean;
70
+ /** Allowed origins for CORS */
71
+ allowedOrigins?: string[];
72
+ /**
73
+ * Enable test-only HTTP endpoints (currently `control/modal/push` and
74
+ * `control/modal/dismiss/:id`) so external runners can drive registry
75
+ * state. Default `false`; the React provider mirrors
76
+ * `features.testHooks` into this slot.
77
+ */
78
+ testHooks?: boolean;
79
+ }
80
+ /**
81
+ * Route definition
82
+ */
83
+ export interface RouteDefinition {
84
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE';
85
+ path: string;
86
+ description: string;
87
+ }
88
+ /**
89
+ * All UI Bridge Native routes
90
+ */
91
+ export declare const UI_BRIDGE_NATIVE_ROUTES: Record<string, RouteDefinition>;
92
+ /**
93
+ * Request body for `POST /ai/fill-form`.
94
+ *
95
+ * The mobile native bridge has no `setValue` action — text inputs are driven
96
+ * via the `type` action (which calls `onChangeText`). The fillForm handler
97
+ * dispatches each field as `executor.executeAction(elementId, { action: 'type',
98
+ * params: { text: value, clear: true } })` so existing values are atomically
99
+ * replaced (matching the web bridge's "setValue" semantics).
100
+ *
101
+ * Shape mirrors the runner's `POST /ui-bridge/ai/fill-form` documented in
102
+ * docs-site/api/runner-features.md (array-of-pairs form), so callers can use
103
+ * the same JSON across mobile and web/runner without special-casing.
104
+ */
105
+ export interface FillFormFieldInput {
106
+ /** Target element id (registered id, testID, accessibilityLabel, etc.) */
107
+ elementId: string;
108
+ /** Text value to write into the input. */
109
+ value: string;
110
+ }
111
+ export interface FillFormRequest {
112
+ fields: FillFormFieldInput[];
113
+ }
114
+ /**
115
+ * Per-field outcome returned by `POST /ai/fill-form`.
116
+ */
117
+ export interface FillFormFieldResult {
118
+ /** Element id from the request, echoed back. */
119
+ elementId: string;
120
+ /** Whether `executor.executeAction` reported success for this field. */
121
+ success: boolean;
122
+ /** Error message when `success === false`. Omitted on success. */
123
+ error?: string;
124
+ }
125
+ /**
126
+ * Response payload returned in `APIResponse.data` for `POST /ai/fill-form`.
127
+ */
128
+ export interface FillFormResponse {
129
+ results: FillFormFieldResult[];
130
+ succeededCount: number;
131
+ failedCount: number;
132
+ }
133
+ /**
134
+ * Request body for `POST /control/tap` — synthesize a press at given screen
135
+ * coordinates by searching registered elements whose layout rect contains the
136
+ * point.
137
+ *
138
+ * The handler picks the topmost (smallest-area) match — usually the innermost
139
+ * child — then dispatches the requested action via the standard executor.
140
+ * `action` defaults to `'press'`.
141
+ */
142
+ export interface TapAtRequest {
143
+ x: number;
144
+ y: number;
145
+ action?: 'press' | 'longPress' | 'doubleTap';
146
+ }
147
+ /**
148
+ * Response payload returned in `APIResponse.data` for `POST /control/tap`.
149
+ */
150
+ export interface TapAtResponse {
151
+ /** Element id whose rect contained the tap coords. */
152
+ elementId: string;
153
+ /** Action that was dispatched. */
154
+ action: 'press' | 'longPress' | 'doubleTap';
155
+ /** The element's layout rect at dispatch time (best-effort). */
156
+ layout: {
157
+ x: number;
158
+ y: number;
159
+ width: number;
160
+ height: number;
161
+ pageX?: number;
162
+ pageY?: number;
163
+ } | null;
164
+ }
165
+ /**
166
+ * Single console error/warn entry captured by the observability ring buffer.
167
+ * Returned by `GET /control/console-errors`.
168
+ */
169
+ export interface ConsoleErrorEntry {
170
+ /** ms since epoch when the entry was captured. */
171
+ timestamp: number;
172
+ /** `'error'` or `'warn'`. */
173
+ level: 'error' | 'warn';
174
+ /** Joined message string (matches what console would have printed). */
175
+ message: string;
176
+ /** Captured stack trace if any of the args was an Error. */
177
+ stack?: string;
178
+ }
179
+ /**
180
+ * Response payload for `GET /control/console-errors`.
181
+ */
182
+ export interface ConsoleErrorsResponse {
183
+ entries: ConsoleErrorEntry[];
184
+ /** Number of entries returned (post `since`/`limit` filtering). */
185
+ count: number;
186
+ /** Total entries currently held in the ring buffer (pre-filter). */
187
+ bufferSize: number;
188
+ }
189
+ /**
190
+ * Single network request entry captured by the observability ring buffer.
191
+ * Returned by `GET /sdk/network-requests`.
192
+ */
193
+ export interface NetworkRequestEntry {
194
+ /** ms since epoch at request start. */
195
+ timestamp: number;
196
+ /** HTTP method (uppercased). */
197
+ method: string;
198
+ /** Resolved request URL. */
199
+ url: string;
200
+ /** HTTP status code, or 0 if the request errored before a response. */
201
+ status: number;
202
+ /** Wall-clock duration in ms from start to settlement. */
203
+ durationMs: number;
204
+ /** Whether the request settled with a 2xx response. */
205
+ ok: boolean;
206
+ /** Error message when the request rejected before a response. */
207
+ error?: string;
208
+ }
209
+ /**
210
+ * Response payload for `GET /sdk/network-requests`.
211
+ */
212
+ export interface NetworkRequestsResponse {
213
+ entries: NetworkRequestEntry[];
214
+ count: number;
215
+ bufferSize: number;
216
+ }
217
+ /**
218
+ * Request body for `POST /control/modal/push`.
219
+ *
220
+ * Mirrors `ModalDetector.pushModal`'s `ModalPushInput` shape; `metadata` is
221
+ * a free-form object the test runner can stash for later assertions but is
222
+ * not currently surfaced in the snapshot.
223
+ */
224
+ export interface PushModalRequest {
225
+ id: string;
226
+ title?: string;
227
+ type?: string;
228
+ blocking?: boolean;
229
+ dismissible?: boolean;
230
+ metadata?: Record<string, unknown>;
231
+ }
232
+ /**
233
+ * Response payload for `POST /control/modal/push`.
234
+ */
235
+ export interface PushModalResponse {
236
+ pushed: boolean;
237
+ id: string;
238
+ title?: string;
239
+ type?: string;
240
+ blocking?: boolean;
241
+ dismissible?: boolean;
242
+ pushedAt: number;
243
+ }
244
+ /**
245
+ * Response payload for `POST /control/modal/dismiss/:id`.
246
+ */
247
+ export interface DismissModalResponse {
248
+ dismissed: string;
249
+ }
250
+ /**
251
+ * API response wrapper
252
+ */
253
+ export interface APIResponse<T = unknown> {
254
+ success: boolean;
255
+ data?: T;
256
+ error?: string;
257
+ code?: string;
258
+ timestamp: number;
259
+ }
260
+ /**
261
+ * Handler context
262
+ */
263
+ export interface HandlerContext {
264
+ params: Record<string, string>;
265
+ query: Record<string, string>;
266
+ body: unknown;
267
+ }
268
+ /**
269
+ * Handler function type
270
+ */
271
+ export type HandlerFunction<T = unknown> = (context: HandlerContext) => Promise<APIResponse<T>>;
272
+ /**
273
+ * Server handlers interface
274
+ */
275
+ export interface NativeServerHandlers {
276
+ getElements: HandlerFunction<{
277
+ elements: unknown[];
278
+ }>;
279
+ getElement: HandlerFunction<{
280
+ element: unknown;
281
+ }>;
282
+ getElementState: HandlerFunction<{
283
+ state: unknown;
284
+ }>;
285
+ executeAction: HandlerFunction<NativeActionResponse>;
286
+ getComponents: HandlerFunction<{
287
+ components: unknown[];
288
+ }>;
289
+ getComponent: HandlerFunction<{
290
+ component: unknown;
291
+ }>;
292
+ executeComponentAction: HandlerFunction<ComponentActionResponse>;
293
+ find: HandlerFunction<NativeFindResponse>;
294
+ getSnapshot: HandlerFunction<NativeBridgeSnapshot>;
295
+ getWorkflows: HandlerFunction<{
296
+ workflows: unknown[];
297
+ }>;
298
+ runWorkflow: HandlerFunction<{
299
+ runId: string;
300
+ status: string;
301
+ steps: Array<{
302
+ stepId: string;
303
+ type: string;
304
+ status: string;
305
+ result?: unknown;
306
+ error?: string;
307
+ durationMs: number;
308
+ }>;
309
+ totalSteps: number;
310
+ completedSteps: number;
311
+ failedSteps: number;
312
+ skippedSteps: number;
313
+ durationMs: number;
314
+ }>;
315
+ pageRefresh: HandlerFunction<PageNavigationResponse>;
316
+ pageNavigate: HandlerFunction<PageNavigationResponse>;
317
+ pageReplace: HandlerFunction<PageNavigationResponse>;
318
+ pageGoBack: HandlerFunction<PageNavigationResponse>;
319
+ pageGoForward: HandlerFunction<PageNavigationResponse>;
320
+ getScreenshot: HandlerFunction<{
321
+ screenshot: string;
322
+ width: number;
323
+ height: number;
324
+ }>;
325
+ getElementStyles: HandlerFunction<ElementDesignData>;
326
+ getElementStateStyles: HandlerFunction<{
327
+ elementId: string;
328
+ stateStyles: StateStyles[];
329
+ }>;
330
+ getDesignSnapshot: HandlerFunction<{
331
+ elements: ElementDesignData[];
332
+ timestamp: number;
333
+ }>;
334
+ getResponsiveSnapshots: HandlerFunction<ResponsiveSnapshot[]>;
335
+ runDesignAudit: HandlerFunction<unknown>;
336
+ loadStyleGuide: HandlerFunction<{
337
+ loaded: boolean;
338
+ }>;
339
+ getStyleGuide: HandlerFunction<unknown>;
340
+ clearStyleGuide: HandlerFunction<{
341
+ cleared: boolean;
342
+ }>;
343
+ evaluateQuality: HandlerFunction<unknown>;
344
+ getQualityContexts: HandlerFunction<Array<{
345
+ name: string;
346
+ description: string;
347
+ }>>;
348
+ saveBaseline: HandlerFunction<{
349
+ saved: boolean;
350
+ elementCount: number;
351
+ }>;
352
+ diffBaseline: HandlerFunction<unknown>;
353
+ getMethods: HandlerFunction<{
354
+ methods: Array<{
355
+ method: string;
356
+ httpMethods?: string[];
357
+ description?: string;
358
+ }>;
359
+ }>;
360
+ fillForm: HandlerFunction<FillFormResponse>;
361
+ tapAt: HandlerFunction<TapAtResponse>;
362
+ getConsoleErrors: HandlerFunction<ConsoleErrorsResponse>;
363
+ getNetworkRequests: HandlerFunction<NetworkRequestsResponse>;
364
+ pushModal: HandlerFunction<PushModalResponse>;
365
+ dismissModal: HandlerFunction<DismissModalResponse>;
366
+ health: HandlerFunction<Record<string, unknown>>;
367
+ }
368
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * WebSocket connection wrapper for the UI Bridge server.
3
+ *
4
+ * Manages a single WebSocket connection after the HTTP upgrade handshake,
5
+ * handling frame-level I/O, heartbeat, and event subscriptions.
6
+ */
7
+ import type { JsonRpcEvent } from './ws-types';
8
+ /**
9
+ * Callback for text messages received from the client.
10
+ * Returns a response string to send back, or null for no response.
11
+ */
12
+ export type WebSocketMessageHandler = (connId: string, message: string) => Promise<string | null>;
13
+ export declare class WebSocketConnection {
14
+ readonly id: string;
15
+ readonly subscriptions: Set<string>;
16
+ /** Heartbeat liveness flag — set false before ping, set true on pong */
17
+ alive: boolean;
18
+ private socket;
19
+ private buffer;
20
+ private fragmentBuffer;
21
+ private fragmentOpcode;
22
+ private closed;
23
+ private onMessage;
24
+ private onClose;
25
+ constructor(id: string, socket: WebSocketConnection['socket'], onMessage: WebSocketMessageHandler, onClose: (connId: string) => void);
26
+ /** Send a text message to the client. */
27
+ send(message: string): void;
28
+ /**
29
+ * Send an event if the client is subscribed to it. Subscription patterns
30
+ * may be exact event names, `*` (all), or glob patterns containing `*`
31
+ * (e.g. `element:*`, `*:stateChanged`). Exact matches and `*` are checked
32
+ * via fast Set lookups; glob patterns fall through to a regex test.
33
+ */
34
+ sendEvent(event: JsonRpcEvent): void;
35
+ private matchesSubscription;
36
+ /** Send a ping frame for heartbeat. */
37
+ ping(): void;
38
+ /** Close the connection gracefully. */
39
+ close(code?: number, reason?: string): void;
40
+ /** Forcefully destroy the connection without a close frame. */
41
+ destroy(): void;
42
+ /** Whether the connection is still open. */
43
+ get isOpen(): boolean;
44
+ private writeRaw;
45
+ private handleData;
46
+ private handleFrame;
47
+ }
48
+ //# sourceMappingURL=ws-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-connection.d.ts","sourceRoot":"","sources":["../../src/server/ws-connection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAElG,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,aAAa,cAAqB;IAE3C,wEAAwE;IACxE,KAAK,UAAQ;IAEb,OAAO,CAAC,MAAM,CAMZ;IAGF,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,OAAO,CAA2B;gBAGxC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EACrC,SAAS,EAAE,uBAAuB,EAClC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;IAiCnC,yCAAyC;IACzC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAU3B;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAMpC,OAAO,CAAC,mBAAmB;IAa3B,uCAAuC;IACvC,IAAI,IAAI,IAAI;IASZ,uCAAuC;IACvC,KAAK,CAAC,IAAI,SAAO,EAAE,MAAM,SAAK,GAAG,IAAI;IAarC,+DAA+D;IAC/D,OAAO,IAAI,IAAI;IAWf,4CAA4C;IAC5C,IAAI,MAAM,IAAI,OAAO,CAEpB;IAID,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,WAAW;CAwEpB"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Bridges NativeUIBridgeRegistry events to WebSocket clients.
3
+ *
4
+ * Subscribes to all registry event types and broadcasts them as
5
+ * JsonRpcEvent messages to connected WebSocket clients based on
6
+ * their per-connection subscription sets.
7
+ */
8
+ import type { NativeUIBridgeRegistry } from '../core/registry';
9
+ import type { WebSocketConnection } from './ws-connection';
10
+ import type { JsonRpcEvent } from './ws-types';
11
+ /**
12
+ * Convert a glob-style pattern (supports `*` / `**` wildcards) to a RegExp.
13
+ * All other regex metacharacters are escaped, so colons and other
14
+ * event-name characters pass through literally.
15
+ *
16
+ * globToRegex("*") → /^.*$/
17
+ * globToRegex("element:*") → /^element:.*$/
18
+ * globToRegex("*:stateChanged") → /^.*:stateChanged$/
19
+ */
20
+ export declare function globToRegex(pattern: string): RegExp;
21
+ /** Options for the WebSocketEventBridge constructor. */
22
+ export interface WebSocketEventBridgeOptions {
23
+ /** Heartbeat ping interval in ms (default 30000) */
24
+ heartbeatIntervalMs?: number;
25
+ /** Max number of events to retain in the replay history buffer (default 100, 0 disables) */
26
+ maxHistory?: number;
27
+ }
28
+ export declare class WebSocketEventBridge {
29
+ private connections;
30
+ private throttles;
31
+ private unsubscribers;
32
+ private heartbeatTimer;
33
+ private registry;
34
+ private heartbeatIntervalMs;
35
+ /**
36
+ * True ring buffer for event replay history.
37
+ *
38
+ * `historyBuf` is a fixed-capacity slot array; `historyHead` points at the
39
+ * NEXT write position; `historyCount` is the number of valid slots
40
+ * (clamped to capacity). Append is O(1) — no array shifting.
41
+ */
42
+ private historyBuf;
43
+ private historyHead;
44
+ private historyCount;
45
+ constructor(registry: NativeUIBridgeRegistry, optionsOrHeartbeatMs?: WebSocketEventBridgeOptions | number);
46
+ /** Effective ring buffer capacity. 0 means history is disabled. */
47
+ private get historyCapacity();
48
+ /**
49
+ * Start listening to registry events and broadcasting to WS clients.
50
+ * Also starts the heartbeat timer.
51
+ */
52
+ start(): void;
53
+ /** Stop listening to registry events and clear connections. */
54
+ stop(): void;
55
+ /** Register a new WebSocket connection. */
56
+ addConnection(conn: WebSocketConnection): void;
57
+ /** Remove a WebSocket connection (called on disconnect). */
58
+ removeConnection(connId: string): void;
59
+ /** Get the number of active connections. */
60
+ get connectionCount(): number;
61
+ /**
62
+ * Add event subscriptions for a connection.
63
+ *
64
+ * Event names are stored as glob patterns. Supported forms:
65
+ * - Exact: "element:registered"
66
+ * - Prefix: "element:*"
67
+ * - Suffix: "*:stateChanged"
68
+ * - All: "*"
69
+ *
70
+ * @param throttleMs — if >0, batch rapid events within this window before sending
71
+ */
72
+ handleSubscribe(connId: string, events: string[], throttleMs?: number): boolean;
73
+ /**
74
+ * Remove event subscriptions for a connection.
75
+ * If all subscriptions are cleared, also drops the throttle entry
76
+ * (and any pending flush timer) so a subsequent resubscribe starts clean.
77
+ */
78
+ handleUnsubscribe(connId: string, events: string[]): boolean;
79
+ /**
80
+ * Get the subscription set for a connection.
81
+ * Returns the original pattern strings (not compiled regexes).
82
+ */
83
+ getSubscriptions(connId: string): string[];
84
+ /**
85
+ * Check if a connection is subscribed to a specific event.
86
+ * Matches exact names first (fast path), then tests each stored
87
+ * pattern as a glob against the event type.
88
+ */
89
+ isSubscribed(connId: string, eventType: string): boolean;
90
+ /** Get the throttle window (in ms) configured for a connection, or undefined if none. */
91
+ getThrottleMs(connId: string): number | undefined;
92
+ /**
93
+ * Get recent events from the replay history buffer.
94
+ *
95
+ * @param filter.events — optional list of glob patterns to match event types against
96
+ * @param filter.since — optional timestamp (ms); only events at or after this time
97
+ */
98
+ getHistory(filter?: {
99
+ events?: string[];
100
+ since?: number;
101
+ }): JsonRpcEvent[];
102
+ /**
103
+ * Configure the max history buffer size at runtime. 0 disables history.
104
+ * Reallocates the ring buffer, preserving the most recent
105
+ * min(historyCount, newCapacity) events in chronological order.
106
+ */
107
+ setMaxHistory(maxHistory: number): void;
108
+ private broadcastEvent;
109
+ /** Queue an event for throttled delivery, flushing after the throttle window. */
110
+ private enqueueThrottled;
111
+ private startHeartbeat;
112
+ }
113
+ //# sourceMappingURL=ws-event-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-event-bridge.d.ts","sourceRoot":"","sources":["../../src/server/ws-event-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgC/C;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAanD;AAED,wDAAwD;AACxD,MAAM,WAAW,2BAA2B;IAC1C,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,4FAA4F;IAC5F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,mBAAmB,CAAS;IACpC;;;;;;OAMG;IACH,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAK;gBAGvB,QAAQ,EAAE,sBAAsB,EAChC,oBAAoB,GAAE,2BAA2B,GAAG,MAAW;IAajE,mEAAmE;IACnE,OAAO,KAAK,eAAe,GAE1B;IAED;;;OAGG;IACH,KAAK,IAAI,IAAI;IAWb,+DAA+D;IAC/D,IAAI,IAAI,IAAI;IA2BZ,2CAA2C;IAC3C,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAI9C,4DAA4D;IAC5D,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOtC,4CAA4C;IAC5C,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;;;;;;;;;OAUG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO;IAY/E;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO;IAc5D;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAK1C;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAcxD,yFAAyF;IACzF,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIjD;;;;;OAKG;IACH,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,EAAE;IAoB1E;;;;OAIG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IA6BvC,OAAO,CAAC,cAAc;IAyBtB,iFAAiF;IACjF,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,cAAc;CAsBvB"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Pure-JS RFC 6455 WebSocket protocol implementation.
3
+ *
4
+ * Provides frame encoding/decoding and handshake utilities for running
5
+ * a WebSocket server on react-native-tcp-socket without native crypto deps.
6
+ */
7
+ export declare const OPCODE_CONTINUATION = 0;
8
+ export declare const OPCODE_TEXT = 1;
9
+ export declare const OPCODE_BINARY = 2;
10
+ export declare const OPCODE_CLOSE = 8;
11
+ export declare const OPCODE_PING = 9;
12
+ export declare const OPCODE_PONG = 10;
13
+ export interface DecodedFrame {
14
+ opcode: number;
15
+ fin: boolean;
16
+ payload: Uint8Array;
17
+ masked: boolean;
18
+ }
19
+ export interface DecodeResult {
20
+ frames: DecodedFrame[];
21
+ remainder: Uint8Array<any>;
22
+ }
23
+ /**
24
+ * Compute the Sec-WebSocket-Accept value from the client's Sec-WebSocket-Key.
25
+ */
26
+ export declare function computeAcceptKey(clientKey: string): string;
27
+ /**
28
+ * Build the HTTP 101 Switching Protocols response for a WebSocket upgrade.
29
+ */
30
+ export declare function buildUpgradeResponse(clientKey: string): string;
31
+ /** Encode a text message as a WebSocket frame. */
32
+ export declare function encodeTextFrame(text: string): Uint8Array;
33
+ /** Encode a PING frame with optional payload. */
34
+ export declare function encodePingFrame(payload?: Uint8Array): Uint8Array;
35
+ /** Encode a PONG frame with the payload from the PING. */
36
+ export declare function encodePongFrame(payload: Uint8Array): Uint8Array;
37
+ /** Encode a CLOSE frame with optional status code and reason. */
38
+ export declare function encodeCloseFrame(code?: number, reason?: string): Uint8Array;
39
+ /**
40
+ * Decode one or more WebSocket frames from a byte buffer.
41
+ * Returns decoded frames and any unconsumed bytes (for partial frames).
42
+ */
43
+ export declare function decodeFrames(buffer: Uint8Array): DecodeResult;
44
+ /**
45
+ * Decode a text payload from a Uint8Array.
46
+ */
47
+ export declare function decodeTextPayload(payload: Uint8Array): string;
48
+ //# sourceMappingURL=ws-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-protocol.d.ts","sourceRoot":"","sources":["../../src/server/ws-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,eAAO,MAAM,mBAAmB,IAAO,CAAC;AACxC,eAAO,MAAM,WAAW,IAAO,CAAC;AAChC,eAAO,MAAM,aAAa,IAAO,CAAC;AAClC,eAAO,MAAM,YAAY,IAAO,CAAC;AACjC,eAAO,MAAM,WAAW,IAAO,CAAC;AAChC,eAAO,MAAM,WAAW,KAAO,CAAC;AAIhC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,UAAU,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAC;IAEvB,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;CAC5B;AA8GD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAS9D;AAqCD,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAGxD;AAED,iDAAiD;AACjD,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,UAAU,CAEhE;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,CAE/D;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAU3E;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CA0D7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * WebSocket JSON-RPC message types for the UI Bridge protocol.
3
+ */
4
+ /** Standard JSON-RPC request */
5
+ export interface JsonRpcRequest {
6
+ id: number | string;
7
+ method: string;
8
+ params?: Record<string, unknown>;
9
+ }
10
+ /** Batch request — execute multiple requests concurrently */
11
+ export interface JsonRpcBatchRequest {
12
+ id: number | string;
13
+ batch: JsonRpcRequest[];
14
+ }
15
+ /** Subscribe to registry events */
16
+ export interface JsonRpcSubscribe {
17
+ id: number | string;
18
+ method: 'subscribe';
19
+ params: {
20
+ events: string[];
21
+ /** Optional throttle in ms — batch rapid events within this window */
22
+ throttleMs?: number;
23
+ };
24
+ }
25
+ /** Unsubscribe from registry events */
26
+ export interface JsonRpcUnsubscribe {
27
+ id: number | string;
28
+ method: 'unsubscribe';
29
+ params: {
30
+ events: string[];
31
+ };
32
+ }
33
+ /** Any client message */
34
+ export type JsonRpcClientMessage = JsonRpcRequest | JsonRpcBatchRequest | JsonRpcSubscribe | JsonRpcUnsubscribe;
35
+ /** Standard JSON-RPC response */
36
+ export interface JsonRpcResponse {
37
+ id: number | string;
38
+ result?: {
39
+ success: boolean;
40
+ data?: unknown;
41
+ error?: string;
42
+ code?: string;
43
+ timestamp?: number;
44
+ };
45
+ }
46
+ /** Batch response */
47
+ export interface JsonRpcBatchResponse {
48
+ id: number | string;
49
+ results: JsonRpcResponse[];
50
+ }
51
+ /** Server-pushed event (no id — not a response to a request) */
52
+ export interface JsonRpcEvent {
53
+ event: string;
54
+ data: unknown;
55
+ timestamp: number;
56
+ }
57
+ /** Any server message */
58
+ export type JsonRpcServerMessage = JsonRpcResponse | JsonRpcBatchResponse | JsonRpcEvent;
59
+ /** Check if a message is a batch request */
60
+ export declare function isBatchRequest(msg: unknown): msg is JsonRpcBatchRequest;
61
+ /** Check if a message is a subscribe request */
62
+ export declare function isSubscribe(msg: unknown): msg is JsonRpcSubscribe;
63
+ /** Check if a message is an unsubscribe request */
64
+ export declare function isUnsubscribe(msg: unknown): msg is JsonRpcUnsubscribe;
65
+ //# sourceMappingURL=ws-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-types.d.ts","sourceRoot":"","sources":["../../src/server/ws-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,gCAAgC;AAChC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,mCAAmC;AACnC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,sEAAsE;QACtE,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC9B;AAED,yBAAyB;AACzB,MAAM,MAAM,oBAAoB,GAC5B,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,kBAAkB,CAAC;AAIvB,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,qBAAqB;AACrB,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,gEAAgE;AAChE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,yBAAyB;AACzB,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAAG,oBAAoB,GAAG,YAAY,CAAC;AAIzF,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,mBAAmB,CAOvE;AAED,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,gBAAgB,CAIjE;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,kBAAkB,CAIrE"}