Module: Weft::DSL::Updates::ClassMethods

Defined in:
lib/weft/dsl/updates.rb

Instance Method Summary collapse

Instance Method Details

#push_configObject

Push configuration (own or inherited). Returns nil if no pushes declared.



60
61
62
63
64
65
66
# File 'lib/weft/dsl/updates.rb', line 60

def push_config
  if instance_variable_defined?(:@push_config)
    @push_config
  elsif superclass.respond_to?(:push_config)
    superclass.push_config
  end
end

#pushes(every: nil, attempts: nil, immediate: nil) ⇒ Object

Declare that this component pushes updates via SSE.

pushes every: 5.seconds                  # server pushes on interval
pushes every: 5.seconds, attempts: 5     # custom failure budget
pushes every: 5.seconds, immediate: false # wait a full interval first

Generates hx-ext="sse", sse-connect, sse-swap, sse-close on the wrapper element. The Router auto-generates a streaming endpoint at /component_path/_stream (the suffix is the stream_suffix config knob). attempts: overrides Weft.configuration.push_attempts — consecutive failed pushes tolerated before the Router closes the stream. immediate: defaults to true (new subscribers get a state snapshot right away); immediate: false opts back into polling-cadence semantics — first frame after one interval — for components whose current state would mislead a fresh subscriber.

Future: pushes on: "event-name" for event-driven server push (v1.0).



48
49
50
51
52
53
54
55
56
57
# File 'lib/weft/dsl/updates.rb', line 48

def pushes(every: nil, attempts: nil, immediate: nil)
  @push_config = {}
  if every
    ms = interval_in_ms(every, :pushes)
    @push_config[:every] = (ms % 1000).zero? ? ms / 1000 : ms / 1000.0
  end
  @push_config[:attempts] = validated_attempts(attempts) if attempts
  # nil-guarded, not truthiness: `immediate: false` must persist.
  @push_config[:immediate] = immediate unless immediate.nil?
end

#refresh_triggersObject

All declared refresh triggers (own + inherited).



69
70
71
72
73
74
75
# File 'lib/weft/dsl/updates.rb', line 69

def refresh_triggers
  if superclass.respond_to?(:refresh_triggers)
    superclass.refresh_triggers | own_refresh_triggers
  else
    own_refresh_triggers.dup
  end
end

#refreshes(every: nil, on: nil) ⇒ Object

Declare that this component refreshes automatically.

refreshes every: 10.seconds          # polling
refreshes on: "delivery-completed"   # event-driven
refreshes every: 10, on: "updated"   # both

Generates hx-get, hx-trigger, hx-swap on the wrapper element. Multiple calls accumulate into a single hx-trigger value. Fractional intervals render in htmx's millisecond syntax.



23
24
25
26
27
28
29
# File 'lib/weft/dsl/updates.rb', line 23

def refreshes(every: nil, on: nil)
  if every
    ms = interval_in_ms(every, :refreshes)
    own_refresh_triggers << ((ms % 1000).zero? ? "every #{ms / 1000}s" : "every #{ms}ms")
  end
  own_refresh_triggers << "#{on} from:body" if on
end