updatebroker 0.0.1
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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.md +37 -0
- data/Rakefile +2 -0
- data/bin/updatebroker +2 -0
- data/lib/updatebroker.rb +1 -0
- data/lib/updatebroker/updatebroker.rb +54 -0
- data/lib/updatebroker/version.rb +3 -0
- data/updatebroker.gemspec +26 -0
- metadata +108 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
## Welcome
|
2
|
+
|
3
|
+
This is a simple service for routing update events from an app to connected
|
4
|
+
web clients using Server Sent Events that are read from a named redis pub/sub
|
5
|
+
queue.
|
6
|
+
|
7
|
+
## Requirements
|
8
|
+
|
9
|
+
Redis
|
10
|
+
Ruby >= 1.9.2
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
gem install updatebroker
|
15
|
+
|
16
|
+
Note, do NOT add this to your Gemfile (for Rails 3.1 anyways). It brings in
|
17
|
+
asynch-rack which seems to conflict.
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
updatebroker --help
|
22
|
+
|
23
|
+
## Adding support for your web app.
|
24
|
+
|
25
|
+
See ./example/* [TBD]
|
26
|
+
|
27
|
+
## Gotchas
|
28
|
+
|
29
|
+
TBD
|
30
|
+
|
31
|
+
## License
|
32
|
+
|
33
|
+
MIT
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
|
data/Rakefile
ADDED
data/bin/updatebroker
ADDED
data/lib/updatebroker.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "updatebroker/updatebroker"
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#
|
2
|
+
# (c) 2011 Sourdough Labs Research and Development Corp
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'em-hiredis'
|
7
|
+
require 'goliath'
|
8
|
+
|
9
|
+
class UpdateBroker < Goliath::API
|
10
|
+
|
11
|
+
use Goliath::Rack::Params
|
12
|
+
|
13
|
+
attr_accessor :redis
|
14
|
+
|
15
|
+
def response(env)
|
16
|
+
path = env[Goliath::Request::REQUEST_PATH]
|
17
|
+
return [404, {}, "Not found"] unless path == "/events"
|
18
|
+
|
19
|
+
channel = env.params[:channel]
|
20
|
+
return [404, {}, "Channel required"] if channel.nil? || channel == ""
|
21
|
+
|
22
|
+
env.logger.info "Connecting to channel '#{channel}'@#{options[:redis]} for updates"
|
23
|
+
|
24
|
+
env['redis'] = EM::Hiredis.connect(options[:redis])
|
25
|
+
env['redis'].subscribe(channel)
|
26
|
+
env['redis'].on(:message) do |chn, msg|
|
27
|
+
env.logger.info "Message received from channel #{chn}: #{msg} (We're looking for #{channel})"
|
28
|
+
if chn === channel
|
29
|
+
res = env.stream_send("data:#{msg}\n\n")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
streaming_response(200, {'Content-Type' => 'text/event-stream'})
|
34
|
+
end
|
35
|
+
|
36
|
+
def on_close(env)
|
37
|
+
path = env[Goliath::Request::REQUEST_PATH]
|
38
|
+
return unless path == "/events"
|
39
|
+
|
40
|
+
channel = env.params[:channel]
|
41
|
+
return if channel.nil? || channel == ""
|
42
|
+
|
43
|
+
env.logger.info "Connection closed, Unsubscribing."
|
44
|
+
unless env['redis'].nil?
|
45
|
+
env['redis'].unsubscribe(channel)
|
46
|
+
env['redis'].close
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def options_parser(opts, options)
|
51
|
+
opts.on('-r', '--redis URI', "Redis URI") { |val| options[:redis] = val }
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "updatebroker/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "updatebroker"
|
7
|
+
s.version = Updatebroker::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Vince Hodges"]
|
10
|
+
s.email = ["vince@sourdoughlabs.com"]
|
11
|
+
s.homepage = "https://github.com/sourdoughlabs/UpdateBroker"
|
12
|
+
s.summary = %q{Broker updates from apps to connected web clients}
|
13
|
+
s.description = %q{Simple service (using Goliath) for reading updates from redis and sending them to clients using SSE}
|
14
|
+
|
15
|
+
s.rubyforge_project = "updatebroker"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency "hiredis", "~> 0.3.1"
|
23
|
+
s.add_dependency "em-hiredis"
|
24
|
+
s.add_dependency "em-synchrony"
|
25
|
+
s.add_dependency "goliath"
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: updatebroker
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Vince Hodges
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2012-03-12 00:00:00 -07:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: hiredis
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 0.3.1
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: em-hiredis
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: "0"
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: em-synchrony
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: goliath
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: "0"
|
58
|
+
type: :runtime
|
59
|
+
version_requirements: *id004
|
60
|
+
description: Simple service (using Goliath) for reading updates from redis and sending them to clients using SSE
|
61
|
+
email:
|
62
|
+
- vince@sourdoughlabs.com
|
63
|
+
executables:
|
64
|
+
- updatebroker
|
65
|
+
extensions: []
|
66
|
+
|
67
|
+
extra_rdoc_files: []
|
68
|
+
|
69
|
+
files:
|
70
|
+
- .gitignore
|
71
|
+
- Gemfile
|
72
|
+
- README.md
|
73
|
+
- Rakefile
|
74
|
+
- bin/updatebroker
|
75
|
+
- lib/updatebroker.rb
|
76
|
+
- lib/updatebroker/updatebroker.rb
|
77
|
+
- lib/updatebroker/version.rb
|
78
|
+
- updatebroker.gemspec
|
79
|
+
has_rdoc: true
|
80
|
+
homepage: https://github.com/sourdoughlabs/UpdateBroker
|
81
|
+
licenses: []
|
82
|
+
|
83
|
+
post_install_message:
|
84
|
+
rdoc_options: []
|
85
|
+
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: "0"
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: "0"
|
100
|
+
requirements: []
|
101
|
+
|
102
|
+
rubyforge_project: updatebroker
|
103
|
+
rubygems_version: 1.5.0
|
104
|
+
signing_key:
|
105
|
+
specification_version: 3
|
106
|
+
summary: Broker updates from apps to connected web clients
|
107
|
+
test_files: []
|
108
|
+
|