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 CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- amf_socket (0.0.2)
4
+ amf_socket (0.1.0)
5
5
  RocketAMF (>= 0.2.1)
6
6
  eventmachine (>= 1.0.0.rc.4)
7
7
 
data/README.md CHANGED
@@ -19,7 +19,33 @@ Or install it yourself as:
19
19
 
20
20
  ## Usage
21
21
 
22
- Currently this library is immature and the API is evolving.
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
- EM.start_server('localhost', 9000, AmfSocket::AmfRpcConnection)
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 receive_object(object)
3
- request = nil
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
- request = AmfSocket::RpcRequest.new(object, self)
7
- rescue AmfSocket::InvalidRequest => e
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('You should override AmfSocket::AmfRpcConenction in a subclass.')
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
@@ -1,4 +1,4 @@
1
1
  module AmfSocket
2
- class InvalidRequest < RuntimeError; end
2
+ class InvalidObject < RuntimeError; end
3
3
  class AlreadyReplied < RuntimeError; end
4
4
  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 :amf_connection
2
+ attr_reader :connection
3
3
  attr_reader :state # Valid states: :initialized, replied.
4
4
 
5
- def initialize(object, amf_connection)
6
- raise RpcSocket::InvalidRequest unless validate_object(object)
5
+ def initialize(object, connection)
6
+ raise RpcSocket::InvalidObject unless validate_object(object)
7
7
 
8
8
  @request_obj = object[:request]
9
- @amf_connection = amf_connection
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
- @amf_connection.send_object(object)
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 %(rpcRequest rpcResponse).include?(object[:type])
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
@@ -1,3 +1,3 @@
1
1
  module AmfSocket
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
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.2
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-11 00:00:00.000000000 Z
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: 4345816040862175630
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: 4345816040862175630
92
+ hash: -4118759105506759439
91
93
  requirements: []
92
94
  rubyforge_project:
93
95
  rubygems_version: 1.8.24