fix(wireguard): Handle RPC expect unwrapping in API and views

The RPC expect clause unwraps responses - when `expect: { peers: [] }`
is used, the response `{peers: [...]}` gets unwrapped to just `[...]`.

Fixed:
- api.js: getAllData and getMonitoringData now handle both array
  and object formats for peers, interfaces, and rates
- overview.js: render and polling functions now safely unwrap
  data that may be array or nested object

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
CyberMind-FR 2026-01-25 10:45:25 +01:00
parent 787fe3864e
commit 785ba9eb4c
2 changed files with 22 additions and 8 deletions

View File

@ -222,8 +222,11 @@ return view.extend({
return api.getAllData().then(L.bind(function(data) { return api.getAllData().then(L.bind(function(data) {
var status = data.status || {}; var status = data.status || {};
var interfaces = (data.interfaces || {}).interfaces || []; // Handle RPC expect unwrapping - may be array or object
var peers = (data.peers || {}).peers || []; var interfacesData = data.interfaces || [];
var peersData = data.peers || [];
var interfaces = Array.isArray(interfacesData) ? interfacesData : (interfacesData.interfaces || []);
var peers = Array.isArray(peersData) ? peersData : (peersData.peers || []);
this.updateStats(status); this.updateStats(status);
this.updatePeers(peers); this.updatePeers(peers);
@ -240,8 +243,11 @@ return view.extend({
render: function(data) { render: function(data) {
var self = this; var self = this;
var status = data.status || {}; var status = data.status || {};
var interfaces = (data.interfaces || {}).interfaces || []; // Handle RPC expect unwrapping - may be array or object
var peers = (data.peers || {}).peers || []; var interfacesData = data.interfaces || [];
var peersData = data.peers || [];
var interfaces = Array.isArray(interfacesData) ? interfacesData : (interfacesData.interfaces || []);
var peers = Array.isArray(peersData) ? peersData : (peersData.peers || []);
// Store peer descriptions // Store peer descriptions
this.peerDescriptions = data.descriptions || {}; this.peerDescriptions = data.descriptions || {};

View File

@ -178,10 +178,14 @@ return baseclass.extend({
callGetTraffic(), callGetTraffic(),
callPeerDescriptions() callPeerDescriptions()
]).then(function(results) { ]).then(function(results) {
// Handle RPC expect unwrapping - results may be array or object
var peersData = results[1] || [];
var interfacesData = results[2] || [];
return { return {
status: results[0] || {}, status: results[0] || {},
peers: results[1] || { peers: [] }, peers: Array.isArray(peersData) ? peersData : (peersData.peers || []),
interfaces: results[2] || { interfaces: [] }, interfaces: Array.isArray(interfacesData) ? interfacesData : (interfacesData.interfaces || []),
traffic: results[3] || {}, traffic: results[3] || {},
descriptions: (results[4] || {}).descriptions || {} descriptions: (results[4] || {}).descriptions || {}
}; };
@ -196,10 +200,14 @@ return baseclass.extend({
callBandwidthRates(), callBandwidthRates(),
callPeerDescriptions() callPeerDescriptions()
]).then(function(results) { ]).then(function(results) {
// Handle RPC expect unwrapping - results may be array or object
var peersData = results[1] || [];
var ratesData = results[2] || [];
return { return {
status: results[0] || {}, status: results[0] || {},
peers: results[1] || { peers: [] }, peers: Array.isArray(peersData) ? peersData : (peersData.peers || []),
rates: (results[2] || {}).rates || [], rates: Array.isArray(ratesData) ? ratesData : (ratesData.rates || []),
descriptions: (results[3] || {}).descriptions || {} descriptions: (results[3] || {}).descriptions || {}
}; };
}); });