async-websocket 0.13.0 → 0.17.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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/lib/async/websocket/adapters/rack.rb +7 -1
  3. data/lib/async/websocket/client.rb +39 -17
  4. data/lib/async/websocket/connect_request.rb +35 -17
  5. data/lib/async/websocket/connect_response.rb +2 -2
  6. data/lib/async/websocket/connection.rb +21 -2
  7. data/lib/async/websocket/request.rb +1 -1
  8. data/lib/async/websocket/response.rb +1 -1
  9. data/lib/async/websocket/server.rb +2 -0
  10. data/lib/async/websocket/upgrade_request.rb +9 -9
  11. data/lib/async/websocket/upgrade_response.rb +3 -3
  12. data/lib/async/websocket/version.rb +1 -1
  13. metadata +35 -102
  14. data/.editorconfig +0 -6
  15. data/.gitignore +0 -13
  16. data/.rspec +0 -3
  17. data/.travis.yml +0 -18
  18. data/Gemfile +0 -12
  19. data/README.md +0 -129
  20. data/Rakefile +0 -6
  21. data/async-websocket.gemspec +0 -29
  22. data/examples/chat/client.rb +0 -32
  23. data/examples/chat/config.ru +0 -113
  24. data/examples/chat/multi-client.rb +0 -81
  25. data/examples/mud/client.rb +0 -34
  26. data/examples/mud/config.ru +0 -142
  27. data/examples/rack/client.rb +0 -20
  28. data/examples/rack/config.ru +0 -14
  29. data/examples/utopia/.bowerrc +0 -4
  30. data/examples/utopia/.gitignore +0 -9
  31. data/examples/utopia/.rspec +0 -4
  32. data/examples/utopia/Gemfile +0 -33
  33. data/examples/utopia/Guardfile +0 -29
  34. data/examples/utopia/README.md +0 -16
  35. data/examples/utopia/Rakefile +0 -8
  36. data/examples/utopia/config.ru +0 -47
  37. data/examples/utopia/config/README.md +0 -7
  38. data/examples/utopia/config/environment.rb +0 -8
  39. data/examples/utopia/lib/readme.txt +0 -1
  40. data/examples/utopia/pages/_heading.xnode +0 -2
  41. data/examples/utopia/pages/_page.xnode +0 -30
  42. data/examples/utopia/pages/client/client.js +0 -28
  43. data/examples/utopia/pages/client/index.xnode +0 -8
  44. data/examples/utopia/pages/errors/exception.xnode +0 -5
  45. data/examples/utopia/pages/errors/file-not-found.xnode +0 -5
  46. data/examples/utopia/pages/links.yaml +0 -2
  47. data/examples/utopia/pages/server/controller.rb +0 -26
  48. data/examples/utopia/public/_static/icon.png +0 -0
  49. data/examples/utopia/public/_static/site.css +0 -205
  50. data/examples/utopia/public/_static/utopia-background.svg +0 -1
  51. data/examples/utopia/public/_static/utopia.svg +0 -1
  52. data/examples/utopia/public/readme.txt +0 -1
  53. data/examples/utopia/spec/spec_helper.rb +0 -31
  54. data/examples/utopia/spec/website_context.rb +0 -11
  55. data/examples/utopia/spec/website_spec.rb +0 -56
  56. data/examples/utopia/tasks/bower.rake +0 -45
  57. data/examples/utopia/tasks/deploy.rake +0 -13
  58. data/examples/utopia/tasks/development.rake +0 -34
  59. data/examples/utopia/tasks/environment.rake +0 -17
  60. data/examples/utopia/tasks/log.rake +0 -17
  61. data/examples/utopia/tasks/static.rake +0 -43
  62. data/spec/async/websocket/adapters/rack/client.rb +0 -38
  63. data/spec/async/websocket/adapters/rack/config.ru +0 -23
  64. data/spec/async/websocket/adapters/rack_spec.rb +0 -84
  65. data/spec/async/websocket/client_spec.rb +0 -48
  66. data/spec/async/websocket/connection_spec.rb +0 -34
  67. data/spec/async/websocket/server_examples.rb +0 -76
  68. data/spec/async/websocket/server_spec.rb +0 -31
  69. data/spec/async/websocket/upgrade.rb +0 -43
  70. data/spec/spec_helper.rb +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 37e8a4add65ab76660e26f32c32f175127010ea482bcc4ec667a33599537955d
