去掉游戏sha256

This commit is contained in:
zhx 2026-06-09 15:13:03 +08:00
parent 4e56597adb
commit 7740d611b6
3 changed files with 8 additions and 134 deletions

View File

@ -51,12 +51,6 @@ const defaultPlatformForm = {
const defaultBridgeScriptForm = { const defaultBridgeScriptForm = {
bridgeScriptUrl: "", bridgeScriptUrl: "",
bridgeScriptVersion: "", bridgeScriptVersion: "",
bridgeScriptSha256: "",
};
const defaultBridgeHashState = {
loading: false,
error: "",
}; };
const emptyCatalog = { items: [], pageSize: 50 }; const emptyCatalog = { items: [], pageSize: 50 };
@ -81,7 +75,6 @@ export function useGamesPage() {
const [gameForm, setGameForm] = useState(defaultGameForm); const [gameForm, setGameForm] = useState(defaultGameForm);
const [platformForm, setPlatformForm] = useState(defaultPlatformForm); const [platformForm, setPlatformForm] = useState(defaultPlatformForm);
const [bridgeScriptForm, setBridgeScriptForm] = useState(defaultBridgeScriptForm); const [bridgeScriptForm, setBridgeScriptForm] = useState(defaultBridgeScriptForm);
const [bridgeHashState, setBridgeHashState] = useState(defaultBridgeHashState);
const [loadingAction, setLoadingAction] = useState(""); const [loadingAction, setLoadingAction] = useState("");
const [syncPlatform, setSyncPlatform] = useState(null); const [syncPlatform, setSyncPlatform] = useState(null);
const [syncCandidates, setSyncCandidates] = useState([]); const [syncCandidates, setSyncCandidates] = useState([]);
@ -217,7 +210,6 @@ export function useGamesPage() {
const openBridgeScript = () => { const openBridgeScript = () => {
setBridgeScriptForm(bridgeScriptFormFromPlatforms(platformData.items || [])); setBridgeScriptForm(bridgeScriptFormFromPlatforms(platformData.items || []));
setBridgeHashState(defaultBridgeHashState);
setActiveAction("bridge-script"); setActiveAction("bridge-script");
}; };
@ -235,78 +227,12 @@ export function useGamesPage() {
} }
if (activeAction === "bridge-script") { if (activeAction === "bridge-script") {
setBridgeScriptForm(defaultBridgeScriptForm); setBridgeScriptForm(defaultBridgeScriptForm);
setBridgeHashState(defaultBridgeHashState);
} }
setActiveAction(""); setActiveAction("");
setEditingGameId(""); setEditingGameId("");
setEditingPlatformCode(""); setEditingPlatformCode("");
}; };
const refreshBridgeScriptHash = useCallback(async () => {
const url = bridgeScriptForm.bridgeScriptUrl.trim();
if (activeAction !== "bridge-script" || url === "") {
return "";
}
setBridgeHashState({ loading: true, error: "" });
try {
const hash = await calculateBridgeScriptSha256(url);
setBridgeScriptForm((current) => {
if (current.bridgeScriptUrl.trim() !== url) {
return current;
}
return { ...current, bridgeScriptSha256: hash };
});
setBridgeHashState(defaultBridgeHashState);
return hash;
} catch (err) {
const message = err.message || "生成 SHA256 失败";
setBridgeHashState({ loading: false, error: message });
showToast(message, "error");
return "";
}
}, [activeAction, bridgeScriptForm.bridgeScriptUrl, showToast]);
useEffect(() => {
if (activeAction !== "bridge-script") {
return undefined;
}
const url = bridgeScriptForm.bridgeScriptUrl.trim();
const version = bridgeScriptForm.bridgeScriptVersion.trim();
if (!url || !version) {
setBridgeScriptForm((current) =>
current.bridgeScriptSha256 ? { ...current, bridgeScriptSha256: "" } : current,
);
setBridgeHashState(defaultBridgeHashState);
return undefined;
}
let cancelled = false;
const timer = window.setTimeout(async () => {
setBridgeHashState({ loading: true, error: "" });
try {
const hash = await calculateBridgeScriptSha256(url);
if (cancelled) {
return;
}
setBridgeScriptForm((current) => {
if (current.bridgeScriptUrl.trim() !== url || current.bridgeScriptVersion.trim() !== version) {
return current;
}
return { ...current, bridgeScriptSha256: hash };
});
setBridgeHashState(defaultBridgeHashState);
} catch (err) {
if (cancelled) {
return;
}
setBridgeHashState({ loading: false, error: err.message || "生成 SHA256 失败" });
}
}, 500);
return () => {
cancelled = true;
window.clearTimeout(timer);
};
}, [activeAction, bridgeScriptForm.bridgeScriptUrl, bridgeScriptForm.bridgeScriptVersion]);
const submitGame = async (event) => { const submitGame = async (event) => {
event.preventDefault(); event.preventDefault();
const payload = gamePayload(gameForm); const payload = gamePayload(gameForm);
@ -361,13 +287,6 @@ export function useGamesPage() {
showToast("请填写 bridge_script_url 和 bridge_script_version", "error"); showToast("请填写 bridge_script_url 和 bridge_script_version", "error");
return; return;
} }
let bridgeScriptSha256 = bridgeScriptForm.bridgeScriptSha256.trim();
if (!bridgeScriptSha256) {
bridgeScriptSha256 = await refreshBridgeScriptHash();
}
if (!bridgeScriptSha256) {
return;
}
setLoadingAction("bridge-script"); setLoadingAction("bridge-script");
try { try {
await Promise.all( await Promise.all(
@ -375,10 +294,13 @@ export function useGamesPage() {
const config = parseJsonObject(platform.adapterConfigJson); const config = parseJsonObject(platform.adapterConfigJson);
config.bridge_script_url = bridgeScriptUrl; config.bridge_script_url = bridgeScriptUrl;
config.bridge_script_version = bridgeScriptVersion; config.bridge_script_version = bridgeScriptVersion;
config.bridge_script_sha256 = bridgeScriptSha256;
delete config.bridgeScriptUrl; delete config.bridgeScriptUrl;
delete config.bridgeScriptVersion; delete config.bridgeScriptVersion;
delete config.bridge_script_sha256;
delete config.bridgeScriptSha256; delete config.bridgeScriptSha256;
delete config.bridge_script_hash;
delete config.script_sha256;
delete config.scriptSha256;
return upsertGamePlatform( return upsertGamePlatform(
platformUpsertPayload(platform, JSON.stringify(config, null, 2)), platformUpsertPayload(platform, JSON.stringify(config, null, 2)),
platform.platformCode, platform.platformCode,
@ -518,7 +440,6 @@ export function useGamesPage() {
abilities, abilities,
activeAction, activeAction,
allSyncGamesSelected, allSyncGamesSelected,
bridgeHashState,
bridgeScriptForm, bridgeScriptForm,
changeGameStatus, changeGameStatus,
deleteGame, deleteGame,
@ -550,7 +471,6 @@ export function useGamesPage() {
platformForm, platformForm,
platformOptions, platformOptions,
loadNextPage, loadNextPage,
refreshBridgeScriptHash,
reload: reloadCatalog, reload: reloadCatalog,
resetFilters, resetFilters,
resolveGameURL, resolveGameURL,
@ -592,16 +512,13 @@ function bridgeScriptFormFromPlatform(platform) {
return { return {
bridgeScriptUrl: readConfigString(config.bridge_script_url ?? config.bridgeScriptUrl), bridgeScriptUrl: readConfigString(config.bridge_script_url ?? config.bridgeScriptUrl),
bridgeScriptVersion: readConfigString(config.bridge_script_version ?? config.bridgeScriptVersion), bridgeScriptVersion: readConfigString(config.bridge_script_version ?? config.bridgeScriptVersion),
bridgeScriptSha256: readConfigString(
config.bridge_script_sha256 ?? config.bridgeScriptSha256 ?? config.bridge_script_hash,
),
}; };
} }
function bridgeScriptFormFromPlatforms(platforms) { function bridgeScriptFormFromPlatforms(platforms) {
for (const platform of platforms) { for (const platform of platforms) {
const form = bridgeScriptFormFromPlatform(platform); const form = bridgeScriptFormFromPlatform(platform);
if (form.bridgeScriptUrl || form.bridgeScriptVersion || form.bridgeScriptSha256) { if (form.bridgeScriptUrl || form.bridgeScriptVersion) {
return form; return form;
} }
} }
@ -629,21 +546,6 @@ function platformUpsertPayload(platform, adapterConfigJson) {
}; };
} }
async function calculateBridgeScriptSha256(url) {
if (!window.crypto?.subtle) {
throw new Error("当前浏览器不支持 SHA256 计算");
}
const response = await fetch(url, { cache: "no-store" });
if (!response.ok) {
throw new Error(`拉取 JS 失败HTTP ${response.status}`);
}
const buffer = await response.arrayBuffer();
const digest = await window.crypto.subtle.digest("SHA-256", buffer);
return Array.from(new Uint8Array(digest))
.map((byte) => byte.toString(16).padStart(2, "0"))
.join("");
}
async function saveGameUrl(platforms, game, gameUrl) { async function saveGameUrl(platforms, game, gameUrl) {
const platform = platforms.find((item) => item.platformCode === game.platformCode); const platform = platforms.find((item) => item.platformCode === game.platformCode);
if (!platform) { if (!platform) {

View File

@ -435,15 +435,8 @@ function GameFormDialog({ form, loading, mode, open, page, onClose, onSubmit })
} }
function BridgeScriptDialog({ form, loading, open, page, onClose, onSubmit }) { function BridgeScriptDialog({ form, loading, open, page, onClose, onSubmit }) {
const hashState = page.bridgeHashState || {};
const disabled = !page.abilities.canUpdate; const disabled = !page.abilities.canUpdate;
const submitDisabled = const submitDisabled = disabled || loading || !form.bridgeScriptUrl.trim() || !form.bridgeScriptVersion.trim();
disabled ||
loading ||
hashState.loading ||
!form.bridgeScriptUrl.trim() ||
!form.bridgeScriptVersion.trim() ||
!form.bridgeScriptSha256.trim();
return ( return (
<AdminFormDialog <AdminFormDialog
disabled={disabled} disabled={disabled}
@ -455,17 +448,7 @@ function BridgeScriptDialog({ form, loading, open, page, onClose, onSubmit }) {
onClose={onClose} onClose={onClose}
onSubmit={onSubmit} onSubmit={onSubmit}
> >
<AdminFormSection <AdminFormSection title="通用桥接脚本">
title="通用桥接脚本"
actions={
<Button
disabled={disabled || hashState.loading || !form.bridgeScriptUrl.trim()}
onClick={page.refreshBridgeScriptHash}
>
{hashState.loading ? "生成中..." : "重新生成 SHA256"}
</Button>
}
>
<AdminFormFieldGrid columns="repeat(2, minmax(0, 1fr))"> <AdminFormFieldGrid columns="repeat(2, minmax(0, 1fr))">
<TextField <TextField
label="bridge_script_version" label="bridge_script_version"
@ -484,17 +467,6 @@ function BridgeScriptDialog({ form, loading, open, page, onClose, onSubmit }) {
value={form.bridgeScriptUrl} value={form.bridgeScriptUrl}
onChange={(event) => page.setBridgeScriptForm({ ...form, bridgeScriptUrl: event.target.value })} onChange={(event) => page.setBridgeScriptForm({ ...form, bridgeScriptUrl: event.target.value })}
/> />
<TextField
className={styles.fullField}
error={Boolean(hashState.error)}
helperText={hashState.error || (hashState.loading ? "正在拉取 JS 并计算 SHA256" : "")}
label="bridge_script_sha256"
required
value={form.bridgeScriptSha256}
onChange={(event) =>
page.setBridgeScriptForm({ ...form, bridgeScriptSha256: event.target.value })
}
/>
</AdminFormFieldGrid> </AdminFormFieldGrid>
</AdminFormSection> </AdminFormSection>
</AdminFormDialog> </AdminFormDialog>

View File

@ -6,7 +6,7 @@
"module": "ESNext", "module": "ESNext",
"moduleResolution": "Bundler", "moduleResolution": "Bundler",
"noEmit": true, "noEmit": true,
"ignoreDeprecations": "6.0", "ignoreDeprecations": "5.0",
"resolveJsonModule": true, "resolveJsonModule": true,
"skipLibCheck": true, "skipLibCheck": true,
"strict": true, "strict": true,