fix(bangumi-data): 修复 Bangumi Data 开启可能不触发立即下载,并调整云部署数据丢失时下载时机 - #444
Merged
Conversation
将 Bangumi Data 初始化从 worker.js 网关层整体移除,下沉为 searchBangumiData 消费路径上的按需下载触发(ensureBangumiDataReady):仅在真正读取缓存的路径 (4 源搜索/匹配/弹幕 + 全局跨季边界)触发,未配置消费源的部署(如仅 renren) 不会下载,云部署丢失内存时由数据请求重新触发。 新增 syncBangumiDataLifecycleOnConfigChange,在 USE_BANGUMI_DATA 由关到开时 立即触发一次下载、由开到关时释放缓存;接入 env-api 三处 handler 与 server.js 的 .env 监听器,覆盖前端保存与本地直接改文件两种启用路径。 修复 tmdb-util.js getTMDBChineseTitle 调用 searchBangumiData 漏写 await,使本地 Bangumi Data 中文名命中路径真实生效(此前 localMatches 为非同步 Promise、命中 恒不生效)。 移除无调用方的 ctx 参数(handleRequest 与 initBangumiData):上游在 fetch 边缘层 经数据层 ctx.waitUntil 延长后台下载,本分支将下载触发下沉至消费路径后不再深穿 ctx, 该参数及依赖它的 ctx.waitUntil 分支已无调用来源,移除以避免无调用来源的防御性代码。
下载触发下沉至消费路径后不再将 ctx 深穿至数据层,上游原本由数据层 ctx.waitUntil 延长的后台下载在边缘层失去接线,导致边缘 isolate 在响应返回后冻结会中断在途的 后台静默下载(仅影响刷新效率,不阻塞请求,靠幽灵死锁自愈兜底)。本提交改为在边缘层 暴露在途下载并延长生命周期: - initBangumiData 发起非阻塞刷新时把在途下载 Promise 写入模块级 currentBackgroundDownload, 下载完成即在 finally 中复位;新增 getBackgroundDownload 暴露该状态。 - 新增 extendBangumiDownloadLifecycle(ctx),仅在存在在途下载且运行时提供 waitUntil 时 注册,供边缘层在响应返回后延长 isolate 生命周期以容纳下载;无 ctx 的运行时自然 no-op。 - worker.js 的 Cloudflare Workers fetch 入口重新接收 ctx 参数,await handleRequest 后调用 extendBangumiDownloadLifecycle(ctx);vercel/netlify 入口无 ctx,不受影响。 - 集中下载启动逻辑为 startDownload,三处刷新分支复用,消除重复的锁与复位代码。
将 currentBackgroundDownload、activeDataSource、cachedCustomVersion 的独立注释 行改为声明末尾注释,与既有的 versionQueryPromise 风格统一;删除 data-source 组内 cachedOfficialVersion 与 versionQueryPromise 之间的多余空行,保留 cache 组与 data-source 组之间的逻辑分隔空行,使模块顶部状态声明更紧凑一致。
测试注释块第一组的 bangumi-data-util 导入仅含 ensureBangumiDataReady 与 syncBangumiDataLifecycleOnConfigChange,但同组用例还使用了 initBangumiData 与 clearBangumiDataCache,解除注释后会因未导入而 ReferenceError。getTMDBChineseTitle 与 assert 已由 worker.test.js 顶部全局导入,无需重复。补全缺失的两个符号,使该注释块 解除注释即可经 node --test 运行,并已在沙箱真实下载下验证通过。
|
@wan0ge is attempting to deploy a commit to the huangxd's projects Team on Vercel. A member of the Team first needs to authorize it. |
xingye84
added a commit
to xingye84/danmu_api
that referenced
this pull request
Aug 15, 2026
* commit '1bdb2a879e698ee6b0f90a9b5b7513ef5aba2862': fix: 修复 widget 构建中 http/https 模块兼容性及环境检测逻辑 docs: remove recommended label for Netlify deployment fix(bangumi-data): 修复 Bangumi Data 开启可能不触发立即下载,并调整云部署数据丢失时下载时机 (huangxd-#444) fix: 自定义文本类环境变量读取绕过 dotenv 注释截断以保留 # (huangxd-#443) feat: 清理缓存支持按项勾选清理 (huangxd-#441) fix(ui): UI 细节与响应式优化 (huangxd-#440) feat: 弹弹play源支持经 NipaPlay 302关联链接获取弹幕,并支持 NIPAPLAY_REPLACE_DANDAN 替代原生弹幕开关 (huangxd-#439) fix: 修复多 p 视频按总时长计算分段数导致越界请求 304 空响应 (huangxd-#438) fix(mango): 综艺纯第N期条目取消后缀过滤,直接作为正片收录 (huangxd-#437) fix(match): 修复偏好偏移计算目标集数为0时数组越界引发TypeError及400异常 (huangxd-#436) feat: 支持 IPv4/IPv6 双栈监听并优化服务器启动与清理逻辑 (huangxd-#445) # Conflicts: # danmu_api/worker.test.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
对 Bangumi Data 的下载触发时机做结构性修正,并调整边缘运行时生命周期延长机制(不再将 ctx 深穿调用栈,改为在边缘层暴露并延长在途下载),覆盖五个维度:
/search/match/danmaku请求的统一前置下载,改为在searchBangumiData消费路径顶部按需触发(ensureBangumiDataReady),仅真正读取缓存的路径(4 源搜索/匹配/弹幕 +TITLE_TO_CHINESE中文名 + 跨季 TMDB 边界)才触发;未配置消费源的部署(如仅 renren)整次请求不触碰 Bangumi Data、零下载。syncBangumiDataLifecycleOnConfigChange,USE_BANGUMI_DATA由关到开立即下载、由开到关释放缓存;接入 env-api 三处 handler(前端保存)与 server.js 的.env监听器(本地改文件),覆盖云/本地两种启用路径。getTMDBChineseTitle漏写 await:tmdb-util.js 调用searchBangumiData漏写await,本地中文名命中路径恒不生效,补await后真实生效。ctx深穿至数据层,改为暴露在途后台下载 Promise(currentBackgroundDownload),并由 worker.js 的 Cloudflare Workersfetch入口在响应返回后调用extendBangumiDownloadLifecycle(ctx)延长 isolate 生命周期,避免 Serverless 冻结中断在途刷新;无ctx的 Node/Vercel/Netlify 自然 no-op。ctx参数与 let 声明整理:下载触发下沉后ctx不再深穿数据层,移除handleRequest/initBangumiData的ctx参数(生命周期延长改在边缘层处理);模块级let声明整理为末尾注释并合并组内空行(保留分组分隔),无功能变化。改动明细
1. 移除网关层统一前置下载,下沉按需下载至消费路径
上游原版行为:worker.js 的 Cloudflare Workers
fetch入口在每次请求(含/search/match/danmaku)进入handleRequest时,依据 path 是否含这些路径计算isDataDependentRequest,并在globals.useBangumiData为真时无条件await initBangumiData(deployPlatform, isDataDependentRequest, ctx)。即任一数据相关请求都会触发下载判断,且ctx一路透传到initBangumiData用于waitUntil。改动后行为:移除
handleRequest内的全局前置下载;initBangumiData的ctx参数一并移除。新增ensureBangumiDataReady(deployPlatform):if (!globals.useBangumiData) return; await initBangumiData(deployPlatform, true);,仅置于searchBangumiData顶部。只有真正读取 Bangumi Data 缓存的路径(4 源搜索/匹配/弹幕 +getTMDBChineseTitle+getTmdbSeasonBoundaries)才进入下载判定;未配置任何消费源的部署(如仅 renren)整次请求不碰 Bangumi Data、零下载。实际观察:
2. 配置变更同步下载生命周期(syncBangumiDataLifecycleOnConfigChange)
上游原版行为:server.js 的
.env监听器仅在检测到USE_BANGUMI_DATA为false时调用clearBangumiDataCache(true)释放缓存;无「由关到开」的下载触发。前端 env-api 保存环境变量时完全不触碰 Bangumi Data 生命周期。改动后行为:新增
syncBangumiDataLifecycleOnConfigChange(deployPlatform):开关开启时initBangumiData(deployPlatform, true).catch(console.error)(已缓存则幂等、离线 catch 不影响),关闭时clearBangumiDataCache(true)。接入 env-api 三处 handler(handleSetEnv/handleAddEnv/handleDelEnv,均在result成功且key === 'USE_BANGUMI_DATA'时调用)与 server.js 监听器(先globals.useBangumiData = bangumiEnabled同步内存开关,再调 sync,避免重载未刷新 globals 时状态滞后)。实际观察:
3. 修复 getTMDBChineseTitle 漏写 await
上游原版行为:tmdb-util.js
getTMDBChineseTitle中const localMatches = searchBangumiData(...)漏写await,searchBangumiData为 async,localMatches实际为未 resolve 的 Promise,后续localMatches && localMatches.length > 0恒为真(Promise 为 truthy)但localMatches[0]为 undefined,命中路径从未真正生效。改动后行为:补
await,localMatches为真实数组,命中逻辑生效。实际观察:
4. 暴露在途下载并由边缘运行时延长生命周期(ctx.waitUntil)
上游原版行为:worker.js 的 Cloudflare Workers
fetch入口将ctx透传至handleRequest→initBangumiData,由数据层在下载发起处调用ctx.waitUntil(downloadPromise)延长后台下载的生命周期。改动后行为:
initBangumiData发起非阻塞刷新时经startDownload将 Promise 写入模块级currentBackgroundDownload,下载完成在.finally复位;新增getBackgroundDownload暴露该状态、extendBangumiDownloadLifecycle(ctx)仅在存在在途且运行时提供waitUntil时注册。worker.js 的 Cloudflare Workersfetch入口接收ctx参数,await handleRequest后调用extendBangumiDownloadLifecycle(ctx);Vercel/Netlify 入口无ctx,不受影响。实际观察:
5. 清理死参数与 let 声明整理
上游原版行为:
handleRequest(req, env, deployPlatform, clientIp, ctx)与initBangumiData(deployPlatform, isDataDependentRequest, ctx)携带ctx参数,用于数据层直接调用ctx.waitUntil延长后台下载生命周期。改动后行为:移除两处
ctx参数及initBangumiData内依赖ctx的waitUntil分支(下载生命周期延长改由extendBangumiDownloadLifecycle在边缘层处理)。模块级let声明整理为末尾注释并合并组内空行(保留分组分隔),无功能变化。实际观察:
实际案例
下沉按需下载前:云部署内存丢失导致每次访问前端都触发下载
某 Cloudflare Workers 部署启用了
USE_BANGUMI_DATA=true,但仅挂载 renren 源(未配置任何消费源)。上游原版在网关层对每次/search/match/danmaku请求无条件await initBangumiData(deployPlatform, isDataDependentRequest, ctx):.cache磁盘挂载),isolate 被平台冻结后memoryCache丢失;memoryCache为空且isDataDependentRequest=true,触发一次完整网络下载并阻塞等待;后果:用户每次访问前端、且落在冷 isolate 上时,都要等待一次完整下载才返回,延迟明显;同时对被冻结后反复重建的 isolate,上游 CDN 也承受不必要的请求压力。本分支将下载触发下沉至消费路径后,仅真正读取缓存的路径触发下载,未配置消费源的部署(仅 renren)零下载,热路径内存命中秒回,过期仅后台刷新不阻塞,从根本上消除该问题。
影响范围
waitUntil延长(机制由数据层深穿改为边缘层暴露)USE_BANGUMI_DATAextendBangumiDownloadLifecycle自然 no-op,无回归getTMDBChineseTitle(TITLE_TO_CHINESE开启)涉及文件
danmu_api/utils/bangumi-data-util.jsensureBangumiDataReady/syncBangumiDataLifecycleOnConfigChange/getBackgroundDownload/extendBangumiDownloadLifecycle/startDownload;initBangumiData移除ctx参数、三处刷新分支复用startDownload;searchBangumiData顶部await ensureBangumiDataReady;let声明整理danmu_api/apis/env-api.jshandleSetEnv/handleAddEnv/handleDelEnv在保存成功后对USE_BANGUMI_DATA调syncBangumiDataLifecycleOnConfigChangedanmu_api/server.js.env监听器改为先同步globals.useBangumiData再调syncBangumiDataLifecycleOnConfigChange('node');import 调整danmu_api/utils/tmdb-util.jsgetTMDBChineseTitle补await searchBangumiDatadanmu_api/worker.jshandleRequest内全局前置下载及其ctx参数;Cloudflare Workersfetch接收ctx并在响应后调extendBangumiDownloadLifecycle(边缘层延长在途下载,不再深穿数据层)danmu_api/worker.test.js