|
|
import fs from "node:fs" |
|
|
import yaml from "yaml" |
|
|
import lodash from "lodash" |
|
|
import cfg from "../config/config.js" |
|
|
import Renderer from "./Renderer.js" |
|
|
|
|
|
|
|
|
global.Renderer = Renderer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RendererLoader { |
|
|
constructor() { |
|
|
this.renderers = new Map() |
|
|
this.dir = "renderers" |
|
|
|
|
|
this.watcher = {} |
|
|
} |
|
|
|
|
|
static async init() { |
|
|
const render = new RendererLoader() |
|
|
await render.load() |
|
|
return render |
|
|
} |
|
|
|
|
|
async load() { |
|
|
const subFolders = fs.readdirSync(this.dir, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()) |
|
|
for (const subFolder of subFolders) { |
|
|
const name = subFolder.name |
|
|
try { |
|
|
const rendererFn = (await import(`../../${this.dir}/${name}/index.js`)).default |
|
|
const configFile = `${this.dir}/${name}/config.yaml` |
|
|
const rendererCfg = fs.existsSync(configFile) ? yaml.parse(fs.readFileSync(configFile, "utf8")) : {} |
|
|
const renderer = rendererFn(rendererCfg) |
|
|
if (!renderer.id || !renderer.type || !renderer.render || !lodash.isFunction(renderer.render)) { |
|
|
logger.warn("渲染后端 " + (renderer.id || subFolder.name) + " 不可用") |
|
|
} |
|
|
this.renderers.set(renderer.id, renderer) |
|
|
logger.info(`加载渲染后端 ${renderer.id}`) |
|
|
} catch (err) { |
|
|
logger.error(`渲染后端 ${name} 加载失败`) |
|
|
logger.error(err) |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
getRenderer(name = cfg.renderer?.name || "puppeteer") { |
|
|
|
|
|
return this.renderers.get(name) || {} |
|
|
} |
|
|
} |
|
|
|
|
|
export default await RendererLoader.init() |