qpid_proton 0.18.1 → 0.19.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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/ext/cproton/cproton.c +863 -75
  3. data/lib/codec/data.rb +589 -815
  4. data/lib/codec/mapping.rb +142 -126
  5. data/lib/core/condition.rb +89 -0
  6. data/lib/core/connection.rb +188 -228
  7. data/lib/core/connection_driver.rb +202 -0
  8. data/lib/core/container.rb +366 -0
  9. data/lib/core/delivery.rb +76 -251
  10. data/lib/core/disposition.rb +21 -35
  11. data/lib/core/endpoint.rb +21 -53
  12. data/lib/core/event.rb +156 -0
  13. data/lib/core/exceptions.rb +109 -106
  14. data/lib/core/link.rb +24 -49
  15. data/lib/core/listener.rb +82 -0
  16. data/lib/core/message.rb +59 -155
  17. data/lib/core/messaging_handler.rb +190 -0
  18. data/lib/core/receiver.rb +38 -7
  19. data/lib/core/sasl.rb +43 -46
  20. data/lib/core/sender.rb +55 -32
  21. data/lib/core/session.rb +58 -58
  22. data/lib/core/ssl.rb +5 -13
  23. data/lib/core/ssl_details.rb +1 -2
  24. data/lib/core/ssl_domain.rb +5 -8
  25. data/lib/core/terminus.rb +62 -30
  26. data/lib/core/tracker.rb +45 -0
  27. data/lib/core/transfer.rb +121 -0
  28. data/lib/core/transport.rb +62 -97
  29. data/lib/core/uri.rb +73 -0
  30. data/lib/core/url.rb +11 -7
  31. data/lib/handler/adapter.rb +78 -0
  32. data/lib/handler/messaging_adapter.rb +127 -0
  33. data/lib/handler/messaging_handler.rb +128 -178
  34. data/lib/handler/reactor_messaging_adapter.rb +158 -0
  35. data/lib/messenger/messenger.rb +9 -8
  36. data/lib/messenger/subscription.rb +1 -2
  37. data/lib/messenger/tracker.rb +1 -2
  38. data/lib/messenger/tracker_status.rb +1 -2
  39. data/lib/qpid_proton.rb +36 -66
  40. data/lib/reactor/container.rb +40 -234
  41. data/lib/types/array.rb +73 -130
  42. data/lib/types/described.rb +2 -44
  43. data/lib/types/hash.rb +19 -56
  44. data/lib/types/strings.rb +1 -2
  45. data/lib/types/type.rb +68 -0
  46. data/lib/util/{handler.rb → deprecation.rb} +22 -15
  47. data/lib/util/error_handler.rb +4 -25
  48. data/lib/util/timeout.rb +1 -2
  49. data/lib/util/version.rb +1 -2
  50. data/lib/util/wrapper.rb +58 -38
  51. metadata +16 -33
  52. data/lib/core/base_handler.rb +0 -31
  53. data/lib/core/selectable.rb +0 -130
  54. data/lib/event/collector.rb +0 -148
  55. data/lib/event/event.rb +0 -318
  56. data/lib/event/event_base.rb +0 -91
  57. data/lib/event/event_type.rb +0 -71
  58. data/lib/handler/acking.rb +0 -70
  59. data/lib/handler/c_adaptor.rb +0 -47
  60. data/lib/handler/c_flow_controller.rb +0 -33
  61. data/lib/handler/endpoint_state_handler.rb +0 -217
  62. data/lib/handler/incoming_message_handler.rb +0 -74
  63. data/lib/handler/outgoing_message_handler.rb +0 -100
  64. data/lib/handler/wrapped_handler.rb +0 -76
  65. data/lib/reactor/acceptor.rb +0 -41
  66. data/lib/reactor/backoff.rb +0 -41
  67. data/lib/reactor/connector.rb +0 -115
  68. data/lib/reactor/global_overrides.rb +0 -44
  69. data/lib/reactor/link_option.rb +0 -90
  70. data/lib/reactor/reactor.rb +0 -196
  71. data/lib/reactor/session_per_connection.rb +0 -45
  72. data/lib/reactor/ssl_config.rb +0 -41
  73. data/lib/reactor/task.rb +0 -39
  74. data/lib/reactor/urls.rb +0 -45
  75. data/lib/util/class_wrapper.rb +0 -54
  76. data/lib/util/condition.rb +0 -47
  77. data/lib/util/constants.rb +0 -85
  78. data/lib/util/engine.rb +0 -82
  79. data/lib/util/reactor.rb +0 -32
  80. data/lib/util/swig_helper.rb +0 -114
  81. data/lib/util/uuid.rb +0 -32
@@ -0,0 +1,190 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The ASF licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+
19
+ module Qpid::Proton
20
+
21
+ # A handler for AMQP messaging events.
22
+ #
23
+ # Subclass the handler and provide the #on_xxx methods with your event-handling code.
24
+ #
25
+ # An AMQP endpoint (connection, session or link) must be opened and closed at
26
+ # each end. Normally proton responds automatically to an incoming
27
+ # open/close. You can prevent the automatic response by raising
28
+ # {StopAutoResponse} from +#on_xxx_open+ or +#on_xxx_close+. The application becomes responsible
29
+ # for calling +#open/#close+ at a later point.
30
+ #
31
+ class MessagingHandler
32
+
33
+ # @return [Hash] handler options, see {#initialize}
34
+ attr_reader :options
35
+
36
+ # @!group Most common events
37
+
38
+ # @!method on_container_start(container)
39
+ # The container event loop is started
40
+ # @param container [Container] The container.
41
+
42
+ # @!method on_container_stop(container)
43
+ # The container event loop is stopped
44
+ # @param container [Container] The container.
45
+
46
+ # @!method on_message(delivery, message)
47
+ # A message is received.
48
+ # @param delivery [Delivery] The delivery.
49
+ # @param message [Message] The message
50
+
51
+ # @!method on_sendable(sender)
52
+ # A message can be sent
53
+ # @param sender [Sender] The sender.
54
+
55
+ # @!endgroup
56
+
57
+ # @!group Endpoint lifecycle events
58
+
59
+ # @!method on_connection_open(connection)
60
+ # The remote peer opened the connection
61
+ # @param connection
62
+
63
+ # @!method on_connection_close(connection)
64
+ # The remote peer closed the connection
65
+ # @param connection
66
+
67
+ # @!method on_connection_error(connection)
68
+ # The remote peer closed the connection with an error condition
69
+ # @param connection
70
+
71
+ # @!method on_session_open(session)
72
+ # The remote peer opened the session
73
+ # @param session
74
+
75
+ # @!method on_session_close(session)
76
+ # The remote peer closed the session
77
+ # @param session
78
+
79
+ # @!method on_session_error(session)
80
+ # The remote peer closed the session with an error condition
81
+ # @param session
82
+
83
+ # @!method on_sender_open(sender)
84
+ # The remote peer opened the sender
85
+ # @param sender
86
+
87
+ # @!method on_sender_detach(sender)
88
+ # The remote peer detached the sender
89
+ # @param sender
90
+
91
+ # @!method on_sender_close(sender)
92
+ # The remote peer closed the sender
93
+ # @param sender
94
+
95
+ # @!method on_sender_error(sender)
96
+ # The remote peer closed the sender with an error condition
97
+ # @param sender
98
+
99
+ # @!method on_receiver_open(receiver)
100
+ # The remote peer opened the receiver
101
+ # @param receiver
102
+
103
+ # @!method on_receiver_detach(receiver)
104
+ # The remote peer detached the receiver
105
+ # @param receiver
106
+
107
+ # @!method on_receiver_close(receiver)
108
+ # The remote peer closed the receiver
109
+ # @param receiver
110
+
111
+ # @!method on_receiver_error(receiver)
112
+ # The remote peer closed the receiver with an error condition
113
+ # @param receiver
114
+
115
+ # @!endgroup
116
+
117
+ # @!group Delivery events
118
+
119
+ # @!method on_tracker_accept(tracker)
120
+ # The receiving end accepted a delivery
121
+ # @param tracker [Tracker] The tracker.
122
+
123
+ # @!method on_tracker_reject(tracker)
124
+ # The receiving end rejected a delivery
125
+ # @param tracker [Tracker] The tracker.
126
+
127
+ # @!method on_tracker_release(tracker)
128
+ # The receiving end released a delivery
129
+ # @param tracker [Tracker] The tracker.
130
+
131
+ # @!method on_tracker_modify(tracker)
132
+ # The receiving end modified a delivery
133
+ # @param tracker [Tracker] The tracker.
134
+
135
+ # @!method on_tracker_settle(tracker)
136
+ # The receiving end settled a delivery
137
+ # @param tracker [Tracker] The tracker.
138
+
139
+ # @!method on_delivery_settle(delivery)
140
+ # The sending end settled a delivery
141
+ # @param delivery [Delivery] The delivery.
142
+
143
+ # @!method on_delivery_abort(delivery)
144
+ # A message was begun but aborted by the sender, so was not received.
145
+ # @param delivery [Delivery] The delivery.
146
+
147
+ # @!endgroup
148
+
149
+ # @!group Flow control events
150
+
151
+ # @!method on_sender_drain_start(sender)
152
+ # The remote end of the sender requested draining
153
+ # @param sender [Sender] The sender.
154
+
155
+ # @!method on_receiver_drain_finish(receiver)
156
+ # The remote end of the receiver completed draining
157
+ # @param receiver [Receiver] The receiver.
158
+
159
+ # @!endgroup
160
+
161
+ # @!group Transport events
162
+
163
+ # @!method on_transport_open(transport)
164
+ # The underlying network channel opened
165
+ # @param transport [Transport] The transport.
166
+
167
+ # @!method on_transport_close(transport)
168
+ # The underlying network channel closed
169
+ # @param transport [Transport] The transport.
170
+
171
+ # @!method on_transport_error(transport)
172
+ # The underlying network channel is closing due to an error.
173
+ # @param transport [Transport] The transport.
174
+
175
+ # @!endgroup
176
+
177
+ # @!group Unhandled events
178
+
179
+ # @!method on_error(error_condition)
180
+ # The fallback error handler when no specific on_xxx_error is defined
181
+ # @param error_condition [Condition] Provides information about the error.
182
+
183
+ # @!method on_unhandled(method_name, *args)
184
+ # Called for events with no handler. Similar to ruby's standard #method_
185
+ # @param method_name [Symbol] Name of the event method that would have been called.
186
+ # @param args [Array] Arguments that would have been passed
187
+
188
+ # @!endgroup
189
+ end
190
+ end
data/lib/core/receiver.rb CHANGED
@@ -1,4 +1,3 @@
1
- #--
2
1
  # Licensed to the Apache Software Foundation (ASF) under one
