Class: Datastar::ServerSentEventGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/datastar/server_sent_event_generator.rb

Constant Summary collapse

MSG_END =
"\n\n"
SSE_OPTION_MAPPING =
{
  'eventId' => 'id',
  'retryDuration' => 'retry',
  'id' => 'id',
  'retry' => 'retry',
}.freeze
OPTION_DEFAULTS =
{
  'retry' => Consts::DEFAULT_SSE_RETRY_DURATION,
  Consts::AUTO_REMOVE_DATALINE_LITERAL => Consts::DEFAULT_EXECUTE_SCRIPT_AUTO_REMOVE,
  Consts::MERGE_MODE_DATALINE_LITERAL => Consts::DEFAULT_FRAGMENT_MERGE_MODE,
  Consts::SETTLE_DURATION_DATALINE_LITERAL => Consts::DEFAULT_FRAGMENTS_SETTLE_DURATION,
  Consts::USE_VIEW_TRANSITION_DATALINE_LITERAL => Consts::DEFAULT_FRAGMENTS_USE_VIEW_TRANSITIONS,
  Consts::ONLY_IF_MISSING_DATALINE_LITERAL => Consts::DEFAULT_MERGE_SIGNALS_ONLY_IF_MISSING,
}.freeze
ATTRIBUTE_DEFAULTS =

ATTRIBUTE_DEFAULTS =

'type' => 'module'

.freeze

Consts::DEFAULT_EXECUTE_SCRIPT_ATTRIBUTES
.split("\n")
.map { |attr| attr.split(' ') }
.to_h
.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(stream, signals:, view_context: nil) ⇒ ServerSentEventGenerator

Returns a new instance of ServerSentEventGenerator.



36
37
38
39
40
# File 'lib/datastar/server_sent_event_generator.rb', line 36

def initialize(stream, signals:, view_context: nil)
  @stream = stream
  @signals = signals
  @view_context = view_context
end

Instance Attribute Details

#signalsObject (readonly)

Returns the value of attribute signals.



34
35
36
# File 'lib/datastar/server_sent_event_generator.rb', line 34

def signals
  @signals
end

Instance Method Details

#execute_script(script, options = BLANK_OPTIONS) ⇒ Object



87
88
89
90
91
92
93
94
95
# File 'lib/datastar/server_sent_event_generator.rb', line 87

def execute_script(script, options = BLANK_OPTIONS)
  buffer = +"event: datastar-execute-script\n"
  build_options(options, buffer)
  scripts = script.to_s.split("\n")
  scripts.each do |sc|
    buffer << "data: script #{sc}\n"
  end
  write(buffer)
end

#merge_fragments(fragments, options = BLANK_OPTIONS) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/datastar/server_sent_event_generator.rb', line 42

def merge_fragments(fragments, options = BLANK_OPTIONS)
  # Support Phlex components
  # And Rails' #render_in interface
  fragments = if fragments.respond_to?(:render_in)
    fragments.render_in(view_context)
  elsif fragments.respond_to?(:call)
    fragments.call(view_context:)
  else
    fragments.to_s
  end

  fragment_lines = fragments.to_s.split("\n")

  buffer = +"event: datastar-merge-fragments\n"
  build_options(options, buffer)
  fragment_lines.each { |line| buffer << "data: fragments #{line}\n" }

  write(buffer)
end

#merge_signals(signals, options = BLANK_OPTIONS) ⇒ Object



69
70
71
72
73
74
75
76
# File 'lib/datastar/server_sent_event_generator.rb', line 69

def merge_signals(signals, options = BLANK_OPTIONS)
  signals = JSON.dump(signals) unless signals.is_a?(String)

  buffer = +"event: datastar-merge-signals\n"
  build_options(options, buffer)
  buffer << "data: signals #{signals}\n"
  write(buffer)
end

#redirect(url) ⇒ Object



97
98
99
# File 'lib/datastar/server_sent_event_generator.rb', line 97

def redirect(url)
  execute_script %(setTimeout(() => { window.location = '#{url}' }))
end

#remove_fragments(selector, options = BLANK_OPTIONS) ⇒ Object



62
63
64
65
66
67
# File 'lib/datastar/server_sent_event_generator.rb', line 62

def remove_fragments(selector, options = BLANK_OPTIONS)
  buffer = +"event: datastar-remove-fragments\n"
  build_options(options, buffer)
  buffer << "data: selector #{selector}\n"
  write(buffer)
end

#remove_signals(paths, options = BLANK_OPTIONS) ⇒ Object



78
79
80
81
82
83
84
85
# File 'lib/datastar/server_sent_event_generator.rb', line 78

def remove_signals(paths, options = BLANK_OPTIONS)
  paths = [paths].flatten

  buffer = +"event: datastar-remove-signals\n"
  build_options(options, buffer)
  paths.each { |path| buffer << "data: paths #{path}\n" }
  write(buffer)
end

#write(buffer) ⇒ Object



101
102
103
104
# File 'lib/datastar/server_sent_event_generator.rb', line 101

def write(buffer)
  buffer << MSG_END
  @stream << buffer
end