/** * Volume RPC handlers. */ import { docker, extractVolumesList } from '../services/docker.js' import * as validation from '../utils/validation.js' import { Pushes } from '../../shared/protocol.js' import { peers } from '../core/peer-registry.js' import logger from '../utils/logger.js' export function registerVolumeHandlers(session) { session.respond('listVolumes', async () => { try { const volumesResult = await docker.listVolumes() const volumesList = extractVolumesList(volumesResult) return { type: 'volumes', data: volumesList, success: true, volumes: volumesList, } } catch (error) { return { type: 'volumes', success: false, error: `Failed to list volumes: ${error.message}`, data: [], volumes: [], } } }) session.respond('createVolume', async (args) => { const volumeConfig = { Name: validation.sanitizeString(args.name, 128), } if (args.driver) volumeConfig.Driver = args.driver if (args.options && typeof args.options === 'object') { volumeConfig.DriverOpts = args.options } const volume = await docker.createVolume(volumeConfig) await broadcastVolumes() return { success: true, message: `Volume "${args.name}" created successfully`, data: volume.name, } }) session.respond('removeVolume', async (args) => { await docker.getVolume(args.name).remove() await broadcastVolumes() return { success: true, message: `Volume ${args.name} removed` } }) session.respond('inspectVolume', async (args) => { const volumeData = await docker.getVolume(args.name).inspect() return { type: 'volumeConfig', data: volumeData } }) session.respond('pruneVolumes', async (args) => { const opts = {} if (args.filters) opts.filters = args.filters const result = await docker.pruneVolumes(opts) await broadcastVolumes() return { success: true, type: 'pruneVolumes', message: 'Unused volumes pruned', data: result, } }) } export async function broadcastVolumes() { try { const volumesResult = await docker.listVolumes() const volumesList = extractVolumesList(volumesResult) peers.broadcast(Pushes.volumes, { type: 'volumes', data: volumesList, success: true, volumes: volumesList, }) } catch (err) { logger.error('Failed to broadcast volumes', { error: err.message }) } }