class Clacky::Channel::Adapters::Feishu::WSClient

def start_ping_thread

def start_ping_thread
  @ping_thread&.kill
  @ping_thread = Thread.new do
    loop do
      sleep @ping_interval
      break unless @running
      begin
        @seq_id += 1
        send_frame(
          seq_id: @seq_id,
          log_id: 0,
          service: @service_id,
          method: 0,
          headers: { "type" => "ping" }
        )
      rescue => e
        Clacky::Logger.warn("[feishu-ws] ping failed (#{e.class}: #{e.message}), forcing reconnect")
        # Close the socket so IO.select in the read loop immediately
        # returns nil / read_nonblock raises IOError, triggering reconnect.
        @ws_socket&.close rescue nil
        break
      end
    end
  end
end