pokan 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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)
@@ -1,3 +1,3 @@
1
1
  module Pokan #:nodoc:
2
- VERSION = "0.2.3" unless defined? Pokan::VERSION
2
+ VERSION = "0.2.4" unless defined? Pokan::VERSION
3
3
  end
@@ -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
+
@@ -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('10.10.10.8') }
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.3
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-15 00:00:00.000000000 Z
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: &4669280 !ruby/object:Gem::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: *4669280
26
+ version_requirements: *4607080
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: eventmachine
29
- requirement: &4689500 !ruby/object:Gem::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: *4689500
37
+ version_requirements: *4604620
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: redis
40
- requirement: &4687940 !ruby/object:Gem::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: *4687940
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: 3156693804676612369
105
+ hash: 2770225815694164353
105
106
  required_rubygems_version: !ruby/object:Gem::Requirement
106
107
  none: false
107
108
  requirements: