meerkat 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- meerkat (0.2.0)
4
+ meerkat (0.2.1)
5
5
  em-hiredis
6
6
  eventmachine
7
7
  pg
data/README.md CHANGED
@@ -9,7 +9,7 @@ Supported backends:
9
9
 
10
10
  * In memory, using [EventMachine Channels](http://eventmachine.rubyforge.org/EventMachine/Channel.html), good for single server usage.
11
11
  * Redis, using [em-hiredis](https://github.com/mloughran/em-hiredis#readme) and the [Pub/Sub API](http://redis.io/topics/pubsub).
12
- * Postgres, using the [Notify/Listen API](http://www.postgresql.org/docs/9.1/static/sql-notify.html). Note, this is totally async, no polling.
12
+ * Postgres, using the [Notify/Listen API](http://www.postgresql.org/docs/9.1/static/sql-notify.html). Note, this is fully async, no polling. Although, it requires PostgreSQL 9.0 or higher, so unfortunately Heroku's Shared Database can't be used (8.3) but their dedicated database offerings can.
13
13
 
14
14
  Usage
15
15
  -----
@@ -56,6 +56,14 @@ The published objects will be JSON serialized (with [Yajl](https://github.com/br
56
56
 
57
57
  Read more about Server-Sent Events and the EventSource API on [HTML5Rocks](http://www.html5rocks.com/en/tutorials/eventsource/basics/).
58
58
 
59
+ Examples
60
+ --------
61
+
62
+ A simple demo can be seen here:
63
+ http://meerkat-demo.herokuapp.com/
64
+
65
+ It's deployed on [Heroku's Cedar stack](http://devcenter.heroku.com/articles/cedar). It's using the Redis backend, thanks to [Redis To Go](https://redistogo.com/)'s free Nano offering.
66
+
59
67
  License
60
68
  -------
61
69
  (MIT license)
@@ -5,8 +5,10 @@ module Meerkat
5
5
  class Redis
6
6
  def initialize(redis_uri = nil)
7
7
  @redis_uri = redis_uri
8
- EM.next_tick {
9
- @pub = EM::Hiredis.connect redis_uri
8
+ @subs = {}
9
+ EM.next_tick {
10
+ @sub = EM::Hiredis.connect redis_uri
11
+ @pub = EM::Hiredis.connect redis_uri
10
12
  }
11
13
  end
12
14
 
@@ -15,16 +17,25 @@ module Meerkat
15
17
  end
16
18
 
17
19
  def subscribe(route, &callback)
18
- sub = EM::Hiredis.connect @redis_uri
19
- sub.subscribe route
20
- sub.on :message do |channel, message|
21
- callback.call(message)
20
+ if @subs[route]
21
+ @subs[route] << callback
22
+ else
23
+ @subs[route] = [ callback ]
24
+ EM.next_tick {
25
+ @sub.subscribe route
26
+ @sub.on :message do |channel, message|
27
+ @subs[route].each { |c| c.call message }
28
+ end
29
+ }
22
30
  end
23
- sub
31
+ [route, callback]
24
32
  end
25
33
 
26
34
  def unsubscribe(sub)
27
- sub.close_connection
35
+ @subs[sub[0]].delete sub[1]
36
+ EM.next_tick {
37
+ @sub.unsubscribe(sub[0]) if @subs[sub[0]].empty?
38
+ }
28
39
  end
29
40
  end
30
41
  end
@@ -1,3 +1,3 @@
1
1
  module Meerkat
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meerkat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-10-25 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
16
- requirement: &70275010936200 !ruby/object:Gem::Requirement
16
+ requirement: &70351112360820 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70275010936200
24
+ version_requirements: *70351112360820
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rack-test
27
- requirement: &70275010935740 !ruby/object:Gem::Requirement
27
+ requirement: &70351112360220 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70275010935740
35
+ version_requirements: *70351112360220
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: thin_async
38
- requirement: &70275010935300 !ruby/object:Gem::Requirement
38
+ requirement: &70351112358160 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70275010935300
46
+ version_requirements: *70351112358160
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: thin-async-test
49
- requirement: &70275010934840 !ruby/object:Gem::Requirement
49
+ requirement: &70351112357740 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70275010934840
57
+ version_requirements: *70351112357740
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: em-minitest-spec
60
- requirement: &70275010934400 !ruby/object:Gem::Requirement
60
+ requirement: &70351112357320 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70275010934400
68
+ version_requirements: *70351112357320
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: yajl-ruby
71
- requirement: &70275010933940 !ruby/object:Gem::Requirement
71
+ requirement: &70351112356720 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70275010933940
79
+ version_requirements: *70351112356720
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: eventmachine
82
- requirement: &70275010933500 !ruby/object:Gem::Requirement
82
+ requirement: &70351112356100 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *70275010933500
90
+ version_requirements: *70351112356100
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: em-hiredis
93
- requirement: &70275010933040 !ruby/object:Gem::Requirement
93
+ requirement: &70351112355500 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *70275010933040
101
+ version_requirements: *70351112355500
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: pg
104
- requirement: &70275010932600 !ruby/object:Gem::Requirement
104
+ requirement: &70351112354800 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: '0'
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *70275010932600
112
+ version_requirements: *70351112354800
113
113
  description: Requires an evented Ruby dispatcher, like Thin
114
114
  email:
115
115
  - carl.hoerberg@gmail.com
@@ -151,7 +151,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
151
151
  version: '0'
152
152
  segments:
153
153
  - 0
154
- hash: 4297295389839479768
154
+ hash: -2377445987046880713
155
155
  required_rubygems_version: !ruby/object:Gem::Requirement
156
156
  none: false
157
157
  requirements:
@@ -160,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
160
  version: '0'
161
161
  segments:
162
162
  - 0
163
- hash: 4297295389839479768
163
+ hash: -2377445987046880713
164
164
  requirements: []
165
165
  rubyforge_project: meerkat
166
166
  rubygems_version: 1.8.6