sa2kit 1.6.30 → 1.6.32
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-4W47OFEK.mjs +6 -0
- package/dist/{AliyunOSSProvider-KJYRIZES.mjs.map → AliyunOSSProvider-4W47OFEK.mjs.map} +1 -1
- package/dist/AliyunOSSProvider-HCNGDJL7.js +15 -0
- package/dist/{AliyunOSSProvider-FWAKUB2T.js.map → AliyunOSSProvider-HCNGDJL7.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-RTPMUOZ2.mjs.map → LocalStorageProvider-3RVPCQB3.mjs.map} +1 -1
- package/dist/LocalStorageProvider-PP7MA5OT.js +15 -0
- package/dist/{LocalStorageProvider-XSRCUXOU.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-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-DUHZ7VZP.js → chunk-7VRT55ZD.js} +3 -3
- package/dist/chunk-7VRT55ZD.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-EI27JKND.mjs +1988 -0
- package/dist/chunk-EI27JKND.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-TV3VKRJK.mjs → chunk-HDMIOOZY.mjs} +38 -68
- package/dist/chunk-HDMIOOZY.mjs.map +1 -0
- package/dist/{chunk-OPPF3326.js → chunk-HJ6MH7J7.js} +39 -69
- package/dist/chunk-HJ6MH7J7.js.map +1 -0
- package/dist/chunk-KO73EBUT.js +80 -0
- package/dist/chunk-KO73EBUT.js.map +1 -0
- package/dist/{chunk-6YKMCPQI.mjs → chunk-KZKIH4AS.mjs} +4 -4
- package/dist/chunk-KZKIH4AS.mjs.map +1 -0
- package/dist/{chunk-LX4XX6W7.js → chunk-L47ZOYHL.js} +15 -89
- package/dist/chunk-L47ZOYHL.js.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-LZHMNOED.js → chunk-Q5EDCKQA.js} +26 -26
- 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-JZXJQMVE.js → chunk-UIFFDRTE.js} +11 -11
- package/dist/chunk-UIFFDRTE.js.map +1 -0
- package/dist/{chunk-T5OZHYVM.mjs → chunk-UKT3PLON.mjs} +13 -85
- package/dist/chunk-UKT3PLON.mjs.map +1 -0
- package/dist/{chunk-UOFTHYIH.js → chunk-UL6XJGUZ.js} +4 -4
- package/dist/chunk-UL6XJGUZ.js.map +1 -0
- package/dist/chunk-VVWQTO4Y.mjs +77 -0
- package/dist/chunk-VVWQTO4Y.mjs.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-XGBE4SUV.js +2093 -0
- package/dist/chunk-XGBE4SUV.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-ZI25QCHD.mjs → chunk-YOTQG4NP.mjs} +25 -25
- 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.d.mts +185 -100
- package/dist/index.d.ts +185 -100
- package/dist/index.js +225 -249
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +80 -104
- package/dist/index.mjs.map +1 -1
- package/dist/logger/index.js +6 -6
- package/dist/logger/index.mjs +1 -1
- package/dist/mikuFusionGame/index.d.mts +112 -0
- package/dist/mikuFusionGame/index.d.ts +112 -0
- package/dist/mikuFusionGame/index.js +680 -0
- package/dist/mikuFusionGame/index.js.map +1 -0
- package/dist/mikuFusionGame/index.mjs +667 -0
- package/dist/mikuFusionGame/index.mjs.map +1 -0
- 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 +15 -14
- package/dist/storage/index.mjs +3 -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 +25 -31
- package/dist/AliyunOSSProvider-FWAKUB2T.js +0 -15
- package/dist/AliyunOSSProvider-KJYRIZES.mjs +0 -6
- package/dist/ConfigService-7MEZXKJ5.js +0 -21
- package/dist/ConfigService-BV57YYFW.mjs +0 -4
- package/dist/LocalStorageProvider-RTPMUOZ2.mjs +0 -6
- package/dist/LocalStorageProvider-XSRCUXOU.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-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 +0 -1727
- package/dist/chunk-DW2ZTOCV.js.map +0 -1
- package/dist/chunk-E7RGBAYJ.js.map +0 -1
- package/dist/chunk-JZXJQMVE.js.map +0 -1
- package/dist/chunk-KQGP6BTS.mjs.map +0 -1
- package/dist/chunk-LFG6FPM5.mjs +0 -1597
- package/dist/chunk-LFG6FPM5.mjs.map +0 -1
- package/dist/chunk-LX4XX6W7.js.map +0 -1
- package/dist/chunk-LZHMNOED.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-OPPF3326.js.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-TOC5FSHP.js.map +0 -1
- package/dist/chunk-TV3VKRJK.mjs.map +0 -1
- package/dist/chunk-UOFTHYIH.js.map +0 -1
- package/dist/chunk-VRTRSEEH.mjs.map +0 -1
- package/dist/chunk-ZI25QCHD.mjs.map +0 -1
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkKH6RQ4J5_js = require('./chunk-KH6RQ4J5.js');
|
|
4
|
-
var
|
|
4
|
+
var chunk25OFOKNF_js = require('./chunk-25OFOKNF.js');
|
|
5
5
|
var OSS = require('ali-oss');
|
|
6
6
|
|
|
7
7
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
8
|
|
|
9
9
|
var OSS__default = /*#__PURE__*/_interopDefault(OSS);
|
|
10
10
|
|
|
11
|
-
var logger =
|
|
11
|
+
var logger = chunk25OFOKNF_js.createLogger("AliyunOSSProvider");
|
|
12
12
|
var AliyunOSSProvider = class {
|
|
13
13
|
constructor() {
|
|
14
14
|
this.type = "aliyun-oss";
|
|
@@ -26,6 +26,7 @@ var AliyunOSSProvider = class {
|
|
|
26
26
|
* 重新初始化存储提供者(支持配置热更新)
|
|
27
27
|
*/
|
|
28
28
|
async reinitialize(config) {
|
|
29
|
+
logger.info("\u{1F504} [AliyunOSSProvider] \u91CD\u65B0\u521D\u59CB\u5316OSS\u5BA2\u6237\u7AEF", config);
|
|
29
30
|
if (config.type !== "aliyun-oss") {
|
|
30
31
|
throw new chunkKH6RQ4J5_js.StorageProviderError("\u914D\u7F6E\u7C7B\u578B\u4E0D\u5339\u914D\uFF1A\u671F\u671B aliyun-oss");
|
|
31
32
|
}
|
|
@@ -34,15 +35,15 @@ var AliyunOSSProvider = class {
|
|
|
34
35
|
if (configChanged) {
|
|
35
36
|
logger.info("\u{1F504} [AliyunOSSProvider] \u68C0\u6D4B\u5230\u914D\u7F6E\u53D8\u5316\uFF0C\u91CD\u65B0\u521D\u59CB\u5316OSS\u5BA2\u6237\u7AEF");
|
|
36
37
|
logger.info(
|
|
37
|
-
|
|
38
|
+
"\u2601\uFE0F [AliyunOSSProvider] \u65B0\u914D\u7F6E: bucket=" + newConfig.bucket + ", region=" + newConfig.region
|
|
38
39
|
);
|
|
39
40
|
} else if (this.isInitialized) {
|
|
40
41
|
logger.info("\u2139\uFE0F [AliyunOSSProvider] \u914D\u7F6E\u672A\u53D8\u5316\uFF0C\u8DF3\u8FC7\u91CD\u65B0\u521D\u59CB\u5316");
|
|
41
42
|
return;
|
|
42
43
|
}
|
|
43
44
|
this.config = newConfig;
|
|
44
|
-
logger.info(
|
|
45
|
-
logger.info(
|
|
45
|
+
logger.info("\u2601\uFE0F [AliyunOSSProvider] " + (this.isInitialized ? "\u91CD\u65B0" : "") + "\u521D\u59CB\u5316\u963F\u91CC\u4E91OSS");
|
|
46
|
+
logger.info("\u2601\uFE0F [AliyunOSSProvider] " + (this.config ? JSON.stringify(this.config) : ""));
|
|
46
47
|
try {
|
|
47
48
|
this.validateConfig();
|
|
48
49
|
if (!this.config.region || typeof this.config.region !== "string") {
|
|
@@ -86,10 +87,8 @@ var AliyunOSSProvider = class {
|
|
|
86
87
|
throw new Error("OSS\u5BA2\u6237\u7AEF\u521B\u5EFA\u5931\u8D25");
|
|
87
88
|
}
|
|
88
89
|
logger.info(`\u2601\uFE0F [AliyunOSSProvider] OSS\u5BA2\u6237\u7AEF\u521B\u5EFA\u6210\u529F`);
|
|
89
|
-
logger.info(`\u2601\uFE0F [AliyunOSSProvider] \u6D4B\u8BD5\u8FDE\u63A5... testConnection`);
|
|
90
|
-
await this.testConnection();
|
|
91
90
|
this.isInitialized = true;
|
|
92
|
-
logger.info(
|
|
91
|
+
logger.info("\u2705 [AliyunOSSProvider] \u963F\u91CC\u4E91OSS" + (configChanged ? "\u91CD\u65B0" : "") + "\u521D\u59CB\u5316\u5B8C\u6210");
|
|
93
92
|
} catch (error) {
|
|
94
93
|
logger.error("\u274C [AliyunOSSProvider] \u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25:", error);
|
|
95
94
|
throw new chunkKH6RQ4J5_js.StorageProviderError(`\u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25`);
|
|
@@ -101,7 +100,7 @@ var AliyunOSSProvider = class {
|
|
|
101
100
|
async upload(fileInfo, filePath) {
|
|
102
101
|
this.ensureInitialized();
|
|
103
102
|
const startTime = Date.now();
|
|
104
|
-
logger.info(
|
|
103
|
+
logger.info("\u{1F4E4} [AliyunOSSProvider] \u5F00\u59CB\u4E0A\u4F20\u6587\u4EF6\u5230OSS: " + filePath);
|
|
105
104
|
try {
|
|
106
105
|
const buffer = Buffer.from(await fileInfo.file.arrayBuffer());
|
|
107
106
|
const options = {
|
|
@@ -125,18 +124,18 @@ var AliyunOSSProvider = class {
|
|
|
125
124
|
let result;
|
|
126
125
|
if (fileInfo.file.size > 100 * 1024 * 1024) {
|
|
127
126
|
logger.info(
|
|
128
|
-
|
|
127
|
+
"\u{1F4E6} [AliyunOSSProvider] \u4F7F\u7528\u5206\u7247\u4E0A\u4F20\u5927\u6587\u4EF6: " + filePath + ", \u5927\u5C0F: " + fileInfo.file.size
|
|
129
128
|
);
|
|
130
129
|
result = await this.multipartUpload(filePath, buffer, options);
|
|
131
130
|
} else {
|
|
132
131
|
logger.info(
|
|
133
|
-
|
|
132
|
+
"\u{1F4E4} [AliyunOSSProvider] \u4F7F\u7528\u666E\u901A\u4E0A\u4F20: " + filePath + ", \u5927\u5C0F: " + fileInfo.file.size
|
|
134
133
|
);
|
|
135
134
|
result = await this.client?.put(filePath, buffer, options);
|
|
136
135
|
}
|
|
137
136
|
const accessUrl = this.generateAccessUrl(filePath);
|
|
138
137
|
const uploadTime = Date.now() - startTime;
|
|
139
|
-
logger.info(
|
|
138
|
+
logger.info("\u2705 [AliyunOSSProvider] \u6587\u4EF6\u4E0A\u4F20\u5B8C\u6210: " + filePath + ", \u8017\u65F6: " + uploadTime + "ms");
|
|
140
139
|
return {
|
|
141
140
|
success: true,
|
|
142
141
|
path: filePath,
|
|
@@ -150,7 +149,7 @@ var AliyunOSSProvider = class {
|
|
|
150
149
|
}
|
|
151
150
|
};
|
|
152
151
|
} catch (error) {
|
|
153
|
-
logger.error(
|
|
152
|
+
logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u4E0A\u4F20\u5931\u8D25: " + filePath + ":", error);
|
|
154
153
|
return {
|
|
155
154
|
success: false,
|
|
156
155
|
error: this.formatOSSError(error)
|
|
@@ -162,18 +161,18 @@ var AliyunOSSProvider = class {
|
|
|
162
161
|
*/
|
|
163
162
|
async download(filePath) {
|
|
164
163
|
this.ensureInitialized();
|
|
165
|
-
logger.info(
|
|
164
|
+
logger.info("\u{1F4E5} [AliyunOSSProvider] \u5F00\u59CB\u4ECEOSS\u4E0B\u8F7D\u6587\u4EF6: " + filePath);
|
|
166
165
|
try {
|
|
167
166
|
const result = await this.client?.get(filePath);
|
|
168
167
|
if (!result.content || !Buffer.isBuffer(result.content)) {
|
|
169
168
|
throw new chunkKH6RQ4J5_js.StorageProviderError("\u4E0B\u8F7D\u7684\u6587\u4EF6\u5185\u5BB9\u683C\u5F0F\u9519\u8BEF");
|
|
170
169
|
}
|
|
171
170
|
logger.info(
|
|
172
|
-
|
|
171
|
+
"\u2705 [AliyunOSSProvider] \u6587\u4EF6\u4E0B\u8F7D\u5B8C\u6210: " + filePath + ", \u5927\u5C0F: " + result.content.length
|
|
173
172
|
);
|
|
174
173
|
return result.content;
|
|
175
174
|
} catch (error) {
|
|
176
|
-
logger.error(
|
|
175
|
+
logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25: " + filePath + ":", error);
|
|
177
176
|
if (this.isOSSError(error) && error.code === "NoSuchKey") {
|
|
178
177
|
throw new chunkKH6RQ4J5_js.StorageProviderError(`\u6587\u4EF6\u4E0D\u5B58\u5728`);
|
|
179
178
|
}
|
|
@@ -185,10 +184,10 @@ var AliyunOSSProvider = class {
|
|
|
185
184
|
*/
|
|
186
185
|
async delete(filePath) {
|
|
187
186
|
this.ensureInitialized();
|
|
188
|
-
logger.info(
|
|
187
|
+
logger.info("\u{1F5D1}\uFE0F [AliyunOSSProvider] \u5F00\u59CB\u4ECEOSS\u5220\u9664\u6587\u4EF6: " + filePath);
|
|
189
188
|
try {
|
|
190
189
|
const result = await this.client?.delete(filePath);
|
|
191
|
-
logger.info(
|
|
190
|
+
logger.info("\u2705 [AliyunOSSProvider] \u6587\u4EF6\u5220\u9664\u5B8C\u6210: " + filePath);
|
|
192
191
|
return {
|
|
193
192
|
success: true,
|
|
194
193
|
data: {
|
|
@@ -197,9 +196,9 @@ var AliyunOSSProvider = class {
|
|
|
197
196
|
}
|
|
198
197
|
};
|
|
199
198
|
} catch (error) {
|
|
200
|
-
logger.error(
|
|
199
|
+
logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u5220\u9664\u5931\u8D25: " + filePath + ":", error);
|
|
201
200
|
if (this.isOSSError(error) && error.code === "NoSuchKey") {
|
|
202
|
-
logger.warn(
|
|
201
|
+
logger.warn("\u26A0\uFE0F [AliyunOSSProvider] \u6587\u4EF6\u4E0D\u5B58\u5728: " + filePath);
|
|
203
202
|
return {
|
|
204
203
|
success: true,
|
|
205
204
|
data: { reason: "file_not_exists" }
|
|
@@ -260,7 +259,7 @@ var AliyunOSSProvider = class {
|
|
|
260
259
|
return signedUrl || "";
|
|
261
260
|
}
|
|
262
261
|
} catch (error) {
|
|
263
|
-
logger.error(
|
|
262
|
+
logger.error("\u274C [AliyunOSSProvider] \u751F\u6210\u8BBF\u95EEURL\u5931\u8D25: " + filePath + ":", error);
|
|
264
263
|
throw new chunkKH6RQ4J5_js.StorageProviderError(`\u751F\u6210\u8BBF\u95EEURL\u5931\u8D25`);
|
|
265
264
|
}
|
|
266
265
|
}
|
|
@@ -277,7 +276,7 @@ var AliyunOSSProvider = class {
|
|
|
277
276
|
});
|
|
278
277
|
return signedUrl || "";
|
|
279
278
|
} catch (error) {
|
|
280
|
-
logger.error(
|
|
279
|
+
logger.error("\u274C [AliyunOSSProvider] \u751F\u6210\u4E0A\u4F20URL\u5931\u8D25: " + filePath + ":", error);
|
|
281
280
|
throw new chunkKH6RQ4J5_js.StorageProviderError(`\u751F\u6210\u4E0A\u4F20URL\u5931\u8D25`);
|
|
282
281
|
}
|
|
283
282
|
}
|
|
@@ -293,7 +292,7 @@ var AliyunOSSProvider = class {
|
|
|
293
292
|
if (this.isOSSError(error) && error.code === "NoSuchKey") {
|
|
294
293
|
return false;
|
|
295
294
|
}
|
|
296
|
-
logger.warn(
|
|
295
|
+
logger.warn("\u26A0\uFE0F [AliyunOSSProvider] \u68C0\u67E5\u6587\u4EF6\u5B58\u5728\u6027\u65F6\u51FA\u9519: " + filePath + ":", error);
|
|
297
296
|
return false;
|
|
298
297
|
}
|
|
299
298
|
}
|
|
@@ -324,7 +323,7 @@ var AliyunOSSProvider = class {
|
|
|
324
323
|
nextMarker: result.nextMarker
|
|
325
324
|
};
|
|
326
325
|
} catch (error) {
|
|
327
|
-
logger.error(
|
|
326
|
+
logger.error("\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: " + prefix + ":", error);
|
|
328
327
|
throw new chunkKH6RQ4J5_js.StorageProviderError(`\u5217\u51FA\u6587\u4EF6\u5931\u8D25`);
|
|
329
328
|
}
|
|
330
329
|
}
|
|
@@ -341,7 +340,7 @@ var AliyunOSSProvider = class {
|
|
|
341
340
|
const result = await this.client?.list(options, {});
|
|
342
341
|
return result.objects?.map((obj) => obj.name) || [];
|
|
343
342
|
} catch (error) {
|
|
344
|
-
logger.error(
|
|
343
|
+
logger.error("\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: " + prefix + ":", error);
|
|
345
344
|
return [];
|
|
346
345
|
}
|
|
347
346
|
}
|
|
@@ -371,35 +370,6 @@ var AliyunOSSProvider = class {
|
|
|
371
370
|
* 测试连接
|
|
372
371
|
*/
|
|
373
372
|
async testConnection() {
|
|
374
|
-
try {
|
|
375
|
-
await this.client?.list({
|
|
376
|
-
"max-keys": "1"
|
|
377
|
-
}, {});
|
|
378
|
-
logger.info(`\u2705 [AliyunOSSProvider] OSS\u8FDE\u63A5\u6D4B\u8BD5\u6210\u529F`);
|
|
379
|
-
} catch (error) {
|
|
380
|
-
logger.error("\u274C [AliyunOSSProvider] OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25\uFF0C\u539F\u59CB\u9519\u8BEF:", error);
|
|
381
|
-
let errorCode;
|
|
382
|
-
let errorMessage = "\u672A\u77E5\u9519\u8BEF";
|
|
383
|
-
try {
|
|
384
|
-
errorCode = error?.code;
|
|
385
|
-
errorMessage = error?.message || "\u672A\u77E5\u9519\u8BEF";
|
|
386
|
-
} catch (accessError) {
|
|
387
|
-
logger.warn("\u65E0\u6CD5\u8BBF\u95EE\u9519\u8BEF\u5BF9\u8C61\u7684\u5C5E\u6027:", accessError);
|
|
388
|
-
errorMessage = "\u65E0\u6CD5\u89E3\u6790\u9519\u8BEF\u4FE1\u606F";
|
|
389
|
-
}
|
|
390
|
-
if (typeof errorCode === "string") {
|
|
391
|
-
if (errorCode === "NoSuchBucket") {
|
|
392
|
-
throw new chunkKH6RQ4J5_js.StorageProviderError(`\u5B58\u50A8\u6876\u4E0D\u5B58\u5728`);
|
|
393
|
-
} else if (errorCode === "InvalidAccessKeyId") {
|
|
394
|
-
throw new chunkKH6RQ4J5_js.StorageProviderError("Access Key ID \u65E0\u6548");
|
|
395
|
-
} else if (errorCode === "SignatureDoesNotMatch") {
|
|
396
|
-
throw new chunkKH6RQ4J5_js.StorageProviderError("Access Key Secret \u65E0\u6548");
|
|
397
|
-
} else {
|
|
398
|
-
throw new chunkKH6RQ4J5_js.StorageProviderError(`OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25`);
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
throw new chunkKH6RQ4J5_js.StorageProviderError(`OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25`);
|
|
402
|
-
}
|
|
403
373
|
}
|
|
404
374
|
/**
|
|
405
375
|
* 分片上传大文件
|
|
@@ -413,7 +383,7 @@ var AliyunOSSProvider = class {
|
|
|
413
383
|
// 并发数
|
|
414
384
|
progress: (p) => {
|
|
415
385
|
if (p % 0.1 < 0.01) {
|
|
416
|
-
logger.info(
|
|
386
|
+
logger.info("\u{1F4E6} [AliyunOSSProvider] \u4E0A\u4F20\u8FDB\u5EA6: " + (p * 100).toFixed(1) + "%");
|
|
417
387
|
}
|
|
418
388
|
},
|
|
419
389
|
meta: options.meta,
|
|
@@ -437,13 +407,13 @@ var AliyunOSSProvider = class {
|
|
|
437
407
|
const normalizedPath = filePath.startsWith("/") ? filePath.substring(1) : filePath;
|
|
438
408
|
if (this.config.customDomain) {
|
|
439
409
|
const protocol = this.config.secure !== false ? "https" : "http";
|
|
440
|
-
const url =
|
|
441
|
-
logger.info(
|
|
410
|
+
const url = protocol + "://" + this.config.customDomain + "/" + normalizedPath;
|
|
411
|
+
logger.info("\u{1F517} [AliyunOSSProvider] \u4F7F\u7528\u81EA\u5B9A\u4E49\u57DF\u540D: " + url);
|
|
442
412
|
return url;
|
|
443
413
|
} else {
|
|
444
414
|
const protocol = this.config.secure !== false ? "https" : "http";
|
|
445
|
-
const url =
|
|
446
|
-
logger.info(
|
|
415
|
+
const url = protocol + "://" + this.config.bucket + "." + this.config.region + ".aliyuncs.com/" + normalizedPath;
|
|
416
|
+
logger.info("\u{1F517} [AliyunOSSProvider] \u4F7F\u7528\u9ED8\u8BA4OSS\u57DF\u540D: " + url);
|
|
447
417
|
return url;
|
|
448
418
|
}
|
|
449
419
|
}
|
|
@@ -474,7 +444,7 @@ var AliyunOSSProvider = class {
|
|
|
474
444
|
async uploadStream(readableStream, filePath, contentType, contentLength) {
|
|
475
445
|
this.ensureInitialized();
|
|
476
446
|
const startTime = Date.now();
|
|
477
|
-
logger.info(
|
|
447
|
+
logger.info("\u{1F4E4} [AliyunOSSProvider] \u5F00\u59CB\u6D41\u5F0F\u4E0A\u4F20\u6587\u4EF6\u5230OSS: " + filePath);
|
|
478
448
|
try {
|
|
479
449
|
const options = {
|
|
480
450
|
timeout: 3e5,
|
|
@@ -489,7 +459,7 @@ var AliyunOSSProvider = class {
|
|
|
489
459
|
const result = await this.client?.putStream(filePath, readableStream, options);
|
|
490
460
|
const accessUrl = this.generateAccessUrl(filePath);
|
|
491
461
|
const uploadTime = Date.now() - startTime;
|
|
492
|
-
logger.info(
|
|
462
|
+
logger.info("\u2705 [AliyunOSSProvider] \u6D41\u5F0F\u4E0A\u4F20\u5B8C\u6210: " + filePath + ", \u8017\u65F6: " + uploadTime + "ms");
|
|
493
463
|
return {
|
|
494
464
|
success: true,
|
|
495
465
|
path: filePath,
|
|
@@ -503,7 +473,7 @@ var AliyunOSSProvider = class {
|
|
|
503
473
|
}
|
|
504
474
|
};
|
|
505
475
|
} catch (error) {
|
|
506
|
-
logger.error(
|
|
476
|
+
logger.error("\u274C [AliyunOSSProvider] \u6D41\u5F0F\u4E0A\u4F20\u5931\u8D25: " + filePath + ":", error);
|
|
507
477
|
return {
|
|
508
478
|
success: false,
|
|
509
479
|
error: this.formatOSSError(error)
|
|
@@ -515,13 +485,13 @@ var AliyunOSSProvider = class {
|
|
|
515
485
|
*/
|
|
516
486
|
async batchDelete(filePaths) {
|
|
517
487
|
this.ensureInitialized();
|
|
518
|
-
logger.info(
|
|
488
|
+
logger.info("\u{1F5D1}\uFE0F [AliyunOSSProvider] \u5F00\u59CB\u6279\u91CF\u5220\u9664\u6587\u4EF6\uFF0C\u6570\u91CF: " + filePaths.length);
|
|
519
489
|
try {
|
|
520
490
|
const result = await this.client?.deleteMulti(filePaths, {
|
|
521
491
|
quiet: false
|
|
522
492
|
// 返回删除结果
|
|
523
493
|
});
|
|
524
|
-
logger.info(
|
|
494
|
+
logger.info("\u2705 [AliyunOSSProvider] \u6279\u91CF\u5220\u9664\u5B8C\u6210\uFF0C\u6210\u529F: " + (result.deleted?.length || 0));
|
|
525
495
|
return {
|
|
526
496
|
success: true,
|
|
527
497
|
data: {
|
|
@@ -542,10 +512,10 @@ var AliyunOSSProvider = class {
|
|
|
542
512
|
*/
|
|
543
513
|
async copy(sourcePath, targetPath) {
|
|
544
514
|
this.ensureInitialized();
|
|
545
|
-
logger.info(
|
|
515
|
+
logger.info("\u{1F4CB} [AliyunOSSProvider] \u5F00\u59CB\u590D\u5236\u6587\u4EF6: " + sourcePath + " -> " + targetPath);
|
|
546
516
|
try {
|
|
547
517
|
const result = await this.client?.copy(targetPath, sourcePath);
|
|
548
|
-
logger.info(
|
|
518
|
+
logger.info("\u2705 [AliyunOSSProvider] \u6587\u4EF6\u590D\u5236\u5B8C\u6210: " + sourcePath + " -> " + targetPath);
|
|
549
519
|
return {
|
|
550
520
|
success: true,
|
|
551
521
|
data: {
|
|
@@ -555,7 +525,7 @@ var AliyunOSSProvider = class {
|
|
|
555
525
|
}
|
|
556
526
|
};
|
|
557
527
|
} catch (error) {
|
|
558
|
-
logger.error(
|
|
528
|
+
logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u590D\u5236\u5931\u8D25: " + sourcePath + " -> " + targetPath + ":", error);
|
|
559
529
|
return {
|
|
560
530
|
success: false,
|
|
561
531
|
error: this.formatOSSError(error)
|
|
@@ -578,5 +548,5 @@ var AliyunOSSProvider = class {
|
|
|
578
548
|
};
|
|
579
549
|
|
|
580
550
|
exports.AliyunOSSProvider = AliyunOSSProvider;
|
|
581
|
-
//# sourceMappingURL=chunk-
|
|
582
|
-
//# sourceMappingURL=chunk-
|
|
551
|
+
//# sourceMappingURL=chunk-HJ6MH7J7.js.map
|
|
552
|
+
//# sourceMappingURL=chunk-HJ6MH7J7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/universalFile/server/providers/AliyunOSSProvider.ts"],"names":["createLogger","StorageProviderError","OSS"],"mappings":"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","file":"chunk-HJ6MH7J7.js","sourcesContent":["/**\n * 阿里云OSS存储提供者实现\n */\n\nimport OSS from 'ali-oss';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n AliyunOSSConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('AliyunOSSProvider');\n\n/**\n * 阿里云OSS存储提供者\n */\nexport class AliyunOSSProvider implements IStorageProvider {\n readonly type: StorageType = 'aliyun-oss';\n\n private config: AliyunOSSConfig | null = null;\n private client: OSS | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n return this.reinitialize(config);\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitialize(config: StorageConfig): Promise<void> {\n logger.info('🔄 [AliyunOSSProvider] 重新初始化OSS客户端', config);\n if (config.type !== 'aliyun-oss') {\n throw new StorageProviderError('配置类型不匹配:期望 aliyun-oss');\n }\n\n const newConfig = config as AliyunOSSConfig;\n\n // 检查配置是否发生变化\n const configChanged =\n !this.config ||\n this.config.region !== newConfig.region ||\n this.config.bucket !== newConfig.bucket ||\n this.config.accessKeyId !== newConfig.accessKeyId ||\n this.config.accessKeySecret !== newConfig.accessKeySecret ||\n this.config.customDomain !== newConfig.customDomain ||\n this.config.secure !== newConfig.secure ||\n this.config.internal !== newConfig.internal;\n\n if (configChanged) {\n logger.info('🔄 [AliyunOSSProvider] 检测到配置变化,重新初始化OSS客户端');\n logger.info(\n '☁️ [AliyunOSSProvider] 新配置: bucket=' + (newConfig.bucket) + ', region=' + (newConfig.region)\n );\n } else if (this.isInitialized) {\n logger.info('ℹ️ [AliyunOSSProvider] 配置未变化,跳过重新初始化');\n return;\n }\n\n this.config = newConfig;\n\n logger.info('☁️ [AliyunOSSProvider] ' + (this.isInitialized ? '重新' : '') + '初始化阿里云OSS');\n logger.info('☁️ [AliyunOSSProvider] ' + (this.config ? JSON.stringify(this.config) : ''));\n\n try {\n // 验证必需的配置项\n this.validateConfig();\n\n // 确保配置值是有效的字符串\n if (!this.config.region || typeof this.config.region !== 'string') {\n throw new Error('OSS region 必须是有效的字符串');\n }\n if (!this.config.bucket || typeof this.config.bucket !== 'string') {\n throw new Error('OSS bucket 必须是有效的字符串');\n }\n if (!this.config.accessKeyId || typeof this.config.accessKeyId !== 'string') {\n throw new Error('OSS accessKeyId 必须是有效的字符串');\n }\n if (!this.config.accessKeySecret || typeof this.config.accessKeySecret !== 'string') {\n throw new Error('OSS accessKeySecret 必须是有效的字符串');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] 创建OSS客户端配置:`, {\n region: this.config.region,\n bucket: this.config.bucket,\n hasAccessKeyId: !!this.config.accessKeyId,\n hasAccessKeySecret: !!this.config.accessKeySecret,\n secure: this.config.secure !== false,\n internal: this.config.internal || false,\n cname: !!this.config.customDomain,\n endpoint: this.config.customDomain || '默认端点',\n });\n\n // 创建OSS客户端\n this.client = new OSS({\n region: this.config.region,\n bucket: this.config.bucket,\n accessKeyId: this.config.accessKeyId,\n accessKeySecret: this.config.accessKeySecret,\n secure: this.config.secure !== false, // 默认使用HTTPS\n internal: this.config.internal || false, // 默认使用公网\n timeout: 300000, // 5分钟超时\n cname: !!this.config.customDomain, // 是否使用自定义域名\n endpoint: this.config.customDomain || undefined,\n });\n\n if (!this.client) {\n throw new Error('OSS客户端创建失败');\n }\n logger.info(`☁️ [AliyunOSSProvider] OSS客户端创建成功`);\n this.isInitialized = true;\n logger.info('✅ [AliyunOSSProvider] 阿里云OSS' + (configChanged ? '重新' : '') + '初始化完成');\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 阿里云OSS初始化失败:', error);\n throw new StorageProviderError(`阿里云OSS初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [AliyunOSSProvider] 开始上传文件到OSS: ' + (filePath));\n\n try {\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 构建上传选项\n const options: any = {\n headers: {\n 'Content-Type': fileInfo.file.type || 'application/octet-stream',\n 'Content-Length': fileInfo.file.size.toString(),\n },\n meta: {\n uid: 0, // 必需字段\n pid: 0, // 必需字段\n originalName: encodeURIComponent(fileInfo.file.name),\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId || '',\n uploadTime: new Date().toISOString(),\n // 对元数据进行编码处理,避免中文字符问题\n ...this.encodeMetadata(fileInfo.metadata || {}),\n },\n };\n\n // 根据文件大小选择上传方式\n let result: any;\n\n if (fileInfo.file.size > 100 * 1024 * 1024) {\n // 大于100MB使用分片上传\n logger.info(\n '📦 [AliyunOSSProvider] 使用分片上传大文件: ' + (filePath) + ', 大小: ' + (fileInfo.file.size)\n );\n result = await this.multipartUpload(filePath, buffer, options);\n } else {\n logger.info(\n '📤 [AliyunOSSProvider] 使用普通上传: ' + (filePath) + ', 大小: ' + (fileInfo.file.size)\n );\n result = await this.client?.put(filePath, buffer, options);\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [AliyunOSSProvider] 文件上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: fileInfo.file.size,\n data: {\n etag: result.data ? JSON.stringify(result.data) : '',\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(filePath: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info('📥 [AliyunOSSProvider] 开始从OSS下载文件: ' + (filePath));\n\n try {\n const result = await this.client?.get(filePath) as any;\n\n if (!result.content || !Buffer.isBuffer(result.content)) {\n throw new StorageProviderError('下载的文件内容格式错误');\n }\n\n logger.info(\n '✅ [AliyunOSSProvider] 文件下载完成: ' + (filePath) + ', 大小: ' + (result.content.length)\n );\n\n return result.content;\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件下载失败: ' + (filePath) + ':', error);\n\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n throw new StorageProviderError(`文件不存在`);\n }\n\n throw new StorageProviderError(`文件下载失败`);\n }\n }\n\n /**\n * 删除文件\n */\n async delete(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [AliyunOSSProvider] 开始从OSS删除文件: ' + (filePath));\n\n try {\n const result = await this.client?.delete(filePath) as any;\n\n logger.info('✅ [AliyunOSSProvider] 文件删除完成: ' + (filePath));\n\n return {\n success: true,\n data: {\n requestId: result?.res?.rt || 0,\n deletedPath: filePath,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件删除失败: ' + (filePath) + ':', error);\n\n // OSS中删除不存在的文件不会报错,但我们统一处理\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n logger.warn('⚠️ [AliyunOSSProvider] 文件不存在: ' + (filePath));\n return {\n success: true,\n data: { reason: 'file_not_exists' },\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const result = await this.client?.head(filePath) as any;\n\n return {\n success: true,\n size: parseInt(String(result.meta['content-length'] || '0')),\n data: {\n etag: result.meta.etag || '',\n lastModified: result.meta['last-modified'] || '',\n contentType: result.meta['content-type'],\n meta: result.meta,\n size: parseInt(String(result.meta['content-length'] || '0')),\n },\n };\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n // 对于图片文件,直接返回公开URL,避免CORS问题\n // 对于其他文件,使用签名URL\n const isImage = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(filePath);\n\n if (isImage) {\n // 图片文件使用公开URL\n return this.generateAccessUrl(filePath);\n } else {\n // 其他文件使用签名URL\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'GET',\n });\n\n return signedUrl || '' ;\n }\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 生成访问URL失败: ' + (filePath) + ':', error);\n throw new StorageProviderError(`生成访问URL失败`);\n }\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'PUT',\n });\n\n return signedUrl || '' ;\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 生成上传URL失败: ' + (filePath) + ':', error);\n throw new StorageProviderError(`生成上传URL失败`);\n }\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(filePath: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n await this.client?.head(filePath);\n return true;\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return false;\n }\n // 其他错误也视为文件不存在\n logger.warn('⚠️ [AliyunOSSProvider] 检查文件存在性时出错: ' + (filePath) + ':', error);\n return false;\n }\n }\n\n /**\n * 列出文件(详细信息)\n */\n async listFiles(prefix: string, delimiter: string = '/', maxKeys: number = 1000): Promise<{\n files: Array<{\n name: string;\n url: string;\n size: number;\n lastModified: string;\n etag: string;\n type: string;\n }>;\n folders: string[];\n nextMarker?: string;\n }> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n delimiter,\n 'max-keys': String(maxKeys),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n const files = (result.objects || []).map((obj: any) => ({\n name: obj.name,\n url: this.generateAccessUrl(obj.name),\n size: obj.size,\n lastModified: obj.lastModified,\n etag: obj.etag,\n type: 'file',\n }));\n\n const folders = result.prefixes || [];\n\n return {\n files,\n folders,\n nextMarker: result.nextMarker,\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 列出文件失败: ' + (prefix) + ':', error);\n throw new StorageProviderError(`列出文件失败`);\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n 'max-keys': String(maxKeys || 1000),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n return result.objects?.map((obj: any) => obj.name) || [];\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 列出文件失败: ' + (prefix) + ':', error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.client || !this.config) {\n throw new StorageProviderError('OSS存储提供者未初始化');\n }\n }\n\n /**\n * 验证配置\n */\n private validateConfig(): void {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n const required = ['region', 'bucket', 'accessKeyId', 'accessKeySecret'];\n const missing = required.filter((key) => !this.config![key as keyof AliyunOSSConfig]);\n\n if (missing.length > 0) {\n throw new StorageProviderError(`OSS配置缺少必需项`);\n }\n }\n\n /**\n * 测试连接\n */\n private async testConnection(): Promise<void> {\n \n }\n\n /**\n * 分片上传大文件\n */\n private async multipartUpload(filePath: string, buffer: Buffer, options: any): Promise<any> {\n logger.info(`📦 [AliyunOSSProvider] 使用多分片上传`);\n\n // 使用OSS的multipartUpload方法\n const result = await this.client?.multipartUpload(filePath, buffer, {\n partSize: 10 * 1024 * 1024, // 10MB per chunk\n parallel: 4, // 并发数\n progress: (p: number) => {\n if (p % 0.1 < 0.01) {\n // 每10%显示一次进度\n logger.info('📦 [AliyunOSSProvider] 上传进度: ' + ((p * 100).toFixed(1)) + '%');\n }\n },\n meta: options.meta,\n headers: options.headers,\n });\n\n return {\n name: result?.name || '',\n url: result?.name || '', // OSS返回的是object名称\n data: result?.data || {},\n res: result?.res || {},\n };\n }\n\n /**\n * 生成公开访问URL\n */\n private generateAccessUrl(filePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n // 确保文件路径不以斜杠开头\n const normalizedPath = filePath.startsWith('/') ? filePath.substring(1) : filePath;\n\n if (this.config.customDomain) {\n // 使用自定义域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = (protocol) + '://' + (this.config.customDomain) + '/' + (normalizedPath);\n logger.info('🔗 [AliyunOSSProvider] 使用自定义域名: ' + (url));\n return url;\n } else {\n // 使用默认OSS域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = (protocol) + '://' + (this.config.bucket) + '.' + (this.config.region) + '.aliyuncs.com/' + (normalizedPath);\n logger.info('🔗 [AliyunOSSProvider] 使用默认OSS域名: ' + (url));\n return url;\n }\n }\n\n /**\n * 判断是否为OSS错误\n */\n private isOSSError(\n error: any\n ): error is { code: string; name: string; message: string; requestId?: string } {\n // 安全地检查错误属性,避免生产环境中的压缩问题\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n return typeof error.code === 'string' &&\n typeof (error.name || '') === 'string' &&\n typeof (error.message || '') === 'string';\n }\n\n /**\n * 格式化OSS错误信息\n */\n private formatOSSError(error: any): string {\n // if (this.isOSSError(error)) {\n // const requestId = error.requestId ? ' (RequestId: ' + (error.requestId) + ')' : '';\n // return (error.code) + ': ' + (error.message) + (requestId);\n // }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return '未知错误';\n }\n\n /**\n * 流式上传(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string,\n contentType?: string,\n contentLength?: number\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [AliyunOSSProvider] 开始流式上传文件到OSS: ' + (filePath));\n\n try {\n const options: any = {\n timeout: 300000,\n mime: contentType || 'application/octet-stream',\n meta: { uid: 0, pid: 0 },\n callback: { url: '', body: '' },\n headers: {} as any,\n };\n\n if (contentLength) {\n options.headers['Content-Length'] = contentLength.toString();\n }\n\n const result = await this.client?.putStream(filePath, readableStream, options) as any;\n\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [AliyunOSSProvider] 流式上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: contentLength,\n data: {\n name: result.name,\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 流式上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDelete(filePaths: string[]): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [AliyunOSSProvider] 开始批量删除文件,数量: ' + (filePaths.length));\n\n try {\n const result = await this.client?.deleteMulti(filePaths, {\n quiet: false, // 返回删除结果\n }) as any;\n\n logger.info('✅ [AliyunOSSProvider] 批量删除完成,成功: ' + (result.deleted?.length || 0));\n\n return {\n success: true,\n data: {\n deleted: result.deleted,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 批量删除失败:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 复制文件\n */\n async copy(sourcePath: string, targetPath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('📋 [AliyunOSSProvider] 开始复制文件: ' + (sourcePath) + ' -> ' + (targetPath));\n\n try {\n const result = await this.client?.copy(targetPath, sourcePath) as any;\n\n logger.info('✅ [AliyunOSSProvider] 文件复制完成: ' + (sourcePath) + ' -> ' + (targetPath));\n\n return {\n success: true,\n data: {\n etag: result.data?.etag,\n lastModified: result.data?.lastModified,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件复制失败: ' + (sourcePath) + ' -> ' + (targetPath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 编码元数据,避免中文字符在HTTP头部中的问题\n */\n private encodeMetadata(metadata: Record<string, any>): Record<string, string> {\n const encoded: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== null && value !== undefined) {\n // 将值转换为字符串并进行URL编码\n const stringValue = String(value);\n encoded[key] = encodeURIComponent(stringValue);\n }\n }\n\n return encoded;\n }\n}\n\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkXJ7ZAGC5_js = require('./chunk-XJ7ZAGC5.js');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
function useStorage(storage, key, defaultValue) {
|
|
7
|
+
const [value, setValue] = react.useState(defaultValue);
|
|
8
|
+
const [loading, setLoading] = react.useState(true);
|
|
9
|
+
react.useEffect(() => {
|
|
10
|
+
const loadValue = async () => {
|
|
11
|
+
try {
|
|
12
|
+
const stored = await storage.getItem(key);
|
|
13
|
+
if (stored !== null) {
|
|
14
|
+
setValue(JSON.parse(stored));
|
|
15
|
+
}
|
|
16
|
+
} catch (error) {
|
|
17
|
+
console.error('Error reading storage key "' + key + '":', error);
|
|
18
|
+
} finally {
|
|
19
|
+
setLoading(false);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
void loadValue();
|
|
23
|
+
}, [storage, key]);
|
|
24
|
+
const updateValue = react.useCallback(
|
|
25
|
+
async (newValue) => {
|
|
26
|
+
try {
|
|
27
|
+
setValue(newValue);
|
|
28
|
+
await storage.setItem(key, JSON.stringify(newValue));
|
|
29
|
+
if ("dispatchChange" in storage && typeof storage.dispatchChange === "function") {
|
|
30
|
+
storage.dispatchChange(key, JSON.stringify(newValue));
|
|
31
|
+
}
|
|
32
|
+
} catch (error) {
|
|
33
|
+
console.error('Error setting storage key "' + key + '":', error);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
[storage, key]
|
|
37
|
+
);
|
|
38
|
+
const removeValue = react.useCallback(async () => {
|
|
39
|
+
try {
|
|
40
|
+
setValue(defaultValue);
|
|
41
|
+
await storage.removeItem(key);
|
|
42
|
+
if ("dispatchChange" in storage && typeof storage.dispatchChange === "function") {
|
|
43
|
+
storage.dispatchChange(key, null);
|
|
44
|
+
}
|
|
45
|
+
} catch (error) {
|
|
46
|
+
console.error('Error removing storage key "' + key + '":', error);
|
|
47
|
+
}
|
|
48
|
+
}, [storage, key, defaultValue]);
|
|
49
|
+
react.useEffect(() => {
|
|
50
|
+
if (!storage.addChangeListener) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const cleanup = storage.addChangeListener((changedKey, newValue) => {
|
|
54
|
+
if (changedKey === key) {
|
|
55
|
+
try {
|
|
56
|
+
if (newValue === null) {
|
|
57
|
+
setValue(defaultValue);
|
|
58
|
+
} else {
|
|
59
|
+
setValue(JSON.parse(newValue));
|
|
60
|
+
}
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.error("Error parsing storage change event:", error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return cleanup;
|
|
67
|
+
}, [storage, key, defaultValue]);
|
|
68
|
+
return [value, updateValue, removeValue, loading];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// src/storage/hooks/useLocalStorage.ts
|
|
72
|
+
var webStorage = new chunkXJ7ZAGC5_js.WebStorageAdapter();
|
|
73
|
+
function useLocalStorage(key, defaultValue) {
|
|
74
|
+
return useStorage(webStorage, key, defaultValue);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
exports.useLocalStorage = useLocalStorage;
|
|
78
|
+
exports.useStorage = useStorage;
|
|
79
|
+
//# sourceMappingURL=chunk-KO73EBUT.js.map
|
|
80
|
+
//# sourceMappingURL=chunk-KO73EBUT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/hooks/useStorage.ts","../src/storage/hooks/useLocalStorage.ts"],"names":["useState","useEffect","useCallback","WebStorageAdapter"],"mappings":"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","file":"chunk-KO73EBUT.js","sourcesContent":["/**\n * 通用存储 Hook\n * 支持多平台:Web、React Native、小程序\n *\n * 优点:\n * 1. 异步读取,不阻塞渲染\n * 2. 统一的错误处理\n * 3. 类型安全\n * 4. 跨平台支持\n * 5. 自动同步(支持的平台)\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { StorageAdapter } from '../types';\n\nexport function useStorage<T>(\n storage: StorageAdapter,\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n const [value, setValue] = useState<T>(defaultValue);\n const [loading, setLoading] = useState(true);\n\n // 初始化时从存储读取\n useEffect(() => {\n const loadValue = async () => {\n try {\n const stored = await storage.getItem(key);\n if (stored !== null) {\n setValue(JSON.parse(stored));\n }\n } catch (error) {\n console.error('Error reading storage key \"' + (key) + '\":', error);\n } finally {\n setLoading(false);\n }\n };\n\n void loadValue();\n }, [storage, key]);\n\n // 更新值并同步到存储\n const updateValue = useCallback(\n async (newValue: T) => {\n try {\n setValue(newValue);\n await storage.setItem(key, JSON.stringify(newValue));\n\n // 如果是 Web 适配器,触发自定义事件\n if ('dispatchChange' in storage && typeof storage.dispatchChange === 'function') {\n (storage as any).dispatchChange(key, JSON.stringify(newValue));\n }\n } catch (error) {\n console.error('Error setting storage key \"' + (key) + '\":', error);\n }\n },\n [storage, key]\n );\n\n // 删除值\n const removeValue = useCallback(async () => {\n try {\n setValue(defaultValue);\n await storage.removeItem(key);\n\n // 如果是 Web 适配器,触发自定义事件\n if ('dispatchChange' in storage && typeof storage.dispatchChange === 'function') {\n (storage as any).dispatchChange(key, null);\n }\n } catch (error) {\n console.error('Error removing storage key \"' + (key) + '\":', error);\n }\n }, [storage, key, defaultValue]);\n\n // 监听存储变化\n useEffect(() => {\n if (!storage.addChangeListener) {\n return;\n }\n\n const cleanup = storage.addChangeListener((changedKey: string, newValue: string | null) => {\n if (changedKey === key) {\n try {\n if (newValue === null) {\n setValue(defaultValue);\n } else {\n setValue(JSON.parse(newValue));\n }\n } catch (error) {\n console.error('Error parsing storage change event:', error);\n }\n }\n });\n\n return cleanup;\n }, [storage, key, defaultValue]);\n\n return [value, updateValue, removeValue, loading];\n}\n\n","/**\n * Web 平台 localStorage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { WebStorageAdapter } from '../adapters/web-adapter';\n\n// 创建单例适配器\nconst webStorage = new WebStorageAdapter();\n\n/**\n * Web 平台的 localStorage Hook\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n */\nexport function useLocalStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(webStorage, key, defaultValue);\n}\n\n"]}
|
|
@@ -94,11 +94,11 @@ var BaseApiClient = class {
|
|
|
94
94
|
...config.headers || {}
|
|
95
95
|
};
|
|
96
96
|
if (this.token) {
|
|
97
|
-
headers["Authorization"] =
|
|
97
|
+
headers["Authorization"] = "Bearer " + this.token;
|
|
98
98
|
}
|
|
99
99
|
const response = await this.request.request({
|
|
100
100
|
...config,
|
|
101
|
-
url:
|
|
101
|
+
url: this.baseUrl + config.url,
|
|
102
102
|
headers
|
|
103
103
|
});
|
|
104
104
|
return response;
|
|
@@ -208,5 +208,5 @@ var BaseApiClient = class {
|
|
|
208
208
|
};
|
|
209
209
|
|
|
210
210
|
export { API_ROUTES, BaseApiClient, STORAGE_KEYS };
|
|
211
|
-
//# sourceMappingURL=chunk-
|
|
212
|
-
//# sourceMappingURL=chunk-
|
|
211
|
+
//# sourceMappingURL=chunk-KZKIH4AS.mjs.map
|
|
212
|
+
//# sourceMappingURL=chunk-KZKIH4AS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth/client/types.ts","../src/auth/client/base-api-client.ts"],"names":[],"mappings":"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","file":"chunk-KZKIH4AS.mjs","sourcesContent":["/**\n * Auth Client - Types\n * API 客户端类型定义\n */\n\nimport type { UserRole, User, ApiResponse, AuthResponse } from '../types';\n\nexport type { UserRole, User, ApiResponse, AuthResponse };\n\n/**\n * 存储键名\n */\nexport const STORAGE_KEYS = {\n AUTH_TOKEN: 'auth_token',\n USER_DATA: 'user_data',\n} as const;\n\n/**\n * API 路由\n */\nexport const API_ROUTES = {\n AUTH: {\n LOGIN: '/auth/login',\n REGISTER: '/auth/register',\n LOGOUT: '/auth/logout',\n ME: '/auth/me',\n },\n} as const;\n\n","/**\n * Auth Client - Base API Client\n * 基础 API 客户端\n */\n\nimport type { StorageAdapter } from '../../storage';\nimport type { RequestAdapter, RequestConfig } from '../../request';\nimport { API_ROUTES, STORAGE_KEYS, type ApiResponse, type User, type AuthResponse } from './types';\nimport type { IAuthClient } from '../types';\n\n/**\n * 基础 API 客户端\n * 提供统一的 API 调用逻辑,通过适配器模式支持多平台\n *\n * @example\n * ```typescript\n * import { BaseApiClient } from '@qhr123/sa2kit/auth/client';\n * import { WebStorageAdapter } from '@qhr123/sa2kit/storage';\n * import { WebRequestAdapter } from '@qhr123/sa2kit/request';\n *\n * const apiClient = new BaseApiClient(\n * new WebStorageAdapter(),\n * new WebRequestAdapter(),\n * '/api'\n * );\n *\n * await apiClient.init();\n * const result = await apiClient.login('user@example.com', 'password');\n * ```\n */\nexport class BaseApiClient implements IAuthClient {\n private token: string | null = null;\n private user: User | null = null;\n\n constructor(\n private storage: StorageAdapter,\n private request: RequestAdapter,\n private baseUrl: string\n ) {}\n\n /**\n * 初始化 - 从存储中加载 token 和用户信息\n */\n async init(): Promise<void> {\n try {\n this.token = await this.storage.getItem(STORAGE_KEYS.AUTH_TOKEN);\n const userData = await this.storage.getItem(STORAGE_KEYS.USER_DATA);\n if (userData) {\n this.user = JSON.parse(userData);\n }\n } catch (error) {\n console.error('Failed to load auth data:', error);\n }\n }\n\n /**\n * 设置认证 token\n */\n async setToken(token: string | null): Promise<void> {\n this.token = token;\n if (token) {\n await this.storage.setItem(STORAGE_KEYS.AUTH_TOKEN, token);\n } else {\n await this.storage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n }\n }\n\n /**\n * 设置用户信息\n */\n async setUser(user: User | null): Promise<void> {\n this.user = user;\n if (user) {\n await this.storage.setItem(STORAGE_KEYS.USER_DATA, JSON.stringify(user));\n } else {\n await this.storage.removeItem(STORAGE_KEYS.USER_DATA);\n }\n }\n\n /**\n * 获取当前 token\n */\n getToken(): string | null {\n return this.token;\n }\n\n /**\n * 获取当前用户\n */\n getUser(): User | null {\n return this.user;\n }\n\n /**\n * 检查是否已登录\n */\n async isAuthenticated(): Promise<boolean> {\n return !!this.token;\n }\n\n /**\n * 清除用户数据\n */\n async clearUserData(): Promise<void> {\n await this.storage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n await this.storage.removeItem(STORAGE_KEYS.USER_DATA);\n this.token = null;\n this.user = null;\n }\n\n /**\n * 发送请求的通用方法\n */\n private async sendRequest<T = any>(config: RequestConfig): Promise<ApiResponse<T>> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config.headers || {}),\n };\n\n // 添加认证 token\n if (this.token) {\n headers['Authorization'] = 'Bearer ' + (this.token);\n }\n\n const response = await this.request.request<ApiResponse<T>>({\n ...config,\n url: (this.baseUrl) + (config.url),\n headers,\n });\n\n return response;\n } catch (error) {\n console.error('API request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络错误,请重试',\n };\n }\n }\n\n // ==================== 认证相关 API ====================\n\n /**\n * 用户注册\n */\n async register(\n email: string,\n password: string,\n username: string\n ): Promise<ApiResponse<AuthResponse>> {\n const response = await this.sendRequest<AuthResponse>({\n url: API_ROUTES.AUTH.REGISTER,\n method: 'POST',\n body: { email, password, username },\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n }\n\n return response;\n }\n\n /**\n * 用户登录\n */\n async login(email: string, password: string): Promise<ApiResponse<AuthResponse>> {\n const response = await this.sendRequest<AuthResponse>({\n url: API_ROUTES.AUTH.LOGIN,\n method: 'POST',\n body: { email, password },\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n\n // 触发自定义事件通知登录成功\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('user_login_success', {\n detail: {\n userId: response.data.user.id,\n email: response.data.user.email,\n role: response.data.user.role,\n },\n })\n );\n }\n }\n\n return response;\n }\n\n /**\n * 用户退出登录\n */\n async logout(): Promise<void> {\n await this.sendRequest<void>({\n url: API_ROUTES.AUTH.LOGOUT,\n method: 'POST',\n });\n\n // 无论成功与否,都清除本地数据\n await this.clearUserData();\n }\n\n /**\n * 获取当前用户信息\n */\n async getCurrentUser(): Promise<ApiResponse<User>> {\n const response = await this.sendRequest<any>({\n url: API_ROUTES.AUTH.ME,\n method: 'GET',\n });\n\n // 统一处理响应格式\n if (response.success && response.data) {\n const userData = response.data.user || response.data;\n await this.setUser(userData);\n return {\n ...response,\n data: userData,\n };\n }\n\n return response;\n }\n\n // ==================== 通用方法 ====================\n\n /**\n * 发送 GET 请求\n */\n async get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'GET', params });\n }\n\n /**\n * 发送 POST 请求\n */\n async post<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'POST', body });\n }\n\n /**\n * 发送 PUT 请求\n */\n async put<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'PUT', body });\n }\n\n /**\n * 发送 DELETE 请求\n */\n async delete<T = any>(url: string): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'DELETE' });\n }\n}\n\n"]}
|