4
- data.tar.gz: 1cf93bfb5264891e5b500c7c9d97462a481d6f5947bd3461b1431c2b4b289e3f
3
+ metadata.gz: d2b2cae182fcc4c6dbfd9724236afc25472d930a98be9496b4bc2af6f67ad502
4
+ data.tar.gz: a9bb7c63e69247a287bd512973788d0e807b6464835ebef1f5d5d1c407574327
5
5
  SHA512:
6
- metadata.gz: 9fc18c9154780780e29ef16a233b7386fa9cc915f94d1e1bc573cdccc3fdc835b7ad778a5c686d14ac4e4b156e77e84ff3bed810afc02feb1bc326ceae8aa237
7
- data.tar.gz: 92332727953f7660154439cf5e86524a498ce335b666728f74bca9b22e6ba8f61dfa7b7bc4f6e66b702ff83de5c060b8c2189b7d0831c5fbb98a95e8b8669f32
6
+ metadata.gz: e0f1f16a9e9fecfa3b68eec6c3b18b63588477ef3b4d2049d42a017e9f35073c6b54641585db4cbebaeff53a37537c742130354ee604620c68c79b24980d6bdf
7
+ data.tar.gz: 2b43de05bcffc2089345160f21e853bba156430b183ce8b0268ca229c0903f11b723849bcec6d8117271580d9265b2ac0999aacd7be9d336987401ec09c179ba
@@ -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
@@ -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
@@ -24,6 +24,8 @@ require 'protocol/http/request'
24
24
  require 'protocol/http/headers'
25
25
  require 'protocol/websocket/headers'
26
26
 
27
+ require 'async/http/body/stream'
28
+
27
29
  module Async
28
30
  module WebSocket
29
31
  # This is required for HTTP/1.x to upgrade the connection to the WebSocket protocol.
@@ -32,14 +34,19 @@ module Async
32
34
  include ::Protocol::WebSocket::Headers
33
35
 
34
36
  class Wrapper
35
- def initialize(body, response)
36
- @body = body
37
+ def initialize(stream, response)
37
38
  @response = response
38
- @stream = nil
39
+ @body = @response.body
40
+ @stream = stream
39
41
  end
40
42
 
43
+ attr_accessor :response
44
+
45
+ attr_accessor :body
46
+ attr_accessor :stream
47
+
41
48
  def stream?
42
- @response.success?
49
+ @response.success? and @stream
43
50
  end
44
51
 
45
52
  def status
@@ -54,35 +61,46 @@ module Async
54
61
  true
55
62
  end
56
63
 
57
- attr_accessor :body
58
-
59
64
  def protocol
60
65
  @response.protocol
61
66
  end
67
+ end
68
+
69
+ class Hijack < Async::HTTP::Body::Readable
70
+ def initialize(request)
71
+ @request = request
72
+ @stream = nil
73
+ end
62
74
 
63
- def stream
64
- @stream ||= Async::HTTP::Body::Stream.new(@response.body, @body)
75
+ def stream?
76
+ true
77
+ end
78
+
79
+ attr :stream
80
+
81
+ def call(stream)
82
+ @stream = stream
65
83
  end
66
84
  end
67
85
 
68
- def initialize(request, protocols: [], version: 13)
69
- body = Async::HTTP::Body::Writable.new
86
+ def initialize(request, protocols: [], version: 13, &block)
87
+ body = Hijack.new(self)
70
88
 
71
- headers = []
89
+ headers = ::Protocol::HTTP::Headers[request.headers]
72
90
 
73
- headers << [SEC_WEBSOCKET_VERSION, version]
91
+ headers.add(SEC_WEBSOCKET_VERSION, String(version))
74
92
 
75
93
  if protocols.any?
76
- headers << [SEC_WEBSOCKET_PROTOCOL, protocols.join(',')]
94
+ headers.add(SEC_WEBSOCKET_PROTOCOL, protocols.join(','))
77
95
  end
78
96
 
79
- merged_headers = ::Protocol::HTTP::Headers::Merged.new(request.headers, headers)
80
-
81
- 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)
82
98
  end
83
99
 
84
100
  def call(connection)
85
- Wrapper.new(@body, super)
101
+ response = super
102
+
103
+ Wrapper.new(@body.stream, response)
86
104
  end
