fix(macos): add gateway discovery refresh
This commit is contained in:
@@ -116,6 +116,11 @@ extension OnboardingView {
|
|||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.secondary)
|
||||||
if self.gatewayDiscovery.gateways.isEmpty {
|
if self.gatewayDiscovery.gateways.isEmpty {
|
||||||
ProgressView().controlSize(.small)
|
ProgressView().controlSize(.small)
|
||||||
|
Button("Refresh") {
|
||||||
|
self.gatewayDiscovery.refreshWideAreaFallbackNow(timeoutSeconds: 5.0)
|
||||||
|
}
|
||||||
|
.buttonStyle(.link)
|
||||||
|
.help("Retry Tailscale discovery (DNS-SD).")
|
||||||
}
|
}
|
||||||
Spacer(minLength: 0)
|
Spacer(minLength: 0)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,6 +112,19 @@ public final class GatewayDiscoveryModel {
|
|||||||
self.scheduleWideAreaFallback()
|
self.scheduleWideAreaFallback()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func refreshWideAreaFallbackNow(timeoutSeconds: TimeInterval = 5.0) {
|
||||||
|
let domain = ClawdbotBonjour.wideAreaBridgeServiceDomain
|
||||||
|
Task.detached(priority: .utility) { [weak self] in
|
||||||
|
guard let self else { return }
|
||||||
|
let beacons = WideAreaGatewayDiscovery.discover(timeoutSeconds: timeoutSeconds)
|
||||||
|
await MainActor.run { [weak self] in
|
||||||
|
guard let self else { return }
|
||||||
|
self.wideAreaFallbackGateways = self.mapWideAreaBeacons(beacons, domain: domain)
|
||||||
|
self.recomputeGateways()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public func stop() {
|
public func stop() {
|
||||||
for browser in self.browsers.values {
|
for browser in self.browsers.values {
|
||||||
browser.cancel()
|
browser.cancel()
|
||||||
@@ -130,6 +143,28 @@ public final class GatewayDiscoveryModel {
|
|||||||
self.statusText = "Stopped"
|
self.statusText = "Stopped"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func mapWideAreaBeacons(_ beacons: [WideAreaGatewayBeacon], domain: String) -> [DiscoveredGateway] {
|
||||||
|
beacons.map { beacon in
|
||||||
|
let stableID = "wide-area|\(domain)|\(beacon.instanceName)"
|
||||||
|
let isLocal = Self.isLocalGateway(
|
||||||
|
lanHost: beacon.lanHost,
|
||||||
|
tailnetDns: beacon.tailnetDns,
|
||||||
|
displayName: beacon.displayName,
|
||||||
|
serviceName: beacon.instanceName,
|
||||||
|
local: self.localIdentity)
|
||||||
|
return DiscoveredGateway(
|
||||||
|
displayName: beacon.displayName,
|
||||||
|
lanHost: beacon.lanHost,
|
||||||
|
tailnetDns: beacon.tailnetDns,
|
||||||
|
sshPort: beacon.sshPort ?? 22,
|
||||||
|
gatewayPort: beacon.gatewayPort,
|
||||||
|
cliPath: beacon.cliPath,
|
||||||
|
stableID: stableID,
|
||||||
|
debugID: "\(beacon.instanceName)@\(beacon.host):\(beacon.port)",
|
||||||
|
isLocal: isLocal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func recomputeGateways() {
|
private func recomputeGateways() {
|
||||||
var next = self.gatewaysByDomain.values
|
var next = self.gatewaysByDomain.values
|
||||||
.flatMap(\.self)
|
.flatMap(\.self)
|
||||||
@@ -231,25 +266,7 @@ public final class GatewayDiscoveryModel {
|
|||||||
if !beacons.isEmpty {
|
if !beacons.isEmpty {
|
||||||
await MainActor.run { [weak self] in
|
await MainActor.run { [weak self] in
|
||||||
guard let self else { return }
|
guard let self else { return }
|
||||||
self.wideAreaFallbackGateways = beacons.map { beacon in
|
self.wideAreaFallbackGateways = self.mapWideAreaBeacons(beacons, domain: domain)
|
||||||
let stableID = "wide-area|\(domain)|\(beacon.instanceName)"
|
|
||||||
let isLocal = Self.isLocalGateway(
|
|
||||||
lanHost: beacon.lanHost,
|
|
||||||
tailnetDns: beacon.tailnetDns,
|
|
||||||
displayName: beacon.displayName,
|
|
||||||
serviceName: beacon.instanceName,
|
|
||||||
local: self.localIdentity)
|
|
||||||
return DiscoveredGateway(
|
|
||||||
displayName: beacon.displayName,
|
|
||||||
lanHost: beacon.lanHost,
|
|
||||||
tailnetDns: beacon.tailnetDns,
|
|
||||||
sshPort: beacon.sshPort ?? 22,
|
|
||||||
gatewayPort: beacon.gatewayPort,
|
|
||||||
cliPath: beacon.cliPath,
|
|
||||||
stableID: stableID,
|
|
||||||
debugID: "\(beacon.instanceName)@\(beacon.host):\(beacon.port)",
|
|
||||||
isLocal: isLocal)
|
|
||||||
}
|
|
||||||
self.recomputeGateways()
|
self.recomputeGateways()
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user