@layoutkit/bree-core 1.0.9 → 1.0.10
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 +135 -106
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import knex from 'knex';
|
|
2
|
-
import dotenv from 'dotenv';
|
|
3
|
-
import crypto from 'node:crypto';
|
|
4
1
|
import ExcelJS from 'exceljs';
|
|
5
2
|
import path from 'node:path';
|
|
6
3
|
import fs from 'node:fs/promises';
|
|
@@ -11,108 +8,11 @@ import fs$1 from 'node:fs';
|
|
|
11
8
|
import { fileURLToPath } from 'node:url';
|
|
12
9
|
import winston from 'winston';
|
|
13
10
|
import 'winston-daily-rotate-file';
|
|
11
|
+
import knex from 'knex';
|
|
12
|
+
import dotenv from 'dotenv';
|
|
13
|
+
import crypto from 'node:crypto';
|
|
14
14
|
import { parentPort, workerData } from 'node:worker_threads';
|
|
15
15
|
|
|
16
|
-
const ALGORITHM_MAP$1 = {
|
|
17
|
-
16: 'aes-128-ecb',
|
|
18
|
-
24: 'aes-192-ecb',
|
|
19
|
-
32: 'aes-256-ecb'
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
const encrypt$1 = (data, key) => {
|
|
23
|
-
// key 必须 16 / 24 / 32 字节
|
|
24
|
-
const keyBuf = Buffer.from(key, 'utf8');
|
|
25
|
-
const cipher = crypto.createCipheriv(ALGORITHM_MAP$1[keyBuf.length], keyBuf, null);
|
|
26
|
-
cipher.setAutoPadding(true); // PKCS7
|
|
27
|
-
const encrypted = Buffer.concat([
|
|
28
|
-
cipher.update(data),
|
|
29
|
-
cipher.final()
|
|
30
|
-
]);
|
|
31
|
-
return encrypted
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const decrypt$1 = (data, key) => {
|
|
35
|
-
const keyBuf = Buffer.from(key, 'utf8');
|
|
36
|
-
const decipher = crypto.createDecipheriv(ALGORITHM_MAP$1[keyBuf.length], keyBuf, null);
|
|
37
|
-
decipher.setAutoPadding(true);
|
|
38
|
-
const decrypted = Buffer.concat([
|
|
39
|
-
decipher.update(data),
|
|
40
|
-
decipher.final()
|
|
41
|
-
]);
|
|
42
|
-
return decrypted
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* AES解密
|
|
47
|
-
* 对应 Java:
|
|
48
|
-
* AesUtil.decrypt(String data, String key)
|
|
49
|
-
*
|
|
50
|
-
* @param {string} data Base64密文
|
|
51
|
-
* @param {string} key AES密钥(16/24/32字节)
|
|
52
|
-
* @returns {string} 明文
|
|
53
|
-
*/
|
|
54
|
-
const decryptString$1 = (data, key) => {
|
|
55
|
-
const keyBuf = Buffer.from(key, 'utf8');
|
|
56
|
-
const decipher = crypto.createDecipheriv(ALGORITHM_MAP$1[keyBuf.length], keyBuf, null);
|
|
57
|
-
decipher.setAutoPadding(true);
|
|
58
|
-
const decrypted = Buffer.concat([
|
|
59
|
-
decipher.update(Buffer.from(data, 'base64')),
|
|
60
|
-
decipher.final()
|
|
61
|
-
]);
|
|
62
|
-
return decrypted.toString('utf8')
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
var aes$1 = { encrypt: encrypt$1, decrypt: decrypt$1, decryptString: decryptString$1 };
|
|
66
|
-
|
|
67
|
-
dotenv.config();
|
|
68
|
-
|
|
69
|
-
let db$1 = null;
|
|
70
|
-
const init$2 = async () => {
|
|
71
|
-
const connectionString = process.env.DB_CONNECTION_STRING;
|
|
72
|
-
const aesKey = process.env.DB_AES_KEY;
|
|
73
|
-
try {
|
|
74
|
-
const decryptedConnectionString = aes$1.decryptString(connectionString, aesKey);
|
|
75
|
-
const connectionParams = decryptedConnectionString.split(';').reduce((acc, param) => {
|
|
76
|
-
const [key, value] = param.split('=');
|
|
77
|
-
acc[key] = value;
|
|
78
|
-
return acc
|
|
79
|
-
}, {});
|
|
80
|
-
db$1 = knex({
|
|
81
|
-
client: 'mssql',
|
|
82
|
-
connection: {
|
|
83
|
-
user: connectionParams.user,
|
|
84
|
-
password: connectionParams.password,
|
|
85
|
-
server: connectionParams.server,
|
|
86
|
-
database: connectionParams.database,
|
|
87
|
-
options: {
|
|
88
|
-
encrypt: false
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// 等待数据库真实连接
|
|
94
|
-
await db$1.raw('SELECT 1');
|
|
95
|
-
console.log('database initialized');
|
|
96
|
-
return db$1
|
|
97
|
-
} catch (error) {
|
|
98
|
-
await close();
|
|
99
|
-
|
|
100
|
-
throw error
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
const close = async () => {
|
|
105
|
-
if (db$1) {
|
|
106
|
-
await db$1.destroy();
|
|
107
|
-
db$1 = null;
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
var database = {
|
|
112
|
-
init: init$2,
|
|
113
|
-
close
|
|
114
|
-
};
|
|
115
|
-
|
|
116
16
|
let baseFolder = null;
|
|
117
17
|
|
|
118
18
|
/**
|
|
@@ -237,7 +137,7 @@ var excelUtil = {
|
|
|
237
137
|
|
|
238
138
|
let transporter = null;
|
|
239
139
|
let from = '';
|
|
240
|
-
const init$
|
|
140
|
+
const init$2 = () => {
|
|
241
141
|
from = `"${process.env.MAIL_USERNAME}" <${process.env.MAIL_ACCOUNT}>`;
|
|
242
142
|
transporter = nodemailer.createTransport({
|
|
243
143
|
host: process.env.MAIL_HOST, // 或公司邮箱 SMTP
|
|
@@ -268,7 +168,7 @@ const send = async (subject, toUser = '', copyUser = '', content = '', filePath
|
|
|
268
168
|
};
|
|
269
169
|
|
|
270
170
|
var mailUtil = {
|
|
271
|
-
init: init$
|
|
171
|
+
init: init$2,
|
|
272
172
|
send
|
|
273
173
|
};
|
|
274
174
|
|
|
@@ -438,6 +338,15 @@ class RedisHelper {
|
|
|
438
338
|
)
|
|
439
339
|
}
|
|
440
340
|
|
|
341
|
+
async rPush(key, value) {
|
|
342
|
+
const redis = await getRedis();
|
|
343
|
+
|
|
344
|
+
return await redis.rPush(
|
|
345
|
+
key,
|
|
346
|
+
JSON.stringify(value)
|
|
347
|
+
)
|
|
348
|
+
}
|
|
349
|
+
|
|
441
350
|
async rPop(key) {
|
|
442
351
|
const redis = await getRedis();
|
|
443
352
|
|
|
@@ -448,6 +357,16 @@ class RedisHelper {
|
|
|
448
357
|
: null
|
|
449
358
|
}
|
|
450
359
|
|
|
360
|
+
async lPop(key) {
|
|
361
|
+
const redis = await getRedis();
|
|
362
|
+
|
|
363
|
+
const value = await redis.lPop(key);
|
|
364
|
+
|
|
365
|
+
return value
|
|
366
|
+
? JSON.parse(value)
|
|
367
|
+
: null
|
|
368
|
+
}
|
|
369
|
+
|
|
451
370
|
async close() {
|
|
452
371
|
await closeRedis();
|
|
453
372
|
}
|
|
@@ -496,6 +415,116 @@ const error$1 = (jobName, err) => {
|
|
|
496
415
|
};
|
|
497
416
|
var blogger = { worker, error: error$1 };
|
|
498
417
|
|
|
418
|
+
const ALGORITHM_MAP$1 = {
|
|
419
|
+
16: 'aes-128-ecb',
|
|
420
|
+
24: 'aes-192-ecb',
|
|
421
|
+
32: 'aes-256-ecb'
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
const encrypt$1 = (data, key) => {
|
|
425
|
+
// key 必须 16 / 24 / 32 字节
|
|
426
|
+
const keyBuf = Buffer.from(key, 'utf8');
|
|
427
|
+
const cipher = crypto.createCipheriv(ALGORITHM_MAP$1[keyBuf.length], keyBuf, null);
|
|
428
|
+
cipher.setAutoPadding(true); // PKCS7
|
|
429
|
+
const encrypted = Buffer.concat([
|
|
430
|
+
cipher.update(data),
|
|
431
|
+
cipher.final()
|
|
432
|
+
]);
|
|
433
|
+
return encrypted
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
const decrypt$1 = (data, key) => {
|
|
437
|
+
const keyBuf = Buffer.from(key, 'utf8');
|
|
438
|
+
const decipher = crypto.createDecipheriv(ALGORITHM_MAP$1[keyBuf.length], keyBuf, null);
|
|
439
|
+
decipher.setAutoPadding(true);
|
|
440
|
+
const decrypted = Buffer.concat([
|
|
441
|
+
decipher.update(data),
|
|
442
|
+
decipher.final()
|
|
443
|
+
]);
|
|
444
|
+
return decrypted
|
|
445
|
+
};
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* AES解密
|
|
449
|
+
* 对应 Java:
|
|
450
|
+
* AesUtil.decrypt(String data, String key)
|
|
451
|
+
*
|
|
452
|
+
* @param {string} data Base64密文
|
|
453
|
+
* @param {string} key AES密钥(16/24/32字节)
|
|
454
|
+
* @returns {string} 明文
|
|
455
|
+
*/
|
|
456
|
+
const decryptString$1 = (data, key) => {
|
|
457
|
+
const keyBuf = Buffer.from(key, 'utf8');
|
|
458
|
+
const decipher = crypto.createDecipheriv(ALGORITHM_MAP$1[keyBuf.length], keyBuf, null);
|
|
459
|
+
decipher.setAutoPadding(true);
|
|
460
|
+
const decrypted = Buffer.concat([
|
|
461
|
+
decipher.update(Buffer.from(data, 'base64')),
|
|
462
|
+
decipher.final()
|
|
463
|
+
]);
|
|
464
|
+
return decrypted.toString('utf8')
|
|
465
|
+
};
|
|
466
|
+
|
|
467
|
+
var aes$1 = { encrypt: encrypt$1, decrypt: decrypt$1, decryptString: decryptString$1 };
|
|
468
|
+
|
|
469
|
+
dotenv.config();
|
|
470
|
+
|
|
471
|
+
function useDatabase() {
|
|
472
|
+
let db = null;
|
|
473
|
+
|
|
474
|
+
const init = async (connectionString) => {
|
|
475
|
+
const aesKey = process.env.DB_AES_KEY;
|
|
476
|
+
try {
|
|
477
|
+
const decryptedConnectionString = aes$1.decryptString(connectionString, aesKey);
|
|
478
|
+
const connectionParams = decryptedConnectionString.split(';').reduce((acc, param) => {
|
|
479
|
+
const [key, value] = param.split('=');
|
|
480
|
+
acc[key] = value;
|
|
481
|
+
return acc
|
|
482
|
+
}, {});
|
|
483
|
+
db = knex({
|
|
484
|
+
client: 'mssql',
|
|
485
|
+
connection: {
|
|
486
|
+
user: connectionParams.user,
|
|
487
|
+
password: connectionParams.password,
|
|
488
|
+
server: connectionParams.server,
|
|
489
|
+
database: connectionParams.database,
|
|
490
|
+
options: {
|
|
491
|
+
encrypt: false
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
// 等待数据库真实连接
|
|
497
|
+
await db.raw('SELECT 1');
|
|
498
|
+
console.log('database initialized');
|
|
499
|
+
return db
|
|
500
|
+
} catch (error) {
|
|
501
|
+
await close();
|
|
502
|
+
|
|
503
|
+
throw error
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
const close = async () => {
|
|
508
|
+
if (db) {
|
|
509
|
+
await db.destroy();
|
|
510
|
+
db = null;
|
|
511
|
+
}
|
|
512
|
+
};
|
|
513
|
+
|
|
514
|
+
return { init, close }
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
dotenv.config();
|
|
518
|
+
|
|
519
|
+
const db$1 = useDatabase();
|
|
520
|
+
const init$1 = async () => await db$1.init(process.env.DB_CONNECTION_STRING);
|
|
521
|
+
const close = async () => await db$1.close();
|
|
522
|
+
|
|
523
|
+
var database = {
|
|
524
|
+
init: init$1,
|
|
525
|
+
close
|
|
526
|
+
};
|
|
527
|
+
|
|
499
528
|
path.resolve(__dirname$1, '../../');
|
|
500
529
|
|
|
501
530
|
let bree = null;
|
|
@@ -894,5 +923,5 @@ const error = (apiName, err) => {
|
|
|
894
923
|
};
|
|
895
924
|
var weixinLogger_default = { info, error };
|
|
896
925
|
|
|
897
|
-
export { aes$1 as aes, auth, database
|
|
926
|
+
export { aes$1 as aes, auth, database, excelUtil as excel, mailUtil as mail, redis, scheduler, useDatabase, useHandler, weixinLogger_default as weixinLogger };
|
|
898
927
|
//# sourceMappingURL=index.js.map
|
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\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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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../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/utils/aesUtil.js","../src/core/useDatabase.js","../src/utils/databaseUtil.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 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 rPush(key, value) {\r\n const redis = await getRedis()\r\n\r\n return await redis.rPush(\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 lPop(key) {\r\n const redis = await getRedis()\r\n\r\n const value = await redis.lPop(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 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\nexport function useDatabase() {\r\n let db = null\r\n\r\n const init = async (connectionString) => {\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\n const close = async () => {\r\n if (db) {\r\n await db.destroy()\r\n db = null\r\n }\r\n }\r\n\r\n return { init, close }\r\n}","import { useDatabase } from '../core/useDatabase.js'\r\nimport dotenv from 'dotenv'\r\ndotenv.config()\r\n\r\nconst db = useDatabase()\r\nconst init = async () => await db.init(process.env.DB_CONNECTION_STRING)\r\nconst close = async () => await db.close()\r\n\r\nexport default {\r\n init,\r\n close\r\n}","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 './utils/databaseUtil.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 './utils/databaseUtil.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":["init","__filename","__dirname","combine","timestamp","printf","logFormat","error","ALGORITHM_MAP","encrypt","decrypt","decryptString","aes","db","fs"],"mappings":"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"}
|