diff --git a/build-forward-widget.js b/build-forward-widget.js index 0c44487..dcb764e 100644 --- a/build-forward-widget.js +++ b/build-forward-widget.js @@ -46,6 +46,16 @@ const outputFile = debugBuild ? 'dist/logvar-danmu.debug.js' : 'dist/logvar-danm const forwardRuntimeCompatPlugin = { name: 'forward-runtime-compat', setup(build) { + const danAnyModulePath = path.resolve('danmu_api/utils/dan-any.js'); + + // Forward only consumes the native JSON/XML response paths. Keep dan-any + // available to the server while removing it and its transitive dependencies + // from the standalone widget bundle. + build.onResolve({ filter: /(?:^|[\\/])dan-any\.js$/ }, (args) => { + if (path.resolve(args.resolveDir, args.path) !== danAnyModulePath) return; + return { path: 'dan-any', namespace: 'forward-optional-modules' }; + }); + build.onResolve({ filter: /^node:async_hooks$/ }, () => ({ path: 'async-hooks', namespace: 'forward-node-builtins' @@ -82,6 +92,16 @@ const forwardRuntimeCompatPlugin = { } ` })); + + build.onLoad({ filter: /^dan-any$/, namespace: 'forward-optional-modules' }, () => ({ + loader: 'js', + contents: ` + export const danAnyFormats = []; + export function convertDanAny() { + return null; + } + ` + })); } }; diff --git a/danmu_api/utils/dan-any.js b/danmu_api/utils/dan-any.js index 4f3dca0..1cfdbc0 100644 --- a/danmu_api/utils/dan-any.js +++ b/danmu_api/utils/dan-any.js @@ -1,4 +1,23 @@ -import { ArtplayerMetadata, BahaMetadata, BiliXmlMetadata, DanuniJsonMetadata, DanuniPbMetadata, DdplayMetadata, DplayerMetadata, VodMetadata } from '@dan-uni/dan-any/adapters'; +import { UniDB } from '@dan-uni/dan-any/core/main/pure'; +import { + ArtplayerMetadata, + ArtplayerTransformer, + BahaMetadata, + BahaTransformer, + BiliXmlMetadata, + BiliXmlTransformerConfigurator, + DanuniJsonMetadata, + DanuniJsonTransformerConfigurator, + DanuniPbMetadata, + DanuniPbTransformer, + DdplayAdapter, + DdplayMetadata, + DdplayTransformer, + DplayerMetadata, + DplayerTransformer, + VodMetadata, + VodTransformer +} from '@dan-uni/dan-any/adapters'; export const danAnyFormats = [ ArtplayerMetadata.type, @@ -9,4 +28,23 @@ export const danAnyFormats = [ DdplayMetadata.type, DplayerMetadata.type, VodMetadata.type -]; \ No newline at end of file +]; + +const danAnyDb = new UniDB(); +const danAnyUdb = danAnyDb.init(); + +export function convertDanAny(danmuData, format) { + const chunk = danAnyUdb.makeChunk({ tmp: true }); + chunk.import(DdplayAdapter(danmuData)); + + if (format === VodMetadata.type) return { type: 'json', data: chunk.export(VodTransformer) }; + if (format === BahaMetadata.type) return { type: 'json', data: chunk.export(BahaTransformer) }; + if (format === DdplayMetadata.type) return { type: 'json', data: chunk.export(DdplayTransformer) }; + if (format === BiliXmlMetadata.type) return { type: 'xml', data: chunk.export(BiliXmlTransformerConfigurator()) }; + if (format === DplayerMetadata.type) return { type: 'json', data: chunk.export(DplayerTransformer) }; + if (format === DanuniPbMetadata.type) return { type: 'binary', data: chunk.export(DanuniPbTransformer), filename: 'danuni.binpb' }; + if (format === ArtplayerMetadata.type) return { type: 'json', data: chunk.export(ArtplayerTransformer) }; + if (format === DanuniJsonMetadata.type) return { type: 'json', data: chunk.export(DanuniJsonTransformerConfigurator()) }; + + return null; +} diff --git a/danmu_api/utils/danmu-util.js b/danmu_api/utils/danmu-util.js index 3db0028..c810563 100644 --- a/danmu_api/utils/danmu-util.js +++ b/danmu_api/utils/danmu-util.js @@ -2,8 +2,7 @@ import { globals } from '../configs/globals.js'; import { log } from './log-util.js' import { binResponse, jsonResponse, xmlResponse } from "./http-util.js"; import { traditionalized } from './zh-util.js'; -import { UniDB } from "@dan-uni/dan-any/core/main/pure"; -import { ArtplayerMetadata, ArtplayerTransformer, BahaMetadata, BahaTransformer, BiliXmlMetadata, BiliXmlTransformerConfigurator, DanuniJsonMetadata, DanuniJsonTransformerConfigurator, DanuniPbMetadata, DanuniPbTransformer, DdplayAdapter, DdplayMetadata, DdplayTransformer, DplayerMetadata, DplayerTransformer, VodMetadata, VodTransformer } from '@dan-uni/dan-any/adapters'; +import { convertDanAny } from './dan-any.js'; // ===================== // danmu处理相关函数 @@ -490,9 +489,6 @@ function escapeXmlText(str) { .replace(/>/g, '>'); } -const tmp_da_db = new UniDB() -const tmp_da_udb = tmp_da_db.init() - // 根据格式参数返回弹幕数据 export function formatDanmuResponse(danmuData, queryFormat) { // 确定最终使用的格式:查询参数 > 环境变量 > 默认值 @@ -513,17 +509,10 @@ export function formatDanmuResponse(danmuData, queryFormat) { } } else if (format === 'json') return jsonResponse(danmuData); - // 转换为 @dan-uni/dan-any 支持的格式 - const chunk = tmp_da_udb.makeChunk({ tmp: true }) - chunk.import(DdplayAdapter(danmuData)) - if (format === VodMetadata.type) return jsonResponse(chunk.export(VodTransformer)) - else if (format === BahaMetadata.type) return jsonResponse(chunk.export(BahaTransformer)) - else if (format === DdplayMetadata.type) return jsonResponse(chunk.export(DdplayTransformer)) - else if (format === BiliXmlMetadata.type) return xmlResponse(chunk.export(BiliXmlTransformerConfigurator())) - else if (format === DplayerMetadata.type) return jsonResponse(chunk.export(DplayerTransformer)) - else if (format === DanuniPbMetadata.type) return binResponse(chunk.export(DanuniPbTransformer), 'danuni.binpb') - else if (format === ArtplayerMetadata.type) return jsonResponse(chunk.export(ArtplayerTransformer)) - else if (format === DanuniJsonMetadata.type) return jsonResponse(chunk.export(DanuniJsonTransformerConfigurator())) + const converted = convertDanAny(danmuData, format); + if (converted?.type === 'json') return jsonResponse(converted.data); + if (converted?.type === 'xml') return xmlResponse(converted.data); + if (converted?.type === 'binary') return binResponse(converted.data, converted.filename); // 默认返回 JSON return jsonResponse(danmuData);