message_bus 3.3.6 → 4.0.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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +3 -2
  3. data/.github/workflows/ci.yml +79 -32
  4. data/.prettierrc +1 -0
  5. data/CHANGELOG +104 -53
  6. data/DEV.md +0 -2
  7. data/Gemfile +0 -27
  8. data/LICENSE +1 -1
  9. data/README.md +40 -62
  10. data/Rakefile +31 -26
  11. data/assets/message-bus-ajax.js +3 -3
  12. data/bench/codecs/marshal.rb +1 -1
  13. data/bench/codecs/packed_string.rb +1 -1
  14. data/docker-compose.yml +1 -1
  15. data/examples/bench/bench.lua +2 -2
  16. data/lib/message_bus/backends/base.rb +8 -3
  17. data/lib/message_bus/backends/memory.rb +6 -0
  18. data/lib/message_bus/backends/postgres.rb +29 -16
  19. data/lib/message_bus/backends/redis.rb +11 -2
  20. data/lib/message_bus/client.rb +6 -7
  21. data/lib/message_bus/connection_manager.rb +1 -1
  22. data/lib/message_bus/distributed_cache.rb +3 -1
  23. data/lib/message_bus/http_client.rb +2 -2
  24. data/lib/message_bus/rack/middleware.rb +6 -6
  25. data/lib/message_bus/rack/thin_ext.rb +2 -1
  26. data/lib/message_bus/version.rb +1 -1
  27. data/lib/message_bus.rb +47 -77
  28. data/message_bus.gemspec +21 -3
  29. data/package-lock.json +1575 -23
  30. data/package.json +9 -7
  31. data/spec/assets/SpecHelper.js +6 -5
  32. data/spec/assets/message-bus.spec.js +9 -6
  33. data/spec/helpers.rb +23 -7
  34. data/spec/integration/http_client_spec.rb +1 -1
  35. data/spec/lib/fake_async_middleware.rb +1 -0
  36. data/spec/lib/message_bus/backend_spec.rb +15 -46
  37. data/spec/lib/message_bus/client_spec.rb +7 -6
  38. data/spec/lib/message_bus/connection_manager_spec.rb +4 -0
  39. data/spec/lib/message_bus/distributed_cache_spec.rb +5 -7
  40. data/spec/lib/message_bus/multi_process_spec.rb +21 -10
  41. data/spec/lib/message_bus/rack/middleware_spec.rb +8 -44
  42. data/spec/lib/message_bus/timer_thread_spec.rb +1 -5
  43. data/spec/lib/message_bus_spec.rb +22 -9
  44. data/spec/performance/publish.rb +4 -4
  45. data/spec/spec_helper.rb +8 -9
  46. data/spec/support/jasmine-browser.json +16 -0
  47. data/vendor/assets/javascripts/message-bus-ajax.js +3 -3
  48. metadata +220 -19
  49. data/assets/application.jsx +0 -121
  50. data/assets/babel.min.js +0 -25
  51. data/assets/react-dom.js +0 -19851
  52. data/assets/react.js +0 -3029
  53. data/examples/diagnostics/Gemfile +0 -6
  54. data/examples/diagnostics/config.ru +0 -22
  55. data/lib/message_bus/diagnostics.rb +0 -62
  56. data/lib/message_bus/rack/diagnostics.rb +0 -98
  57. data/spec/assets/support/jasmine.yml +0 -126
  58. data/spec/assets/support/jasmine_helper.rb +0 -11
@@ -2,7 +2,6 @@
2
2
 
3
3
  require_relative '../spec_helper'
4
4
  require 'message_bus'
5
- require 'redis'
6
5
 
7
6
  describe MessageBus do
8
7
  before do
@@ -10,7 +9,7 @@ describe MessageBus do
10
9
  @bus.site_id_lookup do
11
10
  "magic"
12
11
  end
13
- @bus.configure(MESSAGE_BUS_CONFIG)
12
+ @bus.configure(test_config_for_backend(CURRENT_BACKEND))
14
13
  end
15
14
 
16
15
  after do
