isomorfeus-transport 1.0.0.delta8 → 1.0.0.delta9

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: 2cde5bb9a8184ee9449c57e97bf0fc1e1c30e1b9799a05abca1b7decee3638dd
4
- data.tar.gz: cae8b98b3a0661bc72d5be62de219292bc5049933167ac9059accf8d9ded7975
3
+ metadata.gz: 1453febd89db3eba65151c490dacc155691317bced9a9f8bc00a6dff0b6500fb
4
+ data.tar.gz: 3b12ba839819d379f30be025154fdf44f57fd976af9c1c3cb8b3515483aabb2f
5
5
  SHA512:
6
- metadata.gz: f77fe50f8e514237f814f3cb53052c04df023ad23956a4098b8266a1d7897abacc4e2e705fe2fb2b17192bc5ca5013341486262ba864f90f9ae411646254a2cd
7
- data.tar.gz: 88aca3c427d3fa15473b46a21c92e11bdd82e00b2a98ec17faba8a0e2321077a2c08cfdc2495c68c6acaec8f2fa3eadd6e0e15e8fe7031e6ef2be77273a25bef
6
+ metadata.gz: 5b3cdb69387da257343607955a37ff372b154ea02a4af0ca528d716d357b0e0bb4bb24c62460e93da2db236c6d5554c4a6f7e0b26b3f1d53983c8df502acfa15
7
+ data.tar.gz: 6c8cc28a458254fd0e7ef5754d1daf90f658fa58f5e613cf898628cc57ee2b3b526f2a5ae795d8b74c3fbf9008f3328ef36e42de9f02ce52ea4c9a9816952474
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2018 Jan Biedermann
3
+ Copyright (c) 2018, 2019 Jan Biedermann
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -11,14 +11,16 @@ module Isomorfeus
11
11
 
12
12
  def self.process_notification(notification_hash)
13
13
  processor_class = "::#{notification_hash[:notification][:class]}".constantize
14
- processor_class.process_message(notification_hash[:notification][:message])
14
+ processor_class.process_message(notification_hash[:notification][:channel], notification_hash[:notification][:message])
15
15
  end
16
16
 
17
17
  def self.process_response(response_hash)
18
18
  response_hash[:response][:agent_ids].keys.each do |agent_id|
19
19
  agent = Isomorfeus::Transport::RequestAgent.get!(agent_id)
20
20
  Isomorfeus::Transport.unregister_request_in_progress(agent_id)
21
- agent.promise.resolve(agent_response: response_hash[:response][:agent_ids][agent_id], full_response: response_hash)
21
+ unless agent.promise.realized?
22
+ agent.promise.resolve(agent_response: response_hash[:response][:agent_ids][agent_id], full_response: response_hash)
23
+ end
22
24
  end
23
25
  end
24
26
  end
@@ -4,7 +4,6 @@ module Isomorfeus
4
4
  if RUBY_ENGINE == 'opal'
5
5
  add_client_option(:api_websocket_path)
6
6
  else
7
- # defaults
8
7
  class << self
9
8
  attr_accessor :api_websocket_path
10
9
  attr_accessor :middlewares
@@ -34,9 +33,47 @@ module Isomorfeus
34
33
  end
35
34
  end
36
35
  end
36
+
37
+ def valid_channel_class_names
38
+ @valid_channel_class_names ||= Set.new
39
+ end
40
+
41
+ def valid_channel_class_name?(class_name)
42
+ valid_channel_class_names.include?(class_name)
43
+ end
44
+
45
+ def add_valid_channel_class(klass)
46
+ class_name = klass.name
47
+ class_name = class_name.split('>::').last if class_name.start_with?('#<')
48
+ valid_channel_class_names << class_name
49
+ end
50
+
51
+ def valid_handler_class_names
52
+ @valid_handler_class_names ||= Set.new
53
+ end
54
+
55
+ def valid_handler_class_name?(class_name)
56
+ valid_handler_class_names.include?(class_name)
57
+ end
58
+
59
+ def add_valid_handler_class(klass)
60
+ class_name = klass.name
61
+ class_name = class_name.split('>::').last if class_name.start_with?('#<')
62
+ valid_handler_class_names << class_name
63
+ end
64
+
65
+ def cached_handler_classes
66
+ @cached_handler_classes ||= {}
67
+ end
68
+
69
+ def cached_handler_class(class_name)
70
+ return cached_handler_classes[class_name] if cached_handler_classes.key?(class_name)
71
+ cached_handler_classes[class_name] = "::#{class_name}".constantize
72
+ end
37
73
  end
