async-websocket 0.13.1 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/lib/async/websocket/adapters/rack.rb +7 -1
  3. data/{spec/async/websocket/upgrade.rb → lib/async/websocket/adapters/rails.rb} +20 -19
  4. data/lib/async/websocket/client.rb +39 -17
  5. data/lib/async/websocket/connect_request.rb +31 -16
  6. data/lib/async/websocket/connect_response.rb +2 -2
  7. data/lib/async/websocket/connection.rb +21 -2
  8. data/lib/async/websocket/request.rb +1 -1
  9. data/lib/async/websocket/response.rb +1 -1
  10. data/lib/async/websocket/server.rb +2 -0
  11. data/lib/async/websocket/upgrade_request.rb +9 -9
  12. data/lib/async/websocket/upgrade_response.rb +3 -3
  13. data/lib/async/websocket/version.rb +1 -1
  14. metadata +36 -103
  15. data/.editorconfig +0 -6
  16. data/.gitignore +0 -13
  17. data/.rspec +0 -3
  18. data/.travis.yml +0 -18
  19. data/Gemfile +0 -12
  20. data/README.md +0 -129
  21. data/Rakefile +0 -6
  22. data/async-websocket.gemspec +0 -29
  23. data/examples/chat/README.md +0 -3
  24. data/examples/chat/client.rb +0 -32
  25. data/examples/chat/config.ru +0 -113
  26. data/examples/chat/multi-client.rb +0 -81
  27. data/examples/mud/client.rb +0 -34
  28. data/examples/mud/config.ru +0 -142
  29. data/examples/rack/client.rb +0 -20
  30. data/examples/rack/config.ru +0 -14
  31. data/examples/utopia/.bowerrc +0 -4
  32. data/examples/utopia/.gitignore +0 -9
  33. data/examples/utopia/.rspec +0 -4
  34. data/examples/utopia/Gemfile +0 -33
  35. data/examples/utopia/Guardfile +0 -29
  36. data/examples/utopia/README.md +0 -16
  37. data/examples/utopia/Rakefile +0 -8
  38. data/examples/utopia/config.ru +0 -47
  39. data/examples/utopia/config/README.md +0 -7
  40. data/examples/utopia/config/environment.rb +0 -8
  41. data/examples/utopia/lib/readme.txt +0 -1
  42. data/examples/utopia/pages/_heading.xnode +0 -2
  43. data/examples/utopia/pages/_page.xnode +0 -30
  44. data/examples/utopia/pages/client/client.js +0 -28
  45. data/examples/utopia/pages/client/index.xnode +0 -8
  46. data/examples/utopia/pages/errors/exception.xnode +0 -5
  47. data/examples/utopia/pages/errors/file-not-found.xnode +0 -5
  48. data/examples/utopia/pages/links.yaml +0 -2
  49. data/examples/utopia/pages/server/controller.rb +0 -26
  50. data/examples/utopia/public/_static/icon.png +0 -0
  51. data/examples/utopia/public/_static/site.css +0 -205
  52. data/examples/utopia/public/_static/utopia-background.svg +0 -1
  53. data/examples/utopia/public/_static/utopia.svg +0 -1
  54. data/examples/utopia/public/readme.txt +0 -1
  55. data/examples/utopia/spec/spec_helper.rb +0 -31
  56. data/examples/utopia/spec/website_context.rb +0 -11
  57. data/examples/utopia/spec/website_spec.rb +0 -56
  58. data/examples/utopia/tasks/bower.rake +0 -45
  59. data/examples/utopia/tasks/deploy.rake +0 -13
  60. data/examples/utopia/tasks/development.rake +0 -34
  61. data/examples/utopia/tasks/environment.rake +0 -17
  62. data/examples/utopia/tasks/log.rake +0 -17
  63. data/examples/utopia/tasks/static.rake +0 -43
  64. data/spec/async/websocket/adapters/rack/client.rb +0 -38
  65. data/spec/async/websocket/adapters/rack/config.ru +0 -23
  66. data/spec/async/websocket/adapters/rack_spec.rb +0 -84
  67. data/spec/async/websocket/client_spec.rb +0 -48
  68. data/spec/async/websocket/connection_spec.rb +0 -34
  69. data/spec/async/websocket/server_examples.rb +0 -81
  70. data/spec/async/websocket/server_spec.rb +0 -31
  71. data/spec/spec_helper.rb +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 237b59048febd538e6112ea06b520c154386d057bd3b58a22bb153d45cd3209f
