Files
mactfs/mactfsui/app/lib/electron/bridge.ts
T

111 lines
2.7 KiB
TypeScript

import type { MactfsBridge, ServiceStatus } from "./types"
const DEFAULT_BASE_URL = "http://127.0.0.1:38765"
/**
* 获取 Electron 暴露的 window.mactfs 桥接对象,非 Electron 环境(含 SSR)返回 null。
*/
export function getBridge(): MactfsBridge | null {
if (typeof window === "undefined") {
return null
}
return window.mactfs ?? null
}
/**
* 判断当前是否运行在 Electron 桥接环境中。
*/
export function isElectron(): boolean {
return getBridge() != null
}
/**
* 获取本地 API 基础地址,非 Electron 环境回退到默认本地地址。
*/
export async function getApiBaseUrl(): Promise<string> {
const bridge = getBridge()
if (!bridge) {
return DEFAULT_BASE_URL
}
return bridge.getApiBaseUrl()
}
/**
* 获取本地服务 Bearer Token,非 Electron 环境返回 null。
*/
export async function getToken(): Promise<string | null> {
const bridge = getBridge()
if (!bridge) {
return null
}
return bridge.getToken()
}
/**
* 查询本地服务状态,非 Electron 环境返回未就绪状态并说明原因。
*/
export async function getServiceStatus(): Promise<ServiceStatus> {
const bridge = getBridge()
if (!bridge) {
return unavailableStatus()
}
return bridge.getServiceStatus()
}
/**
* 拉起并等待本地服务就绪,非 Electron 环境返回未就绪状态并说明原因。
*/
export async function startService(): Promise<ServiceStatus> {
const bridge = getBridge()
if (!bridge) {
return unavailableStatus()
}
return bridge.startService()
}
/**
* 打开系统目录选择器,非 Electron 环境返回 null。
*/
export async function selectDirectory(): Promise<string | null> {
const bridge = getBridge()
if (!bridge) {
return null
}
return bridge.selectDirectory()
}
/**
* 批量检测本地绝对路径是否存在,非 Electron 环境返回 null 表示无法检测。
*/
export async function pathsExist(paths: string[]): Promise<Record<string, boolean> | null> {
const bridge = getBridge()
if (!bridge || paths.length === 0) {
return bridge ? {} : null
}
return bridge.pathsExist(paths)
}
/**
* 在访达中打开本地路径(目录直接进入,文件定位选中),非 Electron 环境返回 false。
*/
export async function revealPath(targetPath: string, isFolder: boolean): Promise<boolean> {
const bridge = getBridge()
if (!bridge) {
return false
}
return bridge.revealPath(targetPath, isFolder)
}
/**
* 构造非 Electron 环境下的占位服务状态。
*/
function unavailableStatus(): ServiceStatus {
return {
running: false,
baseUrl: DEFAULT_BASE_URL,
tokenAvailable: false,
health: null,
error: "当前不在 Electron 桌面环境,无法访问本地服务",
}
}