28 lines
1.0 KiB
TypeScript
28 lines
1.0 KiB
TypeScript
import { execFile } from 'node:child_process'
|
|
|
|
export type DockerStatus = 'ready' | 'missing' | 'permission' | 'unavailable' | 'error'
|
|
|
|
export function classifyDockerError(code: string | number | null | undefined, message: string): DockerStatus {
|
|
if (code === 'ENOENT') return 'missing'
|
|
if (/permission denied|access is denied|EACCES/i.test(message)) return 'permission'
|
|
if (/cannot connect|connection refused|is the docker daemon running/i.test(message)) return 'unavailable'
|
|
return 'error'
|
|
}
|
|
|
|
export function checkDockerStatus(): Promise<{ status: DockerStatus; platform: string }> {
|
|
return new Promise((resolve) => {
|
|
execFile('docker', ['info', '--format', '{{.ServerVersion}}'], {
|
|
timeout: 5000,
|
|
maxBuffer: 256 * 1024,
|
|
env: { ...process.env, LC_ALL: 'C', LANG: 'C' },
|
|
}, (error, stdout, stderr) => {
|
|
resolve({
|
|
status: error
|
|
? classifyDockerError(error.code, `${error.message}\n${stderr}`)
|
|
: stdout.trim() ? 'ready' : 'error',
|
|
platform: process.platform,
|
|
})
|
|
})
|
|
})
|
|
}
|