isomorfeus-transport 1.0.0.epsilon1 → 1.0.0.epsilon2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f9e7890d7ca628a4614a6a4e3de0ad0467717bbe0b02a066a6fee492599e388d
4
- data.tar.gz: a85016972c084ebb08b007a7e5bae647d07f79b64032f0045090439897c05683
3
+ metadata.gz: 156d5a0bbc947739e0d57f23ed7aa1386280d344c9dabdc36fa8b1b8ed0542b7
4
+ data.tar.gz: ba4ebf50a3db87d9d1b7642673dabd3f9b8d0f708a591ee0e8724d003f7b3c82
5
5
  SHA512:
6
- metadata.gz: 2d7fe714d72e1d97627f450eab8e04fc06488eefc765682fb07bf31883676d07935a701b8cf7529597762fb12aa8b45c167c48bd41cf34b55058c6bdd78a2153
7
- data.tar.gz: a4c79056f41aaa4c07bd3b8b5244f0b1eaf21be0e7120ad06cd7e13251a8501e37f18c8920763fa0fa15e65aebbc4bbd4c9d49ed541d21b69d79187d85c5a104
6
+ metadata.gz: ffbac3af6f7d712b92bc87aac4d7d098d846e7d4bfc822f4a35eaedd1ec3beb561866a496d3d76497e5653aa3cf4b5671b7e1a382e29d46cf17be49018b9b164
7
+ data.tar.gz: ba2d8722c629bd7a4738b3be7a980e13aa8cf45dcdb1df5fb02cee653cded9778d690913c00f296207e07e644e0db2ae03081c5d8ece1d7ad5f6800fdf6471a6
data/README.md CHANGED
@@ -30,6 +30,47 @@ Client and Server:
30
30
  Server only:
31
31
  - Isomorfeus.middlewares - all the rack middlewares to load
32
32
 
33
+ ## Authentication
34
+
35
+ For authentication in isomorfeus there is a class `Anonymous`, so whenever no user is logged in, the anonymous user is passed on to operations or data loads. In my opinion it is more true than no user (nil), because in fact there probably is a user, just the user is unknown. The Anonymous user has a default policy that denies everything, the user will respond to .authorized?(whatever) always with false by default.
36
+ Of course, the developer can add a Policy easily, to allow certain operations or data loads, or whatever or everything:
37
+ ```ruby
38
+ class MyAnonymousPolicy < LucidPolicy::Base
39
+ policy_for Anonymous
40
+ allow all
41
+ end
42
+ ```
43
+
44
+ A class representing a user should be a LucidNode and include LucidAuthentication::Mixin:
45
+ ```ruby
46
+ class User < LucidNode::Base
47
+ include LucidAuthentication::Mixin
48
+ authentication do |user_identifier, user_password_or token|
49
+ # should return either a User instance or a Promise which reselves to a User instance
50
+ end
51
+ end
52
+ ```
53
+ With that its possible to do on the client (or server):
54
+ ```ruby
55
+ User.promise_login(user_identifier, user_password_or_token).then do |user|
56
+ # do something with user
57
+ end
58
+ ```
59
+ or later on:
60
+ ```ruby
61
+ user.promise_logout
62
+ ```
63
+ The authentication in isomorfeus is prepared for external or alternate authentication schemes, example:
64
+ ```ruby
65
+ User.promise_login(user_identifier, token, :facebook).then do |user|
66
+ # do something with user
67
+ end
68
+ ```
69
+ will call:
70
+ ```ruby
71
+ User.promise_authentication_with_facebook(user_identifier, token)
72
+ ```
73
+ which would have to be implemented.
33
74
 
34
75
  ## LucidChannel
35
76
 
@@ -57,7 +98,7 @@ class MyChannel < LucidChannel::Base
57
98
  end
58
99
  ```
59
100
 
60
- ### Sending mesages
101
+ ### Sending messages
61
102
  ```ruby
62
103
  MyChannel.send_message('uiuiui')