@@ -24,7 +23,8 @@ describe MessageBus do
24
23
  @bus.off?.must_equal true
25
24
  end
26
25
 
27
- it "can call destroy twice" do
26
+ it "can call destroy multiple times" do
27
+ @bus.destroy
28
28
  @bus.destroy
29
29
  @bus.destroy
30
30
  end
@@ -37,6 +37,14 @@ describe MessageBus do
37
37
  @bus.after_fork
38
38
  end
39
39
 
40
+ it "destroying immediately after `after_fork` does not lock" do
41
+ 10.times do
42
+ @bus.on
43
+ @bus.after_fork
44
+ @bus.destroy
45
+ end
46
+ end
47
+
40
48
  describe "#base_route=" do
41
49
  it "adds leading and trailing slashes" do
42
50
  @bus.base_route = "my/base/route"
@@ -98,7 +106,7 @@ describe MessageBus do
98
106
  client_ids.must_equal ['a', 'b']
99
107
  end
100
108
 
101
- it "should recover from a redis flush" do
109
+ it "should recover from a reset" do
102
110
  data = nil
103
111
  @bus.subscribe("/chuck") do |msg|
104
112
  data = msg.data
@@ -107,7 +115,7 @@ describe MessageBus do
107
115
  @bus.publish("/chuck", norris: true)
108
116
  @bus.publish("/chuck", norris: true)
109
117
 
110
- @bus.reliable_pub_sub.reset!
118
+ @bus.backend_instance.reset!
111
119
 
112
120
  @bus.publish("/chuck", yeager: true)
113
121
 
@@ -125,7 +133,7 @@ describe MessageBus do
125
133
  @bus.publish("/chuck", norris: true)
126
134
  @bus.publish("/chuck", norris: true)
127
135
 
128
- @bus.reliable_pub_sub.expire_all_backlogs!
136
+ @bus.backend_instance.expire_all_backlogs!
129
137
 
130
138
  @bus.publish("/chuck", yeager: true)
131
139
 
@@ -307,7 +315,7 @@ describe MessageBus do
307
315
  end
308
316
  end
309
317
 
310
- it "should support forking properly do" do
318
+ it "should support forking properly" do
311
319
  test_never :memory
312
320
 
313
321
  data = []
@@ -316,7 +324,7 @@ describe MessageBus do
316
324
  end
317
325
 
318
326
  @bus.publish("/hello", "pre-fork")
319
- wait_for(2000) { data.length > 0 }
327
+ wait_for(2000) { data.length == 1 }
320
328
 
321
329
  if child = Process.fork
322
330
  # The child was forked and we received its PID
@@ -328,6 +336,7 @@ describe MessageBus do
328
336
  else
329
337
  begin
330
338
  @bus.after_fork
339
+ GC.start
331
340
  @bus.publish("/hello", "from-fork")
332
341
  ensure
333
342
  exit!(0)
@@ -336,7 +345,11 @@ describe MessageBus do
336
345
 
337
346
  wait_for(2000) { data.length == 3 }
338
347
 
339
- data.must_equal(["pre-fork", "from-fork", "continuation"])
348
+ @bus.publish("/hello", "after-fork")
349
+
350
+ wait_for(2000) { data.length == 4 }
351
+
352
+ data.must_equal(["pre-fork", "from-fork", "continuation", "after-fork"])
340
353
  end
341
354
 
342
355
  describe '#register_client_message_filter' do
@@ -32,8 +32,8 @@ benchmark_subscription_no_trimming = lambda do |bm, backend|
32
32
  bus = MessageBus::Instance.new
33
33
  bus.configure(test_config_for_backend(backend))
34
34
 
35
- bus.reliable_pub_sub.max_backlog_size = iterations
36
- bus.reliable_pub_sub.max_global_backlog_size = iterations
35
+ bus.backend_instance.max_backlog_size = iterations
36
+ bus.backend_instance.max_global_backlog_size = iterations
37
37
 
38
38
  messages_received = 0
39
39
  bus.after_fork
