onstomp 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/.gitignore +4 -0
  2. data/.yardopts +2 -1
  3. data/Rakefile +147 -0
  4. data/extra_doc/API.md +491 -0
  5. data/extra_doc/API.md.erb +33 -0
  6. data/extra_doc/DeveloperNarrative.md +123 -0
  7. data/extra_doc/UserNarrative.md +511 -0
  8. data/lib/onstomp.rb +5 -5
  9. data/lib/onstomp/client.rb +6 -1
  10. data/lib/onstomp/components/frame.rb +6 -6
  11. data/lib/onstomp/components/frame_headers.rb +18 -18
  12. data/lib/onstomp/components/scopes/transaction_scope.rb +11 -11
  13. data/lib/onstomp/components/subscription.rb +2 -2
  14. data/lib/onstomp/components/threaded_processor.rb +1 -1
  15. data/lib/onstomp/components/uri.rb +1 -1
  16. data/lib/onstomp/connections/base.rb +5 -5
  17. data/lib/onstomp/connections/heartbeating.rb +2 -2
  18. data/lib/onstomp/connections/serializers/stomp_1.rb +6 -6
  19. data/lib/onstomp/connections/serializers/stomp_1_1.rb +2 -2
  20. data/lib/onstomp/connections/stomp_1_0.rb +1 -1
  21. data/lib/onstomp/connections/stomp_1_1.rb +1 -1
  22. data/lib/onstomp/failover.rb +4 -0
  23. data/lib/onstomp/failover/buffers.rb +1 -0
  24. data/lib/onstomp/failover/buffers/receipts.rb +101 -0
  25. data/lib/onstomp/failover/buffers/written.rb +2 -2
  26. data/lib/onstomp/failover/client.rb +15 -12
  27. data/lib/onstomp/failover/failover_configurable.rb +3 -3
  28. data/lib/onstomp/failover/pools/base.rb +1 -1
  29. data/lib/onstomp/failover/uri.rb +41 -16
  30. data/lib/onstomp/interfaces/client_configurable.rb +1 -1
  31. data/lib/onstomp/interfaces/client_events.rb +30 -11
  32. data/lib/onstomp/interfaces/connection_events.rb +5 -1
  33. data/lib/onstomp/interfaces/event_manager.rb +2 -2
  34. data/lib/onstomp/interfaces/frame_methods.rb +169 -8
  35. data/lib/onstomp/interfaces/uri_configurable.rb +3 -3
  36. data/lib/onstomp/open-uri/client_extensions.rb +4 -4
  37. data/lib/onstomp/version.rb +2 -2
  38. data/onstomp.gemspec +0 -1
  39. data/spec/onstomp/components/threaded_processor_spec.rb +21 -0
  40. data/spec/onstomp/connections/base_spec.rb +15 -0
  41. data/spec/onstomp/failover/buffers/receipts_spec.rb +189 -0
  42. data/spec/onstomp/failover/buffers/written_spec.rb +167 -1
  43. data/spec/onstomp/failover/client_spec.rb +70 -1
  44. data/spec/onstomp/failover/failover_events_spec.rb +1 -2
  45. data/spec/onstomp/failover/uri_spec.rb +37 -4
  46. data/spec/onstomp/full_stacks/failover_spec.rb +76 -25
  47. data/spec/onstomp/full_stacks/onstomp_spec.rb +52 -8
  48. data/spec/onstomp/full_stacks/onstomp_ssh_spec.rb +83 -0
  49. data/spec/onstomp/full_stacks/test_broker.rb +45 -29
  50. metadata +11 -15
  51. data/DeveloperNarrative.md +0 -15
  52. data/UserNarrative.md +0 -8
data/.gitignore CHANGED
@@ -4,3 +4,7 @@ pkg/*
4
4
  .bundle
5
5
  .yardoc
6
6
  nbproject
7
+ doc
8
+ coverage
9
+ turbulence
10
+ Gemfile.lock
data/.yardopts CHANGED
@@ -1,5 +1,6 @@
1
1
  --no-private
2
2
  --title "OnStomp Documentation"
3
3
  --readme README.md
4
- --files LICENSE.md,CHANGELOG.md,DeveloperNarrative.md,UserNarrative.md
4
+ --files LICENSE.md,CHANGELOG.md,extra_doc/*.md
5
+ -m markdown
5
6
  lib/**/*.rb
