From 503727c6c4a521519f5005c6367d8e04cf807e23 Mon Sep 17 00:00:00 2001 From: xion Date: Fri, 22 Nov 2024 22:11:30 +0800 Subject: [PATCH] fix: remove abearxiong/use-config --- package.json | 1 + pnpm-lock.yaml | 8 +++++ src/admin/modules/sequelize.ts | 2 +- src/app.ts | 2 +- src/index.ts | 2 +- src/models/user.ts | 2 +- src/modules/bullmq.ts | 2 +- src/modules/minio.ts | 2 +- src/modules/neo4j.ts | 2 +- src/modules/ollama.ts | 2 +- src/modules/redis.ts | 2 +- src/modules/sequelize-supa.ts | 2 +- src/modules/sequelize.ts | 2 +- src/route.ts | 2 +- src/routes/github/lib/get-token.ts | 2 +- src/routes/micro-app/lib/app-file.ts | 22 +++++++++++++ src/routes/micro-app/lib/file.ts | 10 ++++++ src/routes/micro-app/lib/index.ts | 1 + src/routes/micro-app/list.ts | 5 +++ src/routes/micro-app/module/install-app.ts | 14 ++++---- src/routes/micro-app/module/load-app.ts | 25 +++++++++++---- src/routes/micro-app/module/manager.ts | 37 ++++++++++++++++++++++ src/routes/micro-app/routes/manager.ts | 11 +++++++ 23 files changed, 134 insertions(+), 26 deletions(-) create mode 100644 src/routes/micro-app/lib/app-file.ts create mode 100644 src/routes/micro-app/lib/file.ts create mode 100644 src/routes/micro-app/lib/index.ts create mode 100644 src/routes/micro-app/module/manager.ts create mode 100644 src/routes/micro-app/routes/manager.ts diff --git a/package.json b/package.json index e9c5881..611c824 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ }, "devDependencies": { "@abearxiong/use-file-store": "^0.0.1", + "@kevisual/use-config": "^1.0.1", "@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-commonjs": "^28.0.1", "@rollup/plugin-json": "^6.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a1777d..1588413 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -126,6 +126,9 @@ importers: '@abearxiong/use-file-store': specifier: ^0.0.1 version: 0.0.1(esbuild@0.23.1)(typescript@5.6.3) + '@kevisual/use-config': + specifier: ^1.0.1 + version: 1.0.1 '@rollup/plugin-alias': specifier: ^5.1.1 version: 5.1.1(rollup@4.27.2) @@ -1063,6 +1066,9 @@ packages: '@kevisual/router@0.0.5-alpha-2': resolution: {integrity: sha512-9cCa7CEji4q2ByMxxaxzqia42EzbBGdNGKqvs25c2qedAvnXbYaRpaiOdNSNiIXg+eTPQ0ah5HDNRcY2XApD8Q==} + '@kevisual/use-config@1.0.1': + resolution: {integrity: sha512-3osr7pSS/PgvrIGG1Hiv0PUDubkFLei11hI0b9JNHZhnNhqHYv5W21Mr/vUOLJhvn+y5ltlL81ojUePmnYPH7w==} + '@langchain/core@0.3.3': resolution: {integrity: sha512-WAtkmhbdl2T41qzimTzhb3pXCHQxO4onqxzPxgdf3KftQdTwLq0YYBDhozRMZLNAd/+cfH0ymZGaZSsnc9Ogsg==} engines: {node: '>=18'} @@ -4921,6 +4927,8 @@ snapshots: - bufferutil - utf-8-validate + '@kevisual/use-config@1.0.1': {} + '@langchain/core@0.3.3(openai@4.65.0(encoding@0.1.13)(zod@3.23.8))': dependencies: ansi-styles: 5.2.0 diff --git a/src/admin/modules/sequelize.ts b/src/admin/modules/sequelize.ts index 8a35d2f..3ac81b6 100644 --- a/src/admin/modules/sequelize.ts +++ b/src/admin/modules/sequelize.ts @@ -1,4 +1,4 @@ -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; import { Sequelize } from 'sequelize'; import path from 'path'; import os from 'os'; diff --git a/src/app.ts b/src/app.ts index b84bb2b..1e2f84b 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,5 +1,5 @@ import { App } from '@kevisual/router'; -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; import { dynamicImport } from './lib/dynamic-import.ts'; import { redisPublisher, redisSubscriber, redis } from './modules/redis.ts'; import { minioClient } from './modules/minio.ts'; diff --git a/src/index.ts b/src/index.ts index 5142ac5..fe749b7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; import { app } from './app.ts'; import './route.ts'; const config = useConfig(); diff --git a/src/models/user.ts b/src/models/user.ts index 915b211..2d5cd0e 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -1,4 +1,4 @@ -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; import { sequelize } from '@/modules/sequelize.ts'; import { DataTypes, Model, Op } from 'sequelize'; import { createToken, checkToken } from '@kevisual/auth/token'; diff --git a/src/modules/bullmq.ts b/src/modules/bullmq.ts index 256455e..f40efe3 100644 --- a/src/modules/bullmq.ts +++ b/src/modules/bullmq.ts @@ -1,5 +1,5 @@ import { Queue } from 'bullmq'; -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; const config = useConfig(); export const connection = { diff --git a/src/modules/minio.ts b/src/modules/minio.ts index 2a1c661..5f871ec 100644 --- a/src/modules/minio.ts +++ b/src/modules/minio.ts @@ -1,5 +1,5 @@ import { Client, ClientOptions } from 'minio'; -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; type MinioConfig = { minio: ClientOptions & { bucketName: string }; diff --git a/src/modules/neo4j.ts b/src/modules/neo4j.ts index a1fb616..8da0121 100644 --- a/src/modules/neo4j.ts +++ b/src/modules/neo4j.ts @@ -1,5 +1,5 @@ import Neode from 'neode'; -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; import neo4j from 'neo4j-driver'; type NeodeConfig = { diff --git a/src/modules/ollama.ts b/src/modules/ollama.ts index 66e2e6a..9b9b5d2 100644 --- a/src/modules/ollama.ts +++ b/src/modules/ollama.ts @@ -1,4 +1,4 @@ -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; import { Ollama, Message, ChatRequest } from 'ollama'; const config = useConfig<{ ollama: Ollama['config'] & { model: string } }>(); diff --git a/src/modules/redis.ts b/src/modules/redis.ts index 55521ef..286ca20 100644 --- a/src/modules/redis.ts +++ b/src/modules/redis.ts @@ -1,5 +1,5 @@ import { Redis } from 'ioredis'; -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; const config = useConfig<{ redis: ConstructorParameters; diff --git a/src/modules/sequelize-supa.ts b/src/modules/sequelize-supa.ts index a1e6eab..2b58acb 100644 --- a/src/modules/sequelize-supa.ts +++ b/src/modules/sequelize-supa.ts @@ -1,4 +1,4 @@ -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; import { Sequelize } from 'sequelize'; type PostgresConfig = { diff --git a/src/modules/sequelize.ts b/src/modules/sequelize.ts index e3807d9..61c8d9d 100644 --- a/src/modules/sequelize.ts +++ b/src/modules/sequelize.ts @@ -1,4 +1,4 @@ -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; import { Sequelize } from 'sequelize'; type PostgresConfig = { diff --git a/src/route.ts b/src/route.ts index 1eb2560..fb63ec4 100644 --- a/src/route.ts +++ b/src/route.ts @@ -2,7 +2,7 @@ // import { app as adminApp, appendTo } from './admin/index.ts'; import './routes/index.ts'; import { app } from './app.ts'; -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; import { createAuthRoute } from '@kevisual/auth'; const config = useConfig<{ tokenSecret: string }>(); diff --git a/src/routes/github/lib/get-token.ts b/src/routes/github/lib/get-token.ts index e006a22..bee60f9 100644 --- a/src/routes/github/lib/get-token.ts +++ b/src/routes/github/lib/get-token.ts @@ -1,5 +1,5 @@ import fetch from 'node-fetch'; -import { useConfig } from '@abearxiong/use-config'; +import { useConfig } from '@kevisual/use-config'; type GithubConfig = { clientId: string; diff --git a/src/routes/micro-app/lib/app-file.ts b/src/routes/micro-app/lib/app-file.ts new file mode 100644 index 0000000..fe9340b --- /dev/null +++ b/src/routes/micro-app/lib/app-file.ts @@ -0,0 +1,22 @@ +import { useFileStore } from '@abearxiong/use-file-store'; +import glob from 'fast-glob'; +import fs from 'fs'; +import path from 'path'; + +export const appsPath = useFileStore('apps', { needExists: true }); + +export const loadAppInfo = async () => { + const apps = await glob(`${appsPath}/*/\.config.json`, { + cwd: appsPath, + }); + const result = apps.map((app) => { + const json = fs.readFileSync(path.join(appsPath, app), 'utf-8'); + const pkg = JSON.parse(json); + const { name, version, app: appInfo } = pkg; + if (!name || !version || !appInfo) { + throw new Error('Invalid package.json'); + } + return { key: app.split('/')[0], ...appInfo }; + }); + return result; +}; diff --git a/src/routes/micro-app/lib/file.ts b/src/routes/micro-app/lib/file.ts new file mode 100644 index 0000000..108a36b --- /dev/null +++ b/src/routes/micro-app/lib/file.ts @@ -0,0 +1,10 @@ +import fs from 'fs'; +export const fileIsExist = (filePath: string): boolean => { + try { + // 使用 F_OK 检查文件或目录是否存在 + fs.accessSync(filePath, fs.constants.F_OK); + return true; + } catch (err) { + return false; + } +}; diff --git a/src/routes/micro-app/lib/index.ts b/src/routes/micro-app/lib/index.ts new file mode 100644 index 0000000..07721d6 --- /dev/null +++ b/src/routes/micro-app/lib/index.ts @@ -0,0 +1 @@ +export * from './app-file.ts'; diff --git a/src/routes/micro-app/list.ts b/src/routes/micro-app/list.ts index 427b55b..27dd9ff 100644 --- a/src/routes/micro-app/list.ts +++ b/src/routes/micro-app/list.ts @@ -3,6 +3,7 @@ import { MicroAppModel } from './models.ts'; import { appCheck, installApp } from './module/install-app.ts'; import { loadApp } from './module/load-app.ts'; +// 应用上传到 应用管理 的平台 app .route({ path: 'micro-app', @@ -38,6 +39,10 @@ app .addTo(app); // curl http://localhost:4002/api/router?path=micro-app&key=deploy +// 把对应的应用安装到系统的apps目录下,并解压,然后把配置项写入数据库配置 +// key 是应用的唯一标识,和package.json中的key一致,绑定关系 +// 安装就就一定存在状态。这个时候需要判断这个应用的依赖关系,这个应用的开启状态。 +// 修改app的类型,这些模块是存在添加,不存在则删除。 app .route({ path: 'micro-app', diff --git a/src/routes/micro-app/module/install-app.ts b/src/routes/micro-app/module/install-app.ts index 59fa70e..e6963e4 100644 --- a/src/routes/micro-app/module/install-app.ts +++ b/src/routes/micro-app/module/install-app.ts @@ -1,12 +1,10 @@ import { minioClient } from '@/app.ts'; import { bucketName } from '@/modules/minio.ts'; -import { checkFileExistsSync } from '@/routes/page/module/cache-file.ts'; -import { useFileStore } from '@abearxiong/use-file-store'; +import { fileIsExist } from '../lib/file.ts'; import fs from 'fs'; import path from 'path'; import * as tar from 'tar'; - -const appsPath = useFileStore('apps', { needExists: true }); +import { appsPath } from '../lib/index.ts'; export type InstallAppOpts = { path?: string; @@ -15,7 +13,7 @@ export type InstallAppOpts = { export const appCheck = async (opts: InstallAppOpts) => { const { key } = opts; const directory = path.join(appsPath, key); - if (checkFileExistsSync(directory)) { + if (fileIsExist(directory)) { return true; } return false; @@ -25,7 +23,7 @@ export const installApp = async (opts: InstallAppOpts) => { const fileStream = await minioClient.getObject(bucketName, opts.path); const pathName = opts.path.split('/').pop(); const directory = path.join(appsPath, key); - if (!checkFileExistsSync(directory)) { + if (!fileIsExist(directory)) { fs.mkdirSync(directory, { recursive: true }); } const filePath = path.join(directory, pathName); @@ -44,7 +42,7 @@ export const installApp = async (opts: InstallAppOpts) => { cwd: extractPath, }); const pkgs = path.join(extractPath, 'package.json'); - if (!checkFileExistsSync(pkgs)) { + if (!fileIsExist(pkgs)) { throw new Error('Invalid package.json'); } const json = fs.readFileSync(pkgs, 'utf-8'); @@ -58,3 +56,5 @@ export const installApp = async (opts: InstallAppOpts) => { // fs.unlinkSync(filePath); return { path: filePath }; }; + + diff --git a/src/routes/micro-app/module/load-app.ts b/src/routes/micro-app/module/load-app.ts index 411517c..e0412d8 100644 --- a/src/routes/micro-app/module/load-app.ts +++ b/src/routes/micro-app/module/load-app.ts @@ -1,16 +1,17 @@ -import { checkFileExistsSync } from '@/routes/page/module/cache-file.ts'; +import { fileIsExist } from '../lib/file.ts'; import { useFileStore } from '@abearxiong/use-file-store'; import fs from 'fs'; import path from 'path'; -const appsPath = useFileStore('apps', { needExists: true }); -export const loadApp = async (key: string) => { +export const appsPath = useFileStore('apps', { needExists: true }); + +export const loadAppInfo = async (key: string) => { const directory = path.join(appsPath, key); - if (!checkFileExistsSync(directory)) { + if (!fileIsExist(directory)) { throw new Error('app not found'); } const pkgs = path.join(directory, 'package.json'); - if (!checkFileExistsSync(pkgs)) { + if (!fileIsExist(pkgs)) { throw new Error('Invalid package.json'); } const json = fs.readFileSync(pkgs, 'utf-8'); @@ -21,9 +22,21 @@ export const loadApp = async (key: string) => { } const mainEntry = path.join(directory, app.entry); - if (!checkFileExistsSync(mainEntry)) { + if (!fileIsExist(mainEntry)) { throw new Error('Invalid main entry'); } + return { mainEntry, app }; +}; + +export const loadApp = async (key: string) => { + const { mainEntry } = await loadAppInfo(key); + // 1. 查询数据库,获取app信息,查看是否运行中 + // 2. 如果运行中,直接返回 + // 3. 如果不在运行中,加载app + // 3.1 查看app的类型,如果是 system-app,直接加载 + // 3.2 如果是 micro-app,查找相关的依赖,如果依赖不存在,先加载依赖 + // 3.3 使用fork加载app + // 4. 记录app的运行状态,程序重新启动时,重新加载 const main = await import(mainEntry); return main; }; diff --git a/src/routes/micro-app/module/manager.ts b/src/routes/micro-app/module/manager.ts new file mode 100644 index 0000000..e356c2c --- /dev/null +++ b/src/routes/micro-app/module/manager.ts @@ -0,0 +1,37 @@ +export enum AppType { + SystemApp = 'system-app', + MicroApp = 'micro-app', + GatewayApp = 'gateway-app', +} +export type AppInfo = { + status?: 'active' | 'inactive'; // 默认运行状态 + key: string; + type?: AppType; // 默认类型 + entry?: string; // 入口文件 + path?: string; // 文件路径 +}; + +export class Manager { + apps: Map; + constructor() { + this.apps = new Map(); + } + /** + * 检查key是否存在 + * @param key + * @returns + */ + checkKey(key: string) { + return this.apps.has(key); + } + /* + * 获取app信息 + * @param key + */ + add(app: T) { + this.apps.set(app.key, app); + } + load() { + // 从apps文件夹列表当中中加载app信息 + } +} diff --git a/src/routes/micro-app/routes/manager.ts b/src/routes/micro-app/routes/manager.ts new file mode 100644 index 0000000..bdaf9b7 --- /dev/null +++ b/src/routes/micro-app/routes/manager.ts @@ -0,0 +1,11 @@ +import { app } from '@/app.ts'; + +app + .route({ + path: 'micro-app-manager', + key: 'list', + }) + .define(async (ctx) => { + // + }) + .addTo(app);