1 | 'use strict';
|
2 |
|
3 | var _templateObject = _taggedTemplateLiteral(['\n var aws = require(\'aws-sdk\')\n\n exports.', ' = function(event, context) {\n context.succeed({ message: \'hello world\' })\n }\n '], ['\n var aws = require(\'aws-sdk\')\n\n exports.', ' = function(event, context) {\n context.succeed({ message: \'hello world\' })\n }\n ']);
|
4 |
|
5 | var _dedent = require('dedent');
|
6 |
|
7 | var _dedent2 = _interopRequireDefault(_dedent);
|
8 |
|
9 | var _ = require('./');
|
10 |
|
11 | var _2 = _interopRequireDefault(_);
|
12 |
|
13 | var _promisify = require('./utils/promisify');
|
14 |
|
15 | var _promisify2 = _interopRequireDefault(_promisify);
|
16 |
|
17 | var _sanitize = require('./utils/sanitize');
|
18 |
|
19 | var _sanitize2 = _interopRequireDefault(_sanitize);
|
20 |
|
21 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
22 |
|
23 | function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
24 |
|
25 | var fs = require('fs');
|
26 | var path = require('path');
|
27 | var temp = require('temp').track();
|
28 | var uuid = require('node-uuid');
|
29 | var AWS = require('aws-sdk');
|
30 | var pify = require('pify');
|
31 | var archiver = require('archiver');
|
32 | var webpack = pify(require('webpack'));
|
33 |
|
34 | _2.default.prototype._findFunction = function (data, params) {
|
35 | return data.lambda.functions.find(function (func) {
|
36 | return func.functionName === params.functionName;
|
37 | });
|
38 | };
|
39 |
|
40 | _2.default.prototype.lambdaCreateFunction = function (params) {
|
41 | var _this = this;
|
42 |
|
43 | return Promise.resolve().then(function () {
|
44 | params = (0, _sanitize2.default)(params, {
|
45 | functionName: 'string',
|
46 | description: 'string?',
|
47 | filename: 'string',
|
48 | handler: 'string',
|
49 | role: 'string',
|
50 | memory: 'number',
|
51 | timeout: 'number'
|
52 | });
|
53 | }).then(function () {
|
54 | return _this.readConfig();
|
55 | }).then(function (data) {
|
56 | var func = _this._findFunction(data, params);
|
57 | if (func) {
|
58 | return Promise.reject(new Error('A function named ' + params.functionName + ' already exists'));
|
59 | }
|
60 | var functions = data.lambda.functions;
|
61 | functions.push(params);
|
62 | return _this.writeConfig(data);
|
63 | }).then(function () {
|
64 | var code = (0, _dedent2.default)(_templateObject, params.handler);
|
65 | return _this._writeFile(params.filename, code);
|
66 | }).then(function () {
|
67 | return _this.emit('lambda_changed');
|
68 | });
|
69 | };
|
70 |
|
71 | _2.default.prototype.lambdaEditFunction = function (params) {
|
72 | var _this2 = this;
|
73 |
|
74 | return this.readConfig().then(function (data) {
|
75 | var functions = data.lambda.functions;
|
76 | var func = _this2._findFunction(data, params);
|
77 | if (!func) {
|
78 | return Promise.reject(new Error('No function named ' + params.functionName + ' found'));
|
79 | }
|
80 | Object.assign(func, params);
|
81 | return _this2.writeConfig(data);
|
82 | }).then(function () {
|
83 | return _this2.emit('lambda_changed');
|
84 | });
|
85 | };
|
86 |
|
87 | _2.default.prototype.lambdaDeleteFunction = function (params) {
|
88 | var _this3 = this;
|
89 |
|
90 | return this.readConfig().then(function (data) {
|
91 | var functions = data.lambda.functions;
|
92 | var func = _this3._findFunction(data, params);
|
93 | if (!func) {
|
94 | return Promise.reject(new Error('No function named ' + params.functionName + ' found'));
|
95 | }
|
96 | functions.splice(functions.indexOf(func), 1);
|
97 | return _this3.writeConfig(data).then(function () {
|
98 | _this3._deleteFile(func.filename).catch(function (e) {
|
99 | return console.warn('Ignoring', e);
|
100 | });
|
101 | });
|
102 | }).then(function () {
|
103 | return _this3.emit('lambda_changed');
|
104 | });
|
105 | };
|
106 |
|
107 | _2.default.prototype.lambdaSyncFunction = function (functionName) {
|
108 | var _this4 = this;
|
109 |
|
110 | var lambda = new AWS.Lambda();
|
111 | var bundlefile = temp.path({ suffix: '.js' });
|
112 | var zipfile = temp.path({ suffix: '.zip' });
|
113 | var func, config;
|
114 |
|
115 | var job = this._random();
|
116 | this.emit('job:start', { id: job, name: 'Synching lambda function ' + functionName, steps: 4 });
|
117 |
|
118 | return this.readConfig().then(function (data) {
|
119 | config = data;
|
120 | func = data.lambda.functions.filter(function (func) {
|
121 | return func.functionName === functionName;
|
122 | })[0];
|
123 | if (!func) return Promise.reject(new Error('Function ' + functionName + ' not found'));
|
124 |
|
125 | _this4.emit('job:progress', { id: job, log: 'Bundling code' });
|
126 | return webpack({
|
127 | entry: [_this4._fullpath(func.filename)],
|
128 | output: {
|
129 | path: path.dirname(bundlefile),
|
130 | filename: path.basename(bundlefile),
|
131 | library: 'handler',
|
132 | libraryTarget: 'commonjs'
|
133 | },
|
134 | target: 'node',
|
135 | externals: {
|
136 | 'aws-sdk': 'commonjs aws-sdk'
|
137 | },
|
138 | module: {
|
139 | loaders: [{
|
140 | test: '.js',
|
141 | loaders: ['babel'],
|
142 | query: {
|
143 | presets: ['es2015']
|
144 | }
|
145 | }]
|
146 | }
|
147 | });
|
148 | }).then(function (stats) {
|
149 | _this4.emit('job:progress', { id: job, log: 'Zipping bundle' });
|
150 | func.hash = stats.hash;
|
151 | return pify(fs.readFile)(bundlefile, 'utf8');
|
152 | }).then(function (code) {
|
153 | return new Promise(function (resolve, reject) {
|
154 | var writeStream = fs.createWriteStream(zipfile);
|
155 | var zip = archiver('zip');
|
156 | zip.pipe(writeStream);
|
157 | zip.append(code, { name: 'index.js' });
|
158 | zip.finalize();
|
159 | writeStream.on('close', function () {
|
160 | fs.readFile(zipfile, function (err, data) {
|
161 | return err ? reject(err) : resolve(data);
|
162 | });
|
163 | });
|
164 | writeStream.on('error', reject);
|
165 | });
|
166 | }).then(function (data) {
|
167 | if (!func.functionArn) {
|
168 | _this4.emit('job:progress', { id: job, log: 'Creating lambda function' });
|
169 | var params = {
|
170 | Code: {
|
171 | ZipFile: data
|
172 | },
|
173 | FunctionName: func.functionName,
|
174 | Handler: 'index.' + func.handler,
|
175 | Role: func.role,
|
176 | Runtime: 'nodejs',
|
177 | Description: func.description,
|
178 | MemorySize: func.memory,
|
179 | Publish: false,
|
180 | Timeout: func.timeout
|
181 | };
|
182 | return (0, _promisify2.default)(lambda, 'createFunction', params).then(function (body) {
|
183 | func.functionArn = body.FunctionArn;
|
184 |
|
185 | _this4.emit('job:progress', { id: job, log: 'Adding permissions' });
|
186 | var params = {
|
187 | Action: 'lambda:InvokeFunction',
|
188 | FunctionName: func.functionName,
|
189 | Principal: 'apigateway.amazonaws.com',
|
190 | StatementId: uuid.v4()
|
191 | };
|
192 | return (0, _promisify2.default)(lambda, 'addPermission', params);
|
193 | });
|
194 | } else {
|
195 | _this4.emit('job:progress', { id: job, log: 'Updating function code' });
|
196 | var params = {
|
197 | ZipFile: data,
|
198 | FunctionName: func.functionName,
|
199 | Publish: false
|
200 | };
|
201 | return (0, _promisify2.default)(lambda, 'updateFunctionCode', params).then(function () {
|
202 | _this4.emit('job:progress', { id: job, log: 'Updating function configuration' });
|
203 | var params = {
|
204 | FunctionName: func.functionName,
|
205 | Handler: 'index.handler',
|
206 | Role: func.role,
|
207 | Description: func.description,
|
208 | MemorySize: func.memorySize,
|
209 | Timeout: func.timeout
|
210 | };
|
211 | return (0, _promisify2.default)(lambda, 'updateFunctionConfiguration', params);
|
212 | });
|
213 | }
|
214 | }).then(function () {
|
215 | return _this4.writeConfig(config);
|
216 | }).then(function () {
|
217 | return _this4.emit('job:succees', { id: job });
|
218 | }).catch(function (e) {
|
219 | _this4.emit('job:fail', { id: job, error: e });
|
220 | return Promise.reject(e);
|
221 | });
|
222 | };
|
223 |
|
\ | No newline at end of file |