@qontinui/ui-bridge-native 0.4.0 → 0.5.1

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.
@@ -8,7 +8,7 @@ import type { NativeUIBridgeFeatures, NativeUIBridgeConfig, RegisteredNativeElem
8
8
  import { NativeUIBridgeRegistry } from '../core/registry';
9
9
  import type { NativeActionExecutor } from '../control/types';
10
10
  import { type ServerAdapter } from '../server/http-server';
11
- import type { RouteProvider } from '../server/types';
11
+ import type { RouteProvider, KeepAwakeProvider } from '../server/types';
12
12
  import { type CloudRelayConfig } from '../transport/CloudRelayClient';
13
13
  import { ModalDetector } from '../modal/modal-detector';
14
14
  import { ToastCapture } from '../toast/toast-capture';
@@ -89,6 +89,13 @@ export interface UIBridgeNativeProviderProps {
89
89
  height: number;
90
90
  }>;
91
91
  };
92
+ /**
93
+ * Keep-awake provider for native screen-wake control via UI Bridge.
94
+ * Pass expo-keep-awake's activateKeepAwakeAsync/deactivateKeepAwake (wrapped
95
+ * to the request/release shape) so an external runner never loses the device
96
+ * to a screen lock. The SDK never imports expo-keep-awake directly.
97
+ */
98
+ keepAwakeProvider?: KeepAwakeProvider;
92
99
  /**
93
100
  * Route provider for exposing the current navigation route in snapshots.
94
101
  * Wire this to Expo Router's `usePathname()` / `useSegments()` via a module-level ref.
@@ -134,7 +141,7 @@ export interface UIBridgeNativeProviderProps {
134
141
  * }
135
142
  * ```
136
143
  */
137
- export declare function UIBridgeNativeProvider({ children, features, config, onEvent, serverAdapter, navigationProvider, screenshotProvider, routeProvider, cloudRelayConfig, enableMdnsAnnounce, deviceId, }: UIBridgeNativeProviderProps): import("react/jsx-runtime").JSX.Element;
144
+ export declare function UIBridgeNativeProvider({ children, features, config, onEvent, serverAdapter, navigationProvider, screenshotProvider, keepAwakeProvider, routeProvider, cloudRelayConfig, enableMdnsAnnounce, deviceId, }: UIBridgeNativeProviderProps): import("react/jsx-runtime").JSX.Element;
138
145
  /**
139
146
  * useUIBridgeNative hook
140
147
  *
@@ -1 +1 @@
1
- {"version":3,"file":"UIBridgeNativeProvider.d.ts","sourceRoot":"","sources":["../../src/react/UIBridgeNativeProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UIBridgeNativeProvider.d.ts","sourceRoot":"","sources":["../../src/react/UIBridgeNativeProvider.tsx"],"names":[],"mappings":"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"}
@@ -2168,6 +2168,14 @@ function createServerHandlers(registry, executor, config) {
2168
2168
  "NOT_SUPPORTED"
2169
2169
  );
2170
2170
  },
2171
+ // Keep-awake (stub — apps should override via setKeepAwakeProvider, which
2172
+ // the provider wires when a keepAwakeProvider prop is supplied)
2173
+ keepAwake: async () => {
2174
+ return error2(
2175
+ "keep-awake not configured. Provide a keepAwakeProvider to UIBridgeNativeProvider.",
2176
+ "NOT_SUPPORTED"
2177
+ );
2178
+ },
2171
2179
  // Meta / Introspection (stub — server constructor overrides with real route table)
2172
2180
  getMethods: async () => {
2173
2181
  return error2("Methods introspection not configured", "NOT_SUPPORTED");
@@ -2841,6 +2849,12 @@ var WS_ROUTES = [
2841
2849
  httpMethods: ["POST"],
2842
2850
  requiresTestHooks: true
2843
2851
  },
2852
+ {
2853
+ pattern: "control/keep-awake",
2854
+ handler: "keepAwake",
2855
+ httpMethods: ["POST"],
2856
+ requiresTestHooks: true
2857
+ },
2844
2858
  // Observability — last-N console errors + network requests. testHooks-gated
2845
2859
  // because patching `console.error` / `fetch` is invasive in production.
2846
2860
  {
@@ -2893,7 +2907,8 @@ var HANDLER_DESCRIPTIONS = {
2893
2907
  getConsoleErrors: "TEST HOOK \u2014 last-N console.error/console.warn entries; ?since=<ms>&limit=<n>",
2894
2908
  getNetworkRequests: "TEST HOOK \u2014 last-N fetch/XHR entries with status + duration; ?since=<ms>&limit=<n>",
2895
2909
  pushModal: "TEST HOOK \u2014 push a modal onto the snapshot.modalStack via the registry ModalDetector",
2896
- dismissModal: "TEST HOOK \u2014 dismiss a modal by id from the snapshot.modalStack via the registry ModalDetector"
2910
+ dismissModal: "TEST HOOK \u2014 dismiss a modal by id from the snapshot.modalStack via the registry ModalDetector",
2911
+ keepAwake: "TEST HOOK \u2014 keep the device screen awake via the injected keepAwakeProvider: body { enabled: boolean, durationMs?: number }"
2897
2912
  };
2898
2913
  var ACTION_REFERENCE = [
2899
2914
  { name: "press", aliases: ["click"], params: "PressActionParams (optional position)" },
@@ -3161,6 +3176,35 @@ var NativeUIBridgeServer = class {
3161
3176
  }
3162
3177
  };
3163
3178
  }
3179
+ /**
3180
+ * Set a keep-awake provider for native screen-wake control.
3181
+ * This enables `control/keep-awake` and arms the auto-arm hook in
3182
+ * handleRequest (every request keeps the screen alive for 60s).
3183
+ */
3184
+ setKeepAwakeProvider(provider) {
3185
+ this.keepAwakeProvider = provider;
3186
+ this.handlers.keepAwake = async (ctx) => {
3187
+ const { enabled, durationMs } = ctx.body ?? {};
3188
+ if (typeof enabled !== "boolean") {
3189
+ return {
3190
+ success: false,
3191
+ error: "enabled must be boolean",
3192
+ code: "INVALID_REQUEST",
3193
+ timestamp: Date.now()
3194
+ };
3195
+ }
3196
+ if (enabled) {
3197
+ provider.request("ui-bridge", typeof durationMs === "number" ? durationMs : void 0);
3198
+ } else {
3199
+ provider.release("ui-bridge");
3200
+ }
3201
+ return {
3202
+ success: true,
3203
+ data: { enabled, durationMs: typeof durationMs === "number" ? durationMs : null },
3204
+ timestamp: Date.now()
3205
+ };
3206
+ };
3207
+ }
3164
3208
  /**
3165
3209
  * Start the HTTP server
3166
3210
  */