87
105
  end
88
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.0"
23
+ VERSION = "0.17.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.0
4
+ version: 0.17.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-06-22 00:00:00.000000000 Z
11
+ date: 2021-02-13 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,61 +122,26 @@ 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/client.rb
155
- - examples/chat/config.ru
156
- - examples/chat/multi-client.rb
157
- - examples/mud/client.rb
158
- - examples/mud/config.ru
159
- - examples/rack/client.rb
160
- - examples/rack/config.ru
161
- - examples/utopia/.bowerrc
162
- - examples/utopia/.gitignore
163
- - examples/utopia/.rspec
164
- - examples/utopia/Gemfile
165
- - examples/utopia/Guardfile
166
- - examples/utopia/README.md
167
- - examples/utopia/Rakefile
168
- - examples/utopia/config.ru
169
- - examples/utopia/config/README.md
170
- - examples/utopia/config/environment.rb
171
- - examples/utopia/lib/readme.txt
172
- - examples/utopia/pages/_heading.xnode
173
- - examples/utopia/pages/_page.xnode
174
- - examples/utopia/pages/client/client.js
175
- - examples/utopia/pages/client/index.xnode
176
- - examples/utopia/pages/errors/exception.xnode
177
- - examples/utopia/pages/errors/file-not-found.xnode
178
- - examples/utopia/pages/links.yaml
179
- - examples/utopia/pages/server/controller.rb
180
- - examples/utopia/public/_static/icon.png
181
- - examples/utopia/public/_static/site.css
182
- - examples/utopia/public/_static/utopia-background.svg
183
- - examples/utopia/public/_static/utopia.svg
184
- - examples/utopia/public/readme.txt
185
- - examples/utopia/spec/spec_helper.rb
186
- - examples/utopia/spec/website_context.rb
187
- - examples/utopia/spec/website_spec.rb
188
- - examples/utopia/tasks/bower.rake
189
- - examples/utopia/tasks/deploy.rake
190
- - examples/utopia/tasks/development.rake
191
- - examples/utopia/tasks/environment.rake
192
- - examples/utopia/tasks/log.rake
193
- - examples/utopia/tasks/static.rake
194
145
  - lib/async/websocket.rb
195
146
  - lib/async/websocket/adapters/rack.rb
196
147
  - lib/async/websocket/client.rb
@@ -205,20 +156,11 @@ files:
205
156
  - lib/async/websocket/upgrade_request.rb
206
157
  - lib/async/websocket/upgrade_response.rb
207
158
  - lib/async/websocket/version.rb
208
- - spec/async/websocket/adapters/rack/client.rb
209
- - spec/async/websocket/adapters/rack/config.ru
210
- - spec/async/websocket/adapters/rack_spec.rb
211
- - spec/async/websocket/client_spec.rb
212
- - spec/async/websocket/connection_spec.rb
213
- - spec/async/websocket/server_examples.rb
214
- - spec/async/websocket/server_spec.rb
215
- - spec/async/websocket/upgrade.rb
216
- - spec/spec_helper.rb
217
- homepage: ''
159
+ homepage: https://github.com/socketry/async-websocket
218
160
  licenses:
219
161
  - MIT
220
162
  metadata: {}
221
- post_install_message:
163
+ post_install_message:
222
164
  rdoc_options: []
223
165
  require_paths:
224
166
  - lib
@@ -233,17 +175,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
233
175
  - !ruby/object:Gem::Version
234
176
  version: '0'
235
177
  requirements: []
236
- rubygems_version: 3.0.2
237
- signing_key:
178
+ rubygems_version: 3.1.2
179
+ signing_key:
238
180
  specification_version: 4
239
181
  summary: An async websocket library on top of websocket-driver.
240
- test_files:
241
- - spec/async/websocket/adapters/rack/client.rb
242
- - spec/async/websocket/adapters/rack/config.ru
243
- - spec/async/websocket/adapters/rack_spec.rb
244
- - spec/async/websocket/client_spec.rb
245
- - spec/async/websocket/connection_spec.rb
246
- - spec/async/websocket/server_examples.rb
247
- - spec/async/websocket/server_spec.rb
248
- - spec/async/websocket/upgrade.rb
249
- - spec/spec_helper.rb
182
+ test_files: []