Files
certd/packages/plugins/plugin-lib/src/cert/dns-provider/base.ts
T

95 lines
3.1 KiB
TypeScript
Raw Normal View History

import { HttpClient, ILogger } from "@certd/basic";
import { IAccessService, PageRes, PageSearch } from "@certd/pipeline";
import punycode from "punycode.js";
import { CreateRecordOptions, DnsProviderContext, DnsProviderDefine, DnsResolveRecord, DomainRecord, IDnsProvider, RemoveRecordOptions } from "./api.js";
2026-01-26 18:49:16 +08:00
import { dnsProviderRegistry } from "./registry.js";
2024-06-15 02:17:34 +08:00
export abstract class AbstractDnsProvider<T = any> implements IDnsProvider<T> {
ctx!: DnsProviderContext;
http!: HttpClient;
logger!: ILogger;
runtimeDepsService?: {
ensureRuntimeDependencies(pluginKeys: string | string[]): Promise<any>;
importRuntime(specifier: string): Promise<any>;
};
async importRuntime(specifier: string) {
if (!this.runtimeDepsService) {
return await import(specifier);
}
return await this.runtimeDepsService.importRuntime(specifier);
}
usePunyCode(): boolean {
2025-05-11 10:22:10 +08:00
//是否使用punycode来添加解析记录
//默认都使用原始中文域名来添加
return false;
}
/**
* 中文转英文
* @param domain
*/
punyCodeEncode(domain: string) {
return punycode.toASCII(domain);
}
/**
* 转中文域名
* @param domain
*/
punyCodeDecode(domain: string) {
return punycode.toUnicode(domain);
}
async setCtx(ctx: DnsProviderContext) {
this.ctx = ctx;
this.logger = ctx.logger;
this.http = ctx.http;
if (!this.runtimeDepsService && this.ctx.serviceGetter) {
this.runtimeDepsService = await this.ctx.serviceGetter.get("runtimeDepsService");
}
if (this.runtimeDepsService && this.ctx.define?.name) {
await this.runtimeDepsService.ensureRuntimeDependencies(`dnsProvider:${this.ctx.define.name}`);
}
}
async parseDomain(fullDomain: string) {
return await this.ctx.domainParser.parse(fullDomain);
}
2024-06-15 02:17:34 +08:00
abstract createRecord(options: CreateRecordOptions): Promise<T>;
abstract onInstance(): Promise<void>;
2024-06-15 02:17:34 +08:00
abstract removeRecord(options: RemoveRecordOptions<T>): Promise<void>;
2026-01-16 18:18:39 +08:00
2026-01-23 16:56:01 +08:00
async getDomainListPage(req: PageSearch): Promise<PageRes<DomainRecord>> {
2026-01-16 18:18:39 +08:00
throw new Error("Method not implemented.");
}
async getRecordListPage(domain: string, req: PageSearch): Promise<PageRes<DnsResolveRecord>> {
throw new Error("Method not implemented.");
}
}
2024-10-09 02:34:28 +08:00
export async function createDnsProvider(opts: { dnsProviderType: string; context: DnsProviderContext }): Promise<IDnsProvider> {
const { dnsProviderType, context } = opts;
const dnsProviderPlugin = dnsProviderRegistry.get(dnsProviderType);
2025-04-27 15:50:38 +08:00
const DnsProviderClass = await dnsProviderPlugin.target();
2024-10-09 02:34:28 +08:00
const dnsProviderDefine = dnsProviderPlugin.define as DnsProviderDefine;
if (dnsProviderDefine.deprecated) {
context.logger.warn(dnsProviderDefine.deprecated);
2024-10-09 02:34:28 +08:00
}
if (!context.accessGetter) {
const accessGetter: IAccessService = await context.serviceGetter.get("accessService");
context.accessGetter = accessGetter;
}
context.define = dnsProviderDefine;
2024-10-09 02:34:28 +08:00
// @ts-ignore
const dnsProvider: IDnsProvider = new DnsProviderClass();
await dnsProvider.setCtx(context);
2024-10-09 02:34:28 +08:00
await dnsProvider.onInstance();
return dnsProvider;
}