4
- data.tar.gz: '0966a1666e31463adb1c2975f7e72534c7a8003794825ab94c24c3d5d02223e7'
3
+ metadata.gz: 54e97832ebcebab09dfd5a042aad8532a7a5277cf6609fecae9f73a1826cac7d
4
+ data.tar.gz: 671da6e463ced51447b8cb49aabbb8b51d644a19adc655e9f955fe4b6772afd4
5
5
  SHA512:
6
- metadata.gz: 7e25c38a3d25b98209d3999e803f031cb216dd1ccd47f1c2af92fd75cab7859d888ee9fd79873aab8d41d9d6e1ff4bd3bf64addcba74bad619613c948ec17e89
7
- data.tar.gz: a7284a36f8525415327177da55e83d35001f329d50b4b1843e4cd0b4d2488b17da26559df0248e493bea86ac163e0f3434113a6b76e4d1c9a16978e3c4118a41
6
+ metadata.gz: c33efe4ce32ddf75596defe2b3c3f56bb05973d1c13e4b9c39e9fbaed604c9774271b6dd88db11691ba1a498b3c3ee807e6aa3a54447a30ea3ba791d8818388b
7
+ data.tar.gz: 50b6419551ee9643771cb80dbd7ad48460e265f3e8a168e60f4afa9557802eb4bc2543b5cb678e55b81ccf006679bfa865047e590f5f7b99526f0dd628bc3005
@@ -35,20 +35,26 @@ module Async
35
35
 
36
36
  def self.open(env, headers: [], protocols: [], handler: Connection, **options, &block)
37
37
  if request = env['async.http.request'] and Array(request.protocol).include?(PROTOCOL)
38
+ env = nil
39
+
38
40
  # Select websocket sub-protocol:
39
41
  if requested_protocol = request.headers[SEC_WEBSOCKET_PROTOCOL]
40
42
  protocol = (requested_protocol & protocols).first
41
43
  end
42
44
 
43
45
  response = Response.for(request, headers, protocol: protocol, **options) do |stream|
46
+ response = nil
47
+
44
48
  framer = Protocol::WebSocket::Framer.new(stream)
45
49
 
46
50
  connection = handler.call(framer, protocol)
51
+
47
52
  yield connection
48
53
 
49
54
  connection.close unless connection.closed?
50
55
  end
51
56
 
57
+ request = nil
52
58
  headers = response.headers
53
59
 
54
60
  if protocol = response.protocol
@@ -57,7 +63,7 @@ module Async
57
63
  ])
58
64
  end
59
65
 
60
- return [response.status, headers, response.body]
66
+ return [response.status, headers.to_h, response.body]
61
67
  end
62
68
  end
63
69
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literals: true
2
+ #
1
3
  # Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -18,26 +20,25 @@
18
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
21
  # THE SOFTWARE.
20
22
 
21
- require 'async/websocket/adapters/rack'
23
+ require_relative 'rack'
22
24
 
23
- class Upgrade
24
- def initialize(app)
25
- @app = app
26
- end
27
-
28
- def call(env)
29
- Async::WebSocket::Adapters::Rack.open(env, supported_protocols: ['ws']) do |connection|
30
- read, write = IO.pipe
31
-
32
- Process.spawn("ls -lah", :out => write)
33
- write.close
34
-
35
- read.each_line do |line|
36
- connection.write({line: line})
25
+ module Async
26
+ module WebSocket
27
+ module Adapters
28
+ module Rails
29
+ def self.open(request, **options, &block)
30
+ if response = Rack.open(request.env, **options, &block)
31
+ response[1]['rack.hijack'] = lambda do |stream|
32
+ response[2].call(stream)
33
+ end
34
+
35
+ # Close the response to prevent Rails from... trying to render a view?
36
+ return ::ActionDispatch::Response.new(response[0], response[1], nil).tap(&:close)
37
+ end
38
+
39
+ return ::ActionDispatch::Response.new(404, [], [])
40
+ end
37
41
  end
38
-
39
- # Gracefully close the connection:
40
- connection.close
41
- end or @app.call(env)
42
+ end
42
43
  end
43
44
  end
@@ -34,8 +34,9 @@ module Async
34
34
  class Client < ::Protocol::HTTP::Middleware
35
35
  include ::Protocol::WebSocket::Headers
36
36
 
