Module: StagedEvent

Defined in:
lib/staged_event.rb,
lib/staged_event/model.rb,
lib/staged_event/version.rb,
lib/staged_event/publisher.rb,
lib/staged_event/subscriber.rb,
lib/staged_event/backoff_timer.rb,
lib/staged_event/configuration.rb,
lib/staged_event/event_envelope_pb.rb,
lib/staged_event/publisher_process.rb,
lib/staged_event/subscriber_process.rb,
lib/staged_event/google_pub_sub/helper.rb,
lib/staged_event/google_pub_sub/publisher.rb,
lib/staged_event/google_pub_sub/subscriber.rb,
lib/generators/staged_event/install_generator.rb

Defined Under Namespace

Modules: Configuration, GooglePubSub Classes: BackoffTimer, DeserializationError, Error, InstallGenerator, Model, Publisher, PublisherProcess, Subscriber, SubscriberProcess, UnknownEventTypeError

Constant Summary collapse

VERSION =
"0.0.2"
EventEnvelope =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("staged_event.EventEnvelope").msgclass

Class Method Summary collapse

Class Method Details

.deserialize_event(serialized_data) ⇒ OpenStruct

Converts serialized event data received from a publisher into an object with the event (and its metadata) in accessible form

Parameters:

  • serialized_data (String)

    the serialized event data

Returns:

  • (OpenStruct)

    an object representing the event



63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/staged_event.rb', line 63

def deserialize_event(serialized_data)
  envelope = EventEnvelope.decode(serialized_data)
  event_descriptor = Google::Protobuf::DescriptorPool.generated_pool.lookup(envelope.event.type_url)
  raise UnknownEventTypeError if event_descriptor.blank?

  proto = event_descriptor.msgclass.decode(envelope.event.value)

  OpenStruct.new(
    id: envelope.uuid,
    data: proto,
  )
rescue Google::Protobuf::ParseError
  raise DeserializationError
end

.from_proto(proto, **kwargs) ⇒ StagedEvent::Model

Builds an ActiveRecord model from a proto object representing an event. If the model is committed to the database, it will be published by the publisher process.

Parameters:

  • proto (Instance of a protobuf generated class)

    the event data to publish

  • kwargs (Hash)

    a customizable set of options

Options Hash (**kwargs):

  • :topic (String)

    the topic that will receive the event

Returns:



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/staged_event.rb', line 35

def from_proto(proto, **kwargs)
  uuid = SecureRandom.uuid

  envelope = EventEnvelope.new(
    event: {
      type_url: proto.class.descriptor.name,
      value: proto.class.encode(proto),
    },
    uuid: uuid,
  )

  data = EventEnvelope.encode(envelope)
  topic = kwargs.fetch(:topic, nil)

  Model.new(id: uuid, data: data, topic: topic)
end

.save_proto!(proto, **kwargs) ⇒ Object

Shortcut method to construct and persist an event with a single call. Params are the same as from_proto.



54
55
56
# File 'lib/staged_event.rb', line 54

def save_proto!(proto, **kwargs)
  StagedEvent.from_proto(proto, **kwargs).save!
end