rack-amf 0.0.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/README.rdoc +18 -9
  2. data/Rakefile +23 -38
  3. data/lib/rack/amf/environment.rb +5 -8
  4. data/lib/rack/amf/middleware/pass_through.rb +5 -4
  5. data/lib/rack/amf/middleware/service_manager.rb +11 -3
  6. data/lib/rack/amf/middleware.rb +2 -1
  7. data/lib/rack/amf/request.rb +3 -16
  8. data/lib/rack/amf/response.rb +8 -67
  9. data/lib/rack/amf.rb +41 -1
  10. data/spec/{rack/service_manager_spec.rb → service_manager_spec.rb} +1 -2
  11. data/spec/spec.opts +2 -1
  12. data/spec/spec_helper.rb +1 -24
  13. metadata +19 -84
  14. data/lib/amf/class_mapping.rb +0 -211
  15. data/lib/amf/common.rb +0 -28
  16. data/lib/amf/constants.rb +0 -47
  17. data/lib/amf/pure/deserializer.rb +0 -361
  18. data/lib/amf/pure/io_helpers.rb +0 -94
  19. data/lib/amf/pure/remoting.rb +0 -120
  20. data/lib/amf/pure/serializer.rb +0 -327
  21. data/lib/amf/pure.rb +0 -14
  22. data/lib/amf/values/array_collection.rb +0 -9
  23. data/lib/amf/values/messages.rb +0 -133
  24. data/lib/amf/values/typed_hash.rb +0 -13
  25. data/lib/amf/version.rb +0 -9
  26. data/lib/amf.rb +0 -17
  27. data/spec/amf/class_mapping_set_spec.rb +0 -34
  28. data/spec/amf/class_mapping_spec.rb +0 -120
  29. data/spec/amf/deserializer_spec.rb +0 -311
  30. data/spec/amf/remoting_spec.rb +0 -51
  31. data/spec/amf/serializer_spec.rb +0 -328
  32. data/spec/amf/values/array_collection_spec.rb +0 -6
  33. data/spec/amf/values/messages_spec.rb +0 -31
  34. data/spec/fixtures/objects/amf0-boolean.bin +0 -1
  35. data/spec/fixtures/objects/amf0-date.bin +0 -0
  36. data/spec/fixtures/objects/amf0-ecma-ordinal-array.bin +0 -0
  37. data/spec/fixtures/objects/amf0-hash.bin +0 -0
  38. data/spec/fixtures/objects/amf0-null.bin +0 -1
  39. data/spec/fixtures/objects/amf0-number.bin +0 -0
  40. data/spec/fixtures/objects/amf0-object.bin +0 -0
  41. data/spec/fixtures/objects/amf0-ref-test.bin +0 -0
  42. data/spec/fixtures/objects/amf0-strict-array.bin +0 -0
  43. data/spec/fixtures/objects/amf0-string.bin +0 -0
  44. data/spec/fixtures/objects/amf0-typed-object.bin +0 -0
  45. data/spec/fixtures/objects/amf0-undefined.bin +0 -1
  46. data/spec/fixtures/objects/amf0-untyped-object.bin +0 -0
  47. data/spec/fixtures/objects/amf3-0.bin +0 -0
  48. data/spec/fixtures/objects/amf3-arrayRef.bin +0 -1
  49. data/spec/fixtures/objects/amf3-bigNum.bin +0 -0
  50. data/spec/fixtures/objects/amf3-date.bin +0 -0
  51. data/spec/fixtures/objects/amf3-datesRef.bin +0 -0
  52. data/spec/fixtures/objects/amf3-dynObject.bin +0 -2
  53. data/spec/fixtures/objects/amf3-emptyArray.bin +0 -1
  54. data/spec/fixtures/objects/amf3-emptyArrayRef.bin +0 -1
  55. data/spec/fixtures/objects/amf3-emptyStringRef.bin +0 -1
  56. data/spec/fixtures/objects/amf3-false.bin +0 -1
  57. data/spec/fixtures/objects/amf3-graphMember.bin +0 -0
  58. data/spec/fixtures/objects/amf3-hash.bin +0 -2
  59. data/spec/fixtures/objects/amf3-largeMax.bin +0 -0
  60. data/spec/fixtures/objects/amf3-largeMin.bin +0 -0
  61. data/spec/fixtures/objects/amf3-max.bin +0 -1
  62. data/spec/fixtures/objects/amf3-min.bin +0 -0
  63. data/spec/fixtures/objects/amf3-mixedArray.bin +0 -11
  64. data/spec/fixtures/objects/amf3-null.bin +0 -1
  65. data/spec/fixtures/objects/amf3-objRef.bin +0 -0
  66. data/spec/fixtures/objects/amf3-primArray.bin +0 -1
  67. data/spec/fixtures/objects/amf3-string.bin +0 -1
  68. data/spec/fixtures/objects/amf3-stringRef.bin +0 -0
  69. data/spec/fixtures/objects/amf3-symbol.bin +0 -1
  70. data/spec/fixtures/objects/amf3-true.bin +0 -1
  71. data/spec/fixtures/objects/amf3-typedObject.bin +0 -2
  72. data/spec/fixtures/request/acknowledge-response.bin +0 -0
  73. data/spec/fixtures/request/amf0-error-response.bin +0 -0
  74. data/spec/fixtures/request/commandMessage.bin +0 -0
  75. data/spec/fixtures/request/remotingMessage.bin +0 -0
  76. data/spec/fixtures/request/simple-response.bin +0 -0
  77. data/spec/rack/request_spec.rb +0 -6
  78. data/spec/rack/response_spec.rb +0 -47
