@pradyumn-el/pollycli
Version:
pollycli lets users access the functionalities of Polly over a command line interface
215 lines (164 loc) • 5.66 kB
JavaScript
import { spawn } from 'child_process';
import { stdin, stdout, stderr } from 'process';
import { EventEmitter } from 'events';
const path = require('path');
const os = require('os');
const pollyEnv = require('./env.json');
class CopyHelper extends EventEmitter {}
const copyHelper = new CopyHelper();
const CLI_DIRS = {
'linux': os.homedir() + path.sep + ".local" + path.sep + "bin" + path.sep + "polly-cli",
'darwin': os.homedir() + path.sep + ".local" + path.sep + "bin" + path.sep + "polly-cli"
}
function getAWSPath() {
if(os.platform() === 'linux') {
return CLI_DIRS['linux'] + path.sep + 'aws';
}
// On windows, aws cli is installed in user's home directory
if(os.platform() === 'win32') {
const homeDir = os.homedir();
const filePath = homeDir + '\\' + 'awscli' + '\\' + 'Amazon' + '\\' + 'AWSCLIV2' + '\\' + 'aws';
return filePath
}
if(os.platform() === 'darwin') {
return CLI_DIRS['darwin'] + path.sep + 'aws-cli' + path.sep + 'aws';
}
}
export function downloadFromS3(params) {
/*
params = {
localFile: localPath,
s3Params: {
Bucket: projectCreds.bucket,
Key: s3Key,
},
creds: projectCreds
};
*/
const creds = {
AWS_ACCESS_KEY_ID: params.creds.AccessKeyId,
AWS_SECRET_ACCESS_KEY: params.creds.SecretAccessKey,
AWS_SESSION_TOKEN: params.creds.SessionToken,
AWS_REGION: process.env.POLLY_ENV ? pollyEnv.region[process.env.POLLY_ENV] : pollyEnv.region["prod"]
};
const allEnvs = {...process.env, ...creds};
const s3Uri = `s3://${params.s3Params.Bucket}` + "/" + `${params.s3Params.Key}`;
const awsPath = getAWSPath()
const child = spawn(awsPath, ['s3', 'cp', s3Uri, params.localFile], { env: allEnvs });
child.on('error', (err) => {
copyHelper.emit('error', err);
})
child.stdout.on('data', (data) => {
stdout.clearLine(0);
stdout.cursorTo(0);
if(data.includes("s3://")) {
stdout.write('Download Complete!\n')
}
else {
stdout.write(`${data}`)
}
});
child.stderr.on('data', (data) => {
copyHelper.emit('stdError', data)
});
}
export function uploadToS3(params) {
/*
params = {
localFile: localPath,
s3Params: {
Bucket: projectCreds.bucket,
Key: s3Key,
},
creds: projectCreds
};
*/
var creds = {
AWS_ACCESS_KEY_ID: params.creds.AccessKeyId,
AWS_SECRET_ACCESS_KEY: params.creds.SecretAccessKey,
AWS_SESSION_TOKEN: params.creds.SessionToken,
AWS_REGION: process.env.POLLY_ENV ? pollyEnv.region[process.env.POLLY_ENV] : pollyEnv.region["prod"]
}
const allEnvs = {...process.env, ...creds};
const s3Uri = `s3://${params.s3Params.Bucket}` + "/" + `${params.s3Params.Key}`;
const awsPath = getAWSPath();
const child = spawn(awsPath, ['s3', 'cp', params.localFile, s3Uri, '--metadata', JSON.stringify(params.s3Params.Metadata)], { env: allEnvs });
child.on('error', (err) => {
copyHelper.emit('error', err);
})
child.stdout.on('data', data => {
stdout.clearLine(0);
stdout.cursorTo(0);
// TODO: Refine this with better success message
if(data.includes("s3://")) {
stdout.write('Upload Complete!\n')
}
else {
stdout.write(`${data}`)
}
});
child.stderr.on('data', data => {
copyHelper.emit('stdError', data);
});
}
export function syncS3(params) {
var creds = {
AWS_ACCESS_KEY_ID: params.creds.AccessKeyId,
AWS_SECRET_ACCESS_KEY: params.creds.SecretAccessKey,
AWS_SESSION_TOKEN: params.creds.SessionToken,
AWS_REGION: process.env.POLLY_ENV ? pollyEnv.region[process.env.POLLY_ENV] : pollyEnv.region["prod"]
}
const allEnvs = {...process.env, ...creds};
const s3Uri = `s3://${params.s3Params.Bucket}` + "/" + `${params.s3Params.Prefix}`;
const awsPath = getAWSPath();
const child = spawn(awsPath, ['s3', 'sync', params.localDir, s3Uri, '--metadata', JSON.stringify(params.s3Params.Metadata)], { env: allEnvs });
child.on('error', (err) => {
copyHelper.emit('error', err);
})
child.stdout.on('data', data => {
stdout.clearLine(0);
stdout.cursorTo(0);
if(!data.includes("s3://")) {
stdout.write(`${data}`)
}
});
child.stderr.on('data', data => {
copyHelper.emit('stdError', data);
});
child.on('exit', (code) => {
if(code === 0) {
console.log('Sync complete!')
}
})
}
export function syncLocal(params) {
var creds = {
AWS_ACCESS_KEY_ID: params.creds.AccessKeyId,
AWS_SECRET_ACCESS_KEY: params.creds.SecretAccessKey,
AWS_SESSION_TOKEN: params.creds.SessionToken,
AWS_REGION: process.env.POLLY_ENV ? pollyEnv.region[process.env.POLLY_ENV] : pollyEnv.region["prod"]
}
const allEnvs = {...process.env, ...creds};
const s3Uri = `s3://${params.s3Params.Bucket}` + "/" + `${params.s3Params.Prefix}`;
const awsPath = getAWSPath();
const child = spawn(awsPath, ['s3', 'sync', s3Uri, params.localDir], { env: allEnvs });
child.on('error', (err) => {
copyHelper.emit('error', err);
})
child.stdout.on('data', data => {
stdout.clearLine(0);
stdout.cursorTo(0);
if(!data.includes("s3://")) {
stdout.write(`${data}`)
}
});
child.stderr.on('data', data => {
copyHelper.emit('stdError', data);
});
child.on('exit', (code) => {
if(code === 0 ) {
console.log('Sync complete!');
}
})
}
export { copyHelper }