diff --git a/apps/backend/src/services/session/session-proof.js b/apps/backend/src/services/session/session-proof.ts similarity index 68% rename from apps/backend/src/services/session/session-proof.js rename to apps/backend/src/services/session/session-proof.ts index 1d89df16..c132ce44 100644 --- a/apps/backend/src/services/session/session-proof.js +++ b/apps/backend/src/services/session/session-proof.ts @@ -1,10 +1,9 @@ -// @ts-nocheck - import fs from 'node:fs/promises' import { BAIDU_BEIJING_TIME_URL, DEFAULT_REDEEM_PROOF_MODE, + type RedeemProofMode, } from './session-proof-constants.js' import { captureBeijingTimeProof } from './session-proof-beijing-time.js' import { showResultDialog, composeProofScreenshot } from './session-proof-renderer.js' @@ -12,6 +11,63 @@ import { resolveRedeemProofMode, shouldCaptureBeijingTimeProof } from './session import { buildArtifactPaths } from './session-proof-paths.js' import { writeRedeemResultFile } from './session-proof-result-writer.js' +type BrowserPageLike = { + evaluate: (callback: any, arg?: unknown) => Promise + waitForTimeout: (milliseconds: number) => Promise + setViewportSize: (viewport: { width: number; height: number }) => Promise + setContent: (html: string, options?: { waitUntil?: string }) => Promise + goto: (url: string, options?: { waitUntil?: string }) => Promise + screenshot: (options: { + path: string + fullPage?: boolean + clip?: { x: number; y: number; width: number; height: number } + }) => Promise + content: () => Promise + close: () => Promise +} + +type BrowserContextLike = { + newPage: () => Promise +} + +type RedeemFinalResult = { + role?: { + area?: string + } + classification?: { + success?: boolean + } + redeem?: { + iRet?: number | string + ret?: number | string + sMsg?: string + } + [key: string]: unknown +} + +type RedeemArtifactsInput = { + browserContext: BrowserContextLike + page: BrowserPageLike + sessionDir: string + sessionId?: string + activityUrl: string + code: string + finalResult: RedeemFinalResult + attempts?: unknown[] +} + +type WriteRedeemArtifactFilesInput = Omit & { + outputDir: string + proofMode?: RedeemProofMode | string +} + +type RedeemArtifactsResult = { + proofMode: RedeemProofMode + screenshotPath: string + htmlPath: string + resultPath: string +} + export async function saveRedeemArtifacts({ browserContext, page, @@ -21,7 +77,7 @@ export async function saveRedeemArtifacts({ code, finalResult, attempts, -}) { +}: RedeemArtifactsInput): Promise { return writeRedeemArtifactFiles({ browserContext, page, @@ -45,7 +101,7 @@ export async function writeRedeemArtifactFiles({ finalResult, attempts, proofMode = DEFAULT_REDEEM_PROOF_MODE, -}) { +}: WriteRedeemArtifactFilesInput): Promise { const effectiveProofMode = resolveRedeemProofMode(proofMode) const { redeemPageScreenshotPath, @@ -88,7 +144,11 @@ export async function writeRedeemArtifactFiles({ await page.screenshot({ path: redeemPageScreenshotPath, fullPage: true }) - let beijingTimeProof = { + let beijingTimeProof: { + screenshotPath: string + pageUrl: string + error?: string + } = { screenshotPath: '', pageUrl: BAIDU_BEIJING_TIME_URL, error: '', diff --git a/docs/backend-typescript-migration-plan.md b/docs/backend-typescript-migration-plan.md index 5b2f5c47..95321827 100644 --- a/docs/backend-typescript-migration-plan.md +++ b/docs/backend-typescript-migration-plan.md @@ -418,6 +418,14 @@ - `npm run typecheck` - `npm run build` - `npm test` 共 139 个用例通过 +80. 腾讯浏览器会话 proof 总编排迁移到 `.ts`: + - `src/services/session/session-proof.ts` +81. 兑换凭证保存入口、基础 / 完整 proof 分支、北京时间截图降级路径、artifact 返回值已显式类型化 +82. Docker 内验证通过: + - `src/services/session/session-proof.test.js` 共 4 个用例通过 + - `npm run typecheck` + - `npm run build` + - `npm test` 共 139 个用例通过 ## 下一步建议