Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/event_store.rb')
-rw-r--r--lib/gitlab/event_store.rb42
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/gitlab/event_store.rb b/lib/gitlab/event_store.rb
new file mode 100644
index 00000000000..3d7b6b27eb0
--- /dev/null
+++ b/lib/gitlab/event_store.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+# Gitlab::EventStore is a simple pub-sub mechanism that lets you publish
+# domain events and use Sidekiq workers as event handlers.
+#
+# It can be used to decouple domains from different bounded contexts
+# by publishing domain events and let any interested parties subscribe
+# to them.
+#
+module Gitlab
+ module EventStore
+ Error = Class.new(StandardError)
+ InvalidEvent = Class.new(Error)
+ InvalidSubscriber = Class.new(Error)
+
+ def self.publish(event)
+ instance.publish(event)
+ end
+
+ def self.instance
+ @instance ||= configure!
+ end
+
+ # Define all event subscriptions using:
+ #
+ # store.subscribe(DomainA::SomeWorker, to: DomainB::SomeEvent)
+ #
+ # It is possible to subscribe to a subset of events matching a condition:
+ #
+ # store.subscribe(DomainA::SomeWorker, to: DomainB::SomeEvent), if: ->(event) { event.data == :some_value }
+ #
+ def self.configure!
+ Store.new do |store|
+ ###
+ # Add subscriptions here:
+
+ store.subscribe ::MergeRequests::UpdateHeadPipelineWorker, to: ::Ci::PipelineCreatedEvent
+ end
+ end
+ private_class_method :configure!
+ end
+end