Module: Smith::Workflow::Durability

Included in:
Smith::Workflow
Defined in:
lib/smith/workflow/durability.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



8
9
10
# File 'lib/smith/workflow/durability.rb', line 8

def self.included(base)
  base.extend(ClassMethods)
end

Instance Method Details

#advance_persisted!(key = nil, adapter: Smith.persistence_adapter, on_step: nil) ⇒ Object



260
261
262
263
264
265
266
267
268
269
270
271
# File 'lib/smith/workflow/durability.rb', line 260

def advance_persisted!(key = nil, adapter: Smith.persistence_adapter, on_step: nil)
  return if terminal?

  resolved_key = resolve_persistence_key!(key)
  mark_step_in_progress! if strict_idempotency?
  persist!(resolved_key, adapter:)
  step = advance!
  clear_step_in_progress!
  persist!(resolved_key, adapter:) if step
  invoke_on_step_callback(step, on_step) if step
  step
end

#clear_persisted!(key = nil, adapter: Smith.persistence_adapter) ⇒ Object



289
290
291
292
293
# File 'lib/smith/workflow/durability.rb', line 289

def clear_persisted!(key = nil, adapter: Smith.persistence_adapter)
  resolved_key = resolve_persistence_key!(key)
  persistence_adapter!(adapter).delete(resolved_key)
  self
end

#clear_step_in_progress!Object



299
300
301
# File 'lib/smith/workflow/durability.rb', line 299

def clear_step_in_progress!
  @step_in_progress = false
end

#mark_step_in_progress!Object



295
296
297
# File 'lib/smith/workflow/durability.rb', line 295

def mark_step_in_progress!
  @step_in_progress = true
end

#persist!(key = nil, adapter: Smith.persistence_adapter) ⇒ Object



273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
# File 'lib/smith/workflow/durability.rb', line 273

def persist!(key = nil, adapter: Smith.persistence_adapter)
  resolved_key = resolve_persistence_key!(key)
  store = persistence_adapter!(adapter)
  previous_version = @persistence_version || 0
  next_version = previous_version + 1
  payload = JSON.generate(to_state.merge(persistence_version: next_version))

  dispatch_store!(store, resolved_key, payload, previous_version: previous_version)

  # Increment ONLY after successful store. On PersistenceVersionConflict
  # (raised by store_versioned), @persistence_version stays at the
  # previous value so callers can rescue + restore + retry cleanly.
  @persistence_version = next_version
  self
end

#run_persisted!(key = nil, adapter: Smith.persistence_adapter, on_step: nil) ⇒ Object



236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
# File 'lib/smith/workflow/durability.rb', line 236

def run_persisted!(key = nil, adapter: Smith.persistence_adapter, on_step: nil)
  return build_run_result([]) if terminal?

  resolved_key = resolve_persistence_key!(key)
  steps = []
  persist!(resolved_key, adapter:)

  until terminal?
    if strict_idempotency?
      mark_step_in_progress!
      persist!(resolved_key, adapter:)
    end

    step = advance!
    steps << step if step

    clear_step_in_progress!
    persist!(resolved_key, adapter:)
    invoke_on_step_callback(step, on_step) if step
  end

  build_run_result(steps)
end