(raw)
| 221 | } |
| 222 | |
| 223 | function parseStatus(raw) { |
| 224 | var text = String(raw || "").trim() |
| 225 | if (text === "") return { ok: true, unavailable: true, message: "Disconnected" } |
| 226 | |
| 227 | try { |
| 228 | var data = JSON.parse(text) |
| 229 | var backendState = String(data.BackendState || "Unknown") |
| 230 | var self = data.Self || {} |
| 231 | var selfIps = filterIPv4(self.TailscaleIPs || data.TailscaleIPs || []) |
| 232 | var peers = [] |
| 233 | var exitNodes = [] |
| 234 | var rawPeers = data.Peer || {} |
| 235 | |
| 236 | for (var id in rawPeers) { |
| 237 | var peer = rawPeers[id] || {} |
| 238 | var normalized = peerFromStatus(id, peer) |
| 239 | if (normalized.Mullvad) continue |
| 240 | if (normalized.Online) { |
| 241 | peers.push(normalized) |
| 242 | if (normalized.ExitNodeOption) exitNodes.push(normalized) |
| 243 | } |
| 244 | } |
| 245 | |
| 246 | peers.sort(function(a, b) { |
| 247 | return String(a.HostName).localeCompare(String(b.HostName)) |
| 248 | }) |
| 249 | exitNodes.sort(function(a, b) { |
| 250 | return String(a.HostName).localeCompare(String(b.HostName)) |
| 251 | }) |
| 252 | |
| 253 | return { |
| 254 | ok: true, |
| 255 | unavailable: false, |
| 256 | backendState: backendState, |
| 257 | running: backendState === "Running", |
| 258 | needsLogin: backendState === "NeedsLogin", |
| 259 | authUrl: String(data.AuthURL || ""), |
| 260 | selfName: displayHostName(self.HostName, self.DNSName), |
| 261 | selfDnsName: cleanDnsName(self.DNSName), |
| 262 | selfIp: selfIps.length > 0 ? selfIps[0] : "", |
| 263 | selfUserId: String(self.UserID || ""), |
| 264 | fileSharing: hasFileSharing(self), |
| 265 | peers: peers, |
| 266 | exitNodes: exitNodes |
| 267 | } |
| 268 | } catch (e) { |
| 269 | return { ok: false, unavailable: true, message: "Status error", error: "Failed to parse tailscale status" } |
| 270 | } |
| 271 | } |
| 272 | |
| 273 | function parseAccounts(raw) { |
| 274 | var text = String(raw || "").trim() |
nothing calls this directly
no test coverage detected