forked from lifo/cramp
-
Notifications
You must be signed in to change notification settings - Fork 1
/
callbacks.rb
91 lines (73 loc) · 2.16 KB
/
callbacks.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
module Cramp
module Callbacks
extend ActiveSupport::Concern
included do
class_inheritable_accessor :before_start_callbacks, :on_finish_callbacks, :on_start_callback, :on_data_callbacks, :instance_reader => false
self.before_start_callbacks = []
self.on_finish_callbacks = []
self.on_start_callback = []
self.on_data_callbacks = []
end
module ClassMethods
def before_start(*methods)
self.before_start_callbacks += methods
end
def on_finish(*methods)
self.on_finish_callbacks += methods
end
def on_start(*methods)
self.on_start_callback += methods
end
def on_data(*methods)
self.on_data_callbacks += methods
end
end
def before_start(n = 0)
if callback = self.class.before_start_callbacks[n]
callback_wrapper { send(callback) { before_start(n+1) } }
else
continue
end
end
def on_start
callback_wrapper { start } if respond_to?(:start)
self.class.on_start_callback.each do |callback|
callback_wrapper { send(callback) unless @finished }
end
end
def on_finish
self.class.on_finish_callbacks.each do |callback|
callback_wrapper { send(callback) }
end
end
def callback_wrapper
EM.next_tick do
begin
yield
rescue StandardError, LoadError, SyntaxError => exception
handle_exception(exception)
end
end
end
protected
def _invoke_data_callbacks(message)
self.class.on_data_callbacks.each do |callback|
callback_wrapper { send(callback, message) }
end
end
def handle_exception(exception)
handler = ExceptionHandler.new(@env, exception)
# Log the exception
unless ENV['RACK_ENV'] == 'test'
exception_body = handler.dump_exception
Cramp.logger ? Cramp.logger.error(exception_body) : $stderr.puts(exception_body)
end
case @_state
when :init
halt 500, {"Content-Type" => 'text/html'}, ENV['RACK_ENV'] == 'development' ? handler.pretty : 'Something went wrong'
else
finish
end
end
end
end