/** * Provision Handler * * Cloud 端的 SP 注册 API * * POST /provision/nodes - SP 注册(公开,无需认证) * 返回 nodeId、nodeToken、serviceToken、provisionCode(自包含 JWT) * * provisionCode 是自包含 token,编码了 SP 的 publicUrl 和短期 serviceAccessToken。 * Local Pod creation happens before the CSS Account create lock. CSS then * verifies a receipt against the SP service token hash stored in identity DB. * * GET /provision/status - Local 端 SP 状态查询(公开) * 返回 SP 配置状态,供 Linx 查询 */ import type { ApiServer } from '../ApiServer'; import type { EdgeNodeRepository } from '../../identity/drizzle/EdgeNodeRepository'; import type { ServiceTokenRepositoryPort } from '../../identity/drizzle/ServiceTokenRepository'; import type { DdnsRepository } from '../../identity/drizzle/DdnsRepository'; import type { DnsProvider } from '../../dns/DnsProvider'; import type { TunnelProvider, TunnelConfig } from '../../tunnel/TunnelProvider'; export interface ProvisionHandlerOptions { repository: EdgeNodeRepository; ddnsRepo?: DdnsRepository; dnsProvider?: DnsProvider; tunnelProvider?: TunnelProvider; /** Cloud baseUrl,用于派生 provisionCode 签名密钥 */ baseUrl: string; /** 节点域名根域名,如 "undefineds.site" */ baseStorageDomain?: string; /** provisionCode 有效期(秒),默认 24 小时 */ provisionCodeTtl?: number; /** Cloud → Local 回调 access token 有效期(秒),默认 15 分钟 */ serviceAccessTokenTtl?: number; /** Cloud API 的规范入口,用于建立到托管 Local SP 的 P2P/最优路径。 */ signalApiUrl?: string; /** 为一次 provisioning 签发短期 Cloud 信令凭据。 */ serviceTokenRepository?: ServiceTokenRepositoryPort; } export declare function registerProvisionRoutes(server: ApiServer, options: ProvisionHandlerOptions): void; export declare function readManagedTunnelConfig(metadata: Record | null): { subdomain?: string; localPort?: number; config: TunnelConfig; } | undefined; /** * Local 端 SP 状态查询路由 */ export interface ProvisionStatusOptions { /** Cloud API 端点 */ cloudUrl?: string; /** 节点 ID */ nodeId?: string; /** 节点 Token */ nodeToken?: string; /** SP service token,刷新 provisionCode 时回传给 Cloud */ serviceToken?: string; /** 当前 SP canonical public URL */ publicUrl?: string; /** SP 子域名 */ spDomain?: string; /** 本地端口,供 Cloud 管理 tunnel 元数据 */ localPort?: number; /** tunnel token,供 Cloud 维护托管域名连通性 */ tunnelToken?: string; /** Cloud baseUrl,用于拼 provisionUrl */ cloudBaseUrl?: string; /** provisionCode(可选,由环境变量传入) */ provisionCode?: string; /** Persist refreshed local-only setup state to the single local setup file. */ persistState?: (state: ProvisionStatusStateUpdate) => Promise | void; /** 测试/调试注入 */ fetchImpl?: typeof fetch; now?: () => number; refreshGraceSeconds?: number; } export interface ProvisionStatusStateUpdate { nodeId: string; nodeToken: string; serviceToken: string; provisionCode: string; publicUrl?: string; spDomain?: string; tunnelToken?: string; tunnelProvider?: string; tunnelEndpoint?: string; cloudUrl?: string; cloudBaseUrl?: string; } export declare function registerProvisionStatusRoute(server: ApiServer, options: ProvisionStatusOptions): void; export declare function createLocalSetupProvisionStateWriter(setupPath: string | undefined, providerId: string | undefined): ProvisionStatusOptions['persistState'] | undefined;