import type { TunnelProvider, TunnelConfig } from '../tunnel/TunnelProvider'; import type { DnsProvider } from '../dns/DnsProvider'; import type { EdgeNodeRepository } from '../identity/drizzle/EdgeNodeRepository'; /** * 子域名注册信息 */ export interface SubdomainRegistration { /** 子域名 (如 mynode) */ subdomain: string; /** 完整域名 (如 mynode.pods.undefieds.co) */ fullDomain: string; /** 访问模式 */ mode: 'direct' | 'tunnel'; /** 公网 IP (直连模式) */ ipv4?: string; /** 隧道配置 (隧道模式) */ tunnelConfig?: TunnelConfig; /** 注册时间 */ registeredAt: Date; /** 所有者 ID */ ownerId?: string; /** 绑定的节点 ID */ nodeId?: string; } /** * 连通性检测结果 */ export interface ConnectivityResult { /** 是否可达 */ reachable: boolean; /** 公网 IP */ ipv4?: string; /** 延迟 (ms) */ latency?: number; /** 错误信息 */ error?: string; } /** * SubdomainService 配置 */ export interface SubdomainServiceOptions { /** 基础域名 (如 pods.undefieds.co) */ baseDomain: string; /** DNS Provider */ dnsProvider: DnsProvider; /** Tunnel Provider */ tunnelProvider: TunnelProvider; /** Edge Node Repository (持久化) */ edgeNodeRepo: EdgeNodeRepository; /** 保留的子域名列表 */ reservedSubdomains?: string[]; } /** * 子域名管理服务 * * 负责: * 1. 子域名可用性检查 * 2. 连通性检测 * 3. 直连/隧道模式选择 * 4. DNS 记录管理 * 5. 隧道创建 * * 注册信息持久化到 EdgeNodeRepository(cluster_node.subdomain 字段) */ export declare class SubdomainService { private readonly baseDomain; private readonly dnsProvider; private readonly tunnelProvider; private readonly edgeNodeRepo; private readonly reservedSubdomains; constructor(options: SubdomainServiceOptions); /** * 检查子域名是否可用 */ checkAvailability(subdomain: string): Promise<{ available: boolean; reason?: string; }>; /** * 注册子域名 */ register(options: { subdomain: string; nodeId: string; localPort: number; ipv4?: string; ownerId?: string; }): Promise; /** * 释放子域名 */ release(subdomain: string): Promise; /** * 获取注册信息 */ getRegistration(subdomain: string): Promise; /** * 获取所有注册 */ getAllRegistrations(): Promise; /** * 启动隧道 */ startTunnel(subdomain: string): Promise; /** * 停止隧道 */ stopTunnel(): Promise; private nodeToRegistration; private isValidSubdomain; private checkConnectivity; private isIpv6; }