feat: add app serve
This commit is contained in:
parent
edb0d56094
commit
5c3f454d8c
@ -39,7 +39,6 @@
|
||||
"tslib": "^2.7.0",
|
||||
"typescript": "^5.6.3"
|
||||
},
|
||||
"dependencies": {},
|
||||
"resolutions": {
|
||||
"picomatch": "^4"
|
||||
},
|
||||
@ -48,5 +47,10 @@
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"dependencies": {
|
||||
"@kevisual/router": "^0.0.2",
|
||||
"sequelize": "^6.37.4",
|
||||
"sqlite3": "^5.1.7"
|
||||
}
|
||||
}
|
||||
|
1178
pnpm-lock.yaml
generated
1178
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
65
src/app.ts
65
src/app.ts
@ -1,16 +1,57 @@
|
||||
import { program , Command} from 'commander';
|
||||
import { App } from '@kevisual/router';
|
||||
import fs from 'fs';
|
||||
import { getConfig, pidFilePath, checkFileExists } from './module/get-config.ts';
|
||||
import { sequelize } from './module/sequelize.ts';
|
||||
|
||||
// 将多个子命令加入主程序中
|
||||
program.name('app').description('A CLI tool with envison').version('0.0.3');
|
||||
export { sequelize };
|
||||
|
||||
const ls =new Command('ls')
|
||||
.description('List files in the current directory')
|
||||
.action(() => {
|
||||
console.log('List files');
|
||||
console.log(fs.readdirSync(process.cwd()));
|
||||
export const app = new App();
|
||||
|
||||
app
|
||||
.route({
|
||||
path: 'ping',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
ctx.body = 'pong';
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
app
|
||||
.route({
|
||||
path: 'demo',
|
||||
key: '01',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
ctx.body = 'Hello, World!';
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
// 处理进程退出或中断信号,确保删除 pid 文件
|
||||
const cleanUp = () => {
|
||||
if (checkFileExists(pidFilePath)) {
|
||||
const pid = fs.readFileSync(pidFilePath, 'utf-8');
|
||||
if (Number(pid) === process.pid) {
|
||||
fs.unlinkSync(pidFilePath);
|
||||
console.log('server id', process.pid, 'is exit');
|
||||
}
|
||||
}
|
||||
process.exit(0); // 退出进程
|
||||
};
|
||||
|
||||
// 当进程收到以下信号时,删除 pid 文件
|
||||
process.on('SIGINT', cleanUp); // 例如 Ctrl+C
|
||||
process.on('SIGTERM', cleanUp); // 终止信号
|
||||
process.on('exit', cleanUp); // 进程退出
|
||||
|
||||
export const createApp = async () => {
|
||||
if (checkFileExists(pidFilePath)) {
|
||||
const pid = fs.readFileSync(pidFilePath, 'utf-8');
|
||||
console.log('服务已经启动,请勿重复启动。', 'server id', pid);
|
||||
return;
|
||||
}
|
||||
fs.writeFileSync(pidFilePath, process.pid.toString());
|
||||
app.listen(21015, () => {
|
||||
console.log('Server is running on port 21015', 'http://localhost:21015/api/router', 'server id', process.pid);
|
||||
});
|
||||
program.addCommand(ls);
|
||||
|
||||
export const app = program;
|
||||
export { program, Command };
|
||||
import('./route.ts');
|
||||
};
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { app, Command } from '@/app.ts';
|
||||
import { program as app, Command } from '@/program.ts';
|
||||
import { glob } from 'glob';
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { app, program, Command } from '@/app.ts';
|
||||
import { program as app, Command } from '@/program.ts';
|
||||
import { getConfig, writeConfig } from '@/module/get-config.ts';
|
||||
import { queryLogin, queryMe, switchOrg, switchMe } from '@/route/index.ts';
|
||||
import { queryLogin, queryMe, switchOrg, switchMe } from '@/query/index.ts';
|
||||
import inquirer from 'inquirer';
|
||||
|
||||
// 导入 login 命令
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { app, Command } from '@/app.ts';
|
||||
import { program as app, Command } from '@/program.ts';
|
||||
import { getConfig, writeConfig } from '@/module/index.ts';
|
||||
|
||||
const command = new Command('logout')
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { app, Command } from '@/app.ts';
|
||||
import { program as app, Command } from '@/program.ts';
|
||||
import { getConfig, query, writeConfig } from '@/module/index.ts';
|
||||
import inquirer from 'inquirer';
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { app, Command } from '@/app.ts';
|
||||
import { program as app, Command } from '@/program.ts';
|
||||
import { getConfig, writeConfig } from '@/module/index.ts';
|
||||
import {queryMe} from '../route/index.ts';
|
||||
import {queryMe} from '../query/index.ts';
|
||||
|
||||
|
||||
const command = new Command('me')
|
||||
|
40
src/command/serve.ts
Normal file
40
src/command/serve.ts
Normal file
@ -0,0 +1,40 @@
|
||||
import { program as app, Command } from '@/program.ts';
|
||||
import { getConfig, writeConfig, pidFilePath, checkFileExists } from '@/module/index.ts';
|
||||
import { createApp } from '@/app.ts';
|
||||
import fs from 'fs';
|
||||
|
||||
const command = new Command('serve')
|
||||
.description('serve manager')
|
||||
.option('-e, --exit', '退出进程')
|
||||
.option('-s, --start', '启动进程')
|
||||
.action(async (options) => {
|
||||
console.log('options', options);
|
||||
if (options.exit) {
|
||||
if (checkFileExists(pidFilePath)) {
|
||||
console.log('服务已经启动, 准备退出');
|
||||
const pid = fs.readFileSync(pidFilePath, 'utf-8');
|
||||
// 通知进程退出
|
||||
process.kill(Number(pid), 'SIGTERM');
|
||||
setTimeout(() => {
|
||||
if (checkFileExists(pidFilePath)) {
|
||||
// 强制删除 pid 文件
|
||||
fs.unlinkSync(pidFilePath);
|
||||
}
|
||||
}, 2000);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (options.start) {
|
||||
const config = getConfig();
|
||||
await createApp();
|
||||
}
|
||||
});
|
||||
|
||||
app.addCommand(command);
|
||||
|
||||
const start = new Command('start').description('start serve').action(async () => {
|
||||
const config = getConfig();
|
||||
await createApp();
|
||||
});
|
||||
|
||||
app.addCommand(start);
|
@ -1,9 +1,9 @@
|
||||
import { app } from '@/app.ts';
|
||||
import { program } from '@/program.ts';
|
||||
import './command/login.ts';
|
||||
import './command/logout.ts';
|
||||
import './command/ls-token.ts';
|
||||
import './command/me.ts';
|
||||
import './command/deploy.ts';
|
||||
import './command/serve.ts';
|
||||
|
||||
|
||||
app.parse(process.argv);
|
||||
program.parse(process.argv);
|
||||
|
@ -5,6 +5,9 @@ import fs from 'fs';
|
||||
const envisionPath = path.join(os.homedir(), '.config', 'envision');
|
||||
const configPath = path.join(os.homedir(), '.config', 'envision', 'config.json');
|
||||
|
||||
export const pidFilePath = path.join(envisionPath, 'app.pid');
|
||||
export const dbPath = path.join(envisionPath, 'db.sqlite');
|
||||
|
||||
export const checkFileExists = (filePath: string) => {
|
||||
try {
|
||||
fs.accessSync(filePath, fs.constants.F_OK);
|
||||
|
13
src/module/sequelize.ts
Normal file
13
src/module/sequelize.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import { Sequelize } from 'sequelize';
|
||||
import { dbPath } from './get-config.ts';
|
||||
// connect to db
|
||||
export const sequelize = new Sequelize({
|
||||
dialect: 'sqlite',
|
||||
// storage: 'db.sqlite',
|
||||
storage: dbPath,
|
||||
// logging: false,
|
||||
});
|
||||
|
||||
sequelize.authenticate({ logging: false }).then(() => {
|
||||
console.log('Connection sqlite has been established successfully.');
|
||||
});
|
13
src/program.ts
Normal file
13
src/program.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import { program, Command } from 'commander';
|
||||
import fs from 'fs';
|
||||
|
||||
// 将多个子命令加入主程序中
|
||||
program.name('app').description('A CLI tool with envison').version('0.0.3');
|
||||
|
||||
const ls = new Command('ls').description('List files in the current directory').action(() => {
|
||||
console.log('List files');
|
||||
console.log(fs.readdirSync(process.cwd()));
|
||||
});
|
||||
program.addCommand(ls);
|
||||
|
||||
export { program, Command };
|
1
src/route.ts
Normal file
1
src/route.ts
Normal file
@ -0,0 +1 @@
|
||||
import './route/user/list.ts';
|
11
src/route/user/list.ts
Normal file
11
src/route/user/list.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import { app } from '@/app.ts';
|
||||
|
||||
app
|
||||
.route({
|
||||
path: 'user',
|
||||
key: 'list',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
ctx.body = 'user list';
|
||||
})
|
||||
.addTo(app);
|
Loading…
x
Reference in New Issue
Block a user