@layoutkit/bree-core 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +58 -18
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3,10 +3,11 @@ import dotenv from 'dotenv';
|
|
|
3
3
|
import crypto from 'node:crypto';
|
|
4
4
|
import ExcelJS from 'exceljs';
|
|
5
5
|
import path from 'node:path';
|
|
6
|
+
import fs from 'node:fs/promises';
|
|
6
7
|
import nodemailer from 'nodemailer';
|
|
7
8
|
import { createClient } from 'redis';
|
|
8
9
|
import Bree from 'bree';
|
|
9
|
-
import fs from 'node:fs';
|
|
10
|
+
import fs$1 from 'node:fs';
|
|
10
11
|
import { fileURLToPath } from 'node:url';
|
|
11
12
|
import winston from 'winston';
|
|
12
13
|
import 'winston-daily-rotate-file';
|
|
@@ -112,6 +113,8 @@ var database = {
|
|
|
112
113
|
close
|
|
113
114
|
};
|
|
114
115
|
|
|
116
|
+
let baseFolder = null;
|
|
117
|
+
|
|
115
118
|
/**
|
|
116
119
|
* 内部:构建 sheet columns:[{ header: 'ID', key: 'id', width: 10 }]
|
|
117
120
|
*/
|
|
@@ -124,6 +127,34 @@ const buildSheet = (workbook, columns, data) => {
|
|
|
124
127
|
return sheet
|
|
125
128
|
};
|
|
126
129
|
|
|
130
|
+
/**
|
|
131
|
+
* 文件
|
|
132
|
+
* @param {*} fileName
|
|
133
|
+
* @param {*} folder
|
|
134
|
+
* @returns
|
|
135
|
+
*/
|
|
136
|
+
const getFilePath = async (fileName) => {
|
|
137
|
+
const baseDir = baseFolder
|
|
138
|
+
? path.resolve(process.cwd(), baseFolder)
|
|
139
|
+
: process.cwd();
|
|
140
|
+
|
|
141
|
+
await fs.mkdir(baseDir, { recursive: true });
|
|
142
|
+
|
|
143
|
+
const name = fileName.endsWith('.xlsx')
|
|
144
|
+
? fileName
|
|
145
|
+
: `${fileName}.xlsx`;
|
|
146
|
+
|
|
147
|
+
return path.join(baseDir, name)
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* 设置基础目录
|
|
152
|
+
* @param {*} folder
|
|
153
|
+
*/
|
|
154
|
+
const setFolder = (folder) => {
|
|
155
|
+
baseFolder = folder;
|
|
156
|
+
};
|
|
157
|
+
|
|
127
158
|
/**
|
|
128
159
|
* 小/中数据:生成 Excel 文件(落盘)
|
|
129
160
|
* 适合:< 5w 行
|
|
@@ -131,7 +162,7 @@ const buildSheet = (workbook, columns, data) => {
|
|
|
131
162
|
const createExcel = async (columns, data, fileName = 'report') => {
|
|
132
163
|
const workbook = new ExcelJS.Workbook();
|
|
133
164
|
buildSheet(workbook, columns, data);
|
|
134
|
-
const filePath =
|
|
165
|
+
const filePath = await getFilePath(fileName);
|
|
135
166
|
await workbook.xlsx.writeFile(filePath);
|
|
136
167
|
return filePath
|
|
137
168
|
};
|
|
@@ -150,20 +181,29 @@ const createBufferExcel = async (columns, data) => {
|
|
|
150
181
|
* 大数据(核心优化):流式写入(不爆内存)
|
|
151
182
|
* 适合:10w ~ 100w+
|
|
152
183
|
*/
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
184
|
+
let streamWorkbook = null;
|
|
185
|
+
let streamSheet = null;
|
|
186
|
+
const createStreamExcel = async (columns, data, fileName = 'report', lastWrite = false) => {
|
|
187
|
+
const filePath = await getFilePath(fileName);
|
|
188
|
+
if (!streamWorkbook) {
|
|
189
|
+
streamWorkbook = new ExcelJS.stream.xlsx.WorkbookWriter({
|
|
190
|
+
filename: filePath,
|
|
191
|
+
useStyles: false,
|
|
192
|
+
useSharedStrings: true
|
|
193
|
+
});
|
|
160
194
|
|
|
161
|
-
|
|
162
|
-
|
|
195
|
+
streamSheet = workbook.addWorksheet('Report');
|
|
196
|
+
streamSheet.columns = columns;
|
|
197
|
+
}
|
|
163
198
|
for (const item of data) {
|
|
164
|
-
|
|
199
|
+
streamSheet.addRow(item).commit();
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (lastWrite) {
|
|
203
|
+
await workbook.commit();
|
|
204
|
+
streamWorkbook = null;
|
|
205
|
+
streamSheet = null;
|
|
165
206
|
}
|
|
166
|
-
await workbook.commit();
|
|
167
207
|
return filePath
|
|
168
208
|
};
|
|
169
209
|
|
|
@@ -179,16 +219,16 @@ const exportExcel = async ({
|
|
|
179
219
|
switch (mode) {
|
|
180
220
|
case 'buffer':
|
|
181
221
|
return await createBufferExcel(columns, data)
|
|
182
|
-
|
|
183
222
|
case 'stream':
|
|
184
|
-
return await createStreamExcel(columns, data, fileName)
|
|
185
|
-
|
|
223
|
+
return await createStreamExcel(columns, data, fileName, true)
|
|
186
224
|
default:
|
|
187
225
|
return await createExcel(columns, data, fileName)
|
|
188
226
|
}
|
|
189
227
|
};
|
|
190
228
|
|
|
191
229
|
var excelUtil = {
|
|
230
|
+
setFolder,
|
|
231
|
+
getFilePath,
|
|
192
232
|
exportExcel,
|
|
193
233
|
createExcel,
|
|
194
234
|
createBufferExcel,
|
|
@@ -482,7 +522,7 @@ const getJobsRoot = () => {
|
|
|
482
522
|
];
|
|
483
523
|
|
|
484
524
|
for (const p of possiblePaths) {
|
|
485
|
-
if (fs.existsSync(p)) {
|
|
525
|
+
if (fs$1.existsSync(p)) {
|
|
486
526
|
jobsRoot = p;
|
|
487
527
|
return jobsRoot
|
|
488
528
|
}
|
|
@@ -497,7 +537,7 @@ const getJobsRoot = () => {
|
|
|
497
537
|
const createBree = () => {
|
|
498
538
|
const jobsPath = getJobsRoot();
|
|
499
539
|
// 确保 jobs 目录存在(创建警告但不自动创建,因为这是使用者的责任)
|
|
500
|
-
if (!fs.existsSync(jobsPath)) {
|
|
540
|
+
if (!fs$1.existsSync(jobsPath)) {
|
|
501
541
|
console.warn(`⚠️ Jobs directory not found: ${jobsPath}`);
|
|
502
542
|
console.warn(` Please create it or set BREE_JOBS_PATH environment variable`);
|
|
503
543
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/aesUtil.js","../src/core/database.js","../src/utils/excelUtil.js","../src/utils/mailUtil.js","../src/core/redis.js","../src/utils/redisUtil.js","../src/utils/path.js","../src/config/breeLogger.js","../src/scheduler.js","../src/config/logger.js","../src/useHandler.js","../src/utils/AesUtil.js","../src/core/auth.js","../src/config/weixinLogger.js"],"sourcesContent":["import crypto from 'node:crypto'\r\n\r\nconst ALGORITHM_MAP = {\r\n 16: 'aes-128-ecb',\r\n 24: 'aes-192-ecb',\r\n 32: 'aes-256-ecb'\r\n}\r\n\r\nconst encrypt = (data, key) => {\r\n // key 必须 16 / 24 / 32 字节\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const cipher = crypto.createCipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n cipher.setAutoPadding(true) // PKCS7\r\n const encrypted = Buffer.concat([\r\n cipher.update(data),\r\n cipher.final()\r\n ])\r\n return encrypted\r\n}\r\n\r\nconst decrypt = (data, key) => {\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const decipher = crypto.createDecipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n decipher.setAutoPadding(true)\r\n const decrypted = Buffer.concat([\r\n decipher.update(data),\r\n decipher.final()\r\n ])\r\n return decrypted\r\n}\r\n\r\n/**\r\n * AES解密\r\n * 对应 Java:\r\n * AesUtil.decrypt(String data, String key)\r\n *\r\n * @param {string} data Base64密文\r\n * @param {string} key AES密钥(16/24/32字节)\r\n * @returns {string} 明文\r\n */\r\nconst decryptString = (data, key) => {\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const decipher = crypto.createDecipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n decipher.setAutoPadding(true)\r\n const decrypted = Buffer.concat([\r\n decipher.update(Buffer.from(data, 'base64')),\r\n decipher.final()\r\n ])\r\n return decrypted.toString('utf8')\r\n}\r\n\r\nexport default { encrypt, decrypt, decryptString }","import knex from 'knex'\r\nimport dotenv from 'dotenv'\r\nimport aes from '../utils/aesUtil.js'\r\ndotenv.config()\r\n\r\nlet db = null\r\nconst init = async () => {\r\n const connectionString = process.env.DB_CONNECTION_STRING\r\n const aesKey = process.env.DB_AES_KEY\r\n try {\r\n const decryptedConnectionString = aes.decryptString(connectionString, aesKey)\r\n const connectionParams = decryptedConnectionString.split(';').reduce((acc, param) => {\r\n const [key, value] = param.split('=')\r\n acc[key] = value\r\n return acc\r\n }, {})\r\n db = knex({\r\n client: 'mssql',\r\n connection: {\r\n user: connectionParams.user,\r\n password: connectionParams.password,\r\n server: connectionParams.server,\r\n database: connectionParams.database,\r\n options: {\r\n encrypt: false\r\n }\r\n }\r\n })\r\n\r\n // 等待数据库真实连接\r\n await db.raw('SELECT 1')\r\n console.log('database initialized')\r\n return db\r\n } catch (error) {\r\n await close()\r\n\r\n throw error\r\n }\r\n}\r\n\r\nconst close = async () => {\r\n if (db) {\r\n await db.destroy()\r\n db = null\r\n }\r\n}\r\n\r\nexport default {\r\n init,\r\n close\r\n}","import ExcelJS from 'exceljs'\r\nimport path from 'node:path'\r\n\r\n/**\r\n * 内部:构建 sheet columns:[{ header: 'ID', key: 'id', width: 10 }]\r\n */\r\nconst buildSheet = (workbook, columns, data) => {\r\n const sheet = workbook.addWorksheet('sheet1')\r\n sheet.columns = columns\r\n for (const item of data) {\r\n sheet.addRow(item)\r\n }\r\n return sheet\r\n}\r\n\r\n/**\r\n * 小/中数据:生成 Excel 文件(落盘)\r\n * 适合:< 5w 行\r\n */\r\nconst createExcel = async (columns, data, fileName = 'report') => {\r\n const workbook = new ExcelJS.Workbook()\r\n buildSheet(workbook, columns, data)\r\n const filePath = path.join(process.cwd(), `${fileName}.xlsx`)\r\n await workbook.xlsx.writeFile(filePath)\r\n return filePath\r\n}\r\n\r\n/**\r\n * 邮件专用:生成 Buffer(不落盘)\r\n * 适合:中小数据\r\n */\r\nconst createBufferExcel = async (columns, data) => {\r\n const workbook = new ExcelJS.Workbook()\r\n buildSheet(workbook, columns, data)\r\n return await workbook.xlsx.writeBuffer()\r\n}\r\n\r\n/**\r\n * 大数据(核心优化):流式写入(不爆内存)\r\n * 适合:10w ~ 100w+\r\n */\r\nconst createStreamExcel = async (columns, data, fileName = 'report') => {\r\n const filePath = path.join(process.cwd(), `${fileName}.xlsx`)\r\n const workbook = new ExcelJS.stream.xlsx.WorkbookWriter({\r\n filename: filePath,\r\n useStyles: false,\r\n useSharedStrings: true\r\n })\r\n\r\n const sheet = workbook.addWorksheet('Report')\r\n sheet.columns = columns\r\n for (const item of data) {\r\n sheet.addRow(item).commit()\r\n }\r\n await workbook.commit()\r\n return filePath\r\n}\r\n\r\n/**\r\n * 🚀 统一入口(推荐用这个)\r\n */\r\nconst exportExcel = async ({\r\n mode = 'file', // file | buffer | stream\r\n columns,\r\n data,\r\n fileName = 'report'\r\n}) => {\r\n switch (mode) {\r\n case 'buffer':\r\n return await createBufferExcel(columns, data)\r\n\r\n case 'stream':\r\n return await createStreamExcel(columns, data, fileName)\r\n\r\n default:\r\n return await createExcel(columns, data, fileName)\r\n }\r\n}\r\n\r\nexport default {\r\n exportExcel,\r\n createExcel,\r\n createBufferExcel,\r\n createStreamExcel\r\n}","import nodemailer from 'nodemailer'\r\nimport path from 'node:path'\r\n\r\nlet transporter = null\r\nlet from = ''\r\nconst init = () => {\r\n from = `\"${process.env.MAIL_USERNAME}\" <${process.env.MAIL_ACCOUNT}>`\r\n transporter = nodemailer.createTransport({\r\n host: process.env.MAIL_HOST, // 或公司邮箱 SMTP\r\n port: Number(process.env.MAIL_PORT),\r\n secure: true,\r\n auth: {\r\n user: process.env.MAIL_ACCOUNT,\r\n pass: process.env.MAIL_PASSWORD // 注意不是密码\r\n }\r\n })\r\n}\r\n\r\nconst send = async (subject, toUser = '', copyUser = '', content = '', filePath = []) => {\r\n await transporter.sendMail({\r\n from: from,\r\n to: toUser.split(',').map(i => i.trim()).filter(Boolean),\r\n cc: copyUser.split(',').map(i => i.trim()).filter(Boolean),\r\n subject: subject,\r\n text: content,\r\n attachments: filePath.map(file => {\r\n const filename = path.basename(file) // ⭐ 核心:自动截取文件名\r\n return {\r\n path: file,\r\n filename\r\n }\r\n })\r\n })\r\n}\r\n\r\nexport default {\r\n init,\r\n send\r\n}","import { createClient } from 'redis'\r\n\r\nlet client = null\r\nlet isConnected = false\r\n\r\nasync function createRedisClient() {\r\n const redis = createClient({\r\n socket: {\r\n host: process.env.REDIS_HOST,\r\n port: Number(process.env.REDIS_PORT),\r\n reconnectStrategy(retries) {\r\n console.log(`Redis 重连 ${retries}`)\r\n\r\n // 超过 2 次停止重连\r\n if (retries > 3) {\r\n return new Error('Redis 重连失败')\r\n }\r\n\r\n return Math.min(retries * 1000, 5000)\r\n }\r\n },\r\n RESP: 2, // ⭐关键\r\n username: process.env.REDIS_USERNAME || undefined,\r\n password: process.env.REDIS_PASSWORD || undefined,\r\n database: Number(process.env.REDIS_DB || 0)\r\n })\r\n\r\n redis.on('connect', () => {\r\n console.log('Redis 正在连接...')\r\n })\r\n\r\n redis.on('ready', () => {\r\n isConnected = true\r\n console.log('Redis 已连接')\r\n })\r\n\r\n redis.on('reconnecting', () => {\r\n console.log('Redis 重连中...')\r\n })\r\n\r\n redis.on('end', () => {\r\n isConnected = false\r\n console.log('Redis 已断开')\r\n })\r\n\r\n redis.on('error', (err) => {\r\n console.error('Redis异常:', err.message)\r\n })\r\n\r\n await redis.connect()\r\n\r\n return redis\r\n}\r\n\r\nexport async function getRedis() {\r\n if (!client) {\r\n client = await createRedisClient()\r\n }\r\n\r\n return client\r\n}\r\n\r\nexport function redisConnected() {\r\n return isConnected\r\n}\r\n\r\nexport async function closeRedis() {\r\n if (client) {\r\n await client.quit()\r\n client = null\r\n }\r\n}","import { getRedis, closeRedis } from '../core/redis.js'\r\n\r\nclass RedisHelper {\r\n async set(key, value, expireSeconds = null) {\r\n const redis = await getRedis()\r\n\r\n const data =\r\n typeof value === 'object'\r\n ? JSON.stringify(value)\r\n : String(value)\r\n\r\n if (expireSeconds) {\r\n return await redis.set(key, data, {\r\n EX: expireSeconds\r\n })\r\n }\r\n\r\n return await redis.set(key, data)\r\n }\r\n\r\n async get(key) {\r\n const redis = await getRedis()\r\n\r\n const value = await redis.get(key)\r\n\r\n if (!value) return null\r\n\r\n try {\r\n return JSON.parse(value)\r\n } catch {\r\n return value\r\n }\r\n }\r\n\r\n async del(key) {\r\n const redis = await getRedis()\r\n return await redis.del(key)\r\n }\r\n\r\n async exists(key) {\r\n const redis = await getRedis()\r\n return (await redis.exists(key)) === 1\r\n }\r\n\r\n async expire(key, seconds) {\r\n const redis = await getRedis()\r\n return await redis.expire(key, seconds)\r\n }\r\n\r\n async ttl(key) {\r\n const redis = await getRedis()\r\n return await redis.ttl(key)\r\n }\r\n\r\n async incr(key) {\r\n const redis = await getRedis()\r\n return await redis.incr(key)\r\n }\r\n\r\n async decr(key) {\r\n const redis = await getRedis()\r\n return await redis.decr(key)\r\n }\r\n\r\n async hSet(key, field, value) {\r\n const redis = await getRedis()\r\n\r\n return await redis.hSet(\r\n key,\r\n field,\r\n typeof value === 'object'\r\n ? JSON.stringify(value)\r\n : String(value)\r\n )\r\n }\r\n\r\n async hGet(key, field) {\r\n const redis = await getRedis()\r\n\r\n const value = await redis.hGet(key, field)\r\n\r\n if (!value) return null\r\n\r\n try {\r\n return JSON.parse(value)\r\n } catch {\r\n return value\r\n }\r\n }\r\n\r\n async hGetAll(key) {\r\n const redis = await getRedis()\r\n return await redis.hGetAll(key)\r\n }\r\n\r\n async lPush(key, value) {\r\n const redis = await getRedis()\r\n\r\n return await redis.lPush(\r\n key,\r\n JSON.stringify(value)\r\n )\r\n }\r\n\r\n async rPop(key) {\r\n const redis = await getRedis()\r\n\r\n const value = await redis.rPop(key)\r\n\r\n return value\r\n ? JSON.parse(value)\r\n : null\r\n }\r\n\r\n async close() {\r\n await closeRedis()\r\n }\r\n}\r\n\r\nexport default new RedisHelper()","import path from 'node:path'\r\nimport { fileURLToPath } from 'node:url'\r\n\r\nconst __filename = fileURLToPath(import.meta.url)\r\nconst __dirname = path.dirname(__filename)\r\n\r\nexport { __filename, __dirname }","import winston from 'winston'\r\nimport 'winston-daily-rotate-file'\r\n\r\nconst { combine, timestamp, printf } = winston.format\r\nconst logFormat = printf(({ timestamp, level, message }) => {\r\n return `[${timestamp}] [${level.toUpperCase()}] ${message}`\r\n})\r\n\r\nconst breeLogger = winston.createLogger({\r\n level: 'info',\r\n format: combine(\r\n timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n logFormat\r\n ),\r\n transports: [\r\n new winston.transports.Console(),\r\n new winston.transports.DailyRotateFile({\r\n dirname: 'logs',\r\n filename: 'worker-%DATE%.log',\r\n datePattern: 'YYYY-MM-DD',\r\n maxSize: '20m',\r\n maxFiles: '30d'\r\n })\r\n ]\r\n})\r\n\r\n/**\r\n * worker日志\r\n */\r\nconst worker = (jobName, message) => {\r\n breeLogger.info(`[${jobName}] ${message}`)\r\n}\r\n\r\n/**\r\n * error日志\r\n */\r\nconst error = (jobName, err) => {\r\n breeLogger.error(`[${jobName}] ${err?.stack || err?.message || err}`)\r\n}\r\n\r\nexport { worker, error }\r\nexport default { worker, error }","import Bree from 'bree'\r\nimport path from 'node:path'\r\nimport fs from 'node:fs'\r\nimport { __dirname } from './utils/path.js'\r\nimport blogger from './config/breeLogger.js'\r\nimport database from './core/database.js'\r\n\r\nconst projectRoot = path.resolve(__dirname, '../../')\r\n\r\nlet bree = null\r\nlet db = null\r\nlet jobsRoot = null\r\n\r\n// 让使用者通过环境变量或配置指定 jobs 目录\r\nconst getJobsRoot = () => {\r\n if (jobsRoot) return jobsRoot\r\n\r\n // 多种方式获取 jobs 目录\r\n // 1. 环境变量\r\n if (process.env.BREE_JOBS_PATH) {\r\n jobsRoot = path.resolve(process.env.BREE_JOBS_PATH)\r\n return jobsRoot\r\n }\r\n\r\n // 2. 使用当前工作目录(项目根目录)\r\n const cwd = process.cwd()\r\n const possiblePaths = [\r\n path.join(cwd, 'src/jobs'),\r\n path.join(cwd, 'jobs'),\r\n path.join(cwd, 'dist/jobs'),\r\n ]\r\n\r\n for (const p of possiblePaths) {\r\n if (fs.existsSync(p)) {\r\n jobsRoot = p\r\n return jobsRoot\r\n }\r\n }\r\n\r\n // 3. 默认使用当前工作目录下的 src/jobs\r\n jobsRoot = path.join(cwd, 'src/jobs')\r\n console.warn(`Jobs directory not found, using default: ${jobsRoot}`)\r\n return jobsRoot\r\n}\r\n\r\nconst createBree = () => {\r\n const jobsPath = getJobsRoot()\r\n // 确保 jobs 目录存在(创建警告但不自动创建,因为这是使用者的责任)\r\n if (!fs.existsSync(jobsPath)) {\r\n console.warn(`⚠️ Jobs directory not found: ${jobsPath}`)\r\n console.warn(` Please create it or set BREE_JOBS_PATH environment variable`)\r\n }\r\n const instance = new Bree({\r\n hasSeconds: true,\r\n root: jobsPath,\r\n errorHandler: async (error, workerMetadata) => {\r\n if (workerMetadata?.threadId) {\r\n blogger.worker(workerMetadata.name,\r\n `There was an error while running a worker ${workerMetadata.name} with thread ID: ${workerMetadata.threadId}`)\r\n } else {\r\n blogger.worker(workerMetadata.name,\r\n `There was an error while running a worker ${workerMetadata.name}`)\r\n }\r\n\r\n blogger.error(workerMetadata?.name, error)\r\n if (error?.message?.indexOf('exited with code') > -1) return\r\n const job = instance.config.jobs.find(x => x.name === workerMetadata?.name)\r\n const workerData = job?.worker?.workerData\r\n if (workerData) {\r\n await db('Sys_BreeJobs')\r\n .where('ID', workerData.id)\r\n .update({\r\n 'ResultStatus': 1,\r\n 'ErrorMessage': error?.stack\r\n })\r\n }\r\n }\r\n })\r\n\r\n instance.on('worker created', (name) => {\r\n console.log('worker created', name)\r\n blogger.worker(name, 'worker created')\r\n })\r\n\r\n instance.on('worker deleted', (name) => {\r\n console.log('worker deleted', name)\r\n blogger.worker(name, 'worker deleted')\r\n })\r\n\r\n return instance\r\n}\r\n\r\nconst getBree = () => {\r\n return bree\r\n}\r\n\r\nconst reset = async (job, startStatus) => {\r\n await bree.stop(job.name)\r\n const index = bree.config.jobs.findIndex(x => x.name === job.name)\r\n if (index !== -1) bree.config.jobs.splice(index, 1)\r\n await bree.add(job)\r\n if (startStatus) await bree.start(job.name)\r\n}\r\n\r\nconst remove = async (name) => {\r\n await bree.stop(name)\r\n\r\n // 删除运行中的 worker 貌似不需要\r\n // delete bree.workers.get(name)\r\n\r\n const index = bree.config.jobs.findIndex(x => x.name === name)\r\n if (index !== -1) bree.config.jobs.splice(index, 1)\r\n}\r\n\r\nconst create = async (job) => {\r\n if (bree.config.jobs.some(x => x.name === job.name))\r\n return\r\n\r\n await bree.add(job)\r\n}\r\n\r\n// 启动任务\r\nconst start = async (name) => {\r\n await bree.start(name)\r\n}\r\n// 停止任务\r\nconst stop = async (name) => {\r\n await bree.stop(name)\r\n}\r\n// 执行一次任务\r\nconst run = async (name) => {\r\n await bree.run(name)\r\n}\r\n\r\n// 任务初始化\r\nconst init = async () => {\r\n // 1. 从数据库读取任务列表\r\n db = await database.init()\r\n // 2. 创建 Bree 实例(在数据库初始化之后)\r\n bree = createBree()\r\n // 3. 从数据库读取任务列表\r\n const jobs = await db('Sys_BreeJobs') //.where('Status', 1)\r\n // 4. 批量注册到调度器\r\n for (const job of jobs) {\r\n const id = job['ID']\r\n const name = job['Name']\r\n const cron = job['Cron']\r\n const path = job['Path']\r\n const status = job['Status'] // status 状态为0:已停止 1:执行中 2:\r\n const createStatus = job['CreateStatus']\r\n\r\n try {\r\n await create({\r\n name,\r\n cron,\r\n path: path || undefined,\r\n worker: { workerData: { id } }\r\n })\r\n\r\n if (status === 1) await bree.start(name)\r\n if (createStatus === 0) {\r\n await db('Sys_BreeJobs')\r\n .where('ID', id)\r\n .update({\r\n 'CreateStatus': 1\r\n })\r\n }\r\n }\r\n catch (error) {\r\n blogger.error(name, error)\r\n await db('Sys_BreeJobs')\r\n .where('ID', id)\r\n .update({\r\n 'ResultStatus': 1,\r\n 'ErrorMessage': error?.stack\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n init,\r\n create,\r\n reset,\r\n start,\r\n stop,\r\n run,\r\n getBree,\r\n remove\r\n}","import winston from 'winston'\r\nimport 'winston-daily-rotate-file'\r\n\r\nconst { combine, timestamp, printf } = winston.format\r\nconst logFormat = printf(({ timestamp, level, message }) => {\r\n return `[${timestamp}] [${level.toUpperCase()}] ${message}`\r\n})\r\n\r\n/**\r\n * 日志级别过滤器\r\n */\r\nconst levelFilter = (level) => {\r\n return winston.format((info) => {\r\n return info.level === level ? info : false\r\n })()\r\n}\r\n\r\nconst logger = winston.createLogger({\r\n level: 'info',\r\n format: combine(\r\n timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n logFormat\r\n ),\r\n transports: [\r\n new winston.transports.Console(),\r\n new winston.transports.DailyRotateFile({\r\n dirname: 'logs',\r\n filename: 'info-%DATE%.log',\r\n datePattern: 'YYYY-MM-DD',\r\n maxSize: '20m',\r\n maxFiles: '30d',\r\n format: combine(\r\n levelFilter('info'),\r\n timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n logFormat\r\n )\r\n }),\r\n new winston.transports.DailyRotateFile({\r\n dirname: 'logs',\r\n filename: 'error-%DATE%.log',\r\n level: 'error',\r\n datePattern: 'YYYY-MM-DD',\r\n maxSize: '20m',\r\n maxFiles: '30d',\r\n format: combine(\r\n levelFilter('error'),\r\n timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n logFormat\r\n )\r\n })\r\n ]\r\n})\r\n\r\nexport default logger","import { parentPort, workerData } from 'node:worker_threads'\r\nimport logger from './config/logger.js'\r\nimport redis from './utils/redisUtil.js'\r\nimport database from './core/database.js'\r\n\r\nexport function useHandler() {\r\n let isCancelled = false\r\n let db = null\r\n\r\n const getIsCancelled = () => isCancelled\r\n const updateTask = async (obj) => {\r\n await db('Sys_BreeJobs')\r\n .where('ID', workerData.id)\r\n .update(obj)\r\n }\r\n const run = async (worker) => {\r\n if (parentPort)\r\n parentPort.once('message', (message) => {\r\n console.log(message)\r\n if (message === 'cancel') isCancelled = true\r\n })\r\n\r\n db = await database.init()\r\n\r\n try {\r\n const result = await worker({ logger, redis, db })\r\n await updateTask({ 'ResultStatus': 0, 'ExecuteResult': result })\r\n } catch (err) {\r\n await updateTask({ 'ResultStatus': 1, 'ErrorMessage': err.message })\r\n logger.error(`${err?.stack || err?.message || err}`)\r\n } finally {\r\n await redis.close()\r\n await database.close() // 关闭连接池\r\n if (parentPort) {\r\n parentPort.postMessage(\"done\")\r\n } else {\r\n process.exit(0)\r\n }\r\n }\r\n }\r\n\r\n return { run, getIsCancelled }\r\n}\r\n","import crypto from 'node:crypto'\r\n\r\nconst ALGORITHM_MAP = {\r\n 16: 'aes-128-ecb',\r\n 24: 'aes-192-ecb',\r\n 32: 'aes-256-ecb'\r\n}\r\n\r\nconst encrypt = (data, key) => {\r\n // key 必须 16 / 24 / 32 字节\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const cipher = crypto.createCipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n cipher.setAutoPadding(true) // PKCS7\r\n const encrypted = Buffer.concat([\r\n cipher.update(data),\r\n cipher.final()\r\n ])\r\n return encrypted\r\n}\r\n\r\nconst decrypt = (data, key) => {\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const decipher = crypto.createDecipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n decipher.setAutoPadding(true)\r\n const decrypted = Buffer.concat([\r\n decipher.update(data),\r\n decipher.final()\r\n ])\r\n return decrypted\r\n}\r\n\r\n/**\r\n * AES解密\r\n * 对应 Java:\r\n * AesUtil.decrypt(String data, String key)\r\n *\r\n * @param {string} data Base64密文\r\n * @param {string} key AES密钥(16/24/32字节)\r\n * @returns {string} 明文\r\n */\r\nconst decryptString = (data, key) => {\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const decipher = crypto.createDecipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n decipher.setAutoPadding(true)\r\n const decrypted = Buffer.concat([\r\n decipher.update(Buffer.from(data, 'base64')),\r\n decipher.final()\r\n ])\r\n return decrypted.toString('utf8')\r\n}\r\n\r\nexport default { encrypt, decrypt, decryptString }","import aes from \"../utils/AesUtil.js\"\r\n\r\nexport function auth(req, res, next) {\r\n const apiKey = req.headers['x-api-key']\r\n\r\n if (!apiKey) {\r\n return res.status(200).json({\r\n code: -1,\r\n message: 'Missing API Key'\r\n })\r\n }\r\n\r\n const decryptedApiKey = aes.decryptString(apiKey, process.env.API_SECRET_KEY)\r\n if (!decryptedApiKey || decryptedApiKey !== process.env.API_TOKEN) {\r\n return res.status(200).json({\r\n code: -1,\r\n message: 'Unauthorized'\r\n })\r\n }\r\n\r\n let ip = req.ip\r\n console.log('Request IP:', ip)\r\n if (ip.startsWith('::ffff:')) {\r\n ip = ip.substring(7)\r\n }\r\n\r\n const allowIps = process.env.ALLOW_IPS?.split(',') || []\r\n if (!allowIps.includes(ip)) {\r\n return res.status(200)\r\n .json({\r\n code: -1,\r\n message: 'IP forbidden'\r\n })\r\n }\r\n\r\n next()\r\n}","import winston from 'winston'\r\nimport 'winston-daily-rotate-file'\r\n\r\nconst { combine, timestamp, printf } = winston.format\r\nconst logFormat = printf(({ timestamp, level, message }) => {\r\n return `[${timestamp}] [${level.toUpperCase()}] ${message}`\r\n})\r\n\r\nconst weixinLogger = winston.createLogger({\r\n level: 'info',\r\n format: combine(\r\n timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n logFormat\r\n ),\r\n transports: [\r\n new winston.transports.Console(),\r\n new winston.transports.DailyRotateFile({\r\n dirname: 'logs',\r\n filename: 'weixinapi-%DATE%.log',\r\n datePattern: 'YYYY-MM-DD',\r\n maxSize: '20m',\r\n maxFiles: '30d'\r\n })\r\n ]\r\n})\r\n\r\n/**\r\n * worker日志\r\n */\r\nconst info = (apiName, message) => {\r\n weixinLogger.info(`[${apiName}] ${message}`)\r\n}\r\n\r\n/**\r\n * error日志\r\n */\r\nconst error = (apiName, err) => {\r\n weixinLogger.error(`[${apiName}] ${err?.stack || err?.message || err}`)\r\n}\r\n\r\nexport { info, error }\r\nexport default { info, error }"],"names":["ALGORITHM_MAP","encrypt","decrypt","decryptString","db","init","aes","__filename","__dirname","combine","timestamp","printf","logFormat","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils/aesUtil.js","../src/core/database.js","../src/utils/excelUtil.js","../src/utils/mailUtil.js","../src/core/redis.js","../src/utils/redisUtil.js","../src/utils/path.js","../src/config/breeLogger.js","../src/scheduler.js","../src/config/logger.js","../src/useHandler.js","../src/utils/AesUtil.js","../src/core/auth.js","../src/config/weixinLogger.js"],"sourcesContent":["import crypto from 'node:crypto'\r\n\r\nconst ALGORITHM_MAP = {\r\n 16: 'aes-128-ecb',\r\n 24: 'aes-192-ecb',\r\n 32: 'aes-256-ecb'\r\n}\r\n\r\nconst encrypt = (data, key) => {\r\n // key 必须 16 / 24 / 32 字节\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const cipher = crypto.createCipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n cipher.setAutoPadding(true) // PKCS7\r\n const encrypted = Buffer.concat([\r\n cipher.update(data),\r\n cipher.final()\r\n ])\r\n return encrypted\r\n}\r\n\r\nconst decrypt = (data, key) => {\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const decipher = crypto.createDecipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n decipher.setAutoPadding(true)\r\n const decrypted = Buffer.concat([\r\n decipher.update(data),\r\n decipher.final()\r\n ])\r\n return decrypted\r\n}\r\n\r\n/**\r\n * AES解密\r\n * 对应 Java:\r\n * AesUtil.decrypt(String data, String key)\r\n *\r\n * @param {string} data Base64密文\r\n * @param {string} key AES密钥(16/24/32字节)\r\n * @returns {string} 明文\r\n */\r\nconst decryptString = (data, key) => {\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const decipher = crypto.createDecipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n decipher.setAutoPadding(true)\r\n const decrypted = Buffer.concat([\r\n decipher.update(Buffer.from(data, 'base64')),\r\n decipher.final()\r\n ])\r\n return decrypted.toString('utf8')\r\n}\r\n\r\nexport default { encrypt, decrypt, decryptString }","import knex from 'knex'\r\nimport dotenv from 'dotenv'\r\nimport aes from '../utils/aesUtil.js'\r\ndotenv.config()\r\n\r\nlet db = null\r\nconst init = async () => {\r\n const connectionString = process.env.DB_CONNECTION_STRING\r\n const aesKey = process.env.DB_AES_KEY\r\n try {\r\n const decryptedConnectionString = aes.decryptString(connectionString, aesKey)\r\n const connectionParams = decryptedConnectionString.split(';').reduce((acc, param) => {\r\n const [key, value] = param.split('=')\r\n acc[key] = value\r\n return acc\r\n }, {})\r\n db = knex({\r\n client: 'mssql',\r\n connection: {\r\n user: connectionParams.user,\r\n password: connectionParams.password,\r\n server: connectionParams.server,\r\n database: connectionParams.database,\r\n options: {\r\n encrypt: false\r\n }\r\n }\r\n })\r\n\r\n // 等待数据库真实连接\r\n await db.raw('SELECT 1')\r\n console.log('database initialized')\r\n return db\r\n } catch (error) {\r\n await close()\r\n\r\n throw error\r\n }\r\n}\r\n\r\nconst close = async () => {\r\n if (db) {\r\n await db.destroy()\r\n db = null\r\n }\r\n}\r\n\r\nexport default {\r\n init,\r\n close\r\n}","import ExcelJS from 'exceljs'\r\nimport path from 'node:path'\r\nimport fs from 'node:fs/promises'\r\n\r\nlet baseFolder = null\r\n\r\n/**\r\n * 内部:构建 sheet columns:[{ header: 'ID', key: 'id', width: 10 }]\r\n */\r\nconst buildSheet = (workbook, columns, data) => {\r\n const sheet = workbook.addWorksheet('sheet1')\r\n sheet.columns = columns\r\n for (const item of data) {\r\n sheet.addRow(item)\r\n }\r\n return sheet\r\n}\r\n\r\n/**\r\n * 文件\r\n * @param {*} fileName \r\n * @param {*} folder \r\n * @returns \r\n */\r\nconst getFilePath = async (fileName) => {\r\n const baseDir = baseFolder\r\n ? path.resolve(process.cwd(), baseFolder)\r\n : process.cwd()\r\n\r\n await fs.mkdir(baseDir, { recursive: true })\r\n\r\n const name = fileName.endsWith('.xlsx')\r\n ? fileName\r\n : `${fileName}.xlsx`\r\n\r\n return path.join(baseDir, name)\r\n}\r\n\r\n/**\r\n * 设置基础目录\r\n * @param {*} folder \r\n */\r\nconst setFolder = (folder) => {\r\n baseFolder = folder\r\n}\r\n\r\n/**\r\n * 小/中数据:生成 Excel 文件(落盘)\r\n * 适合:< 5w 行\r\n */\r\nconst createExcel = async (columns, data, fileName = 'report') => {\r\n const workbook = new ExcelJS.Workbook()\r\n buildSheet(workbook, columns, data)\r\n const filePath = await getFilePath(fileName)\r\n await workbook.xlsx.writeFile(filePath)\r\n return filePath\r\n}\r\n\r\n/**\r\n * 邮件专用:生成 Buffer(不落盘)\r\n * 适合:中小数据\r\n */\r\nconst createBufferExcel = async (columns, data) => {\r\n const workbook = new ExcelJS.Workbook()\r\n buildSheet(workbook, columns, data)\r\n return await workbook.xlsx.writeBuffer()\r\n}\r\n\r\n/**\r\n * 大数据(核心优化):流式写入(不爆内存)\r\n * 适合:10w ~ 100w+\r\n */\r\nlet streamWorkbook = null\r\nlet streamSheet = null\r\nconst createStreamExcel = async (columns, data, fileName = 'report', lastWrite = false) => {\r\n const filePath = await getFilePath(fileName)\r\n if (!streamWorkbook) {\r\n streamWorkbook = new ExcelJS.stream.xlsx.WorkbookWriter({\r\n filename: filePath,\r\n useStyles: false,\r\n useSharedStrings: true\r\n })\r\n\r\n streamSheet = workbook.addWorksheet('Report')\r\n streamSheet.columns = columns\r\n }\r\n for (const item of data) {\r\n streamSheet.addRow(item).commit()\r\n }\r\n\r\n if (lastWrite) {\r\n await workbook.commit()\r\n streamWorkbook = null\r\n streamSheet = null\r\n }\r\n return filePath\r\n}\r\n\r\n/**\r\n * 🚀 统一入口(推荐用这个)\r\n */\r\nconst exportExcel = async ({\r\n mode = 'file', // file | buffer | stream\r\n columns,\r\n data,\r\n fileName = 'report'\r\n}) => {\r\n switch (mode) {\r\n case 'buffer':\r\n return await createBufferExcel(columns, data)\r\n case 'stream':\r\n return await createStreamExcel(columns, data, fileName, true)\r\n default:\r\n return await createExcel(columns, data, fileName)\r\n }\r\n}\r\n\r\nexport default {\r\n setFolder,\r\n getFilePath,\r\n exportExcel,\r\n createExcel,\r\n createBufferExcel,\r\n createStreamExcel\r\n}","import nodemailer from 'nodemailer'\r\nimport path from 'node:path'\r\n\r\nlet transporter = null\r\nlet from = ''\r\nconst init = () => {\r\n from = `\"${process.env.MAIL_USERNAME}\" <${process.env.MAIL_ACCOUNT}>`\r\n transporter = nodemailer.createTransport({\r\n host: process.env.MAIL_HOST, // 或公司邮箱 SMTP\r\n port: Number(process.env.MAIL_PORT),\r\n secure: true,\r\n auth: {\r\n user: process.env.MAIL_ACCOUNT,\r\n pass: process.env.MAIL_PASSWORD // 注意不是密码\r\n }\r\n })\r\n}\r\n\r\nconst send = async (subject, toUser = '', copyUser = '', content = '', filePath = []) => {\r\n await transporter.sendMail({\r\n from: from,\r\n to: toUser.split(',').map(i => i.trim()).filter(Boolean),\r\n cc: copyUser.split(',').map(i => i.trim()).filter(Boolean),\r\n subject: subject,\r\n text: content,\r\n attachments: filePath.map(file => {\r\n const filename = path.basename(file) // ⭐ 核心:自动截取文件名\r\n return {\r\n path: file,\r\n filename\r\n }\r\n })\r\n })\r\n}\r\n\r\nexport default {\r\n init,\r\n send\r\n}","import { createClient } from 'redis'\r\n\r\nlet client = null\r\nlet isConnected = false\r\n\r\nasync function createRedisClient() {\r\n const redis = createClient({\r\n socket: {\r\n host: process.env.REDIS_HOST,\r\n port: Number(process.env.REDIS_PORT),\r\n reconnectStrategy(retries) {\r\n console.log(`Redis 重连 ${retries}`)\r\n\r\n // 超过 2 次停止重连\r\n if (retries > 3) {\r\n return new Error('Redis 重连失败')\r\n }\r\n\r\n return Math.min(retries * 1000, 5000)\r\n }\r\n },\r\n RESP: 2, // ⭐关键\r\n username: process.env.REDIS_USERNAME || undefined,\r\n password: process.env.REDIS_PASSWORD || undefined,\r\n database: Number(process.env.REDIS_DB || 0)\r\n })\r\n\r\n redis.on('connect', () => {\r\n console.log('Redis 正在连接...')\r\n })\r\n\r\n redis.on('ready', () => {\r\n isConnected = true\r\n console.log('Redis 已连接')\r\n })\r\n\r\n redis.on('reconnecting', () => {\r\n console.log('Redis 重连中...')\r\n })\r\n\r\n redis.on('end', () => {\r\n isConnected = false\r\n console.log('Redis 已断开')\r\n })\r\n\r\n redis.on('error', (err) => {\r\n console.error('Redis异常:', err.message)\r\n })\r\n\r\n await redis.connect()\r\n\r\n return redis\r\n}\r\n\r\nexport async function getRedis() {\r\n if (!client) {\r\n client = await createRedisClient()\r\n }\r\n\r\n return client\r\n}\r\n\r\nexport function redisConnected() {\r\n return isConnected\r\n}\r\n\r\nexport async function closeRedis() {\r\n if (client) {\r\n await client.quit()\r\n client = null\r\n }\r\n}","import { getRedis, closeRedis } from '../core/redis.js'\r\n\r\nclass RedisHelper {\r\n async set(key, value, expireSeconds = null) {\r\n const redis = await getRedis()\r\n\r\n const data =\r\n typeof value === 'object'\r\n ? JSON.stringify(value)\r\n : String(value)\r\n\r\n if (expireSeconds) {\r\n return await redis.set(key, data, {\r\n EX: expireSeconds\r\n })\r\n }\r\n\r\n return await redis.set(key, data)\r\n }\r\n\r\n async get(key) {\r\n const redis = await getRedis()\r\n\r\n const value = await redis.get(key)\r\n\r\n if (!value) return null\r\n\r\n try {\r\n return JSON.parse(value)\r\n } catch {\r\n return value\r\n }\r\n }\r\n\r\n async del(key) {\r\n const redis = await getRedis()\r\n return await redis.del(key)\r\n }\r\n\r\n async exists(key) {\r\n const redis = await getRedis()\r\n return (await redis.exists(key)) === 1\r\n }\r\n\r\n async expire(key, seconds) {\r\n const redis = await getRedis()\r\n return await redis.expire(key, seconds)\r\n }\r\n\r\n async ttl(key) {\r\n const redis = await getRedis()\r\n return await redis.ttl(key)\r\n }\r\n\r\n async incr(key) {\r\n const redis = await getRedis()\r\n return await redis.incr(key)\r\n }\r\n\r\n async decr(key) {\r\n const redis = await getRedis()\r\n return await redis.decr(key)\r\n }\r\n\r\n async hSet(key, field, value) {\r\n const redis = await getRedis()\r\n\r\n return await redis.hSet(\r\n key,\r\n field,\r\n typeof value === 'object'\r\n ? JSON.stringify(value)\r\n : String(value)\r\n )\r\n }\r\n\r\n async hGet(key, field) {\r\n const redis = await getRedis()\r\n\r\n const value = await redis.hGet(key, field)\r\n\r\n if (!value) return null\r\n\r\n try {\r\n return JSON.parse(value)\r\n } catch {\r\n return value\r\n }\r\n }\r\n\r\n async hGetAll(key) {\r\n const redis = await getRedis()\r\n return await redis.hGetAll(key)\r\n }\r\n\r\n async lPush(key, value) {\r\n const redis = await getRedis()\r\n\r\n return await redis.lPush(\r\n key,\r\n JSON.stringify(value)\r\n )\r\n }\r\n\r\n async rPop(key) {\r\n const redis = await getRedis()\r\n\r\n const value = await redis.rPop(key)\r\n\r\n return value\r\n ? JSON.parse(value)\r\n : null\r\n }\r\n\r\n async close() {\r\n await closeRedis()\r\n }\r\n}\r\n\r\nexport default new RedisHelper()","import path from 'node:path'\r\nimport { fileURLToPath } from 'node:url'\r\n\r\nconst __filename = fileURLToPath(import.meta.url)\r\nconst __dirname = path.dirname(__filename)\r\n\r\nexport { __filename, __dirname }","import winston from 'winston'\r\nimport 'winston-daily-rotate-file'\r\n\r\nconst { combine, timestamp, printf } = winston.format\r\nconst logFormat = printf(({ timestamp, level, message }) => {\r\n return `[${timestamp}] [${level.toUpperCase()}] ${message}`\r\n})\r\n\r\nconst breeLogger = winston.createLogger({\r\n level: 'info',\r\n format: combine(\r\n timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n logFormat\r\n ),\r\n transports: [\r\n new winston.transports.Console(),\r\n new winston.transports.DailyRotateFile({\r\n dirname: 'logs',\r\n filename: 'worker-%DATE%.log',\r\n datePattern: 'YYYY-MM-DD',\r\n maxSize: '20m',\r\n maxFiles: '30d'\r\n })\r\n ]\r\n})\r\n\r\n/**\r\n * worker日志\r\n */\r\nconst worker = (jobName, message) => {\r\n breeLogger.info(`[${jobName}] ${message}`)\r\n}\r\n\r\n/**\r\n * error日志\r\n */\r\nconst error = (jobName, err) => {\r\n breeLogger.error(`[${jobName}] ${err?.stack || err?.message || err}`)\r\n}\r\n\r\nexport { worker, error }\r\nexport default { worker, error }","import Bree from 'bree'\r\nimport path from 'node:path'\r\nimport fs from 'node:fs'\r\nimport { __dirname } from './utils/path.js'\r\nimport blogger from './config/breeLogger.js'\r\nimport database from './core/database.js'\r\n\r\nconst projectRoot = path.resolve(__dirname, '../../')\r\n\r\nlet bree = null\r\nlet db = null\r\nlet jobsRoot = null\r\n\r\n// 让使用者通过环境变量或配置指定 jobs 目录\r\nconst getJobsRoot = () => {\r\n if (jobsRoot) return jobsRoot\r\n\r\n // 多种方式获取 jobs 目录\r\n // 1. 环境变量\r\n if (process.env.BREE_JOBS_PATH) {\r\n jobsRoot = path.resolve(process.env.BREE_JOBS_PATH)\r\n return jobsRoot\r\n }\r\n\r\n // 2. 使用当前工作目录(项目根目录)\r\n const cwd = process.cwd()\r\n const possiblePaths = [\r\n path.join(cwd, 'src/jobs'),\r\n path.join(cwd, 'jobs'),\r\n path.join(cwd, 'dist/jobs'),\r\n ]\r\n\r\n for (const p of possiblePaths) {\r\n if (fs.existsSync(p)) {\r\n jobsRoot = p\r\n return jobsRoot\r\n }\r\n }\r\n\r\n // 3. 默认使用当前工作目录下的 src/jobs\r\n jobsRoot = path.join(cwd, 'src/jobs')\r\n console.warn(`Jobs directory not found, using default: ${jobsRoot}`)\r\n return jobsRoot\r\n}\r\n\r\nconst createBree = () => {\r\n const jobsPath = getJobsRoot()\r\n // 确保 jobs 目录存在(创建警告但不自动创建,因为这是使用者的责任)\r\n if (!fs.existsSync(jobsPath)) {\r\n console.warn(`⚠️ Jobs directory not found: ${jobsPath}`)\r\n console.warn(` Please create it or set BREE_JOBS_PATH environment variable`)\r\n }\r\n const instance = new Bree({\r\n hasSeconds: true,\r\n root: jobsPath,\r\n errorHandler: async (error, workerMetadata) => {\r\n if (workerMetadata?.threadId) {\r\n blogger.worker(workerMetadata.name,\r\n `There was an error while running a worker ${workerMetadata.name} with thread ID: ${workerMetadata.threadId}`)\r\n } else {\r\n blogger.worker(workerMetadata.name,\r\n `There was an error while running a worker ${workerMetadata.name}`)\r\n }\r\n\r\n blogger.error(workerMetadata?.name, error)\r\n if (error?.message?.indexOf('exited with code') > -1) return\r\n const job = instance.config.jobs.find(x => x.name === workerMetadata?.name)\r\n const workerData = job?.worker?.workerData\r\n if (workerData) {\r\n await db('Sys_BreeJobs')\r\n .where('ID', workerData.id)\r\n .update({\r\n 'ResultStatus': 1,\r\n 'ErrorMessage': error?.stack\r\n })\r\n }\r\n }\r\n })\r\n\r\n instance.on('worker created', (name) => {\r\n console.log('worker created', name)\r\n blogger.worker(name, 'worker created')\r\n })\r\n\r\n instance.on('worker deleted', (name) => {\r\n console.log('worker deleted', name)\r\n blogger.worker(name, 'worker deleted')\r\n })\r\n\r\n return instance\r\n}\r\n\r\nconst getBree = () => {\r\n return bree\r\n}\r\n\r\nconst reset = async (job, startStatus) => {\r\n await bree.stop(job.name)\r\n const index = bree.config.jobs.findIndex(x => x.name === job.name)\r\n if (index !== -1) bree.config.jobs.splice(index, 1)\r\n await bree.add(job)\r\n if (startStatus) await bree.start(job.name)\r\n}\r\n\r\nconst remove = async (name) => {\r\n await bree.stop(name)\r\n\r\n // 删除运行中的 worker 貌似不需要\r\n // delete bree.workers.get(name)\r\n\r\n const index = bree.config.jobs.findIndex(x => x.name === name)\r\n if (index !== -1) bree.config.jobs.splice(index, 1)\r\n}\r\n\r\nconst create = async (job) => {\r\n if (bree.config.jobs.some(x => x.name === job.name))\r\n return\r\n\r\n await bree.add(job)\r\n}\r\n\r\n// 启动任务\r\nconst start = async (name) => {\r\n await bree.start(name)\r\n}\r\n// 停止任务\r\nconst stop = async (name) => {\r\n await bree.stop(name)\r\n}\r\n// 执行一次任务\r\nconst run = async (name) => {\r\n await bree.run(name)\r\n}\r\n\r\n// 任务初始化\r\nconst init = async () => {\r\n // 1. 从数据库读取任务列表\r\n db = await database.init()\r\n // 2. 创建 Bree 实例(在数据库初始化之后)\r\n bree = createBree()\r\n // 3. 从数据库读取任务列表\r\n const jobs = await db('Sys_BreeJobs') //.where('Status', 1)\r\n // 4. 批量注册到调度器\r\n for (const job of jobs) {\r\n const id = job['ID']\r\n const name = job['Name']\r\n const cron = job['Cron']\r\n const path = job['Path']\r\n const status = job['Status'] // status 状态为0:已停止 1:执行中 2:\r\n const createStatus = job['CreateStatus']\r\n\r\n try {\r\n await create({\r\n name,\r\n cron,\r\n path: path || undefined,\r\n worker: { workerData: { id } }\r\n })\r\n\r\n if (status === 1) await bree.start(name)\r\n if (createStatus === 0) {\r\n await db('Sys_BreeJobs')\r\n .where('ID', id)\r\n .update({\r\n 'CreateStatus': 1\r\n })\r\n }\r\n }\r\n catch (error) {\r\n blogger.error(name, error)\r\n await db('Sys_BreeJobs')\r\n .where('ID', id)\r\n .update({\r\n 'ResultStatus': 1,\r\n 'ErrorMessage': error?.stack\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n init,\r\n create,\r\n reset,\r\n start,\r\n stop,\r\n run,\r\n getBree,\r\n remove\r\n}","import winston from 'winston'\r\nimport 'winston-daily-rotate-file'\r\n\r\nconst { combine, timestamp, printf } = winston.format\r\nconst logFormat = printf(({ timestamp, level, message }) => {\r\n return `[${timestamp}] [${level.toUpperCase()}] ${message}`\r\n})\r\n\r\n/**\r\n * 日志级别过滤器\r\n */\r\nconst levelFilter = (level) => {\r\n return winston.format((info) => {\r\n return info.level === level ? info : false\r\n })()\r\n}\r\n\r\nconst logger = winston.createLogger({\r\n level: 'info',\r\n format: combine(\r\n timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n logFormat\r\n ),\r\n transports: [\r\n new winston.transports.Console(),\r\n new winston.transports.DailyRotateFile({\r\n dirname: 'logs',\r\n filename: 'info-%DATE%.log',\r\n datePattern: 'YYYY-MM-DD',\r\n maxSize: '20m',\r\n maxFiles: '30d',\r\n format: combine(\r\n levelFilter('info'),\r\n timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n logFormat\r\n )\r\n }),\r\n new winston.transports.DailyRotateFile({\r\n dirname: 'logs',\r\n filename: 'error-%DATE%.log',\r\n level: 'error',\r\n datePattern: 'YYYY-MM-DD',\r\n maxSize: '20m',\r\n maxFiles: '30d',\r\n format: combine(\r\n levelFilter('error'),\r\n timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n logFormat\r\n )\r\n })\r\n ]\r\n})\r\n\r\nexport default logger","import { parentPort, workerData } from 'node:worker_threads'\r\nimport logger from './config/logger.js'\r\nimport redis from './utils/redisUtil.js'\r\nimport database from './core/database.js'\r\n\r\nexport function useHandler() {\r\n let isCancelled = false\r\n let db = null\r\n\r\n const getIsCancelled = () => isCancelled\r\n const updateTask = async (obj) => {\r\n await db('Sys_BreeJobs')\r\n .where('ID', workerData.id)\r\n .update(obj)\r\n }\r\n const run = async (worker) => {\r\n if (parentPort)\r\n parentPort.once('message', (message) => {\r\n console.log(message)\r\n if (message === 'cancel') isCancelled = true\r\n })\r\n\r\n db = await database.init()\r\n\r\n try {\r\n const result = await worker({ logger, redis, db })\r\n await updateTask({ 'ResultStatus': 0, 'ExecuteResult': result })\r\n } catch (err) {\r\n await updateTask({ 'ResultStatus': 1, 'ErrorMessage': err.message })\r\n logger.error(`${err?.stack || err?.message || err}`)\r\n } finally {\r\n await redis.close()\r\n await database.close() // 关闭连接池\r\n if (parentPort) {\r\n parentPort.postMessage(\"done\")\r\n } else {\r\n process.exit(0)\r\n }\r\n }\r\n }\r\n\r\n return { run, getIsCancelled }\r\n}\r\n","import crypto from 'node:crypto'\r\n\r\nconst ALGORITHM_MAP = {\r\n 16: 'aes-128-ecb',\r\n 24: 'aes-192-ecb',\r\n 32: 'aes-256-ecb'\r\n}\r\n\r\nconst encrypt = (data, key) => {\r\n // key 必须 16 / 24 / 32 字节\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const cipher = crypto.createCipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n cipher.setAutoPadding(true) // PKCS7\r\n const encrypted = Buffer.concat([\r\n cipher.update(data),\r\n cipher.final()\r\n ])\r\n return encrypted\r\n}\r\n\r\nconst decrypt = (data, key) => {\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const decipher = crypto.createDecipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n decipher.setAutoPadding(true)\r\n const decrypted = Buffer.concat([\r\n decipher.update(data),\r\n decipher.final()\r\n ])\r\n return decrypted\r\n}\r\n\r\n/**\r\n * AES解密\r\n * 对应 Java:\r\n * AesUtil.decrypt(String data, String key)\r\n *\r\n * @param {string} data Base64密文\r\n * @param {string} key AES密钥(16/24/32字节)\r\n * @returns {string} 明文\r\n */\r\nconst decryptString = (data, key) => {\r\n const keyBuf = Buffer.from(key, 'utf8')\r\n const decipher = crypto.createDecipheriv(ALGORITHM_MAP[keyBuf.length], keyBuf, null)\r\n decipher.setAutoPadding(true)\r\n const decrypted = Buffer.concat([\r\n decipher.update(Buffer.from(data, 'base64')),\r\n decipher.final()\r\n ])\r\n return decrypted.toString('utf8')\r\n}\r\n\r\nexport default { encrypt, decrypt, decryptString }","import aes from \"../utils/AesUtil.js\"\r\n\r\nexport function auth(req, res, next) {\r\n const apiKey = req.headers['x-api-key']\r\n\r\n if (!apiKey) {\r\n return res.status(200).json({\r\n code: -1,\r\n message: 'Missing API Key'\r\n })\r\n }\r\n\r\n const decryptedApiKey = aes.decryptString(apiKey, process.env.API_SECRET_KEY)\r\n if (!decryptedApiKey || decryptedApiKey !== process.env.API_TOKEN) {\r\n return res.status(200).json({\r\n code: -1,\r\n message: 'Unauthorized'\r\n })\r\n }\r\n\r\n let ip = req.ip\r\n console.log('Request IP:', ip)\r\n if (ip.startsWith('::ffff:')) {\r\n ip = ip.substring(7)\r\n }\r\n\r\n const allowIps = process.env.ALLOW_IPS?.split(',') || []\r\n if (!allowIps.includes(ip)) {\r\n return res.status(200)\r\n .json({\r\n code: -1,\r\n message: 'IP forbidden'\r\n })\r\n }\r\n\r\n next()\r\n}","import winston from 'winston'\r\nimport 'winston-daily-rotate-file'\r\n\r\nconst { combine, timestamp, printf } = winston.format\r\nconst logFormat = printf(({ timestamp, level, message }) => {\r\n return `[${timestamp}] [${level.toUpperCase()}] ${message}`\r\n})\r\n\r\nconst weixinLogger = winston.createLogger({\r\n level: 'info',\r\n format: combine(\r\n timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n logFormat\r\n ),\r\n transports: [\r\n new winston.transports.Console(),\r\n new winston.transports.DailyRotateFile({\r\n dirname: 'logs',\r\n filename: 'weixinapi-%DATE%.log',\r\n datePattern: 'YYYY-MM-DD',\r\n maxSize: '20m',\r\n maxFiles: '30d'\r\n })\r\n ]\r\n})\r\n\r\n/**\r\n * worker日志\r\n */\r\nconst info = (apiName, message) => {\r\n weixinLogger.info(`[${apiName}] ${message}`)\r\n}\r\n\r\n/**\r\n * error日志\r\n */\r\nconst error = (apiName, err) => {\r\n weixinLogger.error(`[${apiName}] ${err?.stack || err?.message || err}`)\r\n}\r\n\r\nexport { info, error }\r\nexport default { info, error }"],"names":["ALGORITHM_MAP","encrypt","decrypt","decryptString","db","init","aes","__filename","__dirname","combine","timestamp","printf","logFormat","error","fs"],"mappings":"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"}
|