@@ -7300,7 +7300,7 @@ function $16a92ae9d4279a5e$var$showReloadPrompt(reason) {
73007300 buttons: 'confirm_cancel',
73017301 onConfirm: ()=>{
73027302 window.__comigoReloadPromptOpen = false;
7303- window.location.reload ();
7303+ $16a92ae9d4279a5e$var$reloadComigoPage ();
73047304 },
73057305 onCancel: ()=>{
73067306 window.__comigoReloadPromptOpen = false;
@@ -7309,17 +7309,56 @@ function $16a92ae9d4279a5e$var$showReloadPrompt(reason) {
73097309}
73107310function $16a92ae9d4279a5e$var$autoReloadAfterLibraryRescan() {
73117311 if (!$16a92ae9d4279a5e$var$shouldShowUISuggestReloadPrompt() || window.__comigoAutoReloadQueued) return;
7312+ // 若本页正在发起重扫请求(rescan POST),先别 reload:
7313+ // 否则 location.reload() 会把这个还没返回的 fetch 直接 abort 掉,
7314+ // Firefox 报 “TypeError: NetworkError when attempting to fetch resource”,
7315+ // 让明明扫描成功的操作弹出“网络错误,请重试”。
7316+ // 改为挂起,等该 fetch 在自己的 finally 里结束后再刷新。
7317+ if (window.__comigoRescanInFlight) {
7318+ window.__comigoReloadPending = true;
7319+ return;
7320+ }
73127321 window.__comigoAutoReloadQueued = true;
7313- window.location.reload();
7322+ $16a92ae9d4279a5e$var$reloadComigoPage();
7323+ }
7324+ // 由发起重扫的页面在 fetch 结束(finally)后调用:执行被挂起的整页刷新。
7325+ function $16a92ae9d4279a5e$var$comigoRunPendingReload() {
7326+ if (window.__comigoReloadPending && !window.__comigoAutoReloadQueued) {
7327+ window.__comigoReloadPending = false;
7328+ window.__comigoAutoReloadQueued = true;
7329+ $16a92ae9d4279a5e$var$reloadComigoPage();
7330+ }
73147331}
73157332function $16a92ae9d4279a5e$var$appendSharedLog(line) {
73167333 if (typeof window.__comigoLogAppend === 'function') window.__comigoLogAppend(line);
73177334}
7335+ // 取消尚未执行的延迟连接,页面即将卸载时不能再新建 EventSource。
7336+ function $16a92ae9d4279a5e$var$clearQueuedComigoSSEStart() {
7337+ if (window.__comigoSSEStartTimer) {
7338+ clearTimeout(window.__comigoSSEStartTimer);
7339+ window.__comigoSSEStartTimer = null;
7340+ }
7341+ window.__comigoSSEStartQueued = false;
7342+ }
7343+ // 主动关闭当前 SSE;由 reload/pagehide 共用,避免卸载时遗留被浏览器标记为中断的长连接。
7344+ function $16a92ae9d4279a5e$var$closeComigoSSE() {
7345+ $16a92ae9d4279a5e$var$clearQueuedComigoSSEStart();
7346+ if (!window.__comigoSSEInstance) return;
7347+ try {
7348+ window.__comigoSSEInstance.close();
7349+ } catch (_) {}
7350+ window.__comigoSSEInstance = null;
7351+ }
7352+ function $16a92ae9d4279a5e$var$reloadComigoPage() {
7353+ $16a92ae9d4279a5e$var$closeComigoSSE();
7354+ window.location.reload();
7355+ }
73187356function $16a92ae9d4279a5e$var$queueComigoSSEStart() {
73197357 if (window.__comigoSSEStartQueued) return;
73207358 window.__comigoSSEStartQueued = true;
73217359 const start = ()=>{
7322- setTimeout(()=>{
7360+ window.__comigoSSEStartTimer = setTimeout(()=>{
7361+ window.__comigoSSEStartTimer = null;
73237362 window.__comigoSSEStartQueued = false;
73247363 $16a92ae9d4279a5e$var$comigoSSEInit();
73257364 }, 1000);
@@ -7364,7 +7403,11 @@ function $16a92ae9d4279a5e$var$comigoAttachSSEListeners(es) {
73647403}
73657404function $16a92ae9d4279a5e$var$comigoSSEInit() {
73667405 if (!$16a92ae9d4279a5e$var$shouldEnableComigoSSE()) return null;
7367- if (window.__comigoSSEInstance) return window.__comigoSSEInstance;
7406+ if (window.__comigoSSEInstance) {
7407+ if (window.__comigoSSEInstance.readyState === EventSource.CLOSED) window.__comigoSSEInstance = null;
7408+ else return window.__comigoSSEInstance;
7409+ }
7410+ if (window.__comigoSSEStartQueued) return window.__comigoSSEInstance;
73687411 // 页面初次加载时稍后再连,避免浏览器把 SSE 长连接误报为加载中断。
73697412 if (document.readyState !== 'complete') {
73707413 $16a92ae9d4279a5e$var$queueComigoSSEStart();
@@ -7379,6 +7422,19 @@ function $16a92ae9d4279a5e$var$comigoSSEInit() {
73797422 return es;
73807423}
73817424window.__comigoSSEInit = $16a92ae9d4279a5e$var$comigoSSEInit;
7425+ window.__comigoRunPendingReload = $16a92ae9d4279a5e$var$comigoRunPendingReload;
7426+ // 全局启动 SSE;具体事件处理仍由上面的路径判断决定,阅读页不会被重扫通知打断。
7427+ $16a92ae9d4279a5e$var$queueComigoSSEStart();
7428+ // 页面卸载时主动关闭 SSE,并取消尚未执行的延迟启动,避免卸载过程中创建/留下
7429+ // 被中断(aborted)的 /api/sse 请求。
7430+ if (typeof window.addEventListener === 'function') {
7431+ window.addEventListener('pagehide', ()=>{
7432+ $16a92ae9d4279a5e$var$closeComigoSSE();
7433+ });
7434+ window.addEventListener('pageshow', ()=>{
7435+ $16a92ae9d4279a5e$var$queueComigoSSEStart();
7436+ });
7437+ }
73827438window.dispatchEvent(new Event('comigo:sse-ready'));
73837439
73847440
0 commit comments