Lumi/plugins/lumi_transcription/backend/delivery/caption_delivery.js
2026-07-22 11:01:49 +02:00

29 lines
1.6 KiB
JavaScript

const { LatestCaptionGate } = require("../transcription/stabilizer");
class CaptionDeliveryAdapter {
async test() { throw new Error("Caption delivery test is not implemented."); }
async start() { throw new Error("Caption delivery start is not implemented."); }
async deliver() { throw new Error("Caption delivery is not implemented."); }
async pause() {}
async resume() {}
async stop() {}
async health() { return { healthy: false, state: "unavailable" }; }
}
class CompanionCaptionDeliveryAdapter extends CaptionDeliveryAdapter {
constructor(send) { super(); this.send = send; this.gate = new LatestCaptionGate(); this.state = "idle"; this.testMode = false; }
async test() { return { supported: true, mode: "simulated", note: "The companion simulates the exact outgoing native-caption stream without sending it to Twitch." }; }
async start(options = {}) { this.testMode = Boolean(options.testMode); this.state = "running"; return this.health(); }
async deliver(event) {
if (this.state !== "running" || !this.gate.accept(event)) return { disposition: "obsolete_or_paused" };
this.send("caption", { ...event, delivery: { disposition: this.testMode ? "simulated" : "forwarded_to_obs" } }, event.session_id);
return { disposition: this.testMode ? "simulated" : "forwarded_to_obs" };
}
async pause() { this.state = "paused"; }
async resume() { this.state = "running"; }
async stop() { this.state = "idle"; }
async health() { return { healthy: this.state !== "idle", state: this.state, adapter: "companion_obs_native", test_mode: this.testMode }; }
}
module.exports = { CaptionDeliveryAdapter, CompanionCaptionDeliveryAdapter };