amf_socket 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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