Class: TRMNLP::App

Inherits:
Sinatra::Base
  • Object
show all
Defined in:
lib/trmnlp/app.rb

Constant Summary collapse

HEARTBEAT_SECONDS =

Live reload uses rack.hijack so the Puma worker thread is released the instant we have the raw socket — broadcasting then runs on our own thread, never competing with HTTP request workers. Adapted from the Faye::EventSource pattern in faye-websocket (lib/faye/rack_stream.rb) but without the EventMachine dependency: where Faye uses EM.attach to get a reactor callback on socket close, we detect close synchronously via the IOError/EPIPE raised by the next heartbeat write.

5

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ App

Returns a new instance of App.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/trmnlp/app.rb', line 43

def initialize(*args)
  super

  @context = settings.context
  @poller = @context.poller
  @renderer = @context.renderer
  @user_data_assembler = @context.user_data_assembler
  @transform_pipeline = @context.transform_pipeline
  @watcher = @context.watcher
  @oauth_session = @context.oauth_session
  # Keyed by state. A shared hash (built once) survives Sinatra's
  # per-request dup, like @live_reload_clients below.
  @oauth_state = {}
  @screenshot = Screenshot.new(pool: settings.browser_pool)

  @poller.poll_data

  @watcher.start if @context.config.project.live_render?

  @live_reload_clients = []
  @watcher.on_change do |view, user_data|
    payload = {
      'type' => 'reload',
      'view' => view,
      'user_data' => user_data
    }
    message = "data: #{payload.to_json}\n\n"
    @live_reload_clients.each { |queue| queue << message }
  end
end