env-manage-plugin
Version:
A dev env plugin that integrates an Express server with request proxying capabilities.
96 lines (95 loc) • 2.71 kB
JavaScript
import loki from "lokijs";
import { logger } from "../utils/logger.js";
// 声明数据库实例类型(避免全局变量类型模糊)
let db = null;
/**
* 数据库初始化配置(可抽离为外部配置文件)
*/
const DB_CONFIG = {
filename: ".envm.data.json",
autosave: true,
autosaveInterval: 5000, // 注意:5秒,需统一
autoload: true,
};
/**
* 初始化开发环境集合
*/
const initEnvmsCollection = (db) => {
if (!db.getCollection("envms")) {
db.addCollection("envms", {
indices: ["apiBaseUrl", "id"],
unique: ["apiBaseUrl"],
});
}
};
/**
* 初始化开发服务器集合
*/
const initDevServerCollection = (db) => {
if (!db.getCollection("devServer")) {
db.addCollection("devServer", {
indices: ["id", "devServerUrl"],
unique: ["devServerUrl"],
});
}
};
/**
* 初始化路由规则集合
*/
const initRouteRulesCollection = (db) => {
if (!db.getCollection("routeRules")) {
db.addCollection("routeRules", {
indices: ["id", "envId", "pathPrefix"],
});
}
};
/**
* 初始化密码集合
*/
const initPasswordsCollection = (db) => {
if (!db.getCollection("passwords")) {
db.addCollection("passwords", {
indices: ["id", "envId", "isDefault"],
});
}
};
/**
* 手动启动数据库(核心函数)
* @returns 数据库实例(确保单例)
*/
export const startDatabase = () => {
// 1. 单例保护:避免重复创建实例
if (db)
return Promise.resolve(db);
// 2. 返回Promise,支持异步等待和错误捕获
return new Promise((resolve, reject) => {
// 3. 初始化数据库
const newDb = new loki(DB_CONFIG.filename, {
...DB_CONFIG,
// 4. 加载回调中处理集合初始化
autoloadCallback: (err) => {
if (err) {
reject(new Error(`数据库加载失败: ${err.message}`));
return;
}
// 初始化集合
initEnvmsCollection(newDb);
initDevServerCollection(newDb);
initRouteRulesCollection(newDb);
initPasswordsCollection(newDb);
// 5. 赋值单例并返回
db = newDb;
logger.info("数据库已加载/初始化");
resolve(newDb);
},
});
});
};
/**
* 获取数据库实例(需在startDatabase后调用)
*/
export const getDatabase = () => {
if (!db)
throw new Error("数据库未启动,请先调用 startDatabase()");
return db;
};