Files
peardock/server/handlers/volumes.js
T
2026-07-10 20:36:11 -04:00

88 lines
2.4 KiB
JavaScript

/**
* 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 })
}
}