249 lines
5.9 KiB
TypeScript
249 lines
5.9 KiB
TypeScript
// Generated by dts-bundle v0.7.3
|
|
// Dependencies for this module:
|
|
// ../@abearxiong/router
|
|
// ../sequelize
|
|
// ../@abearxiong/use-config
|
|
|
|
import { Route } from '@abearxiong/router';
|
|
import { QueryRouter, Server } from '@abearxiong/router';
|
|
import { DataTypes, Model } from 'sequelize';
|
|
import { useConfig } from '@abearxiong/use-config';
|
|
import { Sequelize } from 'sequelize';
|
|
|
|
|
|
export { CodeManager };
|
|
|
|
|
|
export enum CodeStatus {
|
|
running = 'running',
|
|
stop = 'stop',
|
|
fail = 'fail',
|
|
}
|
|
|
|
export type CodeManager = {
|
|
fn?: any;
|
|
status?: CodeStatus;
|
|
errorMsg?: string;
|
|
} & Partial<RouterCode>;
|
|
|
|
const codeDemoRun = `async function run(ctx) {
|
|
ctx.body = 'test js';
|
|
return ctx;
|
|
}`;
|
|
const templateFn = (codeStr: string) => {
|
|
return `
|
|
${codeStr}
|
|
if(run) {
|
|
return run(ctx);
|
|
}
|
|
if(main) {
|
|
return main(ctx);
|
|
}
|
|
return 'no run or main function';
|
|
`;
|
|
};
|
|
export const loadOne = async (item: RouterCodeModel) => {
|
|
const { path, key, id, code, exec, project } = item.toJSON();
|
|
const codeStr = exec || code;
|
|
try {
|
|
const fn: any = new Function('ctx', templateFn(codeStr));
|
|
// run code
|
|
const codeRunRoute = new Route(path, key, { id });
|
|
codeRunRoute.run = fn;
|
|
router.removeById(id); // TODO:
|
|
router.add(codeRunRoute);
|
|
return {
|
|
...item.toJSON(),
|
|
path,
|
|
key,
|
|
id,
|
|
project,
|
|
fn,
|
|
status: CodeStatus.running,
|
|
};
|
|
} catch (e) {
|
|
console.error('error id:', id, '\n', e);
|
|
return {
|
|
path,
|
|
key,
|
|
id,
|
|
project,
|
|
status: CodeStatus.fail,
|
|
errorMsg: e.message.toString(),
|
|
};
|
|
}
|
|
};
|
|
export const load = async function () {
|
|
const codes = await RouterCodeModel.findAll();
|
|
const codeManager: CodeManager[] = codes.map((item) => {
|
|
const { path, key, id, code, exec, project, active } = item.toJSON();
|
|
if (!active) {
|
|
return {
|
|
...item.toJSON(),
|
|
path,
|
|
key,
|
|
id,
|
|
code,
|
|
project,
|
|
status: CodeStatus.stop,
|
|
};
|
|
}
|
|
try {
|
|
const codeStr = exec || code;
|
|
const fn: any = new Function('ctx', templateFn(codeStr));
|
|
// run code
|
|
const codeRunRoute = new Route(path, key, { id });
|
|
codeRunRoute.run = fn;
|
|
router.add(codeRunRoute);
|
|
return {
|
|
...item.toJSON(),
|
|
path,
|
|
key,
|
|
id,
|
|
code,
|
|
project,
|
|
type: item.type,
|
|
fn,
|
|
status: CodeStatus.running,
|
|
};
|
|
} catch (e) {
|
|
console.error('error id:', id, '\n', e);
|
|
return {
|
|
path,
|
|
key,
|
|
id,
|
|
code,
|
|
project,
|
|
type: item.type,
|
|
status: CodeStatus.fail,
|
|
errorMsg: e.message.toString(),
|
|
};
|
|
}
|
|
});
|
|
return codeManager;
|
|
};
|
|
|
|
export const router = new QueryRouter();
|
|
export const server = new Server({
|
|
path: '/api/router',
|
|
});
|
|
|
|
|
|
export type RouterCode = {
|
|
id: string;
|
|
path: string;
|
|
key: string;
|
|
active: boolean;
|
|
project: string;
|
|
code: string;
|
|
exec: string;
|
|
type: RouterCodeType;
|
|
middleware: string[];
|
|
next: string;
|
|
data: any;
|
|
validator: any;
|
|
};
|
|
|
|
export enum RouterCodeType {
|
|
route = 'route',
|
|
middleware = 'middleware',
|
|
}
|
|
|
|
export class RouterCodeModel extends Model {
|
|
declare id: string;
|
|
declare path: string;
|
|
declare key: string;
|
|
declare active: boolean;
|
|
declare project: string;
|
|
declare code: string;
|
|
declare exec: string;
|
|
declare type: RouterCodeType;
|
|
declare middleware: string[];
|
|
declare next: string; // 如果是中间件,不存在
|
|
declare data: any; // 内容
|
|
declare validator: any;
|
|
}
|
|
RouterCodeModel.init(
|
|
{
|
|
id: {
|
|
type: DataTypes.UUID,
|
|
primaryKey: true,
|
|
defaultValue: DataTypes.UUIDV4,
|
|
comment: '用户id',
|
|
},
|
|
path: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
},
|
|
key: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
},
|
|
active: {
|
|
type: DataTypes.BOOLEAN,
|
|
defaultValue: false,
|
|
},
|
|
project: {
|
|
type: DataTypes.STRING,
|
|
defaultValue: 'default',
|
|
},
|
|
code: {
|
|
type: DataTypes.STRING,
|
|
defaultValue: '',
|
|
},
|
|
exec: {
|
|
type: DataTypes.STRING, // 对代码进行编译后的代码
|
|
defaultValue: '',
|
|
},
|
|
type: {
|
|
type: DataTypes.ENUM(RouterCodeType.route, RouterCodeType.middleware),
|
|
defaultValue: RouterCodeType.route,
|
|
},
|
|
middleware: {
|
|
type: DataTypes.ARRAY(DataTypes.STRING),
|
|
defaultValue: [],
|
|
},
|
|
next: {
|
|
type: DataTypes.STRING,
|
|
defaultValue: '',
|
|
},
|
|
data: {
|
|
type: DataTypes.JSON,
|
|
defaultValue: {},
|
|
},
|
|
validator: {
|
|
type: DataTypes.JSON,
|
|
defaultValue: {},
|
|
},
|
|
},
|
|
{
|
|
sequelize,
|
|
tableName: 'cf_router_code',
|
|
},
|
|
);
|
|
|
|
|
|
type PostgresConfig = {
|
|
postgres: {
|
|
username: string;
|
|
password: string;
|
|
host: string;
|
|
port: number;
|
|
database: string;
|
|
};
|
|
};
|
|
const config = useConfig<PostgresConfig>();
|
|
|
|
const postgresConfig = config.postgres;
|
|
|
|
if (!postgresConfig) {
|
|
console.error('postgres config is required');
|
|
process.exit(1);
|
|
}
|
|
export const sequelize = new Sequelize({
|
|
dialect: 'postgres',
|
|
...postgresConfig,
|
|
// logging: false,
|
|
});
|
|
|