@burnt-labs/expo-satya-attest 3.10.1 → 3.10.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,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.10.2 - 2026-09-25
4
+
5
+ ### Fixed
6
+
7
+ - Managed OAuth popups now finish their callback in the original popup instead
8
+ of being closed and reloaded in the main WebView when they return to the
9
+ opener's origin. This fixes Kraken Google login becoming stuck after consent.
10
+ - Preserve explicit popup messaging, close and opener navigation so providers
11
+ can complete their own login handoff.
12
+
13
+ ### Upgrade
14
+
15
+ - Update the SDK JavaScript bundle. This patch introduces no native runtime,
16
+ public API, provider configuration/schema or verifier changes from 3.10.1.
17
+ Native rebuild requirements for upgrades from earlier versions still apply.
18
+
3
19
  ## 3.10.1 - 2026-09-22
4
20
 
5
21
  ### Fixed
package/PUBLISHING.md CHANGED
@@ -12,16 +12,17 @@ for a plug-and-play Expo SDK.
12
12
 
13
13
  ## Release preparation
14
14
 
15
- The next prepared patch release is **3.10.1**. Version 3.10.0 is already published.
16
- This patch enables HTTP/2 with HTTP/1.1 fallback for Android single-endpoint and
17
- composite native replay. Consumers must rebuild and reinstall their Android app;
18
- a JavaScript-only update does not replace the native replay client. No provider
19
- configuration or verifier deployment is required for this patch.
20
-
21
- For the affected Stake flow, use a rebuilt physical Android app in
22
- app-attestation mode and record native replay and backend verification results
23
- separately. A successful login or WebView capture alone does not establish
24
- replay success.
15
+ The next prepared patch release is **3.10.2**. Version 3.10.1 is already published.
16
+ This patch preserves managed OAuth popups until their callback completes instead
17
+ of automatically reloading the callback in the main WebView. It fixes Kraken
18
+ Google login and preserves explicit popup messaging, close and opener navigation.
19
+ Consumers must update the SDK JavaScript bundle. No new native runtime, provider
20
+ configuration/schema or verifier deployment is required over 3.10.1; native
21
+ rebuild requirements from earlier releases still apply.
22
+
23
+ Kraken Google login was confirmed on physical iOS and Android devices. Additional
24
+ provider Google-login checks were reported successful by the tester. These login
25
+ checks do not establish full proof-generation or provider-session matrix coverage.
25
26
 
26
27
  A version bump or passing package checks does not establish native device readiness:
27
28
  complete the gates below before tagging a stable release.
@@ -57,7 +58,7 @@ Local cookie cleanup does not reset remote hosted TeeLS sessions.
57
58
  The package check requires both native session managers, the WebView snapshot
58
59
  helper, adapter script, Android keep rules and public JS/declarations. Host tests
59
60
  use synthetic stores and adapter fixtures; they are not substitutes for device
60
- cookie isolation tests. Until the app builds and device matrix pass, treat 3.10.1
61
+ cookie isolation tests. Until the app builds and device matrix pass, treat 3.10.2
61
62
  as release preparation, not a validated stable release.
62
63
 
63
64
  ## TEE release requirements
@@ -265,7 +266,7 @@ internal/module_scripts/
265
266
  After the release gates pass and publication is authorized, use the consolidated
266
267
  `publish-expo-satya-attest.yml` workflow. A stable tag must match the committed
267
268
  package version and point to a commit on `main`; for this prepared release the
268
- package-specific tag is `expo-satya-attest-v3.10.1`. Creating/pushing that tag starts
269
+ package-specific tag is `expo-satya-attest-v3.10.2`. Creating/pushing that tag starts
269
270
  publication. Manual workflow dispatch is a dry-run.
270
271
 
271
272
  The workflow builds native artifacts, runs the release checks, and publishes
@@ -283,13 +284,13 @@ Every push to `main` publishes a snapshot package to the public npm registry wit
283
284
  unique prerelease version:
284
285
 
285
286
  ```text
286
- 3.10.1-snapshot.<run>.<attempt>.sha-<commit>
287
+ 3.10.3-snapshot.<run>.<attempt>.sha-<commit>
287
288
  ```
288
289
 
289
290
  The snapshot job (in `publish-expo-satya-attest.yml`) increments the package's patch base
290
- in CI before publishing. For example, if `package.json` is `3.10.0`, the snapshot version
291
- is based on `3.10.1`:
292
- `3.10.1-snapshot.<run>.<attempt>.sha-<commit>`. Snapshots are development builds and
291
+ in CI before publishing. For example, if `package.json` is `3.10.2`, the snapshot version
292
+ is based on `3.10.3`:
293
+ `3.10.3-snapshot.<run>.<attempt>.sha-<commit>`. Snapshots are development builds and
293
294
  do not imply completion of the physical-device gates.
294
295
 
295
296
  Snapshots use the `snapshot` dist-tag so test apps do not need to know the generated
package/README.md CHANGED
@@ -5,10 +5,11 @@ the Rust `satya-sdk` / `satya-ffi` pipeline for artifact construction and verifi
5
5
  policy, while Swift and Kotlin provide platform-specific WebView capture, native HTTPS
6
6
  replay, hardware-backed signing, and platform attestation evidence.
7
7
 
8
- **3.10.1 patch preparation:** Android native replay now negotiates HTTP/2 with
9
- HTTP/1.1 fallback. Rebuild and reinstall the Android app to receive the fix;
10
- a JavaScript-only update is insufficient. See the [changelog](./CHANGELOG.md)
11
- and [release requirements](./PUBLISHING.md#release-preparation).
8
+ **3.10.2 patch preparation:** Managed OAuth callbacks now finish in their
9
+ original popup, fixing Kraken Google login after consent. Update the SDK
10
+ JavaScript bundle; no native runtime or provider-schema changes are introduced
11
+ from 3.10.1. See the [changelog](./CHANGELOG.md) and
12
+ [release requirements](./PUBLISHING.md#release-preparation).
12
13
 
13
14
  The SDK supports native app attestation, opt-in [TEE replay](./TEE_REPLAY.md),
14
15
  single-endpoint and composite proofs, provider-selective partial completion,
@@ -4,14 +4,14 @@ plugins {
4
4
  }
5
5
 
6
6
  group = 'expo.modules.satyaattest'
7
- version = '3.10.1'
7
+ version = '3.10.2'
8
8
 
9
9
  android {
10
10
  namespace "expo.modules.satyaattest"
11
11
  defaultConfig {
12
12
  consumerProguardFiles 'consumer-rules.pro'
13
13
  versionCode 1
14
- versionName "3.10.1"
14
+ versionName "3.10.2"
15
15
  // StrongBox key attestation needs API 28+; basic Keystore attestation API 24+.
16
16
  minSdkVersion 24
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useProviderAttestFlow.d.ts","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderAttestFlow.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAUlF,OAAO,EACL,kBAAkB,EAIlB,iBAAiB,EACjB,uCAAuC,EAEvC,sBAAsB,EAEtB,gBAAgB,EAChB,cAAc,EACf,MAAM,SAAS,CAAC;AAyBjB,OAAO,EACL,uBAAuB,EAIxB,MAAM,aAAa,CAAC;AAGrB,wBAAgB,qBAAqB,CACnC,EACE,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,qBAAwC,EACxC,eAAe,EACf,MAAM,EAAE,cAAc,EACtB,aAAqB,EACrB,iBAAyB,EACzB,WAAW,EACX,WAAoC,EACpC,QAAgB,EAChB,SAAiB,EACjB,UAAU,EACV,YAAsB,EACtB,QAAgB,EAChB,KAAK,EAAE,SAAS,EAChB,mBAA0B,EAC1B,gBAAgB,EAAE,eAAe,EACjC,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,eAAe,GAChB,EAAE,uCAAuC,EAC1C,cAAc,UAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA27BtB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,UAAU,CAAC,OAAO,qBAAqB,CAAC,EACxC,eAAe,GAAG,aAAa,CAChC,GAAG;IACF,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD,CAAC"}
1
+ {"version":3,"file":"useProviderAttestFlow.d.ts","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderAttestFlow.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAUlF,OAAO,EACL,kBAAkB,EAIlB,iBAAiB,EACjB,uCAAuC,EAEvC,sBAAsB,EAEtB,gBAAgB,EAChB,cAAc,EACf,MAAM,SAAS,CAAC;AAyBjB,OAAO,EACL,uBAAuB,EAIxB,MAAM,aAAa,CAAC;AAGrB,wBAAgB,qBAAqB,CACnC,EACE,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,qBAAwC,EACxC,eAAe,EACf,MAAM,EAAE,cAAc,EACtB,aAAqB,EACrB,iBAAyB,EACzB,WAAW,EACX,WAAoC,EACpC,QAAgB,EAChB,SAAiB,EACjB,UAAU,EACV,YAAsB,EACtB,QAAgB,EAChB,KAAK,EAAE,SAAS,EAChB,mBAA0B,EAC1B,gBAAgB,EAAE,eAAe,EACjC,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,eAAe,GAChB,EAAE,uCAAuC,EAC1C,cAAc,UAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA07BtB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,UAAU,CAAC,OAAO,qBAAqB,CAAC,EACxC,eAAe,GAAG,aAAa,CAChC,GAAG;IACF,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD,CAAC"}
@@ -719,7 +719,6 @@ export function useProviderAttestFlow({ providerId, sessionPolicy, resolveSessio
719
719
  const { handleNavigationStateChange, handleOpenWindow, handlePopupNavigationStateChange, handlePopupOpenWindow, handlePopupShouldStartLoadWithRequest, handleShouldStartLoadWithRequest, } = useProviderNavigationHandlers({
720
720
  emitProgress,
721
721
  managedPopup,
722
- navigateOpenerFromPopup,
723
722
  onLoginNavigation: signalLoginNavigation,
724
723
  onLoginSubmitted: signalLoginSubmitted,
725
724
  openManagedPopup,
@@ -1 +1 @@
1
- {"version":3,"file":"useProviderAttestFlow.js","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderAttestFlow.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Platform, type View } from 'react-native';\n\nimport { selectProviderFlow } from './flowSelection';\nimport { providerDisplayName, type ResolvedProvider } from './providerResolution';\nimport { prepareTeeCapturedRequest, rewriteForNativeReplay } from './replayRewrite';\nimport { teeAttestationResult } from './tee/teeResult';\nimport {\n TeeBundlePreparation,\n type TeeReplaySwapArgs,\n useTeeReplayBundleSwap,\n useTeeReplaySwap,\n} from './tee/useTeeReplaySwap';\nimport { resolveTheme } from './theme';\nimport {\n BrowserChromeState,\n EMPTY_BROWSER_CHROME,\n LoginCompletionDetails,\n LoginSubmitAttempt,\n ManagedPopupState,\n SatyaModeAwareProviderAttestButtonProps,\n SatyaModeAwareProviderAttestationResult,\n SatyaProviderFlowPhase,\n SatyaProviderFlowProgress,\n WebViewComponent,\n WebViewRefLike,\n} from './types';\nimport { endpointMatchTelemetryContext, hostFromUrl, isSecureUrl } from './urlUtils';\nimport { useCompositeCaptureController } from './useCompositeCaptureController';\nimport { useEdgeSwipeBack } from './useEdgeSwipeBack';\nimport { useFunnelEmitter } from './useFunnelEmitter';\nimport { useHtmlCaptureTrigger } from './useHtmlCaptureTrigger';\nimport { useManagedPopupController } from './useManagedPopupController';\nimport { useNativeReplayRunner } from './useNativeReplayRunner';\nimport { useProviderFlowLifecycle } from './useProviderFlowLifecycle';\nimport { useProviderInjectedScripts } from './useProviderInjectedScripts';\nimport { useProviderMessageHandler } from './useProviderMessageHandler';\nimport { useProviderNavigationHandlers } from './useProviderNavigationHandlers';\nimport { useVerificationPresentation } from './useVerificationPresentation';\nimport {\n isCurrentPresentationFlow,\n shouldConcealProviderContent,\n} from './verificationPresentation';\nimport SatyaAttestModule from '../../SatyaAttestModule';\nimport { SatyaMobileClient } from '../../SatyaMobileClient';\nimport { isSatyaDebugEnabled, satyaDebug, summarizeRequest } from '../../debugLog';\nimport { reportSatyaDiagnostics, type SatyaDiagnosticsOutcome } from '../../diagnostics';\nimport { ProviderSessionController } from '../../providerSessions';\nimport { getSatyaRuntimeConfig, isPartialEndpointsAllowedForProvider } from '../../satyaConfig';\nimport { SdkFunnelEvent } from '../../sdkEventLog';\nimport { asTeeError, teeErrorLogData } from '../../tee/errors';\nimport {\n CapturedProviderRequest,\n SatyaProgress,\n SatyaProviderLoginSubmitSignal,\n SatyaProviderTemplate,\n} from '../../types';\nimport { satyaError, SatyaErrorCode, asSatyaError } from '../../types/error.types';\n\nexport function useProviderAttestFlow(\n {\n providerId,\n sessionPolicy,\n resolveSessionPolicy,\n endpointId,\n proofPlanId,\n providerTemplate,\n spkiPins,\n providerPolicyRefresh = 'verifier-first',\n transportConfig,\n client: providedClient,\n verifyBackend = false,\n reportDiagnostics = false,\n diagnostics,\n buttonLabel = 'Generate Attestation',\n disabled = false,\n autoStart = false,\n modalTitle,\n presentation = 'sheet',\n prefetch = false,\n theme: themeProp,\n autoCloseOnComplete = true,\n WebViewComponent: providedWebView,\n webViewUserAgent,\n webViewProps,\n onProgress,\n onRequestCaptured,\n onComplete,\n onError,\n onCancel,\n onCopySessionId,\n }: SatyaModeAwareProviderAttestButtonProps,\n allowTeeReplay = true\n) {\n const [providerSession] = useState(() => new ProviderSessionController());\n const [providerSessionHandle, setProviderSessionHandle] = useState<string | null>(null);\n prefetch = prefetch && !sessionPolicy && !resolveSessionPolicy;\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 flowSequenceRef = useRef(0);\n // Funnel logging: sessionId is stable per mounted flow (one user task),\n // reused across retries; attemptIndex increments per openFlow.\n const {\n emitFunnel,\n beginFunnelAttempt,\n emitFunnelCancelled,\n getSessionId,\n getAttemptIndex,\n getAttemptElapsedMs,\n setFunnelPhase,\n } = useFunnelEmitter(\n allowTeeReplay && getSatyaRuntimeConfig().attestationMode === 'tee-replay'\n ? 'tee-replay'\n : undefined\n );\n const flowAbortControllerRef = useRef<AbortController | null>(null);\n const htmlCaptureFetchedRef = useRef<Set<string>>(new Set());\n const pendingRequestRef = useRef<CapturedProviderRequest | null>(null);\n const bearerRef = useRef<string | null>(null);\n const loggedInRef = useRef(false);\n // Correlates the login submission with its own response so a rejected\n // submission can uncover immediately instead of waiting out the timer.\n const loginSubmitAttemptRef = useRef<LoginSubmitAttempt | null>(null);\n const [webViewBridgeCapability, setWebViewBridgeCapability] = useState(() =>\n SatyaAttestModule.createWebViewBridgeCapability()\n );\n const renewWebViewBridgeCapability = useCallback(() => {\n setWebViewBridgeCapability(SatyaAttestModule.createWebViewBridgeCapability());\n }, []);\n const [modalVisible, setModalVisible] = useState(false);\n useEffect(() => {\n if (!modalVisible) providerSession.release().catch(() => undefined);\n }, [modalVisible, providerSession]);\n const [phase, setPhase] = useState<SatyaProviderFlowPhase>('idle');\n const [error, setError] = useState<string | null>(null);\n // Typed code alongside the message so the UI can tell a permanent\n // authorization refusal from a transient failure worth retrying.\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [errorRetryable, setErrorRetryable] = useState<boolean | null>(null);\n const clearError = useCallback(() => {\n setError(null);\n setErrorCode(null);\n setErrorRetryable(null);\n }, []);\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 const [browserChrome, 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 // Gates the fade-in cover until each WebView first paints.\n const [contentReady, setContentReady] = useState(false);\n const [popupContentReady, setPopupContentReady] = useState(false);\n // Load-start→load-end only; NOT browserChrome.loading, which SPA nav events keep\n // re-asserting after the page has already rendered.\n const [pageLoading, setPageLoading] = useState(false);\n\n const verificationPresentation = useVerificationPresentation({\n captured: !!capturedRequest,\n error: !!error,\n modalVisible,\n });\n\n const closeNativePopupWindowsFailClosed = useCallback(async (): Promise<boolean> => {\n // Native popup WebViews are an Android-only mechanism and `closePopupWindows`\n // is declared only in the Kotlin module, so on iOS there is nothing to close\n // and the call itself would throw. Both current callers are already gated by\n // `setNativePopupWindowsConcealed` returning true off Android, which makes\n // this unreachable there today — state the platform assumption rather than\n // leaving it to depend on a caller's short-circuit, and match the sibling.\n if (Platform.OS !== 'android') return true;\n try {\n return await SatyaAttestModule.closePopupWindows();\n } catch {\n return false;\n }\n }, []);\n\n const setNativePopupWindowsConcealed = useCallback(\n async (concealed: boolean): Promise<boolean> => {\n if (Platform.OS !== 'android') return true;\n if (typeof SatyaAttestModule.setPopupWindowsConcealed !== 'function') {\n return !concealed;\n }\n try {\n if (await SatyaAttestModule.setPopupWindowsConcealed(concealed)) return true;\n } catch {\n // The caller applies flow scoping before taking any fallback action.\n }\n return false;\n },\n []\n );\n\n const beginVerificationPresentation = verificationPresentation.beginFlow;\n const endVerificationPresentation = verificationPresentation.endFlow;\n\n const debugEnabled = isSatyaDebugEnabled();\n\n const emitProgress = useCallback(\n (progress: SatyaProviderFlowProgress) => {\n setFunnelPhase(progress.phase);\n setPhase(progress.phase);\n // Stamp the correlation ids so hosts see them on EVERY progress update,\n // not only on the terminal result. Fields set by the caller win.\n const attemptIndex = getAttemptIndex();\n onProgress?.({\n sessionId: getSessionId(),\n attemptIndex: attemptIndex > 0 ? attemptIndex : undefined,\n ...progress,\n });\n },\n [getAttemptIndex, getSessionId, onProgress, setFunnelPhase]\n );\n\n useEffect(() => {\n return client.subscribeProgress((progress: SatyaProgress) => {\n if (progress.phase === 'failed') return;\n emitProgress({\n phase: progress.phase,\n message: progress.message,\n percent: progress.percent,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n error: progress.error,\n });\n });\n }, [\n client,\n emitProgress,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n ]);\n\n // Opt-in, fire-and-forget outcome report to the Satya observability collector.\n // No-ops unless `reportDiagnostics` is enabled with a collector URL.\n const reportOutcome = useCallback(\n (\n outcomeProviderId: string | undefined,\n outcome: SatyaDiagnosticsOutcome,\n latencyMs?: number\n ) => {\n if (!reportDiagnostics || !diagnostics?.url || !outcomeProviderId) return;\n reportSatyaDiagnostics(diagnostics, { provider: outcomeProviderId, outcome, latencyMs });\n },\n [diagnostics, reportDiagnostics]\n );\n\n const fail = useCallback(\n (cause: unknown) => {\n const errorProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\n const nextError = asSatyaError(\n cause,\n SatyaErrorCode.UNEXPECTED,\n errorProviderId ? { providerId: errorProviderId, phase } : { phase }\n );\n if (nextError.code.startsWith('SATYA_TEE_') && !nextError.context?.teeStage) {\n asTeeError(nextError, 'configuration');\n }\n replayStartedRef.current = false;\n setRunning(false);\n satyaDebug.error('flow', 'flow failed', {\n providerId: errorProviderId,\n errorId: nextError.errorId,\n code: nextError.code,\n stage: nextError.stage,\n error: nextError.message,\n });\n setError(nextError.message);\n setErrorCode(nextError.code ?? null);\n setErrorRetryable(\n typeof nextError.context?.retryable === 'boolean' ? nextError.context.retryable : null\n );\n emitProgress({\n phase: 'failed',\n message: nextError.message,\n percent: 1,\n providerId: errorProviderId,\n error: nextError.diagnostics,\n });\n const ctx = (nextError.context ?? {}) as Record<string, unknown>;\n // The verifier's v2 envelope lands under serverCode/serverClass/\n // serverStage (satyaErrorFromEnvelope); older paths used errorCode/*.\n const verifierErrorCode = ctx.serverCode ?? ctx.errorCode;\n const verifierErrorClass = ctx.serverClass ?? ctx.errorClass;\n const verifierErrorStage = ctx.serverStage ?? ctx.errorStage;\n emitFunnel(SdkFunnelEvent.Failed, {\n providerId: errorProviderId,\n errorCode: nextError.code,\n // Raw message — scrubbed of secrets + length-capped in sdkEventLog.\n errorMessage: nextError.message,\n sdkStage: nextError.stage,\n retryable: typeof ctx.retryable === 'boolean' ? ctx.retryable : undefined,\n httpStatus: typeof ctx.status === 'number' ? ctx.status : undefined,\n ...(ctx.mode === 'tee-replay' ? teeErrorLogData(nextError) : {}),\n errorId: nextError.errorId,\n requestId: typeof ctx.requestId === 'string' ? ctx.requestId : undefined,\n verifierErrorCode: typeof verifierErrorCode === 'string' ? verifierErrorCode : undefined,\n verifierErrorClass: typeof verifierErrorClass === 'string' ? verifierErrorClass : undefined,\n verifierErrorStage: typeof verifierErrorStage === 'string' ? verifierErrorStage : undefined,\n });\n onError?.(nextError);\n reportOutcome(errorProviderId, 'failed');\n },\n [\n emitFunnel,\n emitProgress,\n onError,\n phase,\n providerId,\n providerTemplate?.providerId,\n reportOutcome,\n resolved?.template.providerId,\n ]\n );\n\n // Surface sessionId + attemptIndex on the onComplete result so host apps can\n // correlate a successful attestation with its session (the modal auto-closes\n // on success, so flow.sessionId is otherwise unreadable at that point).\n const onCompleteWithSession = useCallback(\n (result: SatyaModeAwareProviderAttestationResult) => {\n onComplete?.({\n ...result,\n sessionId: getSessionId(),\n attemptIndex: getAttemptIndex(),\n });\n },\n [getAttemptIndex, getSessionId, onComplete]\n );\n\n const { runReplay: runNativeReplay, runBundleReplay } = useNativeReplayRunner({\n // Late messages must retain their retired handle instead of selecting the shared store.\n getProviderSessionHandle: () => providerSessionHandle,\n autoCloseOnComplete,\n client,\n emitProgress,\n emitFunnel,\n getSessionId,\n fail,\n onComplete: onCompleteWithSession,\n flowAbortControllerRef,\n flowSequenceRef,\n replayStartedRef,\n reportOutcome,\n clearError,\n setModalVisible,\n setRunning,\n transportConfig,\n verifyBackend,\n });\n\n // TEE replay reuses everything above and changes only the post-capture step.\n // Selection is read from the live runtime config rather than a prop so a\n // mode set by initSatyaAttest applies without threading it through callers.\n const teeSelection = selectProviderFlow(\n {\n providerId,\n providerTemplateId: providerTemplate?.providerId,\n appId: transportConfig?.appId,\n allowTeeReplay,\n },\n getSatyaRuntimeConfig()\n );\n const [teePreparation] = useState(() => new TeeBundlePreparation());\n const teeSwapArgs: TeeReplaySwapArgs = {\n getProviderSessionHandle: () => providerSessionHandle,\n preparation: teePreparation,\n getSignal: () => flowAbortControllerRef.current?.signal,\n verifierBearerToken: transportConfig?.verifierBearerToken,\n getSessionId,\n emitFunnel,\n getAttemptElapsedMs,\n verifierUrl: transportConfig?.verifierUrl ?? '',\n appId: teeSelection.type === 'tee-replay' ? teeSelection.appId : '',\n replayServerUrl: teeSelection.type === 'tee-replay' ? teeSelection.replayServerUrl : undefined,\n rawProviderFor: (template: SatyaProviderTemplate) =>\n (template as unknown as { rawProvider?: unknown }).rawProvider ?? template,\n onOutcome: ({ verify, artifacts, template, requests }) => {\n onCompleteWithSession(\n teeAttestationResult(\n teeSelection.type === 'tee-replay' ? teeSelection.appId : '',\n getSessionId(),\n verify,\n artifacts,\n template,\n requests\n )\n );\n emitProgress({ phase: 'verified', message: 'TEE replay verified', percent: 1 });\n reportOutcome(template.providerId, 'ok');\n if (autoCloseOnComplete) setModalVisible(false);\n },\n emitProgress,\n };\n useEffect(() => () => teePreparation.cancel(), [teePreparation]);\n useEffect(() => {\n if (!modalVisible) teePreparation.cancel();\n }, [modalVisible, teePreparation]);\n const runTeeReplay = useTeeReplaySwap(teeSwapArgs);\n const runTeeReplayBundle = useTeeReplayBundleSwap(teeSwapArgs);\n\n const runReplay = useCallback(\n async (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n if (teeSelection.type !== 'tee-replay') return runNativeReplay(request, template);\n const sequence = flowSequenceRef.current;\n replayStartedRef.current = true;\n setRunning(true);\n clearError();\n try {\n await runTeeReplay(request, template);\n } catch (cause) {\n if (sequence === flowSequenceRef.current)\n fail(asSatyaError(cause, SatyaErrorCode.TEE_REPLAY_FAILED));\n } finally {\n if (sequence === flowSequenceRef.current) {\n setRunning(false);\n replayStartedRef.current = false;\n }\n }\n },\n [teeSelection.type, runNativeReplay, runTeeReplay, clearError, fail]\n );\n\n // The composite controller is wired straight to the NATIVE runner, so this\n // must dispatch on mode: without it, a provider with a composite proof plan\n // silently produced an App Attestation artifact while the caller believed it\n // was in TEE mode - the exact downgrade the `unsupported` selection exists to\n // prevent, and one that only appeared on device because Kaggle publishes a\n // proof plan.\n //\n // The verifier-issued selection commits both strict and partial completion.\n const runBundleReplayForMode = useCallback(\n async (\n orderedRequests: CapturedProviderRequest[],\n template: SatyaProviderTemplate,\n partialEndpointsAllowed: boolean\n ) => {\n if (teeSelection.type === 'tee-replay') {\n const sequence = flowSequenceRef.current;\n replayStartedRef.current = true;\n setRunning(true);\n clearError();\n try {\n const preparedRequests = orderedRequests.map((request) =>\n prepareTeeCapturedRequest(request, template, bearerRef.current)\n );\n await runTeeReplayBundle(preparedRequests, template, partialEndpointsAllowed);\n } catch (cause) {\n if (sequence === flowSequenceRef.current)\n fail(asSatyaError(cause, SatyaErrorCode.TEE_REPLAY_FAILED));\n } finally {\n if (sequence === flowSequenceRef.current) {\n setRunning(false);\n replayStartedRef.current = false;\n }\n }\n return;\n }\n await runBundleReplay(orderedRequests, template, partialEndpointsAllowed);\n },\n [clearError, fail, runBundleReplay, runTeeReplayBundle, teeSelection.type]\n );\n\n const { clearCompositeCapture, handleCompositeCaptureMessage } = useCompositeCaptureController({\n emitProgress,\n emitFunnel,\n fail,\n onRequestCaptured,\n replayStartedRef,\n resolved,\n runBundleReplay: runBundleReplayForMode,\n setCapturedRequest,\n });\n\n const unsupportedSelection = teeSelection.type === 'unsupported' ? teeSelection : undefined;\n\n const { openFlow, closeFlow } = useProviderFlowLifecycle({\n providerSession,\n sessionPolicy,\n resolveSessionPolicy,\n setProviderSessionHandle,\n startupError: unsupportedSelection\n ? satyaError(unsupportedSelection.code, unsupportedSelection.message)\n : undefined,\n onCaptureStart: (template, signal) => {\n if (teeSelection.type === 'tee-replay') {\n teePreparation.prepare(\n template,\n { ...teeSwapArgs, signal, getSignal: undefined },\n isPartialEndpointsAllowedForProvider(template.providerId)\n );\n }\n },\n providerId,\n endpointId,\n proofPlanId,\n providerTemplate,\n spkiPins,\n providerPolicyRefresh,\n transportConfig,\n verifyBackend,\n autoStart,\n disabled,\n prefetch,\n providedWebView,\n webViewUserAgent,\n debugEnabled,\n onCancel,\n emitProgress,\n beginFunnelAttempt,\n emitFunnelCancelled,\n fail,\n clearCompositeCapture,\n beginVerificationPresentation,\n endVerificationPresentation,\n renewWebViewBridgeCapability,\n resolved,\n modalVisible,\n running,\n flowAbortControllerRef,\n flowSequenceRef,\n replayStartedRef,\n htmlCaptureFetchedRef,\n pendingRequestRef,\n bearerRef,\n loggedInRef,\n loginSubmitAttemptRef,\n setRunning,\n setCapturedRequest,\n clearError,\n setResolved,\n setResolvedWebView,\n setEffectiveUserAgent,\n setWebViewUrl,\n setManagedPopup,\n setContentReady,\n setPopupContentReady,\n setPageLoading,\n setMainDocumentScriptReady,\n setPopupDocumentScriptReady,\n setModalVisible,\n setBrowserChrome,\n setPopupChrome,\n });\n\n const captureAndReplay = useCallback(\n (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n const replayRequest =\n teeSelection.type === 'tee-replay'\n ? prepareTeeCapturedRequest(request, template, bearerRef.current)\n : 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 emitFunnel(SdkFunnelEvent.EndpointMatched, {\n providerId: template.providerId,\n endpointId: template.selectedEndpointId,\n ...endpointMatchTelemetryContext(template.proofTarget, replayRequest.url),\n method: replayRequest.method,\n });\n runReplay(replayRequest, template).catch(fail);\n },\n [emitFunnel, emitProgress, fail, onRequestCaptured, runReplay, teeSelection.type]\n );\n\n const currentProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\n\n // LOGIN_COMPLETED fires once per attempt from whichever login-done signal\n // arrives first: `__satyaReady` (via signalUserInteractionComplete) or an\n // accepted `auth.submitSignal` response. logData fields are derived and\n // PII-free (closed enums, registry-declared ids, buckets, timings).\n const emitLoginCompleted = useCallback(\n (details?: LoginCompletionDetails) => {\n emitFunnel(\n SdkFunnelEvent.LoginCompleted,\n {\n providerId: currentProviderId,\n loginSignalSource: details?.source ?? 'satyaReady',\n loginSignalId: details?.signalId,\n submitStatusClass: details?.submitStatusClass,\n loginBodyMatched: details?.bodyMatched,\n loginLatencyMs: getAttemptElapsedMs(),\n captureMode: resolved?.template.selectedProofPlan ? 'composite' : 'single',\n },\n { oncePerAttempt: true }\n );\n },\n [currentProviderId, emitFunnel, getAttemptElapsedMs, resolved?.template.selectedProofPlan]\n );\n\n const {\n closeManagedPopup,\n navigateOpenerFromPopup,\n openManagedPopup,\n relayOpenerToPopupMessage,\n relayOpenerToPopupPortMessage,\n relayPopupPortMessage,\n relayPopupPostMessage,\n } = useManagedPopupController({\n emitProgress,\n managedPopup,\n popupChromeUrl: popupChrome.url,\n popupRef,\n providerId: currentProviderId,\n setBrowserChrome,\n setManagedPopup,\n setPopupChrome,\n setPopupContentReady,\n setPopupDocumentScriptReady,\n setWebViewUrl,\n webRef,\n });\n\n const handleHardwareBack = useCallback(() => {\n if (managedPopup) {\n closeManagedPopup();\n return;\n }\n closeFlow(true);\n }, [closeFlow, closeManagedPopup, managedPopup]);\n\n const edgeSwipeHandlers = useEdgeSwipeBack(handleHardwareBack);\n\n const handleModalRequestClose = useCallback(() => {\n // iOS sheet swipe-dismiss is native, so cancel the whole flow; Android back\n // pops an open popup first.\n if (Platform.OS === 'ios') {\n closeFlow(true);\n return;\n }\n handleHardwareBack();\n }, [closeFlow, handleHardwareBack]);\n\n const markContentReady = useCallback(() => setContentReady(true), []);\n const markPopupContentReady = useCallback(() => setPopupContentReady(true), []);\n const markLoadStart = useCallback(() => setPageLoading(true), []);\n const markLoadEnd = useCallback(() => setPageLoading(false), []);\n\n const handleReload = useCallback(() => {\n if (capturedRequest || verificationPresentation.covered) return;\n setPageLoading(true);\n webRef.current?.reload?.();\n }, [capturedRequest, verificationPresentation.covered]);\n\n const signalUserInteractionComplete = useCallback(\n (loginDetails?: LoginCompletionDetails) => {\n loginSubmitAttemptRef.current = null;\n // The message handler invokes this when `__satyaReady` arrives (which\n // also triggers the post-login cover below) — the LOGIN_COMPLETED site.\n emitLoginCompleted(loginDetails);\n // Native Android popup WebViews sit above React. Queue their concealment\n // before scheduling the React cover so no popup remains visibly on top.\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(true)\n .then(async (concealed) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (concealed) return;\n // Older/failing native binaries cannot hide a popup in place. Only\n // close popups after confirming this is still the originating flow.\n const closed = await closeNativePopupWindowsFailClosed();\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n // Closing one popup is not a persistent concealment mechanism: the\n // background page could open another. End this unsupported attempt\n // regardless of the close result.\n if (!closed) satyaDebug.warn('webview', 'could not close native popup windows');\n closeFlow(true);\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) closeFlow(true);\n });\n verificationPresentation.signalUserInteractionComplete();\n },\n [\n closeFlow,\n emitLoginCompleted,\n setNativePopupWindowsConcealed,\n verificationPresentation.signalUserInteractionComplete,\n ]\n );\n\n const pendingConcealedRef = useRef(false);\n // Native popup concealment is asynchronous. Keep correlation outside React\n // state so a response/navigation that arrives before concealment completes\n // can still promote the eventual provisional cover to the accepted window.\n const loginSubmitArmRef = useRef(0);\n const loginSubmitConcealSequenceRef = useRef<number | null>(null);\n const loginSubmitAcceptedSequenceRef = useRef<number | null>(null);\n const presentationStateRef = useRef(verificationPresentation.state);\n const presentationState = verificationPresentation.state;\n // Bridge callbacks may run before passive effects. A layout effect updates\n // the guard as part of the commit, before native events can deliver a retry.\n useLayoutEffect(() => {\n presentationStateRef.current = presentationState;\n }, [presentationState]);\n\n // The pre-emptive cover is a guess about what the user just did, so unlike\n // the confirmed cover it must degrade instead of failing closed: if native\n // popups cannot be concealed we simply do not cover, leaving today's\n // behavior. Ending a flow the user has not yet completed would be worse than\n // briefly showing the page we were trying to hide.\n const signalLoginSubmitted = useCallback(\n (signal: SatyaProviderLoginSubmitSignal): boolean => {\n // Only an uncovered provider view can be pre-emptively covered. Without\n // this guard a late signal — after the user returned to the provider, or\n // once the confirmed cover owns the screen — would still conceal Android\n // popups while the reducer refuses to cover, hiding them behind a visible\n // page. Also collapse duplicate bridge/navigation signals while native\n // concealment for this flow is in flight.\n if (presentationStateRef.current !== 'provider') return false;\n const flowSequence = flowSequenceRef.current;\n if (loginSubmitConcealSequenceRef.current === flowSequence) return false;\n loginSubmitConcealSequenceRef.current = flowSequence;\n loginSubmitAcceptedSequenceRef.current = null;\n const arm = ++loginSubmitArmRef.current;\n setNativePopupWindowsConcealed(true)\n .then((concealed) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n loginSubmitConcealSequenceRef.current = null;\n if (loginSubmitArmRef.current !== arm) {\n if (concealed) {\n setNativePopupWindowsConcealed(false).catch(() => {\n satyaDebug.warn('webview', 'could not restore native popup visibility');\n });\n }\n return;\n }\n if (!concealed) {\n loginSubmitAttemptRef.current = null;\n satyaDebug.warn('webview', 'skipping pre-emptive login cover: popups not concealable');\n return;\n }\n verificationPresentation.signalLoginSubmitted(signal.timeoutMs);\n if (loginSubmitAcceptedSequenceRef.current === flowSequence) {\n verificationPresentation.signalLoginSubmitAccepted();\n }\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) {\n loginSubmitConcealSequenceRef.current = null;\n loginSubmitAttemptRef.current = null;\n }\n satyaDebug.warn('webview', 'skipping pre-emptive login cover: conceal call failed');\n });\n return true;\n },\n [\n setNativePopupWindowsConcealed,\n verificationPresentation.signalLoginSubmitAccepted,\n verificationPresentation.signalLoginSubmitted,\n ]\n );\n\n const signalLoginSubmitAccepted = useCallback(\n (loginDetails?: LoginCompletionDetails) => {\n const flowSequence = flowSequenceRef.current;\n loginSubmitAcceptedSequenceRef.current = flowSequence;\n if (presentationStateRef.current === 'pendingLogin') {\n verificationPresentation.signalLoginSubmitAccepted();\n }\n emitLoginCompleted(loginDetails ?? { source: 'submitSignal' });\n },\n [emitLoginCompleted, verificationPresentation.signalLoginSubmitAccepted]\n );\n\n const signalLoginSubmitRejected = useCallback(() => {\n loginSubmitAttemptRef.current = null;\n loginSubmitAcceptedSequenceRef.current = null;\n loginSubmitConcealSequenceRef.current = null;\n loginSubmitArmRef.current += 1;\n presentationStateRef.current = 'provider';\n verificationPresentation.signalLoginSubmitRejected();\n }, [verificationPresentation.signalLoginSubmitRejected]);\n\n // Navigation while the provisional cover is up means the submission is still\n // resolving — a rejected login re-renders the form in place instead. Holding\n // here stops the cover lapsing mid-redirect and flashing the destination. A\n // navigation may race the asynchronous native concealment, so remember it as\n // accepted even before the React presentation reaches pendingLogin.\n const signalLoginNavigation = useCallback(() => {\n const flowSequence = flowSequenceRef.current;\n if (\n presentationStateRef.current !== 'pendingLogin' &&\n loginSubmitConcealSequenceRef.current !== flowSequence\n ) {\n return;\n }\n loginSubmitAcceptedSequenceRef.current = flowSequence;\n if (presentationStateRef.current === 'pendingLogin') {\n verificationPresentation.extendLoginSubmitPending();\n }\n }, [verificationPresentation.extendLoginSubmitPending]);\n\n // Restoring popups is driven off the state itself rather than the reject\n // callback, because the provisional cover also lapses on its own timer\n // inside the presentation hook. Both routes land back on 'provider'.\n useEffect(() => {\n if (presentationState === 'pendingLogin') {\n pendingConcealedRef.current = true;\n return;\n }\n if (!pendingConcealedRef.current) return;\n pendingConcealedRef.current = false;\n loginSubmitAttemptRef.current = null;\n // A promotion to the confirmed cover must keep popups concealed.\n if (presentationState !== 'provider') return;\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(false)\n .then((restored) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (!restored) satyaDebug.warn('webview', 'could not restore concealed native popups');\n })\n .catch(() => {});\n }, [presentationState, setNativePopupWindowsConcealed]);\n\n const returnToProvider = useCallback(() => {\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(false)\n .then((restored) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (restored) {\n verificationPresentation.returnToProvider();\n } else {\n satyaDebug.warn('webview', 'could not restore concealed native popup windows');\n closeFlow(true);\n }\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) closeFlow(true);\n });\n }, [closeFlow, setNativePopupWindowsConcealed, verificationPresentation.returnToProvider]);\n\n const handleMessage = useProviderMessageHandler({\n bearerRef,\n captureAndReplay,\n closeManagedPopup,\n loggedInRef,\n loginSubmitAttemptRef,\n onLoginSubmitted: signalLoginSubmitted,\n onLoginSubmitAccepted: signalLoginSubmitAccepted,\n onLoginSubmitRejected: signalLoginSubmitRejected,\n onUserInteractionComplete: signalUserInteractionComplete,\n onCompositeCaptureMessage: handleCompositeCaptureMessage,\n navigateOpenerFromPopup,\n openManagedPopup,\n pendingRequestRef,\n relayOpenerToPopupMessage,\n relayOpenerToPopupPortMessage,\n relayPopupPortMessage,\n relayPopupPostMessage,\n replayStartedRef,\n resolved,\n bridgeCapability: webViewBridgeCapability,\n webViewProps,\n });\n\n const {\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n } = useProviderNavigationHandlers({\n emitProgress,\n managedPopup,\n navigateOpenerFromPopup,\n onLoginNavigation: signalLoginNavigation,\n onLoginSubmitted: signalLoginSubmitted,\n openManagedPopup,\n providerId,\n providerTemplate,\n resolved,\n setBrowserChrome,\n setPopupChrome,\n setWebViewUrl,\n webRef,\n webViewProps,\n webViewUrl,\n });\n\n const maybeTriggerHtmlCapture = useHtmlCaptureTrigger({\n resolved,\n replayStartedRef,\n htmlCaptureFetchedRef,\n webRef,\n });\n\n const { mainInjectedScript, popupInjectedScript, useNativePopups } = useProviderInjectedScripts({\n providerSessionHandle,\n onSessionPreparationFailure: fail,\n bridgeCapability: webViewBridgeCapability,\n modalVisible,\n ResolvedWebView,\n resolved,\n managedPopup,\n debugEnabled,\n webHostRef,\n popupHostRef,\n setMainDocumentScriptReady,\n setPopupDocumentScriptReady,\n });\n\n const title =\n modalTitle ?? (resolved ? providerDisplayName(resolved.template) : 'Provider Attestation');\n const isProcessing = !!capturedRequest && !error;\n const isVerificationCovered = shouldConcealProviderContent(verificationPresentation.state, {\n captured: !!capturedRequest,\n error: !!error,\n });\n const preparing = modalVisible && !resolved && !error;\n const nativePopupConcealmentRequired = isVerificationCovered || !!error;\n useEffect(() => {\n // Before provider resolution there cannot be a provider-owned popup, so do\n // not treat an older native binary as a terminal concealment failure yet.\n if (!modalVisible || !resolved) return;\n let cancelled = false;\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(nativePopupConcealmentRequired)\n .then(async (concealed) => {\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (concealed) return;\n if (nativePopupConcealmentRequired) {\n await closeNativePopupWindowsFailClosed();\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n }\n closeFlow(true);\n })\n .catch(() => {\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n closeFlow(true);\n });\n return () => {\n cancelled = true;\n };\n }, [\n closeFlow,\n closeNativePopupWindowsFailClosed,\n modalVisible,\n nativePopupConcealmentRequired,\n resolved,\n setNativePopupWindowsConcealed,\n ]);\n // Browser-style loading line: tracks a document's load-start→load-end, not\n // attestation. Suppressed while the verification cover conceals the page so\n // background navigations don't telegraph through the chrome.\n const webViewLoading =\n !!resolved && !error && !isProcessing && !isVerificationCovered && pageLoading;\n const theme = resolveTheme(themeProp);\n const currentUrl = browserChrome.url || webViewUrl || '';\n const secureHost = hostFromUrl(currentUrl);\n const secureConnection = isSecureUrl(currentUrl);\n return {\n providerSessionHandle,\n buttonLabel,\n capturedRequest,\n closeFlow,\n closeManagedPopup,\n contentReady,\n disabled,\n edgeSwipeHandlers,\n effectiveUserAgent,\n error,\n errorCode,\n errorRetryable,\n handleHardwareBack,\n handleMessage,\n handleModalRequestClose,\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n handleReload,\n isProcessing,\n isVerificationCovered,\n mainDocumentScriptReady,\n mainInjectedScript,\n managedPopup,\n markContentReady,\n markLoadEnd,\n markLoadStart,\n markPopupContentReady,\n maybeTriggerHtmlCapture,\n modalVisible,\n openFlow,\n phase,\n sessionId: getSessionId(),\n attemptIndex: getAttemptIndex(),\n onCopySessionId,\n popupContentReady,\n popupDocumentScriptReady,\n popupHostRef,\n popupInjectedScript,\n popupRef,\n prefetch,\n preparing,\n presentation,\n resolved,\n ResolvedWebView,\n running,\n secureConnection,\n secureHost,\n webViewLoading,\n setBrowserChrome,\n setPopupChrome,\n theme,\n title,\n useNativePopups,\n webHostRef,\n webRef,\n webViewProps,\n webViewUrl,\n returnToProvider,\n verificationPresentationPending: verificationPresentation.pending,\n verificationPresentationStalled: verificationPresentation.stalled,\n };\n}\n\nexport type ProviderAttestFlow = Omit<\n ReturnType<typeof useProviderAttestFlow>,\n 'markLoadStart' | 'markLoadEnd'\n> & {\n markLoadStart: (url?: string) => void;\n markLoadEnd: (url?: string) => void;\n isTeelsFlow?: boolean;\n handleContentProcessDidTerminate?: (event: unknown) => void;\n handleRenderProcessGone?: (event: unknown) => void;\n handleWebViewError?: (event: unknown) => void;\n handleWebViewHttpError?: (event: unknown) => void;\n};\n"]}
1
+ {"version":3,"file":"useProviderAttestFlow.js","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderAttestFlow.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Platform, type View } from 'react-native';\n\nimport { selectProviderFlow } from './flowSelection';\nimport { providerDisplayName, type ResolvedProvider } from './providerResolution';\nimport { prepareTeeCapturedRequest, rewriteForNativeReplay } from './replayRewrite';\nimport { teeAttestationResult } from './tee/teeResult';\nimport {\n TeeBundlePreparation,\n type TeeReplaySwapArgs,\n useTeeReplayBundleSwap,\n useTeeReplaySwap,\n} from './tee/useTeeReplaySwap';\nimport { resolveTheme } from './theme';\nimport {\n BrowserChromeState,\n EMPTY_BROWSER_CHROME,\n LoginCompletionDetails,\n LoginSubmitAttempt,\n ManagedPopupState,\n SatyaModeAwareProviderAttestButtonProps,\n SatyaModeAwareProviderAttestationResult,\n SatyaProviderFlowPhase,\n SatyaProviderFlowProgress,\n WebViewComponent,\n WebViewRefLike,\n} from './types';\nimport { endpointMatchTelemetryContext, hostFromUrl, isSecureUrl } from './urlUtils';\nimport { useCompositeCaptureController } from './useCompositeCaptureController';\nimport { useEdgeSwipeBack } from './useEdgeSwipeBack';\nimport { useFunnelEmitter } from './useFunnelEmitter';\nimport { useHtmlCaptureTrigger } from './useHtmlCaptureTrigger';\nimport { useManagedPopupController } from './useManagedPopupController';\nimport { useNativeReplayRunner } from './useNativeReplayRunner';\nimport { useProviderFlowLifecycle } from './useProviderFlowLifecycle';\nimport { useProviderInjectedScripts } from './useProviderInjectedScripts';\nimport { useProviderMessageHandler } from './useProviderMessageHandler';\nimport { useProviderNavigationHandlers } from './useProviderNavigationHandlers';\nimport { useVerificationPresentation } from './useVerificationPresentation';\nimport {\n isCurrentPresentationFlow,\n shouldConcealProviderContent,\n} from './verificationPresentation';\nimport SatyaAttestModule from '../../SatyaAttestModule';\nimport { SatyaMobileClient } from '../../SatyaMobileClient';\nimport { isSatyaDebugEnabled, satyaDebug, summarizeRequest } from '../../debugLog';\nimport { reportSatyaDiagnostics, type SatyaDiagnosticsOutcome } from '../../diagnostics';\nimport { ProviderSessionController } from '../../providerSessions';\nimport { getSatyaRuntimeConfig, isPartialEndpointsAllowedForProvider } from '../../satyaConfig';\nimport { SdkFunnelEvent } from '../../sdkEventLog';\nimport { asTeeError, teeErrorLogData } from '../../tee/errors';\nimport {\n CapturedProviderRequest,\n SatyaProgress,\n SatyaProviderLoginSubmitSignal,\n SatyaProviderTemplate,\n} from '../../types';\nimport { satyaError, SatyaErrorCode, asSatyaError } from '../../types/error.types';\n\nexport function useProviderAttestFlow(\n {\n providerId,\n sessionPolicy,\n resolveSessionPolicy,\n endpointId,\n proofPlanId,\n providerTemplate,\n spkiPins,\n providerPolicyRefresh = 'verifier-first',\n transportConfig,\n client: providedClient,\n verifyBackend = false,\n reportDiagnostics = false,\n diagnostics,\n buttonLabel = 'Generate Attestation',\n disabled = false,\n autoStart = false,\n modalTitle,\n presentation = 'sheet',\n prefetch = false,\n theme: themeProp,\n autoCloseOnComplete = true,\n WebViewComponent: providedWebView,\n webViewUserAgent,\n webViewProps,\n onProgress,\n onRequestCaptured,\n onComplete,\n onError,\n onCancel,\n onCopySessionId,\n }: SatyaModeAwareProviderAttestButtonProps,\n allowTeeReplay = true\n) {\n const [providerSession] = useState(() => new ProviderSessionController());\n const [providerSessionHandle, setProviderSessionHandle] = useState<string | null>(null);\n prefetch = prefetch && !sessionPolicy && !resolveSessionPolicy;\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 flowSequenceRef = useRef(0);\n // Funnel logging: sessionId is stable per mounted flow (one user task),\n // reused across retries; attemptIndex increments per openFlow.\n const {\n emitFunnel,\n beginFunnelAttempt,\n emitFunnelCancelled,\n getSessionId,\n getAttemptIndex,\n getAttemptElapsedMs,\n setFunnelPhase,\n } = useFunnelEmitter(\n allowTeeReplay && getSatyaRuntimeConfig().attestationMode === 'tee-replay'\n ? 'tee-replay'\n : undefined\n );\n const flowAbortControllerRef = useRef<AbortController | null>(null);\n const htmlCaptureFetchedRef = useRef<Set<string>>(new Set());\n const pendingRequestRef = useRef<CapturedProviderRequest | null>(null);\n const bearerRef = useRef<string | null>(null);\n const loggedInRef = useRef(false);\n // Correlates the login submission with its own response so a rejected\n // submission can uncover immediately instead of waiting out the timer.\n const loginSubmitAttemptRef = useRef<LoginSubmitAttempt | null>(null);\n const [webViewBridgeCapability, setWebViewBridgeCapability] = useState(() =>\n SatyaAttestModule.createWebViewBridgeCapability()\n );\n const renewWebViewBridgeCapability = useCallback(() => {\n setWebViewBridgeCapability(SatyaAttestModule.createWebViewBridgeCapability());\n }, []);\n const [modalVisible, setModalVisible] = useState(false);\n useEffect(() => {\n if (!modalVisible) providerSession.release().catch(() => undefined);\n }, [modalVisible, providerSession]);\n const [phase, setPhase] = useState<SatyaProviderFlowPhase>('idle');\n const [error, setError] = useState<string | null>(null);\n // Typed code alongside the message so the UI can tell a permanent\n // authorization refusal from a transient failure worth retrying.\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [errorRetryable, setErrorRetryable] = useState<boolean | null>(null);\n const clearError = useCallback(() => {\n setError(null);\n setErrorCode(null);\n setErrorRetryable(null);\n }, []);\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 const [browserChrome, 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 // Gates the fade-in cover until each WebView first paints.\n const [contentReady, setContentReady] = useState(false);\n const [popupContentReady, setPopupContentReady] = useState(false);\n // Load-start→load-end only; NOT browserChrome.loading, which SPA nav events keep\n // re-asserting after the page has already rendered.\n const [pageLoading, setPageLoading] = useState(false);\n\n const verificationPresentation = useVerificationPresentation({\n captured: !!capturedRequest,\n error: !!error,\n modalVisible,\n });\n\n const closeNativePopupWindowsFailClosed = useCallback(async (): Promise<boolean> => {\n // Native popup WebViews are an Android-only mechanism and `closePopupWindows`\n // is declared only in the Kotlin module, so on iOS there is nothing to close\n // and the call itself would throw. Both current callers are already gated by\n // `setNativePopupWindowsConcealed` returning true off Android, which makes\n // this unreachable there today — state the platform assumption rather than\n // leaving it to depend on a caller's short-circuit, and match the sibling.\n if (Platform.OS !== 'android') return true;\n try {\n return await SatyaAttestModule.closePopupWindows();\n } catch {\n return false;\n }\n }, []);\n\n const setNativePopupWindowsConcealed = useCallback(\n async (concealed: boolean): Promise<boolean> => {\n if (Platform.OS !== 'android') return true;\n if (typeof SatyaAttestModule.setPopupWindowsConcealed !== 'function') {\n return !concealed;\n }\n try {\n if (await SatyaAttestModule.setPopupWindowsConcealed(concealed)) return true;\n } catch {\n // The caller applies flow scoping before taking any fallback action.\n }\n return false;\n },\n []\n );\n\n const beginVerificationPresentation = verificationPresentation.beginFlow;\n const endVerificationPresentation = verificationPresentation.endFlow;\n\n const debugEnabled = isSatyaDebugEnabled();\n\n const emitProgress = useCallback(\n (progress: SatyaProviderFlowProgress) => {\n setFunnelPhase(progress.phase);\n setPhase(progress.phase);\n // Stamp the correlation ids so hosts see them on EVERY progress update,\n // not only on the terminal result. Fields set by the caller win.\n const attemptIndex = getAttemptIndex();\n onProgress?.({\n sessionId: getSessionId(),\n attemptIndex: attemptIndex > 0 ? attemptIndex : undefined,\n ...progress,\n });\n },\n [getAttemptIndex, getSessionId, onProgress, setFunnelPhase]\n );\n\n useEffect(() => {\n return client.subscribeProgress((progress: SatyaProgress) => {\n if (progress.phase === 'failed') return;\n emitProgress({\n phase: progress.phase,\n message: progress.message,\n percent: progress.percent,\n providerId: resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId,\n error: progress.error,\n });\n });\n }, [\n client,\n emitProgress,\n providerId,\n providerTemplate?.providerId,\n resolved?.template.providerId,\n ]);\n\n // Opt-in, fire-and-forget outcome report to the Satya observability collector.\n // No-ops unless `reportDiagnostics` is enabled with a collector URL.\n const reportOutcome = useCallback(\n (\n outcomeProviderId: string | undefined,\n outcome: SatyaDiagnosticsOutcome,\n latencyMs?: number\n ) => {\n if (!reportDiagnostics || !diagnostics?.url || !outcomeProviderId) return;\n reportSatyaDiagnostics(diagnostics, { provider: outcomeProviderId, outcome, latencyMs });\n },\n [diagnostics, reportDiagnostics]\n );\n\n const fail = useCallback(\n (cause: unknown) => {\n const errorProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\n const nextError = asSatyaError(\n cause,\n SatyaErrorCode.UNEXPECTED,\n errorProviderId ? { providerId: errorProviderId, phase } : { phase }\n );\n if (nextError.code.startsWith('SATYA_TEE_') && !nextError.context?.teeStage) {\n asTeeError(nextError, 'configuration');\n }\n replayStartedRef.current = false;\n setRunning(false);\n satyaDebug.error('flow', 'flow failed', {\n providerId: errorProviderId,\n errorId: nextError.errorId,\n code: nextError.code,\n stage: nextError.stage,\n error: nextError.message,\n });\n setError(nextError.message);\n setErrorCode(nextError.code ?? null);\n setErrorRetryable(\n typeof nextError.context?.retryable === 'boolean' ? nextError.context.retryable : null\n );\n emitProgress({\n phase: 'failed',\n message: nextError.message,\n percent: 1,\n providerId: errorProviderId,\n error: nextError.diagnostics,\n });\n const ctx = (nextError.context ?? {}) as Record<string, unknown>;\n // The verifier's v2 envelope lands under serverCode/serverClass/\n // serverStage (satyaErrorFromEnvelope); older paths used errorCode/*.\n const verifierErrorCode = ctx.serverCode ?? ctx.errorCode;\n const verifierErrorClass = ctx.serverClass ?? ctx.errorClass;\n const verifierErrorStage = ctx.serverStage ?? ctx.errorStage;\n emitFunnel(SdkFunnelEvent.Failed, {\n providerId: errorProviderId,\n errorCode: nextError.code,\n // Raw message — scrubbed of secrets + length-capped in sdkEventLog.\n errorMessage: nextError.message,\n sdkStage: nextError.stage,\n retryable: typeof ctx.retryable === 'boolean' ? ctx.retryable : undefined,\n httpStatus: typeof ctx.status === 'number' ? ctx.status : undefined,\n ...(ctx.mode === 'tee-replay' ? teeErrorLogData(nextError) : {}),\n errorId: nextError.errorId,\n requestId: typeof ctx.requestId === 'string' ? ctx.requestId : undefined,\n verifierErrorCode: typeof verifierErrorCode === 'string' ? verifierErrorCode : undefined,\n verifierErrorClass: typeof verifierErrorClass === 'string' ? verifierErrorClass : undefined,\n verifierErrorStage: typeof verifierErrorStage === 'string' ? verifierErrorStage : undefined,\n });\n onError?.(nextError);\n reportOutcome(errorProviderId, 'failed');\n },\n [\n emitFunnel,\n emitProgress,\n onError,\n phase,\n providerId,\n providerTemplate?.providerId,\n reportOutcome,\n resolved?.template.providerId,\n ]\n );\n\n // Surface sessionId + attemptIndex on the onComplete result so host apps can\n // correlate a successful attestation with its session (the modal auto-closes\n // on success, so flow.sessionId is otherwise unreadable at that point).\n const onCompleteWithSession = useCallback(\n (result: SatyaModeAwareProviderAttestationResult) => {\n onComplete?.({\n ...result,\n sessionId: getSessionId(),\n attemptIndex: getAttemptIndex(),\n });\n },\n [getAttemptIndex, getSessionId, onComplete]\n );\n\n const { runReplay: runNativeReplay, runBundleReplay } = useNativeReplayRunner({\n // Late messages must retain their retired handle instead of selecting the shared store.\n getProviderSessionHandle: () => providerSessionHandle,\n autoCloseOnComplete,\n client,\n emitProgress,\n emitFunnel,\n getSessionId,\n fail,\n onComplete: onCompleteWithSession,\n flowAbortControllerRef,\n flowSequenceRef,\n replayStartedRef,\n reportOutcome,\n clearError,\n setModalVisible,\n setRunning,\n transportConfig,\n verifyBackend,\n });\n\n // TEE replay reuses everything above and changes only the post-capture step.\n // Selection is read from the live runtime config rather than a prop so a\n // mode set by initSatyaAttest applies without threading it through callers.\n const teeSelection = selectProviderFlow(\n {\n providerId,\n providerTemplateId: providerTemplate?.providerId,\n appId: transportConfig?.appId,\n allowTeeReplay,\n },\n getSatyaRuntimeConfig()\n );\n const [teePreparation] = useState(() => new TeeBundlePreparation());\n const teeSwapArgs: TeeReplaySwapArgs = {\n getProviderSessionHandle: () => providerSessionHandle,\n preparation: teePreparation,\n getSignal: () => flowAbortControllerRef.current?.signal,\n verifierBearerToken: transportConfig?.verifierBearerToken,\n getSessionId,\n emitFunnel,\n getAttemptElapsedMs,\n verifierUrl: transportConfig?.verifierUrl ?? '',\n appId: teeSelection.type === 'tee-replay' ? teeSelection.appId : '',\n replayServerUrl: teeSelection.type === 'tee-replay' ? teeSelection.replayServerUrl : undefined,\n rawProviderFor: (template: SatyaProviderTemplate) =>\n (template as unknown as { rawProvider?: unknown }).rawProvider ?? template,\n onOutcome: ({ verify, artifacts, template, requests }) => {\n onCompleteWithSession(\n teeAttestationResult(\n teeSelection.type === 'tee-replay' ? teeSelection.appId : '',\n getSessionId(),\n verify,\n artifacts,\n template,\n requests\n )\n );\n emitProgress({ phase: 'verified', message: 'TEE replay verified', percent: 1 });\n reportOutcome(template.providerId, 'ok');\n if (autoCloseOnComplete) setModalVisible(false);\n },\n emitProgress,\n };\n useEffect(() => () => teePreparation.cancel(), [teePreparation]);\n useEffect(() => {\n if (!modalVisible) teePreparation.cancel();\n }, [modalVisible, teePreparation]);\n const runTeeReplay = useTeeReplaySwap(teeSwapArgs);\n const runTeeReplayBundle = useTeeReplayBundleSwap(teeSwapArgs);\n\n const runReplay = useCallback(\n async (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n if (teeSelection.type !== 'tee-replay') return runNativeReplay(request, template);\n const sequence = flowSequenceRef.current;\n replayStartedRef.current = true;\n setRunning(true);\n clearError();\n try {\n await runTeeReplay(request, template);\n } catch (cause) {\n if (sequence === flowSequenceRef.current)\n fail(asSatyaError(cause, SatyaErrorCode.TEE_REPLAY_FAILED));\n } finally {\n if (sequence === flowSequenceRef.current) {\n setRunning(false);\n replayStartedRef.current = false;\n }\n }\n },\n [teeSelection.type, runNativeReplay, runTeeReplay, clearError, fail]\n );\n\n // The composite controller is wired straight to the NATIVE runner, so this\n // must dispatch on mode: without it, a provider with a composite proof plan\n // silently produced an App Attestation artifact while the caller believed it\n // was in TEE mode - the exact downgrade the `unsupported` selection exists to\n // prevent, and one that only appeared on device because Kaggle publishes a\n // proof plan.\n //\n // The verifier-issued selection commits both strict and partial completion.\n const runBundleReplayForMode = useCallback(\n async (\n orderedRequests: CapturedProviderRequest[],\n template: SatyaProviderTemplate,\n partialEndpointsAllowed: boolean\n ) => {\n if (teeSelection.type === 'tee-replay') {\n const sequence = flowSequenceRef.current;\n replayStartedRef.current = true;\n setRunning(true);\n clearError();\n try {\n const preparedRequests = orderedRequests.map((request) =>\n prepareTeeCapturedRequest(request, template, bearerRef.current)\n );\n await runTeeReplayBundle(preparedRequests, template, partialEndpointsAllowed);\n } catch (cause) {\n if (sequence === flowSequenceRef.current)\n fail(asSatyaError(cause, SatyaErrorCode.TEE_REPLAY_FAILED));\n } finally {\n if (sequence === flowSequenceRef.current) {\n setRunning(false);\n replayStartedRef.current = false;\n }\n }\n return;\n }\n await runBundleReplay(orderedRequests, template, partialEndpointsAllowed);\n },\n [clearError, fail, runBundleReplay, runTeeReplayBundle, teeSelection.type]\n );\n\n const { clearCompositeCapture, handleCompositeCaptureMessage } = useCompositeCaptureController({\n emitProgress,\n emitFunnel,\n fail,\n onRequestCaptured,\n replayStartedRef,\n resolved,\n runBundleReplay: runBundleReplayForMode,\n setCapturedRequest,\n });\n\n const unsupportedSelection = teeSelection.type === 'unsupported' ? teeSelection : undefined;\n\n const { openFlow, closeFlow } = useProviderFlowLifecycle({\n providerSession,\n sessionPolicy,\n resolveSessionPolicy,\n setProviderSessionHandle,\n startupError: unsupportedSelection\n ? satyaError(unsupportedSelection.code, unsupportedSelection.message)\n : undefined,\n onCaptureStart: (template, signal) => {\n if (teeSelection.type === 'tee-replay') {\n teePreparation.prepare(\n template,\n { ...teeSwapArgs, signal, getSignal: undefined },\n isPartialEndpointsAllowedForProvider(template.providerId)\n );\n }\n },\n providerId,\n endpointId,\n proofPlanId,\n providerTemplate,\n spkiPins,\n providerPolicyRefresh,\n transportConfig,\n verifyBackend,\n autoStart,\n disabled,\n prefetch,\n providedWebView,\n webViewUserAgent,\n debugEnabled,\n onCancel,\n emitProgress,\n beginFunnelAttempt,\n emitFunnelCancelled,\n fail,\n clearCompositeCapture,\n beginVerificationPresentation,\n endVerificationPresentation,\n renewWebViewBridgeCapability,\n resolved,\n modalVisible,\n running,\n flowAbortControllerRef,\n flowSequenceRef,\n replayStartedRef,\n htmlCaptureFetchedRef,\n pendingRequestRef,\n bearerRef,\n loggedInRef,\n loginSubmitAttemptRef,\n setRunning,\n setCapturedRequest,\n clearError,\n setResolved,\n setResolvedWebView,\n setEffectiveUserAgent,\n setWebViewUrl,\n setManagedPopup,\n setContentReady,\n setPopupContentReady,\n setPageLoading,\n setMainDocumentScriptReady,\n setPopupDocumentScriptReady,\n setModalVisible,\n setBrowserChrome,\n setPopupChrome,\n });\n\n const captureAndReplay = useCallback(\n (request: CapturedProviderRequest, template: SatyaProviderTemplate) => {\n const replayRequest =\n teeSelection.type === 'tee-replay'\n ? prepareTeeCapturedRequest(request, template, bearerRef.current)\n : 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 emitFunnel(SdkFunnelEvent.EndpointMatched, {\n providerId: template.providerId,\n endpointId: template.selectedEndpointId,\n ...endpointMatchTelemetryContext(template.proofTarget, replayRequest.url),\n method: replayRequest.method,\n });\n runReplay(replayRequest, template).catch(fail);\n },\n [emitFunnel, emitProgress, fail, onRequestCaptured, runReplay, teeSelection.type]\n );\n\n const currentProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\n\n // LOGIN_COMPLETED fires once per attempt from whichever login-done signal\n // arrives first: `__satyaReady` (via signalUserInteractionComplete) or an\n // accepted `auth.submitSignal` response. logData fields are derived and\n // PII-free (closed enums, registry-declared ids, buckets, timings).\n const emitLoginCompleted = useCallback(\n (details?: LoginCompletionDetails) => {\n emitFunnel(\n SdkFunnelEvent.LoginCompleted,\n {\n providerId: currentProviderId,\n loginSignalSource: details?.source ?? 'satyaReady',\n loginSignalId: details?.signalId,\n submitStatusClass: details?.submitStatusClass,\n loginBodyMatched: details?.bodyMatched,\n loginLatencyMs: getAttemptElapsedMs(),\n captureMode: resolved?.template.selectedProofPlan ? 'composite' : 'single',\n },\n { oncePerAttempt: true }\n );\n },\n [currentProviderId, emitFunnel, getAttemptElapsedMs, resolved?.template.selectedProofPlan]\n );\n\n const {\n closeManagedPopup,\n navigateOpenerFromPopup,\n openManagedPopup,\n relayOpenerToPopupMessage,\n relayOpenerToPopupPortMessage,\n relayPopupPortMessage,\n relayPopupPostMessage,\n } = useManagedPopupController({\n emitProgress,\n managedPopup,\n popupChromeUrl: popupChrome.url,\n popupRef,\n providerId: currentProviderId,\n setBrowserChrome,\n setManagedPopup,\n setPopupChrome,\n setPopupContentReady,\n setPopupDocumentScriptReady,\n setWebViewUrl,\n webRef,\n });\n\n const handleHardwareBack = useCallback(() => {\n if (managedPopup) {\n closeManagedPopup();\n return;\n }\n closeFlow(true);\n }, [closeFlow, closeManagedPopup, managedPopup]);\n\n const edgeSwipeHandlers = useEdgeSwipeBack(handleHardwareBack);\n\n const handleModalRequestClose = useCallback(() => {\n // iOS sheet swipe-dismiss is native, so cancel the whole flow; Android back\n // pops an open popup first.\n if (Platform.OS === 'ios') {\n closeFlow(true);\n return;\n }\n handleHardwareBack();\n }, [closeFlow, handleHardwareBack]);\n\n const markContentReady = useCallback(() => setContentReady(true), []);\n const markPopupContentReady = useCallback(() => setPopupContentReady(true), []);\n const markLoadStart = useCallback(() => setPageLoading(true), []);\n const markLoadEnd = useCallback(() => setPageLoading(false), []);\n\n const handleReload = useCallback(() => {\n if (capturedRequest || verificationPresentation.covered) return;\n setPageLoading(true);\n webRef.current?.reload?.();\n }, [capturedRequest, verificationPresentation.covered]);\n\n const signalUserInteractionComplete = useCallback(\n (loginDetails?: LoginCompletionDetails) => {\n loginSubmitAttemptRef.current = null;\n // The message handler invokes this when `__satyaReady` arrives (which\n // also triggers the post-login cover below) — the LOGIN_COMPLETED site.\n emitLoginCompleted(loginDetails);\n // Native Android popup WebViews sit above React. Queue their concealment\n // before scheduling the React cover so no popup remains visibly on top.\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(true)\n .then(async (concealed) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (concealed) return;\n // Older/failing native binaries cannot hide a popup in place. Only\n // close popups after confirming this is still the originating flow.\n const closed = await closeNativePopupWindowsFailClosed();\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n // Closing one popup is not a persistent concealment mechanism: the\n // background page could open another. End this unsupported attempt\n // regardless of the close result.\n if (!closed) satyaDebug.warn('webview', 'could not close native popup windows');\n closeFlow(true);\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) closeFlow(true);\n });\n verificationPresentation.signalUserInteractionComplete();\n },\n [\n closeFlow,\n emitLoginCompleted,\n setNativePopupWindowsConcealed,\n verificationPresentation.signalUserInteractionComplete,\n ]\n );\n\n const pendingConcealedRef = useRef(false);\n // Native popup concealment is asynchronous. Keep correlation outside React\n // state so a response/navigation that arrives before concealment completes\n // can still promote the eventual provisional cover to the accepted window.\n const loginSubmitArmRef = useRef(0);\n const loginSubmitConcealSequenceRef = useRef<number | null>(null);\n const loginSubmitAcceptedSequenceRef = useRef<number | null>(null);\n const presentationStateRef = useRef(verificationPresentation.state);\n const presentationState = verificationPresentation.state;\n // Bridge callbacks may run before passive effects. A layout effect updates\n // the guard as part of the commit, before native events can deliver a retry.\n useLayoutEffect(() => {\n presentationStateRef.current = presentationState;\n }, [presentationState]);\n\n // The pre-emptive cover is a guess about what the user just did, so unlike\n // the confirmed cover it must degrade instead of failing closed: if native\n // popups cannot be concealed we simply do not cover, leaving today's\n // behavior. Ending a flow the user has not yet completed would be worse than\n // briefly showing the page we were trying to hide.\n const signalLoginSubmitted = useCallback(\n (signal: SatyaProviderLoginSubmitSignal): boolean => {\n // Only an uncovered provider view can be pre-emptively covered. Without\n // this guard a late signal — after the user returned to the provider, or\n // once the confirmed cover owns the screen — would still conceal Android\n // popups while the reducer refuses to cover, hiding them behind a visible\n // page. Also collapse duplicate bridge/navigation signals while native\n // concealment for this flow is in flight.\n if (presentationStateRef.current !== 'provider') return false;\n const flowSequence = flowSequenceRef.current;\n if (loginSubmitConcealSequenceRef.current === flowSequence) return false;\n loginSubmitConcealSequenceRef.current = flowSequence;\n loginSubmitAcceptedSequenceRef.current = null;\n const arm = ++loginSubmitArmRef.current;\n setNativePopupWindowsConcealed(true)\n .then((concealed) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n loginSubmitConcealSequenceRef.current = null;\n if (loginSubmitArmRef.current !== arm) {\n if (concealed) {\n setNativePopupWindowsConcealed(false).catch(() => {\n satyaDebug.warn('webview', 'could not restore native popup visibility');\n });\n }\n return;\n }\n if (!concealed) {\n loginSubmitAttemptRef.current = null;\n satyaDebug.warn('webview', 'skipping pre-emptive login cover: popups not concealable');\n return;\n }\n verificationPresentation.signalLoginSubmitted(signal.timeoutMs);\n if (loginSubmitAcceptedSequenceRef.current === flowSequence) {\n verificationPresentation.signalLoginSubmitAccepted();\n }\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) {\n loginSubmitConcealSequenceRef.current = null;\n loginSubmitAttemptRef.current = null;\n }\n satyaDebug.warn('webview', 'skipping pre-emptive login cover: conceal call failed');\n });\n return true;\n },\n [\n setNativePopupWindowsConcealed,\n verificationPresentation.signalLoginSubmitAccepted,\n verificationPresentation.signalLoginSubmitted,\n ]\n );\n\n const signalLoginSubmitAccepted = useCallback(\n (loginDetails?: LoginCompletionDetails) => {\n const flowSequence = flowSequenceRef.current;\n loginSubmitAcceptedSequenceRef.current = flowSequence;\n if (presentationStateRef.current === 'pendingLogin') {\n verificationPresentation.signalLoginSubmitAccepted();\n }\n emitLoginCompleted(loginDetails ?? { source: 'submitSignal' });\n },\n [emitLoginCompleted, verificationPresentation.signalLoginSubmitAccepted]\n );\n\n const signalLoginSubmitRejected = useCallback(() => {\n loginSubmitAttemptRef.current = null;\n loginSubmitAcceptedSequenceRef.current = null;\n loginSubmitConcealSequenceRef.current = null;\n loginSubmitArmRef.current += 1;\n presentationStateRef.current = 'provider';\n verificationPresentation.signalLoginSubmitRejected();\n }, [verificationPresentation.signalLoginSubmitRejected]);\n\n // Navigation while the provisional cover is up means the submission is still\n // resolving — a rejected login re-renders the form in place instead. Holding\n // here stops the cover lapsing mid-redirect and flashing the destination. A\n // navigation may race the asynchronous native concealment, so remember it as\n // accepted even before the React presentation reaches pendingLogin.\n const signalLoginNavigation = useCallback(() => {\n const flowSequence = flowSequenceRef.current;\n if (\n presentationStateRef.current !== 'pendingLogin' &&\n loginSubmitConcealSequenceRef.current !== flowSequence\n ) {\n return;\n }\n loginSubmitAcceptedSequenceRef.current = flowSequence;\n if (presentationStateRef.current === 'pendingLogin') {\n verificationPresentation.extendLoginSubmitPending();\n }\n }, [verificationPresentation.extendLoginSubmitPending]);\n\n // Restoring popups is driven off the state itself rather than the reject\n // callback, because the provisional cover also lapses on its own timer\n // inside the presentation hook. Both routes land back on 'provider'.\n useEffect(() => {\n if (presentationState === 'pendingLogin') {\n pendingConcealedRef.current = true;\n return;\n }\n if (!pendingConcealedRef.current) return;\n pendingConcealedRef.current = false;\n loginSubmitAttemptRef.current = null;\n // A promotion to the confirmed cover must keep popups concealed.\n if (presentationState !== 'provider') return;\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(false)\n .then((restored) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (!restored) satyaDebug.warn('webview', 'could not restore concealed native popups');\n })\n .catch(() => {});\n }, [presentationState, setNativePopupWindowsConcealed]);\n\n const returnToProvider = useCallback(() => {\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(false)\n .then((restored) => {\n if (!isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (restored) {\n verificationPresentation.returnToProvider();\n } else {\n satyaDebug.warn('webview', 'could not restore concealed native popup windows');\n closeFlow(true);\n }\n })\n .catch(() => {\n if (isCurrentPresentationFlow(flowSequenceRef, flowSequence)) closeFlow(true);\n });\n }, [closeFlow, setNativePopupWindowsConcealed, verificationPresentation.returnToProvider]);\n\n const handleMessage = useProviderMessageHandler({\n bearerRef,\n captureAndReplay,\n closeManagedPopup,\n loggedInRef,\n loginSubmitAttemptRef,\n onLoginSubmitted: signalLoginSubmitted,\n onLoginSubmitAccepted: signalLoginSubmitAccepted,\n onLoginSubmitRejected: signalLoginSubmitRejected,\n onUserInteractionComplete: signalUserInteractionComplete,\n onCompositeCaptureMessage: handleCompositeCaptureMessage,\n navigateOpenerFromPopup,\n openManagedPopup,\n pendingRequestRef,\n relayOpenerToPopupMessage,\n relayOpenerToPopupPortMessage,\n relayPopupPortMessage,\n relayPopupPostMessage,\n replayStartedRef,\n resolved,\n bridgeCapability: webViewBridgeCapability,\n webViewProps,\n });\n\n const {\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n } = useProviderNavigationHandlers({\n emitProgress,\n managedPopup,\n onLoginNavigation: signalLoginNavigation,\n onLoginSubmitted: signalLoginSubmitted,\n openManagedPopup,\n providerId,\n providerTemplate,\n resolved,\n setBrowserChrome,\n setPopupChrome,\n setWebViewUrl,\n webRef,\n webViewProps,\n webViewUrl,\n });\n\n const maybeTriggerHtmlCapture = useHtmlCaptureTrigger({\n resolved,\n replayStartedRef,\n htmlCaptureFetchedRef,\n webRef,\n });\n\n const { mainInjectedScript, popupInjectedScript, useNativePopups } = useProviderInjectedScripts({\n providerSessionHandle,\n onSessionPreparationFailure: fail,\n bridgeCapability: webViewBridgeCapability,\n modalVisible,\n ResolvedWebView,\n resolved,\n managedPopup,\n debugEnabled,\n webHostRef,\n popupHostRef,\n setMainDocumentScriptReady,\n setPopupDocumentScriptReady,\n });\n\n const title =\n modalTitle ?? (resolved ? providerDisplayName(resolved.template) : 'Provider Attestation');\n const isProcessing = !!capturedRequest && !error;\n const isVerificationCovered = shouldConcealProviderContent(verificationPresentation.state, {\n captured: !!capturedRequest,\n error: !!error,\n });\n const preparing = modalVisible && !resolved && !error;\n const nativePopupConcealmentRequired = isVerificationCovered || !!error;\n useEffect(() => {\n // Before provider resolution there cannot be a provider-owned popup, so do\n // not treat an older native binary as a terminal concealment failure yet.\n if (!modalVisible || !resolved) return;\n let cancelled = false;\n const flowSequence = flowSequenceRef.current;\n setNativePopupWindowsConcealed(nativePopupConcealmentRequired)\n .then(async (concealed) => {\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n if (concealed) return;\n if (nativePopupConcealmentRequired) {\n await closeNativePopupWindowsFailClosed();\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n }\n closeFlow(true);\n })\n .catch(() => {\n if (cancelled || !isCurrentPresentationFlow(flowSequenceRef, flowSequence)) return;\n closeFlow(true);\n });\n return () => {\n cancelled = true;\n };\n }, [\n closeFlow,\n closeNativePopupWindowsFailClosed,\n modalVisible,\n nativePopupConcealmentRequired,\n resolved,\n setNativePopupWindowsConcealed,\n ]);\n // Browser-style loading line: tracks a document's load-start→load-end, not\n // attestation. Suppressed while the verification cover conceals the page so\n // background navigations don't telegraph through the chrome.\n const webViewLoading =\n !!resolved && !error && !isProcessing && !isVerificationCovered && pageLoading;\n const theme = resolveTheme(themeProp);\n const currentUrl = browserChrome.url || webViewUrl || '';\n const secureHost = hostFromUrl(currentUrl);\n const secureConnection = isSecureUrl(currentUrl);\n return {\n providerSessionHandle,\n buttonLabel,\n capturedRequest,\n closeFlow,\n closeManagedPopup,\n contentReady,\n disabled,\n edgeSwipeHandlers,\n effectiveUserAgent,\n error,\n errorCode,\n errorRetryable,\n handleHardwareBack,\n handleMessage,\n handleModalRequestClose,\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n handleReload,\n isProcessing,\n isVerificationCovered,\n mainDocumentScriptReady,\n mainInjectedScript,\n managedPopup,\n markContentReady,\n markLoadEnd,\n markLoadStart,\n markPopupContentReady,\n maybeTriggerHtmlCapture,\n modalVisible,\n openFlow,\n phase,\n sessionId: getSessionId(),\n attemptIndex: getAttemptIndex(),\n onCopySessionId,\n popupContentReady,\n popupDocumentScriptReady,\n popupHostRef,\n popupInjectedScript,\n popupRef,\n prefetch,\n preparing,\n presentation,\n resolved,\n ResolvedWebView,\n running,\n secureConnection,\n secureHost,\n webViewLoading,\n setBrowserChrome,\n setPopupChrome,\n theme,\n title,\n useNativePopups,\n webHostRef,\n webRef,\n webViewProps,\n webViewUrl,\n returnToProvider,\n verificationPresentationPending: verificationPresentation.pending,\n verificationPresentationStalled: verificationPresentation.stalled,\n };\n}\n\nexport type ProviderAttestFlow = Omit<\n ReturnType<typeof useProviderAttestFlow>,\n 'markLoadStart' | 'markLoadEnd'\n> & {\n markLoadStart: (url?: string) => void;\n markLoadEnd: (url?: string) => void;\n isTeelsFlow?: boolean;\n handleContentProcessDidTerminate?: (event: unknown) => void;\n handleRenderProcessGone?: (event: unknown) => void;\n handleWebViewError?: (event: unknown) => void;\n handleWebViewHttpError?: (event: unknown) => void;\n};\n"]}
@@ -6,7 +6,6 @@ import type { ProviderPopupMessage } from '../../webview';
6
6
  interface ProviderNavigationHandlersOptions {
7
7
  emitProgress: (progress: SatyaProviderFlowProgress) => void;
8
8
  managedPopup: ManagedPopupState | null;
9
- navigateOpenerFromPopup: (popup: ProviderPopupMessage) => void;
10
9
  onLoginNavigation: () => void;
11
10
  onLoginSubmitted: (signal: SatyaProviderLoginSubmitSignal) => boolean;
12
11
  openManagedPopup: (popup: ProviderPopupMessage, message?: string) => void;
@@ -20,7 +19,7 @@ interface ProviderNavigationHandlersOptions {
20
19
  webViewProps?: Record<string, unknown>;
21
20
  webViewUrl: string | null;
22
21
  }
23
- export declare function useProviderNavigationHandlers({ emitProgress, managedPopup, navigateOpenerFromPopup, onLoginNavigation, onLoginSubmitted, openManagedPopup, providerId, providerTemplate, resolved, setBrowserChrome, setPopupChrome, setWebViewUrl, webRef, webViewProps, webViewUrl, }: ProviderNavigationHandlersOptions): {
22
+ export declare function useProviderNavigationHandlers({ emitProgress, managedPopup, onLoginNavigation, onLoginSubmitted, openManagedPopup, providerId, providerTemplate, resolved, setBrowserChrome, setPopupChrome, setWebViewUrl, webRef, webViewProps, webViewUrl, }: ProviderNavigationHandlersOptions): {
24
23
  handleNavigationStateChange: (event: unknown) => void;
25
24
  handleOpenWindow: (event: WebViewNavigationEventLike) => void;
26
25
  handlePopupNavigationStateChange: (event: unknown) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useProviderNavigationHandlers.d.ts","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderNavigationHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AAIf,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,0BAA0B,EAC1B,cAAc,EACd,iCAAiC,EAClC,MAAM,SAAS,CAAC;AAcjB,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,UAAU,iCAAiC;IACzC,YAAY,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC5D,YAAY,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvC,uBAAuB,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/D,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,gBAAgB,EAAE,CAAC,MAAM,EAAE,8BAA8B,KAAK,OAAO,CAAC;IACtE,gBAAgB,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/D,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC7D,aAAa,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACvD,MAAM,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,YAAY,EACZ,YAAY,EACZ,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,MAAM,EACN,YAAY,EACZ,UAAU,GACX,EAAE,iCAAiC;yCAiJxB,OAAO;8BAhHP,0BAA0B;8CAoK1B,OAAO;mCAlHP,0BAA0B;qDAexB,iCAAiC;gDA/CjC,iCAAiC;EAkM9C"}
1
+ {"version":3,"file":"useProviderNavigationHandlers.d.ts","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderNavigationHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AAIf,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,0BAA0B,EAC1B,cAAc,EACd,iCAAiC,EAClC,MAAM,SAAS,CAAC;AAajB,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,UAAU,iCAAiC;IACzC,YAAY,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC5D,YAAY,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,gBAAgB,EAAE,CAAC,MAAM,EAAE,8BAA8B,KAAK,OAAO,CAAC;IACtE,gBAAgB,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/D,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC7D,aAAa,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACvD,MAAM,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,MAAM,EACN,YAAY,EACZ,UAAU,GACX,EAAE,iCAAiC;yCAiJxB,OAAO;8BAhHP,0BAA0B;8CAoK1B,OAAO;mCAlHP,0BAA0B;qDAexB,iCAAiC;gDA/CjC,iCAAiC;EA4K9C"}
@@ -2,10 +2,10 @@ import { useCallback, useEffect, useRef, } from 'react';
2
2
  import { WEBVIEW_BOOTSTRAP_URL } from './constants';
3
3
  import { loginSubmitSignalsFrom, matchingLoginSubmitNavigationSignal } from './loginSubmitDetector';
4
4
  import { providerLoginUrl } from './providerResolution';
5
- import { isLoadableDocumentUrl, isWebViewSafeUrl, originFromUrl, parseIntentBrowserFallbackUrl, schemeLabel, } from './urlUtils';
5
+ import { isLoadableDocumentUrl, isWebViewSafeUrl, parseIntentBrowserFallbackUrl, schemeLabel, } from './urlUtils';
6
6
  import { invokeShouldStartLoadWithRequest, invokeWebViewCallback, readBrowserChromeState, } from './webviewRuntime';
7
7
  import { satyaDebug, summarizeResponse } from '../../debugLog';
8
- export function useProviderNavigationHandlers({ emitProgress, managedPopup, navigateOpenerFromPopup, onLoginNavigation, onLoginSubmitted, openManagedPopup, providerId, providerTemplate, resolved, setBrowserChrome, setPopupChrome, setWebViewUrl, webRef, webViewProps, webViewUrl, }) {
8
+ export function useProviderNavigationHandlers({ emitProgress, managedPopup, onLoginNavigation, onLoginSubmitted, openManagedPopup, providerId, providerTemplate, resolved, setBrowserChrome, setPopupChrome, setWebViewUrl, webRef, webViewProps, webViewUrl, }) {
9
9
  const lastMainNavigationRef = useRef(null);
10
10
  const lastMainDocumentUrlRef = useRef(null);
11
11
  useEffect(() => {
@@ -176,28 +176,10 @@ export function useProviderNavigationHandlers({ emitProgress, managedPopup, navi
176
176
  });
177
177
  }
178
178
  setPopupChrome((current) => ({ ...current, ...nextChrome }));
179
- const url = nextChrome.url;
180
- if (!url || !managedPopup)
181
- return;
182
- const openerOrigin = originFromUrl(managedPopup.sourceUrl ??
183
- lastMainDocumentUrlRef.current ??
184
- webViewUrl ??
185
- (resolved ? providerLoginUrl(resolved.template) : null));
186
- const initialPopupOrigin = originFromUrl(managedPopup.url);
187
- const currentPopupOrigin = originFromUrl(url);
188
- if (openerOrigin &&
189
- currentPopupOrigin &&
190
- currentPopupOrigin === openerOrigin &&
191
- initialPopupOrigin &&
192
- initialPopupOrigin !== openerOrigin) {
193
- navigateOpenerFromPopup({
194
- url,
195
- target: managedPopup.target ?? null,
196
- sourceUrl: managedPopup.url ?? null,
197
- reason: 'popupReturnedToOpenerOrigin',
198
- });
199
- }
200
- }, [managedPopup, navigateOpenerFromPopup, resolved, setPopupChrome, webViewProps, webViewUrl]);
179
+ // OAuth callbacks must finish in their popup and notify the original
180
+ // opener. Returning to its origin alone must not close or replay them.
181
+ // Explicit opener navigation, postMessage and close use the popup bridge.
182
+ }, [setPopupChrome, webViewProps]);
201
183
  return {
202
184
  handleNavigationStateChange,
203
185
  handleOpenWindow,
@@ -1 +1 @@
1
- {"version":3,"file":"useProviderNavigationHandlers.js","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderNavigationHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n type Dispatch,\n type RefObject,\n type SetStateAction,\n} from 'react';\n\nimport { WEBVIEW_BOOTSTRAP_URL } from './constants';\nimport { loginSubmitSignalsFrom, matchingLoginSubmitNavigationSignal } from './loginSubmitDetector';\nimport { providerLoginUrl, type ResolvedProvider } from './providerResolution';\nimport type {\n BrowserChromeState,\n ManagedPopupState,\n SatyaProviderFlowProgress,\n WebViewNavigationEventLike,\n WebViewRefLike,\n WebViewShouldStartLoadRequestLike,\n} from './types';\nimport {\n isLoadableDocumentUrl,\n isWebViewSafeUrl,\n originFromUrl,\n parseIntentBrowserFallbackUrl,\n schemeLabel,\n} from './urlUtils';\nimport {\n invokeShouldStartLoadWithRequest,\n invokeWebViewCallback,\n readBrowserChromeState,\n} from './webviewRuntime';\nimport { satyaDebug, summarizeResponse } from '../../debugLog';\nimport type { SatyaProviderLoginSubmitSignal, SatyaProviderTemplate } from '../../types';\nimport type { ProviderPopupMessage } from '../../webview';\n\ninterface ProviderNavigationHandlersOptions {\n emitProgress: (progress: SatyaProviderFlowProgress) => void;\n managedPopup: ManagedPopupState | null;\n navigateOpenerFromPopup: (popup: ProviderPopupMessage) => void;\n onLoginNavigation: () => void;\n onLoginSubmitted: (signal: SatyaProviderLoginSubmitSignal) => boolean;\n openManagedPopup: (popup: ProviderPopupMessage, message?: string) => void;\n providerId?: string;\n providerTemplate?: SatyaProviderTemplate;\n resolved: ResolvedProvider | null;\n setBrowserChrome: Dispatch<SetStateAction<BrowserChromeState>>;\n setPopupChrome: Dispatch<SetStateAction<BrowserChromeState>>;\n setWebViewUrl: Dispatch<SetStateAction<string | null>>;\n webRef: RefObject<WebViewRefLike | null>;\n webViewProps?: Record<string, unknown>;\n webViewUrl: string | null;\n}\n\nexport function useProviderNavigationHandlers({\n emitProgress,\n managedPopup,\n navigateOpenerFromPopup,\n onLoginNavigation,\n onLoginSubmitted,\n openManagedPopup,\n providerId,\n providerTemplate,\n resolved,\n setBrowserChrome,\n setPopupChrome,\n setWebViewUrl,\n webRef,\n webViewProps,\n webViewUrl,\n}: ProviderNavigationHandlersOptions) {\n const lastMainNavigationRef = useRef<{ loading: boolean; url: string } | null>(null);\n const lastMainDocumentUrlRef = useRef<string | null>(null);\n useEffect(() => {\n lastMainNavigationRef.current = null;\n lastMainDocumentUrlRef.current = null;\n }, [resolved]);\n\n const progressProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\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: progressProviderId,\n });\n webRef.current?.injectJavaScript?.(\n `try { window.location.assign(${JSON.stringify(url)}); } catch (_) {} true;`\n );\n },\n [emitProgress, progressProviderId, setBrowserChrome, setWebViewUrl, webRef]\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:\n lastMainDocumentUrlRef.current ??\n webViewUrl ??\n (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: progressProviderId,\n });\n }\n return false;\n },\n [emitProgress, loadInCurrentWebView, progressProviderId, webViewProps]\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: progressProviderId,\n });\n }\n return false;\n },\n [\n emitProgress,\n managedPopup?.target,\n managedPopup?.url,\n openManagedPopup,\n progressProviderId,\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: summarizeResponse({ url: nextChrome.url }).url,\n title: nextChrome.title,\n loading: nextChrome.loading,\n });\n }\n setBrowserChrome((current) => ({ ...current, ...nextChrome }));\n // Navigation events describe a load the native WebView already owns.\n // Writing them back to source can reload an intermediate OAuth URL after\n // the browser has redirected ahead, replaying a one-time handoff token.\n // Keep source for explicit navigation and update only observed state here.\n if (nextChrome.url && isLoadableDocumentUrl(nextChrome.url)) {\n lastMainDocumentUrlRef.current = nextChrome.url;\n }\n const previousNavigation = lastMainNavigationRef.current;\n const isDistinctNavigation =\n !!nextChrome.url &&\n (previousNavigation?.url !== nextChrome.url ||\n (nextChrome.loading === true && previousNavigation?.loading !== true));\n if (nextChrome.url) {\n lastMainNavigationRef.current = {\n loading: nextChrome.loading === true,\n url: nextChrome.url,\n };\n }\n // Form-POST logins never reach the fetch/XHR interceptor, so a navigation\n // to a configured post-login URL is the only pre-emptive cover signal.\n // Presentation-only: it does not gate capture.\n const loginSubmitSignal = matchingLoginSubmitNavigationSignal(\n loginSubmitSignalsFrom(resolved?.template),\n nextChrome.url\n );\n if (loginSubmitSignal && isDistinctNavigation) {\n satyaDebug.info('webview', 'login submit navigation matched — covering provider', {\n signalId: loginSubmitSignal.id,\n url: summarizeResponse({ url: nextChrome.url }).url,\n });\n onLoginSubmitted(loginSubmitSignal);\n }\n // Any main-frame navigation holds an existing provisional cover open; the\n // callback no-ops unless one is up.\n if (isDistinctNavigation) onLoginNavigation();\n },\n [onLoginNavigation, onLoginSubmitted, resolved, setBrowserChrome, 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: summarizeResponse({ url: nextChrome.url }).url,\n loading: nextChrome.loading,\n });\n }\n setPopupChrome((current) => ({ ...current, ...nextChrome }));\n\n const url = nextChrome.url;\n if (!url || !managedPopup) return;\n const openerOrigin = originFromUrl(\n managedPopup.sourceUrl ??\n lastMainDocumentUrlRef.current ??\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, setPopupChrome, webViewProps, webViewUrl]\n );\n\n return {\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n };\n}\n"]}
1
+ {"version":3,"file":"useProviderNavigationHandlers.js","sourceRoot":"","sources":["../../../src/components/providerAttest/useProviderNavigationHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n type Dispatch,\n type RefObject,\n type SetStateAction,\n} from 'react';\n\nimport { WEBVIEW_BOOTSTRAP_URL } from './constants';\nimport { loginSubmitSignalsFrom, matchingLoginSubmitNavigationSignal } from './loginSubmitDetector';\nimport { providerLoginUrl, type ResolvedProvider } from './providerResolution';\nimport type {\n BrowserChromeState,\n ManagedPopupState,\n SatyaProviderFlowProgress,\n WebViewNavigationEventLike,\n WebViewRefLike,\n WebViewShouldStartLoadRequestLike,\n} from './types';\nimport {\n isLoadableDocumentUrl,\n isWebViewSafeUrl,\n parseIntentBrowserFallbackUrl,\n schemeLabel,\n} from './urlUtils';\nimport {\n invokeShouldStartLoadWithRequest,\n invokeWebViewCallback,\n readBrowserChromeState,\n} from './webviewRuntime';\nimport { satyaDebug, summarizeResponse } from '../../debugLog';\nimport type { SatyaProviderLoginSubmitSignal, SatyaProviderTemplate } from '../../types';\nimport type { ProviderPopupMessage } from '../../webview';\n\ninterface ProviderNavigationHandlersOptions {\n emitProgress: (progress: SatyaProviderFlowProgress) => void;\n managedPopup: ManagedPopupState | null;\n onLoginNavigation: () => void;\n onLoginSubmitted: (signal: SatyaProviderLoginSubmitSignal) => boolean;\n openManagedPopup: (popup: ProviderPopupMessage, message?: string) => void;\n providerId?: string;\n providerTemplate?: SatyaProviderTemplate;\n resolved: ResolvedProvider | null;\n setBrowserChrome: Dispatch<SetStateAction<BrowserChromeState>>;\n setPopupChrome: Dispatch<SetStateAction<BrowserChromeState>>;\n setWebViewUrl: Dispatch<SetStateAction<string | null>>;\n webRef: RefObject<WebViewRefLike | null>;\n webViewProps?: Record<string, unknown>;\n webViewUrl: string | null;\n}\n\nexport function useProviderNavigationHandlers({\n emitProgress,\n managedPopup,\n onLoginNavigation,\n onLoginSubmitted,\n openManagedPopup,\n providerId,\n providerTemplate,\n resolved,\n setBrowserChrome,\n setPopupChrome,\n setWebViewUrl,\n webRef,\n webViewProps,\n webViewUrl,\n}: ProviderNavigationHandlersOptions) {\n const lastMainNavigationRef = useRef<{ loading: boolean; url: string } | null>(null);\n const lastMainDocumentUrlRef = useRef<string | null>(null);\n useEffect(() => {\n lastMainNavigationRef.current = null;\n lastMainDocumentUrlRef.current = null;\n }, [resolved]);\n\n const progressProviderId =\n resolved?.template.providerId ?? providerId ?? providerTemplate?.providerId;\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: progressProviderId,\n });\n webRef.current?.injectJavaScript?.(\n `try { window.location.assign(${JSON.stringify(url)}); } catch (_) {} true;`\n );\n },\n [emitProgress, progressProviderId, setBrowserChrome, setWebViewUrl, webRef]\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:\n lastMainDocumentUrlRef.current ??\n webViewUrl ??\n (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: progressProviderId,\n });\n }\n return false;\n },\n [emitProgress, loadInCurrentWebView, progressProviderId, webViewProps]\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: progressProviderId,\n });\n }\n return false;\n },\n [\n emitProgress,\n managedPopup?.target,\n managedPopup?.url,\n openManagedPopup,\n progressProviderId,\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: summarizeResponse({ url: nextChrome.url }).url,\n title: nextChrome.title,\n loading: nextChrome.loading,\n });\n }\n setBrowserChrome((current) => ({ ...current, ...nextChrome }));\n // Navigation events describe a load the native WebView already owns.\n // Writing them back to source can reload an intermediate OAuth URL after\n // the browser has redirected ahead, replaying a one-time handoff token.\n // Keep source for explicit navigation and update only observed state here.\n if (nextChrome.url && isLoadableDocumentUrl(nextChrome.url)) {\n lastMainDocumentUrlRef.current = nextChrome.url;\n }\n const previousNavigation = lastMainNavigationRef.current;\n const isDistinctNavigation =\n !!nextChrome.url &&\n (previousNavigation?.url !== nextChrome.url ||\n (nextChrome.loading === true && previousNavigation?.loading !== true));\n if (nextChrome.url) {\n lastMainNavigationRef.current = {\n loading: nextChrome.loading === true,\n url: nextChrome.url,\n };\n }\n // Form-POST logins never reach the fetch/XHR interceptor, so a navigation\n // to a configured post-login URL is the only pre-emptive cover signal.\n // Presentation-only: it does not gate capture.\n const loginSubmitSignal = matchingLoginSubmitNavigationSignal(\n loginSubmitSignalsFrom(resolved?.template),\n nextChrome.url\n );\n if (loginSubmitSignal && isDistinctNavigation) {\n satyaDebug.info('webview', 'login submit navigation matched — covering provider', {\n signalId: loginSubmitSignal.id,\n url: summarizeResponse({ url: nextChrome.url }).url,\n });\n onLoginSubmitted(loginSubmitSignal);\n }\n // Any main-frame navigation holds an existing provisional cover open; the\n // callback no-ops unless one is up.\n if (isDistinctNavigation) onLoginNavigation();\n },\n [onLoginNavigation, onLoginSubmitted, resolved, setBrowserChrome, 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: summarizeResponse({ url: nextChrome.url }).url,\n loading: nextChrome.loading,\n });\n }\n setPopupChrome((current) => ({ ...current, ...nextChrome }));\n // OAuth callbacks must finish in their popup and notify the original\n // opener. Returning to its origin alone must not close or replay them.\n // Explicit opener navigation, postMessage and close use the popup bridge.\n },\n [setPopupChrome, webViewProps]\n );\n\n return {\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n };\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  export declare const EXPO_SATYA_ATTEST_SDK_NAME: "@burnt-labs/expo-satya-attest";
2
- export declare const EXPO_SATYA_ATTEST_SDK_VERSION: "3.10.1";
2
+ export declare const EXPO_SATYA_ATTEST_SDK_VERSION: "3.10.2";
3
3
  //# sourceMappingURL=sdkMetadata.generated.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Generated by internal/module_scripts/sync-sdk-metadata.js.
2
2
  export const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest';
3
- export const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.1';
3
+ export const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.2';
4
4
  //# sourceMappingURL=sdkMetadata.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdkMetadata.generated.js","sourceRoot":"","sources":["../src/sdkMetadata.generated.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,+BAAwC,CAAC;AACnF,MAAM,CAAC,MAAM,6BAA6B,GAAG,QAAiB,CAAC","sourcesContent":["// Generated by internal/module_scripts/sync-sdk-metadata.js.\nexport const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest' as const;\nexport const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.1' as const;\n"]}
1
+ {"version":3,"file":"sdkMetadata.generated.js","sourceRoot":"","sources":["../src/sdkMetadata.generated.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,+BAAwC,CAAC;AACnF,MAAM,CAAC,MAAM,6BAA6B,GAAG,QAAiB,CAAC","sourcesContent":["// Generated by internal/module_scripts/sync-sdk-metadata.js.\nexport const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest' as const;\nexport const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.2' as const;\n"]}
@@ -107,6 +107,6 @@ export interface TeeSubmissionEnvelope {
107
107
  sdkSessionId?: string;
108
108
  }
109
109
  export declare function teeSubmissionEnvelope(appId: string, artifacts: readonly string[], sdkSessionId?: string, schemaVersion?: '3.0.0' | '3.1.0'): TeeSubmissionEnvelope;
110
- export declare const SDK_VERSION: "3.10.1";
110
+ export declare const SDK_VERSION: "3.10.2";
111
111
  export type { SatyaTeeSessionContext };
112
112
  //# sourceMappingURL=client.d.ts.map
@@ -10,15 +10,18 @@
10
10
  <key>HeadersPath</key>
11
11
  <string>Headers</string>
12
12
  <key>LibraryIdentifier</key>
13
- <string>ios-arm64</string>
13
+ <string>ios-arm64_x86_64-simulator</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>
19
20
  </array>
20
21
  <key>SupportedPlatform</key>
21
22
  <string>ios</string>
23
+ <key>SupportedPlatformVariant</key>
24
+ <string>simulator</string>
22
25
  </dict>
23
26
  <dict>
24
27
  <key>BinaryPath</key>
@@ -26,18 +29,15 @@
26
29
  <key>HeadersPath</key>
27
30
  <string>Headers</string>
28
31
  <key>LibraryIdentifier</key>
29
- <string>ios-arm64_x86_64-simulator</string>
32
+ <string>ios-arm64</string>
30
33
  <key>LibraryPath</key>
31
34
  <string>libsatya_ffi.a</string>
32
35
  <key>SupportedArchitectures</key>
33
36
  <array>
34
37
  <string>arm64</string>
35
- <string>x86_64</string>
36
38
  </array>
37
39
  <key>SupportedPlatform</key>
38
40
  <string>ios</string>
39
- <key>SupportedPlatformVariant</key>
40
- <string>simulator</string>
41
41
  </dict>
42
42
  </array>
43
43
  <key>CFBundlePackageType</key>
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/ios/Frameworks/libsatya_ffi-rs.xcframework/ios-arm64/libsatya_ffi.a
3
3
  size: 35999664 bytes
4
- sha256: d594d00d6ae7cb70c0288196178efe7334337e37794a22c14f06f962dcb98897
4
+ sha256: e93ba4440ffdbc5df5c66d3d8e574ded9bd56ef1fbe055a83d2cc601cd1b4f7e
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/ios/Frameworks/libsatya_ffi-rs.xcframework/ios-arm64_x86_64-simulator/libsatya_ffi.a
3
3
  size: 71319040 bytes
4
- sha256: 40c5fa827123e3685e08ca948966531b7f26ac1c06cbd0b42bfb95cdb32b4c2c
4
+ sha256: 0ccfd781eb08494d3c6ca74135576f31acc028a71748fbea0f8cec114f38e2b7
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |s|
2
2
  s.name = 'SatyaAttest'
3
- s.version = '3.10.1'
3
+ s.version = '3.10.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": "3.10.1",
3
+ "version": "3.10.2",
4
4
  "description": "SATYA Expo SDK for native app attestation and TEE replay through device egress",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -893,7 +893,6 @@ export function useProviderAttestFlow(
893
893
  } = useProviderNavigationHandlers({
894
894
  emitProgress,
895
895
  managedPopup,
896
- navigateOpenerFromPopup,
897
896
  onLoginNavigation: signalLoginNavigation,
898
897
  onLoginSubmitted: signalLoginSubmitted,
899
898
  openManagedPopup,
@@ -21,7 +21,6 @@ import type {
21
21
  import {
22
22
  isLoadableDocumentUrl,
23
23
  isWebViewSafeUrl,
24
- originFromUrl,
25
24
  parseIntentBrowserFallbackUrl,
26
25
  schemeLabel,
27
26
  } from './urlUtils';
@@ -37,7 +36,6 @@ import type { ProviderPopupMessage } from '../../webview';
37
36
  interface ProviderNavigationHandlersOptions {
38
37
  emitProgress: (progress: SatyaProviderFlowProgress) => void;
39
38
  managedPopup: ManagedPopupState | null;
40
- navigateOpenerFromPopup: (popup: ProviderPopupMessage) => void;
41
39
  onLoginNavigation: () => void;
42
40
  onLoginSubmitted: (signal: SatyaProviderLoginSubmitSignal) => boolean;
43
41
  openManagedPopup: (popup: ProviderPopupMessage, message?: string) => void;
@@ -55,7 +53,6 @@ interface ProviderNavigationHandlersOptions {
55
53
  export function useProviderNavigationHandlers({
56
54
  emitProgress,
57
55
  managedPopup,
58
- navigateOpenerFromPopup,
59
56
  onLoginNavigation,
60
57
  onLoginSubmitted,
61
58
  openManagedPopup,
@@ -276,33 +273,11 @@ export function useProviderNavigationHandlers({
276
273
  });
277
274
  }
278
275
  setPopupChrome((current) => ({ ...current, ...nextChrome }));
279
-
280
- const url = nextChrome.url;
281
- if (!url || !managedPopup) return;
282
- const openerOrigin = originFromUrl(
283
- managedPopup.sourceUrl ??
284
- lastMainDocumentUrlRef.current ??
285
- webViewUrl ??
286
- (resolved ? providerLoginUrl(resolved.template) : null)
287
- );
288
- const initialPopupOrigin = originFromUrl(managedPopup.url);
289
- const currentPopupOrigin = originFromUrl(url);
290
- if (
291
- openerOrigin &&
292
- currentPopupOrigin &&
293
- currentPopupOrigin === openerOrigin &&
294
- initialPopupOrigin &&
295
- initialPopupOrigin !== openerOrigin
296
- ) {
297
- navigateOpenerFromPopup({
298
- url,
299
- target: managedPopup.target ?? null,
300
- sourceUrl: managedPopup.url ?? null,
301
- reason: 'popupReturnedToOpenerOrigin',
302
- });
303
- }
276
+ // OAuth callbacks must finish in their popup and notify the original
277
+ // opener. Returning to its origin alone must not close or replay them.
278
+ // Explicit opener navigation, postMessage and close use the popup bridge.
304
279
  },
305
- [managedPopup, navigateOpenerFromPopup, resolved, setPopupChrome, webViewProps, webViewUrl]
280
+ [setPopupChrome, webViewProps]
306
281
  );
307
282
 
308
283
  return {
@@ -1,3 +1,3 @@
1
1
  // Generated by internal/module_scripts/sync-sdk-metadata.js.
2
2
  export const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest' as const;
3
- export const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.1' as const;
3
+ export const EXPO_SATYA_ATTEST_SDK_VERSION = '3.10.2' as const;