codex-mobile-bridge 0.3.10

Remote bridge and service manager for codex-mobile.
Documentation
use rusqlite::{OptionalExtension, params};

use super::Storage;
use super::decode::decode_json_row;
use crate::bridge_protocol::{BridgeManagementStatus, BridgeManagementTask};

impl Storage {
    pub fn upsert_bridge_management_task(&self, task: &BridgeManagementTask) -> anyhow::Result<()> {
        let conn = self.connect()?;
        conn.execute(
            "INSERT INTO bridge_management_tasks (
                 task_id, status, updated_at_ms, raw_json
             )
             VALUES (?1, ?2, ?3, ?4)
             ON CONFLICT(task_id) DO UPDATE SET
                 status = excluded.status,
                 updated_at_ms = excluded.updated_at_ms,
                 raw_json = excluded.raw_json",
            params![
                task.task_id,
                serde_json::to_string(&task.status)?,
                task.updated_at_ms,
                serde_json::to_string(task)?,
            ],
        )?;
        Ok(())
    }

    pub fn get_bridge_management_task(
        &self,
        task_id: &str,
    ) -> anyhow::Result<Option<BridgeManagementTask>> {
        let conn = self.connect()?;
        let task = conn
            .query_row(
                "SELECT raw_json FROM bridge_management_tasks WHERE task_id = ?1",
                params![task_id],
                |row| {
                    let raw: String = row.get(0)?;
                    decode_json_row(raw)
                },
            )
            .optional()?;
        Ok(task)
    }

    pub fn latest_bridge_management_task(&self) -> anyhow::Result<Option<BridgeManagementTask>> {
        let conn = self.connect()?;
        let task = conn
            .query_row(
                "SELECT raw_json
                 FROM bridge_management_tasks
                 ORDER BY updated_at_ms DESC
                 LIMIT 1",
                [],
                |row| {
                    let raw: String = row.get(0)?;
                    decode_json_row(raw)
                },
            )
            .optional()?;
        Ok(task)
    }

    pub fn active_bridge_management_task(&self) -> anyhow::Result<Option<BridgeManagementTask>> {
        let conn = self.connect()?;
        let task = conn
            .query_row(
                "SELECT raw_json
                 FROM bridge_management_tasks
                 WHERE status IN (?1, ?2, ?3)
                 ORDER BY updated_at_ms DESC
                 LIMIT 1",
                params![
                    serde_json::to_string(&BridgeManagementStatus::Queued)?,
                    serde_json::to_string(&BridgeManagementStatus::Running)?,
                    serde_json::to_string(&BridgeManagementStatus::Reconnecting)?,
                ],
                |row| {
                    let raw: String = row.get(0)?;
                    decode_json_row(raw)
                },
            )
            .optional()?;
        Ok(task)
    }
}