@@ -58,8 +58,8 @@ benchmark_subscription_with_trimming = lambda do |bm, backend|
58
58
  bus = MessageBus::Instance.new
59
59
  bus.configure(test_config_for_backend(backend))
60
60
 
61
- bus.reliable_pub_sub.max_backlog_size = (iterations / 10)
62
- bus.reliable_pub_sub.max_global_backlog_size = (iterations / 10)
61
+ bus.backend_instance.max_backlog_size = (iterations / 10)
62
+ bus.backend_instance.max_global_backlog_size = (iterations / 10)
63
63
 
64
64
  messages_received = 0
65
65
  bus.after_fork
data/spec/spec_helper.rb CHANGED
@@ -11,18 +11,17 @@ require 'minitest/global_expectations'
11
11
 
12
12
  require_relative "helpers"
13
13
 
14
- backend = (ENV['MESSAGE_BUS_BACKEND'] || :redis).to_sym
15
- MESSAGE_BUS_CONFIG = test_config_for_backend(backend)
16
- require "message_bus/backends/#{backend}"
17
- PUB_SUB_CLASS = MessageBus::BACKENDS.fetch(backend)
18
- puts "Running with backend: #{backend}"
14
+ CURRENT_BACKEND = (ENV['MESSAGE_BUS_BACKEND'] || :redis).to_sym
15
+
16
+ require "message_bus/backends/#{CURRENT_BACKEND}"
17
+ BACKEND_CLASS = MessageBus::BACKENDS.fetch(CURRENT_BACKEND)
18
+
19
+ puts "Running with backend: #{CURRENT_BACKEND}"
19
20
 
20
21
  def test_only(*backends)
21
- backend = MESSAGE_BUS_CONFIG[:backend]
22
- skip "Test doesn't apply to #{backend}" unless backends.include?(backend)
22
+ skip "Test doesn't apply to #{CURRENT_BACKEND}" unless backends.include?(CURRENT_BACKEND)
23
23
  end
24
24
 
25
25
  def test_never(*backends)
26
- backend = MESSAGE_BUS_CONFIG[:backend]
27
- skip "Test doesn't apply to #{backend}" if backends.include?(backend)
26
+ skip "Test doesn't apply to #{CURRENT_BACKEND}" if backends.include?(CURRENT_BACKEND)
28
27
  end
@@ -0,0 +1,16 @@
1
+ {
2
+ "srcDir": "assets",
3
+ "srcFiles": [
4
+ "message-bus.js",
5
+ "message-bus-ajax.js"
6
+ ],
7
+ "specDir": "spec/assets",
8
+ "specFiles": [
9
+ "message-bus.spec.js"
10
+ ],
11
+ "helpers": [
12
+ "SpecHelper.js"
13
+ ],
14
+ "random": true,
15
+ "browser": "headlessChrome"
16
+ }
@@ -2,7 +2,7 @@
2
2
  // as a fallback if jQuery is not present
3
3
  //
4
4
  // Only implements methods & options used by MessageBus
5
- (function(global, undefined) {
5
+ (function(global) {
6
6
  'use strict';
7
7
  if (!global.MessageBus){
8
8
  throw new Error("MessageBus must be loaded before the ajax adapter");
@@ -16,7 +16,7 @@
16
16
  for (var name in options.headers){
17
17
  xhr.setRequestHeader(name, options.headers[name]);
18
18
  }
19
- xhr.setRequestHeader('Content-Type', 'application/json');
19
+ xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
20
20
  if (options.messageBus.chunked){
21
21
  options.messageBus.onProgressListener(xhr);
22
22
  }
@@ -31,7 +31,7 @@
31
31
  options.complete();
32
32
  }
33
33
  }
34
- xhr.send(JSON.stringify(options.data));
34
+ xhr.send(new URLSearchParams(options.data).toString());
35
35
  return xhr;
36
36
  };
37
37
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: message_bus
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.6
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-31 00:00:00.000000000 Z
11
+ date: 2022-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -52,6 +52,216 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: concurrent-ruby
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest-hooks
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: minitest-global_expectations
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: http_parser.rb
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: thin
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rack-test
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: puma
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: m
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: byebug
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: oj
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: yard
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: rubocop-discourse
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: rubocop-rspec
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
55
265
  description: A message bus for rack
56
266
  email:
57
267
  - sam.saffron@gmail.com
@@ -62,6 +272,7 @@ files:
62
272
  - ".eslintrc.js"
63
273
  - ".github/workflows/ci.yml"
64
274
  - ".gitignore"
275
+ - ".prettierrc"
65
276
  - ".rubocop.yml"
66
277
  - CHANGELOG
67
278
  - DEV.md
@@ -71,13 +282,9 @@ files:
71
282
  - LICENSE
72
283
  - README.md
73
284
  - Rakefile
74
- - assets/application.jsx
75
- - assets/babel.min.js
76
285
  - assets/jquery-1.8.2.js
77
286
  - assets/message-bus-ajax.js
78
287
  - assets/message-bus.js
79
- - assets/react-dom.js
80
- - assets/react.js
81
288
  - bench/codecs/all_codecs.rb
82
289
  - bench/codecs/marshal.rb
83
290
  - bench/codecs/packed_string.rb
@@ -95,8 +302,6 @@ files:
95
302
  - examples/chat/config.ru
96
303
  - examples/chat/docker_container/chat.yml
97
304
  - examples/chat/docker_container/update_chat
98
- - examples/diagnostics/Gemfile
99
- - examples/diagnostics/config.ru
100
305
  - examples/minimal/Gemfile
101
306
  - examples/minimal/config.ru
102
307
  - lib/message_bus.rb
@@ -110,13 +315,11 @@ files:
110
315
  - lib/message_bus/codec/json.rb
111
316
  - lib/message_bus/codec/oj.rb
112
317
  - lib/message_bus/connection_manager.rb
113
- - lib/message_bus/diagnostics.rb
114
318
  - lib/message_bus/distributed_cache.rb
115
319
  - lib/message_bus/http_client.rb
116
320
  - lib/message_bus/http_client/channel.rb
117
321
  - lib/message_bus/http_client/version.rb
118
322
  - lib/message_bus/message.rb
119
- - lib/message_bus/rack/diagnostics.rb
120
323
  - lib/message_bus/rack/middleware.rb
121
324
  - lib/message_bus/rack/thin_ext.rb
122
325
  - lib/message_bus/rails/railtie.rb
@@ -127,8 +330,6 @@ files:
127
330
  - package.json
128
331
  - spec/assets/SpecHelper.js
129
332
  - spec/assets/message-bus.spec.js
130
- - spec/assets/support/jasmine.yml
131
- - spec/assets/support/jasmine_helper.rb
132
333
  - spec/fixtures/test/Gemfile
133
334
  - spec/fixtures/test/config.ru
134
335
  - spec/helpers.rb
@@ -145,14 +346,15 @@ files:
145
346
  - spec/lib/message_bus_spec.rb
146
347
  - spec/performance/publish.rb
147
348
  - spec/spec_helper.rb
349
+ - spec/support/jasmine-browser.json
148
350
  - vendor/assets/javascripts/.gitignore
149
351
  - vendor/assets/javascripts/message-bus-ajax.js
150
352
  - vendor/assets/javascripts/message-bus.js
151
- homepage: https://github.com/SamSaffron/message_bus
353
+ homepage: https://github.com/discourse/message_bus
152
354
  licenses:
153
355
  - MIT
154
356
  metadata: {}
155
- post_install_message:
357
+ post_install_message:
156
358
  rdoc_options: []
157
359
  require_paths:
158
360
  - lib
@@ -160,7 +362,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
362
  requirements:
161
363
  - - ">="
162
364
  - !ruby/object:Gem::Version
163
- version: 2.4.0
365
+ version: 2.6.0
164
366
  required_rubygems_version: !ruby/object:Gem::Requirement
165
367
  requirements:
166
368
  - - ">="
@@ -168,14 +370,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
370
  version: '0'
169
371
  requirements: []
170
372
  rubygems_version: 3.1.6
171
- signing_key:
373
+ signing_key:
172
374
  specification_version: 4
173
375
  summary: ''
174
376
  test_files:
175
377
  - spec/assets/SpecHelper.js
176
378
  - spec/assets/message-bus.spec.js
177
- - spec/assets/support/jasmine.yml
178
- - spec/assets/support/jasmine_helper.rb
179
379
  - spec/fixtures/test/Gemfile
180
380
  - spec/fixtures/test/config.ru
181
381
  - spec/helpers.rb
@@ -192,3 +392,4 @@ test_files:
192
392
  - spec/lib/message_bus_spec.rb
193
393
  - spec/performance/publish.rb
194
394
  - spec/spec_helper.rb
395
+ - spec/support/jasmine-browser.json
@@ -1,121 +0,0 @@
1
- 'use strict';
2
-
3
- class Process extends React.Component {
4
- hup() {
5
- fetch(
6
- `/message-bus/_diagnostics/hup/${this.props.hostname}/${this.props.pid}`,
7
- {
8
- method: 'POST'
9
- }
10
- );
11
- }
12
-
13
- render() {
14
- return (
15
- <tr>
16
- <td>{this.props.pid}</td>
17
- <td>{this.props.full_path}</td>
18
- <td>{this.props.hostname}</td>
19
- <td>{this.props.uptime} secs</td>
20
- <td><button onClick={this.hup.bind(this)}>HUP</button></td>
21
- </tr>
22
- );
23
- }
24
- };
25
-
26
- class DiagnosticsApp extends React.Component {
27
- constructor(props) {
28
- super(props);
29
- this.state = {processes: []};
30
- }
31
-
32
- componentDidMount() {
33
- MessageBus.start();
34
- this.ensureSubscribed();
35
- }
36
-
37
- discover() {
38
- this.ensureSubscribed();
39
-
40
- this.setState({discovering: true});
41
-
42
- var _this = this;
43
- fetch(
44
- "/message-bus/_diagnostics/discover",
45
- {
46
- method: "POST"
47
- }
48
- ).then(function() {
49
- _this.setState({discovering: false})
50
- });
51
- }
52
-
53
- ensureSubscribed() {
54
- if (this.state.subscribed) { return; }
55
-
56
- MessageBus.callbackInterval = 500;
57
-
58
- MessageBus.subscribe(
59
- "/_diagnostics/process-discovery",
60
- this.updateProcess.bind(this)
61
- );
62
-
63
- this.setState({subscribed: true});
64
- }
65
-
66
- updateProcess(data) {
67
- const _this = this;
68
- const processes = this.state.processes.filter(function(process) {
69
- return _this.processUniqueId(process) !== _this.processUniqueId(data);
70
- });
71
- this.setState({processes: processes.concat([data])});
72
- }
73
-
74
- processUniqueId(process) {
75
- return process.hostname + process.pid;
76
- }
77
-
78
- render() {
79
- let disabled = this.state.discovering ? "disabled" : null;
80
-
81
- let _this = this;
82
- let processes = this.state.processes.sort(function(a,b) {
83
- return _this.processUniqueId(a) < _this.processUniqueId(b) ? -1 : 1;
84
- });
85
-
86
- return (
87
- <div>
88
- <header>
89
- <h2>Message Bus Diagnostics</h2>
90
- </header>
91
-
92
- <div>
93
- <button onClick={this.discover.bind(this)} disabled={disabled}>Discover Processes</button>
94
-
95
- <table>
96
- <thead>
97
- <tr>
98
- <td>pid</td>
99
- <td>full_path</td>
100
- <td>hostname</td>
101
- <td>uptime</td>
102
- <td></td>
103
- </tr>
104
- </thead>
105
-
106
- <tbody>
107
- {processes.map(function(process, index){
108
- return <Process key={index} {...process} />;
109
- })}
110
- </tbody>
111
- </table>
112
- </div>
113
- </div>
114
- );
115
- }
116
- }
117
-
118
- ReactDOM.render(
119
- <DiagnosticsApp />,
120
- document.getElementById('app')
121
- );