myxi 1.1.1 → 1.2.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.
- checksums.yaml +4 -4
- data/lib/myxi.rb +9 -0
- data/lib/myxi/server.rb +5 -12
- data/lib/myxi/session.rb +39 -6
- data/lib/myxi/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cdd11c1300de89acea4cb8a73d3992613d58f7f2
|
4
|
+
data.tar.gz: c2ea7abf4a441def1601963eb2ffe7f4e50dedeb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2efc388890bf6c0650b658af3179dcba083a970cc9802b39b43892b5d006a87b188e3d3cb05cc19ababdcdbf03fb03fe315572bef505363233b3ab9129cad33f
|
7
|
+
data.tar.gz: a102bd2d3fb000bfa6aa700133a2c2ab439e222d69897db61a76b1752fbd8994c8438b85dde6e7efd803e0e5391be4832448a1854ee43c0dd38794b372aeeee1
|
data/lib/myxi.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'logger'
|
1
2
|
require 'myxi/exchange'
|
2
3
|
require 'myxi/railtie' if defined?(Rails)
|
3
4
|
|
@@ -6,6 +7,14 @@ module Myxi
|
|
6
7
|
|
7
8
|
class Error < StandardError; end
|
8
9
|
|
10
|
+
#
|
11
|
+
# Return a logger
|
12
|
+
#
|
13
|
+
def logger
|
14
|
+
@logger ||= Logger.new(STDOUT)
|
15
|
+
end
|
16
|
+
attr_writer :logger
|
17
|
+
|
9
18
|
#
|
10
19
|
# Return a bunny client instance which will be used by the web socket service.
|
11
20
|
# This can be overriden if you already have a connection RabbitMQ available
|
data/lib/myxi/server.rb
CHANGED
@@ -13,12 +13,6 @@ module Myxi
|
|
13
13
|
@options = options
|
14
14
|
end
|
15
15
|
|
16
|
-
def log(message)
|
17
|
-
if options[:debug]
|
18
|
-
puts message
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
16
|
def sessions
|
23
17
|
@sessions ||= []
|
24
18
|
end
|
@@ -37,7 +31,7 @@ module Myxi
|
|
37
31
|
def run
|
38
32
|
Myxi::Exchange.declare_all
|
39
33
|
port = (options[:port] || ENV['MYXI_PORT'] || ENV['PORT'] || 5005).to_i
|
40
|
-
|
34
|
+
Myxi.logger.info "Running Myxi Web Socket Server on 0.0.0.0:#{port}"
|
41
35
|
monitor_sessions
|
42
36
|
EM.run do
|
43
37
|
EM::WebSocket.run(:host => options[:bind_address] || ENV['MYXI_BIND_ADDRESS'] || '0.0.0.0', :port => port) do |ws|
|
@@ -47,7 +41,7 @@ module Myxi
|
|
47
41
|
ws.onopen do |handshake|
|
48
42
|
case handshake.path
|
49
43
|
when /\A\/pushwss/
|
50
|
-
|
44
|
+
Myxi.logger.debug "[#{session.id}] Connection opened"
|
51
45
|
ws.send({:event => 'Welcome', :payload => {:id => session.id}}.to_json)
|
52
46
|
|
53
47
|
session.queue = Myxi.channel.queue("", :exclusive => true)
|
@@ -58,15 +52,14 @@ module Myxi
|
|
58
52
|
end
|
59
53
|
end
|
60
54
|
else
|
61
|
-
|
55
|
+
Myxi.logger.debug "[#{session.id}] Invalid path"
|
62
56
|
ws.send({:event => 'Error', :payload => {:error => 'PathNotFound'}}.to_json)
|
63
57
|
ws.close
|
64
58
|
end
|
65
59
|
end
|
66
60
|
|
67
61
|
ws.onclose do
|
68
|
-
|
69
|
-
session.queue.delete if session.queue
|
62
|
+
session.close
|
70
63
|
sessions.delete(session)
|
71
64
|
end
|
72
65
|
|
@@ -76,7 +69,7 @@ module Myxi
|
|
76
69
|
if json.is_a?(Hash)
|
77
70
|
session.tag = json['tag'] || nil
|
78
71
|
payload = json['payload'] || {}
|
79
|
-
if action = Myxi::Action::ACTIONS[json['action'].to_sym]
|
72
|
+
if action = Myxi::Action::ACTIONS[json['action'].to_s.to_sym]
|
80
73
|
action.execute(session, payload)
|
81
74
|
else
|
82
75
|
ws.send({:event => 'Error', :tag => session.tag, :payload => {:error => 'InvalidAction'}}.to_json)
|
data/lib/myxi/session.rb
CHANGED
@@ -8,6 +8,8 @@ module Myxi
|
|
8
8
|
@server = server
|
9
9
|
@ws = ws
|
10
10
|
@id = SecureRandom.hex(8)
|
11
|
+
@closure_callbacks = []
|
12
|
+
@data = {}
|
11
13
|
end
|
12
14
|
|
13
15
|
attr_reader :id
|
@@ -17,6 +19,15 @@ module Myxi
|
|
17
19
|
attr_accessor :auth_object
|
18
20
|
attr_accessor :tag
|
19
21
|
|
22
|
+
def [](name)
|
23
|
+
@data[name.to_sym]
|
24
|
+
end
|
25
|
+
|
26
|
+
def []=(name, value)
|
27
|
+
Myxi.logger.debug "[#{id}] Stored '#{name}' with '#{value}'"
|
28
|
+
@data[name.to_sym] = value
|
29
|
+
end
|
30
|
+
|
20
31
|
#
|
21
32
|
# Keep track of all subscriptions
|
22
33
|
#
|
@@ -37,11 +48,15 @@ module Myxi
|
|
37
48
|
def subscribe(exchange_name, routing_key)
|
38
49
|
if exchange = Myxi::Exchange::EXCHANGES[exchange_name.to_sym]
|
39
50
|
if exchange.can_subscribe?(routing_key, self.auth_object)
|
40
|
-
queue.bind(exchange.exchange_name.to_s, :routing_key => routing_key.to_s)
|
41
51
|
subscriptions[exchange_name.to_s] ||= []
|
42
|
-
subscriptions[exchange_name.to_s]
|
43
|
-
|
44
|
-
|
52
|
+
if subscriptions[exchange_name.to_s].include?(routing_key.to_s)
|
53
|
+
send('Error', :error => 'AlreadySubscribed', :exchange => exchange_name, :routing_key => routing_key)
|
54
|
+
else
|
55
|
+
queue.bind(exchange.exchange_name.to_s, :routing_key => routing_key.to_s)
|
56
|
+
subscriptions[exchange_name.to_s] << routing_key.to_s
|
57
|
+
Myxi.logger.debug "[#{id}] Subscribed to #{exchange_name} / #{routing_key}"
|
58
|
+
send('Subscribed', :exchange => exchange_name, :routing_key => routing_key)
|
59
|
+
end
|
45
60
|
else
|
46
61
|
send('Error', :error => 'SubscriptionDenied', :exchange => exchange_name, :routing_key => routing_key)
|
47
62
|
end
|
@@ -58,7 +73,7 @@ module Myxi
|
|
58
73
|
if subscriptions[exchange_name.to_s]
|
59
74
|
subscriptions[exchange_name.to_s].delete(routing_key.to_s)
|
60
75
|
end
|
61
|
-
|
76
|
+
Myxi.logger.debug "[#{id}] Unsubscribed from #{exchange_name}/#{routing_key}"
|
62
77
|
send('Unsubscribed', :exchange_name => exchange_name, :routing_key => routing_key, :auto => auto)
|
63
78
|
end
|
64
79
|
|
@@ -91,7 +106,7 @@ module Myxi
|
|
91
106
|
if exchange = Myxi::Exchange::EXCHANGES[exchange_name.to_sym]
|
92
107
|
routing_keys.each do |routing_key|
|
93
108
|
unless exchange.can_subscribe?(routing_key, self.auth_object)
|
94
|
-
|
109
|
+
Myxi.logger.info "[#{id}] Session is not longer allowed to subscibe to #{exchange_name}/#{routing_key}"
|
95
110
|
unsubscribe(exchange_name, routing_key, true)
|
96
111
|
end
|
97
112
|
end
|
@@ -99,5 +114,23 @@ module Myxi
|
|
99
114
|
end
|
100
115
|
end
|
101
116
|
|
117
|
+
#
|
118
|
+
# Called when the connection for this session is closed
|
119
|
+
#
|
120
|
+
def close
|
121
|
+
Myxi.logger.debug "[#{id}] Session closed"
|
122
|
+
self.queue.delete if self.queue
|
123
|
+
while callback = @closure_callbacks.shift
|
124
|
+
callback.call
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
#
|
129
|
+
# Adds a callback to be executed when this session closes
|
130
|
+
#
|
131
|
+
def on_close(&block)
|
132
|
+
@closure_callbacks << block
|
133
|
+
end
|
134
|
+
|
102
135
|
end
|
103
136
|
end
|
data/lib/myxi/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: myxi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Cooke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bunny
|
@@ -89,9 +89,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
89
89
|
version: '0'
|
90
90
|
requirements: []
|
91
91
|
rubyforge_project:
|
92
|
-
rubygems_version: 2.
|
92
|
+
rubygems_version: 2.5.2
|
93
93
|
signing_key:
|
94
94
|
specification_version: 4
|
95
95
|
summary: A RabbitMQ-based web socket server & framework
|
96
96
|
test_files: []
|
97
|
-
has_rdoc:
|