Class: JetstreamBridge::Models::Event

Inherits:
Object
  • Object
show all
Defined in:
lib/jetstream_bridge/models/event.rb

Overview

Structured event object provided to consumers

Examples:

Accessing event data in consumer

JetstreamBridge.subscribe do |event|
  puts event.type              # "user.created"
  puts event.payload.id        # 123
  puts event.resource_type     # "user"
  puts event.deliveries        # 1
  puts event..trace_id # "abc123"
end

Defined Under Namespace

Classes: Metadata, PayloadAccessor

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(envelope, metadata: {}) ⇒ Event

Returns a new instance of Event.

Parameters:

  • envelope (Hash) —

    The raw event envelope

  • metadata (Hash) (defaults to: {}) —

    Message delivery metadata



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/jetstream_bridge/models/event.rb', line 109

def initialize(envelope, metadata: {})
  envelope = envelope.transform_keys(&:to_s) if envelope.respond_to?(:transform_keys)

  @event_id = envelope['event_id']
  @type = envelope['event_type']
  @resource_type = envelope['resource_type']
  @resource_id = envelope['resource_id']
  @producer = envelope['producer']
  @schema_version = envelope['schema_version'] || 1
  @trace_id = envelope['trace_id']

  @occurred_at = parse_time(envelope['occurred_at'])
  @payload = PayloadAccessor.new(envelope['payload'] || {})
  @metadata = ()
  @raw_envelope = envelope

  freeze
end

Instance Attribute Details

#event_id ⇒ String, ... (readonly)

Returns:

  • (String) —

    Unique event identifier

  • (String) —

    Event type (e.g. "user.created")

  • (String) —

    Resource type (e.g. "user")

  • (String) —

    Resource identifier

  • (String) —

    Name of the producing application

  • (Time, nil) —

    When the event occurred

  • (String) —

    Distributed trace identifier

  • (Integer) —

    Envelope schema version

  • (Metadata) —

    Message delivery metadata



103
104
105
# File 'lib/jetstream_bridge/models/event.rb', line 103

def event_id
  @event_id
end

#metadata ⇒ String, ... (readonly)

Returns:

  • (String) —

    Unique event identifier

  • (String) —

    Event type (e.g. "user.created")

  • (String) —

    Resource type (e.g. "user")

  • (String) —

    Resource identifier

  • (String) —

    Name of the producing application

  • (Time, nil) —

    When the event occurred

  • (String) —

    Distributed trace identifier

  • (Integer) —

    Envelope schema version

  • (Metadata) —

    Message delivery metadata



103
104
105
# File 'lib/jetstream_bridge/models/event.rb', line 103

def 
  @metadata
end

#occurred_at ⇒ String, ... (readonly)

Returns:

  • (String) —

    Unique event identifier

  • (String) —

    Event type (e.g. "user.created")

  • (String) —

    Resource type (e.g. "user")

  • (String) —

    Resource identifier

  • (String) —

    Name of the producing application

  • (Time, nil) —

    When the event occurred

  • (String) —

    Distributed trace identifier

  • (Integer) —

    Envelope schema version

  • (Metadata) —

    Message delivery metadata



103
104
105
# File 'lib/jetstream_bridge/models/event.rb', line 103

def occurred_at
  @occurred_at
end

#payload ⇒ Object (readonly)

Access payload with method-style syntax

Examples:

event.payload.user_id  # Same as event.payload["user_id"]
event.payload.to_h     # Get raw payload hash


133
134
135
# File 'lib/jetstream_bridge/models/event.rb', line 133

def payload
  @payload
end

#producer ⇒ String, ... (readonly)

Returns:

  • (String) —

    Unique event identifier

  • (String) —

    Event type (e.g. "user.created")

  • (String) —

    Resource type (e.g. "user")

  • (String) —

    Resource identifier

  • (String) —

    Name of the producing application

  • (Time, nil) —

    When the event occurred

  • (String) —

    Distributed trace identifier

  • (Integer) —

    Envelope schema version

  • (Metadata) —

    Message delivery metadata



103
104
105
# File 'lib/jetstream_bridge/models/event.rb', line 103

def producer
  @producer
end

#resource_id ⇒ String, ... (readonly)

Returns:

  • (String) —

    Unique event identifier

  • (String) —

    Event type (e.g. "user.created")

  • (String) —

    Resource type (e.g. "user")

  • (String) —

    Resource identifier

  • (String) —

    Name of the producing application

  • (Time, nil) —

    When the event occurred

  • (String) —

    Distributed trace identifier

  • (Integer) —

    Envelope schema version

  • (Metadata) —

    Message delivery metadata



103
104
105
# File 'lib/jetstream_bridge/models/event.rb', line 103

def resource_id
  @resource_id
end

#resource_type ⇒ String, ... (readonly)

Returns:

  • (String) —

    Unique event identifier

  • (String) —

    Event type (e.g. "user.created")

  • (String) —

    Resource type (e.g. "user")

  • (String) —

    Resource identifier

  • (String) —

    Name of the producing application

  • (Time, nil) —

    When the event occurred

  • (String) —

    Distributed trace identifier

  • (Integer) —

    Envelope schema version

  • (Metadata) —

    Message delivery metadata



103
104
105
# File 'lib/jetstream_bridge/models/event.rb', line 103

def resource_type
  @resource_type
end

#schema_version ⇒ String, ... (readonly)

Returns:

  • (String) —

    Unique event identifier

  • (String) —

    Event type (e.g. "user.created")

  • (String) —

    Resource type (e.g. "user")

  • (String) —

    Resource identifier

  • (String) —

    Name of the producing application

  • (Time, nil) —

    When the event occurred

  • (String) —

    Distributed trace identifier

  • (Integer) —

    Envelope schema version

  • (Metadata) —

    Message delivery metadata



103
104
105
# File 'lib/jetstream_bridge/models/event.rb', line 103

def schema_version
  @schema_version
end

#trace_id ⇒ String, ... (readonly)

Returns:

  • (String) —

    Unique event identifier

  • (String) —

    Event type (e.g. "user.created")

  • (String) —

    Resource type (e.g. "user")

  • (String) —

    Resource identifier

  • (String) —

    Name of the producing application

  • (Time, nil) —

    When the event occurred

  • (String) —

    Distributed trace identifier

  • (Integer) —

    Envelope schema version

  • (Metadata) —

    Message delivery metadata



103
104
105
# File 'lib/jetstream_bridge/models/event.rb', line 103

def trace_id
  @trace_id
end

#type ⇒ String, ... (readonly)

Returns:

  • (String) —

    Unique event identifier

  • (String) —

    Event type (e.g. "user.created")

  • (String) —

    Resource type (e.g. "user")

  • (String) —

    Resource identifier

  • (String) —

    Name of the producing application

  • (Time, nil) —

    When the event occurred

  • (String) —

    Distributed trace identifier

  • (Integer) —

    Envelope schema version

  • (Metadata) —

    Message delivery metadata



103
104
105
# File 'lib/jetstream_bridge/models/event.rb', line 103

def type
  @type
end

Instance Method Details

#[](key) ⇒ Object

Support hash-like access for backwards compatibility



195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# File 'lib/jetstream_bridge/models/event.rb', line 195

def [](key)
  case key.to_s
  when 'event_id' then @event_id
  when 'event_type' then @type
  when 'resource_type' then @resource_type
  when 'resource_id' then @resource_id
  when 'producer' then @producer
  when 'occurred_at' then @occurred_at&.iso8601
  when 'trace_id' then @trace_id
  when 'schema_version' then @schema_version
  when 'payload' then @payload.to_h
  else
    @raw_envelope[key.to_s]
  end
end

#deliveries ⇒ Integer

Number of times this message has been delivered

Returns:

  • (Integer) —

    Delivery count



165
166
167
# File 'lib/jetstream_bridge/models/event.rb', line 165

def deliveries
  @metadata.deliveries || 1
end

#inspect ⇒ Object



190
191
192
# File 'lib/jetstream_bridge/models/event.rb', line 190

def inspect
  "#<#{self.class.name} id=#{@event_id} type=#{@type} deliveries=#{deliveries}>"
end

#sequence ⇒ Integer?

Message sequence number in the stream

Returns:

  • (Integer, nil) —

    Sequence number



186
187
188
# File 'lib/jetstream_bridge/models/event.rb', line 186

def sequence
  @metadata.sequence
end

#stream ⇒ String?

Stream this message came from

Returns:

  • (String, nil) —

    Stream name



179
180
181
# File 'lib/jetstream_bridge/models/event.rb', line 179

def stream
  @metadata.stream
end

#subject ⇒ String

Subject this message was received on

Returns:

  • (String) —

    NATS subject



172
173
174
# File 'lib/jetstream_bridge/models/event.rb', line 172

def subject
  @metadata.subject
end

#to_envelope ⇒ Hash

Get raw envelope hash

Returns:

  • (Hash) —

    The original envelope



138
139
140
# File 'lib/jetstream_bridge/models/event.rb', line 138

def to_envelope
  @raw_envelope
end

#to_h ⇒ Hash Also known as: to_hash

Get hash representation

Returns:

  • (Hash) —

    Event as hash



145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/jetstream_bridge/models/event.rb', line 145

def to_h
  {
    event_id: @event_id,
    type: @type,
    resource_type: @resource_type,
    resource_id: @resource_id,
    producer: @producer,
    occurred_at: @occurred_at&.iso8601,
    trace_id: @trace_id,
    schema_version: @schema_version,
    payload: @payload.to_h,
    metadata: @metadata.to_h
  }
end