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:
1 parent
089530f7ed
commit
22ba6dabd0
3 files changed
+65
-18
No files matched your search
@@ -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;
|
||||
}
|
||||
`
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user