sa2kit 1.6.29 → 1.6.31
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/AliyunOSSProvider-P6TOVKMM.mjs +6 -0
- package/dist/{AliyunOSSProvider-I7I5YGLB.mjs.map → AliyunOSSProvider-P6TOVKMM.mjs.map} +1 -1
- package/dist/AliyunOSSProvider-Z5BRBCG6.js +15 -0
- package/dist/{AliyunOSSProvider-L7JWMKS4.js.map → AliyunOSSProvider-Z5BRBCG6.js.map} +1 -1
- package/dist/ConfigService-3DIC6C3Q.js +21 -0
- package/dist/{ConfigService-7MEZXKJ5.js.map → ConfigService-3DIC6C3Q.js.map} +1 -1
- package/dist/ConfigService-V6ZK273Z.mjs +4 -0
- package/dist/{ConfigService-BV57YYFW.mjs.map → ConfigService-V6ZK273Z.mjs.map} +1 -1
- package/dist/LocalStorageProvider-3RVPCQB3.mjs +6 -0
- package/dist/{LocalStorageProvider-FVLLHBHO.mjs.map → LocalStorageProvider-3RVPCQB3.mjs.map} +1 -1
- package/dist/LocalStorageProvider-PP7MA5OT.js +15 -0
- package/dist/{LocalStorageProvider-NBNHHWLY.js.map → LocalStorageProvider-PP7MA5OT.js.map} +1 -1
- package/dist/PMXParser-2VTA737I.js +13 -0
- package/dist/{PMXParser-YBS3B6HM.js.map → PMXParser-2VTA737I.js.map} +1 -1
- package/dist/PMXParser-RNVQL76A.mjs +4 -0
- package/dist/{PMXParser-L6IWHL4I.mjs.map → PMXParser-RNVQL76A.mjs.map} +1 -1
- package/dist/analytics/index.js +46 -45
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/index.mjs +45 -44
- package/dist/analytics/index.mjs.map +1 -1
- package/dist/analytics/server/index.js +4 -4
- package/dist/analytics/server/index.js.map +1 -1
- package/dist/analytics/server/index.mjs +4 -4
- package/dist/analytics/server/index.mjs.map +1 -1
- package/dist/api/index.js +5 -5
- package/dist/api/index.js.map +1 -1
- package/dist/api/index.mjs +5 -5
- package/dist/api/index.mjs.map +1 -1
- package/dist/audioDetection/index.js +17 -16
- package/dist/audioDetection/index.js.map +1 -1
- package/dist/audioDetection/index.mjs +17 -16
- package/dist/audioDetection/index.mjs.map +1 -1
- package/dist/auth/client/index.js +4 -4
- package/dist/auth/client/index.mjs +1 -1
- package/dist/auth/components/index.js +3 -3
- package/dist/auth/components/index.js.map +1 -1
- package/dist/auth/components/index.mjs +3 -3
- package/dist/auth/components/index.mjs.map +1 -1
- package/dist/auth/index.js +29 -29
- package/dist/auth/index.mjs +5 -5
- package/dist/auth/middleware/index.js +3 -3
- package/dist/auth/middleware/index.mjs +2 -2
- package/dist/auth/routes/index.js +14 -14
- package/dist/auth/routes/index.mjs +2 -2
- package/dist/auth/services/index.js +7 -7
- package/dist/auth/services/index.mjs +1 -1
- package/dist/calendar/index.js +146 -182
- package/dist/calendar/index.js.map +1 -1
- package/dist/calendar/index.mjs +139 -175
- package/dist/calendar/index.mjs.map +1 -1
- package/dist/calendar/routes/index.js +1 -1
- package/dist/calendar/routes/index.js.map +1 -1
- package/dist/calendar/routes/index.mjs +1 -1
- package/dist/calendar/routes/index.mjs.map +1 -1
- package/dist/{chunk-5YQ5B7IZ.js → chunk-24HGREE6.js} +5 -5
- package/dist/{chunk-5YQ5B7IZ.js.map → chunk-24HGREE6.js.map} +1 -1
- package/dist/{chunk-6PRFP5EG.js → chunk-25OFOKNF.js} +6 -6
- package/dist/chunk-25OFOKNF.js.map +1 -0
- package/dist/{chunk-KQGP6BTS.mjs → chunk-3DXPQ4YV.mjs} +6 -6
- package/dist/chunk-3DXPQ4YV.mjs.map +1 -0
- package/dist/{chunk-3BGPZN4X.mjs → chunk-3NHAT7D4.mjs} +12 -12
- package/dist/chunk-3NHAT7D4.mjs.map +1 -0
- package/dist/{chunk-MW4BCIZC.mjs → chunk-4HC6M7FK.mjs} +3 -3
- package/dist/chunk-4HC6M7FK.mjs.map +1 -0
- package/dist/{chunk-ESRCX5TQ.mjs → chunk-52TN2QSS.mjs} +3 -3
- package/dist/{chunk-ESRCX5TQ.mjs.map → chunk-52TN2QSS.mjs.map} +1 -1
- package/dist/{chunk-DW2ZTOCV.js → chunk-5A7ERLKK.js} +105 -106
- package/dist/chunk-5A7ERLKK.js.map +1 -0
- package/dist/{chunk-CNTILN5J.mjs → chunk-5YQ62BKX.mjs} +20 -19
- package/dist/chunk-5YQ62BKX.mjs.map +1 -0
- package/dist/{chunk-6W5BMXJG.js → chunk-6OWNMJKG.js} +4 -4
- package/dist/{chunk-6W5BMXJG.js.map → chunk-6OWNMJKG.js.map} +1 -1
- package/dist/{chunk-WSNM4EU5.mjs → chunk-77M5AQG3.mjs} +37 -41
- package/dist/chunk-77M5AQG3.mjs.map +1 -0
- package/dist/{chunk-DUHZ7VZP.js → chunk-7VRT55ZD.js} +3 -3
- package/dist/chunk-7VRT55ZD.js.map +1 -0
- package/dist/{chunk-LX4XX6W7.js → chunk-C54W2CMK.js} +16 -16
- package/dist/chunk-C54W2CMK.js.map +1 -0
- package/dist/{chunk-3WOAPLEG.mjs → chunk-EB4NR623.mjs} +27 -26
- package/dist/chunk-EB4NR623.mjs.map +1 -0
- package/dist/{chunk-CD77U7LZ.js → chunk-GBPLX42J.js} +9 -9
- package/dist/chunk-GBPLX42J.js.map +1 -0
- package/dist/{chunk-TFQF2HDO.mjs → chunk-HDEOCX2L.mjs} +12 -12
- package/dist/chunk-HDEOCX2L.mjs.map +1 -0
- package/dist/{chunk-LFG6FPM5.mjs → chunk-KIP2CERU.mjs} +37 -38
- package/dist/chunk-KIP2CERU.mjs.map +1 -0
- package/dist/{chunk-6YKMCPQI.mjs → chunk-KZKIH4AS.mjs} +4 -4
- package/dist/chunk-KZKIH4AS.mjs.map +1 -0
- package/dist/{chunk-6MQUBPKB.mjs → chunk-LJ4CCSSY.mjs} +3 -3
- package/dist/{chunk-6MQUBPKB.mjs.map → chunk-LJ4CCSSY.mjs.map} +1 -1
- package/dist/{chunk-TOC5FSHP.js → chunk-NJ2SNXBJ.js} +12 -12
- package/dist/chunk-NJ2SNXBJ.js.map +1 -0
- package/dist/{chunk-OCR5DS4C.mjs → chunk-PE5EAHZK.mjs} +3 -3
- package/dist/chunk-PE5EAHZK.mjs.map +1 -0
- package/dist/{chunk-TKCYPDWU.js → chunk-Q5EDCKQA.js} +27 -29
- package/dist/chunk-Q5EDCKQA.js.map +1 -0
- package/dist/{chunk-CLKKZSPZ.js → chunk-RBKGYWME.js} +20 -19
- package/dist/chunk-RBKGYWME.js.map +1 -0
- package/dist/{chunk-VRTRSEEH.mjs → chunk-RSJSZ7QH.mjs} +11 -11
- package/dist/chunk-RSJSZ7QH.mjs.map +1 -0
- package/dist/{chunk-E7RGBAYJ.js → chunk-TDCDEBGP.js} +30 -29
- package/dist/chunk-TDCDEBGP.js.map +1 -0
- package/dist/{chunk-T5OZHYVM.mjs → chunk-TVROG2Q4.mjs} +15 -15
- package/dist/chunk-TVROG2Q4.mjs.map +1 -0
- package/dist/{chunk-JZXJQMVE.js → chunk-UIFFDRTE.js} +11 -11
- package/dist/chunk-UIFFDRTE.js.map +1 -0
- package/dist/{chunk-UOFTHYIH.js → chunk-UL6XJGUZ.js} +4 -4
- package/dist/chunk-UL6XJGUZ.js.map +1 -0
- package/dist/{chunk-A3UP56MS.js → chunk-WA67GZSZ.js} +3 -3
- package/dist/chunk-WA67GZSZ.js.map +1 -0
- package/dist/{chunk-OLHGZXN3.mjs → chunk-WEEXCPSE.mjs} +5 -5
- package/dist/chunk-WEEXCPSE.mjs.map +1 -0
- package/dist/{chunk-5GCHAXY5.js → chunk-X3UU7JHT.js} +38 -42
- package/dist/chunk-X3UU7JHT.js.map +1 -0
- package/dist/{chunk-QU5OT4DF.js → chunk-XJ7ZAGC5.js} +5 -5
- package/dist/chunk-XJ7ZAGC5.js.map +1 -0
- package/dist/{chunk-GSTLV3MB.mjs → chunk-YOTQG4NP.mjs} +26 -28
- package/dist/chunk-YOTQG4NP.mjs.map +1 -0
- package/dist/{chunk-QAT2RWAO.mjs → chunk-Z36R3P62.mjs} +7 -7
- package/dist/chunk-Z36R3P62.mjs.map +1 -0
- package/dist/{chunk-7Z5LLJ3A.js → chunk-ZWQJSZEY.js} +13 -13
- package/dist/chunk-ZWQJSZEY.js.map +1 -0
- package/dist/config/index.js +6 -6
- package/dist/config/index.js.map +1 -1
- package/dist/config/index.mjs +6 -6
- package/dist/config/index.mjs.map +1 -1
- package/dist/config/server/index.js +37 -37
- package/dist/config/server/index.js.map +1 -1
- package/dist/config/server/index.mjs +37 -37
- package/dist/config/server/index.mjs.map +1 -1
- package/dist/i18n/index.d.mts +2 -2
- package/dist/i18n/index.d.ts +2 -2
- package/dist/i18n/index.js +16 -17
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/index.mjs +16 -17
- package/dist/i18n/index.mjs.map +1 -1
- package/dist/imageCrop/index.js +11 -10
- package/dist/imageCrop/index.js.map +1 -1
- package/dist/imageCrop/index.mjs +11 -10
- package/dist/imageCrop/index.mjs.map +1 -1
- package/dist/index.js +221 -246
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +79 -104
- package/dist/index.mjs.map +1 -1
- package/dist/logger/index.js +6 -6
- package/dist/logger/index.mjs +1 -1
- package/dist/mmd/admin/index.js +11 -10
- package/dist/mmd/admin/index.js.map +1 -1
- package/dist/mmd/admin/index.mjs +11 -10
- package/dist/mmd/admin/index.mjs.map +1 -1
- package/dist/mmd/index.js +223 -241
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +220 -238
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/mmd/server/index.js +6 -6
- package/dist/mmd/server/index.js.map +1 -1
- package/dist/mmd/server/index.mjs +6 -6
- package/dist/mmd/server/index.mjs.map +1 -1
- package/dist/music/index.js +16 -16
- package/dist/music/index.mjs +2 -2
- package/dist/music/server/index.js +8 -8
- package/dist/music/server/index.mjs +1 -1
- package/dist/request/index.js +2 -2
- package/dist/request/index.js.map +1 -1
- package/dist/request/index.mjs +2 -2
- package/dist/request/index.mjs.map +1 -1
- package/dist/storage/index.js +11 -11
- package/dist/storage/index.mjs +2 -2
- package/dist/testYourself/admin/index.js +3 -3
- package/dist/testYourself/admin/index.mjs +1 -1
- package/dist/testYourself/index.js +22 -22
- package/dist/testYourself/index.js.map +1 -1
- package/dist/testYourself/index.mjs +14 -14
- package/dist/testYourself/index.mjs.map +1 -1
- package/dist/testYourself/server/index.js +4 -4
- package/dist/testYourself/server/index.mjs +1 -1
- package/dist/universalExport/index.d.mts +3 -3
- package/dist/universalExport/index.d.ts +3 -3
- package/dist/universalExport/index.js +48 -47
- package/dist/universalExport/index.js.map +1 -1
- package/dist/universalExport/index.mjs +48 -47
- package/dist/universalExport/index.mjs.map +1 -1
- package/dist/universalExport/server/index.js +29 -29
- package/dist/universalExport/server/index.js.map +1 -1
- package/dist/universalExport/server/index.mjs +28 -28
- package/dist/universalExport/server/index.mjs.map +1 -1
- package/dist/universalFile/index.d.mts +3 -3
- package/dist/universalFile/index.d.ts +3 -3
- package/dist/universalFile/index.js +73 -72
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +73 -72
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/universalFile/server/index.js +258 -260
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +244 -246
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/dist/utils/index.js +11 -11
- package/dist/utils/index.mjs +2 -2
- package/package.json +1 -1
- package/dist/AliyunOSSProvider-I7I5YGLB.mjs +0 -6
- package/dist/AliyunOSSProvider-L7JWMKS4.js +0 -15
- package/dist/ConfigService-7MEZXKJ5.js +0 -21
- package/dist/ConfigService-BV57YYFW.mjs +0 -4
- package/dist/LocalStorageProvider-FVLLHBHO.mjs +0 -6
- package/dist/LocalStorageProvider-NBNHHWLY.js +0 -15
- package/dist/PMXParser-L6IWHL4I.mjs +0 -4
- package/dist/PMXParser-YBS3B6HM.js +0 -13
- package/dist/chunk-3BGPZN4X.mjs.map +0 -1
- package/dist/chunk-3WOAPLEG.mjs.map +0 -1
- package/dist/chunk-5GCHAXY5.js.map +0 -1
- package/dist/chunk-6PRFP5EG.js.map +0 -1
- package/dist/chunk-6YKMCPQI.mjs.map +0 -1
- package/dist/chunk-7Z5LLJ3A.js.map +0 -1
- package/dist/chunk-A3UP56MS.js.map +0 -1
- package/dist/chunk-CD77U7LZ.js.map +0 -1
- package/dist/chunk-CLKKZSPZ.js.map +0 -1
- package/dist/chunk-CNTILN5J.mjs.map +0 -1
- package/dist/chunk-DUHZ7VZP.js.map +0 -1
- package/dist/chunk-DW2ZTOCV.js.map +0 -1
- package/dist/chunk-E7RGBAYJ.js.map +0 -1
- package/dist/chunk-GSTLV3MB.mjs.map +0 -1
- package/dist/chunk-JZXJQMVE.js.map +0 -1
- package/dist/chunk-KQGP6BTS.mjs.map +0 -1
- package/dist/chunk-LFG6FPM5.mjs.map +0 -1
- package/dist/chunk-LX4XX6W7.js.map +0 -1
- package/dist/chunk-MW4BCIZC.mjs.map +0 -1
- package/dist/chunk-OCR5DS4C.mjs.map +0 -1
- package/dist/chunk-OLHGZXN3.mjs.map +0 -1
- package/dist/chunk-QAT2RWAO.mjs.map +0 -1
- package/dist/chunk-QU5OT4DF.js.map +0 -1
- package/dist/chunk-T5OZHYVM.mjs.map +0 -1
- package/dist/chunk-TFQF2HDO.mjs.map +0 -1
- package/dist/chunk-TKCYPDWU.js.map +0 -1
- package/dist/chunk-TOC5FSHP.js.map +0 -1
- package/dist/chunk-UOFTHYIH.js.map +0 -1
- package/dist/chunk-VRTRSEEH.mjs.map +0 -1
- package/dist/chunk-WSNM4EU5.mjs.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkQ5EDCKQA_js = require('../../chunk-Q5EDCKQA.js');
|
|
4
|
+
var chunkX3UU7JHT_js = require('../../chunk-X3UU7JHT.js');
|
|
5
5
|
var chunkKH6RQ4J5_js = require('../../chunk-KH6RQ4J5.js');
|
|
6
|
-
var
|
|
6
|
+
var chunk25OFOKNF_js = require('../../chunk-25OFOKNF.js');
|
|
7
7
|
var chunkZRAW3HXA_js = require('../../chunk-ZRAW3HXA.js');
|
|
8
8
|
var chunkDGUM43GV_js = require('../../chunk-DGUM43GV.js');
|
|
9
9
|
var crypto = require('crypto');
|
|
@@ -110,7 +110,7 @@ function createFileServiceFromEnv(db) {
|
|
|
110
110
|
};
|
|
111
111
|
break;
|
|
112
112
|
default:
|
|
113
|
-
throw new Error(
|
|
113
|
+
throw new Error("Unsupported storage type: " + storageType);
|
|
114
114
|
}
|
|
115
115
|
return createUniversalFileService({
|
|
116
116
|
storage,
|
|
@@ -243,7 +243,7 @@ function validateStorageConfig(storage) {
|
|
|
243
243
|
}
|
|
244
244
|
default:
|
|
245
245
|
throw new ConfigValidationError(
|
|
246
|
-
|
|
246
|
+
"Unsupported storage type: " + storage.type,
|
|
247
247
|
"storage.type"
|
|
248
248
|
);
|
|
249
249
|
}
|
|
@@ -275,7 +275,7 @@ function validateEnvironment(requiredVars) {
|
|
|
275
275
|
}
|
|
276
276
|
if (missing.length > 0) {
|
|
277
277
|
throw new ConfigValidationError(
|
|
278
|
-
|
|
278
|
+
"Missing required environment variables: " + missing.join(", "),
|
|
279
279
|
"environment"
|
|
280
280
|
);
|
|
281
281
|
}
|
|
@@ -295,7 +295,7 @@ function getRequiredEnvVars(storageType) {
|
|
|
295
295
|
return [];
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
|
-
var logger =
|
|
298
|
+
var logger = chunk25OFOKNF_js.createLogger("AliyunCDNProvider");
|
|
299
299
|
var AliyunCDNProvider = class {
|
|
300
300
|
constructor() {
|
|
301
301
|
this.type = "aliyun-cdn";
|
|
@@ -311,7 +311,7 @@ var AliyunCDNProvider = class {
|
|
|
311
311
|
throw new chunkKH6RQ4J5_js.CDNProviderError("\u914D\u7F6E\u7C7B\u578B\u4E0D\u5339\u914D\uFF1A\u671F\u671B aliyun-cdn");
|
|
312
312
|
}
|
|
313
313
|
this.config = config;
|
|
314
|
-
logger.info(
|
|
314
|
+
logger.info("\u{1F310} [AliyunCDNProvider] \u521D\u59CB\u5316\u963F\u91CC\u4E91CDN\uFF0C\u57DF\u540D: " + this.config.domain);
|
|
315
315
|
try {
|
|
316
316
|
this.validateConfig();
|
|
317
317
|
try {
|
|
@@ -333,7 +333,7 @@ var AliyunCDNProvider = class {
|
|
|
333
333
|
} catch (error) {
|
|
334
334
|
logger.error("\u274C [AliyunCDNProvider] \u963F\u91CC\u4E91CDN\u521D\u59CB\u5316\u5931\u8D25:", error);
|
|
335
335
|
throw new chunkKH6RQ4J5_js.CDNProviderError(
|
|
336
|
-
|
|
336
|
+
"\u963F\u91CC\u4E91CDN\u521D\u59CB\u5316\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
337
337
|
);
|
|
338
338
|
}
|
|
339
339
|
}
|
|
@@ -342,16 +342,16 @@ var AliyunCDNProvider = class {
|
|
|
342
342
|
*/
|
|
343
343
|
async generateUrl(originalUrl) {
|
|
344
344
|
this.ensureInitialized();
|
|
345
|
-
logger.info(
|
|
345
|
+
logger.info("\u{1F517} [AliyunCDNProvider] \u751F\u6210CDN URL: " + originalUrl);
|
|
346
346
|
try {
|
|
347
347
|
const url = new URL(originalUrl);
|
|
348
|
-
const cdnUrl =
|
|
349
|
-
logger.info(
|
|
348
|
+
const cdnUrl = url.protocol + "//" + this.config.domain + url.pathname + url.search + url.hash;
|
|
349
|
+
logger.info("\u2705 [AliyunCDNProvider] CDN URL\u751F\u6210\u5B8C\u6210: " + cdnUrl);
|
|
350
350
|
return cdnUrl;
|
|
351
351
|
} catch (error) {
|
|
352
|
-
logger.error(
|
|
352
|
+
logger.error("\u274C [AliyunCDNProvider] CDN URL\u751F\u6210\u5931\u8D25: " + originalUrl + ":", error);
|
|
353
353
|
throw new chunkKH6RQ4J5_js.CDNProviderError(
|
|
354
|
-
|
|
354
|
+
"CDN URL\u751F\u6210\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
355
355
|
);
|
|
356
356
|
}
|
|
357
357
|
}
|
|
@@ -360,7 +360,7 @@ var AliyunCDNProvider = class {
|
|
|
360
360
|
*/
|
|
361
361
|
async refreshCache(urls) {
|
|
362
362
|
this.ensureInitialized();
|
|
363
|
-
logger.info(
|
|
363
|
+
logger.info("\u{1F504} [AliyunCDNProvider] \u5F00\u59CB\u5237\u65B0CDN\u7F13\u5B58\uFF0CURL\u6570\u91CF: " + urls.length);
|
|
364
364
|
try {
|
|
365
365
|
const cdnUrls = await Promise.all(urls.map((url) => this.generateUrl(url)));
|
|
366
366
|
const result = await this.client.refreshObjectCaches({
|
|
@@ -370,7 +370,7 @@ var AliyunCDNProvider = class {
|
|
|
370
370
|
// File 或 Directory
|
|
371
371
|
});
|
|
372
372
|
logger.info(
|
|
373
|
-
|
|
373
|
+
"\u2705 [AliyunCDNProvider] CDN\u7F13\u5B58\u5237\u65B0\u5B8C\u6210\uFF0C\u4EFB\u52A1ID: " + (result.RefreshTaskId || "unknown")
|
|
374
374
|
);
|
|
375
375
|
return {
|
|
376
376
|
success: true,
|
|
@@ -384,7 +384,7 @@ var AliyunCDNProvider = class {
|
|
|
384
384
|
logger.error(`\u274C [AliyunCDNProvider] CDN\u7F13\u5B58\u5237\u65B0\u5931\u8D25:`, error);
|
|
385
385
|
return {
|
|
386
386
|
success: false,
|
|
387
|
-
error:
|
|
387
|
+
error: "CDN\u7F13\u5B58\u5237\u65B0\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
388
388
|
};
|
|
389
389
|
}
|
|
390
390
|
}
|
|
@@ -393,7 +393,7 @@ var AliyunCDNProvider = class {
|
|
|
393
393
|
*/
|
|
394
394
|
async preheatCache(urls) {
|
|
395
395
|
this.ensureInitialized();
|
|
396
|
-
logger.info(
|
|
396
|
+
logger.info("\u{1F525} [AliyunCDNProvider] \u5F00\u59CB\u9884\u70EDCDN\u7F13\u5B58\uFF0CURL\u6570\u91CF: " + urls.length);
|
|
397
397
|
try {
|
|
398
398
|
const cdnUrls = await Promise.all(urls.map((url) => this.generateUrl(url)));
|
|
399
399
|
const result = await this.client.pushObjectCache({
|
|
@@ -403,7 +403,7 @@ var AliyunCDNProvider = class {
|
|
|
403
403
|
// domestic, overseas, global
|
|
404
404
|
});
|
|
405
405
|
logger.info(
|
|
406
|
-
|
|
406
|
+
"\u2705 [AliyunCDNProvider] CDN\u7F13\u5B58\u9884\u70ED\u5B8C\u6210\uFF0C\u4EFB\u52A1ID: " + (result.PushTaskId || "unknown")
|
|
407
407
|
);
|
|
408
408
|
return {
|
|
409
409
|
success: true,
|
|
@@ -417,7 +417,7 @@ var AliyunCDNProvider = class {
|
|
|
417
417
|
logger.error(`\u274C [AliyunCDNProvider] CDN\u7F13\u5B58\u9884\u70ED\u5931\u8D25:`, error);
|
|
418
418
|
return {
|
|
419
419
|
success: false,
|
|
420
|
-
error:
|
|
420
|
+
error: "CDN\u7F13\u5B58\u9884\u70ED\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
421
421
|
};
|
|
422
422
|
}
|
|
423
423
|
}
|
|
@@ -427,7 +427,7 @@ var AliyunCDNProvider = class {
|
|
|
427
427
|
async getAccessStats(startTime, endTime) {
|
|
428
428
|
this.ensureInitialized();
|
|
429
429
|
logger.info(
|
|
430
|
-
|
|
430
|
+
"\u{1F4CA} [AliyunCDNProvider] \u83B7\u53D6CDN\u8BBF\u95EE\u7EDF\u8BA1: " + startTime.toISOString() + " - " + endTime.toISOString()
|
|
431
431
|
);
|
|
432
432
|
try {
|
|
433
433
|
const formatTime = (date) => date.toISOString().slice(0, 19).replace("T", " ") + "Z";
|
|
@@ -454,7 +454,7 @@ var AliyunCDNProvider = class {
|
|
|
454
454
|
logger.error(`\u274C [AliyunCDNProvider] CDN\u8BBF\u95EE\u7EDF\u8BA1\u83B7\u53D6\u5931\u8D25:`, error);
|
|
455
455
|
return {
|
|
456
456
|
success: false,
|
|
457
|
-
error:
|
|
457
|
+
error: "CDN\u8BBF\u95EE\u7EDF\u8BA1\u83B7\u53D6\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
458
458
|
};
|
|
459
459
|
}
|
|
460
460
|
}
|
|
@@ -464,7 +464,7 @@ var AliyunCDNProvider = class {
|
|
|
464
464
|
*/
|
|
465
465
|
async generateSignedUrl(originalUrl, expiresIn = 3600, authKey) {
|
|
466
466
|
this.ensureInitialized();
|
|
467
|
-
logger.info(
|
|
467
|
+
logger.info("\u{1F510} [AliyunCDNProvider] \u751F\u6210\u9632\u76D7\u94FE\u7B7E\u540DURL: " + originalUrl);
|
|
468
468
|
try {
|
|
469
469
|
const cdnUrl = await this.generateUrl(originalUrl);
|
|
470
470
|
if (!authKey) {
|
|
@@ -473,15 +473,15 @@ var AliyunCDNProvider = class {
|
|
|
473
473
|
}
|
|
474
474
|
const parsedUrl = new URL(cdnUrl);
|
|
475
475
|
const timestamp2 = Math.floor(Date.now() / 1e3) + expiresIn;
|
|
476
|
-
const signString =
|
|
476
|
+
const signString = parsedUrl.pathname + "-" + timestamp2 + "-0-0-" + authKey;
|
|
477
477
|
const authValue = crypto.createHash("md5").update(signString).digest("hex");
|
|
478
|
-
const signedUrl =
|
|
478
|
+
const signedUrl = cdnUrl + "?auth_key=" + timestamp2 + "-0-0-" + authValue;
|
|
479
479
|
logger.info(`\u2705 [AliyunCDNProvider] \u9632\u76D7\u94FE\u7B7E\u540DURL\u751F\u6210\u5B8C\u6210`);
|
|
480
480
|
return signedUrl;
|
|
481
481
|
} catch (error) {
|
|
482
|
-
logger.error(
|
|
482
|
+
logger.error("\u274C [AliyunCDNProvider] \u9632\u76D7\u94FE\u7B7E\u540DURL\u751F\u6210\u5931\u8D25: " + originalUrl + ":", error);
|
|
483
483
|
throw new chunkKH6RQ4J5_js.CDNProviderError(
|
|
484
|
-
|
|
484
|
+
"\u9632\u76D7\u94FE\u7B7E\u540DURL\u751F\u6210\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
485
485
|
);
|
|
486
486
|
}
|
|
487
487
|
}
|
|
@@ -504,7 +504,7 @@ var AliyunCDNProvider = class {
|
|
|
504
504
|
} catch (error) {
|
|
505
505
|
return {
|
|
506
506
|
success: false,
|
|
507
|
-
error:
|
|
507
|
+
error: "\u67E5\u8BE2\u5237\u65B0\u4EFB\u52A1\u72B6\u6001\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
508
508
|
};
|
|
509
509
|
}
|
|
510
510
|
}
|
|
@@ -527,7 +527,7 @@ var AliyunCDNProvider = class {
|
|
|
527
527
|
} catch (error) {
|
|
528
528
|
return {
|
|
529
529
|
success: false,
|
|
530
|
-
error:
|
|
530
|
+
error: "\u67E5\u8BE2\u9884\u70ED\u4EFB\u52A1\u72B6\u6001\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
531
531
|
};
|
|
532
532
|
}
|
|
533
533
|
}
|
|
@@ -550,7 +550,7 @@ var AliyunCDNProvider = class {
|
|
|
550
550
|
} catch (error) {
|
|
551
551
|
return {
|
|
552
552
|
success: false,
|
|
553
|
-
error:
|
|
553
|
+
error: "\u83B7\u53D6\u57DF\u540D\u914D\u7F6E\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
554
554
|
};
|
|
555
555
|
}
|
|
556
556
|
}
|
|
@@ -564,23 +564,23 @@ var AliyunCDNProvider = class {
|
|
|
564
564
|
const url = new URL(cdnUrl);
|
|
565
565
|
const params = new URLSearchParams(url.search);
|
|
566
566
|
if (options.imageQuality) {
|
|
567
|
-
params.set("x-oss-process",
|
|
567
|
+
params.set("x-oss-process", "image/quality,q_" + options.imageQuality);
|
|
568
568
|
}
|
|
569
569
|
if (options.imageFormat) {
|
|
570
570
|
const formatParam = params.get("x-oss-process") || "image";
|
|
571
|
-
params.set("x-oss-process",
|
|
571
|
+
params.set("x-oss-process", formatParam + "/format," + options.imageFormat);
|
|
572
572
|
}
|
|
573
573
|
if (options.imageResize) {
|
|
574
574
|
const resizeParam = params.get("x-oss-process") || "image";
|
|
575
575
|
let resize = "resize";
|
|
576
|
-
if (options.imageResize.width) resize +=
|
|
577
|
-
if (options.imageResize.height) resize +=
|
|
578
|
-
params.set("x-oss-process",
|
|
576
|
+
if (options.imageResize.width) resize += ",w_" + options.imageResize.width;
|
|
577
|
+
if (options.imageResize.height) resize += ",h_" + options.imageResize.height;
|
|
578
|
+
params.set("x-oss-process", resizeParam + "/" + resize);
|
|
579
579
|
}
|
|
580
580
|
url.search = params.toString();
|
|
581
581
|
return url.toString();
|
|
582
582
|
} catch (error) {
|
|
583
|
-
logger.error(
|
|
583
|
+
logger.error("\u274C [AliyunCDNProvider] URL\u4F18\u5316\u5931\u8D25: " + originalUrl + ":", error);
|
|
584
584
|
return this.generateUrl(originalUrl);
|
|
585
585
|
}
|
|
586
586
|
}
|
|
@@ -603,10 +603,10 @@ var AliyunCDNProvider = class {
|
|
|
603
603
|
const required = ["domain", "accessKeyId", "accessKeySecret"];
|
|
604
604
|
const missing = required.filter((key) => !this.config[key]);
|
|
605
605
|
if (missing.length > 0) {
|
|
606
|
-
throw new chunkKH6RQ4J5_js.CDNProviderError(
|
|
606
|
+
throw new chunkKH6RQ4J5_js.CDNProviderError("CDN\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u9879: " + missing.join(", "));
|
|
607
607
|
}
|
|
608
608
|
if (!this.isValidDomain(this.config.domain)) {
|
|
609
|
-
throw new chunkKH6RQ4J5_js.CDNProviderError(
|
|
609
|
+
throw new chunkKH6RQ4J5_js.CDNProviderError("\u65E0\u6548\u7684CDN\u57DF\u540D: " + this.config.domain);
|
|
610
610
|
}
|
|
611
611
|
}
|
|
612
612
|
/**
|
|
@@ -636,15 +636,15 @@ var AliyunCDNProvider = class {
|
|
|
636
636
|
async refreshObjectCaches(params) {
|
|
637
637
|
logger.info("\u{1F504} [MockCDN] \u6A21\u62DF\u5237\u65B0\u7F13\u5B58:", params);
|
|
638
638
|
return {
|
|
639
|
-
RefreshTaskId:
|
|
640
|
-
RequestId:
|
|
639
|
+
RefreshTaskId: "mock-refresh-" + Date.now(),
|
|
640
|
+
RequestId: "mock-request-" + Date.now()
|
|
641
641
|
};
|
|
642
642
|
},
|
|
643
643
|
async pushObjectCache(params) {
|
|
644
644
|
logger.info("\u{1F525} [MockCDN] \u6A21\u62DF\u9884\u70ED\u7F13\u5B58:", params);
|
|
645
645
|
return {
|
|
646
|
-
PushTaskId:
|
|
647
|
-
RequestId:
|
|
646
|
+
PushTaskId: "mock-push-" + Date.now(),
|
|
647
|
+
RequestId: "mock-request-" + Date.now()
|
|
648
648
|
};
|
|
649
649
|
},
|
|
650
650
|
async describeRefreshTasks(params) {
|
|
@@ -660,7 +660,7 @@ var AliyunCDNProvider = class {
|
|
|
660
660
|
}
|
|
661
661
|
]
|
|
662
662
|
},
|
|
663
|
-
RequestId:
|
|
663
|
+
RequestId: "mock-request-" + Date.now()
|
|
664
664
|
};
|
|
665
665
|
},
|
|
666
666
|
async describePushTasks(params) {
|
|
@@ -676,7 +676,7 @@ var AliyunCDNProvider = class {
|
|
|
676
676
|
}
|
|
677
677
|
]
|
|
678
678
|
},
|
|
679
|
-
RequestId:
|
|
679
|
+
RequestId: "mock-request-" + Date.now()
|
|
680
680
|
};
|
|
681
681
|
},
|
|
682
682
|
async describeDomainConfigs(params) {
|
|
@@ -691,7 +691,7 @@ var AliyunCDNProvider = class {
|
|
|
691
691
|
}
|
|
692
692
|
]
|
|
693
693
|
},
|
|
694
|
-
RequestId:
|
|
694
|
+
RequestId: "mock-request-" + Date.now()
|
|
695
695
|
};
|
|
696
696
|
},
|
|
697
697
|
async describeCdnDomainLogs(params) {
|
|
@@ -700,7 +700,7 @@ var AliyunCDNProvider = class {
|
|
|
700
700
|
DomainLogDetails: {
|
|
701
701
|
DomainLogDetail: []
|
|
702
702
|
},
|
|
703
|
-
RequestId:
|
|
703
|
+
RequestId: "mock-request-" + Date.now()
|
|
704
704
|
};
|
|
705
705
|
},
|
|
706
706
|
async describeDomainRealTimeData(params) {
|
|
@@ -715,7 +715,7 @@ var AliyunCDNProvider = class {
|
|
|
715
715
|
]
|
|
716
716
|
},
|
|
717
717
|
DataInterval: "60",
|
|
718
|
-
RequestId:
|
|
718
|
+
RequestId: "mock-request-" + Date.now()
|
|
719
719
|
};
|
|
720
720
|
}
|
|
721
721
|
};
|
|
@@ -726,7 +726,7 @@ var AliyunCDNProvider = class {
|
|
|
726
726
|
async batchRefreshCache(urls, batchSize = 20, onProgress) {
|
|
727
727
|
this.ensureInitialized();
|
|
728
728
|
logger.info(
|
|
729
|
-
|
|
729
|
+
"\u{1F504} [AliyunCDNProvider] \u5F00\u59CB\u6279\u91CF\u5237\u65B0\u7F13\u5B58\uFF0C\u603BURL\u6570: " + urls.length + "\uFF0C\u6279\u6B21\u5927\u5C0F: " + batchSize
|
|
730
730
|
);
|
|
731
731
|
try {
|
|
732
732
|
const results = [];
|
|
@@ -744,7 +744,7 @@ var AliyunCDNProvider = class {
|
|
|
744
744
|
}
|
|
745
745
|
}
|
|
746
746
|
const successCount = results.filter((r) => r.success).length;
|
|
747
|
-
logger.info(
|
|
747
|
+
logger.info("\u2705 [AliyunCDNProvider] \u6279\u91CF\u5237\u65B0\u5B8C\u6210\uFF0C\u6210\u529F: " + successCount + "/" + results.length);
|
|
748
748
|
return {
|
|
749
749
|
success: successCount === results.length,
|
|
750
750
|
data: {
|
|
@@ -757,7 +757,7 @@ var AliyunCDNProvider = class {
|
|
|
757
757
|
logger.error(`\u274C [AliyunCDNProvider] \u6279\u91CF\u5237\u65B0\u5931\u8D25:`, error);
|
|
758
758
|
return {
|
|
759
759
|
success: false,
|
|
760
|
-
error:
|
|
760
|
+
error: "\u6279\u91CF\u5237\u65B0\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
761
761
|
};
|
|
762
762
|
}
|
|
763
763
|
}
|
|
@@ -967,7 +967,7 @@ var CdnCacheStrategy = class {
|
|
|
967
967
|
Expires: new Date(Date.now() + strategy.browserCacheTtl * 1e3).toUTCString()
|
|
968
968
|
};
|
|
969
969
|
if (strategy.browserCache) {
|
|
970
|
-
headers["ETag"] =
|
|
970
|
+
headers["ETag"] = '"' + Date.now() + '"';
|
|
971
971
|
}
|
|
972
972
|
headers["Last-Modified"] = (/* @__PURE__ */ new Date()).toUTCString();
|
|
973
973
|
if (strategy.type === "static" /* STATIC */) {
|
|
@@ -1046,7 +1046,7 @@ var CdnCacheStrategy = class {
|
|
|
1046
1046
|
if (stats.hitRate < 60) {
|
|
1047
1047
|
suggestions.push({
|
|
1048
1048
|
type,
|
|
1049
|
-
issue:
|
|
1049
|
+
issue: type + "\u7C7B\u578B\u6587\u4EF6\u7F13\u5B58\u547D\u4E2D\u7387\u8FC7\u4F4E (" + stats.hitRate.toFixed(1) + "%)",
|
|
1050
1050
|
suggestion: "\u8003\u8651\u589E\u52A0\u7F13\u5B58\u65F6\u95F4\u6216\u542F\u7528\u9884\u70ED\u673A\u5236",
|
|
1051
1051
|
severity: stats.hitRate < 30 ? "high" : "medium"
|
|
1052
1052
|
});
|
|
@@ -1054,7 +1054,7 @@ var CdnCacheStrategy = class {
|
|
|
1054
1054
|
if (stats.estimatedSize > 1024 * 1024 * 1024) {
|
|
1055
1055
|
suggestions.push({
|
|
1056
1056
|
type,
|
|
1057
|
-
issue:
|
|
1057
|
+
issue: type + "\u7C7B\u578B\u6587\u4EF6\u7F13\u5B58\u5360\u7528\u7A7A\u95F4\u8FC7\u5927 (" + (stats.estimatedSize / 1024 / 1024 / 1024).toFixed(2) + "GB)",
|
|
1058
1058
|
suggestion: "\u8003\u8651\u51CF\u5C11\u7F13\u5B58\u65F6\u95F4\u6216\u4F18\u5316\u6587\u4EF6\u538B\u7F29",
|
|
1059
1059
|
severity: "medium"
|
|
1060
1060
|
});
|
|
@@ -1089,7 +1089,7 @@ var CdnCacheStrategy = class {
|
|
|
1089
1089
|
}
|
|
1090
1090
|
};
|
|
1091
1091
|
var cdnCacheStrategy = new CdnCacheStrategy();
|
|
1092
|
-
var logger2 =
|
|
1092
|
+
var logger2 = chunk25OFOKNF_js.createLogger("ImageProcessor");
|
|
1093
1093
|
var ImageProcessor = class {
|
|
1094
1094
|
constructor() {
|
|
1095
1095
|
this.type = "image";
|
|
@@ -1126,16 +1126,16 @@ var ImageProcessor = class {
|
|
|
1126
1126
|
}
|
|
1127
1127
|
const imageOptions = options;
|
|
1128
1128
|
const startTime = Date.now();
|
|
1129
|
-
logger2.info(
|
|
1129
|
+
logger2.info("\u{1F5BC}\uFE0F [ImageProcessor] \u5F00\u59CB\u5904\u7406\u56FE\u7247: " + inputPath);
|
|
1130
1130
|
try {
|
|
1131
1131
|
if (!fs.existsSync(inputPath)) {
|
|
1132
|
-
throw new Error(
|
|
1132
|
+
throw new Error("\u8F93\u5165\u6587\u4EF6\u4E0D\u5B58\u5728: " + inputPath);
|
|
1133
1133
|
}
|
|
1134
1134
|
const outputDir = path3__namespace.dirname(outputPath);
|
|
1135
1135
|
await fs.promises.mkdir(outputDir, { recursive: true });
|
|
1136
1136
|
const metadata = await this.getImageMetadata(inputPath);
|
|
1137
1137
|
logger2.info(
|
|
1138
|
-
|
|
1138
|
+
"\u{1F4CA} [ImageProcessor] \u56FE\u7247\u4FE1\u606F: " + metadata.width + "x" + metadata.height + ", \u683C\u5F0F: " + metadata.format
|
|
1139
1139
|
);
|
|
1140
1140
|
let sharpInstance = this.sharp(inputPath);
|
|
1141
1141
|
sharpInstance = await this.applyImageOperations(sharpInstance, imageOptions);
|
|
@@ -1147,7 +1147,7 @@ var ImageProcessor = class {
|
|
|
1147
1147
|
thumbnailPath = await this.generateThumbnail(inputPath, outputPath, imageOptions);
|
|
1148
1148
|
}
|
|
1149
1149
|
const processingTime = Date.now() - startTime;
|
|
1150
|
-
logger2.info(
|
|
1150
|
+
logger2.info("\u2705 [ImageProcessor] \u56FE\u7247\u5904\u7406\u5B8C\u6210: " + outputPath + ", \u8017\u65F6: " + processingTime + "ms");
|
|
1151
1151
|
return {
|
|
1152
1152
|
success: true,
|
|
1153
1153
|
processedPath: outputPath,
|
|
@@ -1169,10 +1169,10 @@ var ImageProcessor = class {
|
|
|
1169
1169
|
}
|
|
1170
1170
|
};
|
|
1171
1171
|
} catch (error) {
|
|
1172
|
-
console.error(
|
|
1172
|
+
console.error("\u274C [ImageProcessor] \u56FE\u7247\u5904\u7406\u5931\u8D25: " + inputPath + ":", error);
|
|
1173
1173
|
return {
|
|
1174
1174
|
success: false,
|
|
1175
|
-
error:
|
|
1175
|
+
error: "\u56FE\u7247\u5904\u7406\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"),
|
|
1176
1176
|
processingTime: Date.now() - startTime
|
|
1177
1177
|
};
|
|
1178
1178
|
}
|
|
@@ -1216,7 +1216,7 @@ var ImageProcessor = class {
|
|
|
1216
1216
|
megapixels: metadata.width * metadata.height / 1e6
|
|
1217
1217
|
};
|
|
1218
1218
|
} catch (error) {
|
|
1219
|
-
console.error(
|
|
1219
|
+
console.error("\u274C [ImageProcessor] \u83B7\u53D6\u56FE\u7247\u4FE1\u606F\u5931\u8D25: " + filePath + ":", error);
|
|
1220
1220
|
throw error;
|
|
1221
1221
|
}
|
|
1222
1222
|
}
|
|
@@ -1245,8 +1245,8 @@ var ImageProcessor = class {
|
|
|
1245
1245
|
orientation: metadata.orientation
|
|
1246
1246
|
};
|
|
1247
1247
|
} catch (error) {
|
|
1248
|
-
console.error(
|
|
1249
|
-
throw new Error(
|
|
1248
|
+
console.error("\u274C [ImageProcessor] \u83B7\u53D6\u56FE\u7247\u5143\u6570\u636E\u5931\u8D25: " + filePath + ":", error);
|
|
1249
|
+
throw new Error("\u65E0\u6CD5\u8BFB\u53D6\u56FE\u7247\u5143\u6570\u636E: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"));
|
|
1250
1250
|
}
|
|
1251
1251
|
}
|
|
1252
1252
|
/**
|
|
@@ -1264,7 +1264,7 @@ var ImageProcessor = class {
|
|
|
1264
1264
|
};
|
|
1265
1265
|
sharpInstance = sharpInstance.resize(resizeOptions);
|
|
1266
1266
|
logger2.info(
|
|
1267
|
-
|
|
1267
|
+
"\u{1F527} [ImageProcessor] \u5E94\u7528\u5C3A\u5BF8\u8C03\u6574: " + (options.width || "auto") + "x" + (options.height || "auto")
|
|
1268
1268
|
);
|
|
1269
1269
|
}
|
|
1270
1270
|
sharpInstance = sharpInstance.rotate();
|
|
@@ -1279,7 +1279,7 @@ var ImageProcessor = class {
|
|
|
1279
1279
|
async applyWatermark(sharpInstance, watermarkOptions) {
|
|
1280
1280
|
try {
|
|
1281
1281
|
if (watermarkOptions.text) {
|
|
1282
|
-
logger2.info(
|
|
1282
|
+
logger2.info("\u{1F4A7} [ImageProcessor] \u5E94\u7528\u6587\u5B57\u6C34\u5370: " + watermarkOptions.text);
|
|
1283
1283
|
const textSvg = this.createTextWatermarkSvg(
|
|
1284
1284
|
watermarkOptions.text,
|
|
1285
1285
|
watermarkOptions.opacity || 0.5
|
|
@@ -1292,7 +1292,7 @@ var ImageProcessor = class {
|
|
|
1292
1292
|
}
|
|
1293
1293
|
]);
|
|
1294
1294
|
} else if (watermarkOptions.image && fs.existsSync(watermarkOptions.image)) {
|
|
1295
|
-
logger2.info(
|
|
1295
|
+
logger2.info("\u{1F4A7} [ImageProcessor] \u5E94\u7528\u56FE\u7247\u6C34\u5370: " + watermarkOptions.image);
|
|
1296
1296
|
let watermarkBuffer = await fs.promises.readFile(watermarkOptions.image);
|
|
1297
1297
|
if (watermarkOptions.opacity && watermarkOptions.opacity < 1) {
|
|
1298
1298
|
const watermarkSharp = this.sharp(watermarkBuffer).png().modulate({ brightness: 1, saturation: 1, alpha: watermarkOptions.opacity });
|
|
@@ -1317,8 +1317,7 @@ var ImageProcessor = class {
|
|
|
1317
1317
|
createTextWatermarkSvg(text2, opacity) {
|
|
1318
1318
|
const fontSize = 24;
|
|
1319
1319
|
const padding = 10;
|
|
1320
|
-
return
|
|
1321
|
-
<svg width="200" height="50" xmlns="http://www.w3.org/2000/svg">
|
|
1320
|
+
return `<svg width="200" height="50" xmlns="http://www.w3.org/2000/svg">
|
|
1322
1321
|
<text
|
|
1323
1322
|
x="${padding}"
|
|
1324
1323
|
y="${fontSize + padding}"
|
|
@@ -1332,8 +1331,7 @@ var ImageProcessor = class {
|
|
|
1332
1331
|
>
|
|
1333
1332
|
${text2}
|
|
1334
1333
|
</text>
|
|
1335
|
-
</svg
|
|
1336
|
-
`.trim();
|
|
1334
|
+
</svg>`.trim();
|
|
1337
1335
|
}
|
|
1338
1336
|
/**
|
|
1339
1337
|
* 获取水印位置对应的gravity值
|
|
@@ -1418,7 +1416,7 @@ var ImageProcessor = class {
|
|
|
1418
1416
|
fit: "cover",
|
|
1419
1417
|
position: "center"
|
|
1420
1418
|
}).jpeg({ quality: 70 }).toFile(thumbnailPath);
|
|
1421
|
-
logger2.info(
|
|
1419
|
+
logger2.info("\u{1F5BC}\uFE0F [ImageProcessor] \u7F29\u7565\u56FE\u751F\u6210\u5B8C\u6210: " + thumbnailPath);
|
|
1422
1420
|
return thumbnailPath;
|
|
1423
1421
|
} catch (error) {
|
|
1424
1422
|
console.warn(`\u26A0\uFE0F [ImageProcessor] \u7F29\u7565\u56FE\u751F\u6210\u5931\u8D25:`, error);
|
|
@@ -1431,7 +1429,7 @@ var ImageProcessor = class {
|
|
|
1431
1429
|
getThumbnailPath(originalPath) {
|
|
1432
1430
|
const ext = path3__namespace.extname(originalPath);
|
|
1433
1431
|
const basePath = originalPath.replace(ext, "");
|
|
1434
|
-
return
|
|
1432
|
+
return basePath + "_thumb" + ext;
|
|
1435
1433
|
}
|
|
1436
1434
|
/**
|
|
1437
1435
|
* 创建模拟Sharp对象(开发测试用)
|
|
@@ -1439,7 +1437,7 @@ var ImageProcessor = class {
|
|
|
1439
1437
|
createMockSharp() {
|
|
1440
1438
|
logger2.info("\u{1F9EA} [ImageProcessor] \u521B\u5EFA\u6A21\u62DFSharp\u5904\u7406\u5668");
|
|
1441
1439
|
const mockSharp = (input) => {
|
|
1442
|
-
logger2.info(
|
|
1440
|
+
logger2.info("\u{1F9EA} [MockSharp] \u5904\u7406\u56FE\u7247: " + input);
|
|
1443
1441
|
return {
|
|
1444
1442
|
metadata: async () => ({
|
|
1445
1443
|
format: "jpeg",
|
|
@@ -1478,10 +1476,10 @@ var ImageProcessor = class {
|
|
|
1478
1476
|
return mockSharp(input);
|
|
1479
1477
|
},
|
|
1480
1478
|
toFile: async (outputPath) => {
|
|
1481
|
-
logger2.info(
|
|
1479
|
+
logger2.info("\u{1F9EA} [MockSharp] \u4FDD\u5B58\u5230\u6587\u4EF6: " + outputPath);
|
|
1482
1480
|
const outputDir = path3__namespace.dirname(outputPath);
|
|
1483
1481
|
await fs.promises.mkdir(outputDir, { recursive: true });
|
|
1484
|
-
await fs.promises.writeFile(outputPath,
|
|
1482
|
+
await fs.promises.writeFile(outputPath, "Mock processed image from " + input);
|
|
1485
1483
|
return {
|
|
1486
1484
|
format: "jpeg",
|
|
1487
1485
|
width: 800,
|
|
@@ -1505,7 +1503,7 @@ var ImageProcessor = class {
|
|
|
1505
1503
|
*/
|
|
1506
1504
|
async batchProcess(inputPaths, outputDir, options, onProgress) {
|
|
1507
1505
|
this.ensureInitialized();
|
|
1508
|
-
logger2.info(
|
|
1506
|
+
logger2.info("\u{1F5BC}\uFE0F [ImageProcessor] \u5F00\u59CB\u6279\u91CF\u5904\u7406 " + inputPaths.length + " \u5F20\u56FE\u7247");
|
|
1509
1507
|
const results = [];
|
|
1510
1508
|
for (let i = 0; i < inputPaths.length; i++) {
|
|
1511
1509
|
const inputPath = inputPaths[i];
|
|
@@ -1518,19 +1516,19 @@ var ImageProcessor = class {
|
|
|
1518
1516
|
onProgress(i + 1, inputPaths.length);
|
|
1519
1517
|
}
|
|
1520
1518
|
} catch (error) {
|
|
1521
|
-
console.error(
|
|
1519
|
+
console.error("\u274C [ImageProcessor] \u6279\u91CF\u5904\u7406\u5931\u8D25: " + inputPath + ":", error);
|
|
1522
1520
|
results.push({
|
|
1523
1521
|
success: false,
|
|
1524
|
-
error:
|
|
1522
|
+
error: "\u5904\u7406\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
1525
1523
|
});
|
|
1526
1524
|
}
|
|
1527
1525
|
}
|
|
1528
1526
|
const successCount = results.filter((r) => r.success).length;
|
|
1529
|
-
logger2.info(
|
|
1527
|
+
logger2.info("\u2705 [ImageProcessor] \u6279\u91CF\u5904\u7406\u5B8C\u6210\uFF0C\u6210\u529F: " + successCount + "/" + inputPaths.length);
|
|
1530
1528
|
return results;
|
|
1531
1529
|
}
|
|
1532
1530
|
};
|
|
1533
|
-
var logger3 =
|
|
1531
|
+
var logger3 = chunk25OFOKNF_js.createLogger("AudioProcessor");
|
|
1534
1532
|
var AudioProcessor = class {
|
|
1535
1533
|
constructor() {
|
|
1536
1534
|
this.type = "audio";
|
|
@@ -1567,22 +1565,22 @@ var AudioProcessor = class {
|
|
|
1567
1565
|
}
|
|
1568
1566
|
const audioOptions = options;
|
|
1569
1567
|
const startTime = Date.now();
|
|
1570
|
-
logger3.info(
|
|
1568
|
+
logger3.info("\u{1F3B5} [AudioProcessor] \u5F00\u59CB\u5904\u7406\u97F3\u9891: " + inputPath);
|
|
1571
1569
|
try {
|
|
1572
1570
|
if (!fs.existsSync(inputPath)) {
|
|
1573
|
-
throw new Error(
|
|
1571
|
+
throw new Error("\u8F93\u5165\u6587\u4EF6\u4E0D\u5B58\u5728: " + inputPath);
|
|
1574
1572
|
}
|
|
1575
1573
|
const outputDir = path3__namespace.dirname(outputPath);
|
|
1576
1574
|
await fs.promises.mkdir(outputDir, { recursive: true });
|
|
1577
1575
|
const metadata = await this.getAudioMetadata(inputPath);
|
|
1578
1576
|
logger3.info(
|
|
1579
|
-
|
|
1577
|
+
"\u{1F4CA} [AudioProcessor] \u97F3\u9891\u4FE1\u606F: " + this.formatDuration(metadata.duration) + ", " + metadata.bitrate + "kbps, " + metadata.sampleRate + "Hz"
|
|
1580
1578
|
);
|
|
1581
1579
|
const outputFormat = this.determineOutputFormat(outputPath, audioOptions.format);
|
|
1582
1580
|
await this.processAudio(inputPath, outputPath, audioOptions, outputFormat);
|
|
1583
1581
|
const processedStats = await fs.promises.stat(outputPath);
|
|
1584
1582
|
const processingTime = Date.now() - startTime;
|
|
1585
|
-
logger3.info(
|
|
1583
|
+
logger3.info("\u2705 [AudioProcessor] \u97F3\u9891\u5904\u7406\u5B8C\u6210: " + outputPath + ", \u8017\u65F6: " + processingTime + "ms");
|
|
1586
1584
|
return {
|
|
1587
1585
|
success: true,
|
|
1588
1586
|
processedPath: outputPath,
|
|
@@ -1602,10 +1600,10 @@ var AudioProcessor = class {
|
|
|
1602
1600
|
}
|
|
1603
1601
|
};
|
|
1604
1602
|
} catch (error) {
|
|
1605
|
-
console.error(
|
|
1603
|
+
console.error("\u274C [AudioProcessor] \u97F3\u9891\u5904\u7406\u5931\u8D25: " + inputPath + ":", error);
|
|
1606
1604
|
return {
|
|
1607
1605
|
success: false,
|
|
1608
|
-
error:
|
|
1606
|
+
error: "\u97F3\u9891\u5904\u7406\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"),
|
|
1609
1607
|
processingTime: Date.now() - startTime
|
|
1610
1608
|
};
|
|
1611
1609
|
}
|
|
@@ -1653,7 +1651,7 @@ var AudioProcessor = class {
|
|
|
1653
1651
|
quality: this.getQualityDescription(metadata.bitrate, metadata.sampleRate)
|
|
1654
1652
|
};
|
|
1655
1653
|
} catch (error) {
|
|
1656
|
-
console.error(
|
|
1654
|
+
console.error("\u274C [AudioProcessor] \u83B7\u53D6\u97F3\u9891\u4FE1\u606F\u5931\u8D25: " + filePath + ":", error);
|
|
1657
1655
|
throw error;
|
|
1658
1656
|
}
|
|
1659
1657
|
}
|
|
@@ -1674,8 +1672,8 @@ var AudioProcessor = class {
|
|
|
1674
1672
|
try {
|
|
1675
1673
|
this.ffmpeg.ffprobe(filePath, (err, metadata) => {
|
|
1676
1674
|
if (err) {
|
|
1677
|
-
console.error(
|
|
1678
|
-
reject(new Error(
|
|
1675
|
+
console.error("\u274C [AudioProcessor] \u83B7\u53D6\u97F3\u9891\u5143\u6570\u636E\u5931\u8D25: " + filePath + ":", err);
|
|
1676
|
+
reject(new Error("\u65E0\u6CD5\u8BFB\u53D6\u97F3\u9891\u5143\u6570\u636E: " + err.message));
|
|
1679
1677
|
return;
|
|
1680
1678
|
}
|
|
1681
1679
|
const audioStream = metadata.streams?.find(
|
|
@@ -1712,28 +1710,28 @@ var AudioProcessor = class {
|
|
|
1712
1710
|
command = this.setAudioCodec(command, outputFormat);
|
|
1713
1711
|
if (options.bitrate) {
|
|
1714
1712
|
command = command.audioBitrate(options.bitrate);
|
|
1715
|
-
logger3.info(
|
|
1713
|
+
logger3.info("\u{1F527} [AudioProcessor] \u8BBE\u7F6E\u6BD4\u7279\u7387: " + options.bitrate + "kbps");
|
|
1716
1714
|
}
|
|
1717
1715
|
if (options.sampleRate) {
|
|
1718
1716
|
command = command.audioFrequency(options.sampleRate);
|
|
1719
|
-
logger3.info(
|
|
1717
|
+
logger3.info("\u{1F527} [AudioProcessor] \u8BBE\u7F6E\u91C7\u6837\u7387: " + options.sampleRate + "Hz");
|
|
1720
1718
|
}
|
|
1721
1719
|
if (options.channels) {
|
|
1722
1720
|
command = command.audioChannels(options.channels);
|
|
1723
|
-
logger3.info(
|
|
1721
|
+
logger3.info("\u{1F527} [AudioProcessor] \u8BBE\u7F6E\u58F0\u9053\u6570: " + options.channels);
|
|
1724
1722
|
}
|
|
1725
1723
|
command = command.format(outputFormat);
|
|
1726
1724
|
command.on("progress", (progress) => {
|
|
1727
1725
|
if (progress.percent) {
|
|
1728
|
-
logger3.info(
|
|
1726
|
+
logger3.info("\u{1F3B5} [AudioProcessor] \u5904\u7406\u8FDB\u5EA6: " + Math.round(progress.percent) + "%");
|
|
1729
1727
|
}
|
|
1730
1728
|
});
|
|
1731
1729
|
command.on("error", (err) => {
|
|
1732
1730
|
console.error(`\u274C [AudioProcessor] FFmpeg\u5904\u7406\u9519\u8BEF:`, err);
|
|
1733
|
-
reject(new Error(
|
|
1731
|
+
reject(new Error("\u97F3\u9891\u5904\u7406\u5931\u8D25: " + err.message));
|
|
1734
1732
|
});
|
|
1735
1733
|
command.on("end", () => {
|
|
1736
|
-
logger3.info(
|
|
1734
|
+
logger3.info("\u2705 [AudioProcessor] FFmpeg\u5904\u7406\u5B8C\u6210: " + outputPath);
|
|
1737
1735
|
resolve();
|
|
1738
1736
|
});
|
|
1739
1737
|
command.save(outputPath);
|
|
@@ -1782,7 +1780,7 @@ var AudioProcessor = class {
|
|
|
1782
1780
|
formatDuration(seconds) {
|
|
1783
1781
|
const minutes = Math.floor(seconds / 60);
|
|
1784
1782
|
const remainingSeconds = Math.floor(seconds % 60);
|
|
1785
|
-
return
|
|
1783
|
+
return minutes + ":" + remainingSeconds.toString().padStart(2, "0");
|
|
1786
1784
|
}
|
|
1787
1785
|
/**
|
|
1788
1786
|
* 获取声道描述
|
|
@@ -1798,7 +1796,7 @@ var AudioProcessor = class {
|
|
|
1798
1796
|
case 8:
|
|
1799
1797
|
return "7.1\u73AF\u7ED5\u58F0";
|
|
1800
1798
|
default:
|
|
1801
|
-
return
|
|
1799
|
+
return channels + "\u58F0\u9053";
|
|
1802
1800
|
}
|
|
1803
1801
|
}
|
|
1804
1802
|
/**
|
|
@@ -1821,30 +1819,30 @@ var AudioProcessor = class {
|
|
|
1821
1819
|
createMockFFmpeg() {
|
|
1822
1820
|
logger3.info("\u{1F9EA} [AudioProcessor] \u521B\u5EFA\u6A21\u62DFFFmpeg\u5904\u7406\u5668");
|
|
1823
1821
|
const mockFFmpeg = (input) => {
|
|
1824
|
-
logger3.info(
|
|
1822
|
+
logger3.info("\u{1F9EA} [MockFFmpeg] \u5904\u7406\u97F3\u9891: " + input);
|
|
1825
1823
|
return {
|
|
1826
1824
|
audioBitrate: (bitrate) => {
|
|
1827
|
-
logger3.info(
|
|
1825
|
+
logger3.info("\u{1F9EA} [MockFFmpeg] \u8BBE\u7F6E\u6BD4\u7279\u7387: " + bitrate + "kbps");
|
|
1828
1826
|
return mockFFmpeg(input);
|
|
1829
1827
|
},
|
|
1830
1828
|
audioFrequency: (sampleRate) => {
|
|
1831
|
-
logger3.info(
|
|
1829
|
+
logger3.info("\u{1F9EA} [MockFFmpeg] \u8BBE\u7F6E\u91C7\u6837\u7387: " + sampleRate + "Hz");
|
|
1832
1830
|
return mockFFmpeg(input);
|
|
1833
1831
|
},
|
|
1834
1832
|
audioChannels: (channels) => {
|
|
1835
|
-
logger3.info(
|
|
1833
|
+
logger3.info("\u{1F9EA} [MockFFmpeg] \u8BBE\u7F6E\u58F0\u9053\u6570: " + channels);
|
|
1836
1834
|
return mockFFmpeg(input);
|
|
1837
1835
|
},
|
|
1838
1836
|
audioCodec: (codec) => {
|
|
1839
|
-
logger3.info(
|
|
1837
|
+
logger3.info("\u{1F9EA} [MockFFmpeg] \u8BBE\u7F6E\u7F16\u89E3\u7801\u5668: " + codec);
|
|
1840
1838
|
return mockFFmpeg(input);
|
|
1841
1839
|
},
|
|
1842
1840
|
format: (format) => {
|
|
1843
|
-
logger3.info(
|
|
1841
|
+
logger3.info("\u{1F9EA} [MockFFmpeg] \u8BBE\u7F6E\u8F93\u51FA\u683C\u5F0F: " + format);
|
|
1844
1842
|
return mockFFmpeg(input);
|
|
1845
1843
|
},
|
|
1846
1844
|
on: (event, callback) => {
|
|
1847
|
-
logger3.info(
|
|
1845
|
+
logger3.info("\u{1F9EA} [MockFFmpeg] \u6CE8\u518C\u4E8B\u4EF6\u76D1\u542C: " + event);
|
|
1848
1846
|
if (event === "progress") {
|
|
1849
1847
|
setTimeout(() => callback({ percent: 50 }), 100);
|
|
1850
1848
|
setTimeout(() => callback({ percent: 100 }), 200);
|
|
@@ -1854,15 +1852,15 @@ var AudioProcessor = class {
|
|
|
1854
1852
|
return mockFFmpeg(input);
|
|
1855
1853
|
},
|
|
1856
1854
|
save: async (outputPath) => {
|
|
1857
|
-
logger3.info(
|
|
1855
|
+
logger3.info("\u{1F9EA} [MockFFmpeg] \u4FDD\u5B58\u97F3\u9891\u6587\u4EF6: " + outputPath);
|
|
1858
1856
|
const outputDir = path3__namespace.dirname(outputPath);
|
|
1859
1857
|
await fs.promises.mkdir(outputDir, { recursive: true });
|
|
1860
|
-
await fs.promises.writeFile(outputPath,
|
|
1858
|
+
await fs.promises.writeFile(outputPath, "Mock processed audio from " + input);
|
|
1861
1859
|
}
|
|
1862
1860
|
};
|
|
1863
1861
|
};
|
|
1864
1862
|
mockFFmpeg.ffprobe = (filePath, callback) => {
|
|
1865
|
-
logger3.info(
|
|
1863
|
+
logger3.info("\u{1F9EA} [MockFFmpeg] \u83B7\u53D6\u97F3\u9891\u5143\u6570\u636E: " + filePath);
|
|
1866
1864
|
setTimeout(() => {
|
|
1867
1865
|
const mockMetadata = {
|
|
1868
1866
|
streams: [
|
|
@@ -1890,14 +1888,14 @@ var AudioProcessor = class {
|
|
|
1890
1888
|
*/
|
|
1891
1889
|
async batchProcess(inputPaths, outputDir, options, onProgress) {
|
|
1892
1890
|
this.ensureInitialized();
|
|
1893
|
-
logger3.info(
|
|
1891
|
+
logger3.info("\u{1F3B5} [AudioProcessor] \u5F00\u59CB\u6279\u91CF\u5904\u7406 " + inputPaths.length + " \u4E2A\u97F3\u9891\u6587\u4EF6");
|
|
1894
1892
|
const results = [];
|
|
1895
1893
|
for (let i = 0; i < inputPaths.length; i++) {
|
|
1896
1894
|
const inputPath = inputPaths[i];
|
|
1897
1895
|
const fileName = path3__namespace.basename(inputPath);
|
|
1898
1896
|
const nameWithoutExt = path3__namespace.parse(fileName).name;
|
|
1899
1897
|
const outputFormat = options.format || "mp3";
|
|
1900
|
-
const outputPath = path3__namespace.join(outputDir,
|
|
1898
|
+
const outputPath = path3__namespace.join(outputDir, nameWithoutExt + "." + outputFormat);
|
|
1901
1899
|
try {
|
|
1902
1900
|
const result = await this.process(inputPath, outputPath, options);
|
|
1903
1901
|
results.push(result);
|
|
@@ -1905,15 +1903,15 @@ var AudioProcessor = class {
|
|
|
1905
1903
|
onProgress(i + 1, inputPaths.length);
|
|
1906
1904
|
}
|
|
1907
1905
|
} catch (error) {
|
|
1908
|
-
console.error(
|
|
1906
|
+
console.error("\u274C [AudioProcessor] \u6279\u91CF\u5904\u7406\u5931\u8D25: " + inputPath + ":", error);
|
|
1909
1907
|
results.push({
|
|
1910
1908
|
success: false,
|
|
1911
|
-
error:
|
|
1909
|
+
error: "\u5904\u7406\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
1912
1910
|
});
|
|
1913
1911
|
}
|
|
1914
1912
|
}
|
|
1915
1913
|
const successCount = results.filter((r) => r.success).length;
|
|
1916
|
-
logger3.info(
|
|
1914
|
+
logger3.info("\u2705 [AudioProcessor] \u6279\u91CF\u5904\u7406\u5B8C\u6210\uFF0C\u6210\u529F: " + successCount + "/" + inputPaths.length);
|
|
1917
1915
|
return results;
|
|
1918
1916
|
}
|
|
1919
1917
|
/**
|
|
@@ -1924,10 +1922,10 @@ var AudioProcessor = class {
|
|
|
1924
1922
|
return new Promise((resolve) => {
|
|
1925
1923
|
try {
|
|
1926
1924
|
this.ffmpeg(inputPath).outputOptions(["-an", "-vcodec copy"]).on("error", (err) => {
|
|
1927
|
-
console.warn(
|
|
1925
|
+
console.warn("\u26A0\uFE0F [AudioProcessor] \u63D0\u53D6\u5C01\u9762\u5931\u8D25: " + err.message);
|
|
1928
1926
|
resolve(false);
|
|
1929
1927
|
}).on("end", () => {
|
|
1930
|
-
logger3.info(
|
|
1928
|
+
logger3.info("\u{1F5BC}\uFE0F [AudioProcessor] \u97F3\u9891\u5C01\u9762\u63D0\u53D6\u5B8C\u6210: " + outputPath);
|
|
1931
1929
|
resolve(true);
|
|
1932
1930
|
}).save(outputPath);
|
|
1933
1931
|
} catch (error) {
|
|
@@ -1942,13 +1940,13 @@ var AudioProcessor = class {
|
|
|
1942
1940
|
async denoise(inputPath, outputPath) {
|
|
1943
1941
|
this.ensureInitialized();
|
|
1944
1942
|
const startTime = Date.now();
|
|
1945
|
-
logger3.info(
|
|
1943
|
+
logger3.info("\u{1F507} [AudioProcessor] \u5F00\u59CB\u97F3\u9891\u964D\u566A: " + inputPath);
|
|
1946
1944
|
return new Promise((resolve) => {
|
|
1947
1945
|
try {
|
|
1948
1946
|
this.ffmpeg(inputPath).audioFilters("highpass=f=200,lowpass=f=3000").on("error", (err) => {
|
|
1949
1947
|
resolve({
|
|
1950
1948
|
success: false,
|
|
1951
|
-
error:
|
|
1949
|
+
error: "\u964D\u566A\u5904\u7406\u5931\u8D25: " + err.message,
|
|
1952
1950
|
processingTime: Date.now() - startTime
|
|
1953
1951
|
});
|
|
1954
1952
|
}).on("end", async () => {
|
|
@@ -1967,14 +1965,14 @@ var AudioProcessor = class {
|
|
|
1967
1965
|
} catch (error) {
|
|
1968
1966
|
resolve({
|
|
1969
1967
|
success: false,
|
|
1970
|
-
error:
|
|
1968
|
+
error: "\u964D\u566A\u5904\u7406\u5F02\u5E38: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"),
|
|
1971
1969
|
processingTime: Date.now() - startTime
|
|
1972
1970
|
});
|
|
1973
1971
|
}
|
|
1974
1972
|
});
|
|
1975
1973
|
}
|
|
1976
1974
|
};
|
|
1977
|
-
var logger4 =
|
|
1975
|
+
var logger4 = chunk25OFOKNF_js.createLogger("VideoProcessor");
|
|
1978
1976
|
var VideoProcessor = class {
|
|
1979
1977
|
constructor() {
|
|
1980
1978
|
this.type = "video";
|
|
@@ -2011,16 +2009,16 @@ var VideoProcessor = class {
|
|
|
2011
2009
|
}
|
|
2012
2010
|
const videoOptions = options;
|
|
2013
2011
|
const startTime = Date.now();
|
|
2014
|
-
logger4.info(
|
|
2012
|
+
logger4.info("\u{1F3AC} [VideoProcessor] \u5F00\u59CB\u5904\u7406\u89C6\u9891: " + inputPath);
|
|
2015
2013
|
try {
|
|
2016
2014
|
if (!fs.existsSync(inputPath)) {
|
|
2017
|
-
throw new Error(
|
|
2015
|
+
throw new Error("\u8F93\u5165\u6587\u4EF6\u4E0D\u5B58\u5728: " + inputPath);
|
|
2018
2016
|
}
|
|
2019
2017
|
const outputDir = path3__namespace.dirname(outputPath);
|
|
2020
2018
|
await fs.promises.mkdir(outputDir, { recursive: true });
|
|
2021
2019
|
const metadata = await this.getVideoMetadata(inputPath);
|
|
2022
2020
|
logger4.info(
|
|
2023
|
-
|
|
2021
|
+
"\u{1F4CA} [VideoProcessor] \u89C6\u9891\u4FE1\u606F: " + metadata.width + "x" + metadata.height + ", " + this.formatDuration(metadata.duration) + ", " + metadata.fps + "fps"
|
|
2024
2022
|
);
|
|
2025
2023
|
const outputFormat = this.determineOutputFormat(outputPath, videoOptions.format);
|
|
2026
2024
|
await this.processVideo(inputPath, outputPath, videoOptions, outputFormat);
|
|
@@ -2034,7 +2032,7 @@ var VideoProcessor = class {
|
|
|
2034
2032
|
}
|
|
2035
2033
|
const processedStats = await fs.promises.stat(outputPath);
|
|
2036
2034
|
const processingTime = Date.now() - startTime;
|
|
2037
|
-
logger4.info(
|
|
2035
|
+
logger4.info("\u2705 [VideoProcessor] \u89C6\u9891\u5904\u7406\u5B8C\u6210: " + outputPath + ", \u8017\u65F6: " + processingTime + "ms");
|
|
2038
2036
|
return {
|
|
2039
2037
|
success: true,
|
|
2040
2038
|
processedPath: outputPath,
|
|
@@ -2058,10 +2056,10 @@ var VideoProcessor = class {
|
|
|
2058
2056
|
}
|
|
2059
2057
|
};
|
|
2060
2058
|
} catch (error) {
|
|
2061
|
-
console.error(
|
|
2059
|
+
console.error("\u274C [VideoProcessor] \u89C6\u9891\u5904\u7406\u5931\u8D25: " + inputPath + ":", error);
|
|
2062
2060
|
return {
|
|
2063
2061
|
success: false,
|
|
2064
|
-
error:
|
|
2062
|
+
error: "\u89C6\u9891\u5904\u7406\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"),
|
|
2065
2063
|
processingTime: Date.now() - startTime
|
|
2066
2064
|
};
|
|
2067
2065
|
}
|
|
@@ -2113,7 +2111,7 @@ var VideoProcessor = class {
|
|
|
2113
2111
|
quality: this.getQualityDescription(metadata.width, metadata.height, metadata.bitrate)
|
|
2114
2112
|
};
|
|
2115
2113
|
} catch (error) {
|
|
2116
|
-
console.error(
|
|
2114
|
+
console.error("\u274C [VideoProcessor] \u83B7\u53D6\u89C6\u9891\u4FE1\u606F\u5931\u8D25: " + filePath + ":", error);
|
|
2117
2115
|
throw error;
|
|
2118
2116
|
}
|
|
2119
2117
|
}
|
|
@@ -2134,8 +2132,8 @@ var VideoProcessor = class {
|
|
|
2134
2132
|
try {
|
|
2135
2133
|
this.ffmpeg.ffprobe(filePath, (err, metadata) => {
|
|
2136
2134
|
if (err) {
|
|
2137
|
-
console.error(
|
|
2138
|
-
reject(new Error(
|
|
2135
|
+
console.error("\u274C [VideoProcessor] \u83B7\u53D6\u89C6\u9891\u5143\u6570\u636E\u5931\u8D25: " + filePath + ":", err);
|
|
2136
|
+
reject(new Error("\u65E0\u6CD5\u8BFB\u53D6\u89C6\u9891\u5143\u6570\u636E: " + err.message));
|
|
2139
2137
|
return;
|
|
2140
2138
|
}
|
|
2141
2139
|
const videoStream = metadata.streams?.find(
|
|
@@ -2185,20 +2183,20 @@ var VideoProcessor = class {
|
|
|
2185
2183
|
command = this.setVideoCodec(command, outputFormat);
|
|
2186
2184
|
if (options.quality) {
|
|
2187
2185
|
command = this.setVideoQuality(command, options.quality);
|
|
2188
|
-
logger4.info(
|
|
2186
|
+
logger4.info("\u{1F527} [VideoProcessor] \u8BBE\u7F6E\u89C6\u9891\u8D28\u91CF: " + options.quality);
|
|
2189
2187
|
}
|
|
2190
2188
|
command = command.format(outputFormat);
|
|
2191
2189
|
command.on("progress", (progress) => {
|
|
2192
2190
|
if (progress.percent) {
|
|
2193
|
-
logger4.info(
|
|
2191
|
+
logger4.info("\u{1F3AC} [VideoProcessor] \u5904\u7406\u8FDB\u5EA6: " + Math.round(progress.percent) + "%");
|
|
2194
2192
|
}
|
|
2195
2193
|
});
|
|
2196
2194
|
command.on("error", (err) => {
|
|
2197
2195
|
console.error(`\u274C [VideoProcessor] FFmpeg\u5904\u7406\u9519\u8BEF:`, err);
|
|
2198
|
-
reject(new Error(
|
|
2196
|
+
reject(new Error("\u89C6\u9891\u5904\u7406\u5931\u8D25: " + err.message));
|
|
2199
2197
|
});
|
|
2200
2198
|
command.on("end", () => {
|
|
2201
|
-
logger4.info(
|
|
2199
|
+
logger4.info("\u2705 [VideoProcessor] FFmpeg\u5904\u7406\u5B8C\u6210: " + outputPath);
|
|
2202
2200
|
resolve();
|
|
2203
2201
|
});
|
|
2204
2202
|
command.save(outputPath);
|
|
@@ -2229,7 +2227,7 @@ var VideoProcessor = class {
|
|
|
2229
2227
|
*/
|
|
2230
2228
|
setVideoQuality(command, quality) {
|
|
2231
2229
|
const crf = Math.max(18, Math.min(51, 51 - Math.floor(quality * 0.33)));
|
|
2232
|
-
return command.outputOptions([
|
|
2230
|
+
return command.outputOptions(["-crf " + crf]);
|
|
2233
2231
|
}
|
|
2234
2232
|
/**
|
|
2235
2233
|
* 确定输出格式
|
|
@@ -2255,10 +2253,10 @@ var VideoProcessor = class {
|
|
|
2255
2253
|
try {
|
|
2256
2254
|
const thumbnailPath = this.getThumbnailPath(outputPath);
|
|
2257
2255
|
this.ffmpeg(inputPath).seekInput(timeOffset).frames(1).size("320x240").on("error", (err) => {
|
|
2258
|
-
console.warn(
|
|
2256
|
+
console.warn("\u26A0\uFE0F [VideoProcessor] \u7F29\u7565\u56FE\u751F\u6210\u5931\u8D25: " + err.message);
|
|
2259
2257
|
reject(err);
|
|
2260
2258
|
}).on("end", () => {
|
|
2261
|
-
logger4.info(
|
|
2259
|
+
logger4.info("\u{1F5BC}\uFE0F [VideoProcessor] \u89C6\u9891\u7F29\u7565\u56FE\u751F\u6210\u5B8C\u6210: " + thumbnailPath);
|
|
2262
2260
|
resolve(thumbnailPath);
|
|
2263
2261
|
}).save(thumbnailPath);
|
|
2264
2262
|
} catch (error) {
|
|
@@ -2273,7 +2271,7 @@ var VideoProcessor = class {
|
|
|
2273
2271
|
getThumbnailPath(originalPath) {
|
|
2274
2272
|
const ext = path3__namespace.extname(originalPath);
|
|
2275
2273
|
const basePath = originalPath.replace(ext, "");
|
|
2276
|
-
return
|
|
2274
|
+
return basePath + "_thumb.jpg";
|
|
2277
2275
|
}
|
|
2278
2276
|
/**
|
|
2279
2277
|
* 格式化时长显示
|
|
@@ -2283,9 +2281,9 @@ var VideoProcessor = class {
|
|
|
2283
2281
|
const minutes = Math.floor(seconds % 3600 / 60);
|
|
2284
2282
|
const remainingSeconds = Math.floor(seconds % 60);
|
|
2285
2283
|
if (hours > 0) {
|
|
2286
|
-
return
|
|
2284
|
+
return hours + ":" + minutes.toString().padStart(2, "0") + ":" + remainingSeconds.toString().padStart(2, "0");
|
|
2287
2285
|
} else {
|
|
2288
|
-
return
|
|
2286
|
+
return minutes + ":" + remainingSeconds.toString().padStart(2, "0");
|
|
2289
2287
|
}
|
|
2290
2288
|
}
|
|
2291
2289
|
/**
|
|
@@ -2301,7 +2299,7 @@ var VideoProcessor = class {
|
|
|
2301
2299
|
} else if (width >= 640 && height >= 480) {
|
|
2302
2300
|
return "480p SD";
|
|
2303
2301
|
} else {
|
|
2304
|
-
return
|
|
2302
|
+
return width + "x" + height;
|
|
2305
2303
|
}
|
|
2306
2304
|
}
|
|
2307
2305
|
/**
|
|
@@ -2326,18 +2324,18 @@ var VideoProcessor = class {
|
|
|
2326
2324
|
createMockFFmpeg() {
|
|
2327
2325
|
logger4.info("\u{1F9EA} [VideoProcessor] \u521B\u5EFA\u6A21\u62DFFFmpeg\u5904\u7406\u5668");
|
|
2328
2326
|
const mockFFmpeg = (input) => {
|
|
2329
|
-
logger4.info(
|
|
2327
|
+
logger4.info("\u{1F9EA} [MockFFmpeg] \u5904\u7406\u89C6\u9891: " + input);
|
|
2330
2328
|
return {
|
|
2331
2329
|
videoCodec: (codec) => {
|
|
2332
|
-
logger4.info(
|
|
2330
|
+
logger4.info("\u{1F9EA} [MockFFmpeg] \u8BBE\u7F6E\u89C6\u9891\u7F16\u89E3\u7801\u5668: " + codec);
|
|
2333
2331
|
return mockFFmpeg(input);
|
|
2334
2332
|
},
|
|
2335
2333
|
audioCodec: (codec) => {
|
|
2336
|
-
logger4.info(
|
|
2334
|
+
logger4.info("\u{1F9EA} [MockFFmpeg] \u8BBE\u7F6E\u97F3\u9891\u7F16\u89E3\u7801\u5668: " + codec);
|
|
2337
2335
|
return mockFFmpeg(input);
|
|
2338
2336
|
},
|
|
2339
2337
|
format: (format) => {
|
|
2340
|
-
logger4.info(
|
|
2338
|
+
logger4.info("\u{1F9EA} [MockFFmpeg] \u8BBE\u7F6E\u8F93\u51FA\u683C\u5F0F: " + format);
|
|
2341
2339
|
return mockFFmpeg(input);
|
|
2342
2340
|
},
|
|
2343
2341
|
outputOptions: (options) => {
|
|
@@ -2345,19 +2343,19 @@ var VideoProcessor = class {
|
|
|
2345
2343
|
return mockFFmpeg(input);
|
|
2346
2344
|
},
|
|
2347
2345
|
seekInput: (time) => {
|
|
2348
|
-
logger4.info(
|
|
2346
|
+
logger4.info("\u{1F9EA} [MockFFmpeg] \u8DF3\u8F6C\u5230\u65F6\u95F4: " + time + "s");
|
|
2349
2347
|
return mockFFmpeg(input);
|
|
2350
2348
|
},
|
|
2351
2349
|
frames: (count) => {
|
|
2352
|
-
logger4.info(
|
|
2350
|
+
logger4.info("\u{1F9EA} [MockFFmpeg] \u63D0\u53D6\u5E27\u6570: " + count);
|
|
2353
2351
|
return mockFFmpeg(input);
|
|
2354
2352
|
},
|
|
2355
2353
|
size: (size) => {
|
|
2356
|
-
logger4.info(
|
|
2354
|
+
logger4.info("\u{1F9EA} [MockFFmpeg] \u8BBE\u7F6E\u5C3A\u5BF8: " + size);
|
|
2357
2355
|
return mockFFmpeg(input);
|
|
2358
2356
|
},
|
|
2359
2357
|
on: (event, callback) => {
|
|
2360
|
-
logger4.info(
|
|
2358
|
+
logger4.info("\u{1F9EA} [MockFFmpeg] \u6CE8\u518C\u4E8B\u4EF6\u76D1\u542C: " + event);
|
|
2361
2359
|
if (event === "progress") {
|
|
2362
2360
|
setTimeout(() => callback({ percent: 25 }), 100);
|
|
2363
2361
|
setTimeout(() => callback({ percent: 50 }), 200);
|
|
@@ -2369,15 +2367,15 @@ var VideoProcessor = class {
|
|
|
2369
2367
|
return mockFFmpeg(input);
|
|
2370
2368
|
},
|
|
2371
2369
|
save: async (outputPath) => {
|
|
2372
|
-
logger4.info(
|
|
2370
|
+
logger4.info("\u{1F9EA} [MockFFmpeg] \u4FDD\u5B58\u89C6\u9891\u6587\u4EF6: " + outputPath);
|
|
2373
2371
|
const outputDir = path3__namespace.dirname(outputPath);
|
|
2374
2372
|
await fs.promises.mkdir(outputDir, { recursive: true });
|
|
2375
|
-
await fs.promises.writeFile(outputPath,
|
|
2373
|
+
await fs.promises.writeFile(outputPath, "Mock processed video from " + input);
|
|
2376
2374
|
}
|
|
2377
2375
|
};
|
|
2378
2376
|
};
|
|
2379
2377
|
mockFFmpeg.ffprobe = (filePath, callback) => {
|
|
2380
|
-
logger4.info(
|
|
2378
|
+
logger4.info("\u{1F9EA} [MockFFmpeg] \u83B7\u53D6\u89C6\u9891\u5143\u6570\u636E: " + filePath);
|
|
2381
2379
|
setTimeout(() => {
|
|
2382
2380
|
const mockMetadata = {
|
|
2383
2381
|
streams: [
|
|
@@ -2406,14 +2404,14 @@ var VideoProcessor = class {
|
|
|
2406
2404
|
*/
|
|
2407
2405
|
async batchProcess(inputPaths, outputDir, options, onProgress) {
|
|
2408
2406
|
this.ensureInitialized();
|
|
2409
|
-
logger4.info(
|
|
2407
|
+
logger4.info("\u{1F3AC} [VideoProcessor] \u5F00\u59CB\u6279\u91CF\u5904\u7406 " + inputPaths.length + " \u4E2A\u89C6\u9891\u6587\u4EF6");
|
|
2410
2408
|
const results = [];
|
|
2411
2409
|
for (let i = 0; i < inputPaths.length; i++) {
|
|
2412
2410
|
const inputPath = inputPaths[i];
|
|
2413
2411
|
const fileName = path3__namespace.basename(inputPath);
|
|
2414
2412
|
const nameWithoutExt = path3__namespace.parse(fileName).name;
|
|
2415
2413
|
const outputFormat = options.format || "mp4";
|
|
2416
|
-
const outputPath = path3__namespace.join(outputDir,
|
|
2414
|
+
const outputPath = path3__namespace.join(outputDir, nameWithoutExt + "." + outputFormat);
|
|
2417
2415
|
try {
|
|
2418
2416
|
const result = await this.process(inputPath, outputPath, options);
|
|
2419
2417
|
results.push(result);
|
|
@@ -2421,15 +2419,15 @@ var VideoProcessor = class {
|
|
|
2421
2419
|
onProgress(i + 1, inputPaths.length);
|
|
2422
2420
|
}
|
|
2423
2421
|
} catch (error) {
|
|
2424
|
-
console.error(
|
|
2422
|
+
console.error("\u274C [VideoProcessor] \u6279\u91CF\u5904\u7406\u5931\u8D25: " + inputPath + ":", error);
|
|
2425
2423
|
results.push({
|
|
2426
2424
|
success: false,
|
|
2427
|
-
error:
|
|
2425
|
+
error: "\u5904\u7406\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
2428
2426
|
});
|
|
2429
2427
|
}
|
|
2430
2428
|
}
|
|
2431
2429
|
const successCount = results.filter((r) => r.success).length;
|
|
2432
|
-
logger4.info(
|
|
2430
|
+
logger4.info("\u2705 [VideoProcessor] \u6279\u91CF\u5904\u7406\u5B8C\u6210\uFF0C\u6210\u529F: " + successCount + "/" + inputPaths.length);
|
|
2433
2431
|
return results;
|
|
2434
2432
|
}
|
|
2435
2433
|
/**
|
|
@@ -2438,24 +2436,24 @@ var VideoProcessor = class {
|
|
|
2438
2436
|
async extractFrames(inputPath, outputDir, options = {}) {
|
|
2439
2437
|
this.ensureInitialized();
|
|
2440
2438
|
const { count = 10, interval, format = "jpg" } = options;
|
|
2441
|
-
logger4.info(
|
|
2439
|
+
logger4.info("\u{1F5BC}\uFE0F [VideoProcessor] \u63D0\u53D6\u89C6\u9891\u5E27: " + inputPath + ", \u6570\u91CF: " + count);
|
|
2442
2440
|
return new Promise((resolve, reject) => {
|
|
2443
2441
|
try {
|
|
2444
2442
|
let command = this.ffmpeg(inputPath);
|
|
2445
2443
|
if (interval) {
|
|
2446
|
-
command = command.outputOptions([
|
|
2444
|
+
command = command.outputOptions(["-vf fps=1/" + interval]);
|
|
2447
2445
|
} else {
|
|
2448
2446
|
command = command.frames(count);
|
|
2449
2447
|
}
|
|
2450
|
-
const outputPattern = path3__namespace.join(outputDir,
|
|
2448
|
+
const outputPattern = path3__namespace.join(outputDir, "frame_%03d." + format);
|
|
2451
2449
|
command.on("error", (err) => {
|
|
2452
2450
|
console.error(`\u274C [VideoProcessor] \u63D0\u53D6\u5E27\u5931\u8D25:`, err);
|
|
2453
|
-
reject(new Error(
|
|
2451
|
+
reject(new Error("\u63D0\u53D6\u5E27\u5931\u8D25: " + err.message));
|
|
2454
2452
|
}).on("end", async () => {
|
|
2455
2453
|
try {
|
|
2456
2454
|
const files = await fs.promises.readdir(outputDir);
|
|
2457
|
-
const frameFiles = files.filter((file) => file.startsWith("frame_") && file.endsWith(
|
|
2458
|
-
logger4.info(
|
|
2455
|
+
const frameFiles = files.filter((file) => file.startsWith("frame_") && file.endsWith("." + format)).sort().map((file) => path3__namespace.join(outputDir, file));
|
|
2456
|
+
logger4.info("\u2705 [VideoProcessor] \u5E27\u63D0\u53D6\u5B8C\u6210\uFF0C\u5171 " + frameFiles.length + " \u5E27");
|
|
2459
2457
|
resolve(frameFiles);
|
|
2460
2458
|
} catch (error) {
|
|
2461
2459
|
reject(error);
|
|
@@ -2471,7 +2469,7 @@ var VideoProcessor = class {
|
|
|
2471
2469
|
*/
|
|
2472
2470
|
async compress(inputPath, outputPath, compressionLevel = "medium") {
|
|
2473
2471
|
this.ensureInitialized();
|
|
2474
|
-
logger4.info(
|
|
2472
|
+
logger4.info("\u{1F5DC}\uFE0F [VideoProcessor] \u5F00\u59CB\u89C6\u9891\u538B\u7F29: " + inputPath + ", \u7EA7\u522B: " + compressionLevel);
|
|
2475
2473
|
const options = {
|
|
2476
2474
|
type: "video",
|
|
2477
2475
|
quality: this.getCompressionQuality(compressionLevel),
|
|
@@ -2495,7 +2493,7 @@ var VideoProcessor = class {
|
|
|
2495
2493
|
}
|
|
2496
2494
|
}
|
|
2497
2495
|
};
|
|
2498
|
-
var logger5 =
|
|
2496
|
+
var logger5 = chunk25OFOKNF_js.createLogger("ProcessingQueue");
|
|
2499
2497
|
var ProcessingQueue = class extends events.EventEmitter {
|
|
2500
2498
|
constructor(options = {}) {
|
|
2501
2499
|
super();
|
|
@@ -2522,7 +2520,7 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2522
2520
|
*/
|
|
2523
2521
|
registerProcessor(processor) {
|
|
2524
2522
|
this.processors.set(processor.type, processor);
|
|
2525
|
-
logger5.info(
|
|
2523
|
+
logger5.info("\u{1F527} [ProcessingQueue] \u6CE8\u518C\u5904\u7406\u5668: " + processor.type);
|
|
2526
2524
|
}
|
|
2527
2525
|
/**
|
|
2528
2526
|
* 添加任务到队列
|
|
@@ -2544,11 +2542,11 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2544
2542
|
};
|
|
2545
2543
|
const processor = this.processors.get(options.type);
|
|
2546
2544
|
if (!processor) {
|
|
2547
|
-
throw new Error(
|
|
2545
|
+
throw new Error("\u672A\u627E\u5230\u7C7B\u578B\u4E3A " + options.type + " \u7684\u6587\u4EF6\u5904\u7406\u5668");
|
|
2548
2546
|
}
|
|
2549
2547
|
task.processor = processor;
|
|
2550
2548
|
this.tasks.set(taskId, task);
|
|
2551
|
-
logger5.info(
|
|
2549
|
+
logger5.info("\u{1F4DD} [ProcessingQueue] \u6DFB\u52A0\u4EFB\u52A1: " + taskId + " (" + inputPath + ")");
|
|
2552
2550
|
this.emit("taskAdded", task);
|
|
2553
2551
|
if (this.isStarted) {
|
|
2554
2552
|
this.processNext();
|
|
@@ -2593,15 +2591,15 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2593
2591
|
pauseTask(taskId) {
|
|
2594
2592
|
const task = this.tasks.get(taskId);
|
|
2595
2593
|
if (!task) {
|
|
2596
|
-
console.warn(
|
|
2594
|
+
console.warn("\u26A0\uFE0F [ProcessingQueue] \u4EFB\u52A1\u4E0D\u5B58\u5728: " + taskId);
|
|
2597
2595
|
return false;
|
|
2598
2596
|
}
|
|
2599
2597
|
if (task.status === "running") {
|
|
2600
|
-
console.warn(
|
|
2598
|
+
console.warn("\u26A0\uFE0F [ProcessingQueue] \u65E0\u6CD5\u6682\u505C\u6B63\u5728\u8FD0\u884C\u7684\u4EFB\u52A1: " + taskId);
|
|
2601
2599
|
return false;
|
|
2602
2600
|
}
|
|
2603
2601
|
task.status = "cancelled";
|
|
2604
|
-
logger5.info(
|
|
2602
|
+
logger5.info("\u23F8\uFE0F [ProcessingQueue] \u6682\u505C\u4EFB\u52A1: " + taskId);
|
|
2605
2603
|
this.emit("taskCancelled", task);
|
|
2606
2604
|
return true;
|
|
2607
2605
|
}
|
|
@@ -2611,15 +2609,15 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2611
2609
|
cancelTask(taskId) {
|
|
2612
2610
|
const task = this.tasks.get(taskId);
|
|
2613
2611
|
if (!task) {
|
|
2614
|
-
console.warn(
|
|
2612
|
+
console.warn("\u26A0\uFE0F [ProcessingQueue] \u4EFB\u52A1\u4E0D\u5B58\u5728: " + taskId);
|
|
2615
2613
|
return false;
|
|
2616
2614
|
}
|
|
2617
2615
|
if (task.status === "running") {
|
|
2618
|
-
console.warn(
|
|
2616
|
+
console.warn("\u26A0\uFE0F [ProcessingQueue] \u65E0\u6CD5\u53D6\u6D88\u6B63\u5728\u8FD0\u884C\u7684\u4EFB\u52A1: " + taskId);
|
|
2619
2617
|
return false;
|
|
2620
2618
|
}
|
|
2621
2619
|
task.status = "cancelled";
|
|
2622
|
-
logger5.info(
|
|
2620
|
+
logger5.info("\u274C [ProcessingQueue] \u53D6\u6D88\u4EFB\u52A1: " + taskId);
|
|
2623
2621
|
this.emit("taskCancelled", task);
|
|
2624
2622
|
return true;
|
|
2625
2623
|
}
|
|
@@ -2682,7 +2680,7 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2682
2680
|
}
|
|
2683
2681
|
const afterCount = this.tasks.size;
|
|
2684
2682
|
const cleanedCount = beforeCount - afterCount;
|
|
2685
|
-
logger5.info(
|
|
2683
|
+
logger5.info("\u{1F9F9} [ProcessingQueue] \u6E05\u7406\u5B8C\u6210\uFF0C\u79FB\u9664 " + cleanedCount + " \u4E2A\u4EFB\u52A1");
|
|
2686
2684
|
this.emit("cleanup", { cleaned: cleanedCount, remaining: afterCount });
|
|
2687
2685
|
}
|
|
2688
2686
|
// ============= 私有方法 =============
|
|
@@ -2733,7 +2731,7 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2733
2731
|
this.failTask(task, "\u672A\u627E\u5230\u5BF9\u5E94\u7684\u6587\u4EF6\u5904\u7406\u5668");
|
|
2734
2732
|
return;
|
|
2735
2733
|
}
|
|
2736
|
-
logger5.info(
|
|
2734
|
+
logger5.info("\u{1F680} [ProcessingQueue] \u5F00\u59CB\u5904\u7406\u4EFB\u52A1: " + task.id);
|
|
2737
2735
|
task.status = "running";
|
|
2738
2736
|
task.startTime = Date.now();
|
|
2739
2737
|
this.runningTasks.add(task.id);
|
|
@@ -2765,7 +2763,7 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2765
2763
|
task.endTime = Date.now();
|
|
2766
2764
|
task.result = result;
|
|
2767
2765
|
this.runningTasks.delete(task.id);
|
|
2768
|
-
logger5.info(
|
|
2766
|
+
logger5.info("\u2705 [ProcessingQueue] \u4EFB\u52A1\u5B8C\u6210: " + task.id);
|
|
2769
2767
|
if (task.onComplete) {
|
|
2770
2768
|
try {
|
|
2771
2769
|
task.onComplete(task, result);
|
|
@@ -2785,7 +2783,7 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2785
2783
|
task.retries++;
|
|
2786
2784
|
task.status = "pending";
|
|
2787
2785
|
task.error = void 0;
|
|
2788
|
-
logger5.info(
|
|
2786
|
+
logger5.info("\u{1F504} [ProcessingQueue] \u91CD\u8BD5\u4EFB\u52A1: " + task.id + " (" + task.retries + "/" + task.maxRetries + ")");
|
|
2789
2787
|
this.emit("taskRetried", task);
|
|
2790
2788
|
setTimeout(() => {
|
|
2791
2789
|
if (this.isStarted) {
|
|
@@ -2804,7 +2802,7 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2804
2802
|
task.endTime = Date.now();
|
|
2805
2803
|
task.error = error;
|
|
2806
2804
|
this.runningTasks.delete(task.id);
|
|
2807
|
-
console.error(
|
|
2805
|
+
console.error("\u274C [ProcessingQueue] \u4EFB\u52A1\u5931\u8D25: " + task.id + " - " + error);
|
|
2808
2806
|
if (task.onError) {
|
|
2809
2807
|
try {
|
|
2810
2808
|
task.onError(task, error);
|
|
@@ -2819,7 +2817,7 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2819
2817
|
* 生成唯一任务ID
|
|
2820
2818
|
*/
|
|
2821
2819
|
generateTaskId() {
|
|
2822
|
-
return
|
|
2820
|
+
return "task_" + Date.now() + "_" + Math.random().toString(36).substr(2, 9);
|
|
2823
2821
|
}
|
|
2824
2822
|
/**
|
|
2825
2823
|
* 批量添加任务
|
|
@@ -2828,7 +2826,7 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2828
2826
|
const taskIds = [];
|
|
2829
2827
|
const results = /* @__PURE__ */ new Map();
|
|
2830
2828
|
let completedCount = 0;
|
|
2831
|
-
logger5.info(
|
|
2829
|
+
logger5.info("\u{1F4E6} [ProcessingQueue] \u6279\u91CF\u6DFB\u52A0 " + tasks.length + " \u4E2A\u4EFB\u52A1");
|
|
2832
2830
|
for (const taskSpec of tasks) {
|
|
2833
2831
|
const taskId = this.addTask(taskSpec.inputPath, taskSpec.outputPath, taskSpec.options, {
|
|
2834
2832
|
priority: taskSpec.priority,
|
|
@@ -2865,15 +2863,15 @@ var ProcessingQueue = class extends events.EventEmitter {
|
|
|
2865
2863
|
const issues = [];
|
|
2866
2864
|
const recommendations = [];
|
|
2867
2865
|
if (stats.successRate < 0.8 && stats.totalTasks > 10) {
|
|
2868
|
-
issues.push(
|
|
2866
|
+
issues.push("\u6210\u529F\u7387\u8FC7\u4F4E: " + (stats.successRate * 100).toFixed(1) + "%");
|
|
2869
2867
|
recommendations.push("\u68C0\u67E5\u6587\u4EF6\u5904\u7406\u5668\u914D\u7F6E\u548C\u8F93\u5165\u6587\u4EF6\u8D28\u91CF");
|
|
2870
2868
|
}
|
|
2871
2869
|
if (stats.pendingTasks > 50) {
|
|
2872
|
-
issues.push(
|
|
2870
|
+
issues.push("\u5F85\u5904\u7406\u4EFB\u52A1\u79EF\u538B: " + stats.pendingTasks + " \u4E2A");
|
|
2873
2871
|
recommendations.push("\u8003\u8651\u589E\u52A0\u5E76\u53D1\u5904\u7406\u6570\u6216\u4F18\u5316\u5904\u7406\u6027\u80FD");
|
|
2874
2872
|
}
|
|
2875
2873
|
if (stats.averageProcessingTime > 6e4) {
|
|
2876
|
-
issues.push(
|
|
2874
|
+
issues.push("\u5E73\u5747\u5904\u7406\u65F6\u95F4\u8FC7\u957F: " + (stats.averageProcessingTime / 1e3).toFixed(1) + "\u79D2");
|
|
2877
2875
|
recommendations.push("\u4F18\u5316\u6587\u4EF6\u5904\u7406\u903B\u8F91\u6216\u51CF\u5C11\u5904\u7406\u590D\u6742\u5EA6");
|
|
2878
2876
|
}
|
|
2879
2877
|
return {
|
|
@@ -2939,7 +2937,7 @@ function getMimeType(filename) {
|
|
|
2939
2937
|
const ext = path3__namespace.extname(filename).toLowerCase();
|
|
2940
2938
|
return MIME_TYPES[ext] || "application/octet-stream";
|
|
2941
2939
|
}
|
|
2942
|
-
var logger6 =
|
|
2940
|
+
var logger6 = chunk25OFOKNF_js.createLogger("UniversalFileService");
|
|
2943
2941
|
var UniversalFileService = class extends events.EventEmitter {
|
|
2944
2942
|
constructor(config) {
|
|
2945
2943
|
super();
|
|
@@ -2973,23 +2971,23 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
2973
2971
|
try {
|
|
2974
2972
|
const metadata = data.metadata || data;
|
|
2975
2973
|
await repository.save(metadata);
|
|
2976
|
-
logger6.info(
|
|
2974
|
+
logger6.info("\u{1F4BE} [Persistence] \u6587\u4EF6\u5143\u6570\u636E\u5DF2\u81EA\u52A8\u4FDD\u5B58: " + fileId);
|
|
2977
2975
|
} catch (error) {
|
|
2978
|
-
logger6.error(
|
|
2976
|
+
logger6.error("\u274C [Persistence] \u4FDD\u5B58\u5931\u8D25: " + fileId, error);
|
|
2979
2977
|
}
|
|
2980
2978
|
});
|
|
2981
2979
|
this.on("file:deleted", async (fileId) => {
|
|
2982
2980
|
try {
|
|
2983
2981
|
await repository.delete(fileId);
|
|
2984
|
-
logger6.info(
|
|
2982
|
+
logger6.info("\u{1F5D1}\uFE0F [Persistence] \u6587\u4EF6\u5143\u6570\u636E\u5DF2\u81EA\u52A8\u5220\u9664: " + fileId);
|
|
2985
2983
|
} catch (error) {
|
|
2986
|
-
logger6.error(
|
|
2984
|
+
logger6.error("\u274C [Persistence] \u5220\u9664\u5931\u8D25: " + fileId, error);
|
|
2987
2985
|
}
|
|
2988
2986
|
});
|
|
2989
2987
|
this.on("files:batch-deleted", async (fileIds) => {
|
|
2990
2988
|
try {
|
|
2991
2989
|
await repository.batchDelete(fileIds);
|
|
2992
|
-
logger6.info(
|
|
2990
|
+
logger6.info("\u{1F5D1}\uFE0F [Persistence] \u6279\u91CF\u5220\u9664\u5143\u6570\u636E: " + fileIds.length + " \u4E2A\u6587\u4EF6");
|
|
2993
2991
|
} catch (error) {
|
|
2994
2992
|
logger6.error(`\u274C [Persistence] \u6279\u91CF\u5220\u9664\u5931\u8D25`, error);
|
|
2995
2993
|
}
|
|
@@ -3021,16 +3019,16 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3021
3019
|
for (const [type, provider] of this.storageProviders) {
|
|
3022
3020
|
if ("reinitialize" in provider) {
|
|
3023
3021
|
try {
|
|
3024
|
-
logger6.info(
|
|
3022
|
+
logger6.info("\u{1F504} [UniversalFileService] \u91CD\u65B0\u521D\u59CB\u5316\u5B58\u50A8\u63D0\u4F9B\u8005: " + type + "...");
|
|
3025
3023
|
const config = this.config.storageProviders?.[type];
|
|
3026
3024
|
if (config) {
|
|
3027
3025
|
await provider.reinitialize(config);
|
|
3028
|
-
logger6.info(
|
|
3026
|
+
logger6.info("\u2705 [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u91CD\u65B0\u521D\u59CB\u5316\u5B8C\u6210: " + type);
|
|
3029
3027
|
} else {
|
|
3030
|
-
logger6.warn(
|
|
3028
|
+
logger6.warn("\u26A0\uFE0F [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u914D\u7F6E\u4E0D\u5B58\u5728: " + type);
|
|
3031
3029
|
}
|
|
3032
3030
|
} catch (error) {
|
|
3033
|
-
logger6.error(
|
|
3031
|
+
logger6.error("\u274C [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u91CD\u65B0\u521D\u59CB\u5316\u5931\u8D25: " + type, error);
|
|
3034
3032
|
}
|
|
3035
3033
|
}
|
|
3036
3034
|
}
|
|
@@ -3045,21 +3043,21 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3045
3043
|
*/
|
|
3046
3044
|
registerStorageProvider(provider) {
|
|
3047
3045
|
this.storageProviders.set(provider.type, provider);
|
|
3048
|
-
logger6.info(
|
|
3046
|
+
logger6.info("\u{1F4E6} [UniversalFileService] \u6CE8\u518C\u5B58\u50A8\u63D0\u4F9B\u8005: " + provider.type);
|
|
3049
3047
|
}
|
|
3050
3048
|
/**
|
|
3051
3049
|
* 注册CDN提供者
|
|
3052
3050
|
*/
|
|
3053
3051
|
registerCDNProvider(provider) {
|
|
3054
3052
|
this.cdnProviders.set(provider.type, provider);
|
|
3055
|
-
logger6.info(
|
|
3053
|
+
logger6.info("\u{1F310} [UniversalFileService] \u6CE8\u518CCDN\u63D0\u4F9B\u8005: " + provider.type);
|
|
3056
3054
|
}
|
|
3057
3055
|
/**
|
|
3058
3056
|
* 注册文件处理器
|
|
3059
3057
|
*/
|
|
3060
3058
|
registerFileProcessor(processor) {
|
|
3061
3059
|
this.fileProcessors.set(processor.type, processor);
|
|
3062
|
-
logger6.info(
|
|
3060
|
+
logger6.info("\u2699\uFE0F [UniversalFileService] \u6CE8\u518C\u6587\u4EF6\u5904\u7406\u5668: " + processor.type);
|
|
3063
3061
|
}
|
|
3064
3062
|
// ============= 核心文件操作方法 =============
|
|
3065
3063
|
/**
|
|
@@ -3068,7 +3066,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3068
3066
|
async uploadFile(fileInfo, storageType, onProgress) {
|
|
3069
3067
|
const fileId = uuid.v4();
|
|
3070
3068
|
const startTime = Date.now();
|
|
3071
|
-
logger6.info(
|
|
3069
|
+
logger6.info("\u{1F4E4} [UniversalFileService] \u5F00\u59CB\u4E0A\u4F20\u6587\u4EF6: " + fileInfo.file.name + ", ID: " + fileId);
|
|
3072
3070
|
try {
|
|
3073
3071
|
await this.validateFile(fileInfo.file);
|
|
3074
3072
|
const progress = {
|
|
@@ -3087,7 +3085,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3087
3085
|
let storageProvider = this.storageProviders.get(selectedStorageType);
|
|
3088
3086
|
if (!storageProvider) {
|
|
3089
3087
|
logger6.info(
|
|
3090
|
-
|
|
3088
|
+
"\u26A0\uFE0F [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005 " + selectedStorageType + " \u4E0D\u53EF\u7528\uFF0C\u5C1D\u8BD5\u4F7F\u7528OSS"
|
|
3091
3089
|
);
|
|
3092
3090
|
storageProvider = this.storageProviders.get("aliyun-oss");
|
|
3093
3091
|
if (!storageProvider) {
|
|
@@ -3106,7 +3104,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3106
3104
|
this.emitFileEvent("upload:progress", fileId, { progress: progress.progress });
|
|
3107
3105
|
const uploadResult = await storageProvider.upload(fileInfo, storagePath);
|
|
3108
3106
|
if (!uploadResult.success) {
|
|
3109
|
-
throw new chunkZRAW3HXA_js.FileUploadError(
|
|
3107
|
+
throw new chunkZRAW3HXA_js.FileUploadError("\u4E0A\u4F20\u5931\u8D25: " + uploadResult.error);
|
|
3110
3108
|
}
|
|
3111
3109
|
metadata.storagePath = uploadResult.path || storagePath;
|
|
3112
3110
|
metadata.storageProvider = selectedStorageType;
|
|
@@ -3129,7 +3127,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3129
3127
|
this.uploadProgressMap.set(fileId, progress);
|
|
3130
3128
|
onProgress?.(progress);
|
|
3131
3129
|
const uploadTime = Date.now() - startTime;
|
|
3132
|
-
logger6.info(
|
|
3130
|
+
logger6.info("\u2705 [UniversalFileService] \u6587\u4EF6\u4E0A\u4F20\u5B8C\u6210: " + fileId + ", \u8017\u65F6: " + uploadTime + "ms");
|
|
3133
3131
|
this.emitFileEvent("upload:complete", fileId, {
|
|
3134
3132
|
fileName: fileInfo.file.name,
|
|
3135
3133
|
size: fileInfo.file.size,
|
|
@@ -3137,7 +3135,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3137
3135
|
});
|
|
3138
3136
|
return metadata;
|
|
3139
3137
|
} catch (error) {
|
|
3140
|
-
console.error(
|
|
3138
|
+
console.error("\u274C [UniversalFileService] \u6587\u4EF6\u4E0A\u4F20\u5931\u8D25: " + fileId + ":", error);
|
|
3141
3139
|
const progress = this.uploadProgressMap.get(fileId);
|
|
3142
3140
|
if (progress) {
|
|
3143
3141
|
progress.status = "failed";
|
|
@@ -3165,27 +3163,27 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3165
3163
|
* 下载文件
|
|
3166
3164
|
*/
|
|
3167
3165
|
async downloadFile(fileId, userId) {
|
|
3168
|
-
logger6.info(
|
|
3166
|
+
logger6.info("\u{1F4E5} [UniversalFileService] \u5F00\u59CB\u4E0B\u8F7D\u6587\u4EF6: " + fileId);
|
|
3169
3167
|
try {
|
|
3170
3168
|
this.emitFileEvent("download:start", fileId);
|
|
3171
3169
|
const metadata = await this.getFileMetadata(fileId);
|
|
3172
3170
|
if (!metadata) {
|
|
3173
|
-
throw new chunkZRAW3HXA_js.FileUploadError(
|
|
3171
|
+
throw new chunkZRAW3HXA_js.FileUploadError("\u6587\u4EF6\u4E0D\u5B58\u5728: " + fileId);
|
|
3174
3172
|
}
|
|
3175
3173
|
await this.checkFileAccess(metadata, userId);
|
|
3176
3174
|
const storageProvider = this.storageProviders.get(metadata.storageProvider);
|
|
3177
3175
|
if (!storageProvider) {
|
|
3178
|
-
throw new chunkZRAW3HXA_js.StorageProviderError(
|
|
3176
|
+
throw new chunkZRAW3HXA_js.StorageProviderError("\u5B58\u50A8\u63D0\u4F9B\u8005\u4E0D\u5B58\u5728: " + metadata.storageProvider);
|
|
3179
3177
|
}
|
|
3180
3178
|
const fileBuffer = await storageProvider.download(metadata.storagePath);
|
|
3181
3179
|
if (this.config.persistence?.enabled) {
|
|
3182
3180
|
await this.updateAccessStats(fileId);
|
|
3183
3181
|
}
|
|
3184
|
-
logger6.info(
|
|
3182
|
+
logger6.info("\u2705 [UniversalFileService] \u6587\u4EF6\u4E0B\u8F7D\u5B8C\u6210: " + fileId);
|
|
3185
3183
|
this.emitFileEvent("download:complete", fileId, { size: fileBuffer.length });
|
|
3186
3184
|
return fileBuffer;
|
|
3187
3185
|
} catch (error) {
|
|
3188
|
-
console.error(
|
|
3186
|
+
console.error("\u274C [UniversalFileService] \u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25: " + fileId + ":", error);
|
|
3189
3187
|
this.emitFileEvent("download:error", fileId, void 0, error instanceof Error ? error.message : "\u4E0B\u8F7D\u5931\u8D25");
|
|
3190
3188
|
throw error;
|
|
3191
3189
|
}
|
|
@@ -3194,30 +3192,30 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3194
3192
|
* 删除文件
|
|
3195
3193
|
*/
|
|
3196
3194
|
async deleteFile(fileId, userId) {
|
|
3197
|
-
logger6.info(
|
|
3195
|
+
logger6.info("\u{1F5D1}\uFE0F [UniversalFileService] \u5F00\u59CB\u5220\u9664\u6587\u4EF6: " + fileId);
|
|
3198
3196
|
try {
|
|
3199
3197
|
const metadata = await this.getFileMetadata(fileId);
|
|
3200
3198
|
if (!metadata) {
|
|
3201
|
-
throw new chunkZRAW3HXA_js.FileUploadError(
|
|
3199
|
+
throw new chunkZRAW3HXA_js.FileUploadError("\u6587\u4EF6\u4E0D\u5B58\u5728: " + fileId);
|
|
3202
3200
|
}
|
|
3203
3201
|
await this.checkFileDeleteAccess(metadata, userId);
|
|
3204
3202
|
const storageProvider = this.storageProviders.get(metadata.storageProvider);
|
|
3205
3203
|
if (!storageProvider) {
|
|
3206
|
-
throw new chunkZRAW3HXA_js.StorageProviderError(
|
|
3204
|
+
throw new chunkZRAW3HXA_js.StorageProviderError("\u5B58\u50A8\u63D0\u4F9B\u8005\u4E0D\u5B58\u5728: " + metadata.storageProvider);
|
|
3207
3205
|
}
|
|
3208
3206
|
const deleteResult = await storageProvider.delete(metadata.storagePath);
|
|
3209
3207
|
if (!deleteResult.success) {
|
|
3210
|
-
console.warn(
|
|
3208
|
+
console.warn("\u26A0\uFE0F [UniversalFileService] \u5B58\u50A8\u6587\u4EF6\u5220\u9664\u5931\u8D25: " + deleteResult.error);
|
|
3211
3209
|
}
|
|
3212
3210
|
if (this.config.persistence?.enabled) {
|
|
3213
3211
|
await this.deleteFileMetadata(fileId);
|
|
3214
3212
|
}
|
|
3215
3213
|
this.clearMetadataCache(fileId);
|
|
3216
|
-
logger6.info(
|
|
3214
|
+
logger6.info("\u2705 [UniversalFileService] \u6587\u4EF6\u5220\u9664\u5B8C\u6210: " + fileId);
|
|
3217
3215
|
this.emitFileEvent("delete:complete", fileId);
|
|
3218
3216
|
this.emit("file:deleted", fileId);
|
|
3219
3217
|
} catch (error) {
|
|
3220
|
-
console.error(
|
|
3218
|
+
console.error("\u274C [UniversalFileService] \u6587\u4EF6\u5220\u9664\u5931\u8D25: " + fileId + ":", error);
|
|
3221
3219
|
this.emitFileEvent("delete:error", fileId, void 0, error instanceof Error ? error.message : "\u5220\u9664\u5931\u8D25");
|
|
3222
3220
|
throw error;
|
|
3223
3221
|
}
|
|
@@ -3226,14 +3224,14 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3226
3224
|
* 获取文件访问URL
|
|
3227
3225
|
*/
|
|
3228
3226
|
async getFileUrl(fileId, userId, expiresIn) {
|
|
3229
|
-
const cacheKey =
|
|
3227
|
+
const cacheKey = fileId + "_" + (userId || "public") + "_" + (expiresIn || 0);
|
|
3230
3228
|
const cached = this.urlCache.get(cacheKey);
|
|
3231
3229
|
if (cached && cached.expires > Date.now()) {
|
|
3232
3230
|
return cached.url;
|
|
3233
3231
|
}
|
|
3234
3232
|
const metadata = await this.getFileMetadata(fileId);
|
|
3235
3233
|
if (!metadata) {
|
|
3236
|
-
throw new chunkZRAW3HXA_js.FileUploadError(
|
|
3234
|
+
throw new chunkZRAW3HXA_js.FileUploadError("\u6587\u4EF6\u4E0D\u5B58\u5728: " + fileId);
|
|
3237
3235
|
}
|
|
3238
3236
|
await this.checkFileAccess(metadata, userId);
|
|
3239
3237
|
let url;
|
|
@@ -3242,7 +3240,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3242
3240
|
} else {
|
|
3243
3241
|
const storageProvider = this.storageProviders.get(metadata.storageProvider);
|
|
3244
3242
|
if (!storageProvider) {
|
|
3245
|
-
throw new chunkZRAW3HXA_js.StorageProviderError(
|
|
3243
|
+
throw new chunkZRAW3HXA_js.StorageProviderError("\u5B58\u50A8\u63D0\u4F9B\u8005\u4E0D\u5B58\u5728: " + metadata.storageProvider);
|
|
3246
3244
|
}
|
|
3247
3245
|
url = await storageProvider.getAccessUrl(metadata.storagePath, expiresIn);
|
|
3248
3246
|
}
|
|
@@ -3270,7 +3268,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3270
3268
|
return null;
|
|
3271
3269
|
}
|
|
3272
3270
|
}
|
|
3273
|
-
logger6.warn(
|
|
3271
|
+
logger6.warn("\u26A0\uFE0F [UniversalFileService] \u6301\u4E45\u5316\u672A\u542F\u7528,\u65E0\u6CD5\u67E5\u8BE2\u6587\u4EF6\u5143\u6570\u636E: " + fileId);
|
|
3274
3272
|
return null;
|
|
3275
3273
|
}
|
|
3276
3274
|
/**
|
|
@@ -3376,7 +3374,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3376
3374
|
if (i === maxRetries - 1) {
|
|
3377
3375
|
throw new Error("OSS\u914D\u7F6E\u52A0\u8F7D\u8D85\u65F6\uFF1A\u7F3A\u5C11\u5FC5\u9700\u7684\u914D\u7F6E\u9879 (accessKeyId, accessKeySecret, bucket, region)");
|
|
3378
3376
|
}
|
|
3379
|
-
logger6.debug(
|
|
3377
|
+
logger6.debug("\u7B49\u5F85OSS\u914D\u7F6E\u52A0\u8F7D\u4E2D... (" + (i + 1) + "/" + maxRetries + ")");
|
|
3380
3378
|
}
|
|
3381
3379
|
}
|
|
3382
3380
|
}
|
|
@@ -3397,12 +3395,12 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3397
3395
|
if (provider) {
|
|
3398
3396
|
try {
|
|
3399
3397
|
await provider.initialize(config);
|
|
3400
|
-
logger6.info(
|
|
3398
|
+
logger6.info("\u2705 [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u521D\u59CB\u5316\u5B8C\u6210: " + type);
|
|
3401
3399
|
} catch (error) {
|
|
3402
|
-
console.warn(
|
|
3400
|
+
console.warn("\u26A0\uFE0F [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u521D\u59CB\u5316\u5931\u8D25: " + type + ":", error);
|
|
3403
3401
|
}
|
|
3404
3402
|
} else {
|
|
3405
|
-
console.warn(
|
|
3403
|
+
console.warn("\u26A0\uFE0F [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u672A\u6CE8\u518C: " + type);
|
|
3406
3404
|
}
|
|
3407
3405
|
}
|
|
3408
3406
|
}
|
|
@@ -3413,19 +3411,19 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3413
3411
|
try {
|
|
3414
3412
|
if (this.config.storage) {
|
|
3415
3413
|
if (this.config.storage.type === "aliyun-oss" && this.config.storage.enabled) {
|
|
3416
|
-
const { AliyunOSSProvider: AliyunOSSProvider2 } = await import('../../AliyunOSSProvider-
|
|
3414
|
+
const { AliyunOSSProvider: AliyunOSSProvider2 } = await import('../../AliyunOSSProvider-Z5BRBCG6.js');
|
|
3417
3415
|
const ossProvider = new AliyunOSSProvider2();
|
|
3418
3416
|
this.registerStorageProvider(ossProvider);
|
|
3419
3417
|
logger6.info("\u2705 [UniversalFileService] \u963F\u91CC\u4E91OSS\u63D0\u4F9B\u8005\u6CE8\u518C\u6210\u529F");
|
|
3420
3418
|
} else if (this.config.storage.type === "local" && this.config.storage.enabled) {
|
|
3421
|
-
const { LocalStorageProvider: LocalStorageProvider2 } = await import('../../LocalStorageProvider-
|
|
3419
|
+
const { LocalStorageProvider: LocalStorageProvider2 } = await import('../../LocalStorageProvider-PP7MA5OT.js');
|
|
3422
3420
|
const localProvider = new LocalStorageProvider2();
|
|
3423
3421
|
this.registerStorageProvider(localProvider);
|
|
3424
3422
|
logger6.info("\u2705 [UniversalFileService] \u672C\u5730\u5B58\u50A8\u63D0\u4F9B\u8005\u6CE8\u518C\u6210\u529F");
|
|
3425
3423
|
}
|
|
3426
3424
|
}
|
|
3427
3425
|
if (this.storageProviders.size === 0) {
|
|
3428
|
-
const { LocalStorageProvider: LocalStorageProvider2 } = await import('../../LocalStorageProvider-
|
|
3426
|
+
const { LocalStorageProvider: LocalStorageProvider2 } = await import('../../LocalStorageProvider-PP7MA5OT.js');
|
|
3429
3427
|
const fallbackProvider = new LocalStorageProvider2();
|
|
3430
3428
|
this.registerStorageProvider(fallbackProvider);
|
|
3431
3429
|
logger6.info("\u2705 [UniversalFileService] \u5DF2\u6CE8\u518C\u5907\u7528\u672C\u5730\u5B58\u50A8\u63D0\u4F9B\u8005");
|
|
@@ -3437,22 +3435,22 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3437
3435
|
}
|
|
3438
3436
|
async initializeCDNProviders() {
|
|
3439
3437
|
if (this.config.cdn && this.config.cdn.enabled) {
|
|
3440
|
-
logger6.info(
|
|
3438
|
+
logger6.info("\u2705 [UniversalFileService] CDN\u914D\u7F6E\u5DF2\u542F\u7528: " + this.config.cdn.type);
|
|
3441
3439
|
}
|
|
3442
3440
|
}
|
|
3443
3441
|
async initializeFileProcessors() {
|
|
3444
3442
|
for (const processor of Array.from(this.fileProcessors.values())) {
|
|
3445
3443
|
await processor.initialize();
|
|
3446
|
-
logger6.info(
|
|
3444
|
+
logger6.info("\u2705 [UniversalFileService] \u6587\u4EF6\u5904\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210: " + processor.type);
|
|
3447
3445
|
}
|
|
3448
3446
|
}
|
|
3449
3447
|
async validateFile(file) {
|
|
3450
3448
|
if (this.config.maxFileSize && file.size > this.config.maxFileSize) {
|
|
3451
|
-
throw new chunkZRAW3HXA_js.FileUploadError(
|
|
3449
|
+
throw new chunkZRAW3HXA_js.FileUploadError("\u6587\u4EF6\u5927\u5C0F\u8D85\u8FC7\u9650\u5236: " + file.size + " > " + this.config.maxFileSize);
|
|
3452
3450
|
}
|
|
3453
3451
|
const mimeType = file.type || getMimeType(file.name);
|
|
3454
3452
|
if (this.config.allowedMimeTypes && this.config.allowedMimeTypes.length > 0 && !this.config.allowedMimeTypes.includes(mimeType)) {
|
|
3455
|
-
throw new chunkZRAW3HXA_js.FileUploadError(
|
|
3453
|
+
throw new chunkZRAW3HXA_js.FileUploadError("\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B: " + mimeType);
|
|
3456
3454
|
}
|
|
3457
3455
|
}
|
|
3458
3456
|
async generateFileMetadata(fileId, fileInfo) {
|
|
@@ -3463,7 +3461,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3463
3461
|
return {
|
|
3464
3462
|
id: fileId,
|
|
3465
3463
|
originalName: fileInfo.file.name,
|
|
3466
|
-
storageName:
|
|
3464
|
+
storageName: fileId + extension,
|
|
3467
3465
|
size: fileInfo.file.size,
|
|
3468
3466
|
mimeType,
|
|
3469
3467
|
extension,
|
|
@@ -3484,7 +3482,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3484
3482
|
const year = date.getFullYear();
|
|
3485
3483
|
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
3486
3484
|
const day = String(date.getDate()).padStart(2, "0");
|
|
3487
|
-
return
|
|
3485
|
+
return metadata.moduleId + "/" + year + "/" + month + "/" + day + "/" + metadata.storageName;
|
|
3488
3486
|
}
|
|
3489
3487
|
async generateFileHash(file) {
|
|
3490
3488
|
const buffer = await file.arrayBuffer();
|
|
@@ -3498,7 +3496,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3498
3496
|
}
|
|
3499
3497
|
const processor = this.fileProcessors.get(options.type);
|
|
3500
3498
|
if (!processor) {
|
|
3501
|
-
console.warn(
|
|
3499
|
+
console.warn("\u26A0\uFE0F [UniversalFileService] \u6587\u4EF6\u5904\u7406\u5668\u4E0D\u5B58\u5728: " + options.type);
|
|
3502
3500
|
return;
|
|
3503
3501
|
}
|
|
3504
3502
|
if (this.processingQueue.length >= 1e3) {
|
|
@@ -3519,7 +3517,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3519
3517
|
const basePath = metadata.storagePath;
|
|
3520
3518
|
const extension = path3__namespace.extname(basePath);
|
|
3521
3519
|
const basename4 = basePath.replace(extension, "");
|
|
3522
|
-
return
|
|
3520
|
+
return basename4 + "_processed" + extension;
|
|
3523
3521
|
}
|
|
3524
3522
|
async processFileQueue() {
|
|
3525
3523
|
if (this.isProcessingQueueRunning || this.processingQueue.length === 0) {
|
|
@@ -3538,7 +3536,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3538
3536
|
this.emitFileEvent("processing:error", task.fileId, void 0, result.error);
|
|
3539
3537
|
}
|
|
3540
3538
|
} catch (error) {
|
|
3541
|
-
console.error(
|
|
3539
|
+
console.error("\u274C [UniversalFileService] \u6587\u4EF6\u5904\u7406\u5931\u8D25: " + task.fileId + ":", error);
|
|
3542
3540
|
this.emitFileEvent(
|
|
3543
3541
|
"processing:error",
|
|
3544
3542
|
task.fileId,
|
|
@@ -3582,7 +3580,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3582
3580
|
} catch (error) {
|
|
3583
3581
|
console.error("\u274C [UniversalFileService] \u4FDD\u5B58\u6587\u4EF6\u5143\u6570\u636E\u5931\u8D25:", error);
|
|
3584
3582
|
throw new chunkZRAW3HXA_js.FileUploadError(
|
|
3585
|
-
|
|
3583
|
+
"\u4FDD\u5B58\u6587\u4EF6\u5143\u6570\u636E\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
3586
3584
|
);
|
|
3587
3585
|
}
|
|
3588
3586
|
}
|
|
@@ -3599,7 +3597,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3599
3597
|
} catch (error) {
|
|
3600
3598
|
console.error("\u274C [UniversalFileService] \u5220\u9664\u6587\u4EF6\u5143\u6570\u636E\u5931\u8D25:", error);
|
|
3601
3599
|
throw new chunkZRAW3HXA_js.FileUploadError(
|
|
3602
|
-
|
|
3600
|
+
"\u5220\u9664\u6587\u4EF6\u5143\u6570\u636E\u5931\u8D25: " + (error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF")
|
|
3603
3601
|
);
|
|
3604
3602
|
}
|
|
3605
3603
|
}
|
|
@@ -3647,14 +3645,14 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3647
3645
|
const startTime = Date.now();
|
|
3648
3646
|
while (!this.isFullyInitialized()) {
|
|
3649
3647
|
if (Date.now() - startTime > timeoutMs) {
|
|
3650
|
-
throw new Error(
|
|
3648
|
+
throw new Error("\u670D\u52A1\u521D\u59CB\u5316\u8D85\u65F6 (" + timeoutMs + "ms)");
|
|
3651
3649
|
}
|
|
3652
3650
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
3653
3651
|
}
|
|
3654
3652
|
logger6.info("\u2705 [UniversalFileService] \u670D\u52A1\u5B8C\u5168\u521D\u59CB\u5316\u5C31\u7EEA");
|
|
3655
3653
|
}
|
|
3656
3654
|
};
|
|
3657
|
-
var logger7 =
|
|
3655
|
+
var logger7 = chunk25OFOKNF_js.createLogger("CacheManager");
|
|
3658
3656
|
var CacheManager = class {
|
|
3659
3657
|
constructor(options = {}) {
|
|
3660
3658
|
this.redisClient = null;
|
|
@@ -3705,7 +3703,7 @@ var CacheManager = class {
|
|
|
3705
3703
|
* 生成缓存键
|
|
3706
3704
|
*/
|
|
3707
3705
|
generateKey(key) {
|
|
3708
|
-
return
|
|
3706
|
+
return this.options.keyPrefix + key;
|
|
3709
3707
|
}
|
|
3710
3708
|
/**
|
|
3711
3709
|
* 获取缓存数据
|
|
@@ -3818,7 +3816,7 @@ var CacheManager = class {
|
|
|
3818
3816
|
try {
|
|
3819
3817
|
this.memoryCache.clear();
|
|
3820
3818
|
if (this.redisClient && this.stats.redisConnected) {
|
|
3821
|
-
const keys = await this.redisClient.keys(
|
|
3819
|
+
const keys = await this.redisClient.keys(this.options.keyPrefix + "*");
|
|
3822
3820
|
if (keys.length > 0) {
|
|
3823
3821
|
await this.redisClient.del(...keys);
|
|
3824
3822
|
}
|
|
@@ -3850,7 +3848,7 @@ var CacheManager = class {
|
|
|
3850
3848
|
* 预热缓存
|
|
3851
3849
|
*/
|
|
3852
3850
|
async warmup(items) {
|
|
3853
|
-
logger7.info(
|
|
3851
|
+
logger7.info("\u5F00\u59CB\u9884\u70ED\u7F13\u5B58\uFF0C\u5171 " + items.length + " \u9879...");
|
|
3854
3852
|
const promises = items.map((item) => this.set(item.key, item.data, item.ttl));
|
|
3855
3853
|
try {
|
|
3856
3854
|
await Promise.all(promises);
|
|
@@ -3876,7 +3874,7 @@ var CacheManager = class {
|
|
|
3876
3874
|
*/
|
|
3877
3875
|
matchPattern(key, pattern) {
|
|
3878
3876
|
const regexPattern = pattern.replace(/\*/g, ".*").replace(/\?/g, ".");
|
|
3879
|
-
const regex = new RegExp(
|
|
3877
|
+
const regex = new RegExp("^" + regexPattern + "$");
|
|
3880
3878
|
return regex.test(key);
|
|
3881
3879
|
}
|
|
3882
3880
|
/**
|
|
@@ -4409,7 +4407,7 @@ var CdnCacheStrategy2 = class {
|
|
|
4409
4407
|
Expires: new Date(Date.now() + strategy.browserCacheTtl * 1e3).toUTCString()
|
|
4410
4408
|
};
|
|
4411
4409
|
if (strategy.browserCache) {
|
|
4412
|
-
headers["ETag"] =
|
|
4410
|
+
headers["ETag"] = '"' + Date.now() + '"';
|
|
4413
4411
|
}
|
|
4414
4412
|
headers["Last-Modified"] = (/* @__PURE__ */ new Date()).toUTCString();
|
|
4415
4413
|
if (strategy.type === "static" /* STATIC */) {
|
|
@@ -4488,7 +4486,7 @@ var CdnCacheStrategy2 = class {
|
|
|
4488
4486
|
if (stats.hitRate < 60) {
|
|
4489
4487
|
suggestions.push({
|
|
4490
4488
|
type,
|
|
4491
|
-
issue:
|
|
4489
|
+
issue: type + "\u7C7B\u578B\u6587\u4EF6\u7F13\u5B58\u547D\u4E2D\u7387\u8FC7\u4F4E (" + stats.hitRate.toFixed(1) + "%)",
|
|
4492
4490
|
suggestion: "\u8003\u8651\u589E\u52A0\u7F13\u5B58\u65F6\u95F4\u6216\u542F\u7528\u9884\u70ED\u673A\u5236",
|
|
4493
4491
|
severity: stats.hitRate < 30 ? "high" : "medium"
|
|
4494
4492
|
});
|
|
@@ -4496,7 +4494,7 @@ var CdnCacheStrategy2 = class {
|
|
|
4496
4494
|
if (stats.estimatedSize > 1024 * 1024 * 1024) {
|
|
4497
4495
|
suggestions.push({
|
|
4498
4496
|
type,
|
|
4499
|
-
issue:
|
|
4497
|
+
issue: type + "\u7C7B\u578B\u6587\u4EF6\u7F13\u5B58\u5360\u7528\u7A7A\u95F4\u8FC7\u5927 (" + (stats.estimatedSize / 1024 / 1024 / 1024).toFixed(2) + "GB)",
|
|
4500
4498
|
suggestion: "\u8003\u8651\u51CF\u5C11\u7F13\u5B58\u65F6\u95F4\u6216\u4F18\u5316\u6587\u4EF6\u538B\u7F29",
|
|
4501
4499
|
severity: "medium"
|
|
4502
4500
|
});
|
|
@@ -4656,7 +4654,7 @@ var ApiError = class _ApiError extends Error {
|
|
|
4656
4654
|
});
|
|
4657
4655
|
}
|
|
4658
4656
|
};
|
|
4659
|
-
var logger8 =
|
|
4657
|
+
var logger8 = chunk25OFOKNF_js.createLogger("DrizzleFileRepository");
|
|
4660
4658
|
function createDrizzleRepository(config) {
|
|
4661
4659
|
const { db, table, fieldMapping = {} } = config;
|
|
4662
4660
|
const getField = (field) => {
|
|
@@ -4719,13 +4717,13 @@ function createDrizzleRepository(config) {
|
|
|
4719
4717
|
const existing = await db.select().from(table).where(drizzleOrm.eq(table[getField("id")], metadata.id)).limit(1);
|
|
4720
4718
|
if (existing && existing.length > 0) {
|
|
4721
4719
|
await db.update(table).set(record).where(drizzleOrm.eq(table[getField("id")], metadata.id));
|
|
4722
|
-
logger8.info(
|
|
4720
|
+
logger8.info("\u2705 [DrizzleRepository] \u6587\u4EF6\u5143\u6570\u636E\u5DF2\u66F4\u65B0: " + metadata.id);
|
|
4723
4721
|
} else {
|
|
4724
4722
|
await db.insert(table).values(record);
|
|
4725
|
-
logger8.info(
|
|
4723
|
+
logger8.info("\u2705 [DrizzleRepository] \u6587\u4EF6\u5143\u6570\u636E\u5DF2\u63D2\u5165: " + metadata.id);
|
|
4726
4724
|
}
|
|
4727
4725
|
} catch (error) {
|
|
4728
|
-
logger8.error(
|
|
4726
|
+
logger8.error("\u274C [DrizzleRepository] \u4FDD\u5B58\u5931\u8D25: " + metadata.id, error);
|
|
4729
4727
|
throw error;
|
|
4730
4728
|
}
|
|
4731
4729
|
},
|
|
@@ -4737,7 +4735,7 @@ function createDrizzleRepository(config) {
|
|
|
4737
4735
|
}
|
|
4738
4736
|
return toFileMetadata(result[0]);
|
|
4739
4737
|
} catch (error) {
|
|
4740
|
-
logger8.error(
|
|
4738
|
+
logger8.error("\u274C [DrizzleRepository] \u67E5\u8BE2\u5931\u8D25: " + fileId, error);
|
|
4741
4739
|
throw error;
|
|
4742
4740
|
}
|
|
4743
4741
|
},
|
|
@@ -4772,14 +4770,14 @@ function createDrizzleRepository(config) {
|
|
|
4772
4770
|
conditions.push(drizzleOrm.eq(table[getField("status")], status));
|
|
4773
4771
|
}
|
|
4774
4772
|
if (startDate) {
|
|
4775
|
-
conditions.push(drizzleOrm.sql
|
|
4773
|
+
conditions.push(drizzleOrm.sql(table[getField("uploadedAt")]) + " >= " + startDate);
|
|
4776
4774
|
}
|
|
4777
4775
|
if (endDate) {
|
|
4778
|
-
conditions.push(drizzleOrm.sql
|
|
4776
|
+
conditions.push(drizzleOrm.sql(table[getField("uploadedAt")]) + " <= " + endDate);
|
|
4779
4777
|
}
|
|
4780
4778
|
if (tags && tags.length > 0) {
|
|
4781
4779
|
for (const tag of tags) {
|
|
4782
|
-
conditions.push(drizzleOrm.sql
|
|
4780
|
+
conditions.push(drizzleOrm.sql(table[getField("tags")]) + " @> " + JSON.stringify([tag]));
|
|
4783
4781
|
}
|
|
4784
4782
|
}
|
|
4785
4783
|
const countResult = await db.select({ count: drizzleOrm.sql`count(*)` }).from(table).where(conditions.length > 0 ? drizzleOrm.and(...conditions) : void 0);
|
|
@@ -4802,17 +4800,17 @@ function createDrizzleRepository(config) {
|
|
|
4802
4800
|
async delete(fileId) {
|
|
4803
4801
|
try {
|
|
4804
4802
|
await db.delete(table).where(drizzleOrm.eq(table[getField("id")], fileId));
|
|
4805
|
-
logger8.info(
|
|
4803
|
+
logger8.info("\u{1F5D1}\uFE0F [DrizzleRepository] \u6587\u4EF6\u5143\u6570\u636E\u5DF2\u5220\u9664: " + fileId);
|
|
4806
4804
|
} catch (error) {
|
|
4807
|
-
logger8.error(
|
|
4805
|
+
logger8.error("\u274C [DrizzleRepository] \u5220\u9664\u5931\u8D25: " + fileId, error);
|
|
4808
4806
|
throw error;
|
|
4809
4807
|
}
|
|
4810
4808
|
},
|
|
4811
4809
|
async batchDelete(fileIds) {
|
|
4812
4810
|
try {
|
|
4813
4811
|
if (fileIds.length === 0) return;
|
|
4814
|
-
await db.delete(table).where(drizzleOrm.sql
|
|
4815
|
-
logger8.info(
|
|
4812
|
+
await db.delete(table).where(drizzleOrm.sql(table[getField("id")]) + " = ANY(" + fileIds + ")");
|
|
4813
|
+
logger8.info("\u{1F5D1}\uFE0F [DrizzleRepository] \u6279\u91CF\u5220\u9664\u6210\u529F: " + fileIds.length + " \u4E2A\u6587\u4EF6");
|
|
4816
4814
|
} catch (error) {
|
|
4817
4815
|
logger8.error(`\u274C [DrizzleRepository] \u6279\u91CF\u5220\u9664\u5931\u8D25`, error);
|
|
4818
4816
|
throw error;
|
|
@@ -4822,7 +4820,7 @@ function createDrizzleRepository(config) {
|
|
|
4822
4820
|
}
|
|
4823
4821
|
|
|
4824
4822
|
// src/universalFile/server/config-helpers.ts
|
|
4825
|
-
var logger9 =
|
|
4823
|
+
var logger9 = chunk25OFOKNF_js.createLogger("FileConfigHelpers");
|
|
4826
4824
|
var DEFAULT_MAX_FILE_SIZE = 104857600;
|
|
4827
4825
|
var DEFAULT_ALLOWED_MIME_TYPES = [
|
|
4828
4826
|
// 图片类型
|
|
@@ -4960,7 +4958,7 @@ function loadConfigFromEnv() {
|
|
|
4960
4958
|
const cdnConfig = loadCDNConfigFromEnv();
|
|
4961
4959
|
const storage = ossConfig || getDefaultLocalStorage();
|
|
4962
4960
|
const defaultStorage = ossConfig ? "aliyun-oss" : "local";
|
|
4963
|
-
logger9.info(
|
|
4961
|
+
logger9.info("\u4F7F\u7528\u5B58\u50A8\u65B9\u5F0F: " + defaultStorage);
|
|
4964
4962
|
const config = {
|
|
4965
4963
|
storage,
|
|
4966
4964
|
defaultStorage,
|
|
@@ -4988,7 +4986,7 @@ var DEFAULT_OSS_CONFIG_KEYS = {
|
|
|
4988
4986
|
internal: "aliyun_oss_internal"
|
|
4989
4987
|
};
|
|
4990
4988
|
async function loadOSSConfigFromService(configService, keyMapping = DEFAULT_OSS_CONFIG_KEYS) {
|
|
4991
|
-
const logger10 =
|
|
4989
|
+
const logger10 = chunk25OFOKNF_js.createLogger("loadOSSConfigFromService");
|
|
4992
4990
|
try {
|
|
4993
4991
|
const keys = { ...DEFAULT_OSS_CONFIG_KEYS, ...keyMapping };
|
|
4994
4992
|
const [region, bucket, accessKeyId, accessKeySecret, customDomain, secure, internal] = await Promise.all([
|
|
@@ -5042,7 +5040,7 @@ async function createFileServiceWithFactory(options = {}) {
|
|
|
5042
5040
|
customConfig,
|
|
5043
5041
|
autoInitialize = false
|
|
5044
5042
|
} = options;
|
|
5045
|
-
const logger10 =
|
|
5043
|
+
const logger10 = chunk25OFOKNF_js.createLogger("FileServiceFactory");
|
|
5046
5044
|
logger10.info("\u521B\u5EFA\u6587\u4EF6\u670D\u52A1...");
|
|
5047
5045
|
let config = null;
|
|
5048
5046
|
for (const loader of configLoaders) {
|
|
@@ -5087,7 +5085,7 @@ async function createFileServiceWithFactory(options = {}) {
|
|
|
5087
5085
|
}
|
|
5088
5086
|
function createSingleton(factory, options = {}) {
|
|
5089
5087
|
const { autoInitialize = true, name = "Singleton" } = options;
|
|
5090
|
-
const singletonLogger =
|
|
5088
|
+
const singletonLogger = chunk25OFOKNF_js.createLogger(name);
|
|
5091
5089
|
let instance = null;
|
|
5092
5090
|
let initPromise = null;
|
|
5093
5091
|
return {
|
|
@@ -5582,11 +5580,11 @@ var fileThumbnailsRelations = drizzleOrm.relations(fileThumbnails, ({ one }) =>
|
|
|
5582
5580
|
|
|
5583
5581
|
Object.defineProperty(exports, "LocalStorageProvider", {
|
|
5584
5582
|
enumerable: true,
|
|
5585
|
-
get: function () { return
|
|
5583
|
+
get: function () { return chunkQ5EDCKQA_js.LocalStorageProvider; }
|
|
5586
5584
|
});
|
|
5587
5585
|
Object.defineProperty(exports, "AliyunOSSProvider", {
|
|
5588
5586
|
enumerable: true,
|
|
5589
|
-
get: function () { return
|
|
5587
|
+
get: function () { return chunkX3UU7JHT_js.AliyunOSSProvider; }
|
|
5590
5588
|
});
|
|
5591
5589
|
exports.AliyunCDNProvider = AliyunCDNProvider;
|
|
5592
5590
|
exports.ApiError = ApiError;
|