-
Notifications
You must be signed in to change notification settings - Fork 0
/
eventually.rb
72 lines (57 loc) · 1.31 KB
/
eventually.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
require 'web_socket'
require 'securerandom'
require 'announcer'
class ConnectionAnnouncer
def initialize(connection_id)
@connection_id = connection_id
end
def notify(keys_and_payloads)
key = keys_and_payloads.keys.first
payload = keys_and_payloads.values.first
Announcer.announce(@connection_id, [key, payload])
end
def to_json(*a)
{'json_class' => 'ConnectionAnnouncer',
'data' => [@connection_id]}.to_json(*a)
end
def as_json(*a)
{'json_class' => 'ConnectionAnnouncer',
'data' => [@connection_id]}.as_json(*a)
end
def self.json_create(o)
new(*o['data'])
end
private
def builder
@_builder ||= ConnectionAnnouncerBuilder.new(@connection_id)
end
end
class AppropriateQueue
def self.new
enqueuer
end
def self.enqueuer=(o)
@@enqueuer = o
end
def self.enqueuer
if defined?(@@enqueuer)
@@enqueuer
else
@@enqueuer = Resque
end
end
end
module Eventually
def self.included(base)
base.before_filter :set_connection_id
end
def eventually(class_name, *args)
enqueuer = AppropriateQueue.new
announcer = ConnectionAnnouncer.new(session[:connection_id])
enqueuer.enqueue(class_name, announcer, *args)
end
private
def set_connection_id
session[:connection_id] ||= SecureRandom.hex(16)
end
end