37
- def self.open(endpoint, *args, &block)
38
- client = self.new(HTTP::Client.new(endpoint, *args), mask: endpoint.secure?)
37
+ # @return [Client] a client which can be used to establish websocket connections to the given endpoint.
38
+ def self.open(endpoint, **options, &block)
39
+ client = self.new(HTTP::Client.new(endpoint, **options), mask: true)
39
40
 
40
41
  return client unless block_given?
41
42
 
@@ -46,9 +47,10 @@ module Async
46
47
  end
47
48
  end
48
49
 
50
+ # @return [Connection] an open websocket connection to the given endpoint.
49
51
  def self.connect(endpoint, *args, **options, &block)
50
52
  self.open(endpoint, *args) do |client|
51
- connection = client.connect(endpoint.path, **options)
53
+ connection = client.connect(endpoint.authority, endpoint.path, **options)
52
54
 
53
55
  return connection unless block_given?
54
56
 
@@ -60,33 +62,53 @@ module Async
60
62
  end
61
63
  end
62
64
 
63
- def initialize(delegate, **options)
64
- super(delegate)
65
+ def initialize(client, **options)
66
+ super(client)
65
67
 
66
68
  @options = options
67
69
  end
68
70
 
69
- def connect(path, headers: [], handler: Connection, **options)
70
- request = Request.new(nil, nil, path, headers, **options)
71
+ class Framer < ::Protocol::WebSocket::Framer
72
+ def initialize(pool, connection, stream)
73
+ super(stream)
74
+ @pool = pool
75
+ @connection = connection
76
+ end
77
+
78
+ def close
79
+ super
80
+
81
+ if @pool
82
+ @pool.release(@connection)
83
+ @pool = nil
84
+ @connection = nil
85
+ end
86
+ end
87
+ end
88
+
89
+ def connect(authority, path, headers: nil, handler: Connection, **options, &block)
90
+ headers = ::Protocol::HTTP::Headers[headers]
91
+ request = Request.new(nil, authority, path, headers, **options)
92
+
93
+ pool = @delegate.pool
94
+ connection = pool.acquire
71
95
 
72
- response = self.call(request)
96
+ response = request.call(connection)
73
97
 
74
98
  unless response.stream?
75
99
  raise ProtocolError, "Failed to negotiate connection: #{response.status}"
76
100
  end
77
101
 
78
102
  protocol = response.headers[SEC_WEBSOCKET_PROTOCOL]&.first
79
- framer = Protocol::WebSocket::Framer.new(response.stream)
80
-
81
- connection = handler.call(framer, protocol, **@options)
103
+ stream = response.stream
104
+ response = nil
82
105
 
83
- return connection unless block_given?
106
+ framer = Framer.new(pool, connection, stream)
107
+ connection = nil
84
108
 
85
- begin
86
- yield connection
87
- ensure
88
- connection.close
89
- end
109
+ handler.call(framer, protocol, **@options, &block)
110
+ ensure
111
+ pool.release(connection) if connection
90
112
  end
91
113
  end
92
114
  end
@@ -34,17 +34,19 @@ module Async
34
34
  include ::Protocol::WebSocket::Headers
35
35
 
36
36
  class Wrapper
37
- def initialize(output, response)
38
- @output = output
39
- @body = output
37
+ def initialize(stream, response)
40
38
  @response = response
41
- @stream = nil
39
+ @body = @response.body
40
+ @stream = stream
42
41
  end
43
42
 
43
+ attr_accessor :response
44
+
44
45
  attr_accessor :body
46
+ attr_accessor :stream
45
47
 
46
48
  def stream?
47
- @response.success?
49
+ @response.success? and @stream
48
50
  end
49
51
 
50
52
  def status
@@ -62,30 +64,43 @@ module Async
62
64
  def protocol
63
65
  @response.protocol
64
66
  end
67
+ end
68
+
69
+ class Hijack < Async::HTTP::Body::Readable
70
+ def initialize(request)
71
+ @request = request
72
+ @stream = nil
73
+ end
65
74
 
66
- def stream
67
- @stream ||= Async::HTTP::Body::Stream.new(@response.body, @output)
75
+ def stream?
76
+ true
77
+ end
78
+
79
+ attr :stream
80
+
81
+ def call(stream)
82
+ @stream = stream
68
83
  end
69
84
  end
70
85
 
71
- def initialize(request, protocols: [], version: 13)
72
- body = Async::HTTP::Body::Writable.new
86
+ def initialize(request, protocols: [], version: 13, &block)
87
+ body = Hijack.new(self)
73
88
 
74
- headers = []
89
+ headers = ::Protocol::HTTP::Headers[request.headers]
75
90
 
76
- headers << [SEC_WEBSOCKET_VERSION, version]
91
+ headers.add(SEC_WEBSOCKET_VERSION, String(version))
77
92
 
78
93
  if protocols.any?
79
- headers << [SEC_WEBSOCKET_PROTOCOL, protocols.join(',')]
94
+ headers.add(SEC_WEBSOCKET_PROTOCOL, protocols.join(','))
80
95
  end
81
96
 
82
- merged_headers = ::Protocol::HTTP::Headers::Merged.new(request.headers, headers)
83
-
84
- super(request.scheme, request.authority, ::Protocol::HTTP::Methods::CONNECT, request.path, nil, merged_headers, body, PROTOCOL)
97
+ super(request.scheme, request.authority, ::Protocol::HTTP::Methods::CONNECT, request.path, nil, headers, body, PROTOCOL)
85
98
  end
86
99
 
87
100
  def call(connection)
88
- Wrapper.new(body, super)
101
+ response = super
102
+
103
+ Wrapper.new(@body.stream, response)
89
104
  end
90
105
  end
91
106
  end
@@ -30,10 +30,10 @@ module Async
30
30
  include ::Protocol::WebSocket::Headers
31
31
 
32
32
  def initialize(request, headers = nil, protocol: nil, &block)
33
- headers = Protocol::HTTP::Headers::Merged.new(headers)
33
+ headers = ::Protocol::HTTP::Headers[headers]
34
34
 
35
35
  if protocol
36
- headers << [[SEC_WEBSOCKET_PROTOCOL, protocol]]
36
+ headers.add(SEC_WEBSOCKET_PROTOCOL, protocol)
37
37
  end
38
38
 
39
39
  body = Async::HTTP::Body::Hijack.wrap(request, &block)
@@ -32,12 +32,31 @@ module Async
32
32
  include ::Protocol::WebSocket::Headers
33
33
 
34
34
  def self.call(framer, protocol = [], **options)
35
- return self.new(framer, Array(protocol).first, **options)
35
+ instance = self.new(framer, Array(protocol).first, **options)
36
+
37
+ return instance unless block_given?
38
+
39
+ begin
40
+ yield instance
41
+ ensure
42
+ instance.close
43
+ end
36
44
  end
37
45
 
38
- def initialize(framer, protocol = nil, **options)
46
+ def initialize(framer, protocol = nil, response: nil, **options)
39
47
  super(framer, **options)
48
+
40
49
  @protocol = protocol
50
+ @response = response
51
+ end
52
+
53
+ def close
54
+ super
55
+
56
+ if @response
57
+ @response.finish
58
+ @response = nil
59
+ end
41
60
  end
42
61
 
43
62
  attr :protocol
@@ -30,7 +30,7 @@ module Async
30
30
  Array(request.protocol).include?(PROTOCOL)
31
31
  end
32
32
 
33
- def initialize(scheme = nil, authority = nil, path = nil, headers = [], **options)
33
+ def initialize(scheme = nil, authority = nil, path = nil, headers = nil, **options, &block)
34
34
  @scheme = scheme
35
35
  @authority = authority
36
36
  @path = path
@@ -27,7 +27,7 @@ module Async
27
27
  module WebSocket
28
28
  module Response
29
29
  # Send the request to the given connection.
30
- def self.for(request, headers = [], **options, &body)
30
+ def self.for(request, headers = nil, **options, &body)
31
31
  if request.version =~ /http\/1/i
32
32
  return UpgradeResponse.new(request, headers, **options, &body)
33
33
  elsif request.version =~ /h2/i
@@ -49,6 +49,8 @@ module Async
49
49
  # Select websocket sub-protocol:
50
50
  protocol = select_protocol(request)
51
51
 
52
+ # request.headers = nil
53
+
52
54
  Response.for(request, headers, protocol: protocol, **options) do |stream|
53
55
  framer = Protocol::WebSocket::Framer.new(stream)
54
56
 
@@ -42,6 +42,8 @@ module Async
42
42
  @stream = nil
43
43
  end
44
44
 
45
+ attr_accessor :response
46
+
45
47
  def stream?
46
48
  @response.status == 101
47
49
  end
@@ -71,21 +73,19 @@ module Async
71
73
  end
72
74
  end
