import { z } from 'zod';
import { createWriteStream } from 'fs';
import { SessionManager } from '../core/session-manager.js';
export const schema = z.object({
session_id: z.string(),
remote_path: z.string(),
local_path: z.string(),
});
export async function scpDownload(params: z.infer<typeof schema>) {
const client = SessionManager.getInstance().getSession(params.session_id);
if (!client) {
return { success: false, error: 'Session not found' };
}
try {
const sftp = await client.getSftp();
return new Promise((resolve) => {
sftp.stat(params.remote_path, (err, stats) => {
if (err) {
resolve({ success: false, error: err.message });
return;
}
const readStream = sftp.createReadStream(params.remote_path);
const writeStream = createWriteStream(params.local_path);
writeStream.on('close', () => {
resolve({ success: true, bytes_transferred: stats.size });
});
writeStream.on('error', (err: Error) => {
resolve({ success: false, error: err.message });
});
readStream.pipe(writeStream);
});
});
} catch (err: any) {
return { success: false, error: err.message };
}
}