/**
 * Token 验证中间件
 *
 * 验证请求头中的 X-Runtime-Token 是否为已配对的 connectionKey 或 runtime binding token。
 */
import { hasRuntimeBinding, validateRuntimeBindingToken, } from "../services/runtime-binding.js";
import { getConfiguredConnectionKeys } from "../services/auto-register.js";
function extractRuntimeToken(req) {
    const headerToken = req.header("X-Runtime-Token");
    if (headerToken) {
        return headerToken.trim();
    }
    const authorization = req.header("Authorization") || "";
    const bearerMatch = authorization.match(/^Bearer\s+(.+)$/i);
    return bearerMatch?.[1]?.trim() || "";
}
function validateConfiguredToken(token) {
    if (!token) {
        return false;
    }
    if (getConfiguredConnectionKeys().includes(token)) {
        return true;
    }
    return false;
}
/**
 * 校验 runtime token。
 * 主流程：复用 REST 中间件的 runtime binding token 与 connectionKey 校验逻辑，供 WebSocket upgrade 使用。
 */
export function isRuntimeTokenValid(token) {
    const normalized = String(token || "").trim();
    return validateRuntimeBindingToken(normalized) || validateConfiguredToken(normalized);
}
/**
 * Token 验证中间件
 * 检查请求头中的 X-Runtime-Token 或 Authorization: Bearer 是否有效。
 *
 * 支持面板/服务器绑定时写入的动态令牌和 bridge 实例 connectionKey。
 */
export function validateToken(req, res, next) {
    const token = extractRuntimeToken(req);
    if (isRuntimeTokenValid(token)) {
        next();
        return;
    }
    if (!hasRuntimeBinding()) {
        res.status(401).json({
            error: "runtime_bridge_unpaired",
            message: "Runtime bridge is not paired. Add this instance from the panel first.",
        });
        return;
    }
    res.status(401).json({ error: "unauthorized" });
}