73
75
 
74
- def initialize(request, protocols: [], version: 13)
76
+ def initialize(request, protocols: [], version: 13, &block)
75
77
  @key = Nounce.generate_key
76
78
 
77
- headers = [
78
- [SEC_WEBSOCKET_KEY, @key],
79
- [SEC_WEBSOCKET_VERSION, version],
80
- ]
79
+ headers = ::Protocol::HTTP::Headers[request.headers]
80
+
81
+ headers.add(SEC_WEBSOCKET_KEY, @key)
82
+ headers.add(SEC_WEBSOCKET_VERSION, String(version))
81
83
 
82
84
  if protocols.any?
83
- headers << [SEC_WEBSOCKET_PROTOCOL, protocols.join(',')]
85
+ headers.add(SEC_WEBSOCKET_PROTOCOL, protocols.join(','))
84
86
  end
85
87
 
86
- merged_headers = ::Protocol::HTTP::Headers::Merged.new(request.headers, headers)
87
-
88
- super(request.scheme, request.authority, ::Protocol::HTTP::Methods::GET, request.path, nil, merged_headers, nil, PROTOCOL)
88
+ super(request.scheme, request.authority, ::Protocol::HTTP::Methods::GET, request.path, nil, headers, nil, PROTOCOL)
89
89
  end
90
90
 
91
91
  def call(connection)
@@ -31,17 +31,17 @@ module Async
31
31
  include ::Protocol::WebSocket::Headers
32
32
 
33
33
  def initialize(request, headers = nil, protocol: nil, &block)
34
- headers = Protocol::HTTP::Headers::Merged.new(headers)
34
+ headers = ::Protocol::HTTP::Headers[headers]
35
35
 
36
36
  if accept_nounce = request.headers[SEC_WEBSOCKET_KEY]&.first
37
- headers << [[SEC_WEBSOCKET_ACCEPT, Nounce.accept_digest(accept_nounce)]]
37
+ headers.add(SEC_WEBSOCKET_ACCEPT, Nounce.accept_digest(accept_nounce))
38
38
  status = 101
39
39
  else
40
40
  status = 400
41
41
  end
42
42
 
43
43
  if protocol
44
- headers << [[SEC_WEBSOCKET_PROTOCOL, protocol]]
44
+ headers.add(SEC_WEBSOCKET_PROTOCOL, protocol)
45
45
  end
46
46
 
47
47
  body = Async::HTTP::Body::Hijack.wrap(request, &block)
@@ -20,6 +20,6 @@
20
20
 
21
21
  module Async
22
22
  module WebSocket
23
- VERSION = "0.13.1"
23
+ VERSION = "0.18.0"
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-websocket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-04 00:00:00.000000000 Z
11
+ date: 2021-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: async-io
14
+ name: async-http
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.23'
19
+ version: '0.54'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.23'
26
+ version: '0.54'
27
27
  - !ruby/object:Gem::Dependency
28
- name: async-http
28
+ name: async-io
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.43'
33
+ version: '1.23'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.43'
40
+ version: '1.23'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: protocol-websocket
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -67,21 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: falcon
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '0.32'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '0.32'
83
- - !ruby/object:Gem::Dependency
84
- name: covered
70
+ name: bundler
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - ">="
@@ -95,7 +81,7 @@ dependencies:
95
81
  - !ruby/object:Gem::Version
96
82
  version: '0'
97
83
  - !ruby/object:Gem::Dependency
98
- name: bundler
84
+ name: covered
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - ">="
@@ -109,21 +95,21 @@ dependencies:
109
95
  - !ruby/object:Gem::Version
110
96
  version: '0'
111
97
  - !ruby/object:Gem::Dependency
112
- name: rspec
98
+ name: falcon
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
101
  - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: '3.6'
103
+ version: '0.34'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: '3.6'
110
+ version: '0.34'
125
111
  - !ruby/object:Gem::Dependency
126
- name: rake
112
+ name: rack-test
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
115
  - - ">="
@@ -136,64 +122,29 @@ dependencies:
136
122
  - - ">="
137
123
  - !ruby/object:Gem::Version
138
124
  version: '0'
139
- description:
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.6'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.6'
139
+ description:
140
140
  email:
141
- - samuel.williams@oriontransfer.co.nz
142
141
  executables: []
143
142
  extensions: []
144
143
  extra_rdoc_files: []
145
144
  files:
