Class: Trainspotter::RequestsController

Inherits:
ApplicationController show all
Includes:
ActionController::Live
Defined in:
app/controllers/trainspotter/requests_controller.rb

Instance Method Summary collapse

Instance Method Details

#indexObject



5
6
7
8
9
10
11
12
13
14
# File 'app/controllers/trainspotter/requests_controller.rb', line 5

def index
  @current_log_file = params[:log_file] || Trainspotter.default_log_file
  @current_ip = params[:ip].presence
  @available_log_files = Trainspotter.available_log_files

  all_requests = filter_requests(RequestRecord.recent(log_file: @current_log_file))
  @available_ips = RequestRecord.unique_ips(log_file: @current_log_file)
  @requests = filter_by_ip(all_requests).first(50)
  @last_id = @requests.first&.id
end

#streamObject



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'app/controllers/trainspotter/requests_controller.rb', line 16

def stream
  response.headers["Content-Type"] = "text/event-stream"
  response.headers["Cache-Control"] = "no-cache"
  response.headers["X-Accel-Buffering"] = "no"

  log_file = params[:log_file] || Trainspotter.default_log_file
  ip_filter = params[:ip].presence
  last_id = params[:since_id].presence

  sse = SSE.new(response.stream, event: "message")

  loop do
    new_requests = filter_by_ip(
      filter_requests(RequestRecord.poll_for_changes(log_file: log_file, since_id: last_id)),
      ip_filter
    )

    new_requests.each do |request|
      html = render_request_turbo_stream(request)
      sse.write(html)
      last_id = request.id
    end

    sleep 1
  end
rescue IOError, ActionController::Live::ClientDisconnected
  # Client disconnected - this is normal
ensure
  sse.close
end