jets 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/Gemfile.lock +4 -4
- data/README.md +2 -2
- data/lib/jets.rb +3 -4
- data/lib/jets/application.rb +13 -2
- data/lib/jets/builders.rb +3 -0
- data/lib/jets/builders/code_builder.rb +22 -89
- data/lib/jets/builders/code_size.rb +55 -0
- data/lib/jets/builders/gem_replacer.rb +22 -1
- data/lib/jets/builders/handler_generator.rb +31 -5
- data/lib/jets/builders/lambda_layer.rb +50 -0
- data/lib/jets/builders/md5.rb +10 -5
- data/lib/jets/builders/md5_zip.rb +1 -0
- data/lib/jets/builders/purger.rb +35 -0
- data/lib/jets/builders/rack_packager.rb +25 -5
- data/lib/jets/builders/rackup_wrappers/rackup +1 -5
- data/lib/jets/builders/ruby_packager.rb +25 -27
- data/lib/jets/builders/shim_vars/app.rb +3 -3
- data/lib/jets/builders/shim_vars/base.rb +9 -4
- data/lib/jets/builders/shim_vars/shared.rb +2 -2
- data/lib/jets/builders/templates/handler.rb +7 -0
- data/lib/jets/builders/tidy.rb +4 -3
- data/lib/jets/builders/util.rb +11 -3
- data/lib/jets/cfn/builders/base_child_builder.rb +6 -3
- data/lib/jets/cfn/builders/interface.rb +1 -1
- data/lib/jets/cfn/builders/parent_builder.rb +5 -0
- data/lib/jets/commands/build.rb +4 -2
- data/lib/jets/commands/help/gems/check.md +1 -1
- data/lib/jets/commands/main.rb +1 -1
- data/lib/jets/commands/new.rb +4 -2
- data/lib/jets/commands/sequence.rb +1 -1
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +2 -2
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +0 -5
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +2 -2
- data/lib/jets/commands/templates/skeleton/config/environments/development.rb +2 -1
- data/lib/jets/commands/templates/skeleton/config/environments/production.rb +2 -3
- data/lib/jets/commands/upgrade/v1.rb +21 -0
- data/lib/jets/controller/renderers/template_renderer.rb +1 -1
- data/lib/jets/controller/rendering.rb +1 -4
- data/lib/jets/core.rb +45 -6
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +32 -34
- data/lib/jets/mega/request.rb +11 -0
- data/lib/jets/overrides/lambda.rb +1 -0
- data/lib/jets/overrides/lambda/marshaller.rb +31 -0
- data/lib/jets/overrides/rails.rb +4 -0
- data/lib/jets/{rails_overrides → overrides/rails}/asset_tag_helper.rb +0 -0
- data/lib/jets/{rails_overrides → overrides/rails}/common_methods.rb +0 -0
- data/lib/jets/{rails_overrides → overrides/rails}/rendering_helper.rb +0 -0
- data/lib/jets/{rails_overrides → overrides/rails}/url_helper.rb +0 -0
- data/lib/jets/poly_fun/base_executor.rb +1 -1
- data/lib/jets/preheat.rb +1 -0
- data/lib/jets/processors/main_processor.rb +3 -10
- data/lib/jets/{server.rb → rack_server.rb} +31 -2
- data/lib/jets/resource.rb +1 -1
- data/lib/jets/resource/api_gateway/base_path/function.rb +1 -1
- data/lib/jets/resource/child_stack/app_class.rb +10 -4
- data/lib/jets/resource/lambda.rb +5 -0
- data/lib/jets/resource/{function.rb → lambda/function.rb} +8 -6
- data/lib/jets/resource/{function → lambda/function}/environment.rb +1 -1
- data/lib/jets/resource/lambda/gem_layer.rb +17 -0
- data/lib/jets/resource/lambda/layer_version.rb +46 -0
- data/lib/jets/tmp_loader.rb +52 -0
- data/lib/jets/version.rb +1 -1
- data/{README → readme}/prerelease.md +0 -0
- data/{README → readme}/testing.md +5 -0
- data/vendor/jets-gems/lib/jets/gems.rb +1 -1
- data/vendor/jets-gems/lib/jets/gems/check.rb +7 -7
- data/vendor/jets-gems/lib/jets/gems/exist.rb +5 -5
- data/vendor/jets-gems/lib/jets/gems/extract/base.rb +4 -11
- data/vendor/jets-gems/lib/jets/gems/extract/gem.rb +15 -8
- data/vendor/jets-gems/lib/jets/gems/extract/ruby.rb +19 -10
- metadata +22 -15
- data/lib/jets/builders/templates/handler.js +0 -9
- data/lib/jets/builders/templates/shim.js +0 -275
- data/lib/jets/rails_overrides.rb +0 -4
- data/lib/jets/ruby_server.rb +0 -148
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-12-
|
11
|
+
date: 2018-12-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -437,8 +437,6 @@ files:
|
|
437
437
|
- LICENSE.txt
|
438
438
|
- Procfile
|
439
439
|
- README.md
|
440
|
-
- README/prerelease.md
|
441
|
-
- README/testing.md
|
442
440
|
- Rakefile
|
443
441
|
- bin/release
|
444
442
|
- buildspec.yml
|
@@ -452,10 +450,13 @@ files:
|
|
452
450
|
- lib/jets/booter.rb
|
453
451
|
- lib/jets/builders.rb
|
454
452
|
- lib/jets/builders/code_builder.rb
|
453
|
+
- lib/jets/builders/code_size.rb
|
455
454
|
- lib/jets/builders/gem_replacer.rb
|
456
455
|
- lib/jets/builders/handler_generator.rb
|
456
|
+
- lib/jets/builders/lambda_layer.rb
|
457
457
|
- lib/jets/builders/md5.rb
|
458
458
|
- lib/jets/builders/md5_zip.rb
|
459
|
+
- lib/jets/builders/purger.rb
|
459
460
|
- lib/jets/builders/rack_packager.rb
|
460
461
|
- lib/jets/builders/rackup_wrappers/rackup
|
461
462
|
- lib/jets/builders/rackup_wrappers/rackup.rb
|
@@ -466,8 +467,7 @@ files:
|
|
466
467
|
- lib/jets/builders/shim_vars/app.rb
|
467
468
|
- lib/jets/builders/shim_vars/base.rb
|
468
469
|
- lib/jets/builders/shim_vars/shared.rb
|
469
|
-
- lib/jets/builders/templates/handler.
|
470
|
-
- lib/jets/builders/templates/shim.js
|
470
|
+
- lib/jets/builders/templates/handler.rb
|
471
471
|
- lib/jets/builders/tidy.rb
|
472
472
|
- lib/jets/builders/util.rb
|
473
473
|
- lib/jets/camelizer.rb
|
@@ -665,6 +665,13 @@ files:
|
|
665
665
|
- lib/jets/middleware/layer.rb
|
666
666
|
- lib/jets/middleware/stack.rb
|
667
667
|
- lib/jets/naming.rb
|
668
|
+
- lib/jets/overrides/lambda.rb
|
669
|
+
- lib/jets/overrides/lambda/marshaller.rb
|
670
|
+
- lib/jets/overrides/rails.rb
|
671
|
+
- lib/jets/overrides/rails/asset_tag_helper.rb
|
672
|
+
- lib/jets/overrides/rails/common_methods.rb
|
673
|
+
- lib/jets/overrides/rails/rendering_helper.rb
|
674
|
+
- lib/jets/overrides/rails/url_helper.rb
|
668
675
|
- lib/jets/poly_fun.rb
|
669
676
|
- lib/jets/poly_fun/base_executor.rb
|
670
677
|
- lib/jets/poly_fun/lambda_executor.rb
|
@@ -676,11 +683,7 @@ files:
|
|
676
683
|
- lib/jets/processors.rb
|
677
684
|
- lib/jets/processors/deducer.rb
|
678
685
|
- lib/jets/processors/main_processor.rb
|
679
|
-
- lib/jets/
|
680
|
-
- lib/jets/rails_overrides/asset_tag_helper.rb
|
681
|
-
- lib/jets/rails_overrides/common_methods.rb
|
682
|
-
- lib/jets/rails_overrides/rendering_helper.rb
|
683
|
-
- lib/jets/rails_overrides/url_helper.rb
|
686
|
+
- lib/jets/rack_server.rb
|
684
687
|
- lib/jets/rdoc.rb
|
685
688
|
- lib/jets/resource.rb
|
686
689
|
- lib/jets/resource/api_gateway.rb
|
@@ -710,8 +713,6 @@ files:
|
|
710
713
|
- lib/jets/resource/config/managed_rule.rb
|
711
714
|
- lib/jets/resource/events.rb
|
712
715
|
- lib/jets/resource/events/rule.rb
|
713
|
-
- lib/jets/resource/function.rb
|
714
|
-
- lib/jets/resource/function/environment.rb
|
715
716
|
- lib/jets/resource/iam.rb
|
716
717
|
- lib/jets/resource/iam/application_role.rb
|
717
718
|
- lib/jets/resource/iam/base_role_definition.rb
|
@@ -719,6 +720,11 @@ files:
|
|
719
720
|
- lib/jets/resource/iam/function_role.rb
|
720
721
|
- lib/jets/resource/iam/managed_policy.rb
|
721
722
|
- lib/jets/resource/iam/policy_document.rb
|
723
|
+
- lib/jets/resource/lambda.rb
|
724
|
+
- lib/jets/resource/lambda/function.rb
|
725
|
+
- lib/jets/resource/lambda/function/environment.rb
|
726
|
+
- lib/jets/resource/lambda/gem_layer.rb
|
727
|
+
- lib/jets/resource/lambda/layer_version.rb
|
722
728
|
- lib/jets/resource/permission.rb
|
723
729
|
- lib/jets/resource/replacer.rb
|
724
730
|
- lib/jets/resource/route53.rb
|
@@ -728,11 +734,9 @@ files:
|
|
728
734
|
- lib/jets/resource/standardizer.rb
|
729
735
|
- lib/jets/route.rb
|
730
736
|
- lib/jets/router.rb
|
731
|
-
- lib/jets/ruby_server.rb
|
732
737
|
- lib/jets/rule.rb
|
733
738
|
- lib/jets/rule/base.rb
|
734
739
|
- lib/jets/rule/dsl.rb
|
735
|
-
- lib/jets/server.rb
|
736
740
|
- lib/jets/stack.rb
|
737
741
|
- lib/jets/stack/builder.rb
|
738
742
|
- lib/jets/stack/definition.rb
|
@@ -751,9 +755,12 @@ files:
|
|
751
755
|
- lib/jets/stack/parameter/dsl.rb
|
752
756
|
- lib/jets/stack/resource.rb
|
753
757
|
- lib/jets/stack/resource/dsl.rb
|
758
|
+
- lib/jets/tmp_loader.rb
|
754
759
|
- lib/jets/turbine.rb
|
755
760
|
- lib/jets/util.rb
|
756
761
|
- lib/jets/version.rb
|
762
|
+
- readme/prerelease.md
|
763
|
+
- readme/testing.md
|
757
764
|
- vendor/dynomite/CHANGELOG.md
|
758
765
|
- vendor/dynomite/Gemfile
|
759
766
|
- vendor/dynomite/Gemfile.lock
|
@@ -1,9 +0,0 @@
|
|
1
|
-
'use strict';
|
2
|
-
|
3
|
-
const shim = require("handlers/shim.js");
|
4
|
-
|
5
|
-
shim.once(); // runs in lambda execution context
|
6
|
-
|
7
|
-
<% @vars.functions.each do |function_name| -%>
|
8
|
-
exports.<%= function_name %> = shim.handler("<%= @vars.handler_for(function_name) %>");
|
9
|
-
<% end -%>
|
@@ -1,275 +0,0 @@
|
|
1
|
-
const TMP_LOG_PATH = '/tmp/shim-subprocess.log';
|
2
|
-
const JETS_DEBUG = process.env.JETS_DEBUG; // set JETS_DEBUG=1 to see more debugging info
|
3
|
-
const JETS_OUTPUT = '/tmp/jets-output.log';
|
4
|
-
const S3_BUCKET = '<%= @vars.s3_bucket %>';
|
5
|
-
<% if Jets.rack? -%>
|
6
|
-
const RACK_ZIP = '<%= @vars.rack_zip %>'; // jets/code/rack-checksum.zip
|
7
|
-
<% end -%>
|
8
|
-
<% if Jets.lazy_load? -%>
|
9
|
-
const BUNDLED_ZIP = '<%= @vars.bundled_zip %>'; // /tmp/bundled-checksum.zip
|
10
|
-
<% end -%>
|
11
|
-
|
12
|
-
|
13
|
-
const spawn = require('child_process').spawn;
|
14
|
-
const fs = require('fs');
|
15
|
-
const readline = require('readline');
|
16
|
-
const subprocess_out = fs.openSync(TMP_LOG_PATH, 'a');
|
17
|
-
const subprocess_err = fs.openSync(TMP_LOG_PATH, 'a');
|
18
|
-
const { exec } = require('child_process');
|
19
|
-
const AWS = require('aws-sdk/global');
|
20
|
-
const S3 = require('aws-sdk/clients/s3'); // import individual service
|
21
|
-
const net = require('net');
|
22
|
-
|
23
|
-
////////////////////////////////////////////////////////////////////////////////
|
24
|
-
// util methods
|
25
|
-
const sh = async (command, args) => {
|
26
|
-
var promise = new Promise(function(resolve, reject) {
|
27
|
-
log(`=> ${command}`);
|
28
|
-
exec(command, (err, stdout, stderr) => {
|
29
|
-
log(`stdout: ${stdout}`);
|
30
|
-
log(`stderr: ${stderr}`);
|
31
|
-
if (err) {
|
32
|
-
resolve({success: false, command: command});
|
33
|
-
} else {
|
34
|
-
resolve({success: true, command: command});
|
35
|
-
}
|
36
|
-
});
|
37
|
-
});
|
38
|
-
return promise;
|
39
|
-
};
|
40
|
-
|
41
|
-
const download = async (key, dest) => {
|
42
|
-
var promise = new Promise(function(resolve, reject) {
|
43
|
-
var s3 = new AWS.S3();
|
44
|
-
var params = {Bucket: S3_BUCKET, Key: key};
|
45
|
-
var file = require('fs').createWriteStream(dest);
|
46
|
-
var stream = s3.getObject(params).createReadStream();
|
47
|
-
var pipe = stream.pipe(file);
|
48
|
-
file.on('finish', function () {
|
49
|
-
resolve({success: true, pipe: pipe});
|
50
|
-
});
|
51
|
-
});
|
52
|
-
return promise;
|
53
|
-
};
|
54
|
-
|
55
|
-
const downloadAndExtract = async (zip_file, folder_dest) => {
|
56
|
-
var s3_key = `jets/code/${zip_file}`; // jets/code/bundled-checksum.zip
|
57
|
-
var download_path = `/tmp/${zip_file}`; // /tmp/bundled-checksum.zip
|
58
|
-
|
59
|
-
await download(s3_key, download_path);
|
60
|
-
await sh(`unzip -qo ${download_path} -d ${folder_dest}`);
|
61
|
-
// await sh(`ls ${folder_dest}*`);
|
62
|
-
};
|
63
|
-
|
64
|
-
// Clean out files to prevent confusing double output when debugging.
|
65
|
-
// Also clean out the file whenever done printing out the output.
|
66
|
-
function truncate(path) {
|
67
|
-
if (fs.existsSync(path)) {
|
68
|
-
fs.truncateSync(path);
|
69
|
-
}
|
70
|
-
}
|
71
|
-
|
72
|
-
// Produces an Error object that displays in the AWS Lambda test console nicely.
|
73
|
-
// The backtrace are the ruby lines, not the nodejs shim error lines.
|
74
|
-
// The json payload in the Lambda console looks something like this:
|
75
|
-
//
|
76
|
-
// {
|
77
|
-
// "errorMessage": "RubyError: RuntimeError: error in submethod",
|
78
|
-
// "errorType": "RubyError",
|
79
|
-
// "stackTrace": [
|
80
|
-
// [
|
81
|
-
// "line1",
|
82
|
-
// "line2",
|
83
|
-
// "line3"
|
84
|
-
// ]
|
85
|
-
// ]
|
86
|
-
// }
|
87
|
-
//
|
88
|
-
function rubyError(resp) {
|
89
|
-
var name = resp["errorType"];
|
90
|
-
var message = resp["errorMessage"];
|
91
|
-
var stack = resp["stackTrace"];
|
92
|
-
stack.unshift(message); // JS error includes the error message at the top of the stacktrac also
|
93
|
-
stack = stack.join("\n");
|
94
|
-
|
95
|
-
var error = new Error(message);
|
96
|
-
error.name = name;
|
97
|
-
error.stack = stack;
|
98
|
-
return error;
|
99
|
-
}
|
100
|
-
|
101
|
-
// On AWS Lambda, we can log to either stdout or stderr and we're okay.
|
102
|
-
// But locally when we're testing the shim, the log output can mess up piping
|
103
|
-
// to jq. So not logging to stdout because when testing this shim locally the
|
104
|
-
// stdout output messes up a pipe to jq.
|
105
|
-
function log(text, level="info") {
|
106
|
-
if (level == "info" && JETS_DEBUG) {
|
107
|
-
// only log if JETS_DEBUG is set
|
108
|
-
console.error(text);
|
109
|
-
} else if (level == "debug") {
|
110
|
-
// always log if "debug" passed into method
|
111
|
-
console.error(text);
|
112
|
-
}
|
113
|
-
}
|
114
|
-
|
115
|
-
////////////////////////////////////////////////////////////////////////////////
|
116
|
-
// Logic that runs once in the lambda execution context
|
117
|
-
|
118
|
-
const downloadTmp = async () => {
|
119
|
-
var start = Date.now();
|
120
|
-
|
121
|
-
<% if Jets.lazy_load? -%>
|
122
|
-
var bundled = downloadAndExtract(BUNDLED_ZIP, '/tmp/bundled');
|
123
|
-
<% end -%>
|
124
|
-
<% if Jets.rack? -%>
|
125
|
-
var rack = downloadAndExtract(RACK_ZIP, '/tmp/rack');
|
126
|
-
<% end -%>
|
127
|
-
<% if Jets.lazy_load? -%>
|
128
|
-
// Interestingly, doesnt seem to speed up download with parallization below.
|
129
|
-
// Think this is because node does not take advantage of multiple cores?
|
130
|
-
// Leaving this in place because speed seems the same as doing the await
|
131
|
-
// in serial and hope it is fast in the future.
|
132
|
-
await bundled;
|
133
|
-
<% end -%>
|
134
|
-
<% if Jets.rack? -%>
|
135
|
-
await rack;
|
136
|
-
<% end -%>
|
137
|
-
|
138
|
-
var took = Date.now() - start;
|
139
|
-
log(`Download /tmp time: ${took}`);
|
140
|
-
};
|
141
|
-
|
142
|
-
const rubyServer = () => {
|
143
|
-
// start tcp server and detach
|
144
|
-
const subprocess = spawn('bin/ruby_server', {
|
145
|
-
detached: true,
|
146
|
-
stdio: [ 'ignore', subprocess_out, subprocess_err ]
|
147
|
-
});
|
148
|
-
subprocess.on('error', function(err) {
|
149
|
-
log('bin/ruby_server error', err);
|
150
|
-
});
|
151
|
-
|
152
|
-
subprocess.on('close', function(exit_code) {
|
153
|
-
log("Subprocess was shut down or deattached!");
|
154
|
-
});
|
155
|
-
|
156
|
-
// prevent the parent from waiting for a subprocess to exit
|
157
|
-
// https://nodejs.org/api/child_process.html
|
158
|
-
subprocess.unref();
|
159
|
-
};
|
160
|
-
|
161
|
-
// once runs in lambda execution context
|
162
|
-
const once = async () => {
|
163
|
-
// Uncomment fake run once locally. No need to do this on real lambda environment.
|
164
|
-
// var filename = '/tmp/once.txt';
|
165
|
-
// if (fs.existsSync(filename)) {
|
166
|
-
// log("fake run only once. /tmp/once.txt exists. remove to run once again.");
|
167
|
-
// return;
|
168
|
-
// }
|
169
|
-
// fs.closeSync(fs.openSync(filename, 'w'));
|
170
|
-
|
171
|
-
<% if Jets.rack? || Jets.lazy_load? -%>
|
172
|
-
await downloadTmp();
|
173
|
-
<% end -%>
|
174
|
-
// The server related methods are fire and forget.
|
175
|
-
// Not using await here because had trouble resolving the promise on client.connect
|
176
|
-
rubyServer(); // no await
|
177
|
-
};
|
178
|
-
|
179
|
-
// currying function to make handler code prettier
|
180
|
-
function handler(full_handler_name) {
|
181
|
-
return function(event, context, callback) {
|
182
|
-
request(event, context, full_handler_name, callback);
|
183
|
-
};
|
184
|
-
}
|
185
|
-
|
186
|
-
////////////////////////////////////////////////////////////////////////////////
|
187
|
-
// main logic for handler
|
188
|
-
function request(event, context, handler, callback) {
|
189
|
-
truncate(JETS_OUTPUT);
|
190
|
-
truncate(TMP_LOG_PATH);
|
191
|
-
|
192
|
-
log("event:");
|
193
|
-
log(event);
|
194
|
-
log("context:");
|
195
|
-
log(context);
|
196
|
-
var client = new net.Socket();
|
197
|
-
client.connect(8080, '127.0.0.01', function() {
|
198
|
-
log('Connected to socket');
|
199
|
-
client.write(JSON.stringify(event));
|
200
|
-
client.write("\r\n"); // important: \r\n is how server knows input is done
|
201
|
-
client.write(JSON.stringify(context));
|
202
|
-
client.write("\r\n"); // important: \r\n is how server knows input is done
|
203
|
-
client.write(handler);
|
204
|
-
client.write("\r\n"); // important: \r\n is how server knows input is done
|
205
|
-
});
|
206
|
-
|
207
|
-
// string concatation in javascript is faster than array concatation
|
208
|
-
// http://bit.ly/2gBMDs6
|
209
|
-
var response_buffer = ""; // response buffer
|
210
|
-
client.on('data', function(buffer) {
|
211
|
-
log('Received data from socket: ' + buffer);
|
212
|
-
response_buffer += buffer;
|
213
|
-
});
|
214
|
-
|
215
|
-
client.on('close', function() {
|
216
|
-
log('Socket connection closed');
|
217
|
-
// If server is not yet running, socket immediately closes and response_buffer
|
218
|
-
// is still empty. Return right away for this case, so request can retry.
|
219
|
-
if (response_buffer == "") {
|
220
|
-
return;
|
221
|
-
}
|
222
|
-
|
223
|
-
if (fs.existsSync(JETS_OUTPUT)) {
|
224
|
-
// Thanks: https://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js
|
225
|
-
var rd = readline.createInterface({
|
226
|
-
input: fs.createReadStream(JETS_OUTPUT),
|
227
|
-
// output: process.stdout,
|
228
|
-
console: false
|
229
|
-
});
|
230
|
-
|
231
|
-
rd.on('line', (line) => {
|
232
|
-
// Important to use console.error in case locally testing shim or we see
|
233
|
-
// stdout "twice", once from here and once from ruby-land and it's confusing.
|
234
|
-
// AWS lambda will write console.error and console.log to CloudWatch.
|
235
|
-
console.error(line); // output to AWS Lambda Logs
|
236
|
-
}).on('close', () => {
|
237
|
-
truncate(JETS_OUTPUT); // done reporting output, clear out file again
|
238
|
-
});
|
239
|
-
}
|
240
|
-
|
241
|
-
var resp = JSON.parse(response_buffer);
|
242
|
-
if (resp && resp["errorMessage"]) {
|
243
|
-
// Customize error object for lambda format
|
244
|
-
var error = rubyError(resp);
|
245
|
-
callback(error);
|
246
|
-
} else {
|
247
|
-
callback(null, resp);
|
248
|
-
}
|
249
|
-
client.destroy(); // kill client after server's response
|
250
|
-
});
|
251
|
-
|
252
|
-
client.on('error', function(error) {
|
253
|
-
log("Socket error:");
|
254
|
-
log(error);
|
255
|
-
log("Retrying request");
|
256
|
-
setTimeout(function() {
|
257
|
-
if (fs.existsSync(TMP_LOG_PATH)) {
|
258
|
-
var contents = fs.readFileSync(TMP_LOG_PATH, 'utf8');
|
259
|
-
if (contents != "") {
|
260
|
-
log("subprocess output:", "debug");
|
261
|
-
log(contents, "debug");
|
262
|
-
}
|
263
|
-
}
|
264
|
-
truncate(TMP_LOG_PATH);
|
265
|
-
|
266
|
-
log("Retrying request NOW");
|
267
|
-
request(event, context, handler, callback);
|
268
|
-
}, 500);
|
269
|
-
});
|
270
|
-
}
|
271
|
-
|
272
|
-
module.exports = {
|
273
|
-
handler: handler,
|
274
|
-
once: once
|
275
|
-
};
|
data/lib/jets/rails_overrides.rb
DELETED
data/lib/jets/ruby_server.rb
DELETED
@@ -1,148 +0,0 @@
|
|
1
|
-
require 'socket'
|
2
|
-
require 'json'
|
3
|
-
require 'stringio'
|
4
|
-
|
5
|
-
# https://ruby-doc.org/stdlib-2.3.0/libdoc/socket/rdoc/TCPServer.html
|
6
|
-
# https://stackoverflow.com/questions/806267/how-to-fire-and-forget-a-subprocess
|
7
|
-
#
|
8
|
-
# There's a generated bin/ruby_server which calls bin/ruby_server.rb as part of the
|
9
|
-
# starter project template. Usage:
|
10
|
-
#
|
11
|
-
# bin/ruby_server # background
|
12
|
-
# FOREGROUND=1 bin/ruby_server # foreground
|
13
|
-
#
|
14
|
-
module Jets
|
15
|
-
class RubyServer
|
16
|
-
PORT = 8080
|
17
|
-
|
18
|
-
def run
|
19
|
-
Jets.boot(stringio: true) # outside of child process for COW
|
20
|
-
|
21
|
-
# INT - ^C
|
22
|
-
trap('INT') do
|
23
|
-
puts "Shutting down ruby_server.rb..."
|
24
|
-
FileUtils.rm_f("/tmp/jets-rackup.pid") # remove the rack subprocess pid in case it exists
|
25
|
-
sleep 0.1
|
26
|
-
exit
|
27
|
-
end
|
28
|
-
|
29
|
-
if ENV['FOREGROUND'] # Usage above
|
30
|
-
# start_rack_server # commented out because we expect user to start the rack server in the foreground
|
31
|
-
serve # ruby_server
|
32
|
-
return
|
33
|
-
end
|
34
|
-
|
35
|
-
# Reaching here means we'll run the server in the "background"
|
36
|
-
pid = Process.fork
|
37
|
-
|
38
|
-
if pid.nil? # we're in child process
|
39
|
-
start_rack_server
|
40
|
-
serve # ruby_server
|
41
|
-
else # we're in parent process
|
42
|
-
# Detach main jets ruby server
|
43
|
-
Process.detach(pid) # dettached but still in the "foreground" since server loop runs in the foreground
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# Megamode support
|
48
|
-
def start_rack_server
|
49
|
-
return unless Jets.rack?
|
50
|
-
|
51
|
-
# Fire and forget for concurrent, will wait with wait_for_rack_socket
|
52
|
-
Thread.new do
|
53
|
-
Jets::Server.start
|
54
|
-
end
|
55
|
-
|
56
|
-
wait_for_rack_socket # blocks until rack server is up
|
57
|
-
end
|
58
|
-
|
59
|
-
# blocks until rack server is up
|
60
|
-
def wait_for_rack_socket
|
61
|
-
return unless Jets.rack?
|
62
|
-
|
63
|
-
retries = 0
|
64
|
-
max_retries = 30 # 15 seconds at a delay of 0.5s
|
65
|
-
delay = 0.5
|
66
|
-
if ENV['C9_USER'] # overrides for local testing
|
67
|
-
max_retries = 3
|
68
|
-
delay = 3
|
69
|
-
end
|
70
|
-
begin
|
71
|
-
server = TCPSocket.new('localhost', 9292)
|
72
|
-
server.close
|
73
|
-
rescue Errno::ECONNREFUSED
|
74
|
-
puts "Unable to connect to localhost:9292. Delay for #{delay} and will try to connect again." if ENV['JETS_DEBUG']
|
75
|
-
sleep(delay)
|
76
|
-
retries += 1
|
77
|
-
if retries < max_retries
|
78
|
-
retry
|
79
|
-
else
|
80
|
-
puts "Giving up on trying to connect to localhost:9292"
|
81
|
-
return false
|
82
|
-
end
|
83
|
-
end
|
84
|
-
puts "Connected to localhost:9292 successfully"
|
85
|
-
true
|
86
|
-
end
|
87
|
-
|
88
|
-
# runs in the child process
|
89
|
-
def serve
|
90
|
-
server = TCPServer.new(PORT) # Server bind to port 8080
|
91
|
-
puts "Ruby server started on port #{PORT}" if ENV['FOREGROUND'] || ENV['JETS_DEBUG'] || ENV['C9_USER']
|
92
|
-
|
93
|
-
loop do
|
94
|
-
client = server.accept # Wait for a client to connect
|
95
|
-
|
96
|
-
input_completed, event, context, handler = nil, nil, nil
|
97
|
-
unless input_completed
|
98
|
-
event = client.gets&.strip # text or nil
|
99
|
-
context = client.gets&.strip # text or nil
|
100
|
-
handler = client.gets&.strip # text or nil
|
101
|
-
# The event is nil when a client connects and immediately disconnects without sending data
|
102
|
-
if event.nil?
|
103
|
-
# puts "event was nil" # uncomment to debug
|
104
|
-
next
|
105
|
-
end
|
106
|
-
|
107
|
-
input_completed = true
|
108
|
-
end
|
109
|
-
|
110
|
-
# puts "ruby_server.rb event: #{event.inspect}"
|
111
|
-
# puts "ruby_server.rb context: #{context.inspect}"
|
112
|
-
|
113
|
-
result = event['_prewarm'] ?
|
114
|
-
prewarm_request(event) :
|
115
|
-
standard_request(event, context, handler)
|
116
|
-
|
117
|
-
Jets::IO.flush # flush output and write to disk for node shim
|
118
|
-
|
119
|
-
client.puts(result)
|
120
|
-
client.close
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
def prewarm_request(event)
|
125
|
-
# JSON.dump("prewarmed_at" => Time.now.to_s)
|
126
|
-
Jets.increase_prewarm_count
|
127
|
-
Jets.logger.info("Prewarm request")
|
128
|
-
%Q|{"prewarmed_at":"#{Time.now.to_s}"}| # raw json for speed
|
129
|
-
end
|
130
|
-
|
131
|
-
def standard_request(event, context, handler)
|
132
|
-
Jets::Processors::MainProcessor.new(
|
133
|
-
event,
|
134
|
-
context,
|
135
|
-
handler).run
|
136
|
-
rescue Exception => e
|
137
|
-
JSON.dump(
|
138
|
-
"stackTrace" => e.backtrace,
|
139
|
-
"errorMessage" => e.message,
|
140
|
-
"errorType" => "RubyError",
|
141
|
-
)
|
142
|
-
end
|
143
|
-
|
144
|
-
def self.run
|
145
|
-
new.run
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|