146
- - ".editorconfig"
147
- - ".gitignore"
148
- - ".rspec"
149
- - ".travis.yml"
150
- - Gemfile
151
- - README.md
152
- - Rakefile
153
- - async-websocket.gemspec
154
- - examples/chat/README.md
155
- - examples/chat/client.rb
156
- - examples/chat/config.ru
157
- - examples/chat/multi-client.rb
158
- - examples/mud/client.rb
159
- - examples/mud/config.ru
160
- - examples/rack/client.rb
161
- - examples/rack/config.ru
162
- - examples/utopia/.bowerrc
163
- - examples/utopia/.gitignore
164
- - examples/utopia/.rspec
165
- - examples/utopia/Gemfile
166
- - examples/utopia/Guardfile
167
- - examples/utopia/README.md
168
- - examples/utopia/Rakefile
169
- - examples/utopia/config.ru
170
- - examples/utopia/config/README.md
171
- - examples/utopia/config/environment.rb
172
- - examples/utopia/lib/readme.txt
173
- - examples/utopia/pages/_heading.xnode
174
- - examples/utopia/pages/_page.xnode
175
- - examples/utopia/pages/client/client.js
176
- - examples/utopia/pages/client/index.xnode
177
- - examples/utopia/pages/errors/exception.xnode
178
- - examples/utopia/pages/errors/file-not-found.xnode
179
- - examples/utopia/pages/links.yaml
180
- - examples/utopia/pages/server/controller.rb
181
- - examples/utopia/public/_static/icon.png
182
- - examples/utopia/public/_static/site.css
183
- - examples/utopia/public/_static/utopia-background.svg
184
- - examples/utopia/public/_static/utopia.svg
185
- - examples/utopia/public/readme.txt
186
- - examples/utopia/spec/spec_helper.rb
187
- - examples/utopia/spec/website_context.rb
188
- - examples/utopia/spec/website_spec.rb
189
- - examples/utopia/tasks/bower.rake
190
- - examples/utopia/tasks/deploy.rake
191
- - examples/utopia/tasks/development.rake
192
- - examples/utopia/tasks/environment.rake
193
- - examples/utopia/tasks/log.rake
194
- - examples/utopia/tasks/static.rake
195
145
  - lib/async/websocket.rb
196
146
  - lib/async/websocket/adapters/rack.rb
147
+ - lib/async/websocket/adapters/rails.rb
197
148
  - lib/async/websocket/client.rb
198
149
  - lib/async/websocket/connect_request.rb
199
150
  - lib/async/websocket/connect_response.rb
@@ -206,20 +157,11 @@ files:
206
157
  - lib/async/websocket/upgrade_request.rb
207
158
  - lib/async/websocket/upgrade_response.rb
208
159
  - lib/async/websocket/version.rb
209
- - spec/async/websocket/adapters/rack/client.rb
210
- - spec/async/websocket/adapters/rack/config.ru
211
- - spec/async/websocket/adapters/rack_spec.rb
212
- - spec/async/websocket/client_spec.rb
213
- - spec/async/websocket/connection_spec.rb
214
- - spec/async/websocket/server_examples.rb
215
- - spec/async/websocket/server_spec.rb
216
- - spec/async/websocket/upgrade.rb
217
- - spec/spec_helper.rb
218
- homepage: ''
160
+ homepage: https://github.com/socketry/async-websocket
219
161
  licenses:
220
162
  - MIT
221
163
  metadata: {}
222
- post_install_message:
164
+ post_install_message:
223
165
  rdoc_options: []
224
166
  require_paths:
225
167
  - lib
@@ -234,17 +176,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
176
  - !ruby/object:Gem::Version
235
177
  version: '0'
236
178
  requirements: []
237
- rubygems_version: 3.0.3
238
- signing_key:
179
+ rubygems_version: 3.1.2
180
+ signing_key:
239
181
  specification_version: 4
240
182
  summary: An async websocket library on top of websocket-driver.
241
- test_files:
242
- - spec/async/websocket/adapters/rack/client.rb
243
- - spec/async/websocket/adapters/rack/config.ru
244
- - spec/async/websocket/adapters/rack_spec.rb
245
- - spec/async/websocket/client_spec.rb
246
- - spec/async/websocket/connection_spec.rb
247
- - spec/async/websocket/server_examples.rb
248
- - spec/async/websocket/server_spec.rb
249
- - spec/async/websocket/upgrade.rb
250
- - spec/spec_helper.rb
183
+ test_files: []