Files
peardock/client/api.js
T
Raven Scott a6925d337e Add container image update indicators.
Compare local RepoDigests to remote registry manifest digests, show status in the containers table Updates column, and support force recheck with vault credentials for private registries.
2026-07-15 15:05:04 -04:00

537 lines
15 KiB
JavaScript

/**
* Typed peardock RPC API over an active connection / manager.
* UI and tools should prefer these helpers over raw method strings.
*/
import { Methods } from '../shared/protocol.js'
import { manager } from './manager.js'
function connOrActive(connection) {
const c = connection || manager.active
if (!c?.connected) throw new Error('Not connected')
return c
}
export const api = {
Methods,
handshake(info = {}, connection) {
return connOrActive(connection).request(Methods.handshake, {
clientName: info.clientName || 'peardock-api',
clientVersion: info.clientVersion || null,
})
},
ping(connection) {
return connOrActive(connection).ping()
},
// —— Containers ——
listContainers(opts = {}, connection) {
if (opts && typeof opts.request === 'function') {
connection = opts
opts = {}
}
return connOrActive(connection).request(Methods.listContainers, opts)
},
validateCreateOptions(options, opts = {}, connection) {
return connOrActive(connection).request(Methods.validateCreateOptions, {
options,
...opts,
})
},
inspectContainer(id, connection) {
return connOrActive(connection).request(Methods.inspectContainer, { id })
},
checkImageUpdates(opts = {}, connection) {
if (opts && typeof opts.request === 'function') {
connection = opts
opts = {}
}
return connOrActive(connection).request(Methods.checkImageUpdates, opts)
},
startContainer(id, connection) {
return connOrActive(connection).request(Methods.startContainer, { id })
},
stopContainer(id, opts = {}, connection) {
return connOrActive(connection).request(Methods.stopContainer, { id, ...opts })
},
restartContainer(id, opts = {}, connection) {
return connOrActive(connection).request(Methods.restartContainer, { id, ...opts })
},
killContainer(id, opts = {}, connection) {
return connOrActive(connection).request(Methods.killContainer, { id, ...opts })
},
pauseContainer(id, connection) {
return connOrActive(connection).request(Methods.pauseContainer, { id })
},
unpauseContainer(id, connection) {
return connOrActive(connection).request(Methods.unpauseContainer, { id })
},
removeContainer(id, opts = {}, connection) {
return connOrActive(connection).request(Methods.removeContainer, { id, ...opts })
},
renameContainer(id, name, connection) {
return connOrActive(connection).request(Methods.renameContainer, { id, name })
},
updateContainer(id, update, connection) {
return connOrActive(connection).request(Methods.updateContainer, { id, ...update })
},
containerTop(id, opts = {}, connection) {
return connOrActive(connection).request(Methods.containerTop, { id, ...opts })
},
containerStats(id, connection) {
return connOrActive(connection).request(Methods.containerStats, { id })
},
waitContainer(id, opts = {}, connection) {
return connOrActive(connection).request(Methods.waitContainer, { id, ...opts })
},
pruneContainers(opts = {}, connection) {
return connOrActive(connection).request(Methods.pruneContainers, opts)
},
archiveGet(id, path, opts = {}, connection) {
return connOrActive(connection).request(Methods.archiveContainerGet, { id, path, ...opts })
},
archivePut(id, path, data, opts = {}, connection) {
return connOrActive(connection).request(Methods.archiveContainerPut, {
id,
path,
data,
...opts,
})
},
deployContainer(args, connection) {
return connOrActive(connection).request(Methods.deployContainer, args)
},
bulkContainerOperation(containerIds, operation, opts = {}, connection) {
return connOrActive(connection).request(Methods.bulkContainerOperation, {
containerIds,
operation,
...opts,
})
},
// —— Images ——
listImages(opts = {}, connection) {
if (opts && typeof opts.request === 'function') {
connection = opts
opts = {}
}
return connOrActive(connection).request(Methods.listImages, opts)
},
binaryStreamOpen(args, connection) {
return connOrActive(connection).request(Methods.binaryStreamOpen, args)
},
binaryStreamChunk(streamId, data, opts = {}, connection) {
return connOrActive(connection).request(Methods.binaryStreamChunk, {
streamId,
data,
...opts,
})
},
binaryStreamClose(streamId, connection) {
return connOrActive(connection).request(Methods.binaryStreamClose, { streamId })
},
pullImage(image, opts = {}, connection) {
if (opts && typeof opts.request === 'function') {
connection = opts
opts = {}
}
const body = typeof image === 'object' && image ? { ...image } : { image, ...opts }
return connOrActive(connection).request(Methods.pullImage, body)
},
removeImage(id, opts = {}, connection) {
return connOrActive(connection).request(Methods.removeImage, { id, ...opts })
},
inspectImage(id, connection) {
return connOrActive(connection).request(Methods.inspectImage, { id })
},
imageHistory(id, connection) {
return connOrActive(connection).request(Methods.imageHistory, { id })
},
searchImages(term, opts = {}, connection) {
return connOrActive(connection).request(Methods.searchImages, { term, ...opts })
},
pruneImages(opts = {}, connection) {
return connOrActive(connection).request(Methods.pruneImages, opts)
},
tagImage(id, repo, tag = 'latest', connection) {
return connOrActive(connection).request(Methods.tagImage, { id, repo, tag })
},
buildImage(args, connection) {
return connOrActive(connection).request(Methods.buildImage, args)
},
pushImage(image, opts = {}, connection) {
if (opts && typeof opts.request === 'function') {
connection = opts
opts = {}
}
const body =
typeof image === 'object' && image
? { ...image }
: { image, id: opts.id || image, ...opts }
return connOrActive(connection).request(Methods.pushImage, body)
},
saveImage(id, opts = {}, connection) {
return connOrActive(connection).request(Methods.saveImage, { id, ...opts })
},
loadImageStart(connection) {
return connOrActive(connection).request(Methods.loadImageStart, {})
},
loadImageChunk(transferId, data, opts = {}, connection) {
return connOrActive(connection).request(Methods.loadImageChunk, {
transferId,
data,
...opts,
})
},
loadImageFinish(transferId, connection) {
return connOrActive(connection).request(Methods.loadImageFinish, { transferId })
},
importImage(data, opts = {}, connection) {
return connOrActive(connection).request(Methods.importImage, { data, ...opts })
},
pruneBuilder(connection) {
return connOrActive(connection).request(Methods.pruneBuilder, {})
},
systemPrune(opts = {}, connection) {
return connOrActive(connection).request(Methods.systemPrune, opts)
},
recreateContainer(id, opts = {}, connection) {
return connOrActive(connection).request(Methods.recreateContainer, { id, ...opts })
},
browseVolume(name, path = '/', connection) {
return connOrActive(connection).request(Methods.browseVolume, { name, path })
},
listSchedules(connection) {
return connOrActive(connection).request(Methods.listSchedules, {})
},
upsertSchedule(args, connection) {
return connOrActive(connection).request(Methods.upsertSchedule, args)
},
deleteSchedule(id, connection) {
return connOrActive(connection).request(Methods.deleteSchedule, { id })
},
scaleService(id, replicas, connection) {
return connOrActive(connection).request(Methods.scaleService, { id, replicas })
},
updateContainer(args, connection) {
return connOrActive(connection).request(Methods.updateContainer, args)
},
// —— Networks / volumes ——
listNetworks(connection) {
return connOrActive(connection).request(Methods.listNetworks, {})
},
createNetwork(args, connection) {
return connOrActive(connection).request(Methods.createNetwork, args)
},
removeNetwork(id, connection) {
return connOrActive(connection).request(Methods.removeNetwork, { id })
},
pruneNetworks(opts = {}, connection) {
return connOrActive(connection).request(Methods.pruneNetworks, opts)
},
listVolumes(connection) {
return connOrActive(connection).request(Methods.listVolumes, {})
},
createVolume(args, connection) {
return connOrActive(connection).request(Methods.createVolume, args)
},
removeVolume(name, connection) {
return connOrActive(connection).request(Methods.removeVolume, { name })
},
pruneVolumes(opts = {}, connection) {
return connOrActive(connection).request(Methods.pruneVolumes, opts)
},
// —— Stacks ——
listStacks(connection) {
return connOrActive(connection).request(Methods.listStacks, {})
},
deployStack(composeContent, stackName, opts = {}, connection) {
// opts may be a connection when called as (content, name, connection)
if (opts && typeof opts.request === 'function') {
connection = opts
opts = {}
}
return connOrActive(connection).request(Methods.deployStack, {
composeContent,
stackName,
...opts,
})
},
removeStack(stackName, connection) {
return connOrActive(connection).request(Methods.removeStack, { stackName })
},
stackPs(stackName, connection) {
return connOrActive(connection).request(Methods.stackPs, { stackName })
},
stackLogs(stackName, opts = {}, connection) {
return connOrActive(connection).request(Methods.stackLogs, { stackName, ...opts })
},
stackPull(stackName, opts = {}, connection) {
return connOrActive(connection).request(Methods.stackPull, { stackName, ...opts })
},
// —— System ——
getSystemInfo(connection) {
return connOrActive(connection).request(Methods.getSystemInfo, {})
},
getSystemDf(connection) {
return connOrActive(connection).request(Methods.getSystemDf, {})
},
getDockerEvents(opts = {}, connection) {
return connOrActive(connection).request(Methods.getDockerEvents, opts)
},
registryLogin(args, connection) {
return connOrActive(connection).request(Methods.registryLogin, args)
},
registryLogout(connection) {
return connOrActive(connection).request(Methods.registryLogout, {})
},
getAuthStatus(connection) {
return connOrActive(connection).request(Methods.getAuthStatus, {})
},
getMetrics(connection) {
return connOrActive(connection).request(Methods.getMetrics, {})
},
getHostSnapshot(connection) {
return connOrActive(connection).request(Methods.getHostSnapshot, {})
},
suggestNetworkIPAM(opts = {}, connection) {
return connOrActive(connection).request(Methods.suggestNetworkIPAM, opts)
},
suggestResourceName(kind, base, connection) {
return connOrActive(connection).request(Methods.suggestResourceName, { kind, base })
},
suggestFromImage(image, connection) {
return connOrActive(connection).request(Methods.suggestFromImage, { image })
},
suggestDefaults(kind, args = {}, connection) {
return connOrActive(connection).request(Methods.suggestDefaults, { kind, ...args })
},
getStatsHistory(id, opts = {}, connection) {
return connOrActive(connection).request(Methods.getStatsHistory, { id, ...opts })
},
getContainerLogs(id, opts = {}, connection) {
return connOrActive(connection).request(Methods.getContainerLogs, { id, ...opts })
},
createContainer(args, connection) {
return connOrActive(connection).request(Methods.createContainer, args)
},
// —— Vault / peers ——
listVaultCredentials(connection) {
return connOrActive(connection).request(Methods.listVaultCredentials, {})
},
vaultStoreCredential(args, connection) {
return connOrActive(connection).request(Methods.vaultStoreCredential, args)
},
vaultDeleteCredential(id, connection) {
return connOrActive(connection).request(Methods.vaultDeleteCredential, { id })
},
vaultUseCredential(id, connection) {
return connOrActive(connection).request(Methods.vaultUseCredential, { id })
},
vaultTestCredential(args, connection) {
return connOrActive(connection).request(Methods.vaultTestCredential, args)
},
vaultClearSession(connection) {
return connOrActive(connection).request(Methods.vaultClearSession, {})
},
listPeers(connection) {
return connOrActive(connection).request(Methods.listPeers, {})
},
invitePeer(args = {}, connection) {
return connOrActive(connection).request(Methods.invitePeer, args)
},
deleteInvite(args = {}, connection) {
return connOrActive(connection).request(Methods.deleteInvite, args)
},
revokePeer(peerId, connection) {
return connOrActive(connection).request(Methods.revokePeer, { peerId })
},
unrevokePeer(peerId, connection) {
return connOrActive(connection).request(Methods.unrevokePeer, { peerId })
},
clearRevokedPeers(connection) {
return connOrActive(connection).request(Methods.clearRevokedPeers, {})
},
listRevokedPeers(connection) {
return connOrActive(connection).request(Methods.listRevokedPeers, {})
},
setPeerRole(peerId, role, connection) {
return connOrActive(connection).request(Methods.setPeerRole, { peerId, role })
},
listInvites(connection) {
return connOrActive(connection).request(Methods.listInvites, {})
},
syncStackFromGit(args, connection) {
return connOrActive(connection).request(Methods.syncStackFromGit, args)
},
// —— Holesail tunnels (on by default; ENABLE_HOLESAIL=0 to disable) ——
listTunnels(connection) {
return connOrActive(connection).request(Methods.listTunnels, {})
},
getHolesailStatus(connection) {
return connOrActive(connection).request(Methods.getHolesailStatus, {})
},
createTunnel(args, connection) {
return connOrActive(connection).request(Methods.createTunnel, args)
},
closeTunnel(id, connection) {
return connOrActive(connection).request(Methods.closeTunnel, { id })
},
// —— Swarm (on by default; ENABLE_SWARM=0 to disable) ——
swarmInspect(connection) {
return connOrActive(connection).request(Methods.swarmInspect, {})
},
listServices(opts = {}, connection) {
return connOrActive(connection).request(Methods.listServices, opts)
},
listNodes(opts = {}, connection) {
return connOrActive(connection).request(Methods.listNodes, opts)
},
// —— Streams ——
startTerminal(containerId, opts = {}, connection) {
if (opts && typeof opts.request === 'function') {
connection = opts
opts = {}
}
return connOrActive(connection).request(Methods.startTerminal, {
containerId,
...opts,
})
},
killTerminal(containerId, connection) {
return connOrActive(connection).request(Methods.killTerminal, { containerId })
},
terminalInput(payload, connection) {
return connOrActive(connection).event(Methods.terminalInput, payload)
},
terminalResize(payload, connection) {
return connOrActive(connection).event(Methods.terminalResize, payload)
},
startLogs(id, connection) {
return connOrActive(connection).request(Methods.startLogs, { id })
},
stopLogs(id, connection) {
return connOrActive(connection).request(Methods.stopLogs, { id })
},
dockerCommand(data, connectionId, connection) {
return connOrActive(connection).request(Methods.dockerCommand, { data, connectionId })
},
/** Generic escape hatch */
request(method, args = {}, connection) {
return connOrActive(connection).request(method, args)
},
event(method, args = {}, connection) {
return connOrActive(connection).event(method, args)
},
}
export default api