balance-dsh 1.0.9 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +32 -13
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -401,16 +401,35 @@ function recentDayKeys(days, now = Date.now()) {
|
|
|
401
401
|
}
|
|
402
402
|
|
|
403
403
|
async function buildUsageStats(ctx, config) {
|
|
404
|
-
const
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
}
|
|
404
|
+
const getService = typeof ctx.get === "function" ? ctx.get.bind(ctx) : null;
|
|
405
|
+
const controller = getService?.("sessionController");
|
|
406
|
+
const persistence = getService?.("sessionPersistence");
|
|
408
407
|
const now = Date.now();
|
|
409
408
|
const cutoffMs = now - (STATS_DAYS - 1) * 24 * 60 * 60 * 1000;
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
409
|
+
// 列举会话要跨 DSH 版本:新版 sessionController.list() 返回 { items:[{ sessionId, updatedAt }] }
|
|
410
|
+
// (已按活动降序,字段叫 sessionId);旧版 sessionPersistence.list() 返回 [{ id, createdAt }]
|
|
411
|
+
// (字段叫 id)。旧版 persistence 还提供 inspect(),新版改成 handle-based 的 open(),
|
|
412
|
+
// 所以读取一律走已做三级兼容的 inspectPersistedSession,不再直接调 persistence.inspect。
|
|
413
|
+
let sessionIds = [];
|
|
414
|
+
let availableSessions = 0;
|
|
415
|
+
if (typeof controller?.list === "function") {
|
|
416
|
+
const listed = await controller.list({});
|
|
417
|
+
const items = Array.isArray(listed) ? listed : (listed?.items ?? []);
|
|
418
|
+
sessionIds = items.map((item) => (item && typeof item === "object" ? item.sessionId ?? item.id : void 0));
|
|
419
|
+
availableSessions = sessionIds.length;
|
|
420
|
+
} else if (typeof persistence?.list === "function") {
|
|
421
|
+
const headers = await persistence.list();
|
|
422
|
+
const list = Array.isArray(headers) ? headers : [];
|
|
423
|
+
availableSessions = list.length;
|
|
424
|
+
sessionIds = [...list]
|
|
425
|
+
.filter((header) => header && typeof header.id === "string")
|
|
426
|
+
.sort((a, b) => Number(b.createdAt ?? 0) - Number(a.createdAt ?? 0))
|
|
427
|
+
.map((header) => header.id);
|
|
428
|
+
} else {
|
|
429
|
+
throw new Error("会话持久化服务不可用");
|
|
430
|
+
}
|
|
431
|
+
const selected = sessionIds
|
|
432
|
+
.filter((id) => typeof id === "string" && id !== "")
|
|
414
433
|
.slice(0, STATS_MAX_SESSIONS);
|
|
415
434
|
const daily = new Map();
|
|
416
435
|
let cursor = 0;
|
|
@@ -418,16 +437,16 @@ async function buildUsageStats(ctx, config) {
|
|
|
418
437
|
let failedSessions = 0;
|
|
419
438
|
const worker = async () => {
|
|
420
439
|
while (cursor < selected.length) {
|
|
421
|
-
const
|
|
440
|
+
const sessionId = selected[cursor++];
|
|
422
441
|
try {
|
|
423
|
-
const inspected = await
|
|
442
|
+
const inspected = await inspectPersistedSession(ctx, sessionId);
|
|
424
443
|
collectDailyUsage(
|
|
425
444
|
inspected?.events ?? [],
|
|
426
445
|
config,
|
|
427
446
|
detectModel({ requestHeader: () => void 0, requestContext: () => void 0, events: inspected?.events ?? [] }),
|
|
428
447
|
cutoffMs,
|
|
429
448
|
daily,
|
|
430
|
-
|
|
449
|
+
sessionId,
|
|
431
450
|
);
|
|
432
451
|
scannedSessions++;
|
|
433
452
|
} catch {
|
|
@@ -468,8 +487,8 @@ async function buildUsageStats(ctx, config) {
|
|
|
468
487
|
rangeDays: STATS_DAYS,
|
|
469
488
|
scannedSessions,
|
|
470
489
|
failedSessions,
|
|
471
|
-
availableSessions
|
|
472
|
-
limited:
|
|
490
|
+
availableSessions,
|
|
491
|
+
limited: availableSessions > selected.length,
|
|
473
492
|
generatedAt: now,
|
|
474
493
|
};
|
|
475
494
|
}
|