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 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
@@ -0,0 +1,3 @@
1
+ require File.expand_path('../evented/evented', __FILE__)
2
+ require File.expand_path('../evented/stream', __FILE__)
3
+ require File.expand_path('../evented/server', __FILE__)
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: []