opal-up 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +66 -51
  3. data/ext/up_ext/App.h +665 -544
  4. data/ext/up_ext/AsyncSocket.h +307 -284
  5. data/ext/up_ext/AsyncSocketData.h +35 -51
  6. data/ext/up_ext/BloomFilter.h +37 -42
  7. data/ext/up_ext/ChunkedEncoding.h +174 -175
  8. data/ext/up_ext/ClientApp.h +20 -23
  9. data/ext/up_ext/HttpContext.h +476 -381
  10. data/ext/up_ext/HttpContextData.h +20 -20
  11. data/ext/up_ext/HttpErrors.h +14 -10
  12. data/ext/up_ext/HttpParser.h +631 -563
  13. data/ext/up_ext/HttpResponse.h +526 -460
  14. data/ext/up_ext/HttpResponseData.h +59 -55
  15. data/ext/up_ext/HttpRouter.h +328 -310
  16. data/ext/up_ext/Loop.h +174 -168
  17. data/ext/up_ext/LoopData.h +60 -67
  18. data/ext/up_ext/MoveOnlyFunction.h +71 -80
  19. data/ext/up_ext/PerMessageDeflate.h +218 -198
  20. data/ext/up_ext/ProxyParser.h +100 -99
  21. data/ext/up_ext/QueryParser.h +91 -84
  22. data/ext/up_ext/TopicTree.h +273 -268
  23. data/ext/up_ext/Utilities.h +25 -25
  24. data/ext/up_ext/WebSocket.h +376 -310
  25. data/ext/up_ext/WebSocketContext.h +487 -372
  26. data/ext/up_ext/WebSocketContextData.h +74 -62
  27. data/ext/up_ext/WebSocketData.h +53 -46
  28. data/ext/up_ext/WebSocketExtensions.h +194 -178
  29. data/ext/up_ext/WebSocketHandshake.h +115 -110
  30. data/ext/up_ext/WebSocketProtocol.h +441 -398
  31. data/ext/up_ext/extconf.rb +1 -1
  32. data/ext/up_ext/libuwebsockets.cpp +1262 -1292
  33. data/ext/up_ext/libuwebsockets.h +337 -201
  34. data/ext/up_ext/up_ext.c +853 -163
  35. data/lib/up/bun/rack_env.rb +1 -13
  36. data/lib/up/bun/server.rb +93 -19
  37. data/lib/up/cli.rb +3 -0
  38. data/lib/up/client.rb +68 -0
  39. data/lib/up/ruby/cluster.rb +62 -0
  40. data/lib/up/ruby/rack_cluster.rb +1 -1
  41. data/lib/up/ruby/rack_server.rb +0 -1
  42. data/lib/up/u_web_socket/cluster.rb +18 -3
  43. data/lib/up/u_web_socket/server.rb +108 -15
  44. data/lib/up/version.rb +1 -1
  45. metadata +4 -15
  46. data/bin/up_node +0 -12
  47. data/bin/up_node_cluster +0 -12
  48. data/lib/up/node/cluster.rb +0 -39
  49. data/lib/up/node/cluster_cli.rb +0 -15
  50. data/lib/up/node/rack_cluster.rb +0 -25
  51. data/lib/up/node/rack_env.rb +0 -106
  52. data/lib/up/node/rack_server.rb +0 -25
  53. data/lib/up/node/server.rb +0 -84
  54. data/lib/up/node/server_cli.rb +0 -15
  55. data/lib/up/ruby/rack_env.rb +0 -97
  56. data/lib/up/u_web_socket/rack_env.rb +0 -101
@@ -1,39 +0,0 @@
1
- # backtick_javascript: true
2
- require 'up/node/server'
3
-
4
- %x{
5
- const cluster = require('node:cluster');
6
- const num_workers = require('node:os').availableParallelism();
7
- }
8
-
9
- module Up
10
- module Node
11
- class Cluster < Up::Node::Server
12
- def initialize(app:, host: 'localhost', port: 3000, scheme: 'http', ca_file: nil, cert_file: nil, key_file: nil, workers: nil)
13
- super(app: app, host: host, port: port, scheme: scheme, ca_file: ca_file, cert_file: cert_file, key_file: key_file)
14
- @workers = workers || `num_workers`
15
- @members = []
16
- end
17
-
18
- def listen
19
- raise "already running" unless @members.empty?
20
- %x{
21
- if (cluster.isPrimary) {
22
- for (let i = 0; i < #@workers; i++) {
23
- #@members.push(cluster.fork());
24
- }
25
- } else {
26
- #{super}
27
- }
28
- }
29
- end
30
-
31
- def stop
32
- if Up::CLI::stoppable?
33
- @members.each { |m| `m.kill()` }
34
- @members.clear
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,15 +0,0 @@
1
- require 'opal/platform'
2
- require 'nodejs/file'
3
- require 'nodejs/require'
4
- require 'opal-parser'
5
- require 'rack/builder'
6
- require 'up/rack_builder_patch'
7
- require 'up/node/rack_cluster'
8
-
9
- module Up
10
- module CLI
11
- def self.call
12
- Up::Node::RackCluster.run(get_app, get_options)
13
- end
14
- end
15
- end
@@ -1,25 +0,0 @@
1
- require 'up/node/cluster'
2
-
3
- module Up
4
- module Node
5
- module RackCluster
6
- def self.run(app, options = {})
7
- raise "already running" if @server
8
- @server = Up::Node::Cluster.new(app: app, **options).listen
9
- true
10
- end
11
-
12
- def self.shutdown
13
- @server&.stop
14
- @server = nil
15
- end
16
- end
17
- end
18
- end
19
-
20
- ENV['RACK_HANDLER'] ||= 'up'
21
-
22
- begin
23
- ::Rackup::Handler.register('up', Up::Node::RackCluster) if defined?(::Rackup::Handler)
24
- rescue StandardError
25
- end
@@ -1,106 +0,0 @@
1
- # backtick_javascript: true
2
-
3
- require 'logger'
4
- require 'up/version'
5
-
6
- module Up
7
- module Node
8
- class RackEnv < ::Hash
9
- RACK_VARS = %w[rack.errors rack.hijack rack.hijack? rack.input rack.logger
10
- rack.multipart.buffer_size rack.multipart.tempfile_factory
11
- rack.response_finished
12
- rack.session rack.upgrade rack.upgrade? rack.url_scheme
13
- HTTP_ACCEPT HTTP_ACCEPT_ENCODING HTTP_ACCEPT_LANGUAGE
14
- HTTP_CONNECTION HTTP_HOST HTTP_USER_AGENT HTTP_VERSION PATH_INFO QUERY_STRING REQUEST_METHOD
15
- SCRIPT_NAME SERVER_NAME SERVER_PROTOCOL SERVER_SOFTWARE]
16
- def initialize(req, config)
17
- @req = req
18
- @config = config
19
- end
20
-
21
- def [](key)
22
- return super(key) if key?(key)
23
- self[key] = case key
24
- when 'rack.errors'
25
- STDERR
26
- when 'rack.hijack'
27
- nil
28
- when 'rack.hijack?'
29
- false
30
- when 'rack.input'
31
- ::IO.new
32
- when 'rack.logger'
33
- ::Logger.new(self['rack.errors'])
34
- when 'rack.multipart.buffer_size'
35
- 4096
36
- when 'rack.multipart.tempfile_factory'
37
- proc { |_filename, _content_type| File.new }
38
- when 'rack.response_finished'
39
- []
40
- when 'rack.session'
41
- {}
42
- when 'rack.upgrade'
43
- nil
44
- when 'rack.upgrade?'
45
- nil
46
- when 'rack.url_scheme'
47
- @config[:scheme]
48
- when 'HTTP_VERSION'
49
- `#@req.httpVersion`
50
- when 'PATH_INFO'
51
- `#@req.url`
52
- when 'QUERY_STRING'
53
- nil
54
- when 'RACK_ERRORS'
55
- self['rack.errors']
56
- when 'RACK_LOGGER'
57
- self['rack.logger']
58
- when 'REQUEST_METHOD'
59
- `#@req.method`
60
- when 'SCRIPT_NAME'
61
- ""
62
- when 'SERVER_NAME'
63
- @config[:host]
64
- when 'SERVER_PORT'
65
- @config[:port].to_s
66
- when 'SERVER_PROTOCOL'
67
- ""
68
- when 'SERVER_SOFTWARE'
69
- "#{@config[:handler]}/#{Up::VERSION} #{@config[:engine]}"
70
- else
71
- if key.start_with?('HTTP_')
72
- key = key[5..].gsub(/_/, '-')
73
- `#@req.headers[key.toLowerCase()]`
74
- else
75
- nil
76
- end
77
- end
78
- end
79
-
80
- def req_headers
81
- h = {}
82
- %x{
83
- var hdr, hds = #@req.headers;
84
- for (hdr in hds) { h.set(hdr, hdrs[hdr]); }
85
- }
86
- h
87
- end
88
-
89
- def each
90
- unless @got_them_all
91
- RACK_VARS.each { |k| self[k] unless self.key?(k) }
92
- @got_them_all = true
93
- end
94
- super
95
- end
96
-
97
- def to_s
98
- unless @got_them_all
99
- RACK_VARS.each { |k| self[k] unless self.key?(k) }
100
- @got_them_all = true
101
- end
102
- super
103
- end
104
- end
105
- end
106
- end
@@ -1,25 +0,0 @@
1
- require 'up/node/server'
2
-
3
- module Up
4
- module Node
5
- module RackServer
6
- def self.run(app, options = {})
7
- raise "already running" if @server
8
- @server = Up::Node::Server.new(app: app, **options).listen
9
- true
10
- end
11
-
12
- def self.shutdown
13
- @server&.stop
14
- @server = nil
15
- end
16
- end
17
- end
18
- end
19
-
20
- ENV['RACK_HANDLER'] ||= 'up'
21
-
22
- begin
23
- ::Rackup::Handler.register('up', Up::Node::RackServer) if defined?(::Rackup::Handler)
24
- rescue StandardError
25
- end
@@ -1,84 +0,0 @@
1
- # backtick_javascript: true
2
- require 'up/cli'
3
- require 'up/node/rack_env'
4
-
5
- %x{
6
- module.paths.push(process.cwd() + '/node_modules');
7
- const http = require('node:http');
8
- const https = require('node:https');
9
- const fs = require('node:fs');
10
- }
11
-
12
- module Up
13
- module Node
14
- class Server
15
- def initialize(app:, host: 'localhost', port: 3000, scheme: 'http', ca_file: nil, cert_file: nil, key_file: nil)
16
- @app = app
17
- @scheme = scheme || 'http'
18
- raise "unsupported scheme #{@scheme}" unless %w[http https].include?(@scheme)
19
- @host = host || 'localhost'
20
- @port = port&.to_i || 3000
21
- @config = { handler: self.class.name, engine: "node/#{`process.version`}", port: port, scheme: scheme, host: host }.freeze
22
- @ca_file = ca_file
23
- @cert_file = cert_file
24
- @key_file = key_file
25
- @server = nil
26
- end
27
-
28
- %x{
29
- self.handle_headers = function(rack_headers, srv_res) {
30
- if (rack_headers.$$is_hash) {
31
- var header, k, v;
32
- for(header of rack_headers) {
33
- k = header[0];
34
- if (!k.startsWith('rack.')) {
35
- v = header[1];
36
- if (v.$$is_array) {
37
- v = v.join("\n");
38
- }
39
- srv_res.setHeader(k, v);
40
- }
41
- }
42
- }
43
- }
44
-
45
- self.handle_response = function(parts, srv_res) {
46
- if (parts["$respond_to?"]('each')) {
47
- #{`parts`.each { |part| `srv_res.write(part)` }}
48
- } else if (parts["$respond_to?"]('call')) {
49
- srv_res.write(parts.$call());
50
- }
51
- #{`parts`.close if `parts`.respond_to?(:close)}
52
- }
53
- }
54
-
55
- def listen
56
- raise "already running" if @server
57
- %x{
58
- const ounr = Opal.Up.Node.RackEnv;
59
- const ouns = Opal.Up.Node.Server;
60
- function handler(req, res) {
61
- const rack_res = #@app.$call(ounr.$new(req, #@config));
62
- res.statusCode = rack_res[0];
63
- ouns.handle_headers(rack_res[1], res);
64
- ouns.handle_response(rack_res[2], res);
65
- res.end();
66
- }
67
- if (#@scheme == 'https') {
68
- #@server = https.createServer({ ca: fs.readFileSync(#@ca_file), cert: fs.readFileSync(#@cert_file), key: fs.readFileSync(#@key_file) }, handler);
69
- } else {
70
- #@server = http.createServer(handler);
71
- }
72
- #@server.listen(#@port, #@host, () => { console.log(`Server is running on ${#@scheme}://${#@host}:${#@port}`)});
73
- }
74
- end
75
-
76
- def stop
77
- if Up::CLI::stoppable?
78
- `#@server.close()`
79
- @server = nil
80
- end
81
- end
82
- end
83
- end
84
- end
@@ -1,15 +0,0 @@
1
- require 'opal/platform'
2
- require 'nodejs/file'
3
- require 'nodejs/require'
4
- require 'opal-parser'
5
- require 'rack/builder'
6
- require 'up/rack_builder_patch'
7
- require 'up/node/rack_server'
8
-
9
- module Up
10
- module CLI
11
- def self.call
12
- Up::Node::RackServer.run(get_app, get_options)
13
- end
14
- end
15
- end
@@ -1,97 +0,0 @@
1
- require 'logger'
2
- require 'up/version'
3
-
4
- module Up
5
- module Ruby
6
- class RackEnv < ::Hash
7
- RACK_VARS = %w[rack.errors rack.hijack rack.hijack? rack.input rack.logger
8
- rack.multipart.buffer_size rack.multipart.tempfile_factory
9
- rack.response_finished
10
- rack.session rack.upgrade rack.upgrade? rack.url_scheme
11
- HTTP_ACCEPT HTTP_ACCEPT_ENCODING HTTP_ACCEPT_LANGUAGE
12
- HTTP_CONNECTION HTTP_HOST HTTP_USER_AGENT PATH_INFO QUERY_STRING REQUEST_METHOD
13
- SCRIPT_NAME SERVER_NAME SERVER_PROTOCOL SERVER_SOFTWARE]
14
- def initialize(req, config = {})
15
- @req = req
16
- @config = config
17
- end
18
-
19
- def [](key)
20
- return super(key) if key?(key)
21
- self[key] = case key
22
- when 'rack.errors'
23
- STDERR
24
- when 'rack.hijack'
25
- nil
26
- when 'rack.hijack?'
27
- false
28
- when 'rack.input'
29
- nil # ::IO.new
30
- when 'rack.logger'
31
- ::Logger.new(self['rack.errors'])
32
- when 'rack.multipart.buffer_size'
33
- 4096
34
- when 'rack.multipart.tempfile_factory'
35
- proc { |_filename, _content_type| File.new }
36
- when 'rack.response_finished'
37
- []
38
- when 'rack.session'
39
- {}
40
- when 'rack.upgrade'
41
- nil
42
- when 'rack.upgrade?'
43
- nil
44
- when 'rack.url_scheme'
45
- @config[:scheme]
46
- when 'PATH_INFO'
47
- @req.get_url
48
- when 'QUERY_STRING'
49
- @req.get_query
50
- when 'RACK_ERRORS'
51
- self['rack.errors']
52
- when 'RACK_LOGGER'
53
- self['rack.logger']
54
- when 'REQUEST_METHOD'
55
- @req.get_method
56
- when 'SCRIPT_NAME'
57
- ""
58
- when 'SERVER_NAME'
59
- @config[:host]
60
- when 'SERVER_PORT'
61
- @config[:port].to_s
62
- when 'SERVER_PROTOCOL'
63
- @req.get_header('protocol')
64
- when 'SERVER_SOFTWARE'
65
- "#{@config[:handler]}/#{Up::VERSION} #{@config[:engine]}"
66
- else
67
- if key.start_with?('HTTP_')
68
- key = key[5..].gsub(/_/, '-')
69
- @req.get_header(key.downcase)
70
- else
71
- nil
72
- end
73
- end
74
- end
75
-
76
- def req_headers
77
- @req.headers
78
- end
79
-
80
- def each
81
- unless @got_them_all
82
- RACK_VARS.each { |k| self[k] unless self.key?(k) }
83
- @got_them_all = true
84
- end
85
- super
86
- end
87
-
88
- def to_s
89
- unless @got_them_all
90
- RACK_VARS.each { |k| self[k] unless self.key?(k) }
91
- @got_them_all = true
92
- end
93
- super
94
- end
95
- end
96
- end
97
- end
@@ -1,101 +0,0 @@
1
- # backtick_javascript: true
2
-
3
- require 'logger'
4
- require 'up/version'
5
-
6
- module Up
7
- module UWebSocket
8
- class RackEnv < ::Hash
9
- RACK_VARS = %w[rack.errors rack.hijack rack.hijack? rack.input rack.logger
10
- rack.multipart.buffer_size rack.multipart.tempfile_factory
11
- rack.response_finished
12
- rack.session rack.upgrade rack.upgrade? rack.url_scheme
13
- HTTP_ACCEPT HTTP_ACCEPT_ENCODING HTTP_ACCEPT_LANGUAGE
14
- HTTP_CONNECTION HTTP_HOST HTTP_USER_AGENT PATH_INFO QUERY_STRING REQUEST_METHOD
15
- SCRIPT_NAME SERVER_NAME SERVER_PROTOCOL SERVER_SOFTWARE]
16
- def initialize(req, config)
17
- @req = req
18
- @config = config
19
- end
20
-
21
- def [](key)
22
- return super(key) if key?(key)
23
- self[key] = case key
24
- when 'rack.errors'
25
- STDERR
26
- when 'rack.hijack'
27
- nil
28
- when 'rack.hijack?'
29
- false
30
- when 'rack.input'
31
- ::IO.new
32
- when 'rack.logger'
33
- ::Logger.new(self['rack.errors'])
34
- when 'rack.multipart.buffer_size'
35
- 4096
36
- when 'rack.multipart.tempfile_factory'
37
- proc { |_filename, _content_type| File.new }
38
- when 'rack.response_finished'
39
- []
40
- when 'rack.session'
41
- {}
42
- when 'rack.upgrade'
43
- nil
44
- when 'rack.upgrade?'
45
- nil
46
- when 'rack.url_scheme'
47
- @config[:scheme]
48
- when 'PATH_INFO'
49
- `#@req.getUrl()`
50
- when 'QUERY_STRING'
51
- `#@req.getQuery() || nil`
52
- when 'RACK_ERRORS'
53
- self['rack.errors']
54
- when 'RACK_LOGGER'
55
- self['rack.logger']
56
- when 'REQUEST_METHOD'
57
- `#@req.getMethod().toUpperCase()`
58
- when 'SCRIPT_NAME'
59
- ""
60
- when 'SERVER_NAME'
61
- @config[:host]
62
- when 'SERVER_PORT'
63
- @config[:port].to_s
64
- when 'SERVER_PROTOCOL'
65
- `#@req.getHeader('protocol')`
66
- when 'SERVER_SOFTWARE'
67
- "#{@config[:handler]}/#{Up::VERSION} #{@config[:engine]}"
68
- else
69
- if key.start_with?('HTTP_')
70
- key = key[5..].gsub(/_/, '-')
71
- `#@req.getHeader(key.toLowerCase())`
72
- else
73
- nil
74
- end
75
- end
76
- end
77
-
78
- def req_headers
79
- h = {}
80
- `#@req.forEach((k, v) => { h.set(k, v); })`
81
- h
82
- end
83
-
84
- def each
85
- unless @got_them_all
86
- RACK_VARS.each { |k| self[k] unless self.key?(k) }
87
- @got_them_all = true
88
- end
89
- super
90
- end
91
-
92
- def to_s
93
- unless @got_them_all
94
- RACK_VARS.each { |k| self[k] unless self.key?(k) }
95
- @got_them_all = true
96
- end
97
- super
98
- end
99
- end
100
- end
101
- end