em-nodes 0.2.4 → 0.5
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 +4 -4
- data/.gitignore +1 -0
- data/README.md +177 -1
- data/benchmark/client.rb +3 -1
- data/em-nodes.gemspec +2 -2
- data/examples/default_client.rb +28 -0
- data/examples/default_server.rb +24 -0
- data/examples/hello_client.rb +29 -0
- data/examples/hello_server.rb +20 -0
- data/examples/simple_client.rb +19 -0
- data/examples/simple_server.rb +22 -0
- data/examples/task_client.rb +20 -0
- data/examples/task_server.rb +25 -0
- data/lib/em-nodes/client.rb +1 -1
- data/lib/em-nodes/server.rb +2 -1
- data/lib/em-nodes/version.rb +1 -1
- data/lib/em-nodes.rb +1 -0
- metadata +14 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1363157af5191aec0b3766f90bbea6f6f796774
|
4
|
+
data.tar.gz: c62062bed18a240bedb582f7181496b7801d278c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de60f8921cce94868c95f6e9206dad695473f6d511f7e185d03ec401cb63fd39823e9edcdd332f3f77e3ae0cde15caad567ca08f02a5c6e54a7b8e274678d54f
|
7
|
+
data.tar.gz: 109ee1213f2002c4fe8fa21839386c971e7e4743c9294cd68525682329786f86b7a76370f2d450099a3c9db2898fa5591ca78a8ec17f9f8d29bbce9bf8d50c93
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# EM::Nodes
|
2
2
|
|
3
|
-
Simple
|
3
|
+
Simple abstraction on top of EventMachine for easy create clients, servers, workers, ...
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -8,3 +8,179 @@ Add this line to your application's Gemfile:
|
|
8
8
|
|
9
9
|
gem 'em-nodes'
|
10
10
|
|
11
|
+
### How to use
|
12
|
+
|
13
|
+
Client should inherit from EM::Nodes::Client, Server should inherit from EM::Nodes::Server.
|
14
|
+
Client and Server can define and use methods `on_#{method_name}` and `send_#{method_name}`, `on_#{method_name}` - receive value from `send_#{method_name}` call.
|
15
|
+
|
16
|
+
Example: client after connection to server, send i_connected to server, server send_client_request, client on_client_request send to server client_responce, and server output value.
|
17
|
+
|
18
|
+
simple_server.rb
|
19
|
+
```ruby
|
20
|
+
class Server < EM::Nodes::Server
|
21
|
+
def on_i_connected(value)
|
22
|
+
puts "#{value} connected"
|
23
|
+
send_client_request(1)
|
24
|
+
end
|
25
|
+
|
26
|
+
def on_client_responce(value)
|
27
|
+
puts "client responce #{value}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
EM.run do
|
32
|
+
Server.start "/tmp/server.sock"
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
simple_client.rb
|
37
|
+
```ruby
|
38
|
+
class Client < EM::Nodes::Client
|
39
|
+
def on_client_request(value)
|
40
|
+
send_client_responce(value + 1)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
EM.run do
|
45
|
+
client = Client.connect "/tmp/server.sock"
|
46
|
+
client.send_i_connected("hahaha")
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
### HelloFeature
|
51
|
+
|
52
|
+
HelloFeature used to simple greetings between client and server. Client should define method `info` which return hash. Server had added method: `ready_clients`, which contain clients which answered on `info` method.
|
53
|
+
|
54
|
+
hello_server.rb
|
55
|
+
```ruby
|
56
|
+
class Server < EM::Nodes::Server
|
57
|
+
include HelloFeature
|
58
|
+
end
|
59
|
+
|
60
|
+
EM.run do
|
61
|
+
Server.start "/tmp/server.sock"
|
62
|
+
|
63
|
+
EM.add_periodic_timer(5) do
|
64
|
+
vasya = Server.ready_clients.detect { |client| client.data.my_name == 'Vasya' }
|
65
|
+
vasya.send_die if vasya
|
66
|
+
end
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
hello_client.rb
|
71
|
+
```ruby
|
72
|
+
class Client < EM::Nodes::Client
|
73
|
+
include HelloFeature
|
74
|
+
|
75
|
+
def initialize(name)
|
76
|
+
@name = name
|
77
|
+
super
|
78
|
+
end
|
79
|
+
|
80
|
+
def info
|
81
|
+
{ :my_name => @name }
|
82
|
+
end
|
83
|
+
|
84
|
+
def on_die
|
85
|
+
puts "oops i should die"
|
86
|
+
EM.stop
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
EM.run do
|
91
|
+
client = Client.connect "/tmp/server.sock", nil, "Vasya"
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
95
|
+
### TaskFeature
|
96
|
+
|
97
|
+
TaskFeature is simple task sending, executing and getting results. Client should define method `on_task(task_id, param)`, and when execute task and got results, should call `send_task_result(task_id, result)`. Server should send task with method, `send_task(param)`
|
98
|
+
|
99
|
+
Example: Client after connection send to server `get_me_task`, server send_task to client with rand value, client execute `on_task` method and add to param 1 and call `send_task_result`, server receive `on_task_result` and output result.
|
100
|
+
|
101
|
+
task_server.rb
|
102
|
+
```ruby
|
103
|
+
class Server < EM::Nodes::Server
|
104
|
+
include TaskFeature
|
105
|
+
|
106
|
+
def on_get_me_task
|
107
|
+
param = rand
|
108
|
+
puts "send to client #{param}"
|
109
|
+
send_task(param)
|
110
|
+
end
|
111
|
+
|
112
|
+
def on_task_result(result)
|
113
|
+
puts "client return result #{result}"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
EM.run do
|
118
|
+
Server.start "/tmp/server.sock"
|
119
|
+
end
|
120
|
+
```
|
121
|
+
|
122
|
+
task_client.rb
|
123
|
+
```ruby
|
124
|
+
class Client < EM::Nodes::Client
|
125
|
+
include TaskFeature
|
126
|
+
|
127
|
+
def on_task(task_id, param)
|
128
|
+
EM.next_tick { send_task_result(task_id, param + 1) }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
EM.run do
|
133
|
+
client = Client.connect "/tmp/server.sock"
|
134
|
+
client.send_get_me_task
|
135
|
+
end
|
136
|
+
```
|
137
|
+
|
138
|
+
### DefaultClient, DefaultServer
|
139
|
+
|
140
|
+
This is abstraction with HelloFeature and TaskFeature by default. Example how to create server and 10 workers. Server schedule for each client every 1 second, some value. Client just add 1 to value and return result to server, server puts value.
|
141
|
+
|
142
|
+
default_server.rb
|
143
|
+
```ruby
|
144
|
+
class Server < EM::Nodes::DefaultServer
|
145
|
+
def on_task_result(res)
|
146
|
+
puts res
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
EM.run do
|
151
|
+
Server.start "127.0.0.1", 8888
|
152
|
+
|
153
|
+
# periodical schedule tasks to clients
|
154
|
+
EM.add_periodic_timer(1) do
|
155
|
+
Server.ready_clients.each do |client|
|
156
|
+
client.send_task(rand)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
```
|
161
|
+
|
162
|
+
default_client.rb
|
163
|
+
```ruby
|
164
|
+
class Client < EM::Nodes::DefaultClient
|
165
|
+
def info
|
166
|
+
{ :name => 'bla' }
|
167
|
+
end
|
168
|
+
|
169
|
+
def on_task(task_id, param)
|
170
|
+
res = do_something(param)
|
171
|
+
send_task_result(task_id, res)
|
172
|
+
end
|
173
|
+
|
174
|
+
def do_something(x)
|
175
|
+
x + 1
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
EM.run do
|
180
|
+
10.times do
|
181
|
+
Client.connect "127.0.0.1", 8888
|
182
|
+
end
|
183
|
+
end
|
184
|
+
```
|
185
|
+
|
186
|
+
[More examples](https://github.com/kostya/em-nodes/tree/master/examples)
|
data/benchmark/client.rb
CHANGED
data/em-nodes.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = EventMachine::Nodes::VERSION
|
9
9
|
spec.authors = ["'Konstantin Makarchev'"]
|
10
10
|
spec.email = ["'kostya27@gmail.com'"]
|
11
|
-
spec.summary = %q{Simple
|
12
|
-
spec.description = %q{Simple
|
11
|
+
spec.summary = %q{Simple abstraction on top of EventMachine for easy create clients, servers, workers, ...}
|
12
|
+
spec.description = %q{Simple abstraction on top of EventMachine for easy create clients, servers, workers, ...}
|
13
13
|
spec.homepage = "https://github.com/kostya/em-nodes"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.require
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
l = Logger.new(STDOUT)
|
6
|
+
l.level = Logger::INFO
|
7
|
+
EM::Nodes.logger = l
|
8
|
+
|
9
|
+
class Client < EM::Nodes::DefaultClient
|
10
|
+
def info
|
11
|
+
{ :name => 'bla' }
|
12
|
+
end
|
13
|
+
|
14
|
+
def on_task(task_id, param)
|
15
|
+
res = do_something(param)
|
16
|
+
send_task_result(task_id, res)
|
17
|
+
end
|
18
|
+
|
19
|
+
def do_something(x)
|
20
|
+
x + 1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
EM.run do
|
25
|
+
10.times do
|
26
|
+
Client.connect "127.0.0.1", 8888
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.require
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
l = Logger.new(STDOUT)
|
6
|
+
l.level = Logger::INFO
|
7
|
+
EM::Nodes.logger = l
|
8
|
+
|
9
|
+
class Server < EM::Nodes::DefaultServer
|
10
|
+
def on_task_result(res)
|
11
|
+
puts res
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
EM.run do
|
16
|
+
Server.start "127.0.0.1", 8888
|
17
|
+
|
18
|
+
# periodical schedule tasks to clients
|
19
|
+
EM.add_periodic_timer(1) do
|
20
|
+
Server.ready_clients.each do |client|
|
21
|
+
client.send_task(rand)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.require
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
l = Logger.new(STDOUT)
|
6
|
+
l.level = Logger::INFO
|
7
|
+
EM::Nodes.logger = l
|
8
|
+
|
9
|
+
class Client < EM::Nodes::Client
|
10
|
+
include HelloFeature
|
11
|
+
|
12
|
+
def initialize(name)
|
13
|
+
@name = name
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
def info
|
18
|
+
{ :my_name => @name }
|
19
|
+
end
|
20
|
+
|
21
|
+
def on_die
|
22
|
+
puts "oops i should die"
|
23
|
+
EM.stop
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
EM.run do
|
28
|
+
client = Client.connect "/tmp/server.sock", nil, "Vasya"
|
29
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.require
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
l = Logger.new(STDOUT)
|
6
|
+
l.level = Logger::INFO
|
7
|
+
EM::Nodes.logger = l
|
8
|
+
|
9
|
+
class Server < EM::Nodes::Server
|
10
|
+
include HelloFeature
|
11
|
+
end
|
12
|
+
|
13
|
+
EM.run do
|
14
|
+
Server.start "/tmp/server.sock"
|
15
|
+
|
16
|
+
EM.add_periodic_timer(5) do
|
17
|
+
vasya = Server.ready_clients.detect { |client| client.data.my_name == 'Vasya' }
|
18
|
+
vasya.send_die if vasya
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.require
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
l = Logger.new(STDOUT)
|
6
|
+
l.level = Logger::INFO
|
7
|
+
EM::Nodes.logger = l
|
8
|
+
|
9
|
+
class Client < EM::Nodes::Client
|
10
|
+
def on_server_request(value)
|
11
|
+
puts "server send #{value}"
|
12
|
+
send_client_responce(value + 1)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
EM.run do
|
17
|
+
client = Client.connect "/tmp/server.sock"
|
18
|
+
client.send_i_connected("hahaha")
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.require
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
l = Logger.new(STDOUT)
|
6
|
+
l.level = Logger::INFO
|
7
|
+
EM::Nodes.logger = l
|
8
|
+
|
9
|
+
class Server < EM::Nodes::Server
|
10
|
+
def on_i_connected(value)
|
11
|
+
puts "#{value} connected"
|
12
|
+
send_server_request(1)
|
13
|
+
end
|
14
|
+
|
15
|
+
def on_client_responce(value)
|
16
|
+
puts "client responce #{value}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
EM.run do
|
21
|
+
Server.start "/tmp/server.sock"
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.require
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
l = Logger.new(STDOUT)
|
6
|
+
l.level = Logger::INFO
|
7
|
+
EM::Nodes.logger = l
|
8
|
+
|
9
|
+
class Client < EM::Nodes::Client
|
10
|
+
include TaskFeature
|
11
|
+
|
12
|
+
def on_task(task_id, param)
|
13
|
+
EM.next_tick { send_task_result(task_id, param + 1) }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
EM.run do
|
18
|
+
client = Client.connect "/tmp/server.sock"
|
19
|
+
client.send_get_me_task
|
20
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.require
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
l = Logger.new(STDOUT)
|
6
|
+
l.level = Logger::INFO
|
7
|
+
EM::Nodes.logger = l
|
8
|
+
|
9
|
+
class Server < EM::Nodes::Server
|
10
|
+
include TaskFeature
|
11
|
+
|
12
|
+
def on_get_me_task
|
13
|
+
param = rand
|
14
|
+
puts "send to client #{param}"
|
15
|
+
send_task(param)
|
16
|
+
end
|
17
|
+
|
18
|
+
def on_task_result(result)
|
19
|
+
puts "client return result #{result}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
EM.run do
|
24
|
+
Server.start "/tmp/server.sock"
|
25
|
+
end
|
data/lib/em-nodes/client.rb
CHANGED
@@ -17,7 +17,7 @@ class EM::Nodes::Client < EM::Connection
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.connect(host, port = nil, *args, &block)
|
20
|
-
EM::Nodes.logger.info { "Connecting to server #{host}
|
20
|
+
EM::Nodes.logger.info { "Connecting to server #{host}#{port ? ':' + port.to_s : nil}" }
|
21
21
|
EM.connect(host, port, self, *args)
|
22
22
|
end
|
23
23
|
end
|
data/lib/em-nodes/server.rb
CHANGED
@@ -37,6 +37,7 @@ class EM::Nodes::Server < EM::Connection
|
|
37
37
|
self.comm_inactivity_timeout = inactivity_timeout if EM.reactor_running?
|
38
38
|
|
39
39
|
port, host = Socket.unpack_sockaddr_in(get_peername) rescue []
|
40
|
+
host = Socket.unpack_sockaddr_un(get_sockname) unless host
|
40
41
|
unless accept?(host, port)
|
41
42
|
unbind
|
42
43
|
return
|
@@ -57,7 +58,7 @@ class EM::Nodes::Server < EM::Connection
|
|
57
58
|
end
|
58
59
|
|
59
60
|
def self.start(host, port = nil, *args)
|
60
|
-
EM::Nodes.logger.info { "Start server #{host}
|
61
|
+
EM::Nodes.logger.info { "Start server #{host}#{port ? ':' + port.to_s : nil}" }
|
61
62
|
EM.start_server host, port, self, *args
|
62
63
|
end
|
63
64
|
end
|
data/lib/em-nodes/version.rb
CHANGED
data/lib/em-nodes.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-nodes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.5'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "'Konstantin Makarchev'"
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eventmachine
|
@@ -66,7 +66,8 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
description: Simple
|
69
|
+
description: Simple abstraction on top of EventMachine for easy create clients, servers,
|
70
|
+
workers, ...
|
70
71
|
email:
|
71
72
|
- "'kostya27@gmail.com'"
|
72
73
|
executables: []
|
@@ -88,6 +89,14 @@ files:
|
|
88
89
|
- em-nodes.gemspec
|
89
90
|
- examples/chat_client.rb
|
90
91
|
- examples/chat_server.rb
|
92
|
+
- examples/default_client.rb
|
93
|
+
- examples/default_server.rb
|
94
|
+
- examples/hello_client.rb
|
95
|
+
- examples/hello_server.rb
|
96
|
+
- examples/simple_client.rb
|
97
|
+
- examples/simple_server.rb
|
98
|
+
- examples/task_client.rb
|
99
|
+
- examples/task_server.rb
|
91
100
|
- examples/work_client.rb
|
92
101
|
- examples/work_server.rb
|
93
102
|
- lib/em-nodes.rb
|
@@ -133,7 +142,8 @@ rubyforge_project:
|
|
133
142
|
rubygems_version: 2.2.2
|
134
143
|
signing_key:
|
135
144
|
specification_version: 4
|
136
|
-
summary: Simple
|
145
|
+
summary: Simple abstraction on top of EventMachine for easy create clients, servers,
|
146
|
+
workers, ...
|
137
147
|
test_files:
|
138
148
|
- spec/base_spec.rb
|
139
149
|
- spec/hello_spec.rb
|