fix: node18兼容

This commit is contained in:
ElyPrism 2026-08-07 12:01:11 +08:00
parent c4a3d83abe
commit 98a95002b2
No known key found for this signature in database

View File

@ -5,15 +5,9 @@
// GET /register/checktoken/v2 → 实时获取新 token不缓存 // GET /register/checktoken/v2 → 实时获取新 token不缓存
// POST /register/checktoken/v2 → 实时获取新 token // POST /register/checktoken/v2 → 实时获取新 token
// //
// 原理:加载 tool.min.js 初始化 Watchman
// 再调用 wm.getToken(businessId) 拿 token。watchman 内部会 POST /v3/d + /v3/b
// 并携带加密的设备指纹与签名,无法用普通 HTTP 复刻,故走完整 SDK。
//
// 注意:每次获取都不缓存,模拟真实客户端每次请求使用新鲜 token // 注意:每次获取都不缓存,模拟真实客户端每次请求使用新鲜 token
// 避免反作弊 token 复用触发风控。 // 避免反作弊 token 复用触发风控。
// //
const { JSDOM, VirtualConsole } = require('jsdom')
const { default: axios } = require('axios') const { default: axios } = require('axios')
const { APP_CONF } = require('../util/config.json') const { APP_CONF } = require('../util/config.json')
const logger = require('../util/logger') const logger = require('../util/logger')
@ -30,6 +24,15 @@ const HTML =
let toolJs = '' let toolJs = ''
let wm = null // Watchman 实例(进程内复用,可反复 getToken let wm = null // Watchman 实例(进程内复用,可反复 getToken
let initPromise = null let initPromise = null
let jsdomModulePromise = null
// jsdom 的依赖链包含纯 ESM 包(@exodus/bytes旧版 Node 无法 require() ESM
function getJSDOM() {
if (!jsdomModulePromise) {
jsdomModulePromise = import('jsdom')
}
return jsdomModulePromise
}
// 获取 tool.min.js内存缓存避免每次初始化重复下载 // 获取 tool.min.js内存缓存避免每次初始化重复下载
async function getToolJs() { async function getToolJs() {
@ -46,6 +49,7 @@ async function ensureWatchman() {
initPromise = (async () => { initPromise = (async () => {
const js = await getToolJs() const js = await getToolJs()
const { JSDOM, VirtualConsole } = await getJSDOM()
const virtualConsole = new VirtualConsole() const virtualConsole = new VirtualConsole()
virtualConsole.on('jsdomError', () => {}) virtualConsole.on('jsdomError', () => {})
const dom = new JSDOM(HTML, { const dom = new JSDOM(HTML, {
@ -94,7 +98,6 @@ async function ensureWatchman() {
try { try {
return await initPromise return await initPromise
} catch (e) { } catch (e) {
// 初始化失败后允许下次重试
initPromise = null initPromise = null
wm = null wm = null
throw e throw e
@ -119,7 +122,6 @@ module.exports = async () => {
try { try {
token = await fetchToken() token = await fetchToken()
} catch (e) { } catch (e) {
// token 获取失败时返回空,由调用方决定是否重试
logger.warn('[checkToken v2]', e.message) logger.warn('[checkToken v2]', e.message)
} }
return { return {