-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathindex.js
101 lines (71 loc) · 3.03 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
'use strict';
/***********************************************************
* This magic code runs once per boot-up of lambda container
* and pulls all the electron and Xvfb binaries and stores
* them in /tmp/pck folder.
*
* Later on business logic should be called within xvfb.start()
* callback, so that when Nightmare calls Electron there is
* a virtual framebuffer available.
*
* Variable electronPath starts as undefined and is only
* overridden on Lambda environment. Which simplifies testing
* lambda in local environment.
*
***********************************************************/
console.log('Lambda executes global code upon container boot-up');
var electronPath, binaryPack, isOnLambda, Xvfb;
binaryPack = require('./lib/bootstrap/nightmare-lambda-pack');
Xvfb = require('./lib/bootstrap/xvfb');
isOnLambda = binaryPack.isRunningOnLambdaEnvironment;
electronPath = binaryPack.installNightmareOnLambdaEnvironment();
/** ************************************************************** */
var Snapper = require('./lib/nightmare-snapper');
var DEFAULT_BUCKET_NAME = 'my-fancy-bucket-777';
var DEFAULT_BUCKET_REGION = 'eu-west-1';
exports.handler = function(event, context){
// how do I know that by the time this was run, the pack was installed?
var url, xvfb, snapper;
if ( !event.url ){
context.done('Error please specify .url property on the event');
return;
}
url = event.url;
console.log(binaryPack._df()); // let's log `df -h` current disk usage
xvfb = new Xvfb({
xvfb_executable : '/tmp/pck/Xvfb', // path to Xvfb deployed from nightmare-lambda-pack
dry_run : !isOnLambda // when not on lambda, we assume you're on desktop environment and don't need Xvfb
})
xvfb.start((err, xvfbProcess) => {
if (err){
console.error('Error starting xvfb', err);
return context.done(err);
}
snapper = new Snapper({
destBucket: DEFAULT_BUCKET_NAME,
destBucketRegion: DEFAULT_BUCKET_REGION, // this is used to generate full screenshot url in form http://s3-region.amazonaws.com/key/screenshot-xxxx.png,
nightmareOptions: {
electronPath: electronPath,
show: false
}
});
console.log(`Initialized snapper with electronPath ${electronPath}`);
snapper.snap({ url: url })
.then((result) => {
console.log(result);
stopXvfbAndFinish(null, result);
}
, (err) => {
console.error(err);
stopXvfbAndFinish(err);
});
function stopXvfbAndFinish(err, result){
// do we have to wait? or will it be terminated automatically by lambda runtime (remember defunct processes?)?
// will it be killed when context.done() is called?
// xvfb.stop();
xvfb.stop((err) => {
context.done(err, result);
});
}
});
}