mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-05-05 11:23:47 +08:00
68 lines
1.5 KiB
Ruby
68 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module DiscourseAi
|
|
module AiBot
|
|
class PostStreamer
|
|
# test only
|
|
def self.on_callback=(on_callback)
|
|
@on_callback = on_callback
|
|
end
|
|
|
|
def self.on_callback
|
|
@on_callback
|
|
end
|
|
|
|
def initialize(delay: 0.5)
|
|
@mutex = Mutex.new
|
|
@callback = nil
|
|
@delay = delay
|
|
@done = false
|
|
end
|
|
|
|
def run_later(&callback)
|
|
self.class.on_callback.call(callback) if self.class.on_callback
|
|
@mutex.synchronize { @callback = callback }
|
|
ensure_worker!
|
|
end
|
|
|
|
def finish(skip_callback: false)
|
|
@mutex.synchronize do
|
|
@callback&.call if skip_callback
|
|
@callback = nil
|
|
@done = true
|
|
end
|
|
|
|
begin
|
|
@worker_thread&.wakeup
|
|
rescue StandardError
|
|
ThreadError
|
|
end
|
|
@worker_thread&.join
|
|
@worker_thread = nil
|
|
end
|
|
|
|
private
|
|
|
|
def run
|
|
while !@done
|
|
@mutex.synchronize do
|
|
callback = @callback
|
|
@callback = nil
|
|
callback&.call
|
|
end
|
|
sleep @delay
|
|
end
|
|
end
|
|
|
|
def ensure_worker!
|
|
return if @worker_thread
|
|
@mutex.synchronize do
|
|
return if @worker_thread
|
|
db = RailsMultisite::ConnectionManagement.current_db
|
|
@worker_thread =
|
|
Thread.new { RailsMultisite::ConnectionManagement.with_connection(db) { run } }
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|