jets 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|