forked from websocket-rails/websocket-rails
-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathchannel.rb
97 lines (75 loc) · 2.31 KB
/
channel.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
module WebsocketRails
class Channel
include Logging
delegate :config, :channel_tokens, :channel_manager, :filtered_channels, :to => WebsocketRails
attr_reader :name, :subscribers
def initialize(channel_name)
@subscribers = []
@name = channel_name
@private = false
end
def subscribe(connection)
info "#{connection} subscribed to channel #{@name}"
trigger 'subscriber_join', connection.user if config.broadcast_subscriber_events?
@subscribers << connection
send_token connection
end
def unsubscribe(connection)
return unless @subscribers.include? connection
info "#{connection} unsubscribed from channel #{@name}"
@subscribers.delete connection
trigger 'subscriber_part', connection.user if config.broadcast_subscriber_events?
end
def trigger(event_name,data={},options={})
options.merge! :channel => @name, :token => token
options[:data] = data
event = Event.new event_name, options
info "[#{@name}] #{event.data.inspect}"
send_data event
end
def trigger_event(event)
return if event.token != token
info "[#{@name}] #{event.data.inspect}"
send_data event
end
def make_private
unless config.keep_subscribers_when_private?
@subscribers.clear
end
@private = true
end
def filter_with(controller, catch_all=nil)
filtered_channels[@name] = catch_all.nil? ? controller : [controller, catch_all]
end
def is_private?
@private
end
def token
@token ||= channel_tokens[@name] ||= generate_unique_token
end
private
def generate_unique_token
new_token = SecureRandom.uuid
channel_manager.register_channel(@name, new_token)
new_token
end
def send_token(connection)
options = {
:channel => @name,
:data => {:token => token},
:connection => connection
}
info 'sending token'
Event.new('websocket_rails.channel_token', options).trigger
end
def send_data(event)
return unless event.should_propagate?
if WebsocketRails.synchronize? && event.server_token.nil?
Synchronization.publish event
end
@subscribers.each do |subscriber|
subscriber.trigger event
end
end
end
end