pokan 0.2.3 → 0.2.4
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.
- 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:
|