jets 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/Gemfile.lock +4 -4
  4. data/README.md +2 -2
  5. data/lib/jets.rb +3 -4
  6. data/lib/jets/application.rb +13 -2
  7. data/lib/jets/builders.rb +3 -0
  8. data/lib/jets/builders/code_builder.rb +22 -89
  9. data/lib/jets/builders/code_size.rb +55 -0
  10. data/lib/jets/builders/gem_replacer.rb +22 -1
  11. data/lib/jets/builders/handler_generator.rb +31 -5
  12. data/lib/jets/builders/lambda_layer.rb +50 -0
  13. data/lib/jets/builders/md5.rb +10 -5
  14. data/lib/jets/builders/md5_zip.rb +1 -0
  15. data/lib/jets/builders/purger.rb +35 -0
  16. data/lib/jets/builders/rack_packager.rb +25 -5
  17. data/lib/jets/builders/rackup_wrappers/rackup +1 -5
  18. data/lib/jets/builders/ruby_packager.rb +25 -27
  19. data/lib/jets/builders/shim_vars/app.rb +3 -3
  20. data/lib/jets/builders/shim_vars/base.rb +9 -4
  21. data/lib/jets/builders/shim_vars/shared.rb +2 -2
  22. data/lib/jets/builders/templates/handler.rb +7 -0
  23. data/lib/jets/builders/tidy.rb +4 -3
  24. data/lib/jets/builders/util.rb +11 -3
  25. data/lib/jets/cfn/builders/base_child_builder.rb +6 -3
  26. data/lib/jets/cfn/builders/interface.rb +1 -1
  27. data/lib/jets/cfn/builders/parent_builder.rb +5 -0
  28. data/lib/jets/commands/build.rb +4 -2
  29. data/lib/jets/commands/help/gems/check.md +1 -1
  30. data/lib/jets/commands/main.rb +1 -1
  31. data/lib/jets/commands/new.rb +4 -2
  32. data/lib/jets/commands/sequence.rb +1 -1
  33. data/lib/jets/commands/templates/skeleton/Gemfile.tt +2 -2
  34. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +0 -5
  35. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +2 -2
  36. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +2 -1
  37. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +2 -3
  38. data/lib/jets/commands/upgrade/v1.rb +21 -0
  39. data/lib/jets/controller/renderers/template_renderer.rb +1 -1
  40. data/lib/jets/controller/rendering.rb +1 -4
  41. data/lib/jets/core.rb +45 -6
  42. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +32 -34
  43. data/lib/jets/mega/request.rb +11 -0
  44. data/lib/jets/overrides/lambda.rb +1 -0
  45. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  46. data/lib/jets/overrides/rails.rb +4 -0
  47. data/lib/jets/{rails_overrides → overrides/rails}/asset_tag_helper.rb +0 -0
  48. data/lib/jets/{rails_overrides → overrides/rails}/common_methods.rb +0 -0
  49. data/lib/jets/{rails_overrides → overrides/rails}/rendering_helper.rb +0 -0
  50. data/lib/jets/{rails_overrides → overrides/rails}/url_helper.rb +0 -0
  51. data/lib/jets/poly_fun/base_executor.rb +1 -1
  52. data/lib/jets/preheat.rb +1 -0
  53. data/lib/jets/processors/main_processor.rb +3 -10
  54. data/lib/jets/{server.rb → rack_server.rb} +31 -2
  55. data/lib/jets/resource.rb +1 -1
  56. data/lib/jets/resource/api_gateway/base_path/function.rb +1 -1
  57. data/lib/jets/resource/child_stack/app_class.rb +10 -4
  58. data/lib/jets/resource/lambda.rb +5 -0
  59. data/lib/jets/resource/{function.rb → lambda/function.rb} +8 -6
  60. data/lib/jets/resource/{function → lambda/function}/environment.rb +1 -1
  61. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  62. data/lib/jets/resource/lambda/layer_version.rb +46 -0
  63. data/lib/jets/tmp_loader.rb +52 -0
  64. data/lib/jets/version.rb +1 -1
  65. data/{README → readme}/prerelease.md +0 -0
  66. data/{README → readme}/testing.md +5 -0
  67. data/vendor/jets-gems/lib/jets/gems.rb +1 -1
  68. data/vendor/jets-gems/lib/jets/gems/check.rb +7 -7
  69. data/vendor/jets-gems/lib/jets/gems/exist.rb +5 -5
  70. data/vendor/jets-gems/lib/jets/gems/extract/base.rb +4 -11
  71. data/vendor/jets-gems/lib/jets/gems/extract/gem.rb +15 -8
  72. data/vendor/jets-gems/lib/jets/gems/extract/ruby.rb +19 -10
  73. metadata +22 -15
  74. data/lib/jets/builders/templates/handler.js +0 -9
  75. data/lib/jets/builders/templates/shim.js +0 -275
  76. data/lib/jets/rails_overrides.rb +0 -4
  77. 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.2.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-07 00:00:00.000000000 Z
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.js
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/rails_overrides.rb
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
- };
@@ -1,4 +0,0 @@
1
- require "jets/rails_overrides/common_methods"
2
- require "jets/rails_overrides/url_helper"
3
- require "jets/rails_overrides/rendering_helper"
4
- require "jets/rails_overrides/asset_tag_helper"
@@ -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