38
74
  self.middlewares = Set.new
39
75
  end
40
76
 
77
+ # defaults
41
78
  self.api_websocket_path = '/isomorfeus/api/websocket'
42
79
  end
@@ -4,45 +4,68 @@ module Isomorfeus
4
4
  module Transport
5
5
  module ServerProcessor
6
6
  def process_request(client, session_id, current_user, request)
7
+ Thread.current[:isomorfeus_pub_sub_client] = client
8
+
7
9
  response = { response: { agent_ids: {}} }
8
10
 
9
11
  if request.key?('request') && request['request'].key?('agent_ids')
10
12
  request['request']['agent_ids'].keys.each do |agent_id|
11
- request['request']['agent_ids'][agent_id].keys.each do |key|
12
- handler = "::#{key.underscore.camelize}Handler".constantize
13
- if handler
14
- response[:response][:agent_ids][agent_id] = handler.new.process_request(client, session_id, current_user, request['request']['agent_ids'][agent_id][key], response)
15
- else
16
- response[:response][:agent_ids][agent_id] = { error: { key => 'No such handler!'}}
13
+ request['request']['agent_ids'][agent_id].keys.each do |handler_class_name|
14
+ begin
15
+ handler = Isomorfeus.cached_handler_class(handler_class_name) if Isomorfeus.valid_handler_class_name?(handler_class_name)
16
+ if handler
17
+ result = handler.new.process_request(client, session_id, current_user, request['request']['agent_ids'][agent_id][handler_class_name], response)
18
+ response[:response][:agent_ids][agent_id] = result
19
+ else
20
+ response[:response][:agent_ids][agent_id] = { error: { handler_class_name => 'No such handler!'}}
21
+ end
22
+ rescue
23
+ response[:response][:agent_ids][agent_id] = { error: { handler_class_name => 'No such handler!'}}
17
24
  end
18
25
  end
19
26
  end
20
27
  elsif request.key?('notification')
21
- if request['notification'].key?('class')
22
- client.publish(request['notification']['class'], Oj.dump({ 'notification' => request['notification'] }, mode: :strict))
23
- else
28
+ begin
29
+ channel = request['notification']['channel']
30
+ class_name = request['notification']['class']
31
+ if Isomorfeus.valid_channel_class_name?(class_name) && channel
32
+ client.publish(request['notification']['channel'], Oj.dump({ 'notification' => request['notification'] }, mode: :strict))
33
+ else
34
+ response[:response] = 'No such thing!'
35
+ end
36
+ rescue
24
37
  response[:response] = 'No such thing!'
25
38
  end
26
39
  elsif request.key?('subscribe') && request['subscribe'].key?('agent_ids')
27
- agent_id = request['subscribe']['agent_ids'].keys.first
28
- channel = request['subscribe']['agent_ids'][agent_id]['class']
29
- if channel
30
- client.subscribe(channel)
31
- response[:response][:agent_ids][agent_id] = { success: channel }
32
- else
33
- response[:response][:agent_ids][agent_id] = { error: "No such thing!"}
40
+ begin
41
+ agent_id = request['subscribe']['agent_ids'].keys.first
42
+ channel = request['subscribe']['agent_ids'][agent_id]['channel']
43
+ class_name = request['subscribe']['agent_ids'][agent_id]['class']
44
+ if Isomorfeus.valid_channel_class_name?(class_name) && channel
45
+ client.subscribe(channel)
46
+ response[:response][:agent_ids][agent_id] = { success: channel }
47
+ else
48
+ response[:response][:agent_ids][agent_id] = { error: "No such thing!"}
49
+ end
50
+ rescue
51
+ response[:response][:agent_ids][agent_id] = { error: { key => 'No such handler!'}}
34
52
  end
