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 +4 -4
- data/README.md +42 -1
- data/lib/isomorfeus/transport/config.rb +25 -6
- data/lib/isomorfeus/transport/handler/authentication_handler.rb +58 -0
- data/lib/isomorfeus/transport/rack_middleware.rb +1 -4
- data/lib/isomorfeus/transport/server_processor.rb +41 -14
- data/lib/isomorfeus/transport/server_socket_processor.rb +5 -6
- data/lib/isomorfeus/transport/version.rb +1 -1
- data/lib/isomorfeus/transport/websocket.rb +4 -0
- data/lib/isomorfeus/transport.rb +1 -1
- data/lib/isomorfeus-transport.rb +12 -9
- data/lib/lucid_authentication/mixin.rb +76 -0
- metadata +48 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 156d5a0bbc947739e0d57f23ed7aa1386280d344c9dabdc36fa8b1b8ed0542b7
|
4
|
+
data.tar.gz: ba4ebf50a3db87d9d1b7642673dabd3f9b8d0f708a591ee0e8724d003f7b3c82
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
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
|
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,
|
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,
|
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
|
-
|
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] =
|
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
|
-
|
46
|
-
|
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] =
|
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
|
-
|
60
|
-
|
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] =
|
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,
|
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
|
data/lib/isomorfeus/transport.rb
CHANGED
data/lib/isomorfeus-transport.rb
CHANGED
@@ -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 =
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
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.
|
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-
|
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.
|
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.
|
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
|