sensu-em 2.0.0-java
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 +7 -0
- data/.gitignore +21 -0
- data/.travis.yml +12 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +33 -0
- data/GNU +281 -0
- data/Gemfile +2 -0
- data/LICENSE +60 -0
- data/README.md +109 -0
- data/Rakefile +20 -0
- data/docs/DocumentationGuidesIndex.md +27 -0
- data/docs/GettingStarted.md +521 -0
- data/docs/old/ChangeLog +211 -0
- data/docs/old/DEFERRABLES +246 -0
- data/docs/old/EPOLL +141 -0
- data/docs/old/INSTALL +13 -0
- data/docs/old/KEYBOARD +42 -0
- data/docs/old/LEGAL +25 -0
- data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
- data/docs/old/PURE_RUBY +75 -0
- data/docs/old/RELEASE_NOTES +94 -0
- data/docs/old/SMTP +4 -0
- data/docs/old/SPAWNED_PROCESSES +148 -0
- data/docs/old/TODO +8 -0
- data/eventmachine.gemspec +38 -0
- data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
- data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
- data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
- data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
- data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
- data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
- data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
- data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
- data/examples/old/ex_channel.rb +43 -0
- data/examples/old/ex_queue.rb +2 -0
- data/examples/old/ex_tick_loop_array.rb +15 -0
- data/examples/old/ex_tick_loop_counter.rb +32 -0
- data/examples/old/helper.rb +2 -0
- data/ext/binder.cpp +124 -0
- data/ext/binder.h +46 -0
- data/ext/cmain.cpp +887 -0
- data/ext/ed.cpp +1988 -0
- data/ext/ed.h +422 -0
- data/ext/em.cpp +2352 -0
- data/ext/em.h +253 -0
- data/ext/eventmachine.h +128 -0
- data/ext/extconf.rb +179 -0
- data/ext/fastfilereader/extconf.rb +103 -0
- data/ext/fastfilereader/mapper.cpp +214 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/kb.cpp +79 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +347 -0
- data/ext/project.h +161 -0
- data/ext/rubymain.cpp +1318 -0
- data/ext/ssl.cpp +468 -0
- data/ext/ssl.h +94 -0
- data/java/.classpath +6 -0
- data/java/.gitignore +1 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/DatagramPacket.java +13 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +529 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventCallback.java +7 -0
- data/java/src/com/rubyeventmachine/EventCode.java +26 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +130 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +180 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +405 -0
- data/java/src/com/rubyeventmachine/SslBox.java +310 -0
- data/lib/em/buftok.rb +110 -0
- data/lib/em/callback.rb +58 -0
- data/lib/em/channel.rb +64 -0
- data/lib/em/completion.rb +304 -0
- data/lib/em/connection.rb +712 -0
- data/lib/em/deferrable/pool.rb +2 -0
- data/lib/em/deferrable.rb +210 -0
- data/lib/em/file_watch.rb +73 -0
- data/lib/em/future.rb +61 -0
- data/lib/em/iterator.rb +231 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/pool.rb +151 -0
- data/lib/em/process_watch.rb +45 -0
- data/lib/em/processes.rb +123 -0
- data/lib/em/protocols/header_and_content.rb +138 -0
- data/lib/em/protocols/httpclient.rb +279 -0
- data/lib/em/protocols/httpclient2.rb +600 -0
- data/lib/em/protocols/line_and_text.rb +125 -0
- data/lib/em/protocols/line_protocol.rb +29 -0
- data/lib/em/protocols/linetext2.rb +161 -0
- data/lib/em/protocols/memcache.rb +331 -0
- data/lib/em/protocols/object_protocol.rb +46 -0
- data/lib/em/protocols/postgres3.rb +246 -0
- data/lib/em/protocols/saslauth.rb +175 -0
- data/lib/em/protocols/smtpclient.rb +365 -0
- data/lib/em/protocols/smtpserver.rb +643 -0
- data/lib/em/protocols/socks4.rb +66 -0
- data/lib/em/protocols/stomp.rb +205 -0
- data/lib/em/protocols/tcptest.rb +54 -0
- data/lib/em/protocols.rb +37 -0
- data/lib/em/pure_ruby.rb +1017 -0
- data/lib/em/queue.rb +71 -0
- data/lib/em/resolver.rb +209 -0
- data/lib/em/spawnable.rb +84 -0
- data/lib/em/streamer.rb +118 -0
- data/lib/em/threaded_resource.rb +90 -0
- data/lib/em/tick_loop.rb +85 -0
- data/lib/em/timers.rb +61 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine.rb +1553 -0
- data/lib/jeventmachine.rb +321 -0
- data/lib/rubyeventmachine.jar +0 -0
- data/rakelib/cpp.rake_example +77 -0
- data/rakelib/package.rake +98 -0
- data/rakelib/test.rake +8 -0
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/em_test_helper.rb +64 -0
- data/tests/server.crt +36 -0
- data/tests/server.key +51 -0
- data/tests/test_attach.rb +150 -0
- data/tests/test_basic.rb +294 -0
- data/tests/test_channel.rb +62 -0
- data/tests/test_completion.rb +177 -0
- data/tests/test_connection_count.rb +53 -0
- data/tests/test_defer.rb +18 -0
- data/tests/test_deferrable.rb +35 -0
- data/tests/test_epoll.rb +145 -0
- data/tests/test_error_handler.rb +38 -0
- data/tests/test_exc.rb +28 -0
- data/tests/test_file_watch.rb +65 -0
- data/tests/test_futures.rb +170 -0
- data/tests/test_get_sock_opt.rb +37 -0
- data/tests/test_handler_check.rb +35 -0
- data/tests/test_hc.rb +155 -0
- data/tests/test_httpclient.rb +190 -0
- data/tests/test_httpclient2.rb +133 -0
- data/tests/test_idle_connection.rb +25 -0
- data/tests/test_inactivity_timeout.rb +54 -0
- data/tests/test_iterator.rb +97 -0
- data/tests/test_kb.rb +34 -0
- data/tests/test_line_protocol.rb +33 -0
- data/tests/test_ltp.rb +138 -0
- data/tests/test_ltp2.rb +288 -0
- data/tests/test_next_tick.rb +104 -0
- data/tests/test_object_protocol.rb +36 -0
- data/tests/test_pause.rb +102 -0
- data/tests/test_pending_connect_timeout.rb +52 -0
- data/tests/test_pool.rb +194 -0
- data/tests/test_process_watch.rb +48 -0
- data/tests/test_processes.rb +128 -0
- data/tests/test_proxy_connection.rb +180 -0
- data/tests/test_pure.rb +88 -0
- data/tests/test_queue.rb +50 -0
- data/tests/test_resolver.rb +55 -0
- data/tests/test_running.rb +14 -0
- data/tests/test_sasl.rb +47 -0
- data/tests/test_send_file.rb +217 -0
- data/tests/test_servers.rb +33 -0
- data/tests/test_set_sock_opt.rb +37 -0
- data/tests/test_shutdown_hooks.rb +23 -0
- data/tests/test_smtpclient.rb +55 -0
- data/tests/test_smtpserver.rb +57 -0
- data/tests/test_spawn.rb +293 -0
- data/tests/test_ssl_args.rb +78 -0
- data/tests/test_ssl_echo_data.rb +60 -0
- data/tests/test_ssl_methods.rb +56 -0
- data/tests/test_ssl_verify.rb +82 -0
- data/tests/test_stomp.rb +37 -0
- data/tests/test_system.rb +42 -0
- data/tests/test_threaded_resource.rb +53 -0
- data/tests/test_tick_loop.rb +59 -0
- data/tests/test_timers.rb +123 -0
- data/tests/test_ud.rb +8 -0
- data/tests/test_unbind_reason.rb +48 -0
- metadata +297 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# = EM::Completion
|
|
2
|
+
#
|
|
3
|
+
# A completion is a callback container for various states of completion. In
|
|
4
|
+
# it's most basic form it has a start state and a finish state.
|
|
5
|
+
#
|
|
6
|
+
# This implementation includes some hold-back from the EM::Deferrable
|
|
7
|
+
# interface in order to be compatible - but it has a much cleaner
|
|
8
|
+
# implementation.
|
|
9
|
+
#
|
|
10
|
+
# In general it is preferred that this implementation be used as a state
|
|
11
|
+
# callback container than EM::DefaultDeferrable or other classes including
|
|
12
|
+
# EM::Deferrable. This is because it is generally more sane to keep this level
|
|
13
|
+
# of state in a dedicated state-back container. This generally leads to more
|
|
14
|
+
# malleable interfaces and software designs, as well as eradicating nasty bugs
|
|
15
|
+
# that result from abstraction leakage.
|
|
16
|
+
#
|
|
17
|
+
# == Basic Usage
|
|
18
|
+
#
|
|
19
|
+
# As already mentioned, the basic usage of a Completion is simply for its two
|
|
20
|
+
# final states, :succeeded and :failed.
|
|
21
|
+
#
|
|
22
|
+
# An asynchronous operation will complete at some future point in time, and
|
|
23
|
+
# users often want to react to this event. API authors will want to expose
|
|
24
|
+
# some common interface to react to these events.
|
|
25
|
+
#
|
|
26
|
+
# In the following example, the user wants to know when a short lived
|
|
27
|
+
# connection has completed its exchange with the remote server. The simple
|
|
28
|
+
# protocol just waits for an ack to its message.
|
|
29
|
+
#
|
|
30
|
+
# class Protocol < EM::Connection
|
|
31
|
+
# include EM::P::LineText2
|
|
32
|
+
#
|
|
33
|
+
# def initialize(message, completion)
|
|
34
|
+
# @message, @completion = message, completion
|
|
35
|
+
# @completion.completion { close_connection }
|
|
36
|
+
# @completion.timeout(1, :timeout)
|
|
37
|
+
# end
|
|
38
|
+
#
|
|
39
|
+
# def post_init
|
|
40
|
+
# send_data(@message)
|
|
41
|
+
# end
|
|
42
|
+
#
|
|
43
|
+
# def receive_line(line)
|
|
44
|
+
# case line
|
|
45
|
+
# when /ACK/i
|
|
46
|
+
# @completion.succeed line
|
|
47
|
+
# when /ERR/i
|
|
48
|
+
# @completion.fail :error, line
|
|
49
|
+
# else
|
|
50
|
+
# @completion.fail :unknown, line
|
|
51
|
+
# end
|
|
52
|
+
# end
|
|
53
|
+
#
|
|
54
|
+
# def unbind
|
|
55
|
+
# @completion.fail :disconnected unless @completion.completed?
|
|
56
|
+
# end
|
|
57
|
+
# end
|
|
58
|
+
#
|
|
59
|
+
# class API
|
|
60
|
+
# attr_reader :host, :port
|
|
61
|
+
#
|
|
62
|
+
# def initialize(host = 'example.org', port = 8000)
|
|
63
|
+
# @host, @port = host, port
|
|
64
|
+
# end
|
|
65
|
+
#
|
|
66
|
+
# def request(message)
|
|
67
|
+
# completion = EM::Deferrable::Completion.new
|
|
68
|
+
# EM.connect(host, port, Protocol, message, completion)
|
|
69
|
+
# completion
|
|
70
|
+
# end
|
|
71
|
+
# end
|
|
72
|
+
#
|
|
73
|
+
# api = API.new
|
|
74
|
+
# completion = api.request('stuff')
|
|
75
|
+
# completion.callback do |line|
|
|
76
|
+
# puts "API responded with: #{line}"
|
|
77
|
+
# end
|
|
78
|
+
# completion.errback do |type, line|
|
|
79
|
+
# case type
|
|
80
|
+
# when :error
|
|
81
|
+
# puts "API error: #{line}"
|
|
82
|
+
# when :unknown
|
|
83
|
+
# puts "API returned unknown response: #{line}"
|
|
84
|
+
# when :disconnected
|
|
85
|
+
# puts "API server disconnected prematurely"
|
|
86
|
+
# when :timeout
|
|
87
|
+
# puts "API server did not respond in a timely fashion"
|
|
88
|
+
# end
|
|
89
|
+
# end
|
|
90
|
+
#
|
|
91
|
+
# == Advanced Usage
|
|
92
|
+
#
|
|
93
|
+
# This completion implementation also supports more state callbacks and
|
|
94
|
+
# arbitrary states (unlike the original Deferrable API). This allows for basic
|
|
95
|
+
# stateful process encapsulation. One might use this to setup state callbacks
|
|
96
|
+
# for various states in an exchange like in the basic usage example, except
|
|
97
|
+
# where the applicaiton could be made to react to "connected" and
|
|
98
|
+
# "disconnected" states additionally.
|
|
99
|
+
#
|
|
100
|
+
# class Protocol < EM::Connection
|
|
101
|
+
# def initialize(completion)
|
|
102
|
+
# @response = []
|
|
103
|
+
# @completion = completion
|
|
104
|
+
# @completion.stateback(:disconnected) do
|
|
105
|
+
# @completion.succeed @response.join
|
|
106
|
+
# end
|
|
107
|
+
# end
|
|
108
|
+
#
|
|
109
|
+
# def connection_completed
|
|
110
|
+
# @host, @port = Socket.unpack_sockaddr_in get_peername
|
|
111
|
+
# @completion.change_state(:connected, @host, @port)
|
|
112
|
+
# send_data("GET http://example.org/ HTTP/1.0\r\n\r\n")
|
|
113
|
+
# end
|
|
114
|
+
#
|
|
115
|
+
# def receive_data(data)
|
|
116
|
+
# @response << data
|
|
117
|
+
# end
|
|
118
|
+
#
|
|
119
|
+
# def unbind
|
|
120
|
+
# @completion.change_state(:disconnected, @host, @port)
|
|
121
|
+
# end
|
|
122
|
+
# end
|
|
123
|
+
#
|
|
124
|
+
# completion = EM::Deferrable::Completion.new
|
|
125
|
+
# completion.stateback(:connected) do |host, port|
|
|
126
|
+
# puts "Connected to #{host}:#{port}"
|
|
127
|
+
# end
|
|
128
|
+
# completion.stateback(:disconnected) do |host, port|
|
|
129
|
+
# puts "Disconnected from #{host}:#{port}"
|
|
130
|
+
# end
|
|
131
|
+
# completion.callback do |response|
|
|
132
|
+
# puts response
|
|
133
|
+
# end
|
|
134
|
+
#
|
|
135
|
+
# EM.connect('example.org', 80, Protocol, completion)
|
|
136
|
+
#
|
|
137
|
+
# == Timeout
|
|
138
|
+
#
|
|
139
|
+
# The Completion also has a timeout. The timeout is global and is not aware of
|
|
140
|
+
# states apart from completion states. The timeout is only engaged if #timeout
|
|
141
|
+
# is called, and it will call fail if it is reached.
|
|
142
|
+
#
|
|
143
|
+
# == Completion states
|
|
144
|
+
#
|
|
145
|
+
# By default there are two completion states, :succeeded and :failed. These
|
|
146
|
+
# states can be modified by subclassing and overrding the #completion_states
|
|
147
|
+
# method. Completion states are special, in that callbacks for all completion
|
|
148
|
+
# states are explcitly cleared when a completion state is entered. This
|
|
149
|
+
# prevents errors that could arise from accidental unterminated timeouts, and
|
|
150
|
+
# other such user errors.
|
|
151
|
+
#
|
|
152
|
+
# == Other notes
|
|
153
|
+
#
|
|
154
|
+
# Several APIs have been carried over from EM::Deferrable for compatibility
|
|
155
|
+
# reasons during a transitionary period. Specifically cancel_errback and
|
|
156
|
+
# cancel_callback are implemented, but their usage is to be strongly
|
|
157
|
+
# discouraged. Due to the already complex nature of reaction systems, dynamic
|
|
158
|
+
# callback deletion only makes the problem much worse. It is always better to
|
|
159
|
+
# add correct conditionals to the callback code, or use more states, than to
|
|
160
|
+
# address such implementaiton issues with conditional callbacks.
|
|
161
|
+
|
|
162
|
+
module EventMachine
|
|
163
|
+
|
|
164
|
+
class Completion
|
|
165
|
+
# This is totally not used (re-implemented), it's here in case people check
|
|
166
|
+
# for kind_of?
|
|
167
|
+
include EventMachine::Deferrable
|
|
168
|
+
|
|
169
|
+
attr_reader :state, :value
|
|
170
|
+
|
|
171
|
+
def initialize
|
|
172
|
+
@state = :unknown
|
|
173
|
+
@callbacks = Hash.new { |h,k| h[k] = [] }
|
|
174
|
+
@value = []
|
|
175
|
+
@timeout_timer = nil
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Enter the :succeeded state, setting the result value if given.
|
|
179
|
+
def succeed(*args)
|
|
180
|
+
change_state(:succeeded, *args)
|
|
181
|
+
end
|
|
182
|
+
# The old EM method:
|
|
183
|
+
alias set_deferred_success succeed
|
|
184
|
+
|
|
185
|
+
# Enter the :failed state, setting the result value if given.
|
|
186
|
+
def fail(*args)
|
|
187
|
+
change_state(:failed, *args)
|
|
188
|
+
end
|
|
189
|
+
# The old EM method:
|
|
190
|
+
alias set_deferred_failure fail
|
|
191
|
+
|
|
192
|
+
# Statebacks are called when you enter (or are in) the named state.
|
|
193
|
+
def stateback(state, *a, &b)
|
|
194
|
+
# The following is quite unfortunate special casing for :completed
|
|
195
|
+
# statebacks, but it's a necessary evil for latent completion
|
|
196
|
+
# definitions.
|
|
197
|
+
|
|
198
|
+
if :completed == state || !completed? || @state == state
|
|
199
|
+
@callbacks[state] << EM::Callback(*a, &b)
|
|
200
|
+
end
|
|
201
|
+
execute_callbacks
|
|
202
|
+
self
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Callbacks are called when you enter (or are in) a :succeeded state.
|
|
206
|
+
def callback(*a, &b)
|
|
207
|
+
stateback(:succeeded, *a, &b)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# Errbacks are called when you enter (or are in) a :failed state.
|
|
211
|
+
def errback(*a, &b)
|
|
212
|
+
stateback(:failed, *a, &b)
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Completions are called when you enter (or are in) either a :failed or a
|
|
216
|
+
# :succeeded state. They are stored as a special (reserved) state called
|
|
217
|
+
# :completed.
|
|
218
|
+
def completion(*a, &b)
|
|
219
|
+
stateback(:completed, *a, &b)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# Enter a new state, setting the result value if given. If the state is one
|
|
223
|
+
# of :succeeded or :failed, then :completed callbacks will also be called.
|
|
224
|
+
def change_state(state, *args)
|
|
225
|
+
@value = args
|
|
226
|
+
@state = state
|
|
227
|
+
|
|
228
|
+
EM.schedule { execute_callbacks }
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
# The old EM method:
|
|
232
|
+
alias set_deferred_status change_state
|
|
233
|
+
|
|
234
|
+
# Indicates that we've reached some kind of completion state, by default
|
|
235
|
+
# this is :succeeded or :failed. Due to these semantics, the :completed
|
|
236
|
+
# state is reserved for internal use.
|
|
237
|
+
def completed?
|
|
238
|
+
completion_states.any? { |s| state == s }
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
# Completion states simply returns a list of completion states, by default
|
|
242
|
+
# this is :succeeded and :failed.
|
|
243
|
+
def completion_states
|
|
244
|
+
[:succeeded, :failed]
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
# Schedule a time which if passes before we enter a completion state, this
|
|
248
|
+
# deferrable will be failed with the given arguments.
|
|
249
|
+
def timeout(time, *args)
|
|
250
|
+
cancel_timeout
|
|
251
|
+
@timeout_timer = EM::Timer.new(time) do
|
|
252
|
+
fail(*args) unless completed?
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
# Disable the timeout
|
|
257
|
+
def cancel_timeout
|
|
258
|
+
if @timeout_timer
|
|
259
|
+
@timeout_timer.cancel
|
|
260
|
+
@timeout_timer = nil
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
# Remove an errback. N.B. Some errbacks cannot be deleted. Usage is NOT
|
|
265
|
+
# recommended, this is an anti-pattern.
|
|
266
|
+
def cancel_errback(*a, &b)
|
|
267
|
+
@callbacks[:failed].delete(EM::Callback(*a, &b))
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
# Remove a callback. N.B. Some callbacks cannot be deleted. Usage is NOT
|
|
271
|
+
# recommended, this is an anti-pattern.
|
|
272
|
+
def cancel_callback(*a, &b)
|
|
273
|
+
@callbacks[:succeeded].delete(EM::Callback(*a, &b))
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
private
|
|
277
|
+
# Execute all callbacks for the current state. If in a completed state, then
|
|
278
|
+
# call any statebacks associated with the completed state.
|
|
279
|
+
def execute_callbacks
|
|
280
|
+
execute_state_callbacks(state)
|
|
281
|
+
if completed?
|
|
282
|
+
execute_state_callbacks(:completed)
|
|
283
|
+
clear_dead_callbacks
|
|
284
|
+
cancel_timeout
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
# Iterate all callbacks for a given state, and remove then call them.
|
|
289
|
+
def execute_state_callbacks(state)
|
|
290
|
+
while callback = @callbacks[state].shift
|
|
291
|
+
callback.call(*value)
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
# If we enter a completion state, clear other completion states after all
|
|
296
|
+
# callback chains are completed. This means that operation specific
|
|
297
|
+
# callbacks can't be dual-called, which is most common user error.
|
|
298
|
+
def clear_dead_callbacks
|
|
299
|
+
completion_states.each do |state|
|
|
300
|
+
@callbacks[state].clear
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
end
|