35
53
  elsif request.key?('unsubscribe') && request['unsubscribe'].key?('agent_ids')
36
- agent_id = request['unsubscribe']['agent_ids'].keys.first
37
- channel = request['unsubscribe']['agent_ids'][agent_id]['class']
38
- if channel
39
- client.unsubscribe(channel)
40
- response[:response][:agent_ids][agent_id] = { success: channel }
41
- else
42
- response[:response][:agent_ids][agent_id] = { error: 'No such thing!'}
54
+ begin
55
+ agent_id = request['unsubscribe']['agent_ids'].keys.first
56
+ channel = request['unsubscribe']['agent_ids'][agent_id]['channel']
57
+ class_name = request['unsubscribe']['agent_ids'][agent_id]['class']
58
+ if Isomorfeus.valid_channel_class_name?(class_name) && channel
59
+ client.unsubscribe(channel)
60
+ response[:response][:agent_ids][agent_id] = { success: channel }
61
+ else
62
+ response[:response][:agent_ids][agent_id] = { error: 'No such thing!'}
63
+ end
64
+ rescue
65
+ response[:response][:agent_ids][agent_id] = { error: { key => 'No such handler!'}}
43
66
  end
44
67
  else
45
- response[:response] = 'No such thing!'
68
+ response[:response] = { error: 'No such thing!'}
46
69
  end
47
70
  response
48
71
  end
@@ -1,5 +1,5 @@
1
1
  module Isomorfeus
2
2
  module Transport
3
- VERSION = '1.0.0.delta8'
3
+ VERSION = '1.0.0.delta9'
4
4
  end
5
5
  end
@@ -45,7 +45,6 @@ module Isomorfeus
45
45
  when CLOSED then raise SendError.new('Cant send, connection is closed!')
46
46
  end
47
47
  end
48
- alias_method :write, :send
49
48
 
50
49
  private
51
50
 
@@ -101,7 +100,6 @@ module Isomorfeus
101
100
  def send(data)
102
101
  @socket.write(data)
103
102
  end
104
- alias_method :write, :send
105
103
 
106
104
  private
107
105
 
@@ -110,6 +108,8 @@ module Isomorfeus
110
108
  @thread.kill
111
109
  end
112
110
  end
111
+
112
+ alias_method :write, :send
113
113
  end
114
114
  end
115
115
  end
@@ -1,141 +1,167 @@
1
1
  module Isomorfeus
2
2
  module Transport
3
3
  class << self
4
- attr_accessor :socket
5
-
6
- def delay(ms = 1000, &block)
7
- `setTimeout(#{block.to_n}, ms)`
8
- end
9
-
10
- def init!
11
- @requests_in_progress = { requests: {}, agent_ids: {} }
12
- @socket = nil
13
- connect if Isomorfeus.on_browser?
14
- end
15
-
16
- def connect
17
- return if @socket && @socket.ready_state < 2
18
- if Isomorfeus.on_browser?
19
- window_protocol = `window.location.protocol`
20
- ws_protocol = window_protocol == 'https:' ? 'wss:' : 'ws:'
21
- ws_url = "#{ws_protocol}#{`window.location.host`}#{Isomorfeus.api_websocket_path}"
22
- else
23
- ws_url = Isomorfeus::TopLevel.transport_ws_url
24
- end
25
- @socket = Isomorfeus::Transport::Websocket.new(ws_url)
26
- @socket.on_error do
27
- @socket.close
28
- delay do
29
- Isomorfeus::Transport.connect
4
+ if RUBY_ENGINE == 'opal'
5
+ attr_accessor :socket
6
+
7
+ def delay(ms = 1000, &block)
8
+ `setTimeout(#{block.to_n}, ms)`
9
+ end
10
+
11
+ def init!
12
+ @requests_in_progress = { requests: {}, agent_ids: {} }
13
+ @socket = nil
14
+ connect if Isomorfeus.on_browser?
15
+ end
16
+
17
+ def connect
18
+ return if @socket && @socket.ready_state < 2
19
+ if Isomorfeus.on_browser?
20
+ window_protocol = `window.location.protocol`
21
+ ws_protocol = window_protocol == 'https:' ? 'wss:' : 'ws:'
22
+ ws_url = "#{ws_protocol}#{`window.location.host`}#{Isomorfeus.api_websocket_path}"
23
+ else
24
+ ws_url = Isomorfeus::TopLevel.transport_ws_url
30
25
  end
