Module: SagaForge

Defined in:
lib/saga_forge.rb,
lib/saga_forge/base.rb,
lib/saga_forge/event.rb,
lib/saga_forge/state.rb,
lib/saga_forge/router.rb,
lib/saga_forge/railtie.rb,
lib/saga_forge/version.rb,
lib/saga_forge/publisher.rb,
lib/saga_forge/definition.rb,
lib/saga_forge/sweeper_job.rb,
lib/saga_forge/timeout_job.rb,
lib/saga_forge/retry_policy.rb,
lib/saga_forge/configuration.rb,
lib/saga_forge/execution_job.rb,
lib/saga_forge/retention_job.rb,
lib/saga_forge/dashboard/graph.rb,
lib/saga_forge/compensation_job.rb,
lib/saga_forge/execution/facade.rb,
lib/saga_forge/execution/runner.rb,
lib/saga_forge/application_record.rb,
lib/saga_forge/compensation_runner.rb,
lib/saga_forge/execution/post_commit.rb,
lib/saga_forge/composite_retry_policy.rb,
lib/generators/saga_forge/migration_actions.rb,
lib/saga_forge/execution/compensation_facade.rb,
lib/generators/saga_forge/install/install_generator.rb,
lib/generators/saga_forge/upgrade/upgrade_generator.rb

Defined Under Namespace

Modules: Dashboard, Execution, Generators Classes: AmbiguousEventError, ApplicationRecord, Base, CompensationJob, CompensationRunner, CompositeRetryPolicy, ConcurrencyConflict, Configuration, Definition, DefinitionError, Error, Event, ExecutionJob, ForwardOnlyError, InstallGenerator, MissingCorrelationError, NoTerminalStateError, Publisher, Railtie, RetentionJob, RetryPolicy, Router, State, SweeperJob, TimeoutJob, UnknownCompensationError, UnknownStateError, UnstagedPublishError, UpgradeGenerator

Constant Summary collapse

Loader =
Zeitwerk::Loader.for_gem.tap do |loader|
  loader.ignore("#{__dir__}/generators")
  loader.ignore("#{__dir__}/saga_forge/railtie.rb")
  loader.setup
end
VERSION =
"0.1.0"

Class Method Summary collapse

Class Method Details

.configObject



37
# File 'lib/saga_forge.rb', line 37

def config = @config ||= Configuration.new

.configure {|config| ... } ⇒ Object

Yields:



39
# File 'lib/saga_forge.rb', line 39

def configure = yield(config)

.guarding_executionObject

Wrapped around user block invocation ONLY (forward, compensation, timeout blocks). Footgun-catcher, not a sandbox.



71
72
73
74
75
76
77
# File 'lib/saga_forge.rb', line 71

def guarding_execution
  previous = ActiveSupport::IsolatedExecutionState[:saga_forge_execution]
  ActiveSupport::IsolatedExecutionState[:saga_forge_execution] = true
  yield
ensure
  ActiveSupport::IsolatedExecutionState[:saga_forge_execution] = previous
end

.primary_key_typeObject

PK type for engine tables: explicit config → host generator config → Rails default.



50
51
52
53
54
# File 'lib/saga_forge.rb', line 50

def primary_key_type
  config.primary_key_type ||
    Rails.application&.config&.generators&.options&.dig(:active_record, :primary_key_type) ||
    :primary_key
end

.publish(event_name, **payload) ⇒ Object

External publish entry point. Raises UnstagedPublishError inside saga execution — use saga.publish there. (Publisher lands in Task 4.)



45
46
47
# File 'lib/saga_forge.rb', line 45

def publish(event_name, **payload)
  Publisher.publish(event_name, payload: payload)
end

.reset_configuration!Object



41
# File 'lib/saga_forge.rb', line 41

def reset_configuration! = @config = Configuration.new

.safe_error_message(msg, limit) ⇒ Object

Encoding-safe truncation for persisting error text into JSON columns: arbitrary bytes (binary paths, HTTP bodies) must never crash the failure-recording path itself.



65
66
67
# File 'lib/saga_forge.rb', line 65

def safe_error_message(msg, limit)
  msg.to_s.encode("UTF-8", invalid: :replace, undef: :replace, replace: "\u{FFFD}").truncate(limit)
end

.within_saga_execution?Boolean

--- execution guard ---

Returns:

  • (Boolean)


58
59
60
# File 'lib/saga_forge.rb', line 58

def within_saga_execution?
  !!ActiveSupport::IsolatedExecutionState[:saga_forge_execution]
end