rasti-web 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 831a4d1eeebc387c8e40196939035027bb83f63e
4
- data.tar.gz: 2e0f0a273055f0d863d008744f2a22d48e885731
3
+ metadata.gz: 39d44ecda3273b692c0f8ffd3e10cc863a9de55b
4
+ data.tar.gz: b0abe6f3e033b6490cd97410a2310e05e85ac683
5
5
  SHA512:
6
- metadata.gz: 7316d529b5ac6595603cb9f26bec14dcf5e70ece674987f99a27bf7388fbd22dfeeb05e8d0c08c0d7bf37a7df02318eff0c6672858291c7761139d9ddad4930f
7
- data.tar.gz: ff916df63a04677a72dab94f3f0cec2ef4ea5f0324f7461833ca93b0331da9df9e40c6b6be184cfe7a6f185d7ef53ec025b4bcf9584b32e52ad232dd82485af0
6
+ metadata.gz: b7784e46d19cea8a8962fcc4c4b261e098eca09a51b0e96aa52e1d027a547658dd5224fd64022987b5bc7f4ae9f801f3f2300442de38e47307a8c5abe07568f7
7
+ data.tar.gz: 53b8cc43486cfea71985d15869d5a5eb62617fd9579e5134cc6793ffae88e0aab296999f3cd60fbcea0c9b9f9c688d1f89423fcb1646be5bc4cf91ba1181383b
data/.travis.yml CHANGED
@@ -7,4 +7,6 @@ rvm:
7
7
  - 2.3.0
8
8
  - jruby
9
9
  before_install:
10
- - gem install bundler
10
+ - gem install bundler
11
+ services:
12
+ - redis-server
@@ -2,33 +2,53 @@ module Rasti
2
2
  module Web
3
3
  class Channel
4
4
 
5
- def initialize
5
+ attr_reader :streams
6
+
7
+ def initialize(id)
6
8
  @mutex = Mutex.new
9
+ @channel = Restruct::Channel.new id: Restruct::Id[Web.channels_prefix][id]
7
10
  @streams = []
11
+ listen
8
12
  end
9
13
 
10
14
  def subscribe
11
15
  Stream.new.tap do |stream|
12
- @mutex.synchronize do
13
- @streams << stream
16
+ mutex.synchronize do
17
+ streams << stream
14
18
  end
15
19
  end
16
20
  end
17
21
 
18
22
  def publish(message)
19
- @mutex.synchronize do
20
- @streams.delete_if(&:closed?)
21
- Rasti::Web.logger.debug(Channel) { "Broadcasting (#{@streams.count} connections) -> #{message}" } unless @streams.empty?
22
- @streams.each do |stream|
23
- stream.write message
24
- end
25
- end
23
+ channel.publish message
26
24
  end
27
25
 
28
26
  def self.[](id)
29
- @channels ||= Hash.new { |h,k| h[k] = Channel.new }
27
+ @channels ||= Hash.new { |h,k| h[k] = self.new id }
30
28
  @channels[id]
31
29
  end
30
+
31
+ private
32
+
33
+ attr_reader :mutex, :channel
34
+
35
+ def listen
36
+ Thread.new do
37
+ channel.subscribe do |message|
38
+ broadcast message
39
+ end
40
+ end
41
+ end
42
+
43
+ def broadcast(message)
44
+ mutex.synchronize do
45
+ streams.delete_if(&:closed?)
46
+ Rasti::Web.logger.debug(Channel) { "Broadcasting (#{streams.count} connections) -> #{message}" } unless streams.empty?
47
+ streams.each do |stream|
48
+ stream.write message
49
+ end
50
+ end
51
+ end
32
52
 
33
53
  end
34
54
  end
@@ -1,5 +1,5 @@
1
1
  module Rasti
2
2
  module Web
3
- VERSION = '0.1.1'
3
+ VERSION = '0.2.0'
4
4
  end
5
5
  end
data/lib/rasti/web.rb CHANGED
@@ -7,6 +7,7 @@ require 'class_config'
7
7
  require 'forwardable'
8
8
  require 'logger'
9
9
  require 'hash_ext'
10
+ require 'restruct'
10
11
 
11
12
  require_relative 'web/route'
12
13
  require_relative 'web/router'
@@ -33,6 +34,7 @@ module Rasti
33
34
  attr_config :default_layout, 'layout'
34
35
  attr_config :helpers, []
35
36
  attr_config :logger, Logger.new(STDOUT)
37
+ attr_config :channels_prefix, Restruct::Id['rasti-web']['channels']
36
38
 
37
39
  after_config do |config|
38
40
  config.helpers.each { |h| ViewContext.send :include, h }
data/rasti-web.gemspec CHANGED
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency 'class_config', '~> 0.0.2'
25
25
  spec.add_dependency 'hash_ext', '~> 0.1'
26
26
  spec.add_dependency 'content-type', '~> 0.0'
27
+ spec.add_dependency 'restruct', '~> 0.2'
27
28
 
28
29
  spec.add_development_dependency 'bundler', '~> 1.12'
29
30
  spec.add_development_dependency 'rake', '~> 11.0'
@@ -20,13 +20,21 @@ describe 'Straming' do
20
20
  response.body.each { |e| events << e }
21
21
  end
22
22
 
23
+ channel = Rasti::Web::Channel[:test_channel]
24
+ sleep 0.05 # Wait for establish connection
25
+
23
26
  3.times do |i|
24
27
  data = {text: "Tick #{i}"}
25
28
  event = Rasti::Web::ServerSentEvent.new data, id: i, event: 'tick'
26
- Rasti::Web::Channel[:test_channel].publish event
29
+ channel.publish event
27
30
  end
28
31
 
29
- while events.count < 3; sleep 0.0001 end
32
+ Timeout.timeout(3) do
33
+ while events.count < 3;
34
+ sleep 0.0001 # Wait for subscriptions
35
+ end
36
+ end
37
+
30
38
  response.body.close
31
39
 
32
40
  events.must_equal 3.times.map { |i| "id: #{i}\nevent: tick\ndata: {\"text\":\"Tick #{i}\"}\n\n" }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rasti-web
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Naiman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-26 00:00:00.000000000 Z
11
+ date: 2016-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: restruct
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.2'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.2'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: bundler
99
113
  requirement: !ruby/object:Gem::Requirement