data/Rakefile CHANGED
@@ -12,3 +12,150 @@ RSpec::Core::RakeTask.new do |t|
12
12
  end
13
13
 
14
14
  task :default => :spec
15
+
16
+ desc "Tasks for generating/monitoring APIs and their changes"
17
+ task :api do
18
+ puts "Refreshing YARD database"
19
+ `yard doc -n`
20
+ puts "Generating API.md"
21
+ `rake api:gen`
22
+ puts "Updating YARD docs"
23
+ `rake yard`
24
+ end
25
+
26
+ namespace :api do
27
+ def parse_api_spec str
28
+ g_major, s_proto, rest = str.split(' ', 3)
29
+ g_varies = nil
30
+ g_major = g_major[4..-1]
31
+ s_proto = s_proto[6..-1]
32
+ if g_major =~ /[\*\!]$/
33
+ g_varies = g_major.end_with?('!') ? :major : :minor
34
+ g_major = g_major[0..-2]
35
+ end
36
+ if s_proto =~ /[\*\!]$/
37
+ s_varies = s_proto.end_with?('!') ? :major : :minor
38
+ s_proto = s_proto[0..-2]
39
+ end
40
+ {
41
+ :majors => g_major.split(','),
42
+ :stomp_protocols => s_proto.split(','),
43
+ :gem_variations => g_varies,
44
+ :protocol_variations => s_varies,
45
+ :notes => rest
46
+ }
47
+ end
48
+
49
+ def make_method_tag link, yard_obj
50
+ parse_api_spec(yard_obj.tags.detect { |t| t.tag_name == 'api' }.text).tap do |t|
51
+ t[:name] = yard_obj.name
52
+ t[:signature] = yard_obj.signature.sub(/^def /,'')
53
+ t[:yard_link] = link
54
+ end
55
+ end
56
+
57
+ def make_signature_tags link, yard_obj
58
+ base = make_method_tag(link, yard_obj)
59
+ overrides = yard_obj.tags.select do |t|
60
+ t.instance_of? ::YARD::Tags::OverloadTag
61
+ end
62
+ if overrides.empty?
63
+ [base]
64
+ else
65
+ overrides.map do |o|
66
+ base.dup.tap do |b|
67
+ b[:signature] = o.signature
68
+ if api_spec = o.tags.detect { |t| t.tag_name == 'api' }
69
+ b.merge! parse_api_spec(api_spec.text)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ desc "Generate some API changes"
77
+ task :gen => [:yard] do
78
+ GEM_ROOT = File.expand_path('..', __FILE__)
79
+ TEMPLATE_INPUT = File.join GEM_ROOT, 'extra_doc', 'API.md.erb'
80
+ YARD_DB = File.join GEM_ROOT, '.yardoc', 'objects', 'root.dat'
81
+ TEMPLATE_OUTPUT = File.join GEM_ROOT, 'extra_doc', 'API.md'
82
+ require 'erubis'
83
+
84
+ template = File.open(TEMPLATE_INPUT, 'rb') { |f| f.read }
85
+ yard_hash = Marshal.load(File.open(YARD_DB, 'rb') { |f| f.read })
86
+ api_set = yard_hash.keys.select { |k| yard_hash[k].tags.any? { |t| t.tag_name == 'api' } }
87
+ api_table = Hash.new do |h,k|
88
+ h[k] = { :version => k, :methods => [] }
89
+ end
90
+ protos = []
91
+ api_set.each do |k|
92
+ yard_obj = yard_hash[k]
93
+ meths = make_signature_tags k.to_s, yard_obj
94
+ meths.each do |m|
95
+ m[:stomp_protocols].each { |p| protos << p unless protos.include?(p) }
96
+ m[:majors].each { |v| api_table[v][:methods] << m }
97
+ end
98
+ end
99
+ protos.sort!
100
+ apis = api_table.keys.sort.map do |k|
101
+ api = {
102
+ :version => k,
103
+ :protocols => protos
104
+ }
105
+ api[:methods] = api_table[k][:methods].map do |m|
106
+ m[:protocols] = protos.map { |p| m[:stomp_protocols].include? p }
107
+ m
108
+ end.sort { |a,b| a[:name] <=> b[:name] }
109
+ api
110
+ end
111
+ erb = Erubis::Eruby.new template
112
+ template = erb.result(binding())
113
+ File.open(TEMPLATE_OUTPUT, 'wb') { |f| f.write template }
114
+ end
115
+
116
+ desc "Generate yard docs on gh-pages branch and push out to github"
117
+ task :push do
118
+ require 'tmpdir'
119
+ stashed = false
120
+ tmp_doc = Dir.mktmpdir 'onstomp_docs'
121
+ puts "Generating yard docs in temp dir #{tmp_doc}"
122
+ `rake yard OPTS="--output-dir #{tmp_doc}"`
123
+ `git diff-files --quiet`
124
+ if $?.exitstatus == 1
125
+ # we have changes
126
+ puts "Stashing your working changes"
127
+ stashed = true
128
+ `git stash save "stashing changes for gh-pages update"`
129
+ end
130
+ sh "git checkout gh-pages"
131
+ sh "git pull origin gh-pages"
132
+ rm_rf [ Dir.glob("*.html"), "OnStomp", "js", "css" ].flatten
133
+ cp_r "#{tmp_doc}/.", '.'
134
+ new_docs = Dir.glob("#{tmp_doc}/**/*").map { |f| f.sub(tmp_doc + '/','') }
135
+ rm_rf tmp_doc
136
+ removed_docs = `git status --porcelain --untracked-files=no|grep "^ D "`.split("\n").map do |line|
137
+ line[3..-1]
138
+ end
139
+ puts "Adding changed documentation"
140
+ `git add #{new_docs.join(' ')}`
141
+ unless removed_docs.empty?
142
+ puts "Cleaning out old doc files"
143
+ `git rm #{removed_docs.join(' ')}`
144
+ end
145
+ sh "git commit -m \"updated yard docs\""
146
+ puts "Pushing changes to remote 'origin/gh-pages'"
147
+ `git push origin gh-pages`
148
+ if $?.exitstatus == 1
149
+ puts "Updates could not be pushed to remote, resolve the conflict then:"
150
+ puts "\tgit push origin gh-pages"
151
+ puts "\tgit checkout master"
152
+ puts "\tgit stash pop" if stashed
153
+ else
154
+ `git checkout master`
155
+ if stashed
156
+ puts "Restoring your working copy changes"
157
+ `git stash pop`
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,491 @@
1
+ # OnStomp Generated Method APIs
2
+
3
+ ## OnStomp 1 API (1.0.0+)
4
+
5
+ <table style="width:75%; border-collapse:collapse;">
6
+ <thead>
7
+ <tr>
8
+ <th style="text-align: left;">Method</th>
9
+ <th style="width: 50%; text-align: left;">Signature</th>
10
+ <th style="text-align: left;">STOMP 1.0</th>
11
+ <th style="text-align: left;">STOMP 1.1</th>
12
+ </tr>
13
+ </thead>
14
+ <tfoot>
15
+ </tfoot>
16
+ <tbody>
17
+ <tr>
18
+ <td>{OnStomp::Interfaces::FrameMethods#abort abort}</td>
19
+ <td>
20
+ <code>abort(tx_id, headers={})</code>
21
+ </td>
22
+ <td style="background-color: #bfb;">true</td>
23
+ <td style="background-color: #bfb;">true</td>
24
+ </tr>
25
+ <tr>
26
+ <td>{OnStomp::Interfaces::FrameMethods#ack ack}</td>
27
+ <td>
28
+ <code>ack(message_frame, headers={})</code>
29
+ </td>
30
+ <td style="background-color: #bfb;">true</td>
31
+ <td style="background-color: #bfb;">true</td>
32
+ </tr>
33
+ <tr>
34
+ <td>{OnStomp::Interfaces::FrameMethods#ack ack}</td>
35
+ <td>
36
+ <code>ack(message_id, headers={})</code>
37
+ </td>
38
+ <td style="background-color: #bfb;">true</td>
39
+ <td style="background-color: #fbb;">false</td>
40
+ </tr>
41
+ <tr>
42
+ <td>{OnStomp::Interfaces::FrameMethods#ack ack}</td>
43
+ <td>
44
+ <code>ack(message_id, subscription_id, headers={})</code>
45
+ </td>
46
+ <td style="background-color: #bfb;">true</td>
47
+ <td style="background-color: #bfb;">true</td>
48
+ </tr>
49
+ <tr>
50
+ <td>{OnStomp::Interfaces::ClientEvents#after_receiving after_receiving}</td>
51
+ <td>
52
+ <code>create_event_methods :receiving, :before, :after</code>
53
+ </td>
54
+ <td style="background-color: #bfb;">true</td>
55
+ <td style="background-color: #bfb;">true</td>
56
+ </tr>
57
+ <tr>
58
+ <td>{OnStomp::Interfaces::ClientEvents#after_transmitting after_transmitting}</td>
59
+ <td>
60
+ <code>create_event_methods :transmitting, :before, :after</code>
61
+ </td>
62
+ <td style="background-color: #bfb;">true</td>
63
+ <td style="background-color: #bfb;">true</td>
64
+ </tr>
65
+ <tr>
66
+ <td>{OnStomp::Interfaces::FrameMethods#beat beat}</td>
67
+ <td>
68
+ <code>beat( )</code>
69
+ </td>
70
+ <td style="background-color: #fbb;">false</td>
71
+ <td style="background-color: #bfb;">true</td>
72
+ </tr>
73
+ <tr>
74
+ <td>{OnStomp::Interfaces::ClientEvents#before_abort before_abort}</td>
75
+ <td>
76
+ <code>create_event_methods :abort, :before, :on</code>
77
+ </td>
78
+ <td style="background-color: #bfb;">true</td>
79
+ <td style="background-color: #bfb;">true</td>
80
+ </tr>
81
+ <tr>
82
+ <td>{OnStomp::Interfaces::ClientEvents#before_ack before_ack}</td>
83
+ <td>
84
+ <code>create_event_methods :ack, :before, :on</code>
85
+ </td>
86
+ <td style="background-color: #bfb;">true</td>
87
+ <td style="background-color: #bfb;">true</td>
88
+ </tr>
89
+ <tr>
90
+ <td>{OnStomp::Interfaces::ClientEvents#before_begin before_begin}</td>
91
+ <td>
92
+ <code>create_event_methods :begin, :before, :on</code>
93
+ </td>
94
+ <td style="background-color: #bfb;">true</td>
95
+ <td style="background-color: #bfb;">true</td>
96
+ </tr>
97
+ <tr>
98
+ <td>{OnStomp::Interfaces::ClientEvents#before_broker_beat before_broker_beat}</td>
99
+ <td>
100
+ <code>create_event_methods :broker_beat, :before, :on</code>
101
+ </td>
102
+ <td style="background-color: #fbb;">false</td>
103
+ <td style="background-color: #bfb;">true</td>
104
+ </tr>
105
+ <tr>
106
+ <td>{OnStomp::Interfaces::ClientEvents#before_client_beat before_client_beat}</td>
107
+ <td>
108
+ <code>create_event_methods :client_beat, :before, :on</code>
109
+ </td>
110
+ <td style="background-color: #fbb;">false</td>
111
+ <td style="background-color: #bfb;">true</td>
112
+ </tr>
113
+ <tr>
114
+ <td>{OnStomp::Interfaces::ClientEvents#before_commit before_commit}</td>
115
+ <td>
116
+ <code>create_event_methods :commit, :before, :on</code>
117
+ </td>
118
+ <td style="background-color: #bfb;">true</td>
119
+ <td style="background-color: #bfb;">true</td>
120
+ </tr>
121
+ <tr>
122
+ <td>{OnStomp::Interfaces::ClientEvents#before_disconnect before_disconnect}</td>
123
+ <td>
124
+ <code>create_event_methods :disconnect, :before, :on</code>
125
+ </td>
126
+ <td style="background-color: #bfb;">true</td>
127
+ <td style="background-color: #bfb;">true</td>
128
+ </tr>
129
+ <tr>
130
+ <td>{OnStomp::Interfaces::ClientEvents#before_error before_error}</td>
131
+ <td>
132
+ <code>create_event_methods :error, :before, :on</code>
133
+ </td>
134
+ <td style="background-color: #bfb;">true</td>
135
+ <td style="background-color: #bfb;">true</td>
136
+ </tr>
137
+ <tr>
138
+ <td>{OnStomp::Interfaces::ClientEvents#before_message before_message}</td>
139
+ <td>
140
+ <code>create_event_methods :message, :before, :on</code>
141
+ </td>
142
+ <td style="background-color: #bfb;">true</td>
143
+ <td style="background-color: #bfb;">true</td>
144
+ </tr>
145
+ <tr>
146
+ <td>{OnStomp::Interfaces::ClientEvents#before_nack before_nack}</td>
147
+ <td>
148
+ <code>create_event_methods :nack, :before, :on</code>
149
+ </td>
150
+ <td style="background-color: #fbb;">false</td>
151
+ <td style="background-color: #bfb;">true</td>
152
+ </tr>
153
+ <tr>
154
+ <td>{OnStomp::Interfaces::ClientEvents#before_receipt before_receipt}</td>
155
+ <td>
156
+ <code>create_event_methods :receipt, :before, :on</code>
157
+ </td>
158
+ <td style="background-color: #bfb;">true</td>
159
+ <td style="background-color: #bfb;">true</td>
160
+ </tr>
161
+ <tr>
162
+ <td>{OnStomp::Interfaces::ClientEvents#before_receiving before_receiving}</td>
163
+ <td>
164
+ <code>create_event_methods :receiving, :before, :after</code>
165
+ </td>
166
+ <td style="background-color: #bfb;">true</td>
167
+ <td style="background-color: #bfb;">true</td>
168
+ </tr>
169
+ <tr>
170
+ <td>{OnStomp::Interfaces::ClientEvents#before_send before_send}</td>
171
+ <td>
172
+ <code>create_event_methods :send, :before, :on</code>
173
+ </td>
174
+ <td style="background-color: #bfb;">true</td>
175
+ <td style="background-color: #bfb;">true</td>
176
+ </tr>
177
+ <tr>
178
+ <td>{OnStomp::Interfaces::ClientEvents#before_subscribe before_subscribe}</td>
179
+ <td>
180
+ <code>create_event_methods :subscribe, :before, :on</code>
181
+ </td>
182
+ <td style="background-color: #bfb;">true</td>
183
+ <td style="background-color: #bfb;">true</td>
184
+ </tr>
185
+ <tr>
186
+ <td>{OnStomp::Interfaces::ClientEvents#before_transmitting before_transmitting}</td>
187
+ <td>
188
+ <code>create_event_methods :transmitting, :before, :after</code>
189
+ </td>
190
+ <td style="background-color: #bfb;">true</td>
191
+ <td style="background-color: #bfb;">true</td>
192
+ </tr>
193
+ <tr>
194
+ <td>{OnStomp::Interfaces::ClientEvents#before_unsubscribe before_unsubscribe}</td>
195
+ <td>
196
+ <code>create_event_methods :unsubscribe, :before, :on</code>
197
+ </td>
198
+ <td style="background-color: #bfb;">true</td>
199
+ <td style="background-color: #bfb;">true</td>
200
+ </tr>
201
+ <tr>
202
+ <td>{OnStomp::Interfaces::FrameMethods#begin begin}</td>
203
+ <td>
204
+ <code>begin(tx_id, headers={})</code>
205
+ </td>
206
+ <td style="background-color: #bfb;">true</td>
207
+ <td style="background-color: #bfb;">true</td>
208
+ </tr>
209
+ <tr>
210
+ <td>{OnStomp::Client#close! close!}</td>
211
+ <td>
212
+ <code>close!( )</code>
213
+ </td>
214
+ <td style="background-color: #bfb;">true</td>
215
+ <td style="background-color: #bfb;">true</td>
216
+ </tr>
217
+ <tr>
218
+ <td>{OnStomp::Interfaces::FrameMethods#commit commit}</td>
219
+ <td>
220
+ <code>commit(tx_id, headers={})</code>
221
+ </td>
222
+ <td style="background-color: #bfb;">true</td>
223
+ <td style="background-color: #bfb;">true</td>
224
+ </tr>
225
+ <tr>
226
+ <td>{OnStomp::Client#connect connect}</td>
227
+ <td>
228
+ <code>connect(headers={})</code>
229
+ </td>
230
+ <td style="background-color: #bfb;">true</td>
231
+ <td style="background-color: #bfb;">true</td>
232
+ </tr>
233
+ <tr>
234
+ <td>{OnStomp::Client#connected? connected?}</td>
235
+ <td>
236
+ <code>connected?( )</code>
237
+ </td>
238
+ <td style="background-color: #bfb;">true</td>
239
+ <td style="background-color: #bfb;">true</td>
240
+ </tr>
241
+ <tr>
242
+ <td>{OnStomp::Client#disconnect disconnect}</td>
243
+ <td>
244
+ <code>disconnect_with_flush(headers={})</code>
245
+ </td>
246
+ <td style="background-color: #bfb;">true</td>
247
+ <td style="background-color: #bfb;">true</td>
248
+ </tr>
249
+ <tr>
250
+ <td>{OnStomp::Interfaces::FrameMethods#disconnect disconnect}</td>
251
+ <td>
252
+ <code>disconnect(headers={})</code>
253
+ </td>
254
+ <td style="background-color: #bfb;">true</td>
255
+ <td style="background-color: #bfb;">true</td>
256
+ </tr>
257
+ <tr>
258
+ <td>{OnStomp::Client#disconnect_with_flush disconnect_with_flush}</td>
259
+ <td>
260
+ <code>disconnect_with_flush(headers={})</code>
261
+ </td>
262
+ <td style="background-color: #bfb;">true</td>
263
+ <td style="background-color: #bfb;">true</td>
264
+ </tr>
265
+ <tr>
266
+ <td>{OnStomp::Client#initialize initialize}</td>
267
+ <td>
268
+ <code>initialize(uri, options={})</code>
269
+ </td>
270
+ <td style="background-color: #bfb;">true</td>
271
+ <td style="background-color: #bfb;">true</td>
272
+ </tr>
273
+ <tr>
274
+ <td>{OnStomp::Interfaces::FrameMethods#nack nack}</td>
275
+ <td>
276
+ <code>nack(message_id, subscription_id, heders={})</code>
277
+ </td>
278
+ <td style="background-color: #fbb;">false</td>
279
+ <td style="background-color: #bfb;">true</td>
280
+ </tr>
281
+ <tr>
282
+ <td>{OnStomp::Interfaces::FrameMethods#nack nack}</td>
283
+ <td>
284
+ <code>nack(message_frame, headers={})</code>
285
+ </td>
286
+ <td style="background-color: #fbb;">false</td>
287
+ <td style="background-color: #bfb;">true</td>
288
+ </tr>
289
+ <tr>
290
+ <td>{OnStomp::Interfaces::ClientEvents#on_abort on_abort}</td>
291
+ <td>
292
+ <code>create_event_methods :abort, :before, :on</code>
293
+ </td>
294
+ <td style="background-color: #bfb;">true</td>
295
+ <td style="background-color: #bfb;">true</td>
296
+ </tr>
297
+ <tr>
298
+ <td>{OnStomp::Interfaces::ClientEvents#on_ack on_ack}</td>
299
+ <td>
300
+ <code>create_event_methods :ack, :before, :on</code>
301
+ </td>
302
+ <td style="background-color: #bfb;">true</td>
303
+ <td style="background-color: #bfb;">true</td>
304
+ </tr>
305
+ <tr>
306
+ <td>{OnStomp::Interfaces::ClientEvents#on_begin on_begin}</td>
307
+ <td>
308
+ <code>create_event_methods :begin, :before, :on</code>
309
+ </td>
310
+ <td style="background-color: #bfb;">true</td>
311
+ <td style="background-color: #bfb;">true</td>
312
+ </tr>
313
+ <tr>
314
+ <td>{OnStomp::Interfaces::ClientEvents#on_broker_beat on_broker_beat}</td>
315
+ <td>
316
+ <code>create_event_methods :broker_beat, :before, :on</code>
317
+ </td>
318
+ <td style="background-color: #fbb;">false</td>
319
+ <td style="background-color: #bfb;">true</td>
320
+ </tr>
321
+ <tr>
322
+ <td>{OnStomp::Interfaces::ClientEvents#on_client_beat on_client_beat}</td>
323
+ <td>
324
+ <code>create_event_methods :client_beat, :before, :on</code>
325
+ </td>
326
+ <td style="background-color: #fbb;">false</td>
327
+ <td style="background-color: #bfb;">true</td>
328
+ </tr>
329
+ <tr>
330
+ <td>{OnStomp::Interfaces::ConnectionEvents#on_closed on_closed}</td>
331
+ <td>
332
+ <code>create_event_methods :closed, :on</code>
333
+ </td>
334
+ <td style="background-color: #bfb;">true</td>
335
+ <td style="background-color: #bfb;">true</td>
336
+ </tr>
337
+ <tr>
338
+ <td>{OnStomp::Interfaces::ClientEvents#on_commit on_commit}</td>
339
+ <td>
340
+ <code>create_event_methods :commit, :before, :on</code>
341
+ </td>
342
+ <td style="background-color: #bfb;">true</td>
343
+ <td style="background-color: #bfb;">true</td>
344
+ </tr>
345
+ <tr>
346
+ <td>{OnStomp::Interfaces::ClientEvents#on_connect on_connect}</td>
347
+ <td>
348
+ <code>create_event_methods :connect, :on</code>
349
+ </td>
350
+ <td style="background-color: #bfb;">true</td>
351
+ <td style="background-color: #bfb;">true</td>
352
+ </tr>
353
+ <tr>
354
+ <td>{OnStomp::Interfaces::ConnectionEvents#on_died on_died}</td>
355
+ <td>
356
+ <code>create_event_methods :died, :on</code>
357
+ </td>
358
+ <td style="background-color: #fbb;">false</td>
359
+ <td style="background-color: #bfb;">true</td>
360
+ </tr>
361
+ <tr>
362
+ <td>{OnStomp::Interfaces::ClientEvents#on_disconnect on_disconnect}</td>
363
+ <td>
364
+ <code>create_event_methods :disconnect, :before, :on</code>
365
+ </td>
366
+ <td style="background-color: #bfb;">true</td>
367
+ <td style="background-color: #bfb;">true</td>
368
+ </tr>
369
+ <tr>
370
+ <td>{OnStomp::Interfaces::ClientEvents#on_error on_error}</td>
371
+ <td>
372
+ <code>create_event_methods :error, :before, :on</code>
373
+ </td>
374
+ <td style="background-color: #bfb;">true</td>
375
+ <td style="background-color: #bfb;">true</td>
376
+ </tr>
377
+ <tr>
378
+ <td>{OnStomp::Interfaces::ConnectionEvents#on_established on_established}</td>
379
+ <td>
380
+ <code>create_event_methods :established, :on</code>
381
+ </td>
382
+ <td style="background-color: #bfb;">true</td>
383
+ <td style="background-color: #bfb;">true</td>
384
+ </tr>
385
+ <tr>
386
+ <td>{OnStomp::Interfaces::ClientEvents#on_message on_message}</td>
387
+ <td>
388
+ <code>create_event_methods :message, :before, :on</code>
389
+ </td>
390
+ <td style="background-color: #bfb;">true</td>
391
+ <td style="background-color: #bfb;">true</td>
392
+ </tr>
393
+ <tr>
394
+ <td>{OnStomp::Interfaces::ClientEvents#on_nack on_nack}</td>
395
+ <td>
396
+ <code>create_event_methods :nack, :before, :on</code>
397
+ </td>
398
+ <td style="background-color: #fbb;">false</td>
399
+ <td style="background-color: #bfb;">true</td>
400
+ </tr>
401
+ <tr>
402
+ <td>{OnStomp::Interfaces::ClientEvents#on_receipt on_receipt}</td>
403
+ <td>
404
+ <code>create_event_methods :receipt, :before, :on</code>
405
+ </td>
406
+ <td style="background-color: #bfb;">true</td>
407
+ <td style="background-color: #bfb;">true</td>
408
+ </tr>
409
+ <tr>
410
+ <td>{OnStomp::Interfaces::ClientEvents#on_send on_send}</td>
411
+ <td>
412
+ <code>create_event_methods :send, :before, :on</code>
413
+ </td>
414
+ <td style="background-color: #bfb;">true</td>
415
+ <td style="background-color: #bfb;">true</td>
416
+ </tr>
417
+ <tr>
418
+ <td>{OnStomp::Interfaces::ClientEvents#on_subscribe on_subscribe}</td>
419
+ <td>
420
+ <code>create_event_methods :subscribe, :before, :on</code>
421
+ </td>
422
+ <td style="background-color: #bfb;">true</td>
423
+ <td style="background-color: #bfb;">true</td>
424
+ </tr>
425
+ <tr>
426
+ <td>{OnStomp::Interfaces::ConnectionEvents#on_terminated on_terminated}</td>
427
+ <td>
428
+ <code>create_event_methods :terminated, :on</code>
429
+ </td>
430
+ <td style="background-color: #bfb;">true</td>
431
+ <td style="background-color: #bfb;">true</td>
432
+ </tr>
433
+ <tr>
434
+ <td>{OnStomp::Interfaces::ClientEvents#on_unsubscribe on_unsubscribe}</td>
435
+ <td>
436
+ <code>create_event_methods :unsubscribe, :before, :on</code>
437
+ </td>
438
+ <td style="background-color: #bfb;">true</td>
439
+ <td style="background-color: #bfb;">true</td>
440
+ </tr>
441
+ <tr>
442
+ <td>{OnStomp::Client#open open}</td>
443
+ <td>
444
+ <code>connect(headers={})</code>
445
+ </td>
446
+ <td style="background-color: #bfb;">true</td>
447
+ <td style="background-color: #bfb;">true</td>
448
+ </tr>
449
+ <tr>
450
+ <td>{OnStomp::Interfaces::FrameMethods#puts puts}</td>
451
+ <td>
452
+ <code>send(dest, body, headers={}, &cb)</code>
453
+ </td>
454
+ <td style="background-color: #bfb;">true</td>
455
+ <td style="background-color: #bfb;">true</td>
456
+ </tr>
457
+ <tr>
458
+ <td>{OnStomp::Interfaces::FrameMethods#send send}</td>
459
+ <td>
460
+ <code>send(dest, body, headers={}, &cb)</code>
461
+ </td>
462
+ <td style="background-color: #bfb;">true</td>
463
+ <td style="background-color: #bfb;">true</td>
464
+ </tr>
465
+ <tr>
466
+ <td>{OnStomp::Interfaces::FrameMethods#subscribe subscribe}</td>
467
+ <td>
468
+ <code>subscribe(dest, headers={}, &cb)</code>
469
+ </td>
470
+ <td style="background-color: #bfb;">true</td>
471
+ <td style="background-color: #bfb;">true</td>
472
+ </tr>
473
+ <tr>
474
+ <td>{OnStomp::Interfaces::FrameMethods#unsubscribe unsubscribe}</td>
475
+ <td>
476
+ <code>unsubscribe(id, headers={})</code>
477
+ </td>
478
+ <td style="background-color: #bfb;">true</td>
479
+ <td style="background-color: #bfb;">true</td>
480
+ </tr>
481
+ <tr>
482
+ <td>{OnStomp::Interfaces::FrameMethods#unsubscribe unsubscribe}</td>
483
+ <td>
484
+ <code>unsubscribe(subscribe_frame, headers={})</code>
485
+ </td>
486
+ <td style="background-color: #bfb;">true</td>
487
+ <td style="background-color: #bfb;">true</td>
488
+ </tr>
489
+ </tbody>
490
+ </table>
491
+