62 lines
1.7 KiB
TypeScript
Raw Normal View History

2024-10-19 05:25:26 -06:00
import { SSHConfig, SSHSocketClient } from "./SSHSocketClient"
2024-10-19 15:16:24 -06:00
// Interface for the response structure from Dokku commands
export interface DokkuResponse {
2024-10-19 05:25:26 -06:00
ok: boolean
output: string
}
2024-10-19 15:16:24 -06:00
// DokkuClient class extends SSHSocketClient to interact with Dokku via SSH
export class DokkuClient extends SSHSocketClient {
constructor(config: SSHConfig) {
2024-10-19 15:16:24 -06:00
// Initialize with Dokku daemon socket path
2024-10-19 05:25:26 -06:00
super(config, "/var/run/dokku-daemon/dokku-daemon.sock")
}
2024-10-19 15:16:24 -06:00
// Send a command to Dokku and parse the response
async sendCommand(command: string): Promise<DokkuResponse> {
try {
2024-10-19 05:25:26 -06:00
const response = await this.sendData(command)
if (typeof response !== "string") {
2024-10-19 05:25:26 -06:00
throw new Error("Received data is not a string")
}
2024-10-19 15:16:24 -06:00
// Parse the JSON response from Dokku
2024-10-19 05:25:26 -06:00
return JSON.parse(response)
} catch (error: any) {
2024-10-19 05:25:26 -06:00
throw new Error(`Failed to send command: ${error.message}`)
}
}
2024-10-19 15:16:24 -06:00
// List all deployed Dokku apps
async listApps(): Promise<string[]> {
const response = await this.sendCommand("--quiet apps:list")
return response.output.split("\n")
}
// Get the creation timestamp of an app
async getAppCreatedAt(appName: string): Promise<number> {
const response = await this.sendCommand(
`apps:report --app-created-at ${appName}`
)
const createdAt = parseInt(response.output.trim(), 10)
if (isNaN(createdAt)) {
throw new Error(
`Failed to retrieve creation timestamp for app ${appName}`
)
}
return createdAt
}
// Check if an app exists
async appExists(appName: string): Promise<boolean> {
const response = await this.sendCommand(`apps:exists ${appName}`)
return response.output.includes("App") === false
}
}
2024-10-19 05:25:26 -06:00
export { SSHConfig }