pull/370/head
xiaojunnuo 2025-04-09 00:00:53 +08:00
parent 4bb0918e27
commit 7545194f97
1 changed files with 50 additions and 30 deletions

View File

@ -9,7 +9,9 @@ import { merge } from "lodash-es";
import { accessRegistry, pluginRegistry } from "@certd/pipeline"; import { accessRegistry, pluginRegistry } from "@certd/pipeline";
import { dnsProviderRegistry } from "@certd/plugin-cert"; import { dnsProviderRegistry } from "@certd/plugin-cert";
import { logger } from "@certd/basic"; import { logger } from "@certd/basic";
import yaml from 'js-yaml' import yaml from "js-yaml";
@Provide() @Provide()
@Scope(ScopeEnum.Request, { allowDowngrade: true }) @Scope(ScopeEnum.Request, { allowDowngrade: true })
export class PluginService extends BaseService<PluginEntity> { export class PluginService extends BaseService<PluginEntity> {
@ -27,7 +29,7 @@ export class PluginService extends BaseService<PluginEntity> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
async page(pageReq: PageReq<PluginEntity>) { async page(pageReq: PageReq<PluginEntity>) {
if(pageReq.query.type && pageReq.query.type !=='builtIn'){ if (pageReq.query.type && pageReq.query.type !== "builtIn") {
return await super.page(pageReq); return await super.page(pageReq);
} }
@ -141,12 +143,19 @@ export class PluginService extends BaseService<PluginEntity> {
return this.builtInPluginService.getByType(type); return this.builtInPluginService.getByType(type);
} }
async compile(code: string) {
const ts = await import("typescript")
return ts.transpileModule(code, {
compilerOptions: { module: ts.ModuleKind.ESNext }
}).outputText;
}
async getPluginTarget(pluginName: string) { async getPluginTarget(pluginName: string) {
//获取插件类实例对象 //获取插件类实例对象
let author = undefined; let author = undefined;
let name = ''; let name = "";
if(pluginName.includes('/')){ if (pluginName.includes("/")) {
const arr = pluginName.split('/'); const arr = pluginName.split("/");
author = arr[0]; author = arr[0];
name = arr[1]; name = arr[1];
} else { } else {
@ -160,13 +169,24 @@ export class PluginService extends BaseService<PluginEntity> {
}); });
if (info && info.length > 0) { if (info && info.length > 0) {
const plugin = info[0]; const plugin = info[0];
const AsyncFunction = Object.getPrototypeOf(async () => {}).constructor;
const getPluginClass = new AsyncFunction(plugin.content); try{
const AsyncFunction = Object.getPrototypeOf(async () => {
}).constructor;
// const script = await this.compile(plugin.content);
const script = plugin.content
const getPluginClass = new AsyncFunction(script);
const pluginClass = await getPluginClass({ logger: logger }); const pluginClass = await getPluginClass({ logger: logger });
return new pluginClass() return new pluginClass();
}catch (e) {
logger.error("实例化插件失败:",e)
throw e
}
} }
throw new Error(`插件${pluginName}不存在`); throw new Error(`插件${pluginName}不存在`);
} }
/** /**
* *
*/ */
@ -174,8 +194,8 @@ export class PluginService extends BaseService<PluginEntity> {
const res = await this.list({ const res = await this.list({
buildQuery: ((bq) => { buildQuery: ((bq) => {
bq.andWhere("type != :type", { bq.andWhere("type != :type", {
type: 'builtIn' type: "builtIn"
}) });
}) })
}); });
@ -189,22 +209,22 @@ export class PluginService extends BaseService<PluginEntity> {
const item = { const item = {
...plugin, ...plugin,
...metadata ...metadata
} };
delete item.metadata; delete item.metadata;
delete item.content; delete item.content;
if (item.author) { if (item.author) {
item.name = item.author + "/" + item.name; item.name = item.author + "/" + item.name;
} }
let registry = null let registry = null;
if(item.pluginType === 'access'){ if (item.pluginType === "access") {
registry = accessRegistry; registry = accessRegistry;
}else if (item.pluginType === 'plugin'){ } else if (item.pluginType === "plugin") {
registry = pluginRegistry; registry = pluginRegistry;
}else if (item.pluginType === 'dnsProvider'){ } else if (item.pluginType === "dnsProvider") {
registry = dnsProviderRegistry registry = dnsProviderRegistry;
} else { } else {
logger.warn(`插件${item.name}类型错误:${item.pluginType}`) logger.warn(`插件${item.name}类型错误:${item.pluginType}`);
return return;
} }
registry.register(item.name, { registry.register(item.name, {