amf_socket 0.0.2 → 0.1.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.
- data/Gemfile.lock +1 -1
- data/README.md +27 -1
- data/Rakefile +25 -1
- data/lib/amf_socket/amf_rpc_connection.rb +74 -8
- data/lib/amf_socket/exceptions.rb +1 -1
- data/lib/amf_socket/rpc_message.rb +35 -0
- data/lib/amf_socket/rpc_request.rb +6 -6
- data/lib/amf_socket/rpc_response.rb +32 -0
- data/lib/amf_socket/version.rb +1 -1
- data/lib/amf_socket.rb +2 -0
- metadata +6 -4
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -19,7 +19,33 @@ Or install it yourself as:
|
|
19
19
|
|
20
20
|
## Usage
|
21
21
|
|
22
|
-
|
22
|
+
EM.run do
|
23
|
+
class MyConnection < AmfSocket::AmfRpcConnection
|
24
|
+
private
|
25
|
+
def post_init
|
26
|
+
super
|
27
|
+
|
28
|
+
puts 'Sending a request'
|
29
|
+
send_request('hello', :foo => 'bar') do |response|
|
30
|
+
puts "received a response to my request: #{response.result}"
|
31
|
+
end
|
32
|
+
|
33
|
+
puts 'Sending a message'
|
34
|
+
send_message('hey there', ['hello', 'world'])
|
35
|
+
end
|
36
|
+
|
37
|
+
def receive_request(request)
|
38
|
+
puts "received a request: #{request.command}"
|
39
|
+
request.reply('Here is my response')
|
40
|
+
end
|
41
|
+
|
42
|
+
def receive_message(message)
|
43
|
+
puts "received a message: #{message.command}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
EM.start_server('localhost', 9000, MyConnection)
|
48
|
+
end
|
23
49
|
|
24
50
|
## Contributing
|
25
51
|
|
data/Rakefile
CHANGED
@@ -33,6 +33,30 @@ end
|
|
33
33
|
desc 'Start a test server'
|
34
34
|
task :harness => :environment do
|
35
35
|
EM.run do
|
36
|
-
|
36
|
+
class MyConnection < AmfSocket::AmfRpcConnection
|
37
|
+
private
|
38
|
+
def post_init
|
39
|
+
super
|
40
|
+
|
41
|
+
puts 'Sending a request'
|
42
|
+
send_request('hello', :foo => 'bar') do |response|
|
43
|
+
puts "received a response to my request: #{response.result}"
|
44
|
+
end
|
45
|
+
|
46
|
+
puts 'Sending a message'
|
47
|
+
send_message('hey there', ['hello', 'world'])
|
48
|
+
end
|
49
|
+
|
50
|
+
def receive_request(request)
|
51
|
+
puts "received a request: #{request.command}"
|
52
|
+
request.reply('Here is my response')
|
53
|
+
end
|
54
|
+
|
55
|
+
def receive_message(message)
|
56
|
+
puts "received a message: #{message.command}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
EM.start_server('localhost', 9000, MyConnection)
|
37
61
|
end
|
38
62
|
end
|
@@ -1,19 +1,85 @@
|
|
1
1
|
class AmfSocket::AmfRpcConnection < AmfSocket::AmfConnection
|
2
|
-
def
|
3
|
-
|
2
|
+
def send_request(command, params = {}, &block)
|
3
|
+
message_id = SecureRandom.hex
|
4
|
+
|
5
|
+
object = {}
|
6
|
+
object[:type] = 'rpcRequest'
|
7
|
+
object[:request] = {}
|
8
|
+
object[:request][:messageId] = message_id
|
9
|
+
object[:request][:command] = command
|
10
|
+
object[:request][:params] = params
|
11
|
+
|
12
|
+
@sent_requests[message_id] = [object, block]
|
13
|
+
|
14
|
+
send_object(object)
|
15
|
+
end
|
16
|
+
|
17
|
+
def send_message(command, params = {})
|
18
|
+
object = {}
|
19
|
+
object[:type] = 'rpcMessage'
|
20
|
+
object[:message] = {}
|
21
|
+
object[:message][:messageId] = SecureRandom.hex
|
22
|
+
object[:message][:command] = command
|
23
|
+
object[:message][:params] = params
|
24
|
+
|
25
|
+
send_object(object)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
#
|
31
|
+
# EM Callbacks.
|
32
|
+
#
|
33
|
+
|
34
|
+
def post_init
|
35
|
+
super
|
36
|
+
@sent_requests = {}
|
37
|
+
end
|
4
38
|
|
39
|
+
def receive_object(object)
|
5
40
|
begin
|
6
|
-
|
7
|
-
|
41
|
+
raise AmfSocket::InvalidObject unless object.is_a?(Hash) && object[:type]
|
42
|
+
|
43
|
+
case object[:type]
|
44
|
+
when 'rpcRequest'
|
45
|
+
request = AmfSocket::RpcRequest.new(object, self)
|
46
|
+
receive_request(request)
|
47
|
+
when 'rpcResponse'
|
48
|
+
receive_response(object)
|
49
|
+
when 'rpcMessage'
|
50
|
+
message = AmfSocket::RpcMessage.new(object, self)
|
51
|
+
receive_message(message)
|
52
|
+
else
|
53
|
+
raise AmfSocket::InvalidObject
|
54
|
+
end
|
55
|
+
rescue AmfSocket::InvalidObject => e
|
8
56
|
close_connection
|
9
|
-
return
|
10
57
|
end
|
11
|
-
|
12
|
-
receive_request(request)
|
13
58
|
end
|
14
59
|
|
60
|
+
#
|
61
|
+
# AMF RPC Connection Callbacks.
|
62
|
+
#
|
63
|
+
|
15
64
|
# Override this method in your subclass.
|
16
65
|
def receive_request(request)
|
17
|
-
request.reply(
|
66
|
+
request.reply("You should override #{self.class.to_s}#receive_request.")
|
67
|
+
end
|
68
|
+
|
69
|
+
# Override this method in your subclass.
|
70
|
+
def receive_message(message)
|
71
|
+
end
|
72
|
+
|
73
|
+
def receive_response(response_object)
|
74
|
+
raise AmfSocket::InvalidObject unless (message_id = response_object[:response][:messageId])
|
75
|
+
raise AmfSocket::InvalidObject unless (sent_request = @sent_requests[message_id])
|
76
|
+
|
77
|
+
request_object = sent_request[0]
|
78
|
+
block = sent_request[1]
|
79
|
+
response = AmfSocket::RpcResponse.new(request_object, response_object, self)
|
80
|
+
|
81
|
+
@sent_requests.delete(message_id)
|
82
|
+
|
83
|
+
block.call(response)
|
18
84
|
end
|
19
85
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class AmfSocket::RpcMessage
|
2
|
+
attr_reader :amf_connection
|
3
|
+
|
4
|
+
def initialize(object, amf_connection)
|
5
|
+
raise RpcSocket::InvalidObject unless validate_object(object)
|
6
|
+
|
7
|
+
@message_obj = object[:message]
|
8
|
+
@amf_connection = amf_connection
|
9
|
+
end
|
10
|
+
|
11
|
+
def message_id
|
12
|
+
return @message_obj[:messageId]
|
13
|
+
end
|
14
|
+
|
15
|
+
def command
|
16
|
+
return @message_obj[:command]
|
17
|
+
end
|
18
|
+
|
19
|
+
def params
|
20
|
+
return @message_obj[:params]
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def validate_object(object)
|
26
|
+
return false unless object.is_a?(Hash)
|
27
|
+
return false unless object[:type] == 'rpcMessage'
|
28
|
+
return false unless object[:message].is_a?(Hash)
|
29
|
+
return false unless object[:message][:command].is_a?(String)
|
30
|
+
return false unless object[:message][:params].is_a?(Hash)
|
31
|
+
return false unless object[:message][:messageId].is_a?(String)
|
32
|
+
|
33
|
+
return true
|
34
|
+
end
|
35
|
+
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
class AmfSocket::RpcRequest
|
2
|
-
attr_reader :
|
2
|
+
attr_reader :connection
|
3
3
|
attr_reader :state # Valid states: :initialized, replied.
|
4
4
|
|
5
|
-
def initialize(object,
|
6
|
-
raise RpcSocket::
|
5
|
+
def initialize(object, connection)
|
6
|
+
raise RpcSocket::InvalidObject unless validate_object(object)
|
7
7
|
|
8
8
|
@request_obj = object[:request]
|
9
|
-
@
|
9
|
+
@connection = connection
|
10
10
|
@state = :initialized
|
11
11
|
end
|
12
12
|
|
@@ -31,7 +31,7 @@ class AmfSocket::RpcRequest
|
|
31
31
|
object[:response][:messageId] = message_id
|
32
32
|
object[:response][:result] = result
|
33
33
|
|
34
|
-
@
|
34
|
+
@connection.send_object(object)
|
35
35
|
|
36
36
|
return true
|
37
37
|
end
|
@@ -40,7 +40,7 @@ class AmfSocket::RpcRequest
|
|
40
40
|
|
41
41
|
def validate_object(object)
|
42
42
|
return false unless object.is_a?(Hash)
|
43
|
-
return false unless
|
43
|
+
return false unless object[:type] == 'rpcRequest'
|
44
44
|
return false unless object[:request].is_a?(Hash)
|
45
45
|
return false unless object[:request][:command].is_a?(String)
|
46
46
|
return false unless object[:request][:params].is_a?(Hash)
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class AmfSocket::RpcResponse
|
2
|
+
attr_reader :connection
|
3
|
+
attr_reader :message_id
|
4
|
+
attr_reader :command
|
5
|
+
attr_reader :params
|
6
|
+
attr_reader :result
|
7
|
+
|
8
|
+
def initialize(request_object, response_object, connection)
|
9
|
+
raise RpcSocket::InvalidObject unless validate_object(response_object)
|
10
|
+
|
11
|
+
req = request_object[:request]
|
12
|
+
res = response_object[:response]
|
13
|
+
|
14
|
+
@connection = connection
|
15
|
+
@message_id = req[:messageId]
|
16
|
+
@command = req[:command]
|
17
|
+
@params = req[:params]
|
18
|
+
@result = res[:result]
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def validate_object(object)
|
24
|
+
return false unless object.is_a?(Hash)
|
25
|
+
return false unless object[:type] == 'rpcResponse'
|
26
|
+
return false unless object[:response].is_a?(Hash)
|
27
|
+
return false unless object[:response][:messageId].is_a?(String)
|
28
|
+
return false unless object[:response][:result].is_a?(String)
|
29
|
+
|
30
|
+
return true
|
31
|
+
end
|
32
|
+
end
|
data/lib/amf_socket/version.rb
CHANGED
data/lib/amf_socket.rb
CHANGED
@@ -7,5 +7,7 @@ require 'amf_socket/version'
|
|
7
7
|
require 'amf_socket/amf_connection'
|
8
8
|
require 'amf_socket/amf_rpc_connection'
|
9
9
|
require 'amf_socket/rpc_request'
|
10
|
+
require 'amf_socket/rpc_message'
|
11
|
+
require 'amf_socket/rpc_response'
|
10
12
|
require 'amf_socket/serializer'
|
11
13
|
require 'amf_socket/exceptions'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amf_socket
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: eventmachine
|
@@ -61,7 +61,9 @@ files:
|
|
61
61
|
- lib/amf_socket/amf_connection.rb
|
62
62
|
- lib/amf_socket/amf_rpc_connection.rb
|
63
63
|
- lib/amf_socket/exceptions.rb
|
64
|
+
- lib/amf_socket/rpc_message.rb
|
64
65
|
- lib/amf_socket/rpc_request.rb
|
66
|
+
- lib/amf_socket/rpc_response.rb
|
65
67
|
- lib/amf_socket/serializer.rb
|
66
68
|
- lib/amf_socket/version.rb
|
67
69
|
homepage: ''
|
@@ -78,7 +80,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
78
80
|
version: '0'
|
79
81
|
segments:
|
80
82
|
- 0
|
81
|
-
hash:
|
83
|
+
hash: -4118759105506759439
|
82
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
85
|
none: false
|
84
86
|
requirements:
|
@@ -87,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
89
|
version: '0'
|
88
90
|
segments:
|
89
91
|
- 0
|
90
|
-
hash:
|
92
|
+
hash: -4118759105506759439
|
91
93
|
requirements: []
|
92
94
|
rubyforge_project:
|
93
95
|
rubygems_version: 1.8.24
|