26
+ @socket = Isomorfeus::Transport::Websocket.new(ws_url)
27
+ @socket.on_error do
28
+ @socket.close
29
+ delay do
30
+ Isomorfeus::Transport.connect
31
+ end
32
+ end
33
+ @socket.on_message do |event|
34
+ json_hash = `Opal.Hash.$new(JSON.parse(event.data))`
35
+ Isomorfeus::Transport::ClientProcessor.process(json_hash)
36
+ end
37
+ true
38
+ end
39
+
40
+ def disconnect
41
+ @socket.close if @socket
42
+ @socket = nil
31
43
  end
32
- @socket.on_message do |event|
33
- json_hash = `Opal.Hash.$new(JSON.parse(event.data))`
34
- Isomorfeus::Transport::ClientProcessor.process(json_hash)
44
+
45
+ def promise_send_path(*path, &block)
46
+ request = {}
47
+ path.inject(request) do |memo, key|
48
+ memo[key] = {}
49
+ end
50
+ Isomorfeus::Transport.promise_send_request(request, &block)
35
51
  end
36
- true
37
- end
38
52
 
39
- def disconnect
40
- @socket.close if @socket
41
- @socket = nil
42
- end
53
+ def promise_send_request(request, &block)
54
+ if request_in_progress?(request)
55
+ agent = get_agent_for_request_in_progress(request)
56
+ else
57
+ agent = Isomorfeus::Transport::RequestAgent.new(request)
58
+ if block_given?
59
+ agent.promise.then do |response|
60
+ block.call(response)
61
+ end
62
+ end
63
+ register_request_in_progress(request, agent.id)
64
+ @socket.send(`JSON.stringify(#{{request: { agent_ids: { agent.id => request }}}.to_n})`)
65
+ delay(Isomorfeus.on_ssr? ? 8000 : 20000) do
66
+ unless agent.promise.realized?
67
+ agent.promise.reject({agent_response: { error: 'Request timeout!' }, full_response: {}})
68
+ end
69
+ end
70
+ end
71
+ agent.promise
72
+ end
43
73
 
44
- def promise_send_path(*path, &block)
45
- request = {}
46
- path.inject(request) do |memo, key|
47
- memo[key] = {}
74
+ def send_notification(channel_class, channel, message)
75
+ @socket.send(`JSON.stringify(#{{notification: { class: channel_class.name, channel: channel, message: message}}.to_n})`)
76
+ true
48
77
  end
49
- Isomorfeus::Transport.promise_send_request(request, &block)
50
- end
51
78
 
52
- def promise_send_request(request, &block)
53
- if request_in_progress?(request)
54
- agent = get_agent_for_request_in_progress(request)
55
- else
56
- agent = Isomorfeus::Transport::RequestAgent.new(request)
79
+ def subscribe(channel_class, channel, &block)
80
+ request = { subscribe: true, class: channel_class.name, channel: channel }
81
+ if request_in_progress?(request)
82
+ agent = get_agent_for_request_in_progress(request)
83
+ else
84
+ agent = Isomorfeus::Transport::RequestAgent.new(request)
85
+ register_request_in_progress(request, agent.id)
86
+ @socket.send(`JSON.stringify(#{{subscribe: { agent_ids: { agent.id => request }}}.to_n})`)
87
+ end
88
+ result_promise = agent.promise.then do |response|
89
+ response[:agent_response]
90
+ end
57
91
  if block_given?
58
- agent.promise.then do |response|
92
+ result_promise = result_promise.then do |response|
59
93
  block.call(response)
60
94
  end
61
95
  end
