mirror of
https://github.com/stablyai/orca.git
synced 2026-09-27 08:02:35 +00:00
* fix(remote): preserve standing host reconnect intent * chore(lint): merge duplicate imports flagged by the native code-quality audit * fix(remote): fence stale capability runtime identities * fix(remote): release capability evidence on host removal --------- Co-authored-by: Merge Sim <sim@local>
65 lines
2.8 KiB
TypeScript
65 lines
2.8 KiB
TypeScript
import { ipcMain } from 'electron'
|
|
import {
|
|
BrowserClientHostPlacementPreparationRequest,
|
|
type BrowserPageCreationPlacement
|
|
} from '../../shared/browser-client-host-placement'
|
|
import type { GlobalSettings } from '../../shared/global-settings-types'
|
|
import { resolveEnvironment } from '../../shared/runtime-environment-store'
|
|
import {
|
|
closePairedRuntimeBrowserClientHostEnvironment,
|
|
startPairedRuntimeBrowserClientHost
|
|
} from '../browser/paired-runtime-browser-client-host-runtime'
|
|
import { prepareBrowserClientHostPlacement } from '../browser/browser-client-host-placement-preparation'
|
|
import { isRuntimeEnvironmentManuallyDisconnected } from './runtime-environment-connectivity-handlers'
|
|
import { getRuntimeEnvironmentStatus } from './runtime-environment-transport-routing'
|
|
|
|
export function registerRuntimeEnvironmentBrowserClientHostHandler(options: {
|
|
getUserDataPath: () => string
|
|
getSettings: () => Pick<GlobalSettings, 'browserClientHostedRemoteEnabled'>
|
|
}): void {
|
|
ipcMain.handle(
|
|
'runtimeEnvironments:prepareBrowserClientHostPlacement',
|
|
async (_event, input: unknown): Promise<BrowserPageCreationPlacement> => {
|
|
const args = BrowserClientHostPlacementPreparationRequest.parse(input)
|
|
const userDataPath = options.getUserDataPath()
|
|
const initialEnvironment = resolveEnvironment(userDataPath, args.selector)
|
|
requireConnected(initialEnvironment.id)
|
|
const placement = await prepareBrowserClientHostPlacement({
|
|
selector: initialEnvironment.id,
|
|
expectedPairingRevision: args.expectedPairingRevision,
|
|
preference: args.preference,
|
|
enabled: options.getSettings().browserClientHostedRemoteEnabled !== false,
|
|
resolveEnvironment: (selector) => resolveEnvironment(userDataPath, selector),
|
|
getStatus: async (environmentId) => {
|
|
requireConnected(environmentId)
|
|
const status = await getRuntimeEnvironmentStatus(userDataPath, environmentId, undefined, {
|
|
observeOnly: true
|
|
})
|
|
requireConnected(environmentId)
|
|
return status
|
|
},
|
|
startHost: startPairedRuntimeBrowserClientHost,
|
|
closeHost: closePairedRuntimeBrowserClientHostEnvironment
|
|
})
|
|
if (placement.kind === 'client') {
|
|
try {
|
|
requireConnected(initialEnvironment.id)
|
|
} catch (error) {
|
|
const reason = error instanceof Error ? error : new Error(String(error))
|
|
await closePairedRuntimeBrowserClientHostEnvironment(initialEnvironment.id, reason).catch(
|
|
() => false
|
|
)
|
|
throw reason
|
|
}
|
|
}
|
|
return placement
|
|
}
|
|
)
|
|
}
|
|
|
|
function requireConnected(environmentId: string): void {
|
|
if (isRuntimeEnvironmentManuallyDisconnected(environmentId)) {
|
|
throw new Error('runtime_manually_disconnected')
|
|
}
|
|
}
|