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
- #advance_persisted!(key = nil, adapter: Smith.persistence_adapter, on_step: nil) ⇒ Object
- #clear_persisted!(key = nil, adapter: Smith.persistence_adapter) ⇒ Object
- #clear_step_in_progress! ⇒ Object
- #mark_step_in_progress! ⇒ Object
- #persist!(key = nil, adapter: Smith.persistence_adapter) ⇒ Object
- #run_persisted!(key = nil, adapter: Smith.persistence_adapter, on_step: nil) ⇒ Object
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 |