rasti-web 0.1.1 → 0.2.0

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 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