GT-Manual / lib /plugin.js
wuliya
upload
072e993
raw
history blame
2.65 kB
import fs from 'node:fs'
import path from 'node:path'
import YAML from 'yaml'
import multer from 'multer'
import rateLimit from 'express-rate-limit'
export default class plugin {
/**
* @param name 插件名称
* @param dsc 插件描述
* @param priority 插件优先级
* @param rule.method 请求方法
* @param rule.path 请求路径
* @param rule.use 请求处理
* @param rule.fnc 请求处理
*/
constructor (data = {}) {
/** 插件名称 */
this.name = data.name || ''
/** 插件描述 */
this.dsc = data.dsc || ''
/** 插件优先级 */
this.priority = data.priority || 5
/** 插件优先级 */
this.route = data.route || ''
/** 定时任务,可以是数组 */
this.task = {
/** 任务名 */
name: '',
/** 任务方法名 */
fnc: data.task?.fnc || '',
/** 任务cron表达式 */
cron: data.task?.cron || ''
}
/** 命令规则 */
this.rule = data.rule || []
}
/** 读json */
readJson (filePath, format = 'json') {
try {
if (format == 'yaml') {
return YAML.parse(fs.readFileSync(filePath, 'utf8'))
}
return JSON.parse(fs.readFileSync(filePath, 'utf8'))
} catch (err) {
return false
}
}
/** 写json */
writeJson (savePath, data, format = 'json') {
this.mkdir(path.dirname(savePath))
if (format == 'yaml') return fs.writeFileSync(savePath, YAML.stringify(data))
return fs.writeFileSync(savePath, JSON.stringify(data, null, 2))
}
/** 创建文件夹 */
mkdir (dirname) {
if (fs.existsSync(dirname)) {
return true
} else {
if (this.mkdir(path.dirname(dirname))) {
fs.mkdirSync(dirname)
return true
}
}
}
/** 休眠函数 */
sleep (ms) {
return new Promise((resolve) => setTimeout(resolve, ms))
}
/** 速率限制 */
limiter (limit = 15, cd = 60, options = {}) {
options = {
limit: limit,
windowMs: cd * 1000,
legacyHeaders: false,
message: { status: 1, message: 'Frequent requests, please try again later' },
...options
}
return rateLimit(options)
}
/** 文件上传, single, array, any */
upload (savaPath = './public/upload', filename, options = {}) {
options = {
storage: multer.diskStorage({
destination: (req, file, cb) => {
cb(null, savaPath)
},
filename: filename || ((req, file, cb) => {
cb(null, Date.now() + path.extname(file.originalname))
})
}),
limits: { fileSize: 5 * 1024 * 1024, files: 1 },
...options
}
return multer(options)
}
}