fix: avoid batch upload storage crash
This commit is contained in:
parent
f99ca7e49d
commit
3a4aece308
@ -54,6 +54,7 @@ const BATCH_REQUEST_STAGGER_MS = 700;
|
|||||||
const BATCH_PARALLEL_WORKER_COUNT = 4;
|
const BATCH_PARALLEL_WORKER_COUNT = 4;
|
||||||
const MULTI_PRODUCT_FAILOVER_MAX_ROUNDS = 5;
|
const MULTI_PRODUCT_FAILOVER_MAX_ROUNDS = 5;
|
||||||
const MULTI_PRODUCT_FAILOVER_RETRY_DELAY_MS = 1500;
|
const MULTI_PRODUCT_FAILOVER_RETRY_DELAY_MS = 1500;
|
||||||
|
const PERSISTED_IMAGE_MAX_LENGTH = 200_000;
|
||||||
|
|
||||||
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
||||||
|
|
||||||
@ -104,6 +105,72 @@ type SceneFusionPersistedState = {
|
|||||||
selectedResultIds: string[];
|
selectedResultIds: string[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function isPersistableImageValue(value: unknown): value is string {
|
||||||
|
if (typeof value !== "string") return false;
|
||||||
|
const normalized = value.trim();
|
||||||
|
if (!normalized) return false;
|
||||||
|
if (normalized.startsWith("blob:")) return false;
|
||||||
|
if (normalized.startsWith("data:")) return false;
|
||||||
|
return normalized.length <= PERSISTED_IMAGE_MAX_LENGTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
function toPersistableImageValue(value: unknown) {
|
||||||
|
return isPersistableImageValue(value) ? value.trim() : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function toPersistableItems(items: ProcessItem[]) {
|
||||||
|
const persistableItems: ProcessItem[] = [];
|
||||||
|
for (const item of items) {
|
||||||
|
const image = toPersistableImageValue(item.image);
|
||||||
|
const result = toPersistableImageValue(item.result);
|
||||||
|
const originalUrl = toPersistableImageValue(item.originalUrl);
|
||||||
|
if (!image && !result && !originalUrl) continue;
|
||||||
|
|
||||||
|
const persistableItem: ProcessItem = {
|
||||||
|
...item,
|
||||||
|
image: image || result || originalUrl,
|
||||||
|
};
|
||||||
|
if (result) {
|
||||||
|
persistableItem.result = result;
|
||||||
|
} else {
|
||||||
|
delete persistableItem.result;
|
||||||
|
}
|
||||||
|
if (originalUrl) {
|
||||||
|
persistableItem.originalUrl = originalUrl;
|
||||||
|
} else {
|
||||||
|
delete persistableItem.originalUrl;
|
||||||
|
}
|
||||||
|
persistableItems.push(persistableItem);
|
||||||
|
}
|
||||||
|
return persistableItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createPersistableSnapshot(snapshot: SceneFusionPersistedState): SceneFusionPersistedState {
|
||||||
|
const sceneItems = toPersistableItems(snapshot.sceneItems);
|
||||||
|
const multiProductItems = toPersistableItems(snapshot.multiProductItems);
|
||||||
|
const randomItems = toPersistableItems(snapshot.randomItems);
|
||||||
|
const batchItems = toPersistableItems(snapshot.batchItems);
|
||||||
|
const persistedIds = new Set(
|
||||||
|
[...sceneItems, ...multiProductItems, ...randomItems, ...batchItems].map(
|
||||||
|
(item) => item.id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
...snapshot,
|
||||||
|
productImage: toPersistableImageValue(snapshot.productImage) || null,
|
||||||
|
sceneItems,
|
||||||
|
multiProductItems,
|
||||||
|
referenceSceneImage:
|
||||||
|
toPersistableImageValue(snapshot.referenceSceneImage) || null,
|
||||||
|
randomItems,
|
||||||
|
batchItems,
|
||||||
|
selectedResultIds: snapshot.selectedResultIds.filter((id) =>
|
||||||
|
persistedIds.has(id)
|
||||||
|
),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const randomBackgroundStyles = [
|
const randomBackgroundStyles = [
|
||||||
"现代简约客厅",
|
"现代简约客厅",
|
||||||
"北欧卧室",
|
"北欧卧室",
|
||||||
@ -539,7 +606,19 @@ export function SceneFusionView({
|
|||||||
selectedResultIds,
|
selectedResultIds,
|
||||||
};
|
};
|
||||||
|
|
||||||
window.sessionStorage.setItem(persistenceKey, JSON.stringify(snapshot));
|
try {
|
||||||
|
window.sessionStorage.setItem(
|
||||||
|
persistenceKey,
|
||||||
|
JSON.stringify(createPersistableSnapshot(snapshot))
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.warn("[SceneFusionView] Failed to persist state:", error);
|
||||||
|
try {
|
||||||
|
window.sessionStorage.removeItem(persistenceKey);
|
||||||
|
} catch {
|
||||||
|
// Ignore storage cleanup failures.
|
||||||
|
}
|
||||||
|
}
|
||||||
}, [
|
}, [
|
||||||
aspectRatio,
|
aspectRatio,
|
||||||
batchItems,
|
batchItems,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user