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) {
var status = data.status || {};
var interfaces = (data.interfaces || {}).interfaces || [];
var peers = (data.peers || {}).peers || [];
// Handle RPC expect unwrapping - may be array or object
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.updatePeers(peers);
@ -240,8 +243,11 @@ return view.extend({
render: function(data) {
var self = this;
var status = data.status || {};
var interfaces = (data.interfaces || {}).interfaces || [];
var peers = (data.peers || {}).peers || [];
// Handle RPC expect unwrapping - may be array or object
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
this.peerDescriptions = data.descriptions || {};

View File

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