删除无用字段
This commit is contained in:
@@ -41,6 +41,7 @@ const ACTIVITY_URL = 'https://df.qq.com/cp/a20240812cdk/index.html'
|
||||
const CHROME_PATH = String(runtimeConfig.browser.chromePath || '').trim()
|
||||
const DEFAULT_LOGIN_TYPE = 'qq'
|
||||
const SESSION_TTL_MS = 30 * 60 * 1000
|
||||
export const REDEEM_SUCCESS_AUTO_CLOSE_MS = 3 * 60 * 1000
|
||||
const DEFAULT_VIEWPORT = resolveDefaultViewport()
|
||||
const SESSION_DEBUG_ENABLED = Boolean(runtimeConfig.session.debug)
|
||||
|
||||
@@ -103,6 +104,8 @@ export async function createTencentBrowserSession(payload = {}) {
|
||||
createdAt: new Date().toISOString(),
|
||||
updatedAt: new Date().toISOString(),
|
||||
expiresAt: Date.now() + SESSION_TTL_MS,
|
||||
autoCloseAt: 0,
|
||||
autoCloseTimer: null,
|
||||
sessionDir,
|
||||
browserContext,
|
||||
page,
|
||||
@@ -245,7 +248,7 @@ export async function refreshTencentBrowserSession(sessionId, { includeQrImage =
|
||||
}
|
||||
|
||||
session.updatedAt = new Date().toISOString()
|
||||
session.expiresAt = Date.now() + SESSION_TTL_MS
|
||||
session.expiresAt = resolveTencentSessionExpiresAt(session)
|
||||
|
||||
if (!session.qrImageBase64 || session.status === 'expired') {
|
||||
if (session.status === 'expired') {
|
||||
@@ -293,7 +296,9 @@ export async function redeemTencentBrowserSession(sessionId, payload = {}) {
|
||||
})
|
||||
}
|
||||
|
||||
return runTencentBrowserRedeem({
|
||||
resetTencentSessionAutoClose(session)
|
||||
|
||||
await runTencentBrowserRedeem({
|
||||
session,
|
||||
code,
|
||||
maxAttempts,
|
||||
@@ -312,6 +317,14 @@ export async function redeemTencentBrowserSession(sessionId, payload = {}) {
|
||||
saveRedeemArtifacts,
|
||||
activityUrl: ACTIVITY_URL,
|
||||
})
|
||||
|
||||
armRedeemedSessionAutoClose(session)
|
||||
await persistSessionState(session)
|
||||
|
||||
return {
|
||||
...buildSessionPayload(session),
|
||||
redeem: session.lastRedeem,
|
||||
}
|
||||
}
|
||||
|
||||
export async function closeTencentBrowserSession(sessionId) {
|
||||
@@ -611,12 +624,46 @@ async function ensureLoginTab(page, loginType) {
|
||||
}
|
||||
|
||||
function applyInitialQrSessionState(session) {
|
||||
resetTencentSessionAutoClose(session)
|
||||
session.status = 'waiting_scan'
|
||||
session.notice = `请使用${getLoginTypeLabel(session.loginType)}扫码登录`
|
||||
session.updatedAt = new Date().toISOString()
|
||||
session.expiresAt = Date.now() + SESSION_TTL_MS
|
||||
}
|
||||
|
||||
export function resolveTencentSessionExpiresAt(session, nowMs = Date.now()) {
|
||||
const autoCloseAt = Number(session?.autoCloseAt || 0)
|
||||
if (autoCloseAt > 0) {
|
||||
return autoCloseAt
|
||||
}
|
||||
|
||||
return nowMs + SESSION_TTL_MS
|
||||
}
|
||||
|
||||
function armRedeemedSessionAutoClose(session) {
|
||||
resetTencentSessionAutoClose(session)
|
||||
|
||||
const autoCloseAt = Date.now() + REDEEM_SUCCESS_AUTO_CLOSE_MS
|
||||
session.autoCloseAt = autoCloseAt
|
||||
session.expiresAt = autoCloseAt
|
||||
session.autoCloseTimer = setTimeout(() => {
|
||||
void closeSession(session, { markClosed: true }).catch(() => {
|
||||
// ignore delayed auto-close failures
|
||||
})
|
||||
}, REDEEM_SUCCESS_AUTO_CLOSE_MS)
|
||||
}
|
||||
|
||||
function resetTencentSessionAutoClose(session) {
|
||||
if (session?.autoCloseTimer) {
|
||||
clearTimeout(session.autoCloseTimer)
|
||||
session.autoCloseTimer = null
|
||||
}
|
||||
|
||||
if (session) {
|
||||
session.autoCloseAt = 0
|
||||
}
|
||||
}
|
||||
|
||||
async function extractHostState(page) {
|
||||
return page.evaluate(() => {
|
||||
const isVisible = (element) => {
|
||||
@@ -924,6 +971,7 @@ async function cleanupExpiredTencentBrowserSessions() {
|
||||
}
|
||||
|
||||
async function closeSession(session, { markClosed }) {
|
||||
resetTencentSessionAutoClose(session)
|
||||
sessions.delete(session.sessionId)
|
||||
|
||||
try {
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
|
||||
import {
|
||||
REDEEM_SUCCESS_AUTO_CLOSE_MS,
|
||||
resolveTencentSessionExpiresAt,
|
||||
} from './session.js'
|
||||
|
||||
test('resolveTencentSessionExpiresAt uses normal ttl when no auto-close is armed', () => {
|
||||
const nowMs = Date.UTC(2026, 3, 14, 9, 30, 0)
|
||||
assert.equal(
|
||||
resolveTencentSessionExpiresAt({ autoCloseAt: 0 }, nowMs),
|
||||
nowMs + (30 * 60 * 1000),
|
||||
)
|
||||
})
|
||||
|
||||
test('resolveTencentSessionExpiresAt keeps redeemed auto-close deadline once armed', () => {
|
||||
const nowMs = Date.UTC(2026, 3, 14, 9, 30, 0)
|
||||
const autoCloseAt = nowMs + REDEEM_SUCCESS_AUTO_CLOSE_MS
|
||||
|
||||
assert.equal(
|
||||
resolveTencentSessionExpiresAt({ autoCloseAt }, nowMs + 60_000),
|
||||
autoCloseAt,
|
||||
)
|
||||
})
|
||||
Reference in New Issue
Block a user