62
- register_request_in_progress(request, agent.id)
63
- @socket.send(`JSON.stringify(#{{request: { agent_ids: { agent.id => request }}}.to_n})`)
64
- end
65
- agent.promise
66
- end
67
-
68
- def send_notification(processor_class, message)
69
- @socket.send(`JSON.stringify(#{{notification: { class: processor_class.to_s, message: message}}.to_n})`)
70
- true
71
- end
72
-
73
- def subscribe(processor_class, &block)
74
- request = { subscribe: true, class: processor_class.to_s }
75
- if request_in_progress?(request)
76
- agent = get_agent_for_request_in_progress(request)
77
- else
78
- agent = Isomorfeus::Transport::RequestAgent.new(request)
79
- register_request_in_progress(request, agent.id)
80
- @socket.send(`JSON.stringify(#{{subscribe: { agent_ids: { agent.id => request }}}.to_n})`)
81
- end
82
- result_promise = agent.promise.then do |response|
83
- response[:agent_response]
84
- end
85
- if block_given?
86
- result_promise = result_promise.then do |response|
87
- block.call(response)
88
- end
96
+ result_promise
89
97
  end
90
- result_promise
91
- end
92
98
 
93
- def unsubscribe(processor_class, &block)
94
- request = { unsubscribe: true, class: processor_class.to_s }
95
- if request_in_progress?(request)
96
- agent = get_agent_for_request_in_progress(request)
97
- else
98
- agent = Isomorfeus::Transport::RequestAgent.new(request)
99
- register_request_in_progress(request, agent.id)
100
- @socket.send(`JSON.stringify(#{{unsubscribe: { agent_ids: { agent.id => request }}}.to_n})`)
99
+ def unsubscribe(channel_class, channel, &block)
100
+ request = { unsubscribe: true, class: channel_class.name, channel: channel }
101
+ if request_in_progress?(request)
102
+ agent = get_agent_for_request_in_progress(request)
103
+ else
104
+ agent = Isomorfeus::Transport::RequestAgent.new(request)
105
+ register_request_in_progress(request, agent.id)
106
+ @socket.send(`JSON.stringify(#{{unsubscribe: { agent_ids: { agent.id => request }}}.to_n})`)
107
+ end
108
+ result_promise = agent.promise.then do |response|
109
+ response[:agent_response]
110
+ end
111
+ if block_given?
112
+ result_promise = result_promise.then do |response|
113
+ block.call(response)
114
+ end
115
+ end
116
+ result_promise
101
117
  end
102
- result_promise = agent.promise.then do |response|
103
- response[:agent_response]
118
+
119
+ def busy?
120
+ @requests_in_progress[:requests].size != 0
104
121
  end
105
- if block_given?
106
- result_promise = result_promise.then do |response|
107
- block.call(response)
108
- end
122
+
123
+ def requests_in_progress
124
+ @requests_in_progress
109
125
  end
110
- result_promise
111
- end
112
126
 
113
- def busy?
114
- @requests_in_progress.size != 0
115
- end
127
+ def request_in_progress?(request)
128
+ @requests_in_progress[:requests].key?(request)
129
+ end
116
130
 
117
- def requests_in_progress
118
- @requests_in_progress
119
- end
131
+ def get_agent_for_request_in_progress(request)
132
+ agent_id = @requests_in_progress[:requests][request]
133
+ Isomorfeus::Transport::RequestAgent.get(agent_id)
134
+ end
120
135
 
121
- def request_in_progress?(request)
122
- @requests_in_progress[:requests].key?(request)
123
- end
136
+ def register_request_in_progress(request, agent_id)
137
+ @requests_in_progress[:requests][request] = agent_id
138
+ @requests_in_progress[:agent_ids][agent_id] = request
139
+ end
124
140
 
125
- def get_agent_for_request_in_progress(request)
126
- agent_id = @requests_in_progress[:requests][request]
127
- Isomorfeus::Transport::RequestAgent.get(agent_id)
128
- end
141
+ def unregister_request_in_progress(agent_id)
142
+ request = @requests_in_progress[:agent_ids].delete(agent_id)
143
+ @requests_in_progress[:requests].delete(request)
144
+ end
145
+ else # RUBY_ENGINE
146
+ def send_notification(channel_class, channel, message)
147
+ Thread.current[:isomorfeus_pub_sub_client].publish(Oj.dump({notification: { class: channel_class.name, channel: channel, message: message}}, mode: :strict))
148
+ true
149
+ end
129
150
 
130
- def register_request_in_progress(request, agent_id)
131
- @requests_in_progress[:requests][request] = agent_id
132
- @requests_in_progress[:agent_ids][agent_id] = request
133
- end
151
+ def subscribe(channel_class, channel, &block)
152
+ Thread.current[:isomorfeus_pub_sub_client].subscribe(channel)
153
+ result_promise = Promise.new
154
+ result_promise.resolve({ success: channel })
155
+ result_promise
156
+ end
134
157
 
135
- def unregister_request_in_progress(agent_id)
136
- request = @requests_in_progress[:agent_ids].delete(agent_id)
137
- @requests_in_progress[:requests].delete(request)
138
- end
158
+ def unsubscribe(channel_class, channel, &block)
159
+ Thread.current[:isomorfeus_pub_sub_client].unsubscribe(channel)
160
+ result_promise = Promise.new
161
+ result_promise.resolve({ success: channel })
162
+ result_promise
163
+ end
164
+ end # RUBY_ENGINE
139
165
  end
140
166
  end
141
167
  end
@@ -1,3 +1,6 @@
1
+ require 'opal'
2
+ require 'opal-autoloader'
3
+ require 'opal-activesupport'
1
4
  if RUBY_ENGINE == 'opal'
2
5
  require 'json'
3
6
  require 'isomorfeus/config'
@@ -10,6 +13,7 @@ if RUBY_ENGINE == 'opal'
10
13
  require 'isomorfeus/transport'
11
14
  require 'lucid_channel/mixin'
12
15
  require 'lucid_channel/base'
16
+ Opal::Autoloader.add_load_path('channels')
13
17
  Isomorfeus::Transport.init!
14
18
  else
15
19
  require 'base64'
@@ -28,17 +32,32 @@ else
28
32
  require 'isomorfeus/transport/server_processor'
29
33
  require 'isomorfeus/transport/server_socket_processor'
30
34
  require 'isomorfeus/transport/websocket'
31
- require 'isomorfeus/handler'
32
35
  require 'isomorfeus/transport/rack_middleware'
33
- Opal.append_path(__dir__.untaint) unless Opal.paths.include?(__dir__.untaint)
34
-
35
36
  require 'isomorfeus/transport/middlewares'
36
37
 
37
38
  Isomorfeus.add_middleware(Isomorfeus::Transport::RackMiddleware)
39
+ Isomorfeus.valid_channel_class_names
40
+
41
+ require 'lucid_handler/mixin'
42
+ require 'lucid_handler/base'
43
+ require 'lucid_channel/mixin'
44
+ require 'lucid_channel/base'
45
+
46
+ Opal.append_path(__dir__.untaint) unless Opal.paths.include?(__dir__.untaint)
47
+
48
+ require 'active_support'
49
+ require 'active_support/dependencies'
38
50
 
39
- if Dir.exist?(File.join('app', 'isomorfeus'))
40
- $LOAD_PATH.unshift(File.expand_path(File.join('app', 'isomorfeus', 'handlers')))
41
- elsif Dir.exist?(File.join('isomorfeus'))
42
- $LOAD_PATH.unshift(File.expand_path(File.join('isomorfeus', 'handlers')))
51
+ %w[channels handlers].each do |dir|
52
+ path = if Dir.exist?(File.join('app', 'isomorfeus'))
53
+ File.expand_path(File.join('app', 'isomorfeus', dir))
54
+ elsif Dir.exist?(File.join('isomorfeus'))
55
+ File.expand_path(File.join('isomorfeus', dir))
56
+ end
57
+ ActiveSupport::Dependencies.autoload_paths << path if path
58
+ # we also need to require them all, so classes are registered accordingly
59
+ Dir.glob("#{path}/**/*.rb").each do |file|
60
+ require file
61
+ end
43
62
  end
44
63
  end
@@ -1,5 +1,11 @@
1
1
  module LucidChannel
2
2
  class Base
3
+ if RUBY_ENGINE != 'opal'
4
+ def self.inherited(base)
5
+ Isomorfeus.add_valid_channel_class(base)
6
+ end
7
+ end
8
+
3
9
  include LucidChannel::Mixin
4
10
  end
5
11
  end
@@ -1,12 +1,21 @@
1
1
  module LucidChannel
2
2
  module Mixin
3
3
  def self.included(base)
4
+
5
+ if RUBY_ENGINE != 'opal'
6
+ Isomorfeus.add_valid_channel_class(base) unless base == LucidChannel::Base
7
+ end
8
+
4
9
  base.instance_exec do
5
- def process_message(message)
10
+ def process_message(channel, message = nil)
6
11
  if @message_processor
7
- @message_processor.call(message)
12
+ if channel == self.name
13
+ @message_processor.call(message)
14
+ else
15
+ @message_processor.call(channel, message)
16
+ end
8
17
  else
9
- puts "#{self} received: #{message}, but no processor defined!"
18
+ puts "#{self} received: #{channel} #{message}, but no 'on_message' block defined!"
10
19
  end
11
20
  end
12
21
 
@@ -14,18 +23,24 @@ module LucidChannel
14
23
  @message_processor = block
15
24
  end
16
25
 
17
- def send_message(message)
18
- Isomorfeus::Transport.send_notification(self, message)
26
+ def send_message(channel, message = nil)
27
+ unless message
28
+ message = channel
29
+ channel = self.name
30
+ end
31
+ Isomorfeus::Transport.send_notification(self, channel, message)
19
32
  end
20
33
 
21
- def subscribe
22
- Isomorfeus::Transport.subscribe(self)
34
+ def subscribe(channel = nil)
35
+ channel = channel ? channel : self.name
36
+ Isomorfeus::Transport.subscribe(self, channel)
23
37
  end
24
38
 
25
- def unsubscribe
26
- Isomorfeus::Transport.unsubscribe(self)
39
+ def unsubscribe(channel = nil)
40
+ channel = channel ? channel : self.name
41
+ Isomorfeus::Transport.unsubscribe(self, channel)
27
42
  end
28
43
  end
29
44
  end
30
45
  end
31
- end
46
+ end
@@ -0,0 +1,9 @@
1
+ module LucidHandler
2
+ class Base
3
+ def self.inherited(base)
4
+ Isomorfeus.add_valid_handler_class(base)
5
+ end
6
+
7
+ include LucidHandler::Mixin
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ module LucidHandler
2
+ module Mixin
3
+ def self.included(base)
4
+ Isomorfeus.add_valid_handler_class(base) unless base == LucidHandler::Base
5
+
6
+ base.instance_exec do
7
+ def on_request(&block)
8
+ define_method :process_request do |*args|
9
+ block.call(*args)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ 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.delta8
4
+ version: 1.0.0.delta9
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-06-27 00:00:00.000000000 Z
11
+ date: 2019-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.0'
19
+ version: '5.2'
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: '5.0'
26
+ version: '5.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: iodine
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.7.32
33
+ version: 0.7.33
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.7.32
40
+ version: 0.7.33
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: oj
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -72,28 +72,28 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 4.0.7
75
+ version: 4.0.8
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 4.0.7
82
+ version: 4.0.8
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: isomorfeus-react
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 16.8.7
89
+ version: 16.8.8
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.8.7
96
+ version: 16.8.8
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: websocket-driver
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -117,7 +117,6 @@ files:
117
117
  - LICENSE
118
118
  - README.md
119
119
  - lib/isomorfeus-transport.rb
120
- - lib/isomorfeus/handler.rb
121
120
  - lib/isomorfeus/transport.rb
122
121
  - lib/isomorfeus/transport/client_processor.rb
123
122
  - lib/isomorfeus/transport/config.rb
@@ -130,6 +129,8 @@ files:
130
129
  - lib/isomorfeus/transport/websocket.rb
131
130
  - lib/lucid_channel/base.rb
132
131
  - lib/lucid_channel/mixin.rb
132
+ - lib/lucid_handler/base.rb
133
+ - lib/lucid_handler/mixin.rb
133
134
  homepage: http://isomorfeus.com
134
135
  licenses:
135
136
  - MIT
@@ -1,5 +0,0 @@
1
- module Isomorfeus
2
- module Handler
3
- # for autoloader
4
- end
5
- end