UNPKG

7.44 kBJavaScriptView Raw
1'use strict';
2
3var _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
5var _dedent = require('dedent');
6
7var _dedent2 = _interopRequireDefault(_dedent);
8
9var _ = require('./');
10
11var _2 = _interopRequireDefault(_);
12
13var _promisify = require('./utils/promisify');
14
15var _promisify2 = _interopRequireDefault(_promisify);
16
17var _sanitize = require('./utils/sanitize');
18
19var _sanitize2 = _interopRequireDefault(_sanitize);
20
21function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
23function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
24
25var fs = require('fs');
26var path = require('path');
27var temp = require('temp').track();
28var uuid = require('node-uuid');
29var AWS = require('aws-sdk');
30var pify = require('pify');
31var archiver = require('archiver');
32var 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//# sourceMappingURL=lambda.js.map
\No newline at end of file