foreign_office 0.16.6 → 0.17.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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d0c9446d27d1d583ef264ee14cf028f1ecc84a82d9fa7a300889205e4bcbfd6
|
4
|
+
data.tar.gz: b64b5d31d96a7d85d22138078a2205305df5cc1458d62610bd68f9d82fcfa990
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d5c3db38421294c670162bd9d98cdeb43e2f52d89de1a38cf70bce84aaca81e680e076e409594544d79c856611875c22826e8e6d7bda248c4afc38d2de8283a
|
7
|
+
data.tar.gz: e79c2b10c802e27b7feeb382dcbefd43d9abff92bda3456cc628930f6b84c26d320748c7e481f6679c69154607dc92a77ee6ee825819429419991354625ce7cb
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class PresenceChannelPublishJob < ApplicationJob
|
2
|
+
queue_as :default
|
3
|
+
|
4
|
+
def perform(obj_id, obj_class_name, serialized_state)
|
5
|
+
serialized_state.symbolize_keys!
|
6
|
+
channel_name = "presence-#{obj_class_name}#{obj_id}"
|
7
|
+
channel_presence = ForeignOffice.bus.connection.channel_users(channel_name)
|
8
|
+
if channel_presence[:users].any?
|
9
|
+
ForeignOffice.publish(
|
10
|
+
channel: channel_name,
|
11
|
+
object: serialized_state
|
12
|
+
)
|
13
|
+
else
|
14
|
+
serialized_state[:foreign_office_retries] ||= 0
|
15
|
+
if serialized_state[:foreign_office_retries] < 4 # four total tries
|
16
|
+
retry_wait = 2**serialized_state[:foreign_office_retries]
|
17
|
+
serialized_state[:foreign_office_retries] += 1
|
18
|
+
PresenceChannelPublishJob.set(wait: retry_wait).perform_later(obj_id, obj_class_name, serialized_state)
|
19
|
+
else
|
20
|
+
failure_message = "PresenceChannelPublishJob: client never connected, not able to send"
|
21
|
+
dont_raise = StandardError.new(failure_message)
|
22
|
+
Bugsnag.notify(dont_raise) do |report|
|
23
|
+
report.severity = 'error'
|
24
|
+
report.add_tab(:presence_channel, obj_class_name: obj_class_name, obj_id: obj_id, serialized_state: serialized_state)
|
25
|
+
end
|
26
|
+
Rails.logger.error(failure_message)
|
27
|
+
Rails.logger.error("PresenceChannelPublishJob: #{obj_class_name}: #{obj_id}: #{serialized_state}")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -9,10 +9,12 @@ module ForeignOffice
|
|
9
9
|
|
10
10
|
def broadcast_change
|
11
11
|
Rails.logger.debug "Broadcasting change for #{self.inspect}..."
|
12
|
-
Rails.logger.debug "Class name: #{self.class.name}"
|
13
|
-
Rails.logger.debug "ID: #{self.id}"
|
14
12
|
Rails.logger.debug "Serialize: #{self.serialize}"
|
15
|
-
|
13
|
+
if self.class.channel_presence_required?
|
14
|
+
PresenceChannelPublishJob.set(wait: 1).perform_later(id, self.class.name, self.serialize)
|
15
|
+
else
|
16
|
+
ForeignOffice.publish(channel: "#{self.class.name}#{self.id}", object: self.serialize)
|
17
|
+
end
|
16
18
|
rescue => e
|
17
19
|
Rails.logger.error "Failed to broadcast change: #{e.inspect}"
|
18
20
|
Rails.logger.debug e.backtrace.join("\n")
|
@@ -28,6 +30,15 @@ module ForeignOffice
|
|
28
30
|
def broadcast_changes!
|
29
31
|
self.send(:after_save, :handle_broadcast, {unless: :skip_all_callbacks})
|
30
32
|
end
|
33
|
+
|
34
|
+
def require_channel_presence
|
35
|
+
@channel_presence_required = true
|
36
|
+
end
|
37
|
+
|
38
|
+
def channel_presence_required?
|
39
|
+
@channel_presence_required
|
40
|
+
end
|
31
41
|
end
|
42
|
+
|
32
43
|
end
|
33
|
-
end
|
44
|
+
end
|
@@ -2,8 +2,9 @@ module ForeignOffice
|
|
2
2
|
module ForeignOfficeHelper
|
3
3
|
def listener_attrs(resource, key, reveal_hide: false, endpoint: nil, download: nil,
|
4
4
|
trigger: nil, delete: nil, href_target: nil, create_modal: nil, mask_me: nil,
|
5
|
-
exclude_value: nil, browser_tab_id: nil )
|
6
|
-
|
5
|
+
exclude_value: nil, browser_tab_id: nil, presence: false )
|
6
|
+
presence_prefix = presence ? 'presence-' : ''
|
7
|
+
channel = "#{presence_prefix}#{resource.class.name}#{resource.id}"
|
7
8
|
channel += "@#{browser_tab_id}" if browser_tab_id
|
8
9
|
data_attrs = "data-listener=true data-channel=#{channel}"
|
9
10
|
if delete
|
@@ -50,8 +51,9 @@ module ForeignOffice
|
|
50
51
|
|
51
52
|
def listener_hash(resource, key, reveal_hide: false, endpoint: nil, download: nil,
|
52
53
|
trigger: nil, delete: nil, href_target: nil, create_modal: nil, mask_me: nil,
|
53
|
-
exclude_value: nil, browser_tab_id: nil)
|
54
|
-
|
54
|
+
exclude_value: nil, browser_tab_id: nil, presence: false)
|
55
|
+
presence_prefix = presence ? 'presence-' : ''
|
56
|
+
channel = "#{presence_prefix}#{resource.class.name}#{resource.id}"
|
55
57
|
channel += "@#{browser_tab_id}" if browser_tab_id
|
56
58
|
hash = {listener: true, channel: channel}
|
57
59
|
if delete
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreign_office
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Draut
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-10-
|
12
|
+
date: 2018-10-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -89,6 +89,7 @@ files:
|
|
89
89
|
- app/assets/javascripts/pubnub_bus.js
|
90
90
|
- app/assets/javascripts/pusher_bus.js
|
91
91
|
- app/assets/javascripts/test_bus.js
|
92
|
+
- app/jobs/presence_channel_publish_job.rb
|
92
93
|
- lib/foreign_office.rb
|
93
94
|
- lib/foreign_office/broadcaster.rb
|
94
95
|
- lib/foreign_office/busses/generic_bus.rb
|