@@ -3753,6 +3797,12 @@ var NativeUIBridgeServer = class {
3753
3797
  if (request.method === "OPTIONS") {
3754
3798
  return { status: 204, headers, body: "" };
3755
3799
  }
3800
+ if (this.config.testHooks === true && this.keepAwakeProvider) {
3801
+ try {
3802
+ this.keepAwakeProvider.request("auto-arm", 6e4);
3803
+ } catch {
3804
+ }
3805
+ }
3756
3806
  try {
3757
3807
  const response = await this.routeRequest(request);
3758
3808
  return {
@@ -4653,6 +4703,7 @@ function UIBridgeNativeProvider({
4653
4703
  serverAdapter,
4654
4704
  navigationProvider,
4655
4705
  screenshotProvider,
4706
+ keepAwakeProvider,
4656
4707
  routeProvider,
4657
4708
  cloudRelayConfig,
4658
4709
  enableMdnsAnnounce,
@@ -4707,6 +4758,9 @@ function UIBridgeNativeProvider({
4707
4758
  if (screenshotProvider) {
4708
4759
  server.setScreenshotProvider(screenshotProvider);
4709
4760
  }
4761
+ if (keepAwakeProvider) {
4762
+ server.setKeepAwakeProvider(keepAwakeProvider);
4763
+ }
4710
4764
  if (routeProvider) {
4711
4765
  server.setRouteProvider(routeProvider);
4712
4766
  }
@@ -4760,6 +4814,7 @@ function UIBridgeNativeProvider({
4760
4814
  serverAdapter,
4761
4815
  navigationProvider,
4762
4816
  screenshotProvider,
4817
+ keepAwakeProvider,
4763
4818
  routeProvider
4764
4819
  ]);
4765
4820
  const stopServer = react.useCallback(() => {
@@ -4793,6 +4848,7 @@ function UIBridgeNativeProvider({
4793
4848
  });
4794
4849
  if (navigationProvider) bareServer.setNavigationProvider(navigationProvider);
4795
4850
  if (screenshotProvider) bareServer.setScreenshotProvider(screenshotProvider);
4851
+ if (keepAwakeProvider) bareServer.setKeepAwakeProvider(keepAwakeProvider);
4796
4852
  if (routeProvider) bareServer.setRouteProvider(routeProvider);
4797
4853
  serverRef.current = bareServer;
4798
4854
  } catch (err) {