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.
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