@burnt-labs/expo-satya-attest 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.2 - 2026-06-16
4
+
5
+ - Added a visible close button to the managed provider WebView header. It uses the same cancel path as the device back action and iOS edge-swipe gesture, so users can exit login or capture flows without relying only on platform gestures.
6
+
3
7
  ## 0.3.1 - 2026-06-15
4
8
 
5
9
  - Added an **Amazon** account provider (`amazon.prime.v1`). It captures the signed-in `amazon.com` home document and gates the proof on a non-empty `customerId` (logged-out pages ship `"customerId":""`), so capture only fires after login. Discloses Amazon Prime membership status (`is_prime_customer`), `first_name`, and the customer id (`user_id`). A lightweight injection clicks the "Sign in" link to start login; Amazon returns to the home page afterward, so no extra navigation is needed.
@@ -4,13 +4,13 @@ plugins {
4
4
  }
5
5
 
6
6
  group = 'expo.modules.satyaattest'
7
- version = '0.3.1'
7
+ version = '0.3.2'
8
8
 
9
9
  android {
10
10
  namespace "expo.modules.satyaattest"
11
11
  defaultConfig {
12
12
  versionCode 1
13
- versionName "0.3.1"
13
+ versionName "0.3.2"
14
14
  // StrongBox key attestation needs API 28+; basic Keystore attestation API 24+.
15
15
  minSdkVersion 24
16
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SatyaProviderAttestButton.d.ts","sourceRoot":"","sources":["../src/SatyaProviderAttestButton.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SatyaProviderAttestButton.d.ts","sourceRoot":"","sources":["../src/SatyaProviderAttestButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAoBjF,OAAO,EACL,uBAAuB,EAGvB,UAAU,EAGV,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAQxD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAkEvE,KAAK,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAqBrE,MAAM,MAAM,sBAAsB,GAC9B,MAAM,GACN,gBAAgB,GAChB,mBAAmB,GACnB,iBAAiB,GACjB,cAAc,GACd,eAAe,GACf,UAAU,GACV,QAAQ,GACR,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,8BAA+B,SAAQ,aAAa;IACnE,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,eAAe,EAAE,uBAAuB,CAAC;IACzC,aAAa,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAC;CACjD;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uFAAuF;IACvF,cAAc,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC;CACnD;AAED,MAAM,WAAW,8BAA8B;IAC7C;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC;;;;;;;OAOG;IACH,sBAAsB,CAAC,EAAE,2BAA2B,CAAC;IACrD;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE,8BAA8B,CAAC;IACvD,eAAe,EAAE,oBAAoB,CAAC;IACtC;;;OAGG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,wBAAwB,CAAC;IACjC;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC3D,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAChG,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,8BAA8B,KAAK,IAAI,CAAC;IAC9D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAiBD,wBAAgB,yBAAyB,CAAC,EACxC,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EACtB,QAAQ,EACR,qBAAwC,EACxC,eAAe,EACf,MAAM,EAAE,cAAc,EACtB,aAAqB,EACrB,WAAoC,EACpC,QAAgB,EAChB,UAAU,EACV,KAAK,EAAE,SAAS,EAChB,mBAA0B,EAC1B,gBAAgB,EAAE,eAAe,EACjC,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,QAAQ,GACT,EAAE,8BAA8B,qBAkxChC"}
@@ -390,7 +390,7 @@ export function SatyaProviderAttestButton({ providerId, endpointId, providerTemp
390
390
  popupChrome.url,
391
391
  resolved?.template.providerId,
392
392
  ]);
393
- // Single exit affordance: the device back button (Android) / the lone iOS back chevron.
393
+ // Shared exit path for device back, the visible close button, and the iOS swipe gesture.
394
394
  // If an OAuth popup overlay is open, back dismisses just the popup and returns control to
395
395
  // the login page; otherwise it closes the whole flow. Keeps "back = exit" one press deep.
396
396
  const handleHardwareBack = useCallback(() => {
@@ -400,10 +400,9 @@ export function SatyaProviderAttestButton({ providerId, endpointId, providerTemp
400
400
  }
401
401
  closeFlow(true);
402
402
  }, [closeFlow, closeManagedPopup, managedPopup]);
403
- // iOS has no hardware back button, so the flow is dismissed with a left-edge swipe — the
404
- // native iOS "back" gesture rather than an on-screen button. Recreated only when the back
405
- // handler changes (i.e. when an OAuth popup opens/closes) so the gesture always sees the
406
- // current state: swipe closes an open popup first, otherwise closes the whole flow.
403
+ // iOS keeps the native left-edge swipe as a secondary escape hatch. Recreated only when the
404
+ // back handler changes (i.e. when an OAuth popup opens/closes) so the gesture always sees
405
+ // the current state: swipe closes an open popup first, otherwise closes the whole flow.
407
406
  /* eslint-disable react-hooks/refs -- PanResponder.create is an idiomatic RN factory called
408
407
  during render; the values it closes over are a useCallback and gesture args, not React
409
408
  refs, so the react-hooks/refs "ref read during render" warning is a false positive here. */
@@ -964,14 +963,17 @@ export function SatyaProviderAttestButton({ providerId, endpointId, providerTemp
964
963
  insetPadding(rawInsets),
965
964
  ]}>
966
965
  {/* Minimal, native-feeling header: provider name centered, no address bar,
967
- lock, reload, or close. Android exits via the device back button; iOS
968
- exits via a left-edge swipe (the gesture zone below). */}
966
+ lock, or reload. The close affordance shares the back/cancel path. */}
969
967
  <View style={[styles.header, { backgroundColor: theme.surfaceColor }]}>
970
968
  <View style={styles.headerSide}/>
971
969
  <Text style={[styles.headerTitle, { color: theme.onSurfaceColor }]} numberOfLines={1}>
972
970
  {title}
973
971
  </Text>
974
- <View style={styles.headerSide}/>
972
+ <Pressable accessibilityRole="button" accessibilityLabel="Close browser" hitSlop={12} style={styles.headerSide} onPress={handleHardwareBack}>
973
+ <Text style={[styles.headerCloseGlyph, { color: theme.onSurfaceColor }]}>
974
+ ×
975
+ </Text>
976
+ </Pressable>
975
977
  </View>
976
978
  <View style={styles.progressTrack}>
977
979
  {progressPct > 0 ? (<View style={[
@@ -1619,6 +1621,7 @@ const styles = StyleSheet.create({
1619
1621
  justifyContent: 'center',
1620
1622
  },
1621
1623
  headerBackGlyph: { color: '#172033', fontSize: 30, fontWeight: '400', marginTop: -3 },
1624
+ headerCloseGlyph: { color: '#172033', fontSize: 26, fontWeight: '400', lineHeight: 30 },
1622
1625
  headerTitle: {
1623
1626
  flex: 1,
1624
1627
  textAlign: 'center',
@@ -1 +1 @@
1
- {"version":3,"file":"SatyaProviderAttestButton.js","sourceRoot":"","sources":["../src/SatyaProviderAttestButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n findNodeHandle,\n Modal,\n PanResponder,\n Platform,\n Pressable,\n StatusBar,\n StyleSheet,\n Text,\n View,\n} from 'react-native';\nimport {\n initialWindowMetrics,\n SafeAreaInsetsContext,\n SafeAreaProvider,\n type EdgeInsets,\n} from 'react-native-safe-area-context';\n\nimport {\n CapturedProviderRequest,\n CapturedProviderResponse,\n SatyaError,\n SatyaPhase,\n SatyaProgress,\n SatyaProviderEndpointCapture,\n SatyaProviderRegistrySource,\n SatyaProviderTemplate,\n SatyaTransportConfig,\n} from './SatyaAttest.types';\nimport SatyaAttestModule from './SatyaAttestModule';\nimport type { AttestOutcome } from './SatyaMobileClient';\nimport { SatyaMobileClient } from './SatyaMobileClient';\nimport {\n isSatyaDebugEnabled,\n ingestWebViewLog,\n satyaDebug,\n summarizeRequest,\n summarizeResponse,\n} from './debugLog';\nimport type { SatyaProviderPolicyRefreshMode } from './providerPolicy';\nimport { fetchVerifierProviderPolicy, validateProviderPolicyForTemplate } from './providerPolicy';\nimport {\n loadProviderRegistry,\n requestMatchesProviderTemplate,\n requireProviderTemplate,\n validateProviderTemplate,\n withProviderSpkiPins,\n} from './providerRegistry';\nimport {\n buildActiveFetchScript,\n buildProviderDocumentStartScript,\n buildProviderPopupBridgeScript,\n buildProviderWebViewScript,\n ProviderCaptureMessage,\n ProviderPopupMessage,\n ProviderPopupPostMessage,\n} from './providerWebview';\n\ntype RuntimeRequire = (moduleName: string) => unknown;\ndeclare const require: RuntimeRequire;\n\ntype WebViewMessageEventLike = { nativeEvent: { data: string } };\ntype WebViewNavigationEventLike = { nativeEvent?: { targetUrl?: string; url?: string } };\n\n// Native-replay host retarget (see Garmin connectapi): capture the SPA's request on the\n// browser-reachable cookie host, then rewrite it to the pinned API host and inject the DI\n// bearer so the native (non-CORS, non-Cloudflare) pinned replay can run. The replay host is\n// fixed by trusted template config (`toHost` == pinned expectedSni); only the path comes from\n// the captured (match-rule-constrained) request.\nfunction rewriteForNativeReplay(\n request: CapturedProviderRequest,\n template: SatyaProviderTemplate,\n bearer: string | null\n): CapturedProviderRequest {\n const proof = template.proofTarget as\n | {\n nativeReplayRewrite?: { fromHost?: string; toHost?: string; stripPathPrefix?: string };\n nativeReplayInjectBearer?: boolean;\n }\n | undefined;\n const rw = proof?.nativeReplayRewrite;\n let url = request.url;\n const headers: Record<string, string> = { ...request.headers };\n if (rw?.fromHost && rw?.toHost) {\n const fromBase = `https://${rw.fromHost}`;\n if (url.startsWith(fromBase)) {\n let rest = url.slice(fromBase.length);\n if (rw.stripPathPrefix && rest.startsWith(rw.stripPathPrefix)) {\n rest = rest.slice(rw.stripPathPrefix.length);\n }\n url = `https://${rw.toHost}${rest}`;\n }\n }\n if (proof?.nativeReplayInjectBearer && bearer) {\n headers.authorization = `Bearer ${bearer}`;\n }\n return { ...request, url, headers };\n}\ntype WebViewShouldStartLoadRequestLike = { url?: string; [key: string]: unknown };\ntype WebViewRefLike = {\n injectJavaScript?: (script: string) => void;\n goBack?: () => void;\n goForward?: () => void;\n reload?: () => void;\n};\ntype WebViewComponent = React.ComponentType<Record<string, unknown>>;\n\ninterface BrowserChromeState {\n url: string;\n title: string;\n canGoBack: boolean;\n canGoForward: boolean;\n loading: boolean;\n}\n\nconst EMPTY_BROWSER_CHROME: BrowserChromeState = {\n url: '',\n title: '',\n canGoBack: false,\n canGoForward: false,\n loading: false,\n};\nconst WEBVIEW_BOOTSTRAP_URL = 'about:blank';\nconst HTML_CAPTURE_HEADER_NAME = 'x-satya-html-capture';\nconst HTML_CAPTURE_HEADER_VALUE = '1';\n\nexport type SatyaProviderFlowPhase =\n | 'idle'\n | 'openingWebView'\n | 'waitingForRequest'\n | 'requestCaptured'\n | 'nativeReplay'\n | 'backendVerify'\n | 'verified'\n | 'failed'\n | 'cancelled'\n | SatyaPhase;\n\nexport interface SatyaProviderFlowProgress {\n phase: SatyaProviderFlowPhase;\n message: string;\n percent: number;\n providerId?: string;\n}\n\nexport interface SatyaBackendVerifyResult {\n ok: boolean;\n status: number;\n url: string;\n error?: string;\n [key: string]: unknown;\n}\n\nexport interface SatyaProviderAttestationResult extends AttestOutcome {\n providerTemplate: SatyaProviderTemplate;\n capturedRequest: CapturedProviderRequest;\n backendVerify?: SatyaBackendVerifyResult | null;\n}\n\n/**\n * Optional visual theme for the managed WebView surface. Lets the host app match the\n * flow to its own brand so the WebView reads as part of the parent app rather than a\n * separate browser window. Every field is optional and falls back to the SDK defaults.\n */\nexport interface SatyaProviderAttestTheme {\n /** Background of the safe-area strips and the slim header (default `#ffffff`). */\n surfaceColor?: string;\n /** Title / icon color drawn on `surfaceColor` (default `#172033`). */\n onSurfaceColor?: string;\n /** Secondary / muted text color (default `#66758a`). */\n mutedColor?: string;\n /** Accent for the progress bar, spinners, and primary buttons (default `#2752d9`). */\n accentColor?: string;\n /** Status-bar icon style; pick to contrast `surfaceColor` (default `dark-content`). */\n statusBarStyle?: 'light-content' | 'dark-content';\n}\n\nexport interface SatyaProviderAttestButtonProps {\n /**\n * Provider id from the SDK registry. Pass either `providerId` or `providerTemplate`.\n */\n providerId?: string;\n /**\n * Endpoint id from `providerTemplate.endpoints`. Defaults to the first endpoint.\n */\n endpointId?: string;\n /**\n * Optional custom provider template. Useful when an app ships an allow-listed\n * provider config but still wants the SDK-owned WebView/replay flow.\n */\n providerTemplate?: SatyaProviderTemplate;\n /**\n * Optional provider registry source used when resolving `providerId`.\n * Pass a validated in-app registry object, `{ registry }`, or an HTTPS registry URL:\n *\n * `{ url: 'https://example.com/satya/providers.json' }`\n *\n * `providerTemplate` wins when both are supplied.\n */\n providerRegistrySource?: SatyaProviderRegistrySource;\n /**\n * Runtime SPKI SHA-256 pins, base64 encoded. Native replay requires at least one pin.\n * When provided, these explicit pins win over verifier/template policy refresh.\n */\n spkiPins?: readonly string[];\n /**\n * Controls SPKI policy refresh before the SDK opens the managed WebView.\n *\n * - `verifier-first` fetches `${notaryUrl}/v1/providers/{providerId}/policy`\n * and falls back to embedded template pins.\n * - `verifier-required` fails closed if verifier policy is unavailable.\n * - `template-only` uses only the SDK/provider template pins.\n */\n providerPolicyRefresh?: SatyaProviderPolicyRefreshMode;\n transportConfig: SatyaTransportConfig;\n /**\n * Reuse a client if the host app wants to subscribe elsewhere. Otherwise the\n * component creates one internally.\n */\n client?: SatyaMobileClient;\n /**\n * Also post the artifact to `${notaryUrl}/v1/artifacts/verify`.\n */\n verifyBackend?: boolean;\n buttonLabel?: string;\n disabled?: boolean;\n modalTitle?: string;\n /**\n * Optional theme so the managed WebView surface matches the host app's brand and\n * feels like a native screen of the parent app. Pass `modalTitle=\"\"` to hide the\n * header title entirely.\n */\n theme?: SatyaProviderAttestTheme;\n /**\n * The component closes the WebView once the attestation is generated by default.\n */\n autoCloseOnComplete?: boolean;\n /**\n * Optional WebView implementation. If omitted, the component loads\n * `react-native-webview` from the host Expo app at runtime.\n */\n WebViewComponent?: WebViewComponent;\n /**\n * Explicit managed-WebView user agent. If unset, provider `userAgent` settings\n * are used, falling back to a mobile browser UA like `mobile_tlsn_plugin`.\n */\n webViewUserAgent?: string;\n /**\n * Additional props forwarded to WebView. Critical capture handlers are owned by\n * the SDK and cannot be overridden.\n */\n webViewProps?: Record<string, unknown>;\n onProgress?: (progress: SatyaProviderFlowProgress) => void;\n onRequestCaptured?: (request: CapturedProviderRequest, template: SatyaProviderTemplate) => void;\n onComplete?: (result: SatyaProviderAttestationResult) => void;\n onError?: (error: Error) => void;\n onCancel?: () => void;\n}\n\ninterface ResolvedProvider {\n template: SatyaProviderTemplate;\n pinCount: number;\n pinSource: 'explicit' | 'verifier' | 'template';\n}\n\ninterface ManagedPopupState {\n url: string;\n target?: string | null;\n sourceUrl?: string | null;\n method?: string | null;\n body?: string | null;\n headers?: Record<string, string> | null;\n}\n\nexport function SatyaProviderAttestButton({\n providerId,\n endpointId,\n providerTemplate,\n providerRegistrySource,\n spkiPins,\n providerPolicyRefresh = 'verifier-first',\n transportConfig,\n client: providedClient,\n verifyBackend = false,\n buttonLabel = 'Generate Attestation',\n disabled = false,\n modalTitle,\n theme: themeProp,\n autoCloseOnComplete = true,\n WebViewComponent: providedWebView,\n webViewUserAgent,\n webViewProps,\n onProgress,\n onRequestCaptured,\n onComplete,\n onError,\n onCancel,\n}: SatyaProviderAttestButtonProps) {\n const fallbackClient = useMemo(() => new SatyaMobileClient(), []);\n const client = providedClient ?? fallbackClient;\n const webRef = useRef<WebViewRefLike | null>(null);\n const popupRef = useRef<WebViewRefLike | null>(null);\n const webHostRef = useRef<View | null>(null);\n const popupHostRef = useRef<View | null>(null);\n const replayStartedRef = useRef(false);\n const flowSeqRef = useRef(0);\n // URLs already nudged via fetch() to surface an html/text page-load to the request\n // interceptor (top-level navigations are not fetch/XHR, so they aren't captured otherwise).\n const htmlCaptureFetchedRef = useRef<Set<string>>(new Set());\n // For endpoint `capture.trigger` flows: the last matching request seen, held until its\n // response arrives 2xx (login gate) before the native replay is allowed to run.\n const pendingRequestRef = useRef<CapturedProviderRequest | null>(null);\n // DI bearer token lifted from the live provider session (e.g. Garmin connectapi), injected\n // into the native replay request for hosts that require Authorization: Bearer.\n const bearerRef = useRef<string | null>(null);\n // Login-signal gate: provider `injection` posts `__satyaReady` once the proof endpoint\n // returns authenticated content. Some endpoints (e.g. Garmin /proxy/socialProfile) return\n // 200 with an empty body pre-login, which a status-only 2xx gate can't distinguish.\n const loggedInRef = useRef(false);\n const [modalVisible, setModalVisible] = useState(false);\n const [phase, setPhase] = useState<SatyaProviderFlowPhase>('idle');\n const [percent, setPercent] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const [resolved, setResolved] = useState<ResolvedProvider | null>(null);\n const [capturedRequest, setCapturedRequest] = useState<CapturedProviderRequest | null>(null);\n const [ResolvedWebView, setResolvedWebView] = useState<WebViewComponent | null>(null);\n const [effectiveUserAgent, setEffectiveUserAgent] = useState<string | null>(null);\n const [webViewUrl, setWebViewUrl] = useState<string | null>(null);\n const [managedPopup, setManagedPopup] = useState<ManagedPopupState | null>(null);\n // Browser chrome (url/title/canGoBack/loading) is still tracked so navigation handlers and\n // the OAuth popup auto-return logic keep working, but it is no longer rendered as a visible\n // address bar — so only the setter is read here.\n const [, setBrowserChrome] = useState<BrowserChromeState>(EMPTY_BROWSER_CHROME);\n const [popupChrome, setPopupChrome] = useState<BrowserChromeState>(EMPTY_BROWSER_CHROME);\n const [mainDocumentScriptReady, setMainDocumentScriptReady] = useState(Platform.OS !== 'android');\n const [popupDocumentScriptReady, setPopupDocumentScriptReady] = useState(\n Platform.OS !== 'android'\n );\n const [running, setRunning] = useState(false);\n\n // Read once per render. Env-driven (EXPO_PUBLIC_SATYA_DEBUG / EXPO_PUBLIC_ENABLE_LOGGING) or\n // toggled at runtime via setSatyaDebugEnabled(); gates the injected in-WebView logging shim.\n const debugEnabled = isSatyaDebugEnabled();\n\n const emitProgress = useCallback(\n (progress: SatyaProviderFlowProgress) => {\n setPhase(progress.phase);\n setPercent(progress.percent);\n onProgress?.(progress);\n },\n [onProgress]\n );\n\n useEffect(() => {\n return client.subscribeProgress((progress: SatyaProgress) => {\n emitProgress({\n phase: progress.phase,\n message: progress.message,\n percent: progress.percent,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n });\n }, [\n client,\n emitProgress,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n ]);\n\n const fail = useCallback(\n (cause: unknown) => {\n const nextError = cause instanceof Error ? cause : new SatyaError(String(cause));\n replayStartedRef.current = false;\n setRunning(false);\n satyaDebug.error('flow', 'flow failed', {\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n error: nextError.message,\n });\n setError(nextError.message);\n emitProgress({\n phase: 'failed',\n message: nextError.message,\n percent: 1,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n onError?.(nextError);\n },\n [emitProgress, onError, providerId, providerTemplate?.providerId, resolved?.template.providerId]\n );\n\n const openFlow = useCallback(() => {\n const flowSeq = flowSeqRef.current + 1;\n flowSeqRef.current = flowSeq;\n replayStartedRef.current = false;\n htmlCaptureFetchedRef.current.clear();\n pendingRequestRef.current = null;\n bearerRef.current = null;\n loggedInRef.current = false;\n setRunning(true);\n setCapturedRequest(null);\n setError(null);\n satyaDebug.info('flow', 'open flow', {\n providerId: providerId ?? providerTemplate?.providerId,\n endpointId: endpointId ?? null,\n providerPolicyRefresh,\n verifyBackend,\n debug: debugEnabled,\n });\n emitProgress({\n phase: 'openingWebView',\n message: 'Refreshing provider policy',\n percent: 0.02,\n providerId: providerId ?? providerTemplate?.providerId,\n });\n\n (async () => {\n try {\n const nextResolved = await resolveProvider(\n providerId,\n providerTemplate,\n providerRegistrySource,\n endpointId,\n spkiPins,\n transportConfig,\n providerPolicyRefresh\n );\n if (flowSeq !== flowSeqRef.current) return;\n\n const validationError = validateTemplateForReplay(nextResolved.template);\n if (validationError) throw new SatyaError(validationError);\n if (nextResolved.pinCount === 0) {\n throw new SatyaError(\n `Add at least one SPKI SHA-256 base64 pin for ${providerHost(nextResolved.template)}`\n );\n }\n const WebView = resolveWebViewComponent(providedWebView);\n if (!WebView) {\n throw new SatyaError(\n 'Install react-native-webview in the host Expo app before using SatyaProviderAttestButton'\n );\n }\n setResolved(nextResolved);\n setResolvedWebView(() => WebView);\n setEffectiveUserAgent(resolveEffectiveUserAgent(nextResolved.template, webViewUserAgent));\n const startUrl = providerLoginUrl(nextResolved.template);\n setWebViewUrl(startUrl);\n setManagedPopup(null);\n setMainDocumentScriptReady(Platform.OS !== 'android');\n setPopupDocumentScriptReady(Platform.OS !== 'android');\n setBrowserChrome({\n ...EMPTY_BROWSER_CHROME,\n url: startUrl,\n title: providerDisplayName(nextResolved.template),\n loading: true,\n });\n setPopupChrome(EMPTY_BROWSER_CHROME);\n setCapturedRequest(null);\n setError(null);\n setRunning(false);\n setModalVisible(true);\n satyaDebug.info('flow', 'provider resolved — opening WebView', {\n providerId: nextResolved.template.providerId,\n pinSource: nextResolved.pinSource,\n pinCount: nextResolved.pinCount,\n startUrl,\n proofMethod: nextResolved.template.proofTarget?.method,\n proofUrl: nextResolved.template.proofTarget?.url,\n expectedSni: nextResolved.template.tlsIdentityPolicy?.expectedSni,\n activeFetchTrigger: !!endpointCaptureFromTarget(nextResolved.template.proofTarget)\n ?.trigger,\n });\n emitProgress({\n phase: 'waitingForRequest',\n message: `Open ${providerDisplayName(\n nextResolved.template\n )} and trigger the provider request (${pinSourceLabel(nextResolved.pinSource)} pins)`,\n percent: 0.05,\n providerId: nextResolved.template.providerId,\n });\n } catch (cause) {\n if (flowSeq === flowSeqRef.current) fail(cause);\n }\n })();\n }, [\n debugEnabled,\n emitProgress,\n endpointId,\n fail,\n providerId,\n providerTemplate,\n providerRegistrySource,\n providerPolicyRefresh,\n providedWebView,\n spkiPins,\n transportConfig,\n verifyBackend,\n webViewUserAgent,\n ]);\n\n const closeFlow = useCallback(\n (cancelled: boolean) => {\n satyaDebug.info('flow', cancelled ? 'flow closed (cancelled)' : 'flow closed', {\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n flowSeqRef.current += 1;\n replayStartedRef.current = false;\n if (Platform.OS === 'android') {\n SatyaAttestModule.closePopupWindows().catch(() => undefined);\n }\n setModalVisible(false);\n setRunning(false);\n setWebViewUrl(null);\n setManagedPopup(null);\n setMainDocumentScriptReady(Platform.OS !== 'android');\n setPopupDocumentScriptReady(Platform.OS !== 'android');\n setBrowserChrome(EMPTY_BROWSER_CHROME);\n setPopupChrome(EMPTY_BROWSER_CHROME);\n if (cancelled) {\n emitProgress({\n phase: 'cancelled',\n message: 'Provider attestation cancelled',\n percent: 0,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n onCancel?.();\n }\n },\n [\n emitProgress,\n onCancel,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n ]\n );\n\n const runReplay = useCallback(\n async (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n replayStartedRef.current = true;\n setRunning(true);\n setError(null);\n satyaDebug.info('replay', 'native replay started', {\n providerId: template.providerId,\n method: request.method,\n url: request.url,\n verifyBackend,\n });\n emitProgress({\n phase: 'nativeReplay',\n message: `Replaying ${providerDisplayName(template)} natively`,\n percent: 0.1,\n providerId: template.providerId,\n });\n try {\n const outcome = await client.attestNativeReplay({\n providerTemplate: template,\n capturedRequest: request,\n transportConfig,\n });\n satyaDebug.info('replay', 'native replay artifact produced', {\n providerId: template.providerId,\n verified: outcome.verify.ok,\n attestationId: outcome.verify.attestationId,\n mode: outcome.verify.mode,\n platformTier: outcome.verify.platformTier,\n });\n let backendVerify: SatyaBackendVerifyResult | null = null;\n if (verifyBackend) {\n emitProgress({\n phase: 'backendVerify',\n message: 'Posting artifact to backend verifier',\n percent: 0.96,\n providerId: template.providerId,\n });\n try {\n backendVerify = await postBackendVerifier(\n transportConfig.notaryUrl,\n outcome.raw,\n transportConfig.verifierBearerToken\n );\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n backendVerify = {\n ok: false,\n status: 0,\n url: backendVerifierUrl(transportConfig.notaryUrl),\n error: `backend verifier unreachable: ${message}`,\n };\n }\n satyaDebug.info('replay', 'backend verifier responded', {\n ok: backendVerify?.ok ?? null,\n status: backendVerify?.status ?? null,\n error: backendVerify?.error ?? null,\n });\n }\n const result: SatyaProviderAttestationResult = {\n ...outcome,\n providerTemplate: template,\n capturedRequest: request,\n backendVerify,\n };\n setRunning(false);\n replayStartedRef.current = false;\n satyaDebug.info('flow', 'flow complete', {\n providerId: template.providerId,\n verified: outcome.verify.ok,\n disclosedUsername: outcome.verify.disclosedUsername ?? null,\n backendOk: backendVerify?.ok ?? null,\n });\n emitProgress({\n phase: 'verified',\n message: outcome.verify.ok ? 'Native replay verified' : 'Verification failed',\n percent: 1,\n providerId: template.providerId,\n });\n onComplete?.(result);\n if (autoCloseOnComplete) {\n setModalVisible(false);\n }\n } catch (cause) {\n fail(cause);\n }\n },\n [autoCloseOnComplete, client, emitProgress, fail, onComplete, transportConfig, verifyBackend]\n );\n\n const openManagedPopup = useCallback(\n (popup: ProviderPopupMessage, message = 'Handling provider popup inside the WebView') => {\n if (!popup.url) return;\n satyaDebug.info('popup', 'opening managed popup overlay', {\n url: popup.url,\n target: popup.target ?? null,\n reason: popup.reason ?? null,\n method: popup.method ?? null,\n });\n setPopupDocumentScriptReady(Platform.OS !== 'android');\n setManagedPopup({\n url: popup.url,\n target: popup.target ?? null,\n sourceUrl: popup.sourceUrl ?? null,\n method: popup.method ?? null,\n body: popup.body ?? null,\n headers: popup.headers ?? null,\n });\n setPopupChrome({\n ...EMPTY_BROWSER_CHROME,\n url: popup.url,\n title: 'Provider Sign In',\n loading: true,\n });\n emitProgress({\n phase: 'waitingForRequest',\n message,\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n },\n [emitProgress, providerId, providerTemplate?.providerId, resolved?.template.providerId]\n );\n\n const closeManagedPopup = useCallback(\n (popup?: ProviderPopupMessage | null) => {\n const target = popup?.target ?? managedPopup?.target ?? null;\n const url = popup?.url ?? popupChrome.url ?? managedPopup?.url ?? null;\n satyaDebug.info('popup', 'closing managed popup overlay', { target, url });\n setManagedPopup(null);\n setPopupChrome(EMPTY_BROWSER_CHROME);\n webRef.current?.injectJavaScript?.(buildPopupClosedScript(target, url));\n emitProgress({\n phase: 'waitingForRequest',\n message: 'Provider popup returned control to the login page',\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n },\n [\n emitProgress,\n managedPopup?.target,\n managedPopup?.url,\n providerId,\n providerTemplate?.providerId,\n popupChrome.url,\n resolved?.template.providerId,\n ]\n );\n\n // Single exit affordance: the device back button (Android) / the lone iOS back chevron.\n // If an OAuth popup overlay is open, back dismisses just the popup and returns control to\n // the login page; otherwise it closes the whole flow. Keeps \"back = exit\" one press deep.\n const handleHardwareBack = useCallback(() => {\n if (managedPopup) {\n closeManagedPopup();\n return;\n }\n closeFlow(true);\n }, [closeFlow, closeManagedPopup, managedPopup]);\n\n // iOS has no hardware back button, so the flow is dismissed with a left-edge swipe — the\n // native iOS \"back\" gesture — rather than an on-screen button. Recreated only when the back\n // handler changes (i.e. when an OAuth popup opens/closes) so the gesture always sees the\n // current state: swipe closes an open popup first, otherwise closes the whole flow.\n /* eslint-disable react-hooks/refs -- PanResponder.create is an idiomatic RN factory called\n during render; the values it closes over are a useCallback and gesture args, not React\n refs, so the react-hooks/refs \"ref read during render\" warning is a false positive here. */\n const edgeSwipeResponder = useMemo(\n () =>\n PanResponder.create({\n onMoveShouldSetPanResponder: (_event, gesture) =>\n gesture.dx > 8 && gesture.dx > Math.abs(gesture.dy) * 1.6,\n onPanResponderRelease: (_event, gesture) => {\n if (gesture.dx > 72 || (gesture.dx > 36 && gesture.vx > 0.25)) {\n handleHardwareBack();\n }\n },\n onPanResponderTerminationRequest: () => false,\n }),\n [handleHardwareBack]\n );\n /* eslint-enable react-hooks/refs */\n\n const relayPopupPostMessage = useCallback((popup: ProviderPopupPostMessage) => {\n webRef.current?.injectJavaScript?.(buildPopupPostMessageRelayScript(popup));\n }, []);\n\n const relayOpenerToPopupMessage = useCallback((popup: ProviderPopupPostMessage) => {\n popupRef.current?.injectJavaScript?.(buildOpenerToPopupMessageRelayScript(popup));\n }, []);\n\n const relayPopupPortMessage = useCallback((popup: ProviderPopupPostMessage) => {\n webRef.current?.injectJavaScript?.(buildPopupPortMessageRelayScript(popup));\n }, []);\n\n const relayOpenerToPopupPortMessage = useCallback((popup: ProviderPopupPostMessage) => {\n popupRef.current?.injectJavaScript?.(buildOpenerToPopupPortMessageRelayScript(popup));\n }, []);\n\n const navigateOpenerFromPopup = useCallback(\n (popup: ProviderPopupMessage) => {\n // Reason 'opener.location.reload' (or an empty url) means the popup finished the\n // OAuth flow and wants the opener (login) page to refresh — reload the main\n // WebView and dismiss the popup overlay rather than navigating to a URL.\n const isReload = popup.reason === 'opener.location.reload' || !popup.url;\n satyaDebug.info('popup', 'returning control from popup to opener', {\n reason: popup.reason ?? null,\n url: popup.url,\n isReload,\n });\n setManagedPopup(null);\n setPopupChrome(EMPTY_BROWSER_CHROME);\n if (isReload) {\n setBrowserChrome((current) => ({ ...current, loading: true }));\n webRef.current?.reload?.();\n emitProgress({\n phase: 'waitingForRequest',\n message: 'Provider sign-in finished — reloading the login page',\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n return;\n }\n if (!isWebViewSafeUrl(popup.url)) return;\n setWebViewUrl(popup.url);\n setBrowserChrome((current) => ({\n ...current,\n url: popup.url,\n loading: true,\n }));\n webRef.current?.injectJavaScript?.(\n `try { window.location.assign(${JSON.stringify(popup.url)}); } catch (_) {} true;`\n );\n emitProgress({\n phase: 'waitingForRequest',\n message: 'Provider sign-in returned control to the login page',\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n },\n [emitProgress, providerId, providerTemplate?.providerId, resolved?.template.providerId]\n );\n\n const captureAndReplay = useCallback(\n (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n const replayRequest = rewriteForNativeReplay(request, template, bearerRef.current);\n if (replayRequest.url !== request.url) {\n satyaDebug.info('capture', 'rewrote captured URL for native replay', {\n from: request.url,\n to: replayRequest.url,\n injectedBearer: replayRequest.headers.authorization !== request.headers.authorization,\n });\n }\n satyaDebug.info('capture', 'request captured — starting native replay', {\n providerId: template.providerId,\n request: summarizeRequest(replayRequest),\n });\n setCapturedRequest(replayRequest);\n onRequestCaptured?.(replayRequest, template);\n emitProgress({\n phase: 'requestCaptured',\n message: `Matched ${providerDisplayName(template)} request captured`,\n percent: 0.08,\n providerId: template.providerId,\n });\n runReplay(replayRequest, template).catch(fail);\n },\n [emitProgress, fail, onRequestCaptured, runReplay]\n );\n\n const handleMessage = useCallback(\n (event: WebViewMessageEventLike) => {\n invokeWebViewCallback(webViewProps?.onMessage, event);\n let message: ProviderCaptureMessage;\n try {\n message = JSON.parse(event.nativeEvent.data) as ProviderCaptureMessage;\n } catch {\n return;\n }\n // Logs relayed from inside the managed WebView (request/response interception, the\n // active-fetch trigger poller, popups). Handled first so they surface even after the\n // native replay has started or before the provider has resolved.\n if ((message as { type?: string }).type === '__satyaLog') {\n ingestWebViewLog((message as { data?: unknown }).data);\n return;\n }\n if (message.type === 'popupOpen' || message.type === 'popupNavigate') {\n satyaDebug.debug('popup', `webview ${message.type}`, {\n url: message.data?.url,\n target: message.data?.target ?? null,\n reason: message.data?.reason ?? null,\n });\n openManagedPopup(message.data);\n return;\n }\n if (message.type === 'popupClose') {\n closeManagedPopup(message.data);\n return;\n }\n if (message.type === 'popupPostMessage') {\n relayPopupPostMessage(message.data);\n return;\n }\n if (message.type === 'popupOpenerToPopupMessage') {\n relayOpenerToPopupMessage(message.data);\n return;\n }\n if (message.type === 'popupPortMessage') {\n relayPopupPortMessage(message.data);\n return;\n }\n if (message.type === 'popupOpenerToPopupPortMessage') {\n relayOpenerToPopupPortMessage(message.data);\n return;\n }\n if (message.type === 'popupOpenerNavigate') {\n navigateOpenerFromPopup(message.data);\n return;\n }\n if (!resolved || replayStartedRef.current) return;\n\n // DI bearer lifted from the live session by the provider `injection`. Store it, and if a\n // matching request is already held waiting on it, release it to the native replay now.\n if ((message as { type?: string }).type === '__satyaBearer') {\n const tok = (message as unknown as { data?: string }).data;\n if (tok) bearerRef.current = tok;\n const held = pendingRequestRef.current;\n satyaDebug.info('capture', 'bearer token received from injection', {\n hasToken: !!tok,\n releasingHeldRequest: !!(held && bearerRef.current),\n });\n if (held && bearerRef.current) {\n pendingRequestRef.current = null;\n captureAndReplay(held, resolved.template);\n }\n return;\n }\n\n // Login confirmed by the provider `injection` (the proof endpoint returned authenticated\n // content). Release any held request to the native replay now.\n if ((message as { type?: string }).type === '__satyaReady') {\n loggedInRef.current = true;\n const held = pendingRequestRef.current;\n satyaDebug.info('capture', '__satyaReady login signal received', {\n releasingHeldRequest: !!held,\n });\n if (held) {\n pendingRequestRef.current = null;\n captureAndReplay(held, resolved.template);\n }\n return;\n }\n\n const endpointCapture = endpointCaptureFromTarget(resolved.template.proofTarget);\n const isActiveFetch = !!endpointCapture?.trigger;\n\n // Response-gated capture for endpoint `capture.trigger` flows: the injected active\n // fetch fires the request repeatedly; only a 2xx response (i.e. the user is logged in)\n // releases the held request to the native replay. Pre-login 401s/redirects are ignored.\n if (message.type === 'response') {\n if (!isActiveFetch) return;\n const response = message.data as CapturedProviderResponse;\n const pending = pendingRequestRef.current;\n if (!pending) return;\n const ok =\n typeof response?.status === 'number' && response.status >= 200 && response.status < 300;\n const urlMatches = responseUrlMatchesRequest(response?.url, pending.url);\n if (!ok || !urlMatches) {\n satyaDebug.debug('capture', 'trigger gate: response ignored', {\n status: response?.status,\n ok,\n urlMatches,\n response: summarizeResponse(response),\n });\n return;\n }\n // Some endpoints return 200 with an empty body pre-login (Garmin /proxy/socialProfile);\n // when the endpoint opts into `requireLoginSignal`, wait for the provider injection's\n // `__satyaReady` (authenticated content seen) before releasing the replay.\n const requireLoginSignal = !!endpointCapture?.requireLoginSignal;\n if (requireLoginSignal && !loggedInRef.current) {\n satyaDebug.debug('capture', 'trigger gate: 2xx held — waiting for __satyaReady', {\n url: response?.url,\n });\n return;\n }\n satyaDebug.info('capture', 'trigger gate satisfied (2xx) — releasing held request', {\n status: response?.status,\n });\n pendingRequestRef.current = null;\n captureAndReplay(pending, resolved.template);\n return;\n }\n\n if (message.type !== 'request') return;\n if (!requestMatchesProviderTemplate(resolved.template, message.data)) {\n satyaDebug.debug('capture', 'request did not match template rules', {\n method: message.data?.method,\n url: message.data?.url,\n });\n return;\n }\n if (isActiveFetch) {\n // Hold the matched request until its response confirms login (2xx).\n satyaDebug.info('capture', 'matched request held for trigger response gate', {\n request: summarizeRequest(message.data),\n });\n pendingRequestRef.current = message.data;\n return;\n }\n const requireLoginSignal = !!endpointCapture?.requireLoginSignal;\n if (requireLoginSignal && !loggedInRef.current) {\n // The provider `injection` polls the proof endpoint (which returns 200-empty pre-login)\n // and posts `__satyaReady` once it sees authenticated content. Hold the latest matching\n // request until then, then replay it.\n satyaDebug.info('capture', 'matched request held — waiting for __satyaReady login signal', {\n request: summarizeRequest(message.data),\n });\n pendingRequestRef.current = message.data;\n return;\n }\n captureAndReplay(message.data, resolved.template);\n },\n [\n captureAndReplay,\n closeManagedPopup,\n navigateOpenerFromPopup,\n openManagedPopup,\n relayOpenerToPopupPortMessage,\n relayPopupPostMessage,\n relayPopupPortMessage,\n relayOpenerToPopupMessage,\n resolved,\n webViewProps,\n ]\n );\n\n const loadInCurrentWebView = useCallback(\n (url: string, message: string) => {\n setWebViewUrl(url);\n setBrowserChrome((current) => ({\n ...current,\n url,\n loading: true,\n }));\n emitProgress({\n phase: 'waitingForRequest',\n message,\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n webRef.current?.injectJavaScript?.(\n `try { window.location.assign(${JSON.stringify(url)}); } catch (_) {} true;`\n );\n },\n [emitProgress, providerId, providerTemplate?.providerId, resolved?.template.providerId]\n );\n\n const handleOpenWindow = useCallback(\n (event: WebViewNavigationEventLike) => {\n invokeWebViewCallback(webViewProps?.onOpenWindow, event);\n const targetUrl = event.nativeEvent?.targetUrl ?? event.nativeEvent?.url;\n if (!targetUrl) return;\n openManagedPopup({\n url: targetUrl,\n target: null,\n sourceUrl: webViewUrl ?? (resolved ? providerLoginUrl(resolved.template) : null),\n reason: 'nativeOpenWindow',\n });\n },\n [openManagedPopup, resolved, webViewProps, webViewUrl]\n );\n\n const handleShouldStartLoadWithRequest = useCallback(\n (request: WebViewShouldStartLoadRequestLike) => {\n const hostDecision = invokeShouldStartLoadWithRequest(\n webViewProps?.onShouldStartLoadWithRequest,\n request\n );\n if (hostDecision === false) return false;\n\n const url = request.url;\n if (!url || isWebViewSafeUrl(url)) return true;\n\n const fallbackUrl = parseIntentBrowserFallbackUrl(url);\n satyaDebug.debug('webview', 'blocked non-web navigation (main)', {\n url,\n scheme: schemeLabel(url),\n intentFallback: fallbackUrl,\n });\n if (fallbackUrl) {\n loadInCurrentWebView(fallbackUrl, 'Handling external OAuth fallback inside the WebView');\n } else {\n emitProgress({\n phase: 'waitingForRequest',\n message: `Blocked external navigation to ${schemeLabel(url)}`,\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n }\n return false;\n },\n [\n emitProgress,\n loadInCurrentWebView,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n webViewProps,\n ]\n );\n\n const handlePopupOpenWindow = useCallback(\n (event: WebViewNavigationEventLike) => {\n invokeWebViewCallback(webViewProps?.onOpenWindow, event);\n const targetUrl = event.nativeEvent?.targetUrl ?? event.nativeEvent?.url;\n if (!targetUrl) return;\n openManagedPopup({\n url: targetUrl,\n target: managedPopup?.target ?? null,\n sourceUrl: managedPopup?.url ?? null,\n reason: 'nestedNativeOpenWindow',\n });\n },\n [managedPopup?.target, managedPopup?.url, openManagedPopup, webViewProps]\n );\n\n const handlePopupShouldStartLoadWithRequest = useCallback(\n (request: WebViewShouldStartLoadRequestLike) => {\n const hostDecision = invokeShouldStartLoadWithRequest(\n webViewProps?.onShouldStartLoadWithRequest,\n request\n );\n if (hostDecision === false) return false;\n\n const url = request.url;\n if (!url || isWebViewSafeUrl(url)) return true;\n\n const fallbackUrl = parseIntentBrowserFallbackUrl(url);\n satyaDebug.debug('webview', 'blocked non-web navigation (popup)', {\n url,\n scheme: schemeLabel(url),\n intentFallback: fallbackUrl,\n });\n if (fallbackUrl) {\n openManagedPopup(\n {\n url: fallbackUrl,\n target: managedPopup?.target ?? null,\n sourceUrl: managedPopup?.url ?? null,\n reason: 'popupIntentFallback',\n },\n 'Handling external OAuth fallback inside the popup WebView'\n );\n } else {\n emitProgress({\n phase: 'waitingForRequest',\n message: `Blocked external popup navigation to ${schemeLabel(url)}`,\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n }\n return false;\n },\n [\n emitProgress,\n managedPopup?.target,\n managedPopup?.url,\n openManagedPopup,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n webViewProps,\n ]\n );\n\n const handleNavigationStateChange = useCallback(\n (event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onNavigationStateChange, event);\n if (nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n if (nextChrome.url) {\n satyaDebug.debug('webview', 'navigation (main)', {\n url: nextChrome.url,\n title: nextChrome.title,\n loading: nextChrome.loading,\n });\n }\n setBrowserChrome((current) => ({ ...current, ...nextChrome }));\n if (nextChrome.url) setWebViewUrl(nextChrome.url);\n },\n [webViewProps]\n );\n\n const handlePopupNavigationStateChange = useCallback(\n (event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onNavigationStateChange, event);\n if (nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n if (nextChrome.url) {\n satyaDebug.debug('webview', 'navigation (popup)', {\n url: nextChrome.url,\n loading: nextChrome.loading,\n });\n }\n setPopupChrome((current) => ({ ...current, ...nextChrome }));\n // Auto-return: an OAuth popup (e.g. \"Continue with Google\") typically leaves the\n // opener origin for an auth domain (accounts.google.com), then redirects back to\n // the provider's own origin once sign-in completes. When that return happens,\n // hand control back to the main WebView and dismiss the popup instead of leaving\n // the user stranded on the provider page inside the popup overlay.\n const url = nextChrome.url;\n if (!url || !managedPopup) return;\n const openerOrigin = originFromUrl(\n managedPopup.sourceUrl ??\n webViewUrl ??\n (resolved ? providerLoginUrl(resolved.template) : null)\n );\n const initialPopupOrigin = originFromUrl(managedPopup.url);\n const currentPopupOrigin = originFromUrl(url);\n if (\n openerOrigin &&\n currentPopupOrigin &&\n currentPopupOrigin === openerOrigin &&\n initialPopupOrigin &&\n initialPopupOrigin !== openerOrigin\n ) {\n navigateOpenerFromPopup({\n url,\n target: managedPopup.target ?? null,\n sourceUrl: managedPopup.url ?? null,\n reason: 'popupReturnedToOpenerOrigin',\n });\n }\n },\n [managedPopup, navigateOpenerFromPopup, resolved, webViewProps, webViewUrl]\n );\n\n // For html/text providers the proof page is loaded as a top-level navigation, which the\n // fetch/XHR interceptor never sees. When the main WebView lands on a URL that matches the\n // provider's request rules, re-issue it as a same-origin credentialed fetch so the existing\n // capture -> native-replay path runs (the fetch carries the WebView's cookies + user agent).\n const maybeTriggerHtmlCapture = useCallback(\n (url: string | undefined) => {\n if (!url || !resolved || replayStartedRef.current) return;\n const responseType = String(resolved.template.proofTarget?.responseType ?? '').toLowerCase();\n if (responseType !== 'html' && responseType !== 'text') return;\n if (htmlCaptureFetchedRef.current.has(url)) return;\n const bodyPattern =\n typeof resolved.template.proofTarget?.htmlCaptureBodyPattern === 'string'\n ? resolved.template.proofTarget.htmlCaptureBodyPattern.trim()\n : '';\n const matches = requestMatchesProviderTemplate(resolved.template, {\n url,\n method: 'GET',\n headers: bodyPattern ? { [HTML_CAPTURE_HEADER_NAME]: HTML_CAPTURE_HEADER_VALUE } : {},\n body: null,\n });\n if (!matches) return;\n htmlCaptureFetchedRef.current.add(url);\n satyaDebug.info('htmlCapture', 'injecting html/text capture fetch', {\n url,\n responseType,\n hasBodyPattern: !!bodyPattern,\n });\n const captureScript = bodyPattern\n ? `(function(){try{var u=${JSON.stringify(url)},h=${JSON.stringify(\n HTML_CAPTURE_HEADER_NAME\n )},v=${JSON.stringify(HTML_CAPTURE_HEADER_VALUE)},re=new RegExp(${JSON.stringify(\n bodyPattern\n )}),tries=0,done=false;function text(){try{return (document.documentElement&&document.documentElement.textContent)||'';}catch(e){return '';}}function capture(){if(done)return;tries+=1;if(re.test(text())){done=true;try{var headers={};headers[h]=v;fetch(u,{credentials:'include',headers:headers}).catch(function(){});}catch(e){}return;}if(tries>=40){done=true;}}capture();var t=setInterval(function(){if(done){clearInterval(t);return;}capture();},250);}catch(e){}})(); true;`\n : `try { fetch(${JSON.stringify(url)}, { credentials: 'include' }).catch(function(){}); } catch (_) {} true;`;\n webRef.current?.injectJavaScript?.(captureScript);\n },\n [resolved]\n );\n\n // On Android we use real same-renderer popup windows (native multi-window) for OAuth, so the\n // JS window.open/popup interception must stand down and let the engine fire onCreateWindow.\n const useNativePopups = Platform.OS === 'android';\n\n // For endpoint `capture.trigger` flows, the SDK actively fires the proof request from\n // inside the WebView (post-login) so it can be captured — built from the proof target.\n const activeFetchScript = useMemo(() => {\n const target = resolved?.template.proofTarget;\n const endpointCapture = endpointCaptureFromTarget(target);\n if (!endpointCapture?.trigger || !target?.url) return '';\n return buildActiveFetchScript({\n url: target.url,\n method: target.method ?? 'GET',\n headers: endpointCapture.headers ?? null,\n body: endpointCapture.requestBody ?? null,\n landingUrl: endpointCapture.landingUrl ?? null,\n pollMs: endpointCapture.pollMs,\n maxAttempts: endpointCapture.maxAttempts,\n });\n }, [resolved?.template.proofTarget]);\n\n const mainInjectedScript = useMemo(\n () =>\n buildProviderWebViewScript(\n resolved?.template.injection,\n activeFetchScript,\n useNativePopups,\n debugEnabled\n ),\n [resolved?.template.injection, activeFetchScript, useNativePopups, debugEnabled]\n );\n\n const popupInjectedScript = useMemo(\n () =>\n buildProviderWebViewScript(\n resolved?.template.injection,\n managedPopup ? buildProviderPopupBridgeScript(managedPopup.target) : '',\n false,\n debugEnabled\n ),\n [managedPopup, resolved?.template.injection, debugEnabled]\n );\n\n const mainDocumentStartScript = useMemo(\n () => buildProviderDocumentStartScript('', useNativePopups, debugEnabled),\n [useNativePopups, debugEnabled]\n );\n\n const popupDocumentStartScript = useMemo(\n () =>\n buildProviderDocumentStartScript(\n managedPopup ? buildProviderPopupBridgeScript(managedPopup.target) : '',\n false,\n debugEnabled\n ),\n [managedPopup, debugEnabled]\n );\n\n useEffect(() => {\n if (!modalVisible || !ResolvedWebView || !resolved) return;\n if (Platform.OS !== 'android') return;\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let attempts = 0;\n const install = async () => {\n attempts += 1;\n const result = await installAndroidDocumentStartScript(\n webHostRef.current,\n mainDocumentStartScript\n );\n if (cancelled) return;\n if (result === null && attempts < 20) {\n timer = setTimeout(install, 50);\n return;\n }\n // Turn window.open into real same-renderer child windows so OAuth popups (Google\n // Identity Services, etc.) keep a genuine opener relationship and complete natively.\n await enableAndroidPopupWindows(webHostRef.current);\n satyaDebug.debug('webview', 'android document-start script installed (main)', {\n attempts,\n result,\n });\n setMainDocumentScriptReady(true);\n };\n timer = setTimeout(install, 0);\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [ResolvedWebView, mainDocumentStartScript, modalVisible, resolved]);\n\n useEffect(() => {\n if (!modalVisible || !ResolvedWebView || !resolved || !managedPopup) return;\n if (Platform.OS !== 'android') return;\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let attempts = 0;\n const install = async () => {\n attempts += 1;\n const result = await installAndroidDocumentStartScript(\n popupHostRef.current,\n popupDocumentStartScript\n );\n if (cancelled) return;\n if (result === null && attempts < 20) {\n timer = setTimeout(install, 50);\n return;\n }\n satyaDebug.debug('webview', 'android document-start script installed (popup)', {\n attempts,\n result,\n });\n setPopupDocumentScriptReady(true);\n };\n timer = setTimeout(install, 0);\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [ResolvedWebView, managedPopup, modalVisible, popupDocumentStartScript, resolved]);\n\n const title =\n modalTitle ?? (resolved ? providerDisplayName(resolved.template) : 'Provider Attestation');\n const isProcessing = !!capturedRequest && !error;\n const progressPct = running ? Math.max(5, Math.min(100, Math.round(percent * 100))) : 0;\n const theme = resolveTheme(themeProp);\n return (\n <>\n <Pressable\n style={[\n styles.button,\n { backgroundColor: theme.accentColor },\n (disabled || running || modalVisible) && styles.buttonDisabled,\n ]}\n disabled={disabled || running || modalVisible}\n onPress={openFlow}>\n {running ? <ActivityIndicator color=\"#ffffff\" style={styles.buttonSpinner} /> : null}\n <Text style={styles.buttonText}>{running ? 'Generating Attestation' : buttonLabel}</Text>\n </Pressable>\n <Modal\n visible={modalVisible}\n animationType=\"slide\"\n statusBarTranslucent\n navigationBarTranslucent\n onRequestClose={handleHardwareBack}>\n <StatusBar barStyle={theme.statusBarStyle} backgroundColor=\"transparent\" translucent />\n <SafeAreaProvider initialMetrics={initialWindowMetrics}>\n <SafeAreaInsetsContext.Consumer>\n {(rawInsets) => (\n <View\n style={[\n styles.modalRoot,\n { backgroundColor: theme.surfaceColor },\n insetPadding(rawInsets),\n ]}>\n {/* Minimal, native-feeling header: provider name centered, no address bar,\n lock, reload, or close. Android exits via the device back button; iOS\n exits via a left-edge swipe (the gesture zone below). */}\n <View style={[styles.header, { backgroundColor: theme.surfaceColor }]}>\n <View style={styles.headerSide} />\n <Text\n style={[styles.headerTitle, { color: theme.onSurfaceColor }]}\n numberOfLines={1}>\n {title}\n </Text>\n <View style={styles.headerSide} />\n </View>\n <View style={styles.progressTrack}>\n {progressPct > 0 ? (\n <View\n style={[\n styles.progressFill,\n { width: `${progressPct}%`, backgroundColor: theme.accentColor },\n ]}\n />\n ) : null}\n </View>\n <View\n ref={webHostRef}\n style={[styles.webViewHost, { backgroundColor: theme.surfaceColor }]}>\n {ResolvedWebView && resolved ? (\n <ResolvedWebView\n {...(webViewProps ?? {})}\n ref={webRef}\n source={{\n uri: mainDocumentScriptReady\n ? (webViewUrl ?? providerLoginUrl(resolved.template))\n : WEBVIEW_BOOTSTRAP_URL,\n }}\n style={[styles.webView, webViewProps?.style]}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={useNativePopups}\n injectedJavaScriptBeforeContentLoaded={mainInjectedScript}\n injectedJavaScript={mainInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handleOpenWindow}\n onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}\n onNavigationStateChange={handleNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadStart, event);\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL)\n return;\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadEnd, event);\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL)\n return;\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n webRef.current?.injectJavaScript?.(mainInjectedScript);\n maybeTriggerHtmlCapture(nextChrome.url);\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n ) : (\n <View style={styles.webViewFallback}>\n <Text style={styles.errorText}>react-native-webview is not available.</Text>\n </View>\n )}\n {ResolvedWebView && resolved && managedPopup ? (\n <View\n ref={popupHostRef}\n style={[styles.popupOverlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={[styles.popupHeader, { backgroundColor: theme.surfaceColor }]}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Back\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={() => closeManagedPopup()}>\n <Text style={[styles.headerBackGlyph, { color: theme.onSurfaceColor }]}>\n ‹\n </Text>\n </Pressable>\n <Text\n style={[styles.headerTitle, { color: theme.onSurfaceColor }]}\n numberOfLines={1}>\n Sign in\n </Text>\n <View style={styles.headerSide} />\n </View>\n <ResolvedWebView\n {...(webViewProps ?? {})}\n ref={popupRef}\n key={managedPopupKey(managedPopup)}\n source={\n popupDocumentScriptReady\n ? managedPopupSource(managedPopup)\n : { uri: WEBVIEW_BOOTSTRAP_URL }\n }\n style={[styles.webView, webViewProps?.style]}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={false}\n injectedJavaScriptBeforeContentLoaded={popupInjectedScript}\n injectedJavaScript={popupInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handlePopupOpenWindow}\n onShouldStartLoadWithRequest={handlePopupShouldStartLoadWithRequest}\n onNavigationStateChange={handlePopupNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadStart, event);\n if (\n !popupDocumentScriptReady &&\n nextChrome.url === WEBVIEW_BOOTSTRAP_URL\n ) {\n return;\n }\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadEnd, event);\n if (\n !popupDocumentScriptReady &&\n nextChrome.url === WEBVIEW_BOOTSTRAP_URL\n ) {\n return;\n }\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n popupRef.current?.injectJavaScript?.(popupInjectedScript);\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n </View>\n ) : null}\n {isProcessing ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {processingCopy(phase)}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n Keep this screen open — it only takes a moment.\n </Text>\n </View>\n ) : null}\n {error ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={styles.errorIconWrap}>\n <Text style={styles.errorIconGlyph}>!</Text>\n </View>\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n Couldn't verify your account\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n {friendlyError(error)}\n </Text>\n <Pressable\n style={[styles.primaryAction, { backgroundColor: theme.accentColor }]}\n onPress={openFlow}>\n <Text style={styles.primaryActionText}>Try again</Text>\n </Pressable>\n <Pressable style={styles.secondaryAction} onPress={() => closeFlow(true)}>\n <Text style={[styles.secondaryActionText, { color: theme.mutedColor }]}>\n Close\n </Text>\n </Pressable>\n </View>\n ) : null}\n {/* iOS-only invisible left-edge strip that recognizes the swipe-back gesture.\n Sits above the WebView and popup so the swipe works in every state. */}\n {Platform.OS === 'ios' ? (\n <View\n style={styles.edgeSwipeZone}\n accessibilityElementsHidden\n {...edgeSwipeResponder.panHandlers}\n />\n ) : null}\n </View>\n </View>\n )}\n </SafeAreaInsetsContext.Consumer>\n </SafeAreaProvider>\n </Modal>\n </>\n );\n}\n\nasync function resolveProvider(\n providerId: string | undefined,\n providerTemplate: SatyaProviderTemplate | undefined,\n providerRegistrySource: SatyaProviderRegistrySource | undefined,\n endpointId: string | undefined,\n spkiPins: readonly string[] | undefined,\n transportConfig: SatyaTransportConfig,\n providerPolicyRefresh: SatyaProviderPolicyRefreshMode\n): Promise<ResolvedProvider> {\n const base = providerTemplate\n ? validateProviderTemplate(providerTemplate, { source: 'providerTemplate', endpointId })\n : requireProviderTemplate(\n providerId ?? '',\n await loadProviderRegistry(providerRegistrySource),\n endpointId\n );\n if (spkiPins !== undefined) {\n const template = withProviderSpkiPins(base, normalizePins(spkiPins));\n return {\n template,\n pinCount: template.tlsIdentityPolicy.spkiSha256B64Pins?.length ?? 0,\n pinSource: 'explicit',\n };\n }\n\n let refreshError: unknown = null;\n if (providerPolicyRefresh !== 'template-only') {\n try {\n const policy = await fetchVerifierProviderPolicy({\n notaryUrl: transportConfig.notaryUrl,\n providerId: base.providerId,\n bearerToken: transportConfig.verifierBearerToken,\n });\n validateProviderPolicyForTemplate(policy, base);\n const template = withProviderSpkiPins(base, policy.spkiSha256B64Pins);\n return {\n template,\n pinCount: template.tlsIdentityPolicy.spkiSha256B64Pins?.length ?? 0,\n pinSource: 'verifier',\n };\n } catch (cause) {\n refreshError = cause;\n if (providerPolicyRefresh === 'verifier-required') throw cause;\n }\n }\n\n const pins = normalizePins(base.tlsIdentityPolicy.spkiSha256B64Pins ?? []);\n if (pins.length === 0 && refreshError) throw refreshError;\n const template = withProviderSpkiPins(base, pins);\n return {\n template,\n pinCount: template.tlsIdentityPolicy.spkiSha256B64Pins?.length ?? 0,\n pinSource: 'template',\n };\n}\n\nfunction normalizePins(pins: readonly string[]): string[] {\n return pins.map((pin) => pin.trim()).filter(Boolean);\n}\n\nfunction pinSourceLabel(source: ResolvedProvider['pinSource']): string {\n if (source === 'verifier') return 'verifier-refreshed';\n if (source === 'explicit') return 'explicit';\n return 'template';\n}\n\nfunction resolveWebViewComponent(providedWebView?: WebViewComponent): WebViewComponent | null {\n if (providedWebView) return providedWebView;\n try {\n const webviewModule = require('react-native-webview') as { WebView?: WebViewComponent };\n return webviewModule.WebView ?? null;\n } catch {\n return null;\n }\n}\n\nfunction providerDisplayName(template: SatyaProviderTemplate): string {\n return (\n template.name?.trim() ||\n template.displayName?.trim() ||\n template.label?.trim() ||\n template.providerId\n );\n}\n\nfunction providerHost(template: SatyaProviderTemplate): string {\n if (template.tlsIdentityPolicy?.expectedSni) return template.tlsIdentityPolicy.expectedSni;\n if (template.target?.host) return template.target.host;\n try {\n return new URL(template.proofTarget?.url ?? template.endpoints[0]?.url ?? '').hostname;\n } catch {\n return template.providerId;\n }\n}\n\nfunction providerLoginUrl(template: SatyaProviderTemplate): string {\n return template.webLogin?.startUrl ?? template.login.url;\n}\n\nfunction resolveEffectiveUserAgent(\n template: SatyaProviderTemplate,\n explicitUserAgent?: string\n): string {\n const trimmedExplicit = explicitUserAgent?.trim();\n if (trimmedExplicit) return trimmedExplicit;\n\n const settings = template.userAgent;\n const platformUserAgent = Platform.OS === 'ios' ? settings?.ios : settings?.android;\n const trimmedProviderUserAgent = platformUserAgent?.trim();\n if (trimmedProviderUserAgent) return trimmedProviderUserAgent;\n\n return defaultMobileBrowserUserAgent();\n}\n\nfunction endpointCaptureFromTarget(\n target: SatyaProviderTemplate['proofTarget'] | undefined\n): SatyaProviderEndpointCapture | null {\n return isRecord(target?.capture) ? (target.capture as SatyaProviderEndpointCapture) : null;\n}\n\nfunction defaultMobileBrowserUserAgent(): string {\n if (Platform.OS === 'ios') {\n return 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1';\n }\n return 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36';\n}\n\nfunction validateTemplateForReplay(template: SatyaProviderTemplate): string | null {\n if (!template.providerId) return 'Provider template is missing providerId';\n if (!template.proofTarget?.url) return `${template.providerId} is missing proofTarget.url`;\n if (!template.proofTarget?.method) return `${template.providerId} is missing proofTarget.method`;\n if (!template.endpoints?.length) return `${template.providerId} has no endpoints`;\n if (!template.tlsIdentityPolicy?.expectedSni) {\n return `${template.providerId} is missing tlsIdentityPolicy.expectedSni`;\n }\n if (!template.templateGovernance?.templateHash) {\n return `${template.providerId} is missing templateGovernance.templateHash`;\n }\n if (!template.templateGovernance?.parserHash) {\n return `${template.providerId} is missing templateGovernance.parserHash`;\n }\n const responseRevealCount =\n template.privacyPolicy?.allowedResponseReveals?.length ??\n template.privacyPolicy?.allowedResponseBodyJsonPaths?.length ??\n 0;\n if (responseRevealCount === 0) {\n return `${template.providerId} has no response reveals`;\n }\n return null;\n}\n\nasync function postBackendVerifier(\n notaryUrl: string,\n artifactJson: string,\n bearerToken?: string\n): Promise<SatyaBackendVerifyResult> {\n const url = backendVerifierUrl(notaryUrl);\n const response = await fetch(url, {\n method: 'POST',\n headers: verifierRequestHeaders(bearerToken),\n body: artifactJson,\n });\n const text = await response.text();\n if (!text.trim()) {\n return {\n ok: false,\n status: response.status,\n url,\n error: `empty response from ${url}`,\n };\n }\n try {\n const decoded = JSON.parse(text) as unknown;\n if (decoded && typeof decoded === 'object' && !Array.isArray(decoded)) {\n return {\n ok: response.ok,\n status: response.status,\n url,\n ...(decoded as Record<string, unknown>),\n };\n }\n return {\n ok: false,\n status: response.status,\n url,\n error: `unexpected verifier response shape from ${url}`,\n body: decoded,\n };\n } catch {\n return {\n ok: false,\n status: response.status,\n url,\n error: `non-JSON response from ${url}`,\n bodyPreview: text.slice(0, 500),\n };\n }\n}\n\nfunction verifierRequestHeaders(bearerToken?: string): Record<string, string> {\n const headers: Record<string, string> = { 'content-type': 'application/json' };\n const token = bearerToken?.trim();\n if (token) headers.authorization = `Bearer ${token}`;\n return headers;\n}\n\nfunction backendVerifierUrl(notaryUrl: string): string {\n return `${notaryUrl.replace(/\\/+$/, '')}/v1/artifacts/verify`;\n}\n\nfunction invokeWebViewCallback(callback: unknown, event: unknown): void {\n if (typeof callback === 'function') {\n (callback as (event: unknown) => void)(event);\n }\n}\n\nfunction invokeShouldStartLoadWithRequest(\n callback: unknown,\n request: WebViewShouldStartLoadRequestLike\n): boolean | undefined {\n if (typeof callback !== 'function') return undefined;\n return (callback as (request: WebViewShouldStartLoadRequestLike) => boolean)(request);\n}\n\nfunction readBrowserChromeState(event: unknown): Partial<BrowserChromeState> {\n const raw = readNavigationPayload(event);\n const next: Partial<BrowserChromeState> = {};\n if (typeof raw.url === 'string') next.url = raw.url;\n if (typeof raw.title === 'string') next.title = raw.title;\n if (typeof raw.canGoBack === 'boolean') next.canGoBack = raw.canGoBack;\n if (typeof raw.canGoForward === 'boolean') next.canGoForward = raw.canGoForward;\n if (typeof raw.loading === 'boolean') next.loading = raw.loading;\n return next;\n}\n\nfunction readNavigationPayload(event: unknown): Record<string, unknown> {\n if (!isRecord(event)) return {};\n if (isRecord(event.nativeEvent)) return event.nativeEvent;\n return event;\n}\n\ninterface ResolvedTheme {\n surfaceColor: string;\n onSurfaceColor: string;\n mutedColor: string;\n accentColor: string;\n statusBarStyle: 'light-content' | 'dark-content';\n}\n\nconst DEFAULT_THEME: ResolvedTheme = {\n surfaceColor: '#ffffff',\n onSurfaceColor: '#172033',\n mutedColor: '#66758a',\n accentColor: '#2752d9',\n statusBarStyle: 'dark-content',\n};\n\nfunction resolveTheme(theme?: SatyaProviderAttestTheme): ResolvedTheme {\n if (!theme) return DEFAULT_THEME;\n return {\n surfaceColor: theme.surfaceColor?.trim() || DEFAULT_THEME.surfaceColor,\n onSurfaceColor: theme.onSurfaceColor?.trim() || DEFAULT_THEME.onSurfaceColor,\n mutedColor: theme.mutedColor?.trim() || DEFAULT_THEME.mutedColor,\n accentColor: theme.accentColor?.trim() || DEFAULT_THEME.accentColor,\n statusBarStyle: theme.statusBarStyle ?? DEFAULT_THEME.statusBarStyle,\n };\n}\n\n// Pad the managed-WebView surface clear of the notch / status bar (top) and the home\n// indicator or on-screen nav buttons (bottom + sides in landscape) so the page never\n// clips into a bezel. The Modal renders edge-to-edge (statusBarTranslucent +\n// navigationBarTranslucent), so these insets are the single source of truth. When the\n// SafeAreaProvider has not measured yet (null), fall back to the Android status-bar height.\nfunction insetPadding(insets: EdgeInsets | null): {\n paddingTop: number;\n paddingBottom: number;\n paddingLeft: number;\n paddingRight: number;\n} {\n const fallbackTop = Platform.OS === 'android' ? (StatusBar.currentHeight ?? 24) : 0;\n return {\n paddingTop: insets ? Math.max(insets.top, fallbackTop) : fallbackTop,\n paddingBottom: insets?.bottom ?? 0,\n paddingLeft: insets?.left ?? 0,\n paddingRight: insets?.right ?? 0,\n };\n}\n\nfunction isWebViewSafeUrl(url: string): boolean {\n try {\n const protocol = new URL(url).protocol.toLowerCase();\n return (\n protocol === 'http:' ||\n protocol === 'https:' ||\n protocol === 'about:' ||\n protocol === 'blob:' ||\n protocol === 'data:'\n );\n } catch {\n return true;\n }\n}\n\nfunction parseIntentBrowserFallbackUrl(url: string): string | null {\n if (!url.toLowerCase().startsWith('intent:')) return null;\n\n const explicitFallback = /(?:^|;)S\\.browser_fallback_url=([^;]+)/i.exec(url)?.[1];\n if (explicitFallback) {\n try {\n const decoded = decodeURIComponent(explicitFallback);\n if (isHttpUrl(decoded)) return decoded;\n } catch {\n return null;\n }\n }\n\n const intentPrefix = 'intent://';\n const intentMarker = '#Intent;';\n if (!url.toLowerCase().startsWith(intentPrefix)) return null;\n\n const intentPath = url.slice(intentPrefix.length).split(intentMarker)[0];\n const scheme = /(?:^|;)scheme=([^;]+)/i.exec(url)?.[1];\n if (!intentPath || !scheme) return null;\n\n const reconstructed = `${scheme}://${intentPath}`;\n return isHttpUrl(reconstructed) ? reconstructed : null;\n}\n\nfunction isHttpUrl(url: string): boolean {\n try {\n const protocol = new URL(url).protocol.toLowerCase();\n return protocol === 'http:' || protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nfunction schemeLabel(url: string): string {\n const match = /^([a-z][a-z0-9+.-]*):/i.exec(url);\n return match ? `${match[1]}://` : 'external URL';\n}\n\nfunction processingCopy(phase: SatyaProviderFlowPhase): string {\n if (phase === 'backendVerify') return 'Finishing verification…';\n if (phase === 'nativeReplay') return 'Securely verifying your account…';\n return 'Verifying your account…';\n}\n\nfunction friendlyError(message: string): string {\n const m = (message || '').toLowerCase();\n if (\n m.includes('403') ||\n m.includes('forbidden') ||\n m.includes('cloudflare') ||\n m.includes('bot')\n ) {\n return 'This provider is blocking automated verification right now. Please try again later.';\n }\n if (m.includes('network') || m.includes('timeout') || m.includes('timed out')) {\n return 'There was a network problem. Check your connection and try again.';\n }\n if (m.includes('pin') || m.includes('certificate') || m.includes('tls') || m.includes('secure')) {\n return 'We couldn’t establish a secure connection to this provider. Please try again.';\n }\n if (m.includes('claim') || m.includes('reveal') || m.includes('match')) {\n return 'We couldn’t read the expected details. Make sure you’re fully signed in, then try again.';\n }\n return 'Something went wrong. Please try again.';\n}\n\nfunction managedPopupSource(popup: ManagedPopupState): Record<string, unknown> {\n const method = (popup.method ?? 'GET').toUpperCase();\n if (method === 'GET') return { uri: popup.url };\n return {\n uri: popup.url,\n method,\n body: popup.body ?? '',\n headers: popup.headers ?? undefined,\n };\n}\n\nfunction managedPopupKey(popup: ManagedPopupState): string {\n const method = (popup.method ?? 'GET').toUpperCase();\n const bodyHash = popup.body ? stableStringHash(popup.body) : 'no-body';\n return `${popup.target ?? 'popup'}:${method}:${popup.url}:${bodyHash}`;\n}\n\nfunction stableStringHash(input: string): string {\n let hash = 5381;\n for (let i = 0; i < input.length; i += 1) {\n hash = (hash * 33) ^ input.charCodeAt(i);\n }\n return (hash >>> 0).toString(36);\n}\n\nasync function installAndroidDocumentStartScript(\n ref: View | null,\n script: string\n): Promise<boolean | null> {\n if (Platform.OS !== 'android') return true;\n const tag = findNodeHandle(ref);\n if (!tag) return null;\n try {\n return await SatyaAttestModule.installWebViewDocumentStartScript(tag, script);\n } catch {\n return false;\n }\n}\n\nasync function enableAndroidPopupWindows(ref: View | null): Promise<boolean> {\n if (Platform.OS !== 'android') return true;\n const tag = findNodeHandle(ref);\n if (!tag) return false;\n try {\n return await SatyaAttestModule.setPopupWindowsEnabled(tag, true);\n } catch {\n return false;\n }\n}\n\nfunction buildPopupClosedScript(target?: string | null, url?: string | null): string {\n return `try {\n if (window.__satyaProviderPopupClosed) {\n window.__satyaProviderPopupClosed(${scriptJson(target ?? null)}, ${scriptJson(url ?? null)});\n }\n} catch (_) {}\ntrue;`;\n}\n\nfunction buildPopupPostMessageRelayScript(popup: ProviderPopupPostMessage): string {\n const origin = originFromUrl(popup.sourceUrl ?? popup.url);\n const targetJson = scriptJson(popup.target ?? null);\n const dataJson = scriptJson(popup.data ?? null);\n const originJson = scriptJson(origin);\n return `try {\n function broadcastToFrames(payload) {\n var queue = [window];\n for (var cursor = 0; cursor < queue.length && cursor < 32; cursor += 1) {\n var current = queue[cursor];\n var length = 0;\n try { length = current.frames.length; } catch (_) { length = 0; }\n for (var i = 0; i < length; i += 1) {\n var frame = null;\n try { frame = current.frames[i]; } catch (_) { frame = null; }\n if (!frame) continue;\n try { frame.postMessage(payload, '*'); } catch (_) {}\n try {\n if (frame.frames && frame.frames.length) queue.push(frame);\n } catch (_) {}\n }\n }\n }\n var relay = {\n __satyaProviderPopupRelay: true,\n target: ${targetJson},\n data: ${dataJson},\n origin: ${originJson}\n };\n if (window.__satyaProviderDispatchPopupMessage) {\n window.__satyaProviderDispatchPopupMessage(relay.target, relay.data, relay.origin);\n } else {\n window.dispatchEvent(new MessageEvent('message', {\n data: relay.data,\n origin: relay.origin\n }));\n }\n broadcastToFrames(relay.data);\n broadcastToFrames(relay);\n} catch (_) {}\ntrue;`;\n}\n\nfunction buildOpenerToPopupMessageRelayScript(popup: ProviderPopupPostMessage): string {\n // The message originates from the opener (the login page), so its origin is the\n // opener's origin (carried in sourceUrl), not the popup's current URL.\n const origin = originFromUrl(popup.sourceUrl ?? popup.url);\n const dataJson = scriptJson(popup.data ?? null);\n const originJson = scriptJson(origin);\n const portsJson = scriptJson(popup.ports ?? []);\n return `try {\n if (window.__satyaProviderDispatchOpenerMessage) {\n window.__satyaProviderDispatchOpenerMessage(${dataJson}, ${originJson}, ${portsJson});\n } else {\n window.dispatchEvent(new MessageEvent('message', {\n data: ${dataJson},\n origin: ${originJson}\n }));\n }\n} catch (_) {}\ntrue;`;\n}\n\nfunction buildPopupPortMessageRelayScript(popup: ProviderPopupPostMessage): string {\n const portIdJson = scriptJson(popup.portId ?? null);\n const dataJson = scriptJson(popup.data ?? null);\n return `try {\n if (window.__satyaProviderDispatchPopupPortMessage) {\n window.__satyaProviderDispatchPopupPortMessage(${portIdJson}, ${dataJson});\n }\n} catch (_) {}\ntrue;`;\n}\n\nfunction buildOpenerToPopupPortMessageRelayScript(popup: ProviderPopupPostMessage): string {\n const portIdJson = scriptJson(popup.portId ?? null);\n const dataJson = scriptJson(popup.data ?? null);\n return `try {\n if (window.__satyaProviderDispatchOpenerPortMessage) {\n window.__satyaProviderDispatchOpenerPortMessage(${portIdJson}, ${dataJson});\n }\n} catch (_) {}\ntrue;`;\n}\n\nfunction originFromUrl(url?: string | null): string {\n if (!url) return '';\n try {\n return new URL(url).origin;\n } catch {\n return '';\n }\n}\n\n// Correlate a captured response back to the held request for response-gated capture. A 2xx\n// fetch keeps the same URL; allow query/hash differences by also matching host + pathname.\nfunction responseUrlMatchesRequest(\n responseUrl?: string | null,\n requestUrl?: string | null\n): boolean {\n if (!responseUrl || !requestUrl) return false;\n const strip = (value: string) => {\n const hashIndex = value.indexOf('#');\n return hashIndex >= 0 ? value.slice(0, hashIndex) : value;\n };\n if (strip(responseUrl) === strip(requestUrl)) return true;\n try {\n const a = new URL(responseUrl);\n const b = new URL(requestUrl);\n return a.hostname === b.hostname && a.pathname === b.pathname;\n } catch {\n return false;\n }\n}\n\nfunction scriptJson(value: unknown): string {\n const encoded = JSON.stringify(value);\n return encoded === undefined ? 'null' : encoded;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nconst styles = StyleSheet.create({\n button: {\n minHeight: 48,\n borderRadius: 8,\n paddingHorizontal: 16,\n paddingVertical: 12,\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'row',\n backgroundColor: '#2752d9',\n },\n buttonDisabled: { opacity: 0.55 },\n buttonSpinner: { marginRight: 8 },\n buttonText: { color: '#ffffff', fontSize: 15, fontWeight: '700' },\n modalRoot: { flex: 1, backgroundColor: '#ffffff' },\n\n header: {\n height: 48,\n paddingHorizontal: 8,\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: '#ffffff',\n },\n headerSide: {\n width: 40,\n height: 40,\n alignItems: 'center',\n justifyContent: 'center',\n },\n headerBackGlyph: { color: '#172033', fontSize: 30, fontWeight: '400', marginTop: -3 },\n headerTitle: {\n flex: 1,\n textAlign: 'center',\n color: '#172033',\n fontSize: 15,\n fontWeight: '600',\n },\n\n progressTrack: { height: 2.5, backgroundColor: '#eef1f7', overflow: 'hidden' },\n progressFill: { height: '100%', backgroundColor: '#2752d9', borderRadius: 2 },\n\n webViewHost: { flex: 1, backgroundColor: '#ffffff' },\n webView: { flex: 1 },\n // Narrow transparent strip pinned to the left edge that captures the iOS swipe-back gesture\n // without stealing the rest of the WebView's touches.\n edgeSwipeZone: { position: 'absolute', left: 0, top: 0, bottom: 0, width: 24 },\n\n overlay: {\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 32,\n backgroundColor: 'rgba(255, 255, 255, 0.97)',\n },\n overlayTitle: {\n marginTop: 18,\n color: '#172033',\n fontSize: 18,\n fontWeight: '700',\n textAlign: 'center',\n },\n overlaySubtitle: {\n marginTop: 8,\n color: '#66758a',\n fontSize: 14,\n lineHeight: 20,\n textAlign: 'center',\n maxWidth: 320,\n },\n errorIconWrap: {\n width: 56,\n height: 56,\n borderRadius: 28,\n backgroundColor: '#fdecef',\n alignItems: 'center',\n justifyContent: 'center',\n },\n errorIconGlyph: { color: '#d6334e', fontSize: 30, fontWeight: '800' },\n primaryAction: {\n marginTop: 26,\n minWidth: 220,\n minHeight: 48,\n borderRadius: 8,\n backgroundColor: '#2752d9',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 24,\n },\n primaryActionText: { color: '#ffffff', fontSize: 15, fontWeight: '700' },\n secondaryAction: {\n marginTop: 6,\n minHeight: 44,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 24,\n },\n secondaryActionText: { color: '#66758a', fontSize: 14, fontWeight: '600' },\n\n popupOverlay: {\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n backgroundColor: '#ffffff',\n },\n popupHeader: {\n height: 48,\n paddingHorizontal: 8,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: '#eef1f7',\n backgroundColor: '#ffffff',\n flexDirection: 'row',\n alignItems: 'center',\n },\n\n webViewFallback: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n backgroundColor: '#ffffff',\n },\n errorText: { color: '#d6334e', fontSize: 14, textAlign: 'center' },\n});\n"]}
1
+ {"version":3,"file":"SatyaProviderAttestButton.js","sourceRoot":"","sources":["../src/SatyaProviderAttestButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n findNodeHandle,\n Modal,\n PanResponder,\n Platform,\n Pressable,\n StatusBar,\n StyleSheet,\n Text,\n View,\n} from 'react-native';\nimport {\n initialWindowMetrics,\n SafeAreaInsetsContext,\n SafeAreaProvider,\n type EdgeInsets,\n} from 'react-native-safe-area-context';\n\nimport {\n CapturedProviderRequest,\n CapturedProviderResponse,\n SatyaError,\n SatyaPhase,\n SatyaProgress,\n SatyaProviderEndpointCapture,\n SatyaProviderRegistrySource,\n SatyaProviderTemplate,\n SatyaTransportConfig,\n} from './SatyaAttest.types';\nimport SatyaAttestModule from './SatyaAttestModule';\nimport type { AttestOutcome } from './SatyaMobileClient';\nimport { SatyaMobileClient } from './SatyaMobileClient';\nimport {\n isSatyaDebugEnabled,\n ingestWebViewLog,\n satyaDebug,\n summarizeRequest,\n summarizeResponse,\n} from './debugLog';\nimport type { SatyaProviderPolicyRefreshMode } from './providerPolicy';\nimport { fetchVerifierProviderPolicy, validateProviderPolicyForTemplate } from './providerPolicy';\nimport {\n loadProviderRegistry,\n requestMatchesProviderTemplate,\n requireProviderTemplate,\n validateProviderTemplate,\n withProviderSpkiPins,\n} from './providerRegistry';\nimport {\n buildActiveFetchScript,\n buildProviderDocumentStartScript,\n buildProviderPopupBridgeScript,\n buildProviderWebViewScript,\n ProviderCaptureMessage,\n ProviderPopupMessage,\n ProviderPopupPostMessage,\n} from './providerWebview';\n\ntype RuntimeRequire = (moduleName: string) => unknown;\ndeclare const require: RuntimeRequire;\n\ntype WebViewMessageEventLike = { nativeEvent: { data: string } };\ntype WebViewNavigationEventLike = { nativeEvent?: { targetUrl?: string; url?: string } };\n\n// Native-replay host retarget (see Garmin connectapi): capture the SPA's request on the\n// browser-reachable cookie host, then rewrite it to the pinned API host and inject the DI\n// bearer so the native (non-CORS, non-Cloudflare) pinned replay can run. The replay host is\n// fixed by trusted template config (`toHost` == pinned expectedSni); only the path comes from\n// the captured (match-rule-constrained) request.\nfunction rewriteForNativeReplay(\n request: CapturedProviderRequest,\n template: SatyaProviderTemplate,\n bearer: string | null\n): CapturedProviderRequest {\n const proof = template.proofTarget as\n | {\n nativeReplayRewrite?: { fromHost?: string; toHost?: string; stripPathPrefix?: string };\n nativeReplayInjectBearer?: boolean;\n }\n | undefined;\n const rw = proof?.nativeReplayRewrite;\n let url = request.url;\n const headers: Record<string, string> = { ...request.headers };\n if (rw?.fromHost && rw?.toHost) {\n const fromBase = `https://${rw.fromHost}`;\n if (url.startsWith(fromBase)) {\n let rest = url.slice(fromBase.length);\n if (rw.stripPathPrefix && rest.startsWith(rw.stripPathPrefix)) {\n rest = rest.slice(rw.stripPathPrefix.length);\n }\n url = `https://${rw.toHost}${rest}`;\n }\n }\n if (proof?.nativeReplayInjectBearer && bearer) {\n headers.authorization = `Bearer ${bearer}`;\n }\n return { ...request, url, headers };\n}\ntype WebViewShouldStartLoadRequestLike = { url?: string; [key: string]: unknown };\ntype WebViewRefLike = {\n injectJavaScript?: (script: string) => void;\n goBack?: () => void;\n goForward?: () => void;\n reload?: () => void;\n};\ntype WebViewComponent = React.ComponentType<Record<string, unknown>>;\n\ninterface BrowserChromeState {\n url: string;\n title: string;\n canGoBack: boolean;\n canGoForward: boolean;\n loading: boolean;\n}\n\nconst EMPTY_BROWSER_CHROME: BrowserChromeState = {\n url: '',\n title: '',\n canGoBack: false,\n canGoForward: false,\n loading: false,\n};\nconst WEBVIEW_BOOTSTRAP_URL = 'about:blank';\nconst HTML_CAPTURE_HEADER_NAME = 'x-satya-html-capture';\nconst HTML_CAPTURE_HEADER_VALUE = '1';\n\nexport type SatyaProviderFlowPhase =\n | 'idle'\n | 'openingWebView'\n | 'waitingForRequest'\n | 'requestCaptured'\n | 'nativeReplay'\n | 'backendVerify'\n | 'verified'\n | 'failed'\n | 'cancelled'\n | SatyaPhase;\n\nexport interface SatyaProviderFlowProgress {\n phase: SatyaProviderFlowPhase;\n message: string;\n percent: number;\n providerId?: string;\n}\n\nexport interface SatyaBackendVerifyResult {\n ok: boolean;\n status: number;\n url: string;\n error?: string;\n [key: string]: unknown;\n}\n\nexport interface SatyaProviderAttestationResult extends AttestOutcome {\n providerTemplate: SatyaProviderTemplate;\n capturedRequest: CapturedProviderRequest;\n backendVerify?: SatyaBackendVerifyResult | null;\n}\n\n/**\n * Optional visual theme for the managed WebView surface. Lets the host app match the\n * flow to its own brand so the WebView reads as part of the parent app rather than a\n * separate browser window. Every field is optional and falls back to the SDK defaults.\n */\nexport interface SatyaProviderAttestTheme {\n /** Background of the safe-area strips and the slim header (default `#ffffff`). */\n surfaceColor?: string;\n /** Title / icon color drawn on `surfaceColor` (default `#172033`). */\n onSurfaceColor?: string;\n /** Secondary / muted text color (default `#66758a`). */\n mutedColor?: string;\n /** Accent for the progress bar, spinners, and primary buttons (default `#2752d9`). */\n accentColor?: string;\n /** Status-bar icon style; pick to contrast `surfaceColor` (default `dark-content`). */\n statusBarStyle?: 'light-content' | 'dark-content';\n}\n\nexport interface SatyaProviderAttestButtonProps {\n /**\n * Provider id from the SDK registry. Pass either `providerId` or `providerTemplate`.\n */\n providerId?: string;\n /**\n * Endpoint id from `providerTemplate.endpoints`. Defaults to the first endpoint.\n */\n endpointId?: string;\n /**\n * Optional custom provider template. Useful when an app ships an allow-listed\n * provider config but still wants the SDK-owned WebView/replay flow.\n */\n providerTemplate?: SatyaProviderTemplate;\n /**\n * Optional provider registry source used when resolving `providerId`.\n * Pass a validated in-app registry object, `{ registry }`, or an HTTPS registry URL:\n *\n * `{ url: 'https://example.com/satya/providers.json' }`\n *\n * `providerTemplate` wins when both are supplied.\n */\n providerRegistrySource?: SatyaProviderRegistrySource;\n /**\n * Runtime SPKI SHA-256 pins, base64 encoded. Native replay requires at least one pin.\n * When provided, these explicit pins win over verifier/template policy refresh.\n */\n spkiPins?: readonly string[];\n /**\n * Controls SPKI policy refresh before the SDK opens the managed WebView.\n *\n * - `verifier-first` fetches `${notaryUrl}/v1/providers/{providerId}/policy`\n * and falls back to embedded template pins.\n * - `verifier-required` fails closed if verifier policy is unavailable.\n * - `template-only` uses only the SDK/provider template pins.\n */\n providerPolicyRefresh?: SatyaProviderPolicyRefreshMode;\n transportConfig: SatyaTransportConfig;\n /**\n * Reuse a client if the host app wants to subscribe elsewhere. Otherwise the\n * component creates one internally.\n */\n client?: SatyaMobileClient;\n /**\n * Also post the artifact to `${notaryUrl}/v1/artifacts/verify`.\n */\n verifyBackend?: boolean;\n buttonLabel?: string;\n disabled?: boolean;\n modalTitle?: string;\n /**\n * Optional theme so the managed WebView surface matches the host app's brand and\n * feels like a native screen of the parent app. Pass `modalTitle=\"\"` to hide the\n * header title entirely.\n */\n theme?: SatyaProviderAttestTheme;\n /**\n * The component closes the WebView once the attestation is generated by default.\n */\n autoCloseOnComplete?: boolean;\n /**\n * Optional WebView implementation. If omitted, the component loads\n * `react-native-webview` from the host Expo app at runtime.\n */\n WebViewComponent?: WebViewComponent;\n /**\n * Explicit managed-WebView user agent. If unset, provider `userAgent` settings\n * are used, falling back to a mobile browser UA like `mobile_tlsn_plugin`.\n */\n webViewUserAgent?: string;\n /**\n * Additional props forwarded to WebView. Critical capture handlers are owned by\n * the SDK and cannot be overridden.\n */\n webViewProps?: Record<string, unknown>;\n onProgress?: (progress: SatyaProviderFlowProgress) => void;\n onRequestCaptured?: (request: CapturedProviderRequest, template: SatyaProviderTemplate) => void;\n onComplete?: (result: SatyaProviderAttestationResult) => void;\n onError?: (error: Error) => void;\n onCancel?: () => void;\n}\n\ninterface ResolvedProvider {\n template: SatyaProviderTemplate;\n pinCount: number;\n pinSource: 'explicit' | 'verifier' | 'template';\n}\n\ninterface ManagedPopupState {\n url: string;\n target?: string | null;\n sourceUrl?: string | null;\n method?: string | null;\n body?: string | null;\n headers?: Record<string, string> | null;\n}\n\nexport function SatyaProviderAttestButton({\n providerId,\n endpointId,\n providerTemplate,\n providerRegistrySource,\n spkiPins,\n providerPolicyRefresh = 'verifier-first',\n transportConfig,\n client: providedClient,\n verifyBackend = false,\n buttonLabel = 'Generate Attestation',\n disabled = false,\n modalTitle,\n theme: themeProp,\n autoCloseOnComplete = true,\n WebViewComponent: providedWebView,\n webViewUserAgent,\n webViewProps,\n onProgress,\n onRequestCaptured,\n onComplete,\n onError,\n onCancel,\n}: SatyaProviderAttestButtonProps) {\n const fallbackClient = useMemo(() => new SatyaMobileClient(), []);\n const client = providedClient ?? fallbackClient;\n const webRef = useRef<WebViewRefLike | null>(null);\n const popupRef = useRef<WebViewRefLike | null>(null);\n const webHostRef = useRef<View | null>(null);\n const popupHostRef = useRef<View | null>(null);\n const replayStartedRef = useRef(false);\n const flowSeqRef = useRef(0);\n // URLs already nudged via fetch() to surface an html/text page-load to the request\n // interceptor (top-level navigations are not fetch/XHR, so they aren't captured otherwise).\n const htmlCaptureFetchedRef = useRef<Set<string>>(new Set());\n // For endpoint `capture.trigger` flows: the last matching request seen, held until its\n // response arrives 2xx (login gate) before the native replay is allowed to run.\n const pendingRequestRef = useRef<CapturedProviderRequest | null>(null);\n // DI bearer token lifted from the live provider session (e.g. Garmin connectapi), injected\n // into the native replay request for hosts that require Authorization: Bearer.\n const bearerRef = useRef<string | null>(null);\n // Login-signal gate: provider `injection` posts `__satyaReady` once the proof endpoint\n // returns authenticated content. Some endpoints (e.g. Garmin /proxy/socialProfile) return\n // 200 with an empty body pre-login, which a status-only 2xx gate can't distinguish.\n const loggedInRef = useRef(false);\n const [modalVisible, setModalVisible] = useState(false);\n const [phase, setPhase] = useState<SatyaProviderFlowPhase>('idle');\n const [percent, setPercent] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const [resolved, setResolved] = useState<ResolvedProvider | null>(null);\n const [capturedRequest, setCapturedRequest] = useState<CapturedProviderRequest | null>(null);\n const [ResolvedWebView, setResolvedWebView] = useState<WebViewComponent | null>(null);\n const [effectiveUserAgent, setEffectiveUserAgent] = useState<string | null>(null);\n const [webViewUrl, setWebViewUrl] = useState<string | null>(null);\n const [managedPopup, setManagedPopup] = useState<ManagedPopupState | null>(null);\n // Browser chrome (url/title/canGoBack/loading) is still tracked so navigation handlers and\n // the OAuth popup auto-return logic keep working, but it is no longer rendered as a visible\n // address bar — so only the setter is read here.\n const [, setBrowserChrome] = useState<BrowserChromeState>(EMPTY_BROWSER_CHROME);\n const [popupChrome, setPopupChrome] = useState<BrowserChromeState>(EMPTY_BROWSER_CHROME);\n const [mainDocumentScriptReady, setMainDocumentScriptReady] = useState(Platform.OS !== 'android');\n const [popupDocumentScriptReady, setPopupDocumentScriptReady] = useState(\n Platform.OS !== 'android'\n );\n const [running, setRunning] = useState(false);\n\n // Read once per render. Env-driven (EXPO_PUBLIC_SATYA_DEBUG / EXPO_PUBLIC_ENABLE_LOGGING) or\n // toggled at runtime via setSatyaDebugEnabled(); gates the injected in-WebView logging shim.\n const debugEnabled = isSatyaDebugEnabled();\n\n const emitProgress = useCallback(\n (progress: SatyaProviderFlowProgress) => {\n setPhase(progress.phase);\n setPercent(progress.percent);\n onProgress?.(progress);\n },\n [onProgress]\n );\n\n useEffect(() => {\n return client.subscribeProgress((progress: SatyaProgress) => {\n emitProgress({\n phase: progress.phase,\n message: progress.message,\n percent: progress.percent,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n });\n }, [\n client,\n emitProgress,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n ]);\n\n const fail = useCallback(\n (cause: unknown) => {\n const nextError = cause instanceof Error ? cause : new SatyaError(String(cause));\n replayStartedRef.current = false;\n setRunning(false);\n satyaDebug.error('flow', 'flow failed', {\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n error: nextError.message,\n });\n setError(nextError.message);\n emitProgress({\n phase: 'failed',\n message: nextError.message,\n percent: 1,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n onError?.(nextError);\n },\n [emitProgress, onError, providerId, providerTemplate?.providerId, resolved?.template.providerId]\n );\n\n const openFlow = useCallback(() => {\n const flowSeq = flowSeqRef.current + 1;\n flowSeqRef.current = flowSeq;\n replayStartedRef.current = false;\n htmlCaptureFetchedRef.current.clear();\n pendingRequestRef.current = null;\n bearerRef.current = null;\n loggedInRef.current = false;\n setRunning(true);\n setCapturedRequest(null);\n setError(null);\n satyaDebug.info('flow', 'open flow', {\n providerId: providerId ?? providerTemplate?.providerId,\n endpointId: endpointId ?? null,\n providerPolicyRefresh,\n verifyBackend,\n debug: debugEnabled,\n });\n emitProgress({\n phase: 'openingWebView',\n message: 'Refreshing provider policy',\n percent: 0.02,\n providerId: providerId ?? providerTemplate?.providerId,\n });\n\n (async () => {\n try {\n const nextResolved = await resolveProvider(\n providerId,\n providerTemplate,\n providerRegistrySource,\n endpointId,\n spkiPins,\n transportConfig,\n providerPolicyRefresh\n );\n if (flowSeq !== flowSeqRef.current) return;\n\n const validationError = validateTemplateForReplay(nextResolved.template);\n if (validationError) throw new SatyaError(validationError);\n if (nextResolved.pinCount === 0) {\n throw new SatyaError(\n `Add at least one SPKI SHA-256 base64 pin for ${providerHost(nextResolved.template)}`\n );\n }\n const WebView = resolveWebViewComponent(providedWebView);\n if (!WebView) {\n throw new SatyaError(\n 'Install react-native-webview in the host Expo app before using SatyaProviderAttestButton'\n );\n }\n setResolved(nextResolved);\n setResolvedWebView(() => WebView);\n setEffectiveUserAgent(resolveEffectiveUserAgent(nextResolved.template, webViewUserAgent));\n const startUrl = providerLoginUrl(nextResolved.template);\n setWebViewUrl(startUrl);\n setManagedPopup(null);\n setMainDocumentScriptReady(Platform.OS !== 'android');\n setPopupDocumentScriptReady(Platform.OS !== 'android');\n setBrowserChrome({\n ...EMPTY_BROWSER_CHROME,\n url: startUrl,\n title: providerDisplayName(nextResolved.template),\n loading: true,\n });\n setPopupChrome(EMPTY_BROWSER_CHROME);\n setCapturedRequest(null);\n setError(null);\n setRunning(false);\n setModalVisible(true);\n satyaDebug.info('flow', 'provider resolved — opening WebView', {\n providerId: nextResolved.template.providerId,\n pinSource: nextResolved.pinSource,\n pinCount: nextResolved.pinCount,\n startUrl,\n proofMethod: nextResolved.template.proofTarget?.method,\n proofUrl: nextResolved.template.proofTarget?.url,\n expectedSni: nextResolved.template.tlsIdentityPolicy?.expectedSni,\n activeFetchTrigger: !!endpointCaptureFromTarget(nextResolved.template.proofTarget)\n ?.trigger,\n });\n emitProgress({\n phase: 'waitingForRequest',\n message: `Open ${providerDisplayName(\n nextResolved.template\n )} and trigger the provider request (${pinSourceLabel(nextResolved.pinSource)} pins)`,\n percent: 0.05,\n providerId: nextResolved.template.providerId,\n });\n } catch (cause) {\n if (flowSeq === flowSeqRef.current) fail(cause);\n }\n })();\n }, [\n debugEnabled,\n emitProgress,\n endpointId,\n fail,\n providerId,\n providerTemplate,\n providerRegistrySource,\n providerPolicyRefresh,\n providedWebView,\n spkiPins,\n transportConfig,\n verifyBackend,\n webViewUserAgent,\n ]);\n\n const closeFlow = useCallback(\n (cancelled: boolean) => {\n satyaDebug.info('flow', cancelled ? 'flow closed (cancelled)' : 'flow closed', {\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n flowSeqRef.current += 1;\n replayStartedRef.current = false;\n if (Platform.OS === 'android') {\n SatyaAttestModule.closePopupWindows().catch(() => undefined);\n }\n setModalVisible(false);\n setRunning(false);\n setWebViewUrl(null);\n setManagedPopup(null);\n setMainDocumentScriptReady(Platform.OS !== 'android');\n setPopupDocumentScriptReady(Platform.OS !== 'android');\n setBrowserChrome(EMPTY_BROWSER_CHROME);\n setPopupChrome(EMPTY_BROWSER_CHROME);\n if (cancelled) {\n emitProgress({\n phase: 'cancelled',\n message: 'Provider attestation cancelled',\n percent: 0,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n onCancel?.();\n }\n },\n [\n emitProgress,\n onCancel,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n ]\n );\n\n const runReplay = useCallback(\n async (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n replayStartedRef.current = true;\n setRunning(true);\n setError(null);\n satyaDebug.info('replay', 'native replay started', {\n providerId: template.providerId,\n method: request.method,\n url: request.url,\n verifyBackend,\n });\n emitProgress({\n phase: 'nativeReplay',\n message: `Replaying ${providerDisplayName(template)} natively`,\n percent: 0.1,\n providerId: template.providerId,\n });\n try {\n const outcome = await client.attestNativeReplay({\n providerTemplate: template,\n capturedRequest: request,\n transportConfig,\n });\n satyaDebug.info('replay', 'native replay artifact produced', {\n providerId: template.providerId,\n verified: outcome.verify.ok,\n attestationId: outcome.verify.attestationId,\n mode: outcome.verify.mode,\n platformTier: outcome.verify.platformTier,\n });\n let backendVerify: SatyaBackendVerifyResult | null = null;\n if (verifyBackend) {\n emitProgress({\n phase: 'backendVerify',\n message: 'Posting artifact to backend verifier',\n percent: 0.96,\n providerId: template.providerId,\n });\n try {\n backendVerify = await postBackendVerifier(\n transportConfig.notaryUrl,\n outcome.raw,\n transportConfig.verifierBearerToken\n );\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n backendVerify = {\n ok: false,\n status: 0,\n url: backendVerifierUrl(transportConfig.notaryUrl),\n error: `backend verifier unreachable: ${message}`,\n };\n }\n satyaDebug.info('replay', 'backend verifier responded', {\n ok: backendVerify?.ok ?? null,\n status: backendVerify?.status ?? null,\n error: backendVerify?.error ?? null,\n });\n }\n const result: SatyaProviderAttestationResult = {\n ...outcome,\n providerTemplate: template,\n capturedRequest: request,\n backendVerify,\n };\n setRunning(false);\n replayStartedRef.current = false;\n satyaDebug.info('flow', 'flow complete', {\n providerId: template.providerId,\n verified: outcome.verify.ok,\n disclosedUsername: outcome.verify.disclosedUsername ?? null,\n backendOk: backendVerify?.ok ?? null,\n });\n emitProgress({\n phase: 'verified',\n message: outcome.verify.ok ? 'Native replay verified' : 'Verification failed',\n percent: 1,\n providerId: template.providerId,\n });\n onComplete?.(result);\n if (autoCloseOnComplete) {\n setModalVisible(false);\n }\n } catch (cause) {\n fail(cause);\n }\n },\n [autoCloseOnComplete, client, emitProgress, fail, onComplete, transportConfig, verifyBackend]\n );\n\n const openManagedPopup = useCallback(\n (popup: ProviderPopupMessage, message = 'Handling provider popup inside the WebView') => {\n if (!popup.url) return;\n satyaDebug.info('popup', 'opening managed popup overlay', {\n url: popup.url,\n target: popup.target ?? null,\n reason: popup.reason ?? null,\n method: popup.method ?? null,\n });\n setPopupDocumentScriptReady(Platform.OS !== 'android');\n setManagedPopup({\n url: popup.url,\n target: popup.target ?? null,\n sourceUrl: popup.sourceUrl ?? null,\n method: popup.method ?? null,\n body: popup.body ?? null,\n headers: popup.headers ?? null,\n });\n setPopupChrome({\n ...EMPTY_BROWSER_CHROME,\n url: popup.url,\n title: 'Provider Sign In',\n loading: true,\n });\n emitProgress({\n phase: 'waitingForRequest',\n message,\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n },\n [emitProgress, providerId, providerTemplate?.providerId, resolved?.template.providerId]\n );\n\n const closeManagedPopup = useCallback(\n (popup?: ProviderPopupMessage | null) => {\n const target = popup?.target ?? managedPopup?.target ?? null;\n const url = popup?.url ?? popupChrome.url ?? managedPopup?.url ?? null;\n satyaDebug.info('popup', 'closing managed popup overlay', { target, url });\n setManagedPopup(null);\n setPopupChrome(EMPTY_BROWSER_CHROME);\n webRef.current?.injectJavaScript?.(buildPopupClosedScript(target, url));\n emitProgress({\n phase: 'waitingForRequest',\n message: 'Provider popup returned control to the login page',\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n },\n [\n emitProgress,\n managedPopup?.target,\n managedPopup?.url,\n providerId,\n providerTemplate?.providerId,\n popupChrome.url,\n resolved?.template.providerId,\n ]\n );\n\n // Shared exit path for device back, the visible close button, and the iOS swipe gesture.\n // If an OAuth popup overlay is open, back dismisses just the popup and returns control to\n // the login page; otherwise it closes the whole flow. Keeps \"back = exit\" one press deep.\n const handleHardwareBack = useCallback(() => {\n if (managedPopup) {\n closeManagedPopup();\n return;\n }\n closeFlow(true);\n }, [closeFlow, closeManagedPopup, managedPopup]);\n\n // iOS keeps the native left-edge swipe as a secondary escape hatch. Recreated only when the\n // back handler changes (i.e. when an OAuth popup opens/closes) so the gesture always sees\n // the current state: swipe closes an open popup first, otherwise closes the whole flow.\n /* eslint-disable react-hooks/refs -- PanResponder.create is an idiomatic RN factory called\n during render; the values it closes over are a useCallback and gesture args, not React\n refs, so the react-hooks/refs \"ref read during render\" warning is a false positive here. */\n const edgeSwipeResponder = useMemo(\n () =>\n PanResponder.create({\n onMoveShouldSetPanResponder: (_event, gesture) =>\n gesture.dx > 8 && gesture.dx > Math.abs(gesture.dy) * 1.6,\n onPanResponderRelease: (_event, gesture) => {\n if (gesture.dx > 72 || (gesture.dx > 36 && gesture.vx > 0.25)) {\n handleHardwareBack();\n }\n },\n onPanResponderTerminationRequest: () => false,\n }),\n [handleHardwareBack]\n );\n /* eslint-enable react-hooks/refs */\n\n const relayPopupPostMessage = useCallback((popup: ProviderPopupPostMessage) => {\n webRef.current?.injectJavaScript?.(buildPopupPostMessageRelayScript(popup));\n }, []);\n\n const relayOpenerToPopupMessage = useCallback((popup: ProviderPopupPostMessage) => {\n popupRef.current?.injectJavaScript?.(buildOpenerToPopupMessageRelayScript(popup));\n }, []);\n\n const relayPopupPortMessage = useCallback((popup: ProviderPopupPostMessage) => {\n webRef.current?.injectJavaScript?.(buildPopupPortMessageRelayScript(popup));\n }, []);\n\n const relayOpenerToPopupPortMessage = useCallback((popup: ProviderPopupPostMessage) => {\n popupRef.current?.injectJavaScript?.(buildOpenerToPopupPortMessageRelayScript(popup));\n }, []);\n\n const navigateOpenerFromPopup = useCallback(\n (popup: ProviderPopupMessage) => {\n // Reason 'opener.location.reload' (or an empty url) means the popup finished the\n // OAuth flow and wants the opener (login) page to refresh — reload the main\n // WebView and dismiss the popup overlay rather than navigating to a URL.\n const isReload = popup.reason === 'opener.location.reload' || !popup.url;\n satyaDebug.info('popup', 'returning control from popup to opener', {\n reason: popup.reason ?? null,\n url: popup.url,\n isReload,\n });\n setManagedPopup(null);\n setPopupChrome(EMPTY_BROWSER_CHROME);\n if (isReload) {\n setBrowserChrome((current) => ({ ...current, loading: true }));\n webRef.current?.reload?.();\n emitProgress({\n phase: 'waitingForRequest',\n message: 'Provider sign-in finished — reloading the login page',\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n return;\n }\n if (!isWebViewSafeUrl(popup.url)) return;\n setWebViewUrl(popup.url);\n setBrowserChrome((current) => ({\n ...current,\n url: popup.url,\n loading: true,\n }));\n webRef.current?.injectJavaScript?.(\n `try { window.location.assign(${JSON.stringify(popup.url)}); } catch (_) {} true;`\n );\n emitProgress({\n phase: 'waitingForRequest',\n message: 'Provider sign-in returned control to the login page',\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n },\n [emitProgress, providerId, providerTemplate?.providerId, resolved?.template.providerId]\n );\n\n const captureAndReplay = useCallback(\n (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n const replayRequest = rewriteForNativeReplay(request, template, bearerRef.current);\n if (replayRequest.url !== request.url) {\n satyaDebug.info('capture', 'rewrote captured URL for native replay', {\n from: request.url,\n to: replayRequest.url,\n injectedBearer: replayRequest.headers.authorization !== request.headers.authorization,\n });\n }\n satyaDebug.info('capture', 'request captured — starting native replay', {\n providerId: template.providerId,\n request: summarizeRequest(replayRequest),\n });\n setCapturedRequest(replayRequest);\n onRequestCaptured?.(replayRequest, template);\n emitProgress({\n phase: 'requestCaptured',\n message: `Matched ${providerDisplayName(template)} request captured`,\n percent: 0.08,\n providerId: template.providerId,\n });\n runReplay(replayRequest, template).catch(fail);\n },\n [emitProgress, fail, onRequestCaptured, runReplay]\n );\n\n const handleMessage = useCallback(\n (event: WebViewMessageEventLike) => {\n invokeWebViewCallback(webViewProps?.onMessage, event);\n let message: ProviderCaptureMessage;\n try {\n message = JSON.parse(event.nativeEvent.data) as ProviderCaptureMessage;\n } catch {\n return;\n }\n // Logs relayed from inside the managed WebView (request/response interception, the\n // active-fetch trigger poller, popups). Handled first so they surface even after the\n // native replay has started or before the provider has resolved.\n if ((message as { type?: string }).type === '__satyaLog') {\n ingestWebViewLog((message as { data?: unknown }).data);\n return;\n }\n if (message.type === 'popupOpen' || message.type === 'popupNavigate') {\n satyaDebug.debug('popup', `webview ${message.type}`, {\n url: message.data?.url,\n target: message.data?.target ?? null,\n reason: message.data?.reason ?? null,\n });\n openManagedPopup(message.data);\n return;\n }\n if (message.type === 'popupClose') {\n closeManagedPopup(message.data);\n return;\n }\n if (message.type === 'popupPostMessage') {\n relayPopupPostMessage(message.data);\n return;\n }\n if (message.type === 'popupOpenerToPopupMessage') {\n relayOpenerToPopupMessage(message.data);\n return;\n }\n if (message.type === 'popupPortMessage') {\n relayPopupPortMessage(message.data);\n return;\n }\n if (message.type === 'popupOpenerToPopupPortMessage') {\n relayOpenerToPopupPortMessage(message.data);\n return;\n }\n if (message.type === 'popupOpenerNavigate') {\n navigateOpenerFromPopup(message.data);\n return;\n }\n if (!resolved || replayStartedRef.current) return;\n\n // DI bearer lifted from the live session by the provider `injection`. Store it, and if a\n // matching request is already held waiting on it, release it to the native replay now.\n if ((message as { type?: string }).type === '__satyaBearer') {\n const tok = (message as unknown as { data?: string }).data;\n if (tok) bearerRef.current = tok;\n const held = pendingRequestRef.current;\n satyaDebug.info('capture', 'bearer token received from injection', {\n hasToken: !!tok,\n releasingHeldRequest: !!(held && bearerRef.current),\n });\n if (held && bearerRef.current) {\n pendingRequestRef.current = null;\n captureAndReplay(held, resolved.template);\n }\n return;\n }\n\n // Login confirmed by the provider `injection` (the proof endpoint returned authenticated\n // content). Release any held request to the native replay now.\n if ((message as { type?: string }).type === '__satyaReady') {\n loggedInRef.current = true;\n const held = pendingRequestRef.current;\n satyaDebug.info('capture', '__satyaReady login signal received', {\n releasingHeldRequest: !!held,\n });\n if (held) {\n pendingRequestRef.current = null;\n captureAndReplay(held, resolved.template);\n }\n return;\n }\n\n const endpointCapture = endpointCaptureFromTarget(resolved.template.proofTarget);\n const isActiveFetch = !!endpointCapture?.trigger;\n\n // Response-gated capture for endpoint `capture.trigger` flows: the injected active\n // fetch fires the request repeatedly; only a 2xx response (i.e. the user is logged in)\n // releases the held request to the native replay. Pre-login 401s/redirects are ignored.\n if (message.type === 'response') {\n if (!isActiveFetch) return;\n const response = message.data as CapturedProviderResponse;\n const pending = pendingRequestRef.current;\n if (!pending) return;\n const ok =\n typeof response?.status === 'number' && response.status >= 200 && response.status < 300;\n const urlMatches = responseUrlMatchesRequest(response?.url, pending.url);\n if (!ok || !urlMatches) {\n satyaDebug.debug('capture', 'trigger gate: response ignored', {\n status: response?.status,\n ok,\n urlMatches,\n response: summarizeResponse(response),\n });\n return;\n }\n // Some endpoints return 200 with an empty body pre-login (Garmin /proxy/socialProfile);\n // when the endpoint opts into `requireLoginSignal`, wait for the provider injection's\n // `__satyaReady` (authenticated content seen) before releasing the replay.\n const requireLoginSignal = !!endpointCapture?.requireLoginSignal;\n if (requireLoginSignal && !loggedInRef.current) {\n satyaDebug.debug('capture', 'trigger gate: 2xx held — waiting for __satyaReady', {\n url: response?.url,\n });\n return;\n }\n satyaDebug.info('capture', 'trigger gate satisfied (2xx) — releasing held request', {\n status: response?.status,\n });\n pendingRequestRef.current = null;\n captureAndReplay(pending, resolved.template);\n return;\n }\n\n if (message.type !== 'request') return;\n if (!requestMatchesProviderTemplate(resolved.template, message.data)) {\n satyaDebug.debug('capture', 'request did not match template rules', {\n method: message.data?.method,\n url: message.data?.url,\n });\n return;\n }\n if (isActiveFetch) {\n // Hold the matched request until its response confirms login (2xx).\n satyaDebug.info('capture', 'matched request held for trigger response gate', {\n request: summarizeRequest(message.data),\n });\n pendingRequestRef.current = message.data;\n return;\n }\n const requireLoginSignal = !!endpointCapture?.requireLoginSignal;\n if (requireLoginSignal && !loggedInRef.current) {\n // The provider `injection` polls the proof endpoint (which returns 200-empty pre-login)\n // and posts `__satyaReady` once it sees authenticated content. Hold the latest matching\n // request until then, then replay it.\n satyaDebug.info('capture', 'matched request held — waiting for __satyaReady login signal', {\n request: summarizeRequest(message.data),\n });\n pendingRequestRef.current = message.data;\n return;\n }\n captureAndReplay(message.data, resolved.template);\n },\n [\n captureAndReplay,\n closeManagedPopup,\n navigateOpenerFromPopup,\n openManagedPopup,\n relayOpenerToPopupPortMessage,\n relayPopupPostMessage,\n relayPopupPortMessage,\n relayOpenerToPopupMessage,\n resolved,\n webViewProps,\n ]\n );\n\n const loadInCurrentWebView = useCallback(\n (url: string, message: string) => {\n setWebViewUrl(url);\n setBrowserChrome((current) => ({\n ...current,\n url,\n loading: true,\n }));\n emitProgress({\n phase: 'waitingForRequest',\n message,\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n webRef.current?.injectJavaScript?.(\n `try { window.location.assign(${JSON.stringify(url)}); } catch (_) {} true;`\n );\n },\n [emitProgress, providerId, providerTemplate?.providerId, resolved?.template.providerId]\n );\n\n const handleOpenWindow = useCallback(\n (event: WebViewNavigationEventLike) => {\n invokeWebViewCallback(webViewProps?.onOpenWindow, event);\n const targetUrl = event.nativeEvent?.targetUrl ?? event.nativeEvent?.url;\n if (!targetUrl) return;\n openManagedPopup({\n url: targetUrl,\n target: null,\n sourceUrl: webViewUrl ?? (resolved ? providerLoginUrl(resolved.template) : null),\n reason: 'nativeOpenWindow',\n });\n },\n [openManagedPopup, resolved, webViewProps, webViewUrl]\n );\n\n const handleShouldStartLoadWithRequest = useCallback(\n (request: WebViewShouldStartLoadRequestLike) => {\n const hostDecision = invokeShouldStartLoadWithRequest(\n webViewProps?.onShouldStartLoadWithRequest,\n request\n );\n if (hostDecision === false) return false;\n\n const url = request.url;\n if (!url || isWebViewSafeUrl(url)) return true;\n\n const fallbackUrl = parseIntentBrowserFallbackUrl(url);\n satyaDebug.debug('webview', 'blocked non-web navigation (main)', {\n url,\n scheme: schemeLabel(url),\n intentFallback: fallbackUrl,\n });\n if (fallbackUrl) {\n loadInCurrentWebView(fallbackUrl, 'Handling external OAuth fallback inside the WebView');\n } else {\n emitProgress({\n phase: 'waitingForRequest',\n message: `Blocked external navigation to ${schemeLabel(url)}`,\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n }\n return false;\n },\n [\n emitProgress,\n loadInCurrentWebView,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n webViewProps,\n ]\n );\n\n const handlePopupOpenWindow = useCallback(\n (event: WebViewNavigationEventLike) => {\n invokeWebViewCallback(webViewProps?.onOpenWindow, event);\n const targetUrl = event.nativeEvent?.targetUrl ?? event.nativeEvent?.url;\n if (!targetUrl) return;\n openManagedPopup({\n url: targetUrl,\n target: managedPopup?.target ?? null,\n sourceUrl: managedPopup?.url ?? null,\n reason: 'nestedNativeOpenWindow',\n });\n },\n [managedPopup?.target, managedPopup?.url, openManagedPopup, webViewProps]\n );\n\n const handlePopupShouldStartLoadWithRequest = useCallback(\n (request: WebViewShouldStartLoadRequestLike) => {\n const hostDecision = invokeShouldStartLoadWithRequest(\n webViewProps?.onShouldStartLoadWithRequest,\n request\n );\n if (hostDecision === false) return false;\n\n const url = request.url;\n if (!url || isWebViewSafeUrl(url)) return true;\n\n const fallbackUrl = parseIntentBrowserFallbackUrl(url);\n satyaDebug.debug('webview', 'blocked non-web navigation (popup)', {\n url,\n scheme: schemeLabel(url),\n intentFallback: fallbackUrl,\n });\n if (fallbackUrl) {\n openManagedPopup(\n {\n url: fallbackUrl,\n target: managedPopup?.target ?? null,\n sourceUrl: managedPopup?.url ?? null,\n reason: 'popupIntentFallback',\n },\n 'Handling external OAuth fallback inside the popup WebView'\n );\n } else {\n emitProgress({\n phase: 'waitingForRequest',\n message: `Blocked external popup navigation to ${schemeLabel(url)}`,\n percent: 0.05,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n });\n }\n return false;\n },\n [\n emitProgress,\n managedPopup?.target,\n managedPopup?.url,\n openManagedPopup,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n webViewProps,\n ]\n );\n\n const handleNavigationStateChange = useCallback(\n (event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onNavigationStateChange, event);\n if (nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n if (nextChrome.url) {\n satyaDebug.debug('webview', 'navigation (main)', {\n url: nextChrome.url,\n title: nextChrome.title,\n loading: nextChrome.loading,\n });\n }\n setBrowserChrome((current) => ({ ...current, ...nextChrome }));\n if (nextChrome.url) setWebViewUrl(nextChrome.url);\n },\n [webViewProps]\n );\n\n const handlePopupNavigationStateChange = useCallback(\n (event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onNavigationStateChange, event);\n if (nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n if (nextChrome.url) {\n satyaDebug.debug('webview', 'navigation (popup)', {\n url: nextChrome.url,\n loading: nextChrome.loading,\n });\n }\n setPopupChrome((current) => ({ ...current, ...nextChrome }));\n // Auto-return: an OAuth popup (e.g. \"Continue with Google\") typically leaves the\n // opener origin for an auth domain (accounts.google.com), then redirects back to\n // the provider's own origin once sign-in completes. When that return happens,\n // hand control back to the main WebView and dismiss the popup instead of leaving\n // the user stranded on the provider page inside the popup overlay.\n const url = nextChrome.url;\n if (!url || !managedPopup) return;\n const openerOrigin = originFromUrl(\n managedPopup.sourceUrl ??\n webViewUrl ??\n (resolved ? providerLoginUrl(resolved.template) : null)\n );\n const initialPopupOrigin = originFromUrl(managedPopup.url);\n const currentPopupOrigin = originFromUrl(url);\n if (\n openerOrigin &&\n currentPopupOrigin &&\n currentPopupOrigin === openerOrigin &&\n initialPopupOrigin &&\n initialPopupOrigin !== openerOrigin\n ) {\n navigateOpenerFromPopup({\n url,\n target: managedPopup.target ?? null,\n sourceUrl: managedPopup.url ?? null,\n reason: 'popupReturnedToOpenerOrigin',\n });\n }\n },\n [managedPopup, navigateOpenerFromPopup, resolved, webViewProps, webViewUrl]\n );\n\n // For html/text providers the proof page is loaded as a top-level navigation, which the\n // fetch/XHR interceptor never sees. When the main WebView lands on a URL that matches the\n // provider's request rules, re-issue it as a same-origin credentialed fetch so the existing\n // capture -> native-replay path runs (the fetch carries the WebView's cookies + user agent).\n const maybeTriggerHtmlCapture = useCallback(\n (url: string | undefined) => {\n if (!url || !resolved || replayStartedRef.current) return;\n const responseType = String(resolved.template.proofTarget?.responseType ?? '').toLowerCase();\n if (responseType !== 'html' && responseType !== 'text') return;\n if (htmlCaptureFetchedRef.current.has(url)) return;\n const bodyPattern =\n typeof resolved.template.proofTarget?.htmlCaptureBodyPattern === 'string'\n ? resolved.template.proofTarget.htmlCaptureBodyPattern.trim()\n : '';\n const matches = requestMatchesProviderTemplate(resolved.template, {\n url,\n method: 'GET',\n headers: bodyPattern ? { [HTML_CAPTURE_HEADER_NAME]: HTML_CAPTURE_HEADER_VALUE } : {},\n body: null,\n });\n if (!matches) return;\n htmlCaptureFetchedRef.current.add(url);\n satyaDebug.info('htmlCapture', 'injecting html/text capture fetch', {\n url,\n responseType,\n hasBodyPattern: !!bodyPattern,\n });\n const captureScript = bodyPattern\n ? `(function(){try{var u=${JSON.stringify(url)},h=${JSON.stringify(\n HTML_CAPTURE_HEADER_NAME\n )},v=${JSON.stringify(HTML_CAPTURE_HEADER_VALUE)},re=new RegExp(${JSON.stringify(\n bodyPattern\n )}),tries=0,done=false;function text(){try{return (document.documentElement&&document.documentElement.textContent)||'';}catch(e){return '';}}function capture(){if(done)return;tries+=1;if(re.test(text())){done=true;try{var headers={};headers[h]=v;fetch(u,{credentials:'include',headers:headers}).catch(function(){});}catch(e){}return;}if(tries>=40){done=true;}}capture();var t=setInterval(function(){if(done){clearInterval(t);return;}capture();},250);}catch(e){}})(); true;`\n : `try { fetch(${JSON.stringify(url)}, { credentials: 'include' }).catch(function(){}); } catch (_) {} true;`;\n webRef.current?.injectJavaScript?.(captureScript);\n },\n [resolved]\n );\n\n // On Android we use real same-renderer popup windows (native multi-window) for OAuth, so the\n // JS window.open/popup interception must stand down and let the engine fire onCreateWindow.\n const useNativePopups = Platform.OS === 'android';\n\n // For endpoint `capture.trigger` flows, the SDK actively fires the proof request from\n // inside the WebView (post-login) so it can be captured — built from the proof target.\n const activeFetchScript = useMemo(() => {\n const target = resolved?.template.proofTarget;\n const endpointCapture = endpointCaptureFromTarget(target);\n if (!endpointCapture?.trigger || !target?.url) return '';\n return buildActiveFetchScript({\n url: target.url,\n method: target.method ?? 'GET',\n headers: endpointCapture.headers ?? null,\n body: endpointCapture.requestBody ?? null,\n landingUrl: endpointCapture.landingUrl ?? null,\n pollMs: endpointCapture.pollMs,\n maxAttempts: endpointCapture.maxAttempts,\n });\n }, [resolved?.template.proofTarget]);\n\n const mainInjectedScript = useMemo(\n () =>\n buildProviderWebViewScript(\n resolved?.template.injection,\n activeFetchScript,\n useNativePopups,\n debugEnabled\n ),\n [resolved?.template.injection, activeFetchScript, useNativePopups, debugEnabled]\n );\n\n const popupInjectedScript = useMemo(\n () =>\n buildProviderWebViewScript(\n resolved?.template.injection,\n managedPopup ? buildProviderPopupBridgeScript(managedPopup.target) : '',\n false,\n debugEnabled\n ),\n [managedPopup, resolved?.template.injection, debugEnabled]\n );\n\n const mainDocumentStartScript = useMemo(\n () => buildProviderDocumentStartScript('', useNativePopups, debugEnabled),\n [useNativePopups, debugEnabled]\n );\n\n const popupDocumentStartScript = useMemo(\n () =>\n buildProviderDocumentStartScript(\n managedPopup ? buildProviderPopupBridgeScript(managedPopup.target) : '',\n false,\n debugEnabled\n ),\n [managedPopup, debugEnabled]\n );\n\n useEffect(() => {\n if (!modalVisible || !ResolvedWebView || !resolved) return;\n if (Platform.OS !== 'android') return;\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let attempts = 0;\n const install = async () => {\n attempts += 1;\n const result = await installAndroidDocumentStartScript(\n webHostRef.current,\n mainDocumentStartScript\n );\n if (cancelled) return;\n if (result === null && attempts < 20) {\n timer = setTimeout(install, 50);\n return;\n }\n // Turn window.open into real same-renderer child windows so OAuth popups (Google\n // Identity Services, etc.) keep a genuine opener relationship and complete natively.\n await enableAndroidPopupWindows(webHostRef.current);\n satyaDebug.debug('webview', 'android document-start script installed (main)', {\n attempts,\n result,\n });\n setMainDocumentScriptReady(true);\n };\n timer = setTimeout(install, 0);\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [ResolvedWebView, mainDocumentStartScript, modalVisible, resolved]);\n\n useEffect(() => {\n if (!modalVisible || !ResolvedWebView || !resolved || !managedPopup) return;\n if (Platform.OS !== 'android') return;\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let attempts = 0;\n const install = async () => {\n attempts += 1;\n const result = await installAndroidDocumentStartScript(\n popupHostRef.current,\n popupDocumentStartScript\n );\n if (cancelled) return;\n if (result === null && attempts < 20) {\n timer = setTimeout(install, 50);\n return;\n }\n satyaDebug.debug('webview', 'android document-start script installed (popup)', {\n attempts,\n result,\n });\n setPopupDocumentScriptReady(true);\n };\n timer = setTimeout(install, 0);\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [ResolvedWebView, managedPopup, modalVisible, popupDocumentStartScript, resolved]);\n\n const title =\n modalTitle ?? (resolved ? providerDisplayName(resolved.template) : 'Provider Attestation');\n const isProcessing = !!capturedRequest && !error;\n const progressPct = running ? Math.max(5, Math.min(100, Math.round(percent * 100))) : 0;\n const theme = resolveTheme(themeProp);\n return (\n <>\n <Pressable\n style={[\n styles.button,\n { backgroundColor: theme.accentColor },\n (disabled || running || modalVisible) && styles.buttonDisabled,\n ]}\n disabled={disabled || running || modalVisible}\n onPress={openFlow}>\n {running ? <ActivityIndicator color=\"#ffffff\" style={styles.buttonSpinner} /> : null}\n <Text style={styles.buttonText}>{running ? 'Generating Attestation' : buttonLabel}</Text>\n </Pressable>\n <Modal\n visible={modalVisible}\n animationType=\"slide\"\n statusBarTranslucent\n navigationBarTranslucent\n onRequestClose={handleHardwareBack}>\n <StatusBar barStyle={theme.statusBarStyle} backgroundColor=\"transparent\" translucent />\n <SafeAreaProvider initialMetrics={initialWindowMetrics}>\n <SafeAreaInsetsContext.Consumer>\n {(rawInsets) => (\n <View\n style={[\n styles.modalRoot,\n { backgroundColor: theme.surfaceColor },\n insetPadding(rawInsets),\n ]}>\n {/* Minimal, native-feeling header: provider name centered, no address bar,\n lock, or reload. The close affordance shares the back/cancel path. */}\n <View style={[styles.header, { backgroundColor: theme.surfaceColor }]}>\n <View style={styles.headerSide} />\n <Text\n style={[styles.headerTitle, { color: theme.onSurfaceColor }]}\n numberOfLines={1}>\n {title}\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close browser\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={handleHardwareBack}>\n <Text style={[styles.headerCloseGlyph, { color: theme.onSurfaceColor }]}>\n ×\n </Text>\n </Pressable>\n </View>\n <View style={styles.progressTrack}>\n {progressPct > 0 ? (\n <View\n style={[\n styles.progressFill,\n { width: `${progressPct}%`, backgroundColor: theme.accentColor },\n ]}\n />\n ) : null}\n </View>\n <View\n ref={webHostRef}\n style={[styles.webViewHost, { backgroundColor: theme.surfaceColor }]}>\n {ResolvedWebView && resolved ? (\n <ResolvedWebView\n {...(webViewProps ?? {})}\n ref={webRef}\n source={{\n uri: mainDocumentScriptReady\n ? (webViewUrl ?? providerLoginUrl(resolved.template))\n : WEBVIEW_BOOTSTRAP_URL,\n }}\n style={[styles.webView, webViewProps?.style]}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={useNativePopups}\n injectedJavaScriptBeforeContentLoaded={mainInjectedScript}\n injectedJavaScript={mainInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handleOpenWindow}\n onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}\n onNavigationStateChange={handleNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadStart, event);\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL)\n return;\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadEnd, event);\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL)\n return;\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n webRef.current?.injectJavaScript?.(mainInjectedScript);\n maybeTriggerHtmlCapture(nextChrome.url);\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n ) : (\n <View style={styles.webViewFallback}>\n <Text style={styles.errorText}>react-native-webview is not available.</Text>\n </View>\n )}\n {ResolvedWebView && resolved && managedPopup ? (\n <View\n ref={popupHostRef}\n style={[styles.popupOverlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={[styles.popupHeader, { backgroundColor: theme.surfaceColor }]}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Back\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={() => closeManagedPopup()}>\n <Text style={[styles.headerBackGlyph, { color: theme.onSurfaceColor }]}>\n ‹\n </Text>\n </Pressable>\n <Text\n style={[styles.headerTitle, { color: theme.onSurfaceColor }]}\n numberOfLines={1}>\n Sign in\n </Text>\n <View style={styles.headerSide} />\n </View>\n <ResolvedWebView\n {...(webViewProps ?? {})}\n ref={popupRef}\n key={managedPopupKey(managedPopup)}\n source={\n popupDocumentScriptReady\n ? managedPopupSource(managedPopup)\n : { uri: WEBVIEW_BOOTSTRAP_URL }\n }\n style={[styles.webView, webViewProps?.style]}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={false}\n injectedJavaScriptBeforeContentLoaded={popupInjectedScript}\n injectedJavaScript={popupInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handlePopupOpenWindow}\n onShouldStartLoadWithRequest={handlePopupShouldStartLoadWithRequest}\n onNavigationStateChange={handlePopupNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadStart, event);\n if (\n !popupDocumentScriptReady &&\n nextChrome.url === WEBVIEW_BOOTSTRAP_URL\n ) {\n return;\n }\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadEnd, event);\n if (\n !popupDocumentScriptReady &&\n nextChrome.url === WEBVIEW_BOOTSTRAP_URL\n ) {\n return;\n }\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n popupRef.current?.injectJavaScript?.(popupInjectedScript);\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n </View>\n ) : null}\n {isProcessing ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {processingCopy(phase)}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n Keep this screen open — it only takes a moment.\n </Text>\n </View>\n ) : null}\n {error ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={styles.errorIconWrap}>\n <Text style={styles.errorIconGlyph}>!</Text>\n </View>\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n Couldn't verify your account\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n {friendlyError(error)}\n </Text>\n <Pressable\n style={[styles.primaryAction, { backgroundColor: theme.accentColor }]}\n onPress={openFlow}>\n <Text style={styles.primaryActionText}>Try again</Text>\n </Pressable>\n <Pressable style={styles.secondaryAction} onPress={() => closeFlow(true)}>\n <Text style={[styles.secondaryActionText, { color: theme.mutedColor }]}>\n Close\n </Text>\n </Pressable>\n </View>\n ) : null}\n {/* iOS-only invisible left-edge strip that recognizes the swipe-back gesture.\n Sits above the WebView and popup so the swipe works in every state. */}\n {Platform.OS === 'ios' ? (\n <View\n style={styles.edgeSwipeZone}\n accessibilityElementsHidden\n {...edgeSwipeResponder.panHandlers}\n />\n ) : null}\n </View>\n </View>\n )}\n </SafeAreaInsetsContext.Consumer>\n </SafeAreaProvider>\n </Modal>\n </>\n );\n}\n\nasync function resolveProvider(\n providerId: string | undefined,\n providerTemplate: SatyaProviderTemplate | undefined,\n providerRegistrySource: SatyaProviderRegistrySource | undefined,\n endpointId: string | undefined,\n spkiPins: readonly string[] | undefined,\n transportConfig: SatyaTransportConfig,\n providerPolicyRefresh: SatyaProviderPolicyRefreshMode\n): Promise<ResolvedProvider> {\n const base = providerTemplate\n ? validateProviderTemplate(providerTemplate, { source: 'providerTemplate', endpointId })\n : requireProviderTemplate(\n providerId ?? '',\n await loadProviderRegistry(providerRegistrySource),\n endpointId\n );\n if (spkiPins !== undefined) {\n const template = withProviderSpkiPins(base, normalizePins(spkiPins));\n return {\n template,\n pinCount: template.tlsIdentityPolicy.spkiSha256B64Pins?.length ?? 0,\n pinSource: 'explicit',\n };\n }\n\n let refreshError: unknown = null;\n if (providerPolicyRefresh !== 'template-only') {\n try {\n const policy = await fetchVerifierProviderPolicy({\n notaryUrl: transportConfig.notaryUrl,\n providerId: base.providerId,\n bearerToken: transportConfig.verifierBearerToken,\n });\n validateProviderPolicyForTemplate(policy, base);\n const template = withProviderSpkiPins(base, policy.spkiSha256B64Pins);\n return {\n template,\n pinCount: template.tlsIdentityPolicy.spkiSha256B64Pins?.length ?? 0,\n pinSource: 'verifier',\n };\n } catch (cause) {\n refreshError = cause;\n if (providerPolicyRefresh === 'verifier-required') throw cause;\n }\n }\n\n const pins = normalizePins(base.tlsIdentityPolicy.spkiSha256B64Pins ?? []);\n if (pins.length === 0 && refreshError) throw refreshError;\n const template = withProviderSpkiPins(base, pins);\n return {\n template,\n pinCount: template.tlsIdentityPolicy.spkiSha256B64Pins?.length ?? 0,\n pinSource: 'template',\n };\n}\n\nfunction normalizePins(pins: readonly string[]): string[] {\n return pins.map((pin) => pin.trim()).filter(Boolean);\n}\n\nfunction pinSourceLabel(source: ResolvedProvider['pinSource']): string {\n if (source === 'verifier') return 'verifier-refreshed';\n if (source === 'explicit') return 'explicit';\n return 'template';\n}\n\nfunction resolveWebViewComponent(providedWebView?: WebViewComponent): WebViewComponent | null {\n if (providedWebView) return providedWebView;\n try {\n const webviewModule = require('react-native-webview') as { WebView?: WebViewComponent };\n return webviewModule.WebView ?? null;\n } catch {\n return null;\n }\n}\n\nfunction providerDisplayName(template: SatyaProviderTemplate): string {\n return (\n template.name?.trim() ||\n template.displayName?.trim() ||\n template.label?.trim() ||\n template.providerId\n );\n}\n\nfunction providerHost(template: SatyaProviderTemplate): string {\n if (template.tlsIdentityPolicy?.expectedSni) return template.tlsIdentityPolicy.expectedSni;\n if (template.target?.host) return template.target.host;\n try {\n return new URL(template.proofTarget?.url ?? template.endpoints[0]?.url ?? '').hostname;\n } catch {\n return template.providerId;\n }\n}\n\nfunction providerLoginUrl(template: SatyaProviderTemplate): string {\n return template.webLogin?.startUrl ?? template.login.url;\n}\n\nfunction resolveEffectiveUserAgent(\n template: SatyaProviderTemplate,\n explicitUserAgent?: string\n): string {\n const trimmedExplicit = explicitUserAgent?.trim();\n if (trimmedExplicit) return trimmedExplicit;\n\n const settings = template.userAgent;\n const platformUserAgent = Platform.OS === 'ios' ? settings?.ios : settings?.android;\n const trimmedProviderUserAgent = platformUserAgent?.trim();\n if (trimmedProviderUserAgent) return trimmedProviderUserAgent;\n\n return defaultMobileBrowserUserAgent();\n}\n\nfunction endpointCaptureFromTarget(\n target: SatyaProviderTemplate['proofTarget'] | undefined\n): SatyaProviderEndpointCapture | null {\n return isRecord(target?.capture) ? (target.capture as SatyaProviderEndpointCapture) : null;\n}\n\nfunction defaultMobileBrowserUserAgent(): string {\n if (Platform.OS === 'ios') {\n return 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1';\n }\n return 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36';\n}\n\nfunction validateTemplateForReplay(template: SatyaProviderTemplate): string | null {\n if (!template.providerId) return 'Provider template is missing providerId';\n if (!template.proofTarget?.url) return `${template.providerId} is missing proofTarget.url`;\n if (!template.proofTarget?.method) return `${template.providerId} is missing proofTarget.method`;\n if (!template.endpoints?.length) return `${template.providerId} has no endpoints`;\n if (!template.tlsIdentityPolicy?.expectedSni) {\n return `${template.providerId} is missing tlsIdentityPolicy.expectedSni`;\n }\n if (!template.templateGovernance?.templateHash) {\n return `${template.providerId} is missing templateGovernance.templateHash`;\n }\n if (!template.templateGovernance?.parserHash) {\n return `${template.providerId} is missing templateGovernance.parserHash`;\n }\n const responseRevealCount =\n template.privacyPolicy?.allowedResponseReveals?.length ??\n template.privacyPolicy?.allowedResponseBodyJsonPaths?.length ??\n 0;\n if (responseRevealCount === 0) {\n return `${template.providerId} has no response reveals`;\n }\n return null;\n}\n\nasync function postBackendVerifier(\n notaryUrl: string,\n artifactJson: string,\n bearerToken?: string\n): Promise<SatyaBackendVerifyResult> {\n const url = backendVerifierUrl(notaryUrl);\n const response = await fetch(url, {\n method: 'POST',\n headers: verifierRequestHeaders(bearerToken),\n body: artifactJson,\n });\n const text = await response.text();\n if (!text.trim()) {\n return {\n ok: false,\n status: response.status,\n url,\n error: `empty response from ${url}`,\n };\n }\n try {\n const decoded = JSON.parse(text) as unknown;\n if (decoded && typeof decoded === 'object' && !Array.isArray(decoded)) {\n return {\n ok: response.ok,\n status: response.status,\n url,\n ...(decoded as Record<string, unknown>),\n };\n }\n return {\n ok: false,\n status: response.status,\n url,\n error: `unexpected verifier response shape from ${url}`,\n body: decoded,\n };\n } catch {\n return {\n ok: false,\n status: response.status,\n url,\n error: `non-JSON response from ${url}`,\n bodyPreview: text.slice(0, 500),\n };\n }\n}\n\nfunction verifierRequestHeaders(bearerToken?: string): Record<string, string> {\n const headers: Record<string, string> = { 'content-type': 'application/json' };\n const token = bearerToken?.trim();\n if (token) headers.authorization = `Bearer ${token}`;\n return headers;\n}\n\nfunction backendVerifierUrl(notaryUrl: string): string {\n return `${notaryUrl.replace(/\\/+$/, '')}/v1/artifacts/verify`;\n}\n\nfunction invokeWebViewCallback(callback: unknown, event: unknown): void {\n if (typeof callback === 'function') {\n (callback as (event: unknown) => void)(event);\n }\n}\n\nfunction invokeShouldStartLoadWithRequest(\n callback: unknown,\n request: WebViewShouldStartLoadRequestLike\n): boolean | undefined {\n if (typeof callback !== 'function') return undefined;\n return (callback as (request: WebViewShouldStartLoadRequestLike) => boolean)(request);\n}\n\nfunction readBrowserChromeState(event: unknown): Partial<BrowserChromeState> {\n const raw = readNavigationPayload(event);\n const next: Partial<BrowserChromeState> = {};\n if (typeof raw.url === 'string') next.url = raw.url;\n if (typeof raw.title === 'string') next.title = raw.title;\n if (typeof raw.canGoBack === 'boolean') next.canGoBack = raw.canGoBack;\n if (typeof raw.canGoForward === 'boolean') next.canGoForward = raw.canGoForward;\n if (typeof raw.loading === 'boolean') next.loading = raw.loading;\n return next;\n}\n\nfunction readNavigationPayload(event: unknown): Record<string, unknown> {\n if (!isRecord(event)) return {};\n if (isRecord(event.nativeEvent)) return event.nativeEvent;\n return event;\n}\n\ninterface ResolvedTheme {\n surfaceColor: string;\n onSurfaceColor: string;\n mutedColor: string;\n accentColor: string;\n statusBarStyle: 'light-content' | 'dark-content';\n}\n\nconst DEFAULT_THEME: ResolvedTheme = {\n surfaceColor: '#ffffff',\n onSurfaceColor: '#172033',\n mutedColor: '#66758a',\n accentColor: '#2752d9',\n statusBarStyle: 'dark-content',\n};\n\nfunction resolveTheme(theme?: SatyaProviderAttestTheme): ResolvedTheme {\n if (!theme) return DEFAULT_THEME;\n return {\n surfaceColor: theme.surfaceColor?.trim() || DEFAULT_THEME.surfaceColor,\n onSurfaceColor: theme.onSurfaceColor?.trim() || DEFAULT_THEME.onSurfaceColor,\n mutedColor: theme.mutedColor?.trim() || DEFAULT_THEME.mutedColor,\n accentColor: theme.accentColor?.trim() || DEFAULT_THEME.accentColor,\n statusBarStyle: theme.statusBarStyle ?? DEFAULT_THEME.statusBarStyle,\n };\n}\n\n// Pad the managed-WebView surface clear of the notch / status bar (top) and the home\n// indicator or on-screen nav buttons (bottom + sides in landscape) so the page never\n// clips into a bezel. The Modal renders edge-to-edge (statusBarTranslucent +\n// navigationBarTranslucent), so these insets are the single source of truth. When the\n// SafeAreaProvider has not measured yet (null), fall back to the Android status-bar height.\nfunction insetPadding(insets: EdgeInsets | null): {\n paddingTop: number;\n paddingBottom: number;\n paddingLeft: number;\n paddingRight: number;\n} {\n const fallbackTop = Platform.OS === 'android' ? (StatusBar.currentHeight ?? 24) : 0;\n return {\n paddingTop: insets ? Math.max(insets.top, fallbackTop) : fallbackTop,\n paddingBottom: insets?.bottom ?? 0,\n paddingLeft: insets?.left ?? 0,\n paddingRight: insets?.right ?? 0,\n };\n}\n\nfunction isWebViewSafeUrl(url: string): boolean {\n try {\n const protocol = new URL(url).protocol.toLowerCase();\n return (\n protocol === 'http:' ||\n protocol === 'https:' ||\n protocol === 'about:' ||\n protocol === 'blob:' ||\n protocol === 'data:'\n );\n } catch {\n return true;\n }\n}\n\nfunction parseIntentBrowserFallbackUrl(url: string): string | null {\n if (!url.toLowerCase().startsWith('intent:')) return null;\n\n const explicitFallback = /(?:^|;)S\\.browser_fallback_url=([^;]+)/i.exec(url)?.[1];\n if (explicitFallback) {\n try {\n const decoded = decodeURIComponent(explicitFallback);\n if (isHttpUrl(decoded)) return decoded;\n } catch {\n return null;\n }\n }\n\n const intentPrefix = 'intent://';\n const intentMarker = '#Intent;';\n if (!url.toLowerCase().startsWith(intentPrefix)) return null;\n\n const intentPath = url.slice(intentPrefix.length).split(intentMarker)[0];\n const scheme = /(?:^|;)scheme=([^;]+)/i.exec(url)?.[1];\n if (!intentPath || !scheme) return null;\n\n const reconstructed = `${scheme}://${intentPath}`;\n return isHttpUrl(reconstructed) ? reconstructed : null;\n}\n\nfunction isHttpUrl(url: string): boolean {\n try {\n const protocol = new URL(url).protocol.toLowerCase();\n return protocol === 'http:' || protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nfunction schemeLabel(url: string): string {\n const match = /^([a-z][a-z0-9+.-]*):/i.exec(url);\n return match ? `${match[1]}://` : 'external URL';\n}\n\nfunction processingCopy(phase: SatyaProviderFlowPhase): string {\n if (phase === 'backendVerify') return 'Finishing verification…';\n if (phase === 'nativeReplay') return 'Securely verifying your account…';\n return 'Verifying your account…';\n}\n\nfunction friendlyError(message: string): string {\n const m = (message || '').toLowerCase();\n if (\n m.includes('403') ||\n m.includes('forbidden') ||\n m.includes('cloudflare') ||\n m.includes('bot')\n ) {\n return 'This provider is blocking automated verification right now. Please try again later.';\n }\n if (m.includes('network') || m.includes('timeout') || m.includes('timed out')) {\n return 'There was a network problem. Check your connection and try again.';\n }\n if (m.includes('pin') || m.includes('certificate') || m.includes('tls') || m.includes('secure')) {\n return 'We couldn’t establish a secure connection to this provider. Please try again.';\n }\n if (m.includes('claim') || m.includes('reveal') || m.includes('match')) {\n return 'We couldn’t read the expected details. Make sure you’re fully signed in, then try again.';\n }\n return 'Something went wrong. Please try again.';\n}\n\nfunction managedPopupSource(popup: ManagedPopupState): Record<string, unknown> {\n const method = (popup.method ?? 'GET').toUpperCase();\n if (method === 'GET') return { uri: popup.url };\n return {\n uri: popup.url,\n method,\n body: popup.body ?? '',\n headers: popup.headers ?? undefined,\n };\n}\n\nfunction managedPopupKey(popup: ManagedPopupState): string {\n const method = (popup.method ?? 'GET').toUpperCase();\n const bodyHash = popup.body ? stableStringHash(popup.body) : 'no-body';\n return `${popup.target ?? 'popup'}:${method}:${popup.url}:${bodyHash}`;\n}\n\nfunction stableStringHash(input: string): string {\n let hash = 5381;\n for (let i = 0; i < input.length; i += 1) {\n hash = (hash * 33) ^ input.charCodeAt(i);\n }\n return (hash >>> 0).toString(36);\n}\n\nasync function installAndroidDocumentStartScript(\n ref: View | null,\n script: string\n): Promise<boolean | null> {\n if (Platform.OS !== 'android') return true;\n const tag = findNodeHandle(ref);\n if (!tag) return null;\n try {\n return await SatyaAttestModule.installWebViewDocumentStartScript(tag, script);\n } catch {\n return false;\n }\n}\n\nasync function enableAndroidPopupWindows(ref: View | null): Promise<boolean> {\n if (Platform.OS !== 'android') return true;\n const tag = findNodeHandle(ref);\n if (!tag) return false;\n try {\n return await SatyaAttestModule.setPopupWindowsEnabled(tag, true);\n } catch {\n return false;\n }\n}\n\nfunction buildPopupClosedScript(target?: string | null, url?: string | null): string {\n return `try {\n if (window.__satyaProviderPopupClosed) {\n window.__satyaProviderPopupClosed(${scriptJson(target ?? null)}, ${scriptJson(url ?? null)});\n }\n} catch (_) {}\ntrue;`;\n}\n\nfunction buildPopupPostMessageRelayScript(popup: ProviderPopupPostMessage): string {\n const origin = originFromUrl(popup.sourceUrl ?? popup.url);\n const targetJson = scriptJson(popup.target ?? null);\n const dataJson = scriptJson(popup.data ?? null);\n const originJson = scriptJson(origin);\n return `try {\n function broadcastToFrames(payload) {\n var queue = [window];\n for (var cursor = 0; cursor < queue.length && cursor < 32; cursor += 1) {\n var current = queue[cursor];\n var length = 0;\n try { length = current.frames.length; } catch (_) { length = 0; }\n for (var i = 0; i < length; i += 1) {\n var frame = null;\n try { frame = current.frames[i]; } catch (_) { frame = null; }\n if (!frame) continue;\n try { frame.postMessage(payload, '*'); } catch (_) {}\n try {\n if (frame.frames && frame.frames.length) queue.push(frame);\n } catch (_) {}\n }\n }\n }\n var relay = {\n __satyaProviderPopupRelay: true,\n target: ${targetJson},\n data: ${dataJson},\n origin: ${originJson}\n };\n if (window.__satyaProviderDispatchPopupMessage) {\n window.__satyaProviderDispatchPopupMessage(relay.target, relay.data, relay.origin);\n } else {\n window.dispatchEvent(new MessageEvent('message', {\n data: relay.data,\n origin: relay.origin\n }));\n }\n broadcastToFrames(relay.data);\n broadcastToFrames(relay);\n} catch (_) {}\ntrue;`;\n}\n\nfunction buildOpenerToPopupMessageRelayScript(popup: ProviderPopupPostMessage): string {\n // The message originates from the opener (the login page), so its origin is the\n // opener's origin (carried in sourceUrl), not the popup's current URL.\n const origin = originFromUrl(popup.sourceUrl ?? popup.url);\n const dataJson = scriptJson(popup.data ?? null);\n const originJson = scriptJson(origin);\n const portsJson = scriptJson(popup.ports ?? []);\n return `try {\n if (window.__satyaProviderDispatchOpenerMessage) {\n window.__satyaProviderDispatchOpenerMessage(${dataJson}, ${originJson}, ${portsJson});\n } else {\n window.dispatchEvent(new MessageEvent('message', {\n data: ${dataJson},\n origin: ${originJson}\n }));\n }\n} catch (_) {}\ntrue;`;\n}\n\nfunction buildPopupPortMessageRelayScript(popup: ProviderPopupPostMessage): string {\n const portIdJson = scriptJson(popup.portId ?? null);\n const dataJson = scriptJson(popup.data ?? null);\n return `try {\n if (window.__satyaProviderDispatchPopupPortMessage) {\n window.__satyaProviderDispatchPopupPortMessage(${portIdJson}, ${dataJson});\n }\n} catch (_) {}\ntrue;`;\n}\n\nfunction buildOpenerToPopupPortMessageRelayScript(popup: ProviderPopupPostMessage): string {\n const portIdJson = scriptJson(popup.portId ?? null);\n const dataJson = scriptJson(popup.data ?? null);\n return `try {\n if (window.__satyaProviderDispatchOpenerPortMessage) {\n window.__satyaProviderDispatchOpenerPortMessage(${portIdJson}, ${dataJson});\n }\n} catch (_) {}\ntrue;`;\n}\n\nfunction originFromUrl(url?: string | null): string {\n if (!url) return '';\n try {\n return new URL(url).origin;\n } catch {\n return '';\n }\n}\n\n// Correlate a captured response back to the held request for response-gated capture. A 2xx\n// fetch keeps the same URL; allow query/hash differences by also matching host + pathname.\nfunction responseUrlMatchesRequest(\n responseUrl?: string | null,\n requestUrl?: string | null\n): boolean {\n if (!responseUrl || !requestUrl) return false;\n const strip = (value: string) => {\n const hashIndex = value.indexOf('#');\n return hashIndex >= 0 ? value.slice(0, hashIndex) : value;\n };\n if (strip(responseUrl) === strip(requestUrl)) return true;\n try {\n const a = new URL(responseUrl);\n const b = new URL(requestUrl);\n return a.hostname === b.hostname && a.pathname === b.pathname;\n } catch {\n return false;\n }\n}\n\nfunction scriptJson(value: unknown): string {\n const encoded = JSON.stringify(value);\n return encoded === undefined ? 'null' : encoded;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nconst styles = StyleSheet.create({\n button: {\n minHeight: 48,\n borderRadius: 8,\n paddingHorizontal: 16,\n paddingVertical: 12,\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'row',\n backgroundColor: '#2752d9',\n },\n buttonDisabled: { opacity: 0.55 },\n buttonSpinner: { marginRight: 8 },\n buttonText: { color: '#ffffff', fontSize: 15, fontWeight: '700' },\n modalRoot: { flex: 1, backgroundColor: '#ffffff' },\n\n header: {\n height: 48,\n paddingHorizontal: 8,\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: '#ffffff',\n },\n headerSide: {\n width: 40,\n height: 40,\n alignItems: 'center',\n justifyContent: 'center',\n },\n headerBackGlyph: { color: '#172033', fontSize: 30, fontWeight: '400', marginTop: -3 },\n headerCloseGlyph: { color: '#172033', fontSize: 26, fontWeight: '400', lineHeight: 30 },\n headerTitle: {\n flex: 1,\n textAlign: 'center',\n color: '#172033',\n fontSize: 15,\n fontWeight: '600',\n },\n\n progressTrack: { height: 2.5, backgroundColor: '#eef1f7', overflow: 'hidden' },\n progressFill: { height: '100%', backgroundColor: '#2752d9', borderRadius: 2 },\n\n webViewHost: { flex: 1, backgroundColor: '#ffffff' },\n webView: { flex: 1 },\n // Narrow transparent strip pinned to the left edge that captures the iOS swipe-back gesture\n // without stealing the rest of the WebView's touches.\n edgeSwipeZone: { position: 'absolute', left: 0, top: 0, bottom: 0, width: 24 },\n\n overlay: {\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 32,\n backgroundColor: 'rgba(255, 255, 255, 0.97)',\n },\n overlayTitle: {\n marginTop: 18,\n color: '#172033',\n fontSize: 18,\n fontWeight: '700',\n textAlign: 'center',\n },\n overlaySubtitle: {\n marginTop: 8,\n color: '#66758a',\n fontSize: 14,\n lineHeight: 20,\n textAlign: 'center',\n maxWidth: 320,\n },\n errorIconWrap: {\n width: 56,\n height: 56,\n borderRadius: 28,\n backgroundColor: '#fdecef',\n alignItems: 'center',\n justifyContent: 'center',\n },\n errorIconGlyph: { color: '#d6334e', fontSize: 30, fontWeight: '800' },\n primaryAction: {\n marginTop: 26,\n minWidth: 220,\n minHeight: 48,\n borderRadius: 8,\n backgroundColor: '#2752d9',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 24,\n },\n primaryActionText: { color: '#ffffff', fontSize: 15, fontWeight: '700' },\n secondaryAction: {\n marginTop: 6,\n minHeight: 44,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 24,\n },\n secondaryActionText: { color: '#66758a', fontSize: 14, fontWeight: '600' },\n\n popupOverlay: {\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n backgroundColor: '#ffffff',\n },\n popupHeader: {\n height: 48,\n paddingHorizontal: 8,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: '#eef1f7',\n backgroundColor: '#ffffff',\n flexDirection: 'row',\n alignItems: 'center',\n },\n\n webViewFallback: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n backgroundColor: '#ffffff',\n },\n errorText: { color: '#d6334e', fontSize: 14, textAlign: 'center' },\n});\n"]}
@@ -10,18 +10,15 @@
10
10
  <key>HeadersPath</key>
11
11
  <string>Headers</string>
12
12
  <key>LibraryIdentifier</key>
13
- <string>ios-arm64_x86_64-simulator</string>
13
+ <string>ios-arm64</string>
14
14
  <key>LibraryPath</key>
15
15
  <string>libsatya_ffi.a</string>
16
16
  <key>SupportedArchitectures</key>
17
17
  <array>
18
18
  <string>arm64</string>
19
- <string>x86_64</string>
20
19
  </array>
21
20
  <key>SupportedPlatform</key>
22
21
  <string>ios</string>
23
- <key>SupportedPlatformVariant</key>
24
- <string>simulator</string>
25
22
  </dict>
26
23
  <dict>
27
24
  <key>BinaryPath</key>
@@ -29,15 +26,18 @@
29
26
  <key>HeadersPath</key>
30
27
  <string>Headers</string>
31
28
  <key>LibraryIdentifier</key>
32
- <string>ios-arm64</string>
29
+ <string>ios-arm64_x86_64-simulator</string>
33
30
  <key>LibraryPath</key>
34
31
  <string>libsatya_ffi.a</string>
35
32
  <key>SupportedArchitectures</key>
36
33
  <array>
37
34
  <string>arm64</string>
35
+ <string>x86_64</string>
38
36
  </array>
39
37
  <key>SupportedPlatform</key>
40
38
  <string>ios</string>
39
+ <key>SupportedPlatformVariant</key>
40
+ <string>simulator</string>
41
41
  </dict>
42
42
  </array>
43
43
  <key>CFBundlePackageType</key>
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |s|
2
2
  s.name = 'SatyaAttest'
3
- s.version = '0.3.1'
3
+ s.version = '0.3.2'
4
4
  s.summary = 'SATYA-W mobile TLS app-attestation (App Attest + Secure Enclave) backed by the Rust satya-sdk core'
5
5
  s.description = 'Expo native module wrapping the Rust satya-ffi XCFramework and layering iOS App Attest + Secure Enclave platform attestation.'
6
6
  s.author = 'Justin'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burnt-labs/expo-satya-attest",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "SATYA-W mobile TLS app-attestation (App Attest + Secure Enclave / Play Integrity) backed by the Rust satya-sdk core",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -39,7 +39,7 @@
39
39
  "prepublishOnly": "node internal/module_scripts/prepublish-check.js",
40
40
  "prepare": "node internal/module_scripts/prepare.js",
41
41
  "release:check": "node internal/module_scripts/prepublish-check.js",
42
- "test": "node internal/module_scripts/test-providers.js && npm run build && node internal/module_scripts/test-reveal-rules.mjs",
42
+ "test": "node internal/module_scripts/test-providers.js && node internal/module_scripts/test-webview-chrome.js && npm run build && node internal/module_scripts/test-reveal-rules.mjs",
43
43
  "test:publishing-workflows": "node internal/module_scripts/test-publishing-workflows.js",
44
44
  "test:providers": "node internal/module_scripts/test-providers.js",
45
45
  "test:reveal": "node internal/module_scripts/test-reveal-rules.mjs",
@@ -687,7 +687,7 @@ export function SatyaProviderAttestButton({
687
687
  ]
688
688
  );
689
689
 
690
- // Single exit affordance: the device back button (Android) / the lone iOS back chevron.
690
+ // Shared exit path for device back, the visible close button, and the iOS swipe gesture.
691
691
  // If an OAuth popup overlay is open, back dismisses just the popup and returns control to
692
692
  // the login page; otherwise it closes the whole flow. Keeps "back = exit" one press deep.
693
693
  const handleHardwareBack = useCallback(() => {
@@ -698,10 +698,9 @@ export function SatyaProviderAttestButton({
698
698
  closeFlow(true);
699
699
  }, [closeFlow, closeManagedPopup, managedPopup]);
700
700
 
701
- // iOS has no hardware back button, so the flow is dismissed with a left-edge swipe — the
702
- // native iOS "back" gesture rather than an on-screen button. Recreated only when the back
703
- // handler changes (i.e. when an OAuth popup opens/closes) so the gesture always sees the
704
- // current state: swipe closes an open popup first, otherwise closes the whole flow.
701
+ // iOS keeps the native left-edge swipe as a secondary escape hatch. Recreated only when the
702
+ // back handler changes (i.e. when an OAuth popup opens/closes) so the gesture always sees
703
+ // the current state: swipe closes an open popup first, otherwise closes the whole flow.
705
704
  /* eslint-disable react-hooks/refs -- PanResponder.create is an idiomatic RN factory called
706
705
  during render; the values it closes over are a useCallback and gesture args, not React
707
706
  refs, so the react-hooks/refs "ref read during render" warning is a false positive here. */
@@ -1371,8 +1370,7 @@ export function SatyaProviderAttestButton({
1371
1370
  insetPadding(rawInsets),
1372
1371
  ]}>
1373
1372
  {/* Minimal, native-feeling header: provider name centered, no address bar,
1374
- lock, reload, or close. Android exits via the device back button; iOS
1375
- exits via a left-edge swipe (the gesture zone below). */}
1373
+ lock, or reload. The close affordance shares the back/cancel path. */}
1376
1374
  <View style={[styles.header, { backgroundColor: theme.surfaceColor }]}>
1377
1375
  <View style={styles.headerSide} />
1378
1376
  <Text
@@ -1380,7 +1378,16 @@ export function SatyaProviderAttestButton({
1380
1378
  numberOfLines={1}>
1381
1379
  {title}
1382
1380
  </Text>
1383
- <View style={styles.headerSide} />
1381
+ <Pressable
1382
+ accessibilityRole="button"
1383
+ accessibilityLabel="Close browser"
1384
+ hitSlop={12}
1385
+ style={styles.headerSide}
1386
+ onPress={handleHardwareBack}>
1387
+ <Text style={[styles.headerCloseGlyph, { color: theme.onSurfaceColor }]}>
1388
+ ×
1389
+ </Text>
1390
+ </Pressable>
1384
1391
  </View>
1385
1392
  <View style={styles.progressTrack}>
1386
1393
  {progressPct > 0 ? (
@@ -2173,6 +2180,7 @@ const styles = StyleSheet.create({
2173
2180
  justifyContent: 'center',
2174
2181
  },
2175
2182
  headerBackGlyph: { color: '#172033', fontSize: 30, fontWeight: '400', marginTop: -3 },
2183
+ headerCloseGlyph: { color: '#172033', fontSize: 26, fontWeight: '400', lineHeight: 30 },
2176
2184
  headerTitle: {
2177
2185
  flex: 1,
2178
2186
  textAlign: 'center',