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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
# File 'lib/motion/FQuery+RMXFirebase.rb', line 31
def on(_event_type, options={}, &and_then)
and_then ||= options[:completion]
raise "event handler is required" unless and_then
raise "event handler must accept one or two arguments" unless and_then.arity == 1 || and_then.arity == 2
completion = RMX.safe_block(and_then)
event_type = EVENT_TYPES_MAP[_event_type]
raise "event handler is unknown: #{_event_type.inspect}" unless event_type
_disconnect_block = options[:disconnect]
raise ":disconnect handler must not accept any arguments" if _disconnect_block && _disconnect_block.arity != 1
disconnect_block = nil
if _disconnect_block
disconnect_inner_block = RMX.safe_block(_disconnect_block)
disconnect_block = lambda do |err|
disconnect_inner_block.call(err)
end.weak!
end
handler = nil
if and_then.arity == 1
inner_block = RMX.safe_block(lambda do |snap|
datasnap = RMXFirebaseDataSnapshot.new(snap)
completion.call(datasnap)
end)
wrapped_block = lambda do |snap|
inner_block.call(snap)
end.weak!
if disconnect_block
if options[:once]
RMXFirebase::INTERNAL_QUEUE.sync do
handler = observeSingleEventOfType(event_type, withBlock:wrapped_block, withCancelBlock:disconnect_block)
end
else
RMXFirebase::INTERNAL_QUEUE.sync do
handler = observeEventType(event_type, withBlock:wrapped_block, withCancelBlock:disconnect_block)
end
end
else
if options[:once]
RMXFirebase::INTERNAL_QUEUE.sync do
handler = observeSingleEventOfType(event_type, withBlock:wrapped_block)
end
else
RMXFirebase::INTERNAL_QUEUE.sync do
handler = observeEventType(event_type, withBlock:wrapped_block)
end
end
end
else
inner_block = RMX.safe_block(lambda do |snap, prev|
datasnap = RMXFirebaseDataSnapshot.new(snap)
completion.call(datasnap, prev)
end)
wrapped_block = lambda do |snap, prev|
inner_block.call(snap, prev)
end.weak!
if disconnect_block
if options[:once]
RMXFirebase::INTERNAL_QUEUE.sync do
handler = observeSingleEventOfType(event_type, andPreviousSiblingNameWithBlock:wrapped_block, withCancelBlock:disconnect_block)
end
else
RMXFirebase::INTERNAL_QUEUE.sync do
handler = observeEventType(event_type, andPreviousSiblingNameWithBlock:wrapped_block, withCancelBlock:disconnect_block)
end
end
else
if options[:once]
RMXFirebase::INTERNAL_QUEUE.sync do
handler = observeSingleEventOfType(event_type, andPreviousSiblingNameWithBlock:wrapped_block)
end
else
RMXFirebase::INTERNAL_QUEUE.sync do
handler = observeEventType(event_type, andPreviousSiblingNameWithBlock:wrapped_block)
end
end
end
end
unless options[:once]
@_outstanding_handlers ||= OutstandingHandlers.new(self)
@_outstanding_handlers << handler
end
handler
end
|