faye-redis-delayed 0.0.1 → 0.0.2
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/.rspec +2 -0
- data/{LICENSE → LICENSE.txt} +1 -1
- data/README.md +28 -12
- data/faye-redis-delayed.gemspec +16 -9
- data/lib/faye/redis_delayed.rb +1 -1
- data/spec/delayed_spec.rb +155 -0
- data/spec/spec_helper.rb +17 -0
- metadata +103 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a969a08d29a772df03ab22d2e458b76af12c35b6
|
4
|
+
data.tar.gz: 96fd1c85787c631167fcc972c9e951209509eb16
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28907519b98799fdc2519ab7f74381d5bf09d9ab2189edce37c835e7d242d3c54e39d3addd318a50789c93dc6e346e2429c929e60e2155b84d831d728c876e55
|
7
|
+
data.tar.gz: 5d9f0310e4c2bfecf07be6f7eb6fa4e7113dc6a9971f0e574b9e6f81c96a1dbdbe47979b05f6399be04fd220dcaff0ad76fa5f64b4e628035fd4cc113db2fd5d
|
data/.rspec
ADDED
data/{LICENSE → LICENSE.txt}
RENAMED
data/README.md
CHANGED
@@ -1,36 +1,52 @@
|
|
1
|
-
# Faye::RedisDelayed
|
1
|
+
# Faye::RedisDelayed [](http://badge.fury.io/rb/faye-redis-delayed) [](https://circleci.com/gh/monterail/faye-redis-delayed)
|
2
2
|
|
3
|
-
Delayed Redis engine
|
3
|
+
> Delayed Redis engine back-end for [Faye](http://faye.jcoglan.com/) Ruby server. Enables delivey of messages that were sent *before* a client has connected to the channel.
|
4
|
+
|
5
|
+
Turn this timeline:
|
6
|
+
|
7
|
+

|
8
|
+
|
9
|
+
…into that:
|
10
|
+
|
11
|
+

|
12
|
+
|
13
|
+
You can read about the [real case scenario](http://codetunes.com/2013/robust-dashboard-application-with-faye/) for the engine.
|
4
14
|
|
5
15
|
## Installation
|
6
16
|
|
7
|
-
Add this line to your application
|
17
|
+
Add this line to your application’s `Gemfile`:
|
8
18
|
|
9
|
-
|
19
|
+
```rb
|
20
|
+
gem 'faye-redis-delayed'
|
21
|
+
```
|
10
22
|
|
11
23
|
## Usage
|
12
24
|
|
13
|
-
|
25
|
+
When initializing a new Faye server, reference the engine and pass any required settings.
|
14
26
|
|
15
27
|
```rb
|
28
|
+
# faye config.ru
|
16
29
|
require 'faye'
|
17
|
-
require 'faye/
|
30
|
+
require 'faye/redis_delayed'
|
18
31
|
|
19
|
-
|
32
|
+
server = Faye::RackAdapter.new(
|
20
33
|
:mount => '/',
|
21
34
|
:timeout => 25,
|
22
35
|
:engine => {
|
23
|
-
:type
|
24
|
-
#
|
36
|
+
:type => Faye::RedisDelayed, # set the engine type
|
37
|
+
:expire => 30 # undelivered messages will expire in 30 seconds
|
38
|
+
# … # other Faye::Redis engine options
|
25
39
|
}
|
26
40
|
)
|
41
|
+
|
42
|
+
run server
|
27
43
|
```
|
28
44
|
|
29
|
-
|
45
|
+
Additional options provided by `Faye::DelayedRedis`:
|
30
46
|
|
31
|
-
|
47
|
+
* `:expire` — expire time in seconds, defaults to `60`
|
32
48
|
|
33
|
-
|
49
|
+
See the full list of [`Faye::Redis` engine options](https://github.com/faye/faye-redis-ruby).
|
34
50
|
|
35
51
|
## Contributing
|
36
52
|
|
data/faye-redis-delayed.gemspec
CHANGED
@@ -3,22 +3,29 @@ lib = File.expand_path('../lib', __FILE__)
|
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
|
-
spec.name =
|
7
|
-
spec.version =
|
8
|
-
spec.authors = [
|
9
|
-
spec.email = [
|
6
|
+
spec.name = 'faye-redis-delayed'
|
7
|
+
spec.version = '0.0.2'
|
8
|
+
spec.authors = ['Dariusz Gertych']
|
9
|
+
spec.email = ['dariusz.gertych@gmail.com']
|
10
10
|
spec.description = %q{Delayed Redis engine backend for Faye}
|
11
11
|
spec.summary = %q{Delayed Redis engine backend for Faye}
|
12
|
-
spec.homepage =
|
13
|
-
spec.license =
|
12
|
+
spec.homepage = 'https://github.com/monterail/faye-redis-delayed'
|
13
|
+
spec.license = 'MIT'
|
14
14
|
|
15
15
|
spec.files = `git ls-files`.split($/)
|
16
16
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
-
spec.require_paths = [
|
18
|
+
spec.require_paths = ['lib']
|
19
19
|
|
20
|
+
spec.add_dependency 'faye'
|
20
21
|
spec.add_dependency 'faye-redis', '>= 0.2.0'
|
21
22
|
|
22
|
-
spec.
|
23
|
-
|
23
|
+
spec.add_dependency 'multi_json', '~> 1.0'
|
24
|
+
|
25
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
26
|
+
spec.add_development_dependency 'rake'
|
27
|
+
spec.add_development_dependency 'rspec'
|
28
|
+
spec.add_development_dependency 'rack'
|
29
|
+
spec.add_development_dependency 'thin'
|
30
|
+
spec.add_development_dependency 'eventmachine'
|
24
31
|
end
|
data/lib/faye/redis_delayed.rb
CHANGED
@@ -13,7 +13,7 @@ module Faye
|
|
13
13
|
# fetch awaiting messages from redis and publish them
|
14
14
|
@redis.lpop(@ns + "/channels#{channel}/awaiting_messages") do |json_message|
|
15
15
|
if json_message
|
16
|
-
message =
|
16
|
+
message = MultiJson.load(json_message)
|
17
17
|
publish(message, [message["channel"]], json_message)
|
18
18
|
publish_awaiting_messages(channel)
|
19
19
|
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
require "rack/server"
|
4
|
+
require "net/http"
|
5
|
+
require "eventmachine"
|
6
|
+
|
7
|
+
require "faye"
|
8
|
+
require "faye/redis_delayed"
|
9
|
+
|
10
|
+
Faye::WebSocket.load_adapter('thin')
|
11
|
+
|
12
|
+
class TestServer
|
13
|
+
def initialize
|
14
|
+
@host = "localhost"
|
15
|
+
@port = 9292
|
16
|
+
|
17
|
+
faye.bind(:subscribe) do |client_id, channel|
|
18
|
+
puts "SUBSCRIBE #{client_id} #{channel}"
|
19
|
+
end
|
20
|
+
|
21
|
+
faye.bind(:publish) do |client_id, channel, data|
|
22
|
+
puts "PUBLISH #{client_id} #{channel}"
|
23
|
+
end
|
24
|
+
|
25
|
+
faye.bind(:handshake) do |client_id|
|
26
|
+
puts "HANDSHAKE #{client_id}"
|
27
|
+
end
|
28
|
+
|
29
|
+
faye.bind(:disconnect) do |client_id|
|
30
|
+
puts "DISCONNECT #{client_id}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def url
|
35
|
+
"http://#{@host}:#{@port}/faye"
|
36
|
+
end
|
37
|
+
|
38
|
+
def up?
|
39
|
+
return false if @thread && @thread.join(0)
|
40
|
+
|
41
|
+
res = Net::HTTP.start(@host, @port) { |http| http.get('/') }
|
42
|
+
true
|
43
|
+
rescue SystemCallError
|
44
|
+
false
|
45
|
+
end
|
46
|
+
|
47
|
+
def boot
|
48
|
+
puts "[server] Booting faye server..."
|
49
|
+
@thread = Thread.new do
|
50
|
+
Rack::Server.start(
|
51
|
+
:Host => @host,
|
52
|
+
:Port => @port,
|
53
|
+
:app => faye,
|
54
|
+
:environment => "production"
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
Timeout.timeout(60) { @thread.join(0.1) until up? }
|
59
|
+
rescue Timeout::Error
|
60
|
+
raise "Rack application timed out during boot"
|
61
|
+
else
|
62
|
+
puts "[server] Faye server started"
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
def shutdown
|
67
|
+
puts "[server] Shutting down faye server"
|
68
|
+
@thread.kill
|
69
|
+
@thread.join
|
70
|
+
end
|
71
|
+
|
72
|
+
def faye
|
73
|
+
@faye ||= Faye::RackAdapter.new(
|
74
|
+
:mount => '/',
|
75
|
+
:timeout => 25,
|
76
|
+
:engine => {
|
77
|
+
:type => Faye::RedisDelayed,
|
78
|
+
:namespace => redis_namespace,
|
79
|
+
:expire => 30
|
80
|
+
}
|
81
|
+
)
|
82
|
+
end
|
83
|
+
|
84
|
+
def redis_namespace
|
85
|
+
"faye-redis-delayed-test:#{rand(10000)}:"
|
86
|
+
end
|
87
|
+
|
88
|
+
def publish(channel, msg = {})
|
89
|
+
faye.get_client.publish(channel, msg)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class TestClient
|
94
|
+
attr_reader :messages
|
95
|
+
|
96
|
+
def initialize(url)
|
97
|
+
@url = url
|
98
|
+
@messages = []
|
99
|
+
@client = Faye::Client.new(@url)
|
100
|
+
end
|
101
|
+
|
102
|
+
def subscribe(channel)
|
103
|
+
@thread = Thread.new do
|
104
|
+
EM.run do
|
105
|
+
@client.subscribe(channel) do |message|
|
106
|
+
puts "RECEIVE"
|
107
|
+
@messages << message
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def disconnect
|
114
|
+
@client.disconnect
|
115
|
+
@thread.kill
|
116
|
+
@thread.join
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
describe Faye::RedisDelayed do
|
122
|
+
let(:server) do
|
123
|
+
TestServer.new
|
124
|
+
end
|
125
|
+
|
126
|
+
let(:client) do
|
127
|
+
TestClient.new(server.url)
|
128
|
+
end
|
129
|
+
|
130
|
+
before do
|
131
|
+
server.boot
|
132
|
+
end
|
133
|
+
|
134
|
+
after do
|
135
|
+
client.disconnect
|
136
|
+
sleep 2
|
137
|
+
server.shutdown
|
138
|
+
end
|
139
|
+
|
140
|
+
specify "normal flow" do
|
141
|
+
client.subscribe("/normal")
|
142
|
+
sleep 2
|
143
|
+
server.publish("/normal", {:text => "hello"})
|
144
|
+
sleep 2
|
145
|
+
expect(client.messages.size).to eq(1)
|
146
|
+
end
|
147
|
+
|
148
|
+
specify "delayed flow" do
|
149
|
+
server.publish("/delayed", {:text => "hello delayed"})
|
150
|
+
sleep 2
|
151
|
+
client.subscribe("/delayed")
|
152
|
+
sleep 2
|
153
|
+
expect(client.messages.size).to eq(1)
|
154
|
+
end
|
155
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
4
|
+
# loaded once.
|
5
|
+
#
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
|
+
config.run_all_when_everything_filtered = true
|
10
|
+
config.filter_run :focus
|
11
|
+
|
12
|
+
# Run specs in random order to surface order dependencies. If you find an
|
13
|
+
# order dependency and want to debug it, you can fix the order by providing
|
14
|
+
# the seed, which is printed after each run.
|
15
|
+
# --seed 1234
|
16
|
+
config.order = 'random'
|
17
|
+
end
|
metadata
CHANGED
@@ -1,55 +1,139 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faye-redis-delayed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dariusz Gertych
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faye
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: faye-redis
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
|
-
- -
|
31
|
+
- - ">="
|
18
32
|
- !ruby/object:Gem::Version
|
19
33
|
version: 0.2.0
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
|
-
- -
|
38
|
+
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: 0.2.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: multi_json
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: bundler
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
30
58
|
requirements:
|
31
|
-
- - ~>
|
59
|
+
- - "~>"
|
32
60
|
- !ruby/object:Gem::Version
|
33
61
|
version: '1.3'
|
34
62
|
type: :development
|
35
63
|
prerelease: false
|
36
64
|
version_requirements: !ruby/object:Gem::Requirement
|
37
65
|
requirements:
|
38
|
-
- - ~>
|
66
|
+
- - "~>"
|
39
67
|
- !ruby/object:Gem::Version
|
40
68
|
version: '1.3'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: rake
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
44
72
|
requirements:
|
45
|
-
- -
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rack
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: thin
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: eventmachine
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
46
130
|
- !ruby/object:Gem::Version
|
47
131
|
version: '0'
|
48
132
|
type: :development
|
49
133
|
prerelease: false
|
50
134
|
version_requirements: !ruby/object:Gem::Requirement
|
51
135
|
requirements:
|
52
|
-
- -
|
136
|
+
- - ">="
|
53
137
|
- !ruby/object:Gem::Version
|
54
138
|
version: '0'
|
55
139
|
description: Delayed Redis engine backend for Faye
|
@@ -59,14 +143,17 @@ executables: []
|
|
59
143
|
extensions: []
|
60
144
|
extra_rdoc_files: []
|
61
145
|
files:
|
62
|
-
- .gitignore
|
146
|
+
- ".gitignore"
|
147
|
+
- ".rspec"
|
63
148
|
- Gemfile
|
64
|
-
- LICENSE
|
149
|
+
- LICENSE.txt
|
65
150
|
- README.md
|
66
151
|
- Rakefile
|
67
152
|
- faye-redis-delayed.gemspec
|
68
153
|
- lib/faye-redis-delayed.rb
|
69
154
|
- lib/faye/redis_delayed.rb
|
155
|
+
- spec/delayed_spec.rb
|
156
|
+
- spec/spec_helper.rb
|
70
157
|
homepage: https://github.com/monterail/faye-redis-delayed
|
71
158
|
licenses:
|
72
159
|
- MIT
|
@@ -77,18 +164,20 @@ require_paths:
|
|
77
164
|
- lib
|
78
165
|
required_ruby_version: !ruby/object:Gem::Requirement
|
79
166
|
requirements:
|
80
|
-
- -
|
167
|
+
- - ">="
|
81
168
|
- !ruby/object:Gem::Version
|
82
169
|
version: '0'
|
83
170
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
171
|
requirements:
|
85
|
-
- -
|
172
|
+
- - ">="
|
86
173
|
- !ruby/object:Gem::Version
|
87
174
|
version: '0'
|
88
175
|
requirements: []
|
89
176
|
rubyforge_project:
|
90
|
-
rubygems_version: 2.
|
177
|
+
rubygems_version: 2.2.2
|
91
178
|
signing_key:
|
92
179
|
specification_version: 4
|
93
180
|
summary: Delayed Redis engine backend for Faye
|
94
|
-
test_files:
|
181
|
+
test_files:
|
182
|
+
- spec/delayed_spec.rb
|
183
|
+
- spec/spec_helper.rb
|