收口移动壳导入文件名归一

新增共享 HostBridge 导入文件名清洗函数

移动文件导入改用导入专用文件名归一边界

补充契约测试、移动配置门禁和协议文档
This commit is contained in:
2026-06-20 03:04:21 +08:00
parent eb869fb844
commit e2fc7d78f3
6 changed files with 46 additions and 19 deletions
+28 -4
View File
@@ -32,6 +32,7 @@ import {
HOST_BRIDGE_IMPORT_TEXT_MAX_BYTES,
HOST_BRIDGE_TEXT_MIME_TYPES,
normalizeHostBridgeExportFileName,
normalizeHostBridgeImportFileName,
} from '../../../../packages/shared/src/contracts/hostBridge';
import { invalidRequest, ok } from './protocol';
@@ -239,6 +240,17 @@ function normalizeExportedImageFileName(
: `${fileName}.${extension}`;
}
function normalizeImportedImageFileName(
rawFileName: unknown,
mimeType: HostBridgeImageMimeType,
) {
const fileName = normalizeHostBridgeImportFileName(rawFileName);
const extension = imageFileExtension(mimeType);
return fileName.toLowerCase().endsWith(`.${extension}`)
? fileName
: `${fileName}.${extension}`;
}
export async function exportTextFile(
payload: unknown,
): Promise<FileExportTextResult> {
@@ -392,7 +404,7 @@ export async function importTextFile(): Promise<FileImportTextResult> {
throw invalidRequest('text file is required');
}
const fileName = normalizeHostBridgeExportFileName(
const fileName = normalizeHostBridgeImportFileName(
asset.name || 'genarrative-import.txt',
);
const mimeType = normalizeImportedTextMimeType(asset.mimeType, fileName);
@@ -446,7 +458,7 @@ export async function importDocumentFile(): Promise<FileImportDocumentResult> {
throw invalidRequest('document file is required');
}
const fileName = normalizeHostBridgeExportFileName(
const fileName = normalizeHostBridgeImportFileName(
asset.name || 'genarrative-import-document.txt',
);
const mimeType = normalizeImportedDocumentMimeType(asset.mimeType, fileName);
@@ -603,8 +615,9 @@ function imagePickerResultToImportPayload(
return {
action,
fileName: normalizeHostBridgeExportFileName(
fileName: normalizeImportedImageFileName(
asset.fileName || fallbackImportedImageFileName(mimeType),
mimeType,
),
base64Data,
mimeType,
@@ -692,6 +705,17 @@ function normalizeExportedAudioFileName(
: `${fileName}.${extension}`;
}
function normalizeImportedAudioFileName(
rawFileName: unknown,
mimeType: HostBridgeAudioMimeType,
) {
const fileName = normalizeHostBridgeImportFileName(rawFileName);
const extension = audioFileExtension(mimeType);
return fileName.toLowerCase().endsWith(`.${extension}`)
? fileName
: `${fileName}.${extension}`;
}
function normalizeImportedAudioMimeType(
value: unknown,
fileName: string,
@@ -796,7 +820,7 @@ export async function importAudioFile(): Promise<FileImportAudioResult> {
throw invalidRequest('audio file is required');
}
const fileName = normalizeHostBridgeExportFileName(
const fileName = normalizeHostBridgeImportFileName(
asset.name || 'genarrative-import-audio.webm',
);
const mimeType = normalizeImportedAudioMimeType(asset.mimeType, fileName);