63
104
  ```
@@ -2,19 +2,18 @@ module Isomorfeus
2
2
  # available settings
3
3
 
4
4
  if RUBY_ENGINE == 'opal'
5
+ add_client_option(:api_websocket_path)
6
+ add_client_option(:transport_init_class_names, [])
7
+
5
8
  def self.add_transport_init_class_name(init_class_name)
6
9
  transport_init_class_names << init_class_name
7
10
  end
8
-
9
- add_client_option(:api_websocket_path)
10
- add_client_option(:transport_init_class_names, [])
11
11
  else
12
12
  class << self
13
13
  attr_accessor :api_websocket_path
14
- attr_accessor :middlewares
15
14
 
16
15
  def add_middleware(middleware)
17
- Isomorfeus.middlewares << middleware unless Isomorfeus.middlewares.include?(middleware)
16
+ Isomorfeus.middlewares << middleware
18
17
  end
19
18
 
20
19
  def insert_middleware_after(existing_middleware, new_middleware)
@@ -39,6 +38,19 @@ module Isomorfeus
39
38
  end
40
39
  end
41
40
 
41
+ def middlewares
42
+ @middlewares ||= Set.new
43
+ end
44
+
45
+ def cached_channel_classes
46
+ @cached_channel_classes ||= {}
47
+ end
48
+
49
+ def cached_channel_class(class_name)
50
+ return cached_channel_classes[class_name] if cached_channel_classes.key?(class_name)
51
+ cached_channel_classes[class_name] = "::#{class_name}".constantize
52
+ end
53
+
42
54
  def valid_channel_class_names
43
55
  @valid_channel_class_names ||= Set.new
44
56
  end
@@ -75,8 +87,15 @@ module Isomorfeus
75
87
  return cached_handler_classes[class_name] if cached_handler_classes.key?(class_name)
76
88
  cached_handler_classes[class_name] = "::#{class_name}".constantize
77
89
  end
90
+
91
+ def valid_user_classes
92
+ @valid_user_classes ||= Set.new
93
+ end
94
+
95
+ def add_valid_user_class(user_class)
96
+ valid_user_classes << user_class
97
+ end
78
98
  end
79
- self.middlewares = Set.new
80
99
  end
81
100
 
82
101
  # defaults
@@ -0,0 +1,58 @@
1
+ module Isomorfeus
2
+ module Transport
3
+ module Handler
4
+ class AuthenticationHandler < LucidHandler::Base
5
+ TIMEOUT = 30
6
+
7
+ on_request do |pub_sub_client, current_user, request, _response|
8
+ result = { error: 'Authentication failed' }
9
+ # promise_send_path('Isomorfeus::Transport::Handler::AuthenticationHandler', 'login', user_identifier, user_password)
10
+ request.each_key do |login_or_logout|
11
+ if login_or_logout == 'login'
12
+ tries = pub_sub_client.instance_variable_get(:@isomorfeus_authentication_tries)
13
+ tries = 0 unless tries
14
+ tries += 1
15
+ sleep(5) if tries > 3
16
+ pub_sub_client.instance_variable_set(:@isomorfeus_authentication_tries, tries)
17
+ request['login'].each_key do |user_identifier|
18
+ user = nil
19
+ Isomorfeus.valid_user_classes.each do |user_class|
20
+ promise = user_class.promise_login(user_identifier, request['login'][user_identifier])
21
+ unless promise.realized?
22
+ start = Time.now
23
+ until promise.realized?
24
+ break if (Time.now - start) > TIMEOUT
25
+ sleep 0.01
26
+ end
27
+ end
28
+ user = promise.value
29
+ break if user
30
+ end
31
+ if user
32
+ pub_sub_client.instance_variable_set(:@isomorfeus_user, user)
33
+ pub_sub_client.instance_variable_set(:@isomorfeus_authentication_tries, nil)
34
+ result = { success: 'ok', data: user.to_transport }
35
+ end
36
+ end
37
+ elsif login_or_logout == 'logout'
38
+ begin
39
+ promise = current_user.promise_logout
40
+ unless promise.realized?
41
+ start = Time.now
42
+ until promise.realized?
43
+ break if (Time.now - start) > TIMEOUT
44
+ sleep 0.01
45
+ end
46
+ end
47
+ ensure
48
+ pub_sub_client.instance_variable_set(:@isomorfeus_user, nil)
49
+ result = { success: 'ok' }
50
+ end
51
+ end
52
+ end
53
+ result
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -3,8 +3,6 @@
3
3
  module Isomorfeus
4
4
  module Transport
5
5
  class RackMiddleware
6
- include Isomorfeus::Transport::ServerProcessor
7
-
8
6
  WS_RESPONSE = [0, {}, []]
9
7
 
10
8
  def initialize(app)
@@ -13,9 +11,8 @@ module Isomorfeus
13
11
 
14
12
  def call(env)
15
13
  if env['PATH_INFO'] == Isomorfeus.api_websocket_path
16
- user = defined?(Warden::Manager) ? env['warden'].user : nil
17
14
  if env['rack.upgrade?'] == :websocket
18
- env['rack.upgrade'] = Isomorfeus::Transport::ServerSocketProcessor.new(env['rack.session'], user)
15
+ env['rack.upgrade'] = Isomorfeus::Transport::ServerSocketProcessor.new
19
16
  end
20
17
  WS_RESPONSE
21
18
  else
@@ -3,7 +3,7 @@
3
3
  module Isomorfeus
4
4
  module Transport
5
5
  module ServerProcessor
6
- def process_request(client, session_id, current_user, request)
6
+ def process_request(client, current_user, request)
7
7
  Thread.current[:isomorfeus_pub_sub_client] = client
8
8
 
9
9
  response = { response: { agent_ids: {}} }
@@ -14,7 +14,7 @@ module Isomorfeus
14
14
  begin
15
15
  handler = Isomorfeus.cached_handler_class(handler_class_name) if Isomorfeus.valid_handler_class_name?(handler_class_name)
16
16
  if handler
17
- result = handler.new.process_request(client, session_id, current_user, request['request']['agent_ids'][agent_id][handler_class_name], response)
17
+ result = handler.new.process_request(client, current_user, request['request']['agent_ids'][agent_id][handler_class_name], response)
18
18
  response[:response][:agent_ids][agent_id] = result
19
19
  else
20
20
  response[:response][:agent_ids][agent_id] = { error: { handler_class_name => 'No such handler!'}}
@@ -29,12 +29,21 @@ module Isomorfeus
29
29
  channel = request['notification']['channel']
30
30
  class_name = request['notification']['class']
31
31
  if Isomorfeus.valid_channel_class_name?(class_name) && channel
32
- client.publish(request['notification']['channel'], Oj.dump({ 'notification' => request['notification'] }, mode: :strict))
32
+ channel_class = Isomorfeus.cached_channel_class(class_name)
33
+ if channel_class && current_user.authorized?(channel_class, :send_message, channel)
34
+ client.publish(request['notification']['channel'], Oj.dump({ 'notification' => request['notification'] }, mode: :strict))
35
+ else
36
+ response[:response] = { error: 'Not authorized!' }
37
+ end
33
38
  else
34
- response[:response] = 'No such thing!'
39
+ response[:response] = { error: 'No such thing!' }
35
40
  end
36
- rescue
37
- response[:response] = 'No such thing!'
41
+ rescue Exception => e
42
+ response[:response] = if Isomorfeus.production?
43
+ { error: 'No such thing!' }
44
+ else
45
+ { error: "Isomorfeus::Transport::ServerProcessor: #{e.message}" }
46
+ end
38
47
  end
39
48
  elsif request.key?('subscribe') && request['subscribe'].key?('agent_ids')
40
49
  begin
@@ -42,13 +51,22 @@ module Isomorfeus
42
51
  channel = request['subscribe']['agent_ids'][agent_id]['channel']
43
52
  class_name = request['subscribe']['agent_ids'][agent_id]['class']
44
53
  if Isomorfeus.valid_channel_class_name?(class_name) && channel
45
- client.subscribe(channel)
46
- response[:response][:agent_ids][agent_id] = { success: channel }
54
+ channel_class = Isomorfeus.cached_channel_class(class_name)
55
+ if channel_class && current_user.authorized?(channel_class, :subscribe, channel)
56
+ client.subscribe(channel)
57
+ response[:response][:agent_ids][agent_id] = { success: channel }
58
+ else
59
+ response[:response][:agent_ids][agent_id] = { error: "Not authorized!"}
60
+ end
47
61
  else
48
62
  response[:response][:agent_ids][agent_id] = { error: "No such thing!"}
49
63
  end
50
- rescue
51
- response[:response][:agent_ids][agent_id] = { error: { key => 'No such handler!'}}
64
+ rescue Exception => e
65
+ response[:response][:agent_ids][agent_id] = if Isomorfeus.production?
66
+ { error: 'No such thing!' }
67
+ else
68
+ { error: "Isomorfeus::Transport::ServerProcessor: #{e.message}" }
69
+ end
52
70
  end
53
71
  elsif request.key?('unsubscribe') && request['unsubscribe'].key?('agent_ids')
54
72
  begin
@@ -56,13 +74,22 @@ module Isomorfeus
56
74
  channel = request['unsubscribe']['agent_ids'][agent_id]['channel']
57
75
  class_name = request['unsubscribe']['agent_ids'][agent_id]['class']
58
76
  if Isomorfeus.valid_channel_class_name?(class_name) && channel
59
- client.unsubscribe(channel)
60
- response[:response][:agent_ids][agent_id] = { success: channel }
77
+ channel_class = Isomorfeus.cached_channel_class(class_name)
78
+ if channel_class && current_user.authorized?(channel_class, :unsubscribe, channel)
79
+ client.unsubscribe(channel)
80
+ response[:response][:agent_ids][agent_id] = { success: channel }
81
+ else
82
+ response[:response][:agent_ids][agent_id] = { error: "Not authorized!"}
83
+ end
61
84
  else
62
85
  response[:response][:agent_ids][agent_id] = { error: 'No such thing!'}
63
86
  end
64
- rescue
65
- response[:response][:agent_ids][agent_id] = { error: { key => 'No such handler!'}}
87
+ rescue Exception => e
88
+ response[:response][:agent_ids][agent_id] = if Isomorfeus.production?
89
+ { error: 'No such thing!' }
90
+ else
91
+ { error: "Isomorfeus::Transport::ServerProcessor: #{e.message}" }
92
+ end
66
93
  end
67
94
  else
68
95
  response[:response] = { error: 'No such thing!'}
@@ -3,14 +3,9 @@ module Isomorfeus
3
3
  class ServerSocketProcessor
4
4
  include Isomorfeus::Transport::ServerProcessor
5
5
 
6
- def initialize(session_id, user)
7
- @session_id = session_id
8
- @user = user
9
- end
10
-
11
6
  def on_message(client, data)
12
7
  request_hash = Oj.load(data, mode: :strict)
13
- result = process_request(client, @session_id, @user, request_hash)
8
+ result = process_request(client, user(client), request_hash)
14
9
  client.write Oj.dump(result, mode: :strict)
15
10
  end
16
11
 
@@ -25,6 +20,10 @@ module Isomorfeus
25
20
  def on_shutdown(client)
26
21
  # nothing for now
27
22
  end
23
+
24
+ def user(client)
25
+ client.instance_variable_get(:@isomorfeus_user) || Anonymous.new
26
+ end
28
27
  end
29
28
  end
30
29
  end
@@ -1,5 +1,5 @@
1
1
  module Isomorfeus
2
2
  module Transport
3
- VERSION = '1.0.0.epsilon1'
3
+ VERSION = '1.0.0.epsilon2'
4
4
  end
5
5
  end
@@ -41,6 +41,10 @@ module Isomorfeus
41
41
  @native_websocket.JS[:onopen] = `function(event) { block.$call(event); }`
42
42
  end
43
43
 
44
+ def protocol
45
+ @native_websocket.JS[:protocol]
46
+ end
47
+
44
48
  def send(data)
45
49
  case ready_state
46
50
  when OPEN then @native_websocket.JS.send(data)
@@ -32,7 +32,7 @@ module Isomorfeus
32
32
  @socket.on_error do
33
33
  @socket.close
34
34
  delay do
35
- Isomorfeus::Transport.connect
35
+ Isomorfeus::Transport.promise_connect
36
36
  end
37
37
  end
38
38
  @socket.on_message do |event|
@@ -2,6 +2,8 @@ require 'opal'
2
2
  require 'opal-autoloader'
3
3
  require 'opal-activesupport'
4
4
  require 'isomorfeus-react'
5
+ require 'isomorfeus-policy'
6
+ require 'lucid_authentication/mixin'
5
7
  if RUBY_ENGINE == 'opal'
6
8
  require 'json'
7
9
  require 'isomorfeus/config'
@@ -33,6 +35,7 @@ else
33
35
  require 'isomorfeus/transport/server_processor'
34
36
  require 'isomorfeus/transport/server_socket_processor'
35
37
  require 'isomorfeus/transport/websocket'
38
+
36
39
  require 'isomorfeus/transport/rack_middleware'
37
40
  require 'isomorfeus/transport/middlewares'
38
41
 
@@ -44,21 +47,21 @@ else
44
47
  require 'lucid_channel/mixin'
45
48
  require 'lucid_channel/base'
46
49
 
50
+ require 'isomorfeus/transport/handler/authentication_handler'
51
+
47
52
  Opal.append_path(__dir__.untaint) unless Opal.paths.include?(__dir__.untaint)
48
53
 
49
54
  require 'active_support'
50
55
  require 'active_support/dependencies'
51
56
 
52
57
  %w[channels handlers].each do |dir|
53
- path = if Dir.exist?(File.join('app', 'isomorfeus'))
54
- File.expand_path(File.join('app', 'isomorfeus', dir))
55
- elsif Dir.exist?(File.join('isomorfeus'))
56
- File.expand_path(File.join('isomorfeus', dir))
57
- end
58
- ActiveSupport::Dependencies.autoload_paths << path if path
59
- # we also need to require them all, so classes are registered accordingly
60
- Dir.glob("#{path}/**/*.rb").each do |file|
61
- require file
58
+ path = Dir.exist?(File.join('isomorfeus')) ? File.expand_path(File.join('isomorfeus', dir)) : nil
59
+ if path
60
+ ActiveSupport::Dependencies.autoload_paths << path
61
+ # we also need to require them all, so classes are registered accordingly
62
+ Dir.glob("#{path}/**/*.rb").each do |file|
63
+ require file
64
+ end
62
65
  end
63
66
  end
64
67
  end
@@ -0,0 +1,76 @@
1
+ module LucidAuthentication
2
+ module Mixin
3
+ if RUBY_ENGINE == 'opal'
4
+ def self.included(base)
5
+
6
+ base.instance_exec do
7
+ def authentication(&block)
8
+ end
9
+
10
+ def promise_login(user_identifier, user_password, scheme = :isomorfeus)
11
+ send("promise_authentication_with_#{scheme}", user_identifier, user_password)
12
+ end
13
+
14
+ def promise_authentication_with_isomorfeus(user_identifier, user_password)
15
+ if Isomorfeus.production?
16
+ raise "Connection not secure, can't login" unless Isomorfeus::Transport.socket.url.start_with?('wss:')
17
+ else
18
+ `console.warn("Connection not secure, ensure a secure connection in production, otherwise login will fail!")` unless Isomorfeus::Transport.socket.url.start_with?('wss:')
19
+ end
20
+ Isomorfeus::Transport.promise_send_path('Isomorfeus::Transport::Handler::AuthenticationHandler', 'login', user_identifier, user_password).then do |response|
21
+ if response[:agent_response].key?(:success)
22
+ Isomorfeus.store.dispatch(type: 'DATA_LOAD', data: response[:agent_response][:data])
23
+ class_name = response[:agent_response][:data][:nodes].keys.first
24
+ node_id = response[:agent_response][:data][:nodes][class_name].keys.first
25
+ Isomorfeus.cached_node_class(class_name).new({id: node_id})
26
+ else
27
+ raise 'Login failed!' # calls .fail
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ def promise_logout(scheme = :isomorfeus)
35
+ send("promise_deauthentication_with_#{scheme}")
36
+ end
37
+
38
+ def promise_deauthentication_with_isomorfeus
39
+ Isomorfeus::Transport.promise_send_path('Isomorfeus::Transport::Handler::AuthenticationHandler', 'logout', 'logout').then do |response|
40
+ response[:agent_response].key?(:success) ? true : raise('Logout failed!')
41
+ end
42
+ end
43
+ else
44
+ def self.included(base)
45
+ Isomorfeus.add_valid_user_class(base)
46
+
47
+ base.instance_exec do
48
+ def authentication(&block)
49
+ @authentication_block = block
50
+ end
51
+
52
+ def promise_login(user_identifier, user_password_or_token, scheme = :isomorfeus)
53
+ send("promise_authentication_with_#{scheme}", user_identifier, user_password_or_token)
54
+ end
55
+
56
+ def promise_authentication_with_isomorfeus(user_identifier, user_password_or_token)
57
+ promise_or_user = @authentication_block.call(user_identifier, user_password_or_token)
58
+ if promise_or_user.class == Promise
59
+ promise_or_user
60
+ else
61
+ Promise.new.resolve(promise_or_user)
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ def promise_logout(scheme = :isomorfeus)
68
+ send("promise_deauthentication_with_#{scheme}")
69
+ end
70
+
71
+ def promise_deauthentication_with_isomorfeus
72
+ Promise.new.resolve(true)
73
+ end
74
+ end
75
+ end
76
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isomorfeus-transport
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.epsilon1
4
+ version: 1.0.0.epsilon2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-16 00:00:00.000000000 Z
11
+ date: 2019-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -86,14 +86,28 @@ dependencies:
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: 16.9.2
89
+ version: 16.9.4
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: 16.9.2
96
+ version: 16.9.4
97
+ - !ruby/object:Gem::Dependency
98
+ name: isomorfeus-policy
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 1.0.0.epsilon2
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 1.0.0.epsilon2
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: websocket-driver
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,34 @@ dependencies:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
124
  version: 0.7.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: isomorfeus-installer
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '='
130
+ - !ruby/object:Gem::Version
131
+ version: 1.0.0.epsilon2
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '='
137
+ - !ruby/object:Gem::Version
138
+ version: 1.0.0.epsilon2
139
+ - !ruby/object:Gem::Dependency
140
+ name: opal-webpack-loader
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 0.9.4
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 0.9.4
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: rake
113
155
  requirement: !ruby/object:Gem::Requirement
@@ -148,6 +190,7 @@ files:
148
190
  - lib/isomorfeus/transport.rb
149
191
  - lib/isomorfeus/transport/client_processor.rb
150
192
  - lib/isomorfeus/transport/config.rb
193
+ - lib/isomorfeus/transport/handler/authentication_handler.rb
151
194
  - lib/isomorfeus/transport/middlewares.rb
152
195
  - lib/isomorfeus/transport/rack_middleware.rb
153
196
  - lib/isomorfeus/transport/request_agent.rb
@@ -155,6 +198,7 @@ files:
155
198
  - lib/isomorfeus/transport/server_socket_processor.rb
156
199
  - lib/isomorfeus/transport/version.rb
157
200
  - lib/isomorfeus/transport/websocket.rb
201
+ - lib/lucid_authentication/mixin.rb
158
202
  - lib/lucid_channel/base.rb
159
203
  - lib/lucid_channel/mixin.rb
160
204
  - lib/lucid_handler/base.rb