pokan 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/pokan/request_handler.rb +0 -6
- data/lib/pokan/server.rb +24 -0
- data/lib/pokan/version.rb +1 -1
- data/pokan.gemspec +39 -0
- data/spec/pokan/server_spec.rb +9 -1
- metadata +10 -9
@@ -35,32 +35,26 @@ module Pokan
|
|
35
35
|
message = JSON.parse(json_data)
|
36
36
|
data = message['data']
|
37
37
|
|
38
|
-
puts 'RECV'
|
39
38
|
case message['action']
|
40
39
|
when 'digest'
|
41
|
-
puts "DIGEST from #{message['origin']}"
|
42
40
|
pull = pull_message(data)
|
43
41
|
send_datagram(pull, *message['origin'].split(':'))
|
44
42
|
|
45
43
|
pull
|
46
44
|
when 'pull'
|
47
|
-
puts "PULL from #{message['origin']}"
|
48
45
|
response = push_message(data['older'])
|
49
46
|
merge(data['newer'])
|
50
47
|
send_datagram(response, *message['origin'].split(':'))
|
51
48
|
|
52
49
|
response
|
53
50
|
when 'push'
|
54
|
-
puts "PUSH from #{message['origin']}"
|
55
51
|
merge(data)
|
56
52
|
when 'hello'
|
57
|
-
puts "HELLO from from #{message['origin']}"
|
58
53
|
peer = Peer.new
|
59
54
|
peer.id = message['origin']
|
60
55
|
# peer.store(:role, message['role'])
|
61
56
|
peer.save
|
62
57
|
when 'goodbye'
|
63
|
-
puts "GOODBYE from #{message['origin']}"
|
64
58
|
peer = Query.new(Peer).where(id: message['origin'])[0]
|
65
59
|
peer.store(:status, 'dead', message['timestamp'])
|
66
60
|
peer.save
|
data/lib/pokan/server.rb
CHANGED
@@ -62,6 +62,7 @@ module Pokan
|
|
62
62
|
def initialize(address)
|
63
63
|
@event_handler = EventHandler.new
|
64
64
|
@seed_address, @seed_port = '', ''
|
65
|
+
@periodics = []
|
65
66
|
self.address = address
|
66
67
|
self.udp_port = 5555
|
67
68
|
super()
|
@@ -134,6 +135,19 @@ module Pokan
|
|
134
135
|
register_event(event_name, &block) if AFTER_EVENTS.include? event
|
135
136
|
end
|
136
137
|
|
138
|
+
|
139
|
+
# Adds behavior to the server, to be executed periodically (every given
|
140
|
+
# amount of seconds).
|
141
|
+
#
|
142
|
+
# server.every 2 do
|
143
|
+
# puts "Heya!"
|
144
|
+
# end
|
145
|
+
#
|
146
|
+
# Every 2 seconds "Heya!" will be printed out.
|
147
|
+
def every(seconds, &action)
|
148
|
+
@periodics << { :period => seconds, :action => action }
|
149
|
+
end
|
150
|
+
|
137
151
|
# This method starts the server, which will bind specified TCP and UDP
|
138
152
|
# ports (or 5555 by default). Optionally, you can pass the address of
|
139
153
|
# another pokan instance (a seed), and the server will automatically
|
@@ -201,6 +215,7 @@ module Pokan
|
|
201
215
|
def start_event_loop
|
202
216
|
EventMachine.run {
|
203
217
|
gossip
|
218
|
+
register_periodics
|
204
219
|
|
205
220
|
RequestHandler.address = address
|
206
221
|
RequestHandler.port = udp_port
|
@@ -213,6 +228,14 @@ module Pokan
|
|
213
228
|
}
|
214
229
|
end
|
215
230
|
|
231
|
+
def register_periodics
|
232
|
+
@periodics.each do |callback|
|
233
|
+
EventMachine.add_periodic_timer(callback[:period]) {
|
234
|
+
callback[:action].call
|
235
|
+
}
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
216
239
|
def build_trap
|
217
240
|
trap('INT') { prepare_to_die }
|
218
241
|
trap('TERM') { prepare_to_die }
|
@@ -226,6 +249,7 @@ module Pokan
|
|
226
249
|
def prepare_to_die
|
227
250
|
say_goodbye(@seed_address, @seed_port)
|
228
251
|
@event_handler.emit :shutdown
|
252
|
+
exit 0
|
229
253
|
end
|
230
254
|
|
231
255
|
def say_goodbye(address, port)
|
data/lib/pokan/version.rb
CHANGED
data/pokan.gemspec
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "pokan"
|
8
|
+
s.version = "0.1.0rc1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Renato Mascarenhas", "Rafael Regis do Prado", "Fabio Lima Pereira"]
|
12
|
+
s.date = "2011-11-10"
|
13
|
+
s.description = "pokan is an implementation of the Gossip protocol \n (best described in http://www.cs.cornell.edu/home/rvr/papers/flowgossip.pdf),\n which aims to have a simple, event based API capable of being used in large,\n not previously known networks."
|
14
|
+
s.email = "haze-gem@googlegroups.com"
|
15
|
+
s.homepage = "http://github.com/haze/pokan"
|
16
|
+
s.licenses = ["MIT"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubygems_version = "1.8.10"
|
19
|
+
s.summary = "Gossip-protocol implementation with an event based API"
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
s.specification_version = 3
|
23
|
+
|
24
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
25
|
+
s.add_runtime_dependency(%q<json>, [">= 0"])
|
26
|
+
s.add_runtime_dependency(%q<eventmachine>, [">= 0"])
|
27
|
+
s.add_runtime_dependency(%q<redis>, [">= 0"])
|
28
|
+
else
|
29
|
+
s.add_dependency(%q<json>, [">= 0"])
|
30
|
+
s.add_dependency(%q<eventmachine>, [">= 0"])
|
31
|
+
s.add_dependency(%q<redis>, [">= 0"])
|
32
|
+
end
|
33
|
+
else
|
34
|
+
s.add_dependency(%q<json>, [">= 0"])
|
35
|
+
s.add_dependency(%q<eventmachine>, [">= 0"])
|
36
|
+
s.add_dependency(%q<redis>, [">= 0"])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
data/spec/pokan/server_spec.rb
CHANGED
@@ -24,7 +24,7 @@ describe Pokan::Server do
|
|
24
24
|
|
25
25
|
context 'when behavior is added to the server' do
|
26
26
|
|
27
|
-
before { @server = Pokan::Server.new('
|
27
|
+
before { @server = Pokan::Server.new('127.0.0.1') }
|
28
28
|
|
29
29
|
it 'should properly call registered callbacks on events' do
|
30
30
|
@block_called = false
|
@@ -35,6 +35,14 @@ describe Pokan::Server do
|
|
35
35
|
@block_called.should be_true
|
36
36
|
end
|
37
37
|
|
38
|
+
it 'should call registered, periodic behavior' do
|
39
|
+
@block_called = false
|
40
|
+
@server.every(2) { @block_called = true; @server.stop }
|
41
|
+
|
42
|
+
@server.start
|
43
|
+
@block_called.should be_true
|
44
|
+
end
|
45
|
+
|
38
46
|
def add_behavior_to_event(event)
|
39
47
|
@server.on event do |key, value|
|
40
48
|
@block_called = true
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pokan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,11 +11,11 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2011-11-
|
14
|
+
date: 2011-11-20 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: json
|
18
|
-
requirement: &
|
18
|
+
requirement: &4607080 !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
21
|
- - ! '>='
|
@@ -23,10 +23,10 @@ dependencies:
|
|
23
23
|
version: '0'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
|
-
version_requirements: *
|
26
|
+
version_requirements: *4607080
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: eventmachine
|
29
|
-
requirement: &
|
29
|
+
requirement: &4604620 !ruby/object:Gem::Requirement
|
30
30
|
none: false
|
31
31
|
requirements:
|
32
32
|
- - ! '>='
|
@@ -34,10 +34,10 @@ dependencies:
|
|
34
34
|
version: '0'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
|
-
version_requirements: *
|
37
|
+
version_requirements: *4604620
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: redis
|
40
|
-
requirement: &
|
40
|
+
requirement: &4675760 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ! '>='
|
@@ -45,7 +45,7 @@ dependencies:
|
|
45
45
|
version: '0'
|
46
46
|
type: :runtime
|
47
47
|
prerelease: false
|
48
|
-
version_requirements: *
|
48
|
+
version_requirements: *4675760
|
49
49
|
description: ! "pokan is an implementation of the Gossip protocol \n (best described
|
50
50
|
in http://www.cs.cornell.edu/home/rvr/papers/flowgossip.pdf),\n which aims to
|
51
51
|
have a simple, event based API capable of being used in large,\n not previously
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/pokan/server.rb
|
77
77
|
- lib/pokan/server_messages.rb
|
78
78
|
- lib/pokan/version.rb
|
79
|
+
- pokan.gemspec
|
79
80
|
- spec/pokan/connection_spec.rb
|
80
81
|
- spec/pokan/entity_spec.rb
|
81
82
|
- spec/pokan/event_handler_spec.rb
|
@@ -101,7 +102,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
102
|
version: '0'
|
102
103
|
segments:
|
103
104
|
- 0
|
104
|
-
hash:
|
105
|
+
hash: 2770225815694164353
|
105
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
107
|
none: false
|
107
108
|
requirements:
|