@@ -1,94 +0,0 @@
1
- module AMF
2
- module Pure
3
- module ReadIOHelpers #:nodoc:
4
- def read_int8 source
5
- source.read(1).unpack('c').first
6
- end
7
-
8
- def read_word8 source
9
- source.read(1).unpack('C').first
10
- end
11
-
12
- def read_double source
13
- source.read(8).unpack('G').first
14
- end
15
-
16
- def read_word16_network source
17
- source.read(2).unpack('n').first
18
- end
19
-
20
- def read_int16_network source
21
- str = source.read(2)
22
- str.reverse! if byte_order_little? # swap bytes as native=little (and we want network)
23
- str.unpack('s').first
24
- end
25
-
26
- def read_word32_network source
27
- source.read(4).unpack('N').first
28
- end
29
-
30
- def byte_order
31
- if [0x12345678].pack("L") == "\x12\x34\x56\x78"
32
- :BigEndian
33
- else
34
- :LittleEndian
35
- end
36
- end
37
-
38
- def byte_order_little?
39
- (byte_order == :LittleEndian) ? true : false;
40
- end
41
- end
42
-
43
- module WriteIOHelpers #:nodoc:
44
- def pack_integer(integer)
45
- integer = integer & 0x1fffffff
46
- if(integer < 0x80)
47
- [integer].pack('c')
48
- elsif(integer < 0x4000)
49
- [integer >> 7 & 0x7f | 0x80].pack('c')+
50
- [integer & 0x7f].pack('c')
51
- elsif(integer < 0x200000)
52
- [integer >> 14 & 0x7f | 0x80].pack('c') +
53
- [integer >> 7 & 0x7f | 0x80].pack('c') +
54
- [integer & 0x7f].pack('c')
55
- else
56
- [integer >> 22 & 0x7f | 0x80].pack('c')+
57
- [integer >> 15 & 0x7f | 0x80].pack('c')+
58
- [integer >> 8 & 0x7f | 0x80].pack('c')+
59
- [integer & 0xff].pack('c')
60
- end
61
- end
62
-
63
- def pack_double(double)
64
- [double].pack('G')
65
- end
66
-
67
- def pack_int8(val)
68
- [val].pack('c')
69
- end
70
-
71
- def pack_int16_network(val)
72
- [val].pack('n')
73
- end
74
-
75
- def pack_word32_network(val)
76
- str = [val].pack('L')
77
- str.reverse! if byte_order_little? # swap bytes as native=little (and we want network)
78
- str
79
- end
80
-
81
- def byte_order
82
- if [0x12345678].pack("L") == "\x12\x34\x56\x78"
83
- :BigEndian
84
- else
85
- :LittleEndian
86
- end
87
- end
88
-
89
- def byte_order_little?
90
- (byte_order == :LittleEndian) ? true : false;
91
- end
92
- end
93
- end
94
- end
@@ -1,120 +0,0 @@
1
- require 'amf/pure/io_helpers'
2
-
3
- module AMF
4
- module Pure
5
- # AMF request object wrapper, it is responsible for deserializing AMF requests
6
- class Request
7
- attr_reader :amf_version, :headers, :messages
8
-
9
- def initialize
10
- @amf_version = 0
11
- @headers = []
12
- @messages = []
13
- end
14
-
15
- def populate_from_stream stream
16
- stream = StringIO.new(stream) unless StringIO === stream
17
-
18
- # Read AMF version
19
- @amf_version = read_word16_network stream
20
-
21
- # Read in headers
22
- header_count = read_word16_network stream
23
- 0.upto(header_count-1) do
24
- name = stream.read(read_word16_network(stream))
25
- must_understand = read_int8(stream) != 0
26
- length = read_word32_network stream
27
- data = AMF.deserialize stream
28
- @headers << Header.new(name, must_understand, data)
29
- end
30
-
31
- # Read in messages
32
- message_count = read_word16_network stream
33
- 0.upto(message_count-1) do
34
- target_uri = stream.read(read_word16_network(stream))
35
- response_uri = stream.read(read_word16_network(stream))
36
- length = read_word32_network stream
37
- data = AMF.deserialize stream
38
- if data.is_a?(Array) && data.length == 1 && data[0].is_a?(::AMF::Values::AbstractMessage)
39
- data = data[0]
40
- end
41
- @messages << Message.new(target_uri, response_uri, data)
42
- end
43
-
44
- self
45
- end
46
-
47
- private
48
- include AMF::Pure::ReadIOHelpers
49
- end
50
-
51
- # AMF response object wrapper, it is responsible for serializing the AMF response
52
- class Response
53
- attr_accessor :amf_version, :headers, :messages
54
-
55
- def initialize
56
- @amf_version = 0
57
- @headers = []
58
- @messages = []
59
- end
60
-
61
- def serialize
62
- stream = ""
63
-
64
- # Write version
65
- stream << pack_int16_network(@amf_version)
66
-
67
- # Write headers
68
- stream << pack_int16_network(@headers.length) # Header count
69
- @headers.each do |h|
70
- stream << pack_int16_network(h.name.length)
71
- stream << h.name
72
- stream << pack_int8(h.must_understand ? 1 : 0)
73
- stream << pack_word32_network(-1)
74
- stream << AMF.serialize(h.data, 0)
75
- end
76
-
77
- # Write messages
78
- stream << pack_int16_network(@messages.length) # Message count
79
- @messages.each do |m|
80
- stream << pack_int16_network(m.target_uri.length)
81
- stream << m.target_uri
82
-
83
- stream << pack_int16_network(m.response_uri.length)
84
- stream << m.response_uri
85
-
86
- stream << pack_word32_network(-1)
87
- stream << AMF0_AMF3_MARKER if @amf_version == 3
88
- stream << AMF.serialize(m.data, @amf_version)
89
- end
90
-
91
- stream
92
- end
93
-
94
- private
95
- include AMF::Pure::WriteIOHelpers
96
- end
97
-
98
- # AMF::Pure::Request or AMF::Pure::Response header
99
- class Header
100
- attr_accessor :name, :must_understand, :data
101
-
102
- def initialize name, must_understand, data
103
- @name = name
104
- @must_understand = must_understand
105
- @data = data
106
- end
107
- end
108
-
109
- # AMF::Pure::Request or AMF::Pure::Response message
110
- class Message
111
- attr_accessor :target_uri, :response_uri, :data
112
-
113
- def initialize target_uri, response_uri, data
114
- @target_uri = target_uri
115
- @response_uri = response_uri
116
- @data = data
117
- end
118
- end
119
- end
120
- end
@@ -1,327 +0,0 @@
1
- require 'amf/pure/io_helpers'
2
-
3
- module AMF
4
- module Pure
5
- # AMF0 implementation of serializer
6
- class Serializer
7
- def initialize
8
- @ref_cache = SerializerCache.new :object
9
- end
10
-
11
- def version
12
- 0
13
- end
14
-
15
- def serialize obj, stream = ""
16
- if obj.respond_to?(:to_amf)
17
- stream << obj.to_amf(self)
18
- elsif @ref_cache[obj] != nil
19
- write_reference @ref_cache[obj], stream
20
- elsif obj.is_a?(NilClass)
21
- write_null stream
22
- elsif obj.is_a?(TrueClass) || obj.is_a?(FalseClass)
23
- write_boolean obj, stream
24
- elsif obj.is_a?(Float) || obj.is_a?(Integer)
25
- write_number obj, stream
26
- elsif obj.is_a?(Symbol) || obj.is_a?(String)
27
- write_string obj.to_s, stream
28
- elsif obj.is_a?(Time)
29
- write_date obj, stream
30
- elsif obj.is_a?(Array)
31
- write_array obj, stream
32
- elsif obj.is_a?(Hash)
33
- write_hash obj, stream
34
- elsif obj.is_a?(Object)
35
- write_object obj, stream
36
- end
37
- stream
38
- end
39
-
40
- def write_null stream
41
- stream << AMF0_NULL_MARKER
42
- end
43
-
44
- def write_boolean bool, stream
45
- stream << AMF0_BOOLEAN_MARKER
46
- stream << pack_int8(bool ? 1 : 0)
47
- end
48
-
49
- def write_number num, stream
50
- stream << AMF0_NUMBER_MARKER
51
- stream << pack_double(num)
52
- end
53
-
54
- def write_string str, stream
55
- len = str.length
56
- if len > 2**16-1
57
- stream << AMF0_LONG_STRING_MARKER
58
- stream << pack_word32_network(len)
59
- else
60
- stream << AMF0_STRING_MARKER
61
- stream << pack_int16_network(len)
62
- end
63
- stream << str
64
- end
65
-
66
- def write_date date, stream
67
- stream << AMF0_DATE_MARKER
68
-
69
- date.utc unless date.utc?
70
- seconds = (date.to_f * 1000).to_i
71
- stream << pack_double(seconds)
72
-
73
- stream << pack_int16_network(0)
74
- end
75
-
76
- def write_reference index, stream
77
- stream << AMF0_REFERENCE_MARKER
78
- stream << pack_int16_network(index)
79
- end
80
-
81
- def write_array array, stream
82
- @ref_cache.add_obj array
83
- stream << AMF0_STRICT_ARRAY_MARKER
84
- stream << pack_word32_network(array.length)
85
- array.each do |elem|
86
- serialize elem, stream
87
- end
88
- end
89
-
90
- def write_hash hash, stream
91
- @ref_cache.add_obj hash
92
- stream << AMF0_HASH_MARKER
93
- stream << pack_word32_network(hash.length)
94
- write_prop_list hash, stream
95
- end
96
-
97
- def write_object obj, stream
98
- @ref_cache.add_obj obj
99
-
100
- # Is it a typed object?
101
- class_name = ClassMapper.get_as_class_name obj
102
- if class_name
103
- stream << AMF0_TYPED_OBJECT_MARKER
104
- stream << pack_int16_network(class_name.length)
105
- stream << class_name
106
- else
107
- stream << AMF0_OBJECT_MARKER
108
- end
109
-
110
- write_prop_list obj, stream
111
- end
112
-
113
- private
114
- include AMF::Pure::WriteIOHelpers
115
- def write_prop_list obj, stream
116
- # Write prop list
117
- props = ClassMapper.props_for_serialization obj
118
- props.sort.each do |key, value| # Sort keys before writing
119
- stream << pack_int16_network(key.length)
120
- stream << key
121
- serialize value, stream
122
- end
123
-
124
- # Write end
125
- stream << pack_int16_network(0)
126
- stream << AMF0_OBJECT_END_MARKER
127
- end
128
- end
129
-
130
- # AMF3 implementation of serializer
131
- class AMF3Serializer
132
- attr_reader :string_cache
133
-
134
- def initialize
135
- @string_cache = SerializerCache.new :string
136
- @object_cache = SerializerCache.new :object
137
- end
138
-
139
- def version
140
- 3
141
- end
142
-
143
- def serialize obj, stream = ""
144
- if obj.respond_to?(:to_amf)
145
- stream << obj.to_amf(self)
146
- elsif obj.is_a?(NilClass)
147
- write_null stream
148
- elsif obj.is_a?(TrueClass)
149
- write_true stream
150
- elsif obj.is_a?(FalseClass)
151
- write_false stream
152
- elsif obj.is_a?(Float)
153
- write_float obj, stream
154
- elsif obj.is_a?(Integer)
155
- write_integer obj, stream
156
- elsif obj.is_a?(Symbol) || obj.is_a?(String)
157
- write_string obj.to_s, stream
158
- elsif obj.is_a?(Time)
159
- write_date obj, stream
160
- elsif obj.is_a?(Array)
161
- write_array obj, stream
162
- elsif obj.is_a?(Hash) || obj.is_a?(Object)
163
- write_object obj, stream
164
- end
165
- stream
166
- end
167
-
168
- def write_reference index, stream
169
- header = index << 1 # shift value left to leave a low bit of 0
170
- stream << pack_integer(header)
171
- end
172
-
173
- def write_null stream
174
- stream << AMF3_NULL_MARKER
175
- end
176
-
177
- def write_true stream
178
- stream << AMF3_TRUE_MARKER
179
- end
180
-
181
- def write_false stream
182
- stream << AMF3_FALSE_MARKER
183
- end
184
-
185
- def write_integer int, stream
186
- if int < MIN_INTEGER || int > MAX_INTEGER # Check valid range for 29 bits
187
- write_float int.to_f, stream
188
- else
189
- stream << AMF3_INTEGER_MARKER
190
- stream << pack_integer(int)
191
- end
192
- end
193
-
194
- def write_float float, stream
195
- stream << AMF3_DOUBLE_MARKER
196
- stream << pack_double(float)
197
- end
198
-
199
- def write_string str, stream
200
- stream << AMF3_STRING_MARKER
201
- write_utf8_vr str, stream
202
- end
203
-
204
- def write_date date, stream
205
- stream << AMF3_DATE_MARKER
206
- if @object_cache[date] != nil
207
- write_reference @object_cache[date], stream
208
- else
209
- # Cache date
210
- @object_cache.add_obj date
211
-
212
- # Build AMF string
213
- date.utc unless date.utc?
214
- seconds = (date.to_f * 1000).to_i
215
- stream << pack_integer(AMF3_NULL_MARKER)
216
- stream << pack_double(seconds)
217
- end
218
- end
219
-
220
- def write_array array, stream
221
- stream << AMF3_ARRAY_MARKER
222
- if @object_cache[array] != nil
223
- write_reference @object_cache[array], stream
224
- else
225
- # Cache array
226
- @object_cache.add_obj array
227
-
228
- # Build AMF string
229
- header = array.length << 1 # make room for a low bit of 1
230
- header = header | 1 # set the low bit to 1
231
- stream << pack_integer(header)
232
- stream << AMF3_CLOSE_DYNAMIC_ARRAY
233
- array.each do |elem|
234
- serialize elem, stream
235
- end
236
- end
237
- end
238
-
239
- def write_object obj, stream
240
- stream << AMF3_OBJECT_MARKER
241
- if @object_cache[obj] != nil
242
- write_reference @object_cache[obj], stream
243
- else
244
- # Cache object
245
- @object_cache.add_obj obj
246
-
247
- # Always serialize things as dynamic objects
248
- stream << AMF3_DYNAMIC_OBJECT
249
-
250
- # Write class name/anonymous
251
- class_name = ClassMapper.get_as_class_name obj
252
- if class_name
253
- write_utf8_vr class_name, stream
254
- else
255
- stream << AMF3_ANONYMOUS_OBJECT
256
- end
257
-
258
- # Write out properties
259
- props = ClassMapper.props_for_serialization obj
260
- props.sort.each do |key, val| # Sort props until Ruby 1.9 becomes common
261
- write_utf8_vr key.to_s, stream
262
- serialize val, stream
263
- end
264
-
265
- # Write close
266
- stream << AMF3_CLOSE_DYNAMIC_OBJECT
267
- end
268
- end
269
-
270
- private
271
- include AMF::Pure::WriteIOHelpers
272
-
273
- def write_utf8_vr str, stream
274
- if str == ''
275
- stream << AMF3_EMPTY_STRING
276
- elsif @string_cache[str] != nil
277
- write_reference @string_cache[str], stream
278
- else
279
- # Cache string
280
- @string_cache.add_obj str
281
-
282
- # Build AMF string
283
- header = str.length << 1 # make room for a low bit of 1
284
- header = header | 1 # set the low bit to 1
285
- stream << pack_integer(header)
286
- stream << str
287
- end
288
- end
289
- end
290
-
291
- class SerializerCache #:nodoc:
292
- def self.new type
293
- if type == :string
294
- StringCache.new
295
- elsif type == :object
296
- ObjectCache.new
297
- end
298
- end
299
-
300
- class StringCache < Hash #:nodoc:
301
- def initialize
302
- @cache_index = 0
303
- end
304
-
305
- def add_obj str
306
- self[str] = @cache_index
307
- @cache_index += 1
308
- end
309
- end
310
-
311
- class ObjectCache < Hash #:nodoc:
312
- def initialize
313
- @cache_index = 0
314
- end
315
-
316
- def [] obj
317
- super(obj.object_id)
318
- end
319
-
320
- def add_obj obj
321
- self[obj.object_id] = @cache_index
322
- @cache_index += 1
323
- end
324
- end
325
- end
326
- end
327
- end
data/lib/amf/pure.rb DELETED
@@ -1,14 +0,0 @@
1
- require 'amf/constants'
2
- require 'amf/pure/deserializer'
3
- require 'amf/pure/serializer'
4
- require 'amf/pure/remoting'
5
-
6
- module AMF
7
- # This module holds all the modules/classes that implement AMF's
8
- # functionality in pure ruby.
9
- module Pure
10
- $DEBUG and warn "Using pure library for AMF."
11
- end
12
-
13
- include AMF::Pure
14
- end
@@ -1,9 +0,0 @@
1
- module AMF
2
- module Values #:nodoc:
3
- class ArrayCollection
4
- def externalized_data=(data)
5
- @data = data
6
- end
7
- end
8
- end
9
- end
@@ -1,133 +0,0 @@
1
- module AMF
2
- module Values #:nodoc:
3
- # Base class for all special AS3 response messages. Maps to
4
- # <tt>flex.messaging.messages.AbstractMessage</tt>
5
- class AbstractMessage
6
- attr_accessor :clientId
7
- attr_accessor :destination
8
- attr_accessor :messageId
9
- attr_accessor :timestamp
10
- attr_accessor :timeToLive
11
- attr_accessor :headers
12
- attr_accessor :body
13
-
14
- protected
15
- def rand_uuid
16
- [8,4,4,4,12].map {|n| rand_hex_3(n)}.join('-').to_s
17
- end
18
-
19
- def rand_hex_3(l)
20
- "%0#{l}x" % rand(1 << l*4)
21
- end
22
- end
23
-
24
- # Maps to <tt>flex.messaging.messages.RemotingMessage</tt>
25
- class RemotingMessage < AbstractMessage
26
- # The name of the service to be called including package name
27
- attr_accessor :source
28
-
29
- # The name of the method to be called
30
- attr_accessor :operation
31
-
32
- # The arguments to call the method with
33
- attr_accessor :parameters
34
-
35
- def initialize
36
- @clientId = rand_uuid
37
- @destination = nil
38
- @messageId = rand_uuid
39
- @timestamp = Time.new.to_i*100
40
- @timeToLive = 0
41
- @headers = {}
42
- @body = nil
43
- end
44
- end
45
-
46
- # Maps to <tt>flex.messaging.messages.AsyncMessage</tt>
47
- class AsyncMessage < AbstractMessage
48
- attr_accessor :correlationId
49
- end
50
-
51
- # Maps to <tt>flex.messaging.messages.CommandMessage</tt>
52
- class CommandMessage < AsyncMessage
53
- SUBSCRIBE_OPERATION = 0
54
- UNSUSBSCRIBE_OPERATION = 1
55
- POLL_OPERATION = 2
56
- CLIENT_SYNC_OPERATION = 4
57
- CLIENT_PING_OPERATION = 5
58
- CLUSTER_REQUEST_OPERATION = 7
59
- LOGIN_OPERATION = 8
60
- LOGOUT_OPERATION = 9
61
- SESSION_INVALIDATE_OPERATION = 10
62
- MULTI_SUBSCRIBE_OPERATION = 11
63
- DISCONNECT_OPERATION = 12
64
- UNKNOWN_OPERATION = 10000
65
-
66
- attr_accessor :operation
67
-
68
- def initialize
69
- @operation = UNKNOWN_OPERATION
70
- end
71
- end
72
-
73
- # Maps to <tt>flex.messaging.messages.AcknowledgeMessage</tt>
74
- class AcknowledgeMessage < AsyncMessage
75
- def initialize message=nil
76
- @clientId = rand_uuid
77
- @destination = nil
78
- @messageId = rand_uuid
79
- @timestamp = Time.new.to_i*100
80
- @timeToLive = 0
81
- @headers = {}
82
- @body = nil
83
-
84
- if message.is_a?(AbstractMessage)
85
- @correlationId = message.messageId
86
- end
87
- end
88
- end
89
-
90
- # Maps to <tt>flex.messaging.messages.ErrorMessage</tt> in AMF3 mode
91
- class ErrorMessage < AcknowledgeMessage
92
- # Extended data that will facilitate custom error processing on the client
93
- attr_accessor :extendedData
94
-
95
- # The fault code for the error, which defaults to the class name of the
96
- # causing exception
97
- attr_accessor :faultCode
98
-
99
- # Detailed description of what caused the error
100
- attr_accessor :faultDetail
101
-
102
- # A simple description of the error
103
- attr_accessor :faultString
104
-
105
- # Optional "root cause" of the error
106
- attr_accessor :rootCause
107
-
108
- def initialize message, exception
109
- super message
110
-
111
- @e = exception
112
- @faultCode = @e.class.name
113
- @faultDetail = @e.backtrace.join("\n")
114
- @faultString = @e.message
115
- end
116
-
117
- def to_amf serializer
118
- stream = ""
119
- if serializer.version == 0
120
- data = {
121
- :faultCode => @faultCode,
122
- :faultDetail => @faultDetail,
123
- :faultString => @faultString
124
- }
125
- serializer.write_hash(data, stream)
126
- else
127
- serializer.write_object(self, stream)
128
- end
129
- stream
130
- end
131
- end
132
- end
133
- end
@@ -1,13 +0,0 @@
1
- module AMF
2
- module Values #:nodoc:
3
- # Hash-like object that can store a type string. Used to preserve type information
4
- # for unmapped objects after deserialization.
5
- class TypedHash < Hash
6
- attr_reader :type
7
-
8
- def initialize type
9
- @type = type
10
- end
11
- end
12
- end
13
- end