feat: 将 dan-any 模块提取为独立工具并优化构建流程

- 在 build-forward-widget 中为 dan-any.js 添加解析和加载钩子,将其排除出 widget 捆绑包,仅保留转换功能占位
- 新增 convertDanAny 函数封装所有 dan-any 格式转换逻辑,支持 JSON/XML/Binary 输出
- 重构 danmu-util 中的格式响应函数,移除直接依赖 @dan-uni/dan-any,改为调用本地 convertDanAny
- 清理冗余导入,降低模块耦合,为后续 forward 独立部署做准备
This commit is contained in:
huangxd- committed 2026-07-26 21:53:19 +08:00
1 parent 089530f7ed
commit 22ba6dabd0
3 files changed
+65 -18

No files matched your search

+20
View File
@@ -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;
}
`
}));
}
};
+40 -2
View File
@@ -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
];
];
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;
}
+5 -16
View File
@@ -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);