33module Sequent
44 module Core
55 class ProjectorMigrationError < RuntimeError ; end
6- class UnknownActiveProjectorError < ProjectorMigrationError ; end
7- class ReplayingProjectorMismatchError < ProjectorMigrationError ; end
8- class DifferentProjectorVersionIsActiveError < ProjectorMigrationError ; end
96
107 #
118 # EventPublisher ensures that, for every thread, events will be published
@@ -35,15 +32,6 @@ def message
3532 def publish_events ( events )
3633 return if configuration . disable_event_handlers
3734
38- ensure_no_unknown_active_projectors!
39-
40- events . each { |event | events_queue . push ( event ) }
41- process_events
42- end
43-
44- def replay_events ( events )
45- ensure_only_replaying_projectors_subscribed!
46-
4735 events . each { |event | events_queue . push ( event ) }
4836 process_events
4937 end
@@ -68,49 +56,20 @@ def process_event(event)
6856 Sequent . logger . debug ( "[EventPublisher] Publishing event #{ event . class } " ) if Sequent . logger . debug?
6957
7058 configuration . event_handlers . each do |handler |
71- handler . handle_message event
59+ handle_message ( handler , event )
7260 rescue ProjectorMigrationError
7361 raise
7462 rescue StandardError
7563 raise PublishEventError . new ( handler . class , event )
7664 end
7765 end
7866
79- def configuration
80- Sequent . configuration
67+ def handle_message ( handler , event )
68+ handler . handle_message ( event )
8169 end
8270
83- def ensure_no_unknown_active_projectors!
84- return unless Sequent . configuration . enable_projector_states
85-
86- expected_version = Sequent . migrations_class &.version
87- return if expected_version . nil?
88-
89- registered_projectors = Migratable . projectors . to_set ( &:name )
90- active_projectors = Projectors . projector_states
91- . values
92- . select { |s | s . active_version == expected_version }
93- . to_set ( &:name )
94- unknown_active_projectors = active_projectors - registered_projectors
95- if unknown_active_projectors . present?
96- fail UnknownActiveProjectorError ,
97- "cannot publish event when unknown projectors are active #{ unknown_active_projectors } "
98- end
99- end
100-
101- def ensure_only_replaying_projectors_subscribed!
102- return unless Sequent . configuration . enable_projector_states
103- return unless Sequent . migrations_class
104-
105- registered_projectors = Migratable . projectors . to_set ( &:name )
106- replaying_projectors = Projectors . projector_states
107- . values
108- . select { |state | state . replaying? || state . activating? }
109- . to_set ( &:name )
110- if registered_projectors != replaying_projectors
111- fail ReplayingProjectorMismatchError ,
112- "cannot replay event when different projectors are replaying #{ replaying_projectors } "
113- end
71+ def configuration
72+ Sequent . configuration
11473 end
11574 end
11675 end
0 commit comments