-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
executable file
·157 lines (132 loc) · 4.75 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/usr/bin/env node
"use strict";
const AWS = require('aws-sdk');
AWS.config.update({
region: 'eu-west-1'
});
const fs = require('fs');
const colors = require('colors');
const minimist = require('minimist');
const homedir = require('os').homedir();
const _ = require('lodash');
const getBranches = require('./getBranches');
const get_body = require('./get_body');
let alias;
const params = {};
const args = minimist(process.argv.slice(2), {
boolean: ['published', 'verbose']
});
/**
* read - Promisified read
*
* @param {string} name Path to file
* @param {string} format
* @return {Promise} resolves to the contents of the file(json parsed)
*/
function read(name, format) {
return new Promise(function(resolve, reject) {
fs.readFile(name, format, (err, data) => err ? reject(err) : resolve(JSON.parse(data.toString('utf-8'))));
});
}
/**
* write - Promisified write
*
* @param {string} path Path to file
* @param {string} contents Contents of file
* @return {Promise}
*/
function write(path, contents) {
return new Promise(function(resolve, reject) {
fs.writeFile(path, contents, 'utf-8', (err) => err ? reject(err) : resolve());
});
}
Promise.all([
read('package.json', 'utf-8'),
read(homedir + '/.uplambda.json', 'utf-8')
.catch(err => {
if (err.code != 'ENOENT') return Promise.reject(err);
else return Promise.reject(`Config file ${homedir}/.uplambda.json was not found. Run "uplambda --account --add" to init`);
})
])
.then(res => {
const [package_json, config] = res;
// get credenetials
let account;
let aws_access_key_id;
let aws_secret_access_key;
const tmp_accounts = _.filter(config, {
active: true
});
if (tmp_accounts.length === 0) return Promise.reject(`Invalid ${homedir}/.uplambda.json. At least one account must be active at a time. Run "uplambda --account --use <your_account_alias>" to choose which account to enable`);
if (tmp_accounts.length !== 1) return Promise.reject(`Invalid ${homedir}/.uplambda.json. Only one account can be active at a time. Run "uplambda --account --use <your_account_alias>" to choose which account to enable`);
else {
account = tmp_accounts[0].account;
aws_access_key_id = tmp_accounts[0].aws_access_key_id;
aws_secret_access_key = tmp_accounts[0].aws_secret_access_key;
}
const lambda = new AWS.Lambda({
accessKeyId: aws_access_key_id,
secretAccessKey: aws_secret_access_key,
region: account.match(/^(.+):/)[1]
});
params.FunctionName = package_json.name;
alias = package_json.lambdaAlias;
return getBranches()
// read get payload
.then(body => {
if (alias) {
if (body.currentBranch == alias && args.published) {
console.log(colors.blue('Running lambda alias:', alias));
params.Qualifier = alias;
} else console.log(colors.blue('Running lambda $LATEST'));
} else console.log(colors.blue('Running lambda $LATEST, no lambdaAlias found in package.json'));
// if we have payload
if (args.payload) {
return read(args.payload, 'utf-8')
.then(payloadFile => {
if (args.name) payloadFile = payloadFile[args.name];
if (args.published) {
if (alias) {
payloadFile.requestContext = {
stage: alias
};
} else return Promise.reject('Lambda alias does not exist, cannot run published version');
} else {
payloadFile.requestContext = {
stage: args.simver || 'dev'
};
console.log('\n' + colors.blue(`Simulating version:${payloadFile.requestContext.stage}`));
}
params.Payload = JSON.stringify(payloadFile);
return Promise.resolve();
});
} else return Promise.resolve();
})
// invoke lambda
.then(() => lambda.invoke(params).promise())
// write to outfile, log
.then(res => {
// console.log('res:', res);
console.log('StatusCode:', res.StatusCode);
let Payload;
try {
Payload = JSON.parse(res.Payload);
} catch (e) {
Payload = res.Payload;
}
if ((Payload.isBase64Encoded || Payload['Content-Encoding'] === 'gzip') && Payload.body) return get_body(Payload);
else return Payload;
})
.then(Payload => {
if (args.verbose) console.log('Response:', Payload);
return write('outfile.json', JSON.stringify(Payload, null, 2));
})
.then(() => {
console.log(colors.green('Success'));
process.exit();
});
})
.catch(err => {
console.log(colors.red(err));
process.exit(1);
});