This commit is contained in:
Raven Scott
2025-11-24 22:57:58 -05:00
parent e6032533e9
commit b92edd9cdb
+55 -8
View File
@@ -26,6 +26,23 @@ const connectedPeers = new Set();
const terminalSessions = new Map(); // Map to track terminal sessions per peer
const logsStreams = new Map(); // Map to track logs streams: key = `${peerId}:${containerId}`
/**
* Helper function to extract volumes list from Docker API response
* Docker API can return volumes in different formats depending on version
* @param {Object|Array} volumesResult - Response from docker.listVolumes()
* @returns {Array} - Array of volume objects
*/
function extractVolumesList(volumesResult) {
if (Array.isArray(volumesResult)) {
return volumesResult;
} else if (volumesResult && Array.isArray(volumesResult.Volumes)) {
return volumesResult.Volumes;
} else if (volumesResult && volumesResult.volumes && Array.isArray(volumesResult.volumes)) {
return volumesResult.volumes;
}
return [];
}
// Function to generate a new key
function generateNewKey() {
const newKey = crypto.randomBytes(32);
@@ -848,7 +865,9 @@ swarm.on('connection', (peer) => {
return { Volumes: [] };
})
]);
const volumesList = volumesResult.Volumes || [];
// Extract volumes list from Docker socket API response
const volumesList = extractVolumesList(volumesResult);
response = {
type: 'systemInfo',
data: { info, version, volumes: volumesList }
@@ -1132,8 +1151,14 @@ swarm.on('connection', (peer) => {
case 'listVolumes':
console.log('[INFO] ===== Handling \'listVolumes\' command =====');
try {
const volumes = await docker.listVolumes();
const volumesList = volumes.Volumes || [];
// Directly call Docker API via socket - dockerode handles the socket communication
const volumesResult = await docker.listVolumes();
// Docker API returns { Volumes: [...], Warnings: [...] }
// Extract volumes list from Docker socket API response
const volumesList = extractVolumesList(volumesResult);
console.log(`[INFO] Retrieved ${volumesList.length} volumes from Docker socket API`);
// Return consistent format with type field for volumes tab
// Also include success/volumes for backwards compatibility with selector
@@ -1144,13 +1169,15 @@ swarm.on('connection', (peer) => {
volumes: volumesList
};
} catch (error) {
console.error(`[ERROR] ===== Failed to list volumes =====`);
console.error(`[ERROR] ===== Failed to list volumes from Docker socket API =====`);
console.error(`[ERROR] Error message: ${error.message}`);
console.error(`[ERROR] Error stack:`, error.stack);
response = {
type: 'volumes',
success: false,
error: `Failed to list volumes: ${error.message}`
error: `Failed to list volumes: ${error.message}`,
data: [],
volumes: []
};
}
break;
@@ -1174,7 +1201,16 @@ swarm.on('connection', (peer) => {
// Broadcast updated volumes list to all peers
try {
const volumesResult = await docker.listVolumes();
const volumesList = volumesResult.Volumes || [];
// Handle both direct array response and object with Volumes property
let volumesList = [];
if (Array.isArray(volumesResult)) {
volumesList = volumesResult;
} else if (volumesResult && Array.isArray(volumesResult.Volumes)) {
volumesList = volumesResult.Volumes;
} else if (volumesResult && volumesResult.volumes && Array.isArray(volumesResult.volumes)) {
volumesList = volumesResult.volumes;
}
const update = {
type: 'volumes',
data: volumesList,
@@ -1208,7 +1244,16 @@ swarm.on('connection', (peer) => {
// Broadcast updated volumes list to all peers
try {
const volumesResult = await docker.listVolumes();
const volumesList = volumesResult.Volumes || [];
// Handle both direct array response and object with Volumes property
let volumesList = [];
if (Array.isArray(volumesResult)) {
volumesList = volumesResult;
} else if (volumesResult && Array.isArray(volumesResult.Volumes)) {
volumesList = volumesResult.Volumes;
} else if (volumesResult && volumesResult.volumes && Array.isArray(volumesResult.volumes)) {
volumesList = volumesResult.volumes;
}
const update = {
type: 'volumes',
data: volumesList,
@@ -1592,7 +1637,9 @@ async function initializeDockerEventStream() {
if (event.Type === 'volume' && (event.Action === 'create' || event.Action === 'destroy')) {
try {
const volumesResult = await docker.listVolumes();
const volumesList = volumesResult.Volumes || [];
// Extract volumes list from Docker socket API response
const volumesList = extractVolumesList(volumesResult);
const update = {
type: 'volumes',
data: volumesList,