3
2
  # or more contributor license agreements. See the NOTICE file
4
3
  # distributed with this work for additional information
@@ -15,7 +14,7 @@
15
14
  # KIND, either express or implied. See the License for the
16
15
  # specific language governing permissions and limitations
17
16
  # under the License.
18
- #++
17
+
19
18
 
20
19
  module Qpid::Proton
21
20
 
@@ -25,11 +24,43 @@ module Qpid::Proton
25
24
  #
26
25
  class Receiver < Link
27
26
 
28
- # @private
29
- include Util::SwigHelper
30
-
31
27
  # @private
32
28
  PROTON_METHOD_PREFIX = "pn_link"
29
+ # @private
30
+ include Util::Wrapper
31
+
32
+ # Open {Receiver} link
33
+ #
34
+ # @overload open_receiver(address)
35
+ # @param address [String] address of the source to receive from
36
+ # @overload open_receiver(opts)
37
+ # @param opts [Hash] Receiver options, see {Receiver#open}
38
+ # @option opts [Boolean] :credit_window automatically maintain this much credit
39
+ # for messages to be pre-fetched while the current message is processed.
40
+ # @option opts [Boolean] :auto_accept if true, deliveries that are not settled by
41
+ # the application in {MessagingHandler#on_message} are automatically accepted.
42
+ # @option opts [Integer] :credit_window (10) automatically replenish credits for flow control.
43
+ # @option opts [Boolean] :dynamic (false) dynamic property for source {Terminus#dynamic}
44
+ # @option opts [String,Hash] :source source address or source options, see {Terminus#apply}
45
+ # @option opts [String,Hash] :target target address or target options, see {Terminus#apply}
46
+ # @option opts [String] :name (generated) unique name for the link.
47
+ def open(opts=nil)
48
+ opts ||= {}
49
+ opts = { :source => opts } if opts.is_a? String
50
+ @credit_window = opts.fetch(:credit_window, 10)
51
+ @auto_accept = opts.fetch(:auto_accept, true)
52
+ source.apply(opts[:source])
53
+ target.apply(opts[:target])
54
+ source.dynamic = !!opts[:dynamic]
55
+ super()
56
+ self
57
+ end
58
+
59
+ # @return [Integer] credit window, see {#open}
60
+ attr_reader :credit_window
61
+
62
+ # @return [Boolean] auto_accept flag, see {#open}
63
+ attr_reader :auto_accept
33
64
 
