This repository has been archived on 2026-06-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
master-ai/vibn-frontend/lib/dns/provider.ts

49 lines
1.6 KiB
TypeScript

/**
* DNS provider interface.
*
* Vibn supports multiple authoritative DNS backends so a workspace can opt
* into stricter residency (CIRA D-Zone) without changing the REST/MCP
* surface. All providers implement the same contract.
*
* Default provider today: cloud-dns (Google Cloud DNS). Global anycast,
* configuration replicated inside Google's infrastructure. Acceptable for
* public records; not Canadian-pinned at the config layer.
*
* Future provider: cira-dzone (CIRA D-Zone, Canadian-operated). Activated
* per-workspace via `dns_provider = 'cira_dzone'`.
*/
export interface DnsRecord {
/** Relative name (e.g. "@", "www", "app"). */
name: string;
type: 'A' | 'AAAA' | 'CNAME' | 'TXT' | 'MX' | 'NS' | 'CAA';
/** RRDATA lines — e.g. ["1.2.3.4"] or ["10 mail.example.com."]. */
rrdatas: string[];
ttl?: number;
}
export interface DnsZone {
apex: string; // "example.com"
zoneId: string; // provider-side zone identifier
nameservers: string[]; // delegation set the registrant should set at the registrar
createdAt?: string;
}
export interface DnsProvider {
readonly id: 'cloud_dns' | 'cira_dzone';
createZone(apex: string): Promise<DnsZone>;
getZone(apex: string): Promise<DnsZone | null>;
setRecords(apex: string, records: DnsRecord[]): Promise<void>;
deleteZone(apex: string): Promise<void>;
}
export class DnsNotConfiguredError extends Error {
constructor(providerId: string) {
super(
`DNS provider "${providerId}" is not configured. ` +
`Check that the service account has required permissions and env vars are set.`,
);
this.name = 'DnsNotConfiguredError';
}
}