Files
Genarrative/apps/mobile-shell/src/host-bridge/dispatch.ts
T
kdletters 65b9125d22 收口移动运行时响应边界
将 Expo host.getRuntime 成功响应包装收口到 runtime 模块

让移动 dispatch 只委托运行时请求

同步移动壳配置门禁和共享记忆
2026-06-20 01:55:58 +08:00

109 lines
3.7 KiB
TypeScript

import { type HostBridgeRequest } from '../../../../packages/shared/src/contracts/hostBridge';
import {
captureImageFile,
exportAudioFile,
exportImageFile,
exportTextFile,
importAudioFile,
importDocumentFile,
importImageFile,
importTextFile,
} from './files';
import {
type MobileHostBridgeNavigation,
failure,
ok,
unsupported,
} from './protocol';
import { resetQrScannerForTest, scanQrCode } from './scanner';
import {
openShare,
resetMobileHostBridgeShareTargetForTest,
setMobileHostBridgeShareTarget,
} from './share';
import { showMobileHostBridgeLocalNotification } from './notifications';
import {
readMobileHostBridgeClipboardText,
writeMobileHostBridgeClipboardText,
} from './clipboard';
import { runMobileHostBridgeHapticsImpact } from './haptics';
import { setMobileAppBadgeCount } from './badge';
import { getMobileHostBridgeAppearanceColorScheme } from './appearance';
import {
openMobileHostBridgeExternalUrl,
openMobileHostBridgeNativePage,
reloadMobileHostBridgeWebView,
} from './navigation';
import { getMobileHostBridgeNetworkStatus } from './network';
import { getMobileHostBridgeRuntimeResponse } from './runtime';
let navigation: MobileHostBridgeNavigation | null = null;
export function configureMobileHostBridgeNavigation(
nextNavigation: MobileHostBridgeNavigation | null,
) {
navigation = nextNavigation;
}
export async function dispatchMobileHostBridgeRequest(
request: HostBridgeRequest,
) {
switch (request.method) {
case 'host.getRuntime':
return getMobileHostBridgeRuntimeResponse(request);
case 'appearance.getColorScheme':
return getMobileHostBridgeAppearanceColorScheme(request);
case 'app.openExternalUrl':
return openMobileHostBridgeExternalUrl(request);
case 'app.reloadWebView':
return reloadMobileHostBridgeWebView(request, navigation);
case 'network.status':
return getMobileHostBridgeNetworkStatus(request);
case 'clipboard.writeText':
return writeMobileHostBridgeClipboardText(request);
case 'clipboard.readText':
return readMobileHostBridgeClipboardText(request);
case 'file.exportText':
return ok(request, await exportTextFile(request.payload));
case 'file.importText':
return ok(request, await importTextFile());
case 'file.importDocument':
return ok(request, await importDocumentFile());
case 'file.exportImage':
return ok(request, await exportImageFile(request.payload));
case 'file.importImage':
return ok(request, await importImageFile());
case 'file.captureImage':
return ok(request, await captureImageFile());
case 'scanner.scanQrCode':
return ok(request, await scanQrCode());
case 'file.importAudio':
return ok(request, await importAudioFile());
case 'file.exportAudio':
return ok(request, await exportAudioFile(request.payload));
case 'haptics.impact':
return runMobileHostBridgeHapticsImpact(request);
case 'notification.showLocal':
return showMobileHostBridgeLocalNotification(request);
case 'app.setBadgeCount':
return setMobileAppBadgeCount(request);
case 'share.open':
return openShare(request);
case 'share.setTarget':
return setMobileHostBridgeShareTarget(request);
case 'navigation.openNativePage':
return openMobileHostBridgeNativePage(request, navigation);
case 'auth.requestLogin':
case 'payment.request':
return failure(request, unsupported(request.method));
default:
return failure(request, unsupported(request.method));
}
}
export function resetMobileHostBridgeDispatchForTest() {
navigation = null;
resetMobileHostBridgeShareTargetForTest();
resetQrScannerForTest();
}