34
65
  # @!attribute drain
35
66
  #
@@ -43,7 +74,7 @@ module Qpid::Proton
43
74
  #
44
75
  # @return [Boolean] True if drain mode is set.
45
76
  #
46
- proton_accessor :drain
77
+ proton_set_get :drain
47
78
 
48
79
  # @!attribute [r] draining?
49
80
  #
@@ -77,7 +108,7 @@ module Qpid::Proton
77
108
  # @param limit [Integer] The maximum bytes to receive.
78
109
  #
79
110
  # @return [Integer, nil] The number of bytes received, or nil if the end of
80
- # the stream was reached.t
111
+ # the stream was reached.
81
112
  #
82
113
  # @see Deliver#pending To see how much buffer space is needed.
83
114
  #
data/lib/core/sasl.rb CHANGED
@@ -1,4 +1,3 @@
1
- #--
2
1
  # Licensed to the Apache Software Foundation (ASF) under one
3
2
  # or more contributor license agreements. See the NOTICE file
4
3
  # distributed with this work for additional information
@@ -15,7 +14,7 @@
15
14
  # KIND, either express or implied. See the License for the
16
15
  # specific language governing permissions and limitations
17
16
  # under the License.
18
- #++
17
+
19
18
 
20
19
  module Qpid::Proton
21
20
 
@@ -30,6 +29,7 @@ module Qpid::Proton
30
29
  #
31
30
  # @note Do not instantiate directly, use {Transport#sasl} to create a SASL object.
32
31
  class SASL
32
+ include Util::Deprecation
33
33
 
34
34
  # Negotation has not completed.
35
35
  NONE = Cproton::PN_SASL_NONE
@@ -40,7 +40,7 @@ module Qpid::Proton
40
40
 
41
41
  private
42
42
 
43
- include Util::SwigHelper
43
+ include Util::Wrapper
44
44
  PROTON_METHOD_PREFIX = "pn_sasl"
45
45
 
46
46
  public
@@ -53,11 +53,11 @@ module Qpid::Proton
53
53
 
54
54
  # @!attribute allow_insecure_mechs
55
55
  # @return [Bool] true if clear text authentication is allowed on insecure connections.
56
- proton_accessor :allow_insecure_mechs
56
+ proton_set_get :allow_insecure_mechs
57
57
 
58
58
  # @!attribute user [r]
59
59
  # @return [String] the authenticated user name
60
- proton_reader :user
60
+ proton_get :user
61
61
 
62
62
  # Set the mechanisms allowed for SASL negotation
63
63
  # @param mechanisms [String] space-delimited list of allowed mechanisms
@@ -66,9 +66,7 @@ module Qpid::Proton
66
66
  end
67
67
 
68
68
  # @deprecated use {#allowed_mechs=}
69
- def mechanisms(m)
70
- self.allowed_mechs = m
71
- end
69
+ deprecated_alias :mechanisms, :allowed_mechs=
72
70
 
73
71
  # True if extended SASL negotiation is supported
74
72
  #
@@ -83,44 +81,43 @@ module Qpid::Proton
83
81
  Cproton.pn_sasl_extended()
84
82
  end
85
83
 
86
- # Set the sasl configuration path
87
- #
88
- # This is used to tell SASL where to look for the configuration file.
89
- # In the current implementation it can be a colon separated list of directories.
90
- #
91
- # The environment variable PN_SASL_CONFIG_PATH can also be used to set this path,
92
- # but if both methods are used then this pn_sasl_config_path() will take precedence.
93
- #
94
- # If not set the underlying implementation default will be used.
95
- #
96
- # @param path the configuration path
97
- #
98
- def self.config_path=(path)
99
- Cproton.pn_sasl_config_path(nil, path)
100
- path
101
- end
102
-
103
- # @deprecated use {config_path=}
104
- def self.config_path(path)
105
- self.config_path = path
106
- end
107
-
108
- # Set the configuration file name, without extension
109
- #
110
- # The name with an a ".conf" extension will be searched for in the
111
- # configuration path. If not set, it defaults to "proton-server" or
112
- # "proton-client" for a server (incoming) or client (outgoing) connection
113
- # respectively.
114
- #
115
- # @param name the configuration file name without extension
116
- #
117
- def self.config_name=(name)
118
- Cproton.pn_sasl_config_name(nil, name)
119
- end
120
-
121
- # @deprecated use {config_name=}
122
- def self.config_name(name)
123
- self.config_name = name
84
+ class << self
85
+ include Util::Deprecation
86
+
87
+ # Set the sasl configuration path
88
+ #
89
+ # This is used to tell SASL where to look for the configuration file.
90
+ # In the current implementation it can be a colon separated list of directories.
91
+ #
92
+ # The environment variable PN_SASL_CONFIG_PATH can also be used to set this path,
93
+ # but if both methods are used then this pn_sasl_config_path() will take precedence.
94
+ #
95
+ # If not set the underlying implementation default will be used.
96
+ #
97
+ # @param path the configuration path
98
+ #
99
+ def config_path=(path)
100
+ Cproton.pn_sasl_config_path(nil, path)
101
+ path
102
+ end
103
+
104
+ # Set the configuration file name, without extension
105
+ #
106
+ # The name with an a ".conf" extension will be searched for in the
107
+ # configuration path. If not set, it defaults to "proton-server" or
108
+ # "proton-client" for a server (incoming) or client (outgoing) connection
109
+ # respectively.
110
+ #
111
+ # @param name the configuration file name without extension
112
+ #
113
+ def config_name=(name)
114
+ Cproton.pn_sasl_config_name(nil, name)
115
+ end
116
+
117
+ # @deprecated use {config_path=}
118
+ deprecated_alias :config_path, :config_path=
119
+ # @deprecated use {config_name=}
120
+ deprecated_alias :config_name, :config_name=
124
121
  end
125
122
  end
126
123
  end
data/lib/core/sender.rb CHANGED
@@ -1,4 +1,3 @@
1
- #--
2
1
  # Licensed to the Apache Software Foundation (ASF) under one
3
2
  # or more contributor license agreements. See the NOTICE file
4
3
  # distributed with this work for additional information
@@ -15,7 +14,7 @@
15
14
  # KIND, either express or implied. See the License for the
16
15
  # specific language governing permissions and limitations
17
16
  # under the License.
18
- #++
17
+
19
18
 
20
19
  module Qpid::Proton
21
20
 
@@ -28,49 +27,73 @@ module Qpid::Proton
28
27
  # @private
