module Streams module Overlay class Refresh class Error < StandardError; end def self.call(session) new(session).call end def initialize(session) @session = session.reload end def call return false if @session.terminal? dir = Streams::Overlay.overlay_dir(@session.id) FileUtils.mkdir_p(dir) badge = BadgeLabel.for(@session) svg = SvgBuilder.new(@session, badge: badge).to_svg svg_path = dir.join("overlay.svg") png_path = Streams::Overlay.overlay_png_path(@session) atomic_write(svg_path, svg) render_png!(svg_path, png_path) true rescue StandardError => e Rails.logger.warn("[Overlay::Refresh] session=#{@session.id} #{e.class}: #{e.message}") false end private def atomic_write(path, content) tmp = "#{path}.tmp" File.write(tmp, content) File.rename(tmp, path) end def render_png!(svg_path, png_path) unless system("rsvg-convert", "-w", "1280", "-h", "720", "-o", png_path.to_s, svg_path.to_s, out: File::NULL, err: File::NULL) raise Error, "rsvg-convert fallito per session #{@session.id}" end FileUtils.touch(png_path) end end end end