active_event 0.5.0.rc3 → 0.5.0.rc4

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: dfcf244a9fb8882bb8ae72895d8847ef33f04e10
4
- data.tar.gz: ed1f6a33c96523a8c6972898a806526fe5892b0d
3
+ metadata.gz: d695d82e04ff4395d4ed6ed08e40315f63b90722
4
+ data.tar.gz: 05043c74ef8487177bbb09848a2a13cb9ad69b87
5
5
  SHA512:
6
- metadata.gz: 8258632c497cef9b2dc03d56afbc7a75163b188639366635a0c78bd09f4cf5b3c3d5ad50ee14b277a88e2d2f889d73c047518a3c2d98668e2c9429ba9fbe3892
7
- data.tar.gz: f48226308f46ceaaf0d168711738c9f3a8c239e2da4f04bdbcea32ea43595341fb30bce19328cd1c18381efcc87c4fe119526f69a4a85fd3c38b64c854b2c6cf
6
+ metadata.gz: f183b8a4e89b5a32ec86a0764a75d83d945756fdfec065554bd9df51489372204f799292dc134136abf5fadc56c74cd3b87c07fd6dfe3f466ed1063eed728d76
7
+ data.tar.gz: 636526f08010a506cda3e64155710ab0c9109086cc4d736f2feb37a0bf4a8d1aa6003db56b314f3af8f8cf6e4cb9e62024f1dca1c73b4f3048e18014ce744aa8
@@ -1,8 +1,61 @@
1
+ require 'singleton'
1
2
  require 'bunny'
3
+
2
4
  module ActiveEvent
3
- module EventSourceServer
4
- def subscribe_to(queue, &block)
5
- queue.subscribe(block: true, &block)
5
+ class EventSourceServer
6
+ include Singleton
7
+
8
+ def self.after_event_projection(event_id, projection, &block)
9
+ instance.after_event_projection(event_id, projection, &block)
10
+ end
11
+
12
+ def after_event_projection(event_id, projection)
13
+ mutex.synchronize do
14
+ projection_status = status[projection]
15
+ if projection_status.event_id < event_id
16
+ cv = ConditionVariable.new
17
+ begin
18
+ projection_status.waiters[event_id] << cv
19
+ cv.wait(mutex)
20
+ ensure
21
+ projection_status.waiters[event_id].delete cv
22
+ end
23
+ end
24
+ end
25
+ yield
26
+ end
27
+
28
+ private
29
+
30
+ class Status
31
+ attr_accessor :event_id, :waiters, :error, :backtrace
32
+
33
+ def initialize
34
+ self.event_id = 0
35
+ self.waiters = Hash.new { |h,k| h[k] = [] }
36
+ end
37
+ end
38
+
39
+ attr_accessor :mutex # synchronize access to status
40
+ attr_accessor :status # status of all projections received so far
41
+
42
+ def initialize
43
+ self.mutex = Mutex.new
44
+ self.status = Hash.new { |h,k| h[k] = Status.new }
45
+ event_connection.start
46
+ event_queue.subscribe do |delivery_info, properties, body|
47
+ process_projection JSON.parse(body).symbolize_keys!
48
+ end
49
+ end
50
+
51
+ def process_projection(data)
52
+ mutex.synchronize do
53
+ projection_status = status[data[:projection]]
54
+ projection_status.event_id = data[:event]
55
+ projection_status.error = data[:error] if data.key? :error
56
+ projection_status.backtrace = data[:backtrace] if data.key? :backtrace
57
+ projection_status.waiters.delete(data[:event]).to_a.each { |cv| cv.signal }
58
+ end
6
59
  end
7
60
 
8
61
  def event_queue
@@ -18,7 +71,7 @@ module ActiveEvent
18
71
  end
19
72
 
20
73
  def event_exchange
21
- @event_exchange ||= event_channel.fanout "server_side_#{options[:event_exchange]}"
74
+ @@event_exchange ||= event_channel.fanout "server_side_#{options[:event_exchange]}"
22
75
  end
23
76
 
24
77
  def default_options
@@ -52,4 +105,4 @@ module ActiveEvent
52
105
 
53
106
  attr_writer :options
54
107
  end
55
- end
108
+ end
@@ -1,7 +1,7 @@
1
1
  module ActiveEvent
2
2
  # Returns the version of the currently loaded ActiveEvent as a Gem::Version
3
3
  def self.version
4
- Gem::Version.new '0.5.0.rc3'
4
+ Gem::Version.new '0.5.0.rc4'
5
5
  end
6
6
 
7
7
  module VERSION #:nodoc:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_event
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0.rc3
4
+ version: 0.5.0.rc4
5
5
  platform: ruby
6
6
  authors:
7
7
  - HicknHack Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-24 00:00:00.000000000 Z
11
+ date: 2014-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord