evented 0.0.1
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/README.md +31 -0
- data/evented.gemspec +14 -0
- data/lib/evented/evented.rb +48 -0
- data/lib/evented/server.rb +25 -0
- data/lib/evented/stream.rb +61 -0
- data/lib/evented.rb +3 -0
- metadata +49 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 1c0260b245d3d07fa1376773b895f626ca2f0a8c
|
|
4
|
+
data.tar.gz: 6e2cf33f7cf2d98abc471178024ff59ff94772d9
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 6bd3fb06c1e0396123ec34e632c5a026b411c1f17b8134928f52040c5b2ca3422158d41dccc08602982988e41e93a809a2399285b6b2495116df2201d306e711
|
|
7
|
+
data.tar.gz: f56143e179d61d54c7d3d14390ad43254b5c450dfdebddfb3ef7c952e7bc00b25c1cbf535aeaf23c6af4565dd5929e5e735a737f5253c5f8f372257f82aa7625
|
data/README.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Evented
|
|
2
|
+
----------
|
|
3
|
+
|
|
4
|
+
__Evented__ is a simple event-driven IO gem written in pure Ruby. Here's a example of an evented server that waits for connections and send a response.
|
|
5
|
+
|
|
6
|
+
```ruby
|
|
7
|
+
require 'evented'
|
|
8
|
+
server = Server.new('0.0.0.0', 8080)
|
|
9
|
+
server.on(:accept) do |stream| # callback when accept a new connection
|
|
10
|
+
response = "Lorem ipsum"
|
|
11
|
+
stream.send(response) do # callback after send
|
|
12
|
+
stream.close
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
server.start
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
It's designed for take advantages of the event-driven flow, when it's necessary. For example, when you want to send a response to client when it sends you a message, using callbacks, like:
|
|
19
|
+
|
|
20
|
+
```ruby
|
|
21
|
+
require 'evented'
|
|
22
|
+
server = Server.new('0.0.0.0', 8081) # echo server
|
|
23
|
+
server.on(:accept) do |stream|
|
|
24
|
+
stream.on(:data) do |data|
|
|
25
|
+
stream.send(data) do
|
|
26
|
+
stream.close
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
server.start
|
|
31
|
+
```
|
data/evented.gemspec
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Gem::Specification.new do |s|
|
|
2
|
+
s.name = 'evented'
|
|
3
|
+
s.version = '0.0.1'
|
|
4
|
+
s.date = '2014-09-28'
|
|
5
|
+
s.summary = "Gorki"
|
|
6
|
+
s.description = "Event-driven and async IO Ruby gem"
|
|
7
|
+
s.authors = ["Hugo Abonizio"]
|
|
8
|
+
s.email = 'hugo_abonizio@hotmail.com'
|
|
9
|
+
s.files = %w{README.md evented.gemspec}
|
|
10
|
+
s.files += Dir.glob("lib/**/*.rb")
|
|
11
|
+
s.homepage =
|
|
12
|
+
'https://github.com/hugoabonizio/gorkirb'
|
|
13
|
+
s.license = 'MIT'
|
|
14
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
class Evented
|
|
2
|
+
|
|
3
|
+
def initialize
|
|
4
|
+
@@_callbacks ||= Hash.new { |hash, key| hash[key] = Array.new }
|
|
5
|
+
@@_streams = []
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def callbacks
|
|
9
|
+
@@_callbacks
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def streams
|
|
13
|
+
@@_streams
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def on(event, &block)
|
|
17
|
+
@@_callbacks[event] << block
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def emit(event, *args)
|
|
21
|
+
@@_callbacks[event].each do |callback|
|
|
22
|
+
callback.call(*args)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def start
|
|
27
|
+
@running = true
|
|
28
|
+
while @running
|
|
29
|
+
tick
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def start_threaded
|
|
34
|
+
Thread.new { start }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def stop
|
|
38
|
+
@running = false
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def tick
|
|
42
|
+
@@_streams.each do |stream|
|
|
43
|
+
stream.handle_read
|
|
44
|
+
stream.handle_write
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'socket'
|
|
2
|
+
|
|
3
|
+
class Server < Evented
|
|
4
|
+
|
|
5
|
+
def initialize(host, port)
|
|
6
|
+
super()
|
|
7
|
+
@io = TCPServer.new(host, port)
|
|
8
|
+
streams << self
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def to_io
|
|
12
|
+
@io
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def handle_read
|
|
16
|
+
sock = @io.accept_nonblock
|
|
17
|
+
emit(:accept, Stream.new(sock))
|
|
18
|
+
rescue IO::WaitReadable
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def handle_write
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
class Stream < Evented
|
|
2
|
+
attr_accessor :_callbacks, :buffer
|
|
3
|
+
|
|
4
|
+
def initialize(io)
|
|
5
|
+
@io = io
|
|
6
|
+
@buffer = ''
|
|
7
|
+
streams << self
|
|
8
|
+
@_callbacks ||= Hash.new { |hash, key| hash[key] = Array.new }
|
|
9
|
+
on(:close) do
|
|
10
|
+
close
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def to_io
|
|
15
|
+
@io
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def on(event, &block)
|
|
19
|
+
@_callbacks[event] << block
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def emit(event, *args)
|
|
23
|
+
@_callbacks[event].each do |callback|
|
|
24
|
+
callback.call(*args)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def handle_read
|
|
29
|
+
chunk = @io.read_nonblock(1024)
|
|
30
|
+
emit(:data, chunk)
|
|
31
|
+
rescue IO::WaitReadable
|
|
32
|
+
rescue EOFError, IOError, Errno::ECONNRESET
|
|
33
|
+
emit(:close)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def handle_write
|
|
37
|
+
return if @buffer.empty?
|
|
38
|
+
@io.write_nonblock(@buffer)
|
|
39
|
+
@buffer = ''
|
|
40
|
+
emit(:sent)
|
|
41
|
+
rescue IO::WaitWritable
|
|
42
|
+
rescue EOFError, IOError, Errno::ECONNRESET
|
|
43
|
+
emit(:close)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def send(chunk, &block)
|
|
47
|
+
@buffer << chunk
|
|
48
|
+
on(:sent, &block) if block_given?
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def close
|
|
52
|
+
@io.close
|
|
53
|
+
rescue IOError
|
|
54
|
+
streams.delete(self)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def gets
|
|
58
|
+
@io.gets
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
data/lib/evented.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: evented
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Hugo Abonizio
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2014-09-28 00:00:00.000000000 Z
|
|
12
|
+
dependencies: []
|
|
13
|
+
description: Event-driven and async IO Ruby gem
|
|
14
|
+
email: hugo_abonizio@hotmail.com
|
|
15
|
+
executables: []
|
|
16
|
+
extensions: []
|
|
17
|
+
extra_rdoc_files: []
|
|
18
|
+
files:
|
|
19
|
+
- README.md
|
|
20
|
+
- evented.gemspec
|
|
21
|
+
- lib/evented.rb
|
|
22
|
+
- lib/evented/evented.rb
|
|
23
|
+
- lib/evented/server.rb
|
|
24
|
+
- lib/evented/stream.rb
|
|
25
|
+
homepage: https://github.com/hugoabonizio/gorkirb
|
|
26
|
+
licenses:
|
|
27
|
+
- MIT
|
|
28
|
+
metadata: {}
|
|
29
|
+
post_install_message:
|
|
30
|
+
rdoc_options: []
|
|
31
|
+
require_paths:
|
|
32
|
+
- lib
|
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
34
|
+
requirements:
|
|
35
|
+
- - ">="
|
|
36
|
+
- !ruby/object:Gem::Version
|
|
37
|
+
version: '0'
|
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
39
|
+
requirements:
|
|
40
|
+
- - ">="
|
|
41
|
+
- !ruby/object:Gem::Version
|
|
42
|
+
version: '0'
|
|
43
|
+
requirements: []
|
|
44
|
+
rubyforge_project:
|
|
45
|
+
rubygems_version: 2.2.2
|
|
46
|
+
signing_key:
|
|
47
|
+
specification_version: 4
|
|
48
|
+
summary: Gorki
|
|
49
|
+
test_files: []
|