mirror of
https://github.com/stablyai/orca.git
synced 2026-10-22 00:03:47 +00:00
35 lines
1.0 KiB
TypeScript
35 lines
1.0 KiB
TypeScript
import { execFile } from 'node:child_process'
|
|
|
|
const TAILSCALE_ADDRESS_TIMEOUT_MS = 1_500
|
|
|
|
export async function discoverServerPairingAddress(
|
|
explicitAddress?: string,
|
|
readTailscaleAddress: () => Promise<string | null> = readTailscaleIpv4
|
|
): Promise<{ address: string; source: 'explicit' | 'tailscale' | 'loopback' }> {
|
|
if (explicitAddress) {
|
|
return { address: explicitAddress, source: 'explicit' }
|
|
}
|
|
const tailscaleAddress = await readTailscaleAddress()
|
|
return tailscaleAddress
|
|
? { address: tailscaleAddress, source: 'tailscale' }
|
|
: { address: '127.0.0.1', source: 'loopback' }
|
|
}
|
|
|
|
function readTailscaleIpv4(): Promise<string | null> {
|
|
return new Promise((resolve) => {
|
|
execFile(
|
|
'tailscale',
|
|
['ip', '-4'],
|
|
{ timeout: TAILSCALE_ADDRESS_TIMEOUT_MS },
|
|
(error, stdout) => {
|
|
if (error) {
|
|
resolve(null)
|
|
return
|
|
}
|
|
const address = stdout.trim().split(/\s+/)[0]
|
|
resolve(/^\d{1,3}(?:\.\d{1,3}){3}$/.test(address ?? '') ? address : null)
|
|
}
|
|
)
|
|
})
|
|
}
|