29
28
  include Util::ErrorHandler
30
29
 
31
- # @private
32
- can_raise_error :stream, :error_class => Qpid::Proton::LinkError
33
-
34
- # Signals the availability of deliveries.
30
+ # Open the {Sender} link
35
31
  #
32
+ # @overload open_sender(address)
33
+ # @param address [String] address of the target to send to
34
+ # @overload open_sender(opts)
35
+ # @option opts [Boolean] :auto_settle (true) if true, automatically settle transfers
36
+ # @option opts [Boolean] :dynamic (false) dynamic property for source {Terminus#dynamic}
37
+ # @option opts [String,Hash] :source source address or source options, see {Terminus#apply}
38
+ # @option opts [String,Hash] :target target address or target options, see {Terminus#apply}
39
+ # @option opts [String] :name (generated) unique name for the link.
40
+ def open(opts=nil)
41
+ opts = { :target => opts } if opts.is_a? String
42
+ opts ||= {}
43
+ target.apply opts[:target]
44
+ source.apply opts[:source]
45
+ target.dynamic = !!opts[:dynamic]
46
+ @auto_settle = opts.fetch(:auto_settle, true)
47
+ super()
48
+ self
49
+ end
50
+
51
+ # @return [Boolean] auto_settle flag, see {#open}
52
+ attr_reader :auto_settle
53
+
54
+ # Hint to the remote receiver about the number of messages available.
55
+ # The receiver may use this to optimize credit flow, or may ignore it.
36
56
  # @param n [Integer] The number of deliveries potentially available.
37
- #
38
57
  def offered(n)
39
58
  Cproton.pn_link_offered(@impl, n)
40
59
  end
41
60
 
42
- # Sends the specified data to the remote endpoint.
43
- #
44
- # @param object [Object] The content to send.
45
- # @param tag [Object] The tag
46
- #
47
- # @return [Integer] The number of bytes sent.
48
- #
49
- def send(object, tag = nil)
50
- if object.respond_to? :proton_send
51
- object.proton_send(self, tag)
52
- else
53
- stream(object)
61
+ # TODO aconway 2017-12-05: incompatible, used to return bytes sent.
62
+
63
+ # @!method send(message)
64
+ # Send a message.
65
+ # @param message [Message] The message to send.
66
+ # @return [Tracker] Tracks the outcome of the message.
67
+ def send(message, *args)
68
+ tag = nil
69
+ if args.size > 0
70
+ # deprecated: allow tag in args[0] for backwards compat
71
+ raise ArgumentError("too many arguments") if args.size > 1
72
+ tag = args[0]
54
73
  end
74
+ tag ||= next_tag
75
+ t = Tracker.new(Cproton.pn_delivery(@impl, tag))
76
+ Cproton.pn_link_send(@impl, message.encode)
77
+ Cproton.pn_link_advance(@impl)
78
+ t.settle if snd_settle_mode == SND_SETTLED
79
+ return t
55
80
  end
56
81
 
57
- # Send the specified bytes as part of the current delivery.
58
- #
59
- # @param bytes [Array] The bytes to send.
60
- #
61
- # @return [Integer] The number of bytes sent.
62
- #
82
+ # @deprecated use {#send}
63
83
  def stream(bytes)
84
+ deprecated __method__, "send"
64
85
  Cproton.pn_link_send(@impl, bytes)
65
86
  end
66
87
 
67
- def delivery_tag
68
- @tag_count ||= 0
69
- result = @tag_count.succ
70
- @tag_count = result
71
- return "#{result}"
72
- end
88
+ # @deprecated internal use only
89
+ def delivery_tag() deprecated(__method__); next_tag; end
73
90
 
74
- end
91
+ private
75
92
 
93
+ def initialize(*arg) super; @tag_count = 0; end
94
+ def next_tag() (@tag_count += 1).to_s(32); end
95
+ can_raise_error :stream, :error_class => Qpid::Proton::LinkError
96
+ end
76
97
  end
98
+
99
+