onstomp 1.0.0 → 1.0.1

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 (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
+