koishi-plugin-media-luna 0.0.44 → 0.0.45
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/lib/core/api/cache-api.d.ts.map +1 -1
- package/lib/core/api/cache-api.js +12 -124
- package/lib/core/api/cache-api.js.map +1 -1
- package/lib/plugins/cache/middleware.d.ts.map +1 -1
- package/lib/plugins/cache/middleware.js +32 -66
- package/lib/plugins/cache/middleware.js.map +1 -1
- package/lib/plugins/cache/service.d.ts +39 -24
- package/lib/plugins/cache/service.d.ts.map +1 -1
- package/lib/plugins/cache/service.js +214 -111
- package/lib/plugins/cache/service.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-api.d.ts","sourceRoot":"","sources":["../../../src/core/api/cache-api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"cache-api.d.ts","sourceRoot":"","sources":["../../../src/core/api/cache-api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAgLnD"}
|
|
@@ -2,31 +2,6 @@
|
|
|
2
2
|
// 缓存管理 API
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.registerCacheApi = registerCacheApi;
|
|
5
|
-
const s3_1 = require("../../plugins/cache/utils/s3");
|
|
6
|
-
const webdav_1 = require("../../plugins/cache/utils/webdav");
|
|
7
|
-
/** S3 配置(从 StorageConfig 转换) */
|
|
8
|
-
function toS3Config(config) {
|
|
9
|
-
return {
|
|
10
|
-
endpoint: config.s3Endpoint,
|
|
11
|
-
region: config.s3Region,
|
|
12
|
-
accessKeyId: config.s3AccessKeyId,
|
|
13
|
-
secretAccessKey: config.s3SecretAccessKey,
|
|
14
|
-
bucket: config.s3Bucket,
|
|
15
|
-
publicBaseUrl: config.s3PublicBaseUrl,
|
|
16
|
-
forcePathStyle: config.s3ForcePathStyle,
|
|
17
|
-
acl: config.s3Acl
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
/** WebDAV 配置(从 StorageConfig 转换) */
|
|
21
|
-
function toWebDavConfig(config) {
|
|
22
|
-
return {
|
|
23
|
-
endpoint: config.webdavEndpoint,
|
|
24
|
-
username: config.webdavUsername,
|
|
25
|
-
password: config.webdavPassword,
|
|
26
|
-
basePath: config.webdavBasePath,
|
|
27
|
-
publicBaseUrl: config.webdavPublicBaseUrl
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
5
|
/**
|
|
31
6
|
* 注册缓存管理 API
|
|
32
7
|
*/
|
|
@@ -174,92 +149,19 @@ function registerCacheApi(ctx) {
|
|
|
174
149
|
// 测试存储连接
|
|
175
150
|
console.addListener('media-luna/cache/test', async () => {
|
|
176
151
|
try {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
182
|
-
const backend = config.backend || 'local';
|
|
183
|
-
// 如果是 none,直接返回
|
|
184
|
-
if (backend === 'none') {
|
|
185
|
-
return {
|
|
186
|
-
success: true,
|
|
187
|
-
data: {
|
|
188
|
-
backend: 'none',
|
|
189
|
-
message: '存储后端设置为"不使用",无需测试'
|
|
190
|
-
}
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
// 创建测试数据
|
|
194
|
-
const testContent = `Media Luna Storage Test - ${new Date().toISOString()}`;
|
|
195
|
-
const testBuffer = Buffer.from(testContent, 'utf-8');
|
|
196
|
-
const testFilename = `_test-${Date.now()}.txt`;
|
|
197
|
-
const testMime = 'text/plain';
|
|
198
|
-
let uploadResult;
|
|
199
|
-
const startTime = Date.now();
|
|
200
|
-
switch (backend) {
|
|
201
|
-
case 'local': {
|
|
202
|
-
const { cache, error } = getCacheService();
|
|
203
|
-
if (error)
|
|
204
|
-
return error;
|
|
205
|
-
const cached = await cache.cache(testBuffer, testMime, testFilename);
|
|
206
|
-
const url = cache.getUrl(cached.id);
|
|
207
|
-
if (!url) {
|
|
208
|
-
return { success: false, error: '无法获取缓存 URL,请检查 selfUrl 配置' };
|
|
209
|
-
}
|
|
210
|
-
uploadResult = { url, key: cached.id };
|
|
211
|
-
// 清理测试文件
|
|
212
|
-
await cache.delete(cached.id);
|
|
213
|
-
break;
|
|
214
|
-
}
|
|
215
|
-
case 's3': {
|
|
216
|
-
const s3Config = toS3Config(config);
|
|
217
|
-
if (!s3Config.bucket) {
|
|
218
|
-
return { success: false, error: 'S3 缺少 bucket 配置' };
|
|
219
|
-
}
|
|
220
|
-
if (!s3Config.accessKeyId || !s3Config.secretAccessKey) {
|
|
221
|
-
return { success: false, error: 'S3 需提供访问凭证' };
|
|
222
|
-
}
|
|
223
|
-
uploadResult = await (0, s3_1.uploadToS3)(testBuffer, testFilename, testMime, s3Config);
|
|
224
|
-
// 尝试删除测试文件(可选,失败不影响测试结果)
|
|
225
|
-
try {
|
|
226
|
-
await (0, s3_1.deleteFromS3)(testFilename, s3Config);
|
|
227
|
-
}
|
|
228
|
-
catch {
|
|
229
|
-
// 忽略删除失败
|
|
230
|
-
}
|
|
231
|
-
break;
|
|
232
|
-
}
|
|
233
|
-
case 'webdav': {
|
|
234
|
-
const webdavConfig = toWebDavConfig(config);
|
|
235
|
-
if (!webdavConfig.endpoint) {
|
|
236
|
-
return { success: false, error: 'WebDAV 缺少端点配置' };
|
|
237
|
-
}
|
|
238
|
-
if (!webdavConfig.username || !webdavConfig.password) {
|
|
239
|
-
return { success: false, error: 'WebDAV 需提供用户名和密码' };
|
|
240
|
-
}
|
|
241
|
-
uploadResult = await (0, webdav_1.uploadToWebDav)(testBuffer, testFilename, testMime, webdavConfig);
|
|
242
|
-
// 尝试删除测试文件(可选,失败不影响测试结果)
|
|
243
|
-
try {
|
|
244
|
-
await deleteFromWebDav(testFilename, webdavConfig);
|
|
245
|
-
}
|
|
246
|
-
catch {
|
|
247
|
-
// 忽略删除失败
|
|
248
|
-
}
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
default:
|
|
252
|
-
return { success: false, error: `未知的存储后端: ${backend}` };
|
|
253
|
-
}
|
|
254
|
-
const duration = Date.now() - startTime;
|
|
152
|
+
const { cache, error } = getCacheService();
|
|
153
|
+
if (error)
|
|
154
|
+
return error;
|
|
155
|
+
const result = await cache.testConnection();
|
|
255
156
|
return {
|
|
256
|
-
success:
|
|
257
|
-
data: {
|
|
258
|
-
backend,
|
|
259
|
-
url:
|
|
260
|
-
duration,
|
|
261
|
-
message:
|
|
262
|
-
}
|
|
157
|
+
success: result.success,
|
|
158
|
+
data: result.success ? {
|
|
159
|
+
backend: cache.getBackend(),
|
|
160
|
+
url: result.url,
|
|
161
|
+
duration: result.duration,
|
|
162
|
+
message: result.message
|
|
163
|
+
} : undefined,
|
|
164
|
+
error: result.success ? undefined : result.message
|
|
263
165
|
};
|
|
264
166
|
}
|
|
265
167
|
catch (error) {
|
|
@@ -267,18 +169,4 @@ function registerCacheApi(ctx) {
|
|
|
267
169
|
}
|
|
268
170
|
});
|
|
269
171
|
}
|
|
270
|
-
/**
|
|
271
|
-
* 从 WebDAV 删除文件(用于测试清理)
|
|
272
|
-
*/
|
|
273
|
-
async function deleteFromWebDav(filename, config) {
|
|
274
|
-
const remotePath = config.basePath
|
|
275
|
-
? `${config.basePath.replace(/\/+$/, '')}/${filename}`
|
|
276
|
-
: filename;
|
|
277
|
-
const url = `${config.endpoint.replace(/\/+$/, '')}/${remotePath.split('/').map(encodeURIComponent).join('/')}`;
|
|
278
|
-
const auth = Buffer.from(`${config.username}:${config.password}`, 'utf8').toString('base64');
|
|
279
|
-
await fetch(url, {
|
|
280
|
-
method: 'DELETE',
|
|
281
|
-
headers: { Authorization: `Basic ${auth}` }
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
172
|
//# sourceMappingURL=cache-api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-api.js","sourceRoot":"","sources":["../../../src/core/api/cache-api.ts"],"names":[],"mappings":";AAAA,WAAW;;
|
|
1
|
+
{"version":3,"file":"cache-api.js","sourceRoot":"","sources":["../../../src/core/api/cache-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/plugins/cache/middleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/plugins/cache/middleware.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,YAAY,CAAA;AA2EnB;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,oBAAoB,CAwEnE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,oBAAoB,CAuF9D"}
|
|
@@ -1,31 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// 存储中间件 - 将输入文件和生成结果上传到存储后端
|
|
3
|
+
// 统一通过 CacheService 进行存储操作
|
|
3
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
5
|
exports.createStorageInputMiddleware = createStorageInputMiddleware;
|
|
5
6
|
exports.createStorageMiddleware = createStorageMiddleware;
|
|
6
7
|
const utils_1 = require("./utils");
|
|
7
|
-
// ============ 配置转换 ============
|
|
8
|
-
function toS3Config(config) {
|
|
9
|
-
return {
|
|
10
|
-
endpoint: config.s3Endpoint,
|
|
11
|
-
region: config.s3Region,
|
|
12
|
-
accessKeyId: config.s3AccessKeyId,
|
|
13
|
-
secretAccessKey: config.s3SecretAccessKey,
|
|
14
|
-
bucket: config.s3Bucket,
|
|
15
|
-
publicBaseUrl: config.s3PublicBaseUrl,
|
|
16
|
-
forcePathStyle: config.s3ForcePathStyle,
|
|
17
|
-
acl: config.s3Acl
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
function toWebDavConfig(config) {
|
|
21
|
-
return {
|
|
22
|
-
endpoint: config.webdavEndpoint,
|
|
23
|
-
username: config.webdavUsername,
|
|
24
|
-
password: config.webdavPassword,
|
|
25
|
-
basePath: config.webdavBasePath,
|
|
26
|
-
publicBaseUrl: config.webdavPublicBaseUrl
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
8
|
// ============ 工具函数 ============
|
|
30
9
|
/**
|
|
31
10
|
* 解析 base64 data URL
|
|
@@ -71,29 +50,18 @@ async function downloadAsset(url) {
|
|
|
71
50
|
return { buffer: Buffer.from(arrayBuffer), mime };
|
|
72
51
|
}
|
|
73
52
|
/**
|
|
74
|
-
*
|
|
53
|
+
* 上传文件到存储后端(通过 CacheService)
|
|
75
54
|
*/
|
|
76
|
-
async function uploadToBackend(buffer, filename, mime,
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const url = cacheService.getUrl(cached.id);
|
|
85
|
-
if (!url) {
|
|
86
|
-
throw new Error('无法获取缓存 URL,请检查 selfUrl 配置');
|
|
87
|
-
}
|
|
88
|
-
return { url, key: cached.id };
|
|
89
|
-
}
|
|
90
|
-
case 's3':
|
|
91
|
-
return (0, utils_1.uploadToS3)(buffer, filename, mime, toS3Config(config));
|
|
92
|
-
case 'webdav':
|
|
93
|
-
return (0, utils_1.uploadToWebDav)(buffer, filename, mime, toWebDavConfig(config));
|
|
94
|
-
default:
|
|
95
|
-
throw new Error(`未知的存储后端: ${config.backend}`);
|
|
55
|
+
async function uploadToBackend(buffer, filename, mime, mctx) {
|
|
56
|
+
const cacheService = mctx.getService('cache');
|
|
57
|
+
if (!cacheService) {
|
|
58
|
+
throw new Error('缓存服务不可用');
|
|
59
|
+
}
|
|
60
|
+
const cached = await cacheService.cache(buffer, mime, filename);
|
|
61
|
+
if (!cached.url) {
|
|
62
|
+
throw new Error('无法获取缓存 URL,请检查存储配置');
|
|
96
63
|
}
|
|
64
|
+
return { url: cached.url, key: cached.id };
|
|
97
65
|
}
|
|
98
66
|
// ============ 中间件定义 ============
|
|
99
67
|
/**
|
|
@@ -110,21 +78,20 @@ function createStorageInputMiddleware() {
|
|
|
110
78
|
phase: 'lifecycle-prepare',
|
|
111
79
|
// 配置在 cache 插件的"扩展插件"面板中设置
|
|
112
80
|
async execute(mctx, next) {
|
|
113
|
-
//
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
if (!config || !config.enabled) {
|
|
81
|
+
// 获取缓存服务
|
|
82
|
+
const cacheService = mctx.getService('cache');
|
|
83
|
+
if (!cacheService) {
|
|
117
84
|
return next();
|
|
118
85
|
}
|
|
119
|
-
//
|
|
120
|
-
if (!
|
|
86
|
+
// 检查服务是否启用
|
|
87
|
+
if (!cacheService.isEnabled()) {
|
|
121
88
|
return next();
|
|
122
89
|
}
|
|
123
|
-
|
|
124
|
-
if (!
|
|
125
|
-
mctx.setMiddlewareLog('storage-input', { error: '本地缓存服务不可用' });
|
|
90
|
+
// 没有文件时跳过
|
|
91
|
+
if (!mctx.files || mctx.files.length === 0) {
|
|
126
92
|
return next();
|
|
127
93
|
}
|
|
94
|
+
const backend = cacheService.getBackend();
|
|
128
95
|
const uploadLogs = [];
|
|
129
96
|
const uploadedUrls = [];
|
|
130
97
|
for (let i = 0; i < mctx.files.length; i++) {
|
|
@@ -136,7 +103,7 @@ function createStorageInputMiddleware() {
|
|
|
136
103
|
const buffer = Buffer.from(file.data);
|
|
137
104
|
const ext = (0, utils_1.getExtensionFromMime)(file.mime);
|
|
138
105
|
const filename = `input-${i}${ext}`;
|
|
139
|
-
const result = await uploadToBackend(buffer, filename, file.mime,
|
|
106
|
+
const result = await uploadToBackend(buffer, filename, file.mime, mctx);
|
|
140
107
|
uploadedUrls.push(result.url);
|
|
141
108
|
uploadLogs.push({ index: i, filename: file.filename, url: result.url });
|
|
142
109
|
}
|
|
@@ -152,7 +119,7 @@ function createStorageInputMiddleware() {
|
|
|
152
119
|
mctx.store.set('inputFileUrls', uploadedUrls);
|
|
153
120
|
}
|
|
154
121
|
mctx.setMiddlewareLog('storage-input', {
|
|
155
|
-
backend
|
|
122
|
+
backend,
|
|
156
123
|
total: mctx.files.length,
|
|
157
124
|
uploaded: uploadLogs.filter(l => l.url).length,
|
|
158
125
|
failed: uploadLogs.filter(l => l.error).length,
|
|
@@ -177,21 +144,20 @@ function createStorageMiddleware() {
|
|
|
177
144
|
phase: 'lifecycle-post-request',
|
|
178
145
|
// 配置在 cache 插件的"扩展插件"面板中设置
|
|
179
146
|
async execute(mctx, next) {
|
|
180
|
-
//
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
if (!config || !config.enabled) {
|
|
147
|
+
// 获取缓存服务
|
|
148
|
+
const cacheService = mctx.getService('cache');
|
|
149
|
+
if (!cacheService) {
|
|
184
150
|
return next();
|
|
185
151
|
}
|
|
186
|
-
//
|
|
187
|
-
if (!
|
|
152
|
+
// 检查服务是否启用
|
|
153
|
+
if (!cacheService.isEnabled()) {
|
|
188
154
|
return next();
|
|
189
155
|
}
|
|
190
|
-
|
|
191
|
-
if (!
|
|
192
|
-
mctx.setMiddlewareLog('storage', { error: '本地缓存服务不可用' });
|
|
156
|
+
// 没有输出时跳过
|
|
157
|
+
if (!mctx.output || mctx.output.length === 0) {
|
|
193
158
|
return next();
|
|
194
159
|
}
|
|
160
|
+
const backend = cacheService.getBackend();
|
|
195
161
|
const uploadedAssets = [];
|
|
196
162
|
const uploadLogs = [];
|
|
197
163
|
for (let i = 0; i < mctx.output.length; i++) {
|
|
@@ -204,7 +170,7 @@ function createStorageMiddleware() {
|
|
|
204
170
|
try {
|
|
205
171
|
const { buffer, mime } = await downloadAsset(asset.url);
|
|
206
172
|
const filename = `output-${asset.kind}-${i}`;
|
|
207
|
-
const result = await uploadToBackend(buffer, filename, mime,
|
|
173
|
+
const result = await uploadToBackend(buffer, filename, mime, mctx);
|
|
208
174
|
const isBase64 = asset.url.startsWith('data:');
|
|
209
175
|
uploadedAssets.push({
|
|
210
176
|
...asset,
|
|
@@ -213,7 +179,7 @@ function createStorageMiddleware() {
|
|
|
213
179
|
...asset.meta,
|
|
214
180
|
...(isBase64 ? {} : { originalUrl: asset.url }),
|
|
215
181
|
storageKey: result.key,
|
|
216
|
-
storageBackend:
|
|
182
|
+
storageBackend: backend
|
|
217
183
|
}
|
|
218
184
|
});
|
|
219
185
|
uploadLogs.push({
|
|
@@ -234,7 +200,7 @@ function createStorageMiddleware() {
|
|
|
234
200
|
}
|
|
235
201
|
mctx.output = uploadedAssets;
|
|
236
202
|
mctx.setMiddlewareLog('storage', {
|
|
237
|
-
backend
|
|
203
|
+
backend,
|
|
238
204
|
total: mctx.output.length,
|
|
239
205
|
uploaded: uploadLogs.filter(l => l.newUrl).length,
|
|
240
206
|
failed: uploadLogs.filter(l => l.error).length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/plugins/cache/middleware.ts"],"names":[],"mappings":";AAAA,4BAA4B;;
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/plugins/cache/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Context } from 'koishi';
|
|
2
2
|
import type { CachePluginConfig } from './config';
|
|
3
|
-
/**
|
|
3
|
+
/** 缓存文件元数据 */
|
|
4
4
|
export interface CachedFile {
|
|
5
5
|
id: string;
|
|
6
6
|
filename: string;
|
|
@@ -11,6 +11,8 @@ export interface CachedFile {
|
|
|
11
11
|
localPath: string;
|
|
12
12
|
/** 可访问的 URL */
|
|
13
13
|
url?: string;
|
|
14
|
+
/** 存储后端 */
|
|
15
|
+
backend?: string;
|
|
14
16
|
}
|
|
15
17
|
/** 缓存统计 */
|
|
16
18
|
export interface CacheStats {
|
|
@@ -19,11 +21,11 @@ export interface CacheStats {
|
|
|
19
21
|
maxSizeMB: number;
|
|
20
22
|
oldestAccess: Date | null;
|
|
21
23
|
newestAccess: Date | null;
|
|
24
|
+
backend: string;
|
|
22
25
|
}
|
|
23
26
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* 使用数据库存储元数据,支持 sourceHash 和 contentHash 两级去重
|
|
27
|
+
* 统一存储服务
|
|
28
|
+
* 根据配置的 backend 自动选择存储方式(local/s3/webdav)
|
|
27
29
|
*/
|
|
28
30
|
export declare class CacheService {
|
|
29
31
|
private logger;
|
|
@@ -32,7 +34,7 @@ export declare class CacheService {
|
|
|
32
34
|
private publicPath;
|
|
33
35
|
private publicBaseUrl;
|
|
34
36
|
private config;
|
|
35
|
-
/** 基础URL(从 selfUrl
|
|
37
|
+
/** 基础URL(从 selfUrl 获取),用于生成本地访问链接 */
|
|
36
38
|
private baseUrl;
|
|
37
39
|
/** 内存缓存(加速查询) */
|
|
38
40
|
private memoryCache;
|
|
@@ -51,55 +53,68 @@ export declare class CacheService {
|
|
|
51
53
|
getBaseUrl(): string;
|
|
52
54
|
/** 检查缓存是否启用 */
|
|
53
55
|
isEnabled(): boolean;
|
|
54
|
-
/**
|
|
56
|
+
/** 获取当前后端类型 */
|
|
57
|
+
getBackend(): string;
|
|
58
|
+
/** 获取完整配置 */
|
|
55
59
|
getConfig(): CachePluginConfig;
|
|
60
|
+
/** 转换为 S3 配置 */
|
|
61
|
+
private toS3Config;
|
|
62
|
+
/** 转换为 WebDAV 配置 */
|
|
63
|
+
private toWebDavConfig;
|
|
56
64
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* @param mime MIME 类型
|
|
60
|
-
* @param filename 文件名
|
|
61
|
-
* @param sourceUrl 可选的源 URL(用于 sourceHash 去重)
|
|
65
|
+
* 缓存文件
|
|
66
|
+
* 根据配置的后端自动选择存储方式
|
|
62
67
|
*/
|
|
63
68
|
cache(data: Buffer | ArrayBuffer, mime: string, filename?: string, sourceUrl?: string): Promise<CachedFile>;
|
|
69
|
+
/** 存储到本地 */
|
|
70
|
+
private storeLocal;
|
|
71
|
+
/** 存储到 S3 */
|
|
72
|
+
private storeS3;
|
|
73
|
+
/** 存储到 WebDAV */
|
|
74
|
+
private storeWebDav;
|
|
64
75
|
/**
|
|
65
76
|
* 从 URL 下载并缓存
|
|
66
|
-
* 支持 sourceHash 去重:相同 URL 不会重复下载
|
|
67
77
|
*/
|
|
68
78
|
cacheFromUrl(url: string): Promise<CachedFile>;
|
|
69
79
|
/** 获取缓存文件的访问URL */
|
|
70
80
|
getUrl(id: string): string | null;
|
|
71
81
|
/** 获取缓存文件信息 */
|
|
72
82
|
get(id: string): Promise<CachedFile | null>;
|
|
73
|
-
/**
|
|
83
|
+
/** 读取缓存文件内容(仅本地存储可用) */
|
|
74
84
|
read(id: string): Promise<Buffer | null>;
|
|
75
|
-
/** 读取为 Data URL */
|
|
85
|
+
/** 读取为 Data URL(仅本地存储可用) */
|
|
76
86
|
readAsDataUrl(id: string): Promise<string | null>;
|
|
77
87
|
/** 删除缓存文件 */
|
|
78
88
|
delete(id: string): Promise<boolean>;
|
|
89
|
+
/** 从后端删除文件 */
|
|
90
|
+
private deleteFromBackend;
|
|
91
|
+
/** 从 WebDAV 删除 */
|
|
92
|
+
private deleteFromWebDav;
|
|
79
93
|
/** 获取统计信息 */
|
|
80
94
|
getStats(): Promise<CacheStats>;
|
|
81
95
|
/** 清空所有缓存 */
|
|
82
96
|
clearAll(): Promise<void>;
|
|
83
|
-
/**
|
|
97
|
+
/**
|
|
98
|
+
* 测试存储连接
|
|
99
|
+
*/
|
|
100
|
+
testConnection(): Promise<{
|
|
101
|
+
success: boolean;
|
|
102
|
+
message: string;
|
|
103
|
+
url?: string;
|
|
104
|
+
duration?: number;
|
|
105
|
+
}>;
|
|
84
106
|
private findBySourceHash;
|
|
85
|
-
/** 通过 contentHash 查找缓存 */
|
|
86
107
|
private findByContentHash;
|
|
87
|
-
/** 更新访问时间 */
|
|
88
108
|
private updateAccessTime;
|
|
89
|
-
/** 从数据库删除 */
|
|
90
109
|
private deleteFromDatabase;
|
|
91
|
-
/** 将数据库记录转换为 CachedFile */
|
|
92
110
|
private dbRecordToCachedFile;
|
|
93
111
|
private ensureDir;
|
|
94
|
-
/** 生成内容哈希(基于文件内容) */
|
|
95
112
|
private generateContentHash;
|
|
96
|
-
/** 生成源哈希(基于 URL) */
|
|
97
113
|
private generateSourceHash;
|
|
98
114
|
private getExtension;
|
|
99
|
-
private getExtensionFromMime;
|
|
100
115
|
private guessMimeFromUrl;
|
|
101
|
-
/**
|
|
102
|
-
private
|
|
116
|
+
/** 构建本地访问 URL */
|
|
117
|
+
private buildLocalUrl;
|
|
103
118
|
private ensureCacheSpace;
|
|
104
119
|
private cleanupExpired;
|
|
105
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/plugins/cache/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/plugins/cache/service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAMhC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAMjD,cAAc;AACd,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,IAAI,CAAA;IACf,UAAU,EAAE,IAAI,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,WAAW;AACX,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAA;IACzB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,MAAM,CAAmB;IACjC,qCAAqC;IACrC,OAAO,CAAC,OAAO,CAAa;IAC5B,iBAAiB;IACjB,OAAO,CAAC,WAAW,CAAqC;IACxD,aAAa;IACb,OAAO,CAAC,WAAW,CAAiB;gBAExB,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB;IAoBnD,YAAY;YACE,UAAU;IAgBxB,qBAAqB;YACP,gBAAgB;IAuB9B,WAAW;IACX,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAKtD,cAAc;IACd,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAK7B,cAAc;IACd,UAAU,IAAI,MAAM;IAIpB,eAAe;IACf,SAAS,IAAI,OAAO;IAIpB,eAAe;IACf,UAAU,IAAI,MAAM;IAIpB,aAAa;IACb,SAAS,IAAI,iBAAiB;IAI9B,gBAAgB;IAChB,OAAO,CAAC,UAAU;IAalB,oBAAoB;IACpB,OAAO,CAAC,cAAc;IAUtB;;;OAGG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAqFjH,YAAY;YACE,UAAU;IAUxB,aAAa;YACC,OAAO;IAUrB,iBAAiB;YACH,WAAW;IAUzB;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAqBpD,mBAAmB;IACnB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMjC,eAAe;IACT,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAyBjD,wBAAwB;IAClB,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkB9C,4BAA4B;IACtB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUvD,aAAa;IACP,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB1C,cAAc;YACA,iBAAiB;IAyB/B,kBAAkB;YACJ,gBAAgB;IAe9B,aAAa;IACP,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAuBrC,aAAa;IACP,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;YAqCzF,gBAAgB;YAKhB,iBAAiB;YAKjB,gBAAgB;YAUhB,kBAAkB;IAIhC,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,gBAAgB;IAkBxB,iBAAiB;IACjB,OAAO,CAAC,aAAa;YA2BP,gBAAgB;YAmBhB,cAAc;CAkB7B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
//
|
|
2
|
+
// 统一存储服务 - 支持本地/S3/WebDAV 多后端
|
|
3
|
+
// 根据配置的 backend 自动选择存储方式
|
|
3
4
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
5
|
if (k2 === undefined) k2 = k;
|
|
5
6
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -39,10 +40,12 @@ const fs = __importStar(require("fs"));
|
|
|
39
40
|
const path = __importStar(require("path"));
|
|
40
41
|
const crypto = __importStar(require("crypto"));
|
|
41
42
|
const core_1 = require("../../core");
|
|
43
|
+
const s3_1 = require("./utils/s3");
|
|
44
|
+
const webdav_1 = require("./utils/webdav");
|
|
45
|
+
const mime_1 = require("./utils/mime");
|
|
42
46
|
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* 使用数据库存储元数据,支持 sourceHash 和 contentHash 两级去重
|
|
47
|
+
* 统一存储服务
|
|
48
|
+
* 根据配置的 backend 自动选择存储方式(local/s3/webdav)
|
|
46
49
|
*/
|
|
47
50
|
class CacheService {
|
|
48
51
|
logger;
|
|
@@ -51,7 +54,7 @@ class CacheService {
|
|
|
51
54
|
publicPath;
|
|
52
55
|
publicBaseUrl;
|
|
53
56
|
config;
|
|
54
|
-
/** 基础URL(从 selfUrl
|
|
57
|
+
/** 基础URL(从 selfUrl 获取),用于生成本地访问链接 */
|
|
55
58
|
baseUrl = '';
|
|
56
59
|
/** 内存缓存(加速查询) */
|
|
57
60
|
memoryCache = new Map();
|
|
@@ -61,7 +64,7 @@ class CacheService {
|
|
|
61
64
|
this.ctx = ctx;
|
|
62
65
|
this.logger = (0, core_1.createPluginLogger)(ctx.logger('media-luna'), 'cache');
|
|
63
66
|
this.config = config;
|
|
64
|
-
//
|
|
67
|
+
// 本地缓存目录(即使使用 S3/WebDAV,也可能需要临时存储)
|
|
65
68
|
this.cacheRoot = path.join(ctx.baseDir, config.cacheDir || 'data/media-luna/cache');
|
|
66
69
|
this.publicPath = config.publicPath || '/media-luna/cache';
|
|
67
70
|
this.publicBaseUrl = config.publicBaseUrl?.replace(/\/$/, '') || null;
|
|
@@ -70,7 +73,7 @@ class CacheService {
|
|
|
70
73
|
this.initialize().catch(e => {
|
|
71
74
|
this.logger.error('Failed to initialize cache service: %s', e);
|
|
72
75
|
});
|
|
73
|
-
this.logger.info('Cache service initialized
|
|
76
|
+
this.logger.info('Cache service initialized, backend: %s', config.backend || 'local');
|
|
74
77
|
}
|
|
75
78
|
/** 异步初始化 */
|
|
76
79
|
async initialize() {
|
|
@@ -79,8 +82,10 @@ class CacheService {
|
|
|
79
82
|
try {
|
|
80
83
|
// 从数据库加载到内存缓存
|
|
81
84
|
await this.loadFromDatabase();
|
|
82
|
-
//
|
|
83
|
-
|
|
85
|
+
// 清理过期缓存(仅本地模式)
|
|
86
|
+
if (this.config.backend === 'local' || !this.config.backend) {
|
|
87
|
+
await this.cleanupExpired();
|
|
88
|
+
}
|
|
84
89
|
this.initialized = true;
|
|
85
90
|
}
|
|
86
91
|
catch (e) {
|
|
@@ -92,7 +97,7 @@ class CacheService {
|
|
|
92
97
|
try {
|
|
93
98
|
const records = await this.ctx.database.get('medialuna_asset_cache', {});
|
|
94
99
|
for (const record of records) {
|
|
95
|
-
const localPath = path.join(this.cacheRoot,
|
|
100
|
+
const localPath = path.join(this.cacheRoot, record.cachedKey);
|
|
96
101
|
this.memoryCache.set(record.contentHash, {
|
|
97
102
|
id: record.contentHash,
|
|
98
103
|
filename: path.basename(record.cachedKey),
|
|
@@ -101,7 +106,8 @@ class CacheService {
|
|
|
101
106
|
createdAt: record.createdAt,
|
|
102
107
|
accessedAt: record.lastAccessedAt,
|
|
103
108
|
localPath,
|
|
104
|
-
url: record.cachedUrl
|
|
109
|
+
url: record.cachedUrl,
|
|
110
|
+
backend: record.backend
|
|
105
111
|
});
|
|
106
112
|
}
|
|
107
113
|
this.logger.debug('Loaded %d cache entries from database', records.length);
|
|
@@ -113,6 +119,7 @@ class CacheService {
|
|
|
113
119
|
/** 更新配置 */
|
|
114
120
|
updateConfig(config) {
|
|
115
121
|
this.config = { ...this.config, ...config };
|
|
122
|
+
this.logger.info('Cache config updated, backend: %s', this.config.backend || 'local');
|
|
116
123
|
}
|
|
117
124
|
/** 设置基础URL */
|
|
118
125
|
setBaseUrl(url) {
|
|
@@ -125,57 +132,95 @@ class CacheService {
|
|
|
125
132
|
}
|
|
126
133
|
/** 检查缓存是否启用 */
|
|
127
134
|
isEnabled() {
|
|
128
|
-
return this.config.enabled;
|
|
135
|
+
return this.config.enabled && this.config.backend !== 'none';
|
|
136
|
+
}
|
|
137
|
+
/** 获取当前后端类型 */
|
|
138
|
+
getBackend() {
|
|
139
|
+
return this.config.backend || 'local';
|
|
129
140
|
}
|
|
130
|
-
/**
|
|
141
|
+
/** 获取完整配置 */
|
|
131
142
|
getConfig() {
|
|
132
143
|
return this.config;
|
|
133
144
|
}
|
|
145
|
+
/** 转换为 S3 配置 */
|
|
146
|
+
toS3Config() {
|
|
147
|
+
return {
|
|
148
|
+
endpoint: this.config.s3Endpoint,
|
|
149
|
+
region: this.config.s3Region,
|
|
150
|
+
accessKeyId: this.config.s3AccessKeyId,
|
|
151
|
+
secretAccessKey: this.config.s3SecretAccessKey,
|
|
152
|
+
bucket: this.config.s3Bucket,
|
|
153
|
+
publicBaseUrl: this.config.s3PublicBaseUrl,
|
|
154
|
+
forcePathStyle: this.config.s3ForcePathStyle,
|
|
155
|
+
acl: this.config.s3Acl
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** 转换为 WebDAV 配置 */
|
|
159
|
+
toWebDavConfig() {
|
|
160
|
+
return {
|
|
161
|
+
endpoint: this.config.webdavEndpoint,
|
|
162
|
+
username: this.config.webdavUsername,
|
|
163
|
+
password: this.config.webdavPassword,
|
|
164
|
+
basePath: this.config.webdavBasePath,
|
|
165
|
+
publicBaseUrl: this.config.webdavPublicBaseUrl
|
|
166
|
+
};
|
|
167
|
+
}
|
|
134
168
|
/**
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* @param mime MIME 类型
|
|
138
|
-
* @param filename 文件名
|
|
139
|
-
* @param sourceUrl 可选的源 URL(用于 sourceHash 去重)
|
|
169
|
+
* 缓存文件
|
|
170
|
+
* 根据配置的后端自动选择存储方式
|
|
140
171
|
*/
|
|
141
172
|
async cache(data, mime, filename, sourceUrl) {
|
|
142
173
|
if (!this.config.enabled) {
|
|
143
174
|
throw new Error('Cache is disabled');
|
|
144
175
|
}
|
|
145
176
|
const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
177
|
+
const backend = this.config.backend || 'local';
|
|
178
|
+
// 检查文件大小(仅本地模式限制)
|
|
179
|
+
if (backend === 'local') {
|
|
180
|
+
const sizeMB = buffer.length / (1024 * 1024);
|
|
181
|
+
if (sizeMB > this.config.maxFileSize) {
|
|
182
|
+
throw new Error(`File too large: ${sizeMB.toFixed(2)}MB > ${this.config.maxFileSize}MB`);
|
|
183
|
+
}
|
|
149
184
|
}
|
|
150
185
|
// 计算内容哈希
|
|
151
186
|
const contentHash = this.generateContentHash(buffer);
|
|
152
187
|
// 检查是否已有相同内容的缓存
|
|
153
188
|
const existingByContent = await this.findByContentHash(contentHash);
|
|
154
189
|
if (existingByContent) {
|
|
155
|
-
// 更新访问时间
|
|
156
190
|
await this.updateAccessTime(existingByContent.contentHash);
|
|
157
191
|
this.logger.debug('Cache hit by content hash: %s', contentHash);
|
|
158
192
|
return this.dbRecordToCachedFile(existingByContent);
|
|
159
193
|
}
|
|
160
|
-
//
|
|
161
|
-
await this.ensureCacheSpace(buffer.length);
|
|
162
|
-
// 写入文件
|
|
194
|
+
// 根据后端存储文件
|
|
163
195
|
const ext = this.getExtension(mime, filename);
|
|
164
|
-
const
|
|
165
|
-
|
|
196
|
+
const storageKey = `${contentHash}${ext}`;
|
|
197
|
+
let cachedUrl;
|
|
198
|
+
switch (backend) {
|
|
199
|
+
case 'local':
|
|
200
|
+
cachedUrl = await this.storeLocal(buffer, storageKey, contentHash, ext);
|
|
201
|
+
break;
|
|
202
|
+
case 's3':
|
|
203
|
+
cachedUrl = await this.storeS3(buffer, storageKey, mime);
|
|
204
|
+
break;
|
|
205
|
+
case 'webdav':
|
|
206
|
+
cachedUrl = await this.storeWebDav(buffer, storageKey, mime);
|
|
207
|
+
break;
|
|
208
|
+
case 'none':
|
|
209
|
+
throw new Error('Storage backend is set to none');
|
|
210
|
+
default:
|
|
211
|
+
throw new Error(`Unknown storage backend: ${backend}`);
|
|
212
|
+
}
|
|
166
213
|
// 计算源哈希(如果有源 URL)
|
|
167
214
|
const sourceHash = sourceUrl ? this.generateSourceHash(sourceUrl) : contentHash;
|
|
168
|
-
// 生成访问 URL
|
|
169
|
-
const cachedUrl = this.buildUrl(contentHash, ext);
|
|
170
215
|
// 保存到数据库
|
|
171
216
|
const now = new Date();
|
|
172
217
|
await this.ctx.database.create('medialuna_asset_cache', {
|
|
173
218
|
sourceUrl: sourceUrl || '',
|
|
174
219
|
sourceHash,
|
|
175
220
|
contentHash,
|
|
176
|
-
backend
|
|
221
|
+
backend,
|
|
177
222
|
cachedUrl,
|
|
178
|
-
cachedKey:
|
|
223
|
+
cachedKey: storageKey,
|
|
179
224
|
mimeType: mime,
|
|
180
225
|
fileSize: buffer.length,
|
|
181
226
|
createdAt: now,
|
|
@@ -188,24 +233,51 @@ class CacheService {
|
|
|
188
233
|
size: buffer.length,
|
|
189
234
|
createdAt: now,
|
|
190
235
|
accessedAt: now,
|
|
191
|
-
localPath,
|
|
192
|
-
url: cachedUrl
|
|
236
|
+
localPath: path.join(this.cacheRoot, storageKey),
|
|
237
|
+
url: cachedUrl,
|
|
238
|
+
backend
|
|
193
239
|
};
|
|
194
240
|
// 更新内存缓存
|
|
195
241
|
this.memoryCache.set(contentHash, cached);
|
|
196
|
-
this.logger.debug('Cached file
|
|
242
|
+
this.logger.debug('Cached file to %s: %s', backend, contentHash);
|
|
197
243
|
return cached;
|
|
198
244
|
}
|
|
245
|
+
/** 存储到本地 */
|
|
246
|
+
async storeLocal(buffer, storageKey, contentHash, ext) {
|
|
247
|
+
// 确保有足够空间
|
|
248
|
+
await this.ensureCacheSpace(buffer.length);
|
|
249
|
+
const localPath = path.join(this.cacheRoot, storageKey);
|
|
250
|
+
fs.writeFileSync(localPath, buffer);
|
|
251
|
+
return this.buildLocalUrl(contentHash, ext);
|
|
252
|
+
}
|
|
253
|
+
/** 存储到 S3 */
|
|
254
|
+
async storeS3(buffer, storageKey, mime) {
|
|
255
|
+
const s3Config = this.toS3Config();
|
|
256
|
+
if (!s3Config.bucket)
|
|
257
|
+
throw new Error('S3 缺少 bucket 配置');
|
|
258
|
+
if (!s3Config.accessKeyId || !s3Config.secretAccessKey)
|
|
259
|
+
throw new Error('S3 需提供访问凭证');
|
|
260
|
+
const result = await (0, s3_1.uploadToS3)(buffer, storageKey, mime, s3Config);
|
|
261
|
+
return result.url;
|
|
262
|
+
}
|
|
263
|
+
/** 存储到 WebDAV */
|
|
264
|
+
async storeWebDav(buffer, storageKey, mime) {
|
|
265
|
+
const webdavConfig = this.toWebDavConfig();
|
|
266
|
+
if (!webdavConfig.endpoint)
|
|
267
|
+
throw new Error('WebDAV 缺少端点配置');
|
|
268
|
+
if (!webdavConfig.username || !webdavConfig.password)
|
|
269
|
+
throw new Error('WebDAV 需提供用户名和密码');
|
|
270
|
+
const result = await (0, webdav_1.uploadToWebDav)(buffer, storageKey, mime, webdavConfig);
|
|
271
|
+
return result.url;
|
|
272
|
+
}
|
|
199
273
|
/**
|
|
200
274
|
* 从 URL 下载并缓存
|
|
201
|
-
* 支持 sourceHash 去重:相同 URL 不会重复下载
|
|
202
275
|
*/
|
|
203
276
|
async cacheFromUrl(url) {
|
|
204
277
|
// 先检查是否已有相同源 URL 的缓存
|
|
205
278
|
const sourceHash = this.generateSourceHash(url);
|
|
206
279
|
const existingBySource = await this.findBySourceHash(sourceHash);
|
|
207
280
|
if (existingBySource) {
|
|
208
|
-
// 更新访问时间
|
|
209
281
|
await this.updateAccessTime(existingBySource.contentHash);
|
|
210
282
|
this.logger.debug('Cache hit by source hash: %s -> %s', url, sourceHash);
|
|
211
283
|
return this.dbRecordToCachedFile(existingBySource);
|
|
@@ -216,7 +288,6 @@ class CacheService {
|
|
|
216
288
|
});
|
|
217
289
|
const mime = this.guessMimeFromUrl(url);
|
|
218
290
|
const filename = url.split('/').pop()?.split('?')[0] || 'downloaded';
|
|
219
|
-
// 缓存时传入源 URL
|
|
220
291
|
return this.cache(response, mime, filename, url);
|
|
221
292
|
}
|
|
222
293
|
/** 获取缓存文件的访问URL */
|
|
@@ -224,39 +295,40 @@ class CacheService {
|
|
|
224
295
|
const cached = this.memoryCache.get(id);
|
|
225
296
|
if (!cached)
|
|
226
297
|
return null;
|
|
227
|
-
|
|
228
|
-
return cached.url;
|
|
229
|
-
const ext = path.extname(cached.localPath);
|
|
230
|
-
return this.buildUrl(id, ext);
|
|
298
|
+
return cached.url || null;
|
|
231
299
|
}
|
|
232
300
|
/** 获取缓存文件信息 */
|
|
233
301
|
async get(id) {
|
|
234
|
-
// 先查内存缓存
|
|
235
302
|
let cached = this.memoryCache.get(id);
|
|
236
303
|
if (!cached) {
|
|
237
|
-
// 查数据库
|
|
238
304
|
const record = await this.findByContentHash(id);
|
|
239
305
|
if (!record)
|
|
240
306
|
return null;
|
|
241
307
|
cached = this.dbRecordToCachedFile(record);
|
|
242
308
|
this.memoryCache.set(id, cached);
|
|
243
309
|
}
|
|
244
|
-
//
|
|
245
|
-
if (!
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
310
|
+
// 如果是本地存储,检查文件是否存在
|
|
311
|
+
if (cached.backend === 'local' || !cached.backend) {
|
|
312
|
+
if (!fs.existsSync(cached.localPath)) {
|
|
313
|
+
await this.deleteFromDatabase(id);
|
|
314
|
+
this.memoryCache.delete(id);
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
249
317
|
}
|
|
250
|
-
// 更新访问时间
|
|
251
318
|
await this.updateAccessTime(id);
|
|
252
319
|
cached.accessedAt = new Date();
|
|
253
320
|
return cached;
|
|
254
321
|
}
|
|
255
|
-
/**
|
|
322
|
+
/** 读取缓存文件内容(仅本地存储可用) */
|
|
256
323
|
async read(id) {
|
|
257
324
|
const cached = await this.get(id);
|
|
258
325
|
if (!cached)
|
|
259
326
|
return null;
|
|
327
|
+
// 只有本地存储可以直接读取
|
|
328
|
+
if (cached.backend !== 'local' && cached.backend) {
|
|
329
|
+
this.logger.warn('Cannot read non-local cache: %s (backend: %s)', id, cached.backend);
|
|
330
|
+
return null;
|
|
331
|
+
}
|
|
260
332
|
try {
|
|
261
333
|
return fs.readFileSync(cached.localPath);
|
|
262
334
|
}
|
|
@@ -265,7 +337,7 @@ class CacheService {
|
|
|
265
337
|
return null;
|
|
266
338
|
}
|
|
267
339
|
}
|
|
268
|
-
/** 读取为 Data URL */
|
|
340
|
+
/** 读取为 Data URL(仅本地存储可用) */
|
|
269
341
|
async readAsDataUrl(id) {
|
|
270
342
|
const cached = await this.get(id);
|
|
271
343
|
if (!cached)
|
|
@@ -278,14 +350,17 @@ class CacheService {
|
|
|
278
350
|
/** 删除缓存文件 */
|
|
279
351
|
async delete(id) {
|
|
280
352
|
const cached = this.memoryCache.get(id);
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
if (
|
|
284
|
-
|
|
353
|
+
if (!cached) {
|
|
354
|
+
const record = await this.findByContentHash(id);
|
|
355
|
+
if (record) {
|
|
356
|
+
await this.deleteFromBackend(record.cachedKey, record.backend);
|
|
357
|
+
await this.deleteFromDatabase(id);
|
|
285
358
|
}
|
|
286
|
-
|
|
359
|
+
return true;
|
|
360
|
+
}
|
|
361
|
+
try {
|
|
362
|
+
await this.deleteFromBackend(cached.filename, cached.backend || 'local');
|
|
287
363
|
await this.deleteFromDatabase(id);
|
|
288
|
-
// 从内存缓存删除
|
|
289
364
|
this.memoryCache.delete(id);
|
|
290
365
|
return true;
|
|
291
366
|
}
|
|
@@ -294,6 +369,46 @@ class CacheService {
|
|
|
294
369
|
return false;
|
|
295
370
|
}
|
|
296
371
|
}
|
|
372
|
+
/** 从后端删除文件 */
|
|
373
|
+
async deleteFromBackend(key, backend) {
|
|
374
|
+
switch (backend) {
|
|
375
|
+
case 'local':
|
|
376
|
+
const localPath = path.join(this.cacheRoot, key);
|
|
377
|
+
if (fs.existsSync(localPath)) {
|
|
378
|
+
fs.unlinkSync(localPath);
|
|
379
|
+
}
|
|
380
|
+
break;
|
|
381
|
+
case 's3':
|
|
382
|
+
try {
|
|
383
|
+
await (0, s3_1.deleteFromS3)(key, this.toS3Config());
|
|
384
|
+
}
|
|
385
|
+
catch (e) {
|
|
386
|
+
this.logger.warn('Failed to delete from S3: %s', e);
|
|
387
|
+
}
|
|
388
|
+
break;
|
|
389
|
+
case 'webdav':
|
|
390
|
+
try {
|
|
391
|
+
await this.deleteFromWebDav(key);
|
|
392
|
+
}
|
|
393
|
+
catch (e) {
|
|
394
|
+
this.logger.warn('Failed to delete from WebDAV: %s', e);
|
|
395
|
+
}
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/** 从 WebDAV 删除 */
|
|
400
|
+
async deleteFromWebDav(key) {
|
|
401
|
+
const config = this.toWebDavConfig();
|
|
402
|
+
const remotePath = config.basePath
|
|
403
|
+
? `${config.basePath.replace(/\/+$/, '')}/${key}`
|
|
404
|
+
: key;
|
|
405
|
+
const url = `${config.endpoint.replace(/\/+$/, '')}/${remotePath.split('/').map(encodeURIComponent).join('/')}`;
|
|
406
|
+
const auth = Buffer.from(`${config.username}:${config.password}`, 'utf8').toString('base64');
|
|
407
|
+
await fetch(url, {
|
|
408
|
+
method: 'DELETE',
|
|
409
|
+
headers: { Authorization: `Basic ${auth}` }
|
|
410
|
+
});
|
|
411
|
+
}
|
|
297
412
|
/** 获取统计信息 */
|
|
298
413
|
async getStats() {
|
|
299
414
|
const records = await this.ctx.database.get('medialuna_asset_cache', {});
|
|
@@ -312,43 +427,61 @@ class CacheService {
|
|
|
312
427
|
totalSizeMB: totalSize / (1024 * 1024),
|
|
313
428
|
maxSizeMB: this.config.maxCacheSize,
|
|
314
429
|
oldestAccess: oldest,
|
|
315
|
-
newestAccess: newest
|
|
430
|
+
newestAccess: newest,
|
|
431
|
+
backend: this.config.backend || 'local'
|
|
316
432
|
};
|
|
317
433
|
}
|
|
318
434
|
/** 清空所有缓存 */
|
|
319
435
|
async clearAll() {
|
|
320
|
-
// 获取所有缓存记录
|
|
321
436
|
const records = await this.ctx.database.get('medialuna_asset_cache', {});
|
|
322
|
-
// 删除所有本地文件
|
|
323
437
|
for (const record of records) {
|
|
324
|
-
|
|
325
|
-
try {
|
|
326
|
-
if (fs.existsSync(localPath)) {
|
|
327
|
-
fs.unlinkSync(localPath);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
catch (e) {
|
|
331
|
-
this.logger.warn('Failed to delete file: %s', localPath);
|
|
332
|
-
}
|
|
438
|
+
await this.deleteFromBackend(record.cachedKey, record.backend);
|
|
333
439
|
}
|
|
334
|
-
// 清空数据库
|
|
335
440
|
await this.ctx.database.remove('medialuna_asset_cache', {});
|
|
336
|
-
// 清空内存缓存
|
|
337
441
|
this.memoryCache.clear();
|
|
338
442
|
this.logger.info('All cache cleared');
|
|
339
443
|
}
|
|
444
|
+
/**
|
|
445
|
+
* 测试存储连接
|
|
446
|
+
*/
|
|
447
|
+
async testConnection() {
|
|
448
|
+
const backend = this.config.backend || 'local';
|
|
449
|
+
if (backend === 'none') {
|
|
450
|
+
return { success: true, message: '存储后端设置为"不使用",无需测试' };
|
|
451
|
+
}
|
|
452
|
+
const testContent = `Media Luna Storage Test - ${new Date().toISOString()}`;
|
|
453
|
+
const testBuffer = Buffer.from(testContent, 'utf-8');
|
|
454
|
+
const testFilename = `_test-${Date.now()}.txt`;
|
|
455
|
+
const testMime = 'text/plain';
|
|
456
|
+
const startTime = Date.now();
|
|
457
|
+
try {
|
|
458
|
+
const cached = await this.cache(testBuffer, testMime, testFilename);
|
|
459
|
+
const duration = Date.now() - startTime;
|
|
460
|
+
// 清理测试文件
|
|
461
|
+
await this.delete(cached.id);
|
|
462
|
+
return {
|
|
463
|
+
success: true,
|
|
464
|
+
message: `存储连接测试成功(耗时 ${duration}ms)`,
|
|
465
|
+
url: cached.url,
|
|
466
|
+
duration
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
catch (error) {
|
|
470
|
+
return {
|
|
471
|
+
success: false,
|
|
472
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
}
|
|
340
476
|
// ========== 数据库操作方法 ==========
|
|
341
|
-
/** 通过 sourceHash 查找缓存 */
|
|
342
477
|
async findBySourceHash(sourceHash) {
|
|
343
478
|
const records = await this.ctx.database.get('medialuna_asset_cache', { sourceHash });
|
|
344
479
|
return records[0] || null;
|
|
345
480
|
}
|
|
346
|
-
/** 通过 contentHash 查找缓存 */
|
|
347
481
|
async findByContentHash(contentHash) {
|
|
348
482
|
const records = await this.ctx.database.get('medialuna_asset_cache', { contentHash });
|
|
349
483
|
return records[0] || null;
|
|
350
484
|
}
|
|
351
|
-
/** 更新访问时间 */
|
|
352
485
|
async updateAccessTime(contentHash) {
|
|
353
486
|
try {
|
|
354
487
|
await this.ctx.database.set('medialuna_asset_cache', { contentHash }, {
|
|
@@ -359,11 +492,9 @@ class CacheService {
|
|
|
359
492
|
this.logger.warn('Failed to update access time: %s', e);
|
|
360
493
|
}
|
|
361
494
|
}
|
|
362
|
-
/** 从数据库删除 */
|
|
363
495
|
async deleteFromDatabase(contentHash) {
|
|
364
496
|
await this.ctx.database.remove('medialuna_asset_cache', { contentHash });
|
|
365
497
|
}
|
|
366
|
-
/** 将数据库记录转换为 CachedFile */
|
|
367
498
|
dbRecordToCachedFile(record) {
|
|
368
499
|
const localPath = path.join(this.cacheRoot, record.cachedKey);
|
|
369
500
|
return {
|
|
@@ -374,7 +505,8 @@ class CacheService {
|
|
|
374
505
|
createdAt: record.createdAt,
|
|
375
506
|
accessedAt: record.lastAccessedAt,
|
|
376
507
|
localPath,
|
|
377
|
-
url: record.cachedUrl
|
|
508
|
+
url: record.cachedUrl,
|
|
509
|
+
backend: record.backend
|
|
378
510
|
};
|
|
379
511
|
}
|
|
380
512
|
// ========== 私有工具方法 ==========
|
|
@@ -383,12 +515,10 @@ class CacheService {
|
|
|
383
515
|
fs.mkdirSync(dir, { recursive: true });
|
|
384
516
|
}
|
|
385
517
|
}
|
|
386
|
-
/** 生成内容哈希(基于文件内容) */
|
|
387
518
|
generateContentHash(data) {
|
|
388
519
|
const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
|
|
389
520
|
return crypto.createHash('sha256').update(buffer).digest('hex').slice(0, 16);
|
|
390
521
|
}
|
|
391
|
-
/** 生成源哈希(基于 URL) */
|
|
392
522
|
generateSourceHash(url) {
|
|
393
523
|
return crypto.createHash('sha256').update(url).digest('hex').slice(0, 16);
|
|
394
524
|
}
|
|
@@ -398,22 +528,7 @@ class CacheService {
|
|
|
398
528
|
if (ext)
|
|
399
529
|
return ext;
|
|
400
530
|
}
|
|
401
|
-
return
|
|
402
|
-
}
|
|
403
|
-
getExtensionFromMime(mime) {
|
|
404
|
-
const mimeMap = {
|
|
405
|
-
'image/jpeg': '.jpg',
|
|
406
|
-
'image/png': '.png',
|
|
407
|
-
'image/gif': '.gif',
|
|
408
|
-
'image/webp': '.webp',
|
|
409
|
-
'image/svg+xml': '.svg',
|
|
410
|
-
'audio/mpeg': '.mp3',
|
|
411
|
-
'audio/wav': '.wav',
|
|
412
|
-
'audio/ogg': '.ogg',
|
|
413
|
-
'video/mp4': '.mp4',
|
|
414
|
-
'video/webm': '.webm'
|
|
415
|
-
};
|
|
416
|
-
return mimeMap[mime] || '.bin';
|
|
531
|
+
return (0, mime_1.getExtensionFromMime)(mime);
|
|
417
532
|
}
|
|
418
533
|
guessMimeFromUrl(url) {
|
|
419
534
|
const ext = url.split('.').pop()?.toLowerCase()?.split('?')[0];
|
|
@@ -432,49 +547,38 @@ class CacheService {
|
|
|
432
547
|
};
|
|
433
548
|
return mimeMap[ext || ''] || 'application/octet-stream';
|
|
434
549
|
}
|
|
435
|
-
/**
|
|
436
|
-
|
|
437
|
-
// 优先使用配置的 publicBaseUrl
|
|
550
|
+
/** 构建本地访问 URL */
|
|
551
|
+
buildLocalUrl(id, ext) {
|
|
438
552
|
if (this.publicBaseUrl) {
|
|
439
553
|
return `${this.publicBaseUrl}/${id}${ext}`;
|
|
440
554
|
}
|
|
441
|
-
// 否则使用 selfUrl + publicPath
|
|
442
555
|
if (!this.baseUrl) {
|
|
443
556
|
try {
|
|
444
|
-
// 尝试从 server 服务获取 selfUrl
|
|
445
557
|
const server = this.ctx.get?.('server');
|
|
446
558
|
const selfUrl = server?.config?.selfUrl;
|
|
447
559
|
if (selfUrl) {
|
|
448
560
|
this.baseUrl = selfUrl.replace(/\/$/, '');
|
|
449
|
-
this.logger.debug('Base URL dynamically set to: %s', this.baseUrl);
|
|
450
561
|
}
|
|
451
562
|
else {
|
|
452
|
-
// 如果没有配置 selfUrl,尝试使用 localhost + 端口
|
|
453
563
|
const port = server?.config?.port || 5140;
|
|
454
564
|
this.baseUrl = `http://127.0.0.1:${port}`;
|
|
455
|
-
this.logger.debug('Base URL set to localhost: %s', this.baseUrl);
|
|
456
565
|
}
|
|
457
566
|
}
|
|
458
567
|
catch {
|
|
459
|
-
// 忽略错误,使用默认值
|
|
460
568
|
this.baseUrl = 'http://127.0.0.1:5140';
|
|
461
569
|
}
|
|
462
570
|
}
|
|
463
571
|
if (!this.baseUrl) {
|
|
464
|
-
// 返回相对路径作为降级
|
|
465
|
-
this.logger.debug('Base URL not set, returning relative path for cache: %s', id);
|
|
466
572
|
return `${this.publicPath}/${id}${ext}`;
|
|
467
573
|
}
|
|
468
574
|
return `${this.baseUrl}${this.publicPath}/${id}${ext}`;
|
|
469
575
|
}
|
|
470
576
|
async ensureCacheSpace(needed) {
|
|
471
577
|
const maxBytes = this.config.maxCacheSize * 1024 * 1024;
|
|
472
|
-
|
|
473
|
-
const records = await this.ctx.database.get('medialuna_asset_cache', {});
|
|
578
|
+
const records = await this.ctx.database.get('medialuna_asset_cache', { backend: 'local' });
|
|
474
579
|
let currentSize = records.reduce((sum, r) => sum + r.fileSize, 0);
|
|
475
580
|
if (currentSize + needed <= maxBytes)
|
|
476
581
|
return;
|
|
477
|
-
// 按访问时间排序,删除最旧的
|
|
478
582
|
const sorted = [...records].sort((a, b) => a.lastAccessedAt.getTime() - b.lastAccessedAt.getTime());
|
|
479
583
|
for (const record of sorted) {
|
|
480
584
|
if (currentSize + needed <= maxBytes)
|
|
@@ -489,8 +593,7 @@ class CacheService {
|
|
|
489
593
|
const now = new Date();
|
|
490
594
|
const expireMs = this.config.expireDays * 24 * 60 * 60 * 1000;
|
|
491
595
|
const expireDate = new Date(now.getTime() - expireMs);
|
|
492
|
-
|
|
493
|
-
const records = await this.ctx.database.get('medialuna_asset_cache', {});
|
|
596
|
+
const records = await this.ctx.database.get('medialuna_asset_cache', { backend: 'local' });
|
|
494
597
|
const toDelete = records.filter(r => r.lastAccessedAt < expireDate);
|
|
495
598
|
for (const record of toDelete) {
|
|
496
599
|
await this.delete(record.contentHash);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/plugins/cache/service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/plugins/cache/service.ts"],"names":[],"mappings":"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"}
|