fix(mobile): route phone APIs to selected profile and unblock runtime readiness
This commit is contained in:
1 parent
b1db2870c1
commit
61d765e2df
15 files changed
+970
-176
No files matched your search
@@ -1,3 +1,5 @@
|
||||
import path from 'node:path'
|
||||
|
||||
interface FirstRunSetupBackend {
|
||||
activeRoot?: string
|
||||
kind?: string
|
||||
@@ -5,6 +7,7 @@ interface FirstRunSetupBackend {
|
||||
}
|
||||
|
||||
interface FirstRunSetupGateOptions {
|
||||
isRuntimeAvailable?: (backend: FirstRunSetupBackend) => boolean
|
||||
hideChoice?: () => void
|
||||
log?: (message: string) => void
|
||||
onStuck?: (backend: FirstRunSetupBackend, stuckAfterMs: number) => void
|
||||
@@ -12,9 +15,10 @@ interface FirstRunSetupGateOptions {
|
||||
stuckAfterMs?: number
|
||||
}
|
||||
|
||||
export type FirstRunSetupDecision = 'continue-local' | 'remote-applied' | 'reset'
|
||||
export type FirstRunSetupDecision = 'continue-local' | 'remote-applied' | 'reset' | 'runtime-ready'
|
||||
|
||||
export function createFirstRunSetupGate({
|
||||
isRuntimeAvailable,
|
||||
hideChoice,
|
||||
log,
|
||||
onStuck,
|
||||
@@ -24,6 +28,7 @@ export function createFirstRunSetupGate({
|
||||
let localBootstrapConfirmed = false
|
||||
|
||||
let waiter: {
|
||||
activeRoot?: string
|
||||
promise: Promise<FirstRunSetupDecision>
|
||||
resolve: (decision: FirstRunSetupDecision) => void
|
||||
} | null = null
|
||||
@@ -65,6 +70,13 @@ export function createFirstRunSetupGate({
|
||||
return 'continue-local' as const
|
||||
}
|
||||
|
||||
// Recheck synchronously before registering the waiter: another profile
|
||||
// may have completed installation before this stale descriptor arrived.
|
||||
if (backend && isRuntimeAvailable?.(backend)) {
|
||||
if (backend.activeRoot) runtimeAvailable(backend.activeRoot)
|
||||
return 'runtime-ready' as const
|
||||
}
|
||||
|
||||
if (waiter) {
|
||||
return waiter.promise
|
||||
}
|
||||
@@ -78,7 +90,7 @@ export function createFirstRunSetupGate({
|
||||
resolveWaiter = resolve
|
||||
})
|
||||
|
||||
waiter = { promise, resolve: resolveWaiter }
|
||||
waiter = { activeRoot: backend?.activeRoot, promise, resolve: resolveWaiter }
|
||||
|
||||
return promise
|
||||
}
|
||||
@@ -102,6 +114,21 @@ export function createFirstRunSetupGate({
|
||||
settleWaiter('continue-local')
|
||||
}
|
||||
|
||||
// A sibling profile may finish installing the SAME shared runtime while the
|
||||
// primary boot is awaiting a setup choice. Re-resolve it; do not interpret
|
||||
// this as permission for another installation, or reuse the sibling's
|
||||
// profile/backend descriptor.
|
||||
const runtimeAvailable = (root: string) => {
|
||||
const canonical = (value: string) => {
|
||||
const absolute = path.resolve(value)
|
||||
return process.platform === 'win32' ? absolute.toLowerCase() : absolute
|
||||
}
|
||||
if (!waiter?.activeRoot || canonical(waiter.activeRoot) !== canonical(root)) return false
|
||||
settleWaiter('runtime-ready')
|
||||
hideChoice?.()
|
||||
return true
|
||||
}
|
||||
|
||||
const resetForRetry = () => {
|
||||
// Reset paths are followed by a renderer reload / fresh startHermes() call.
|
||||
// Settle the old boot explicitly so it cannot fall through into local
|
||||
@@ -140,6 +167,7 @@ export function createFirstRunSetupGate({
|
||||
isLocalBootstrapConfirmed,
|
||||
resetForRepair,
|
||||
resetForRetry,
|
||||
runtimeAvailable,
|
||||
shouldGate,
|
||||
wait
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user