From dba32a0eb7d42501a349d11dab0afcfb11f65a39 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Tue, 27 Jan 2026 21:04:50 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20FileSystemObserver=20?= =?UTF-8?q?=E6=9C=AA=E8=83=BD=E6=8C=81=E7=BB=AD=E7=9B=91=E5=90=AC=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pkg/utils/file-tracker.ts | 49 +++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/src/pkg/utils/file-tracker.ts b/src/pkg/utils/file-tracker.ts index 8ec813603..9bc63e80e 100644 --- a/src/pkg/utils/file-tracker.ts +++ b/src/pkg/utils/file-tracker.ts @@ -7,28 +7,51 @@ export type FTInfo = { lastModified?: number; }; +const getHandleRecord = async (root: FileSystemFileHandle, observer: FileSystemObserverInstance) => { + for (const [fileHandle, ftInfo, fileObserver] of handleRecords) { + if (fileObserver !== observer) continue; + try { + const isSame = await root.isSameEntry(fileHandle); + if (!isSame) continue; + const file = await root.getFile(); + if (file && file.lastModified > 0) { + return { ftInfo, file }; + } + } catch (e) { + // 档案改名或删掉时,或会被此捕捉(预期报错) + console.warn(e); + } + } + return { ftInfo: null, file: null }; +}; + const callback = async (records: FileSystemChangeRecord[], observer: FileSystemObserverInstance) => { - for (const record of records) { - const { root, type } = record; - if (!(root instanceof FileSystemFileHandle) || type !== "modified") continue; - for (const [fileHandle, ftInfo, fileObserver] of handleRecords) { - if (fileObserver !== observer) continue; - try { - const isSame = await root.isSameEntry(fileHandle); - if (!isSame) continue; - // 调用安装 - const file = await root.getFile(); - // 避免重复更新 + try { + for (const record of records) { + const { root, type } = record; + if (!(root instanceof FileSystemFileHandle)) continue; + // 只要 FileSystemObserver 侦测到档案改变,就试一下找记录和读档 + const { ftInfo, file } = await getHandleRecord(root, observer); + // 如没有记录或读档失败则忽略 + if (!ftInfo || !file) continue; + // 读档成功且有效 ( 文字档考虑 ==UserScript== 等东西,至少应有 30 bytes ) + if (file.size > 30) { + // 如成功读档但显示为失败,则重新 observe + if (type === "errored") { + observer.observe(root); + } + // 以 lastModified 判断避免重复更新 if (ftInfo.lastModified === file.lastModified) continue; ftInfo.lastModified = file.lastModified; const code = await file.text(); if (code && typeof code === "string") { ftInfo.setCode(code, false); } - } catch (e) { - console.warn(e); } } + } catch (e) { + // 捕捉其他非遇期错误 + console.warn(e); } }; From 088614af9c3117d60cd14733442f4c2756b9ed5e Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Tue, 27 Jan 2026 21:24:03 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=E5=8F=91=E7=94=9F=20NotFoundError=20?= =?UTF-8?q?=E7=AD=89=E9=94=99=E8=AF=AF=E6=97=B6=EF=BC=8C=E9=87=8D=E7=BD=AE?= =?UTF-8?q?=20Watch=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/install/App.tsx | 6 ++++++ src/pkg/utils/file-tracker.ts | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/pages/install/App.tsx b/src/pages/install/App.tsx index 80587b3ec..e103ae8f0 100644 --- a/src/pages/install/App.tsx +++ b/src/pages/install/App.tsx @@ -442,6 +442,11 @@ function App() { } } + async function onWatchFileError() { + // e.g. NotFoundError + setWatchFile(false); + } + const memoWatchFile = useMemo(() => { return `${watchFile}.${scriptInfo?.uuid}.${localFileHandle?.name}`; }, [watchFile, scriptInfo, localFileHandle]); @@ -458,6 +463,7 @@ function App() { uuid, fileName, setCode: onWatchFileCodeChanged, + onFileError: onWatchFileError, }; // 进行监听 startFileTrack(handle, ftInfo); diff --git a/src/pkg/utils/file-tracker.ts b/src/pkg/utils/file-tracker.ts index 9bc63e80e..1fd935fd0 100644 --- a/src/pkg/utils/file-tracker.ts +++ b/src/pkg/utils/file-tracker.ts @@ -5,6 +5,7 @@ export type FTInfo = { fileName: string; setCode(code: string, hideInfo?: boolean): void; lastModified?: number; + onFileError(): void; }; const getHandleRecord = async (root: FileSystemFileHandle, observer: FileSystemObserverInstance) => { @@ -20,6 +21,7 @@ const getHandleRecord = async (root: FileSystemFileHandle, observer: FileSystemO } catch (e) { // 档案改名或删掉时,或会被此捕捉(预期报错) console.warn(e); + ftInfo.onFileError(); } } return { ftInfo: null, file: null }; From e1da20426db7a0795941647a9a14f23b1634ab6b Mon Sep 17 00:00:00 2001 From: wangyizhi Date: Wed, 28 Jan 2026 11:10:36 +0800 Subject: [PATCH 3/6] Update src/pkg/utils/file-tracker.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/pkg/utils/file-tracker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pkg/utils/file-tracker.ts b/src/pkg/utils/file-tracker.ts index 1fd935fd0..cb3caab2d 100644 --- a/src/pkg/utils/file-tracker.ts +++ b/src/pkg/utils/file-tracker.ts @@ -52,7 +52,7 @@ const callback = async (records: FileSystemChangeRecord[], observer: FileSystemO } } } catch (e) { - // 捕捉其他非遇期错误 + // 捕捉其他非预期错误 console.warn(e); } }; From 28d3dab0e47cd42481df7347a16de644ba7b05e1 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Wed, 28 Jan 2026 22:08:19 +0900 Subject: [PATCH 4/6] Update file-tracker.ts --- src/pkg/utils/file-tracker.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/pkg/utils/file-tracker.ts b/src/pkg/utils/file-tracker.ts index cb3caab2d..882f6ab4f 100644 --- a/src/pkg/utils/file-tracker.ts +++ b/src/pkg/utils/file-tracker.ts @@ -9,11 +9,23 @@ export type FTInfo = { }; const getHandleRecord = async (root: FileSystemFileHandle, observer: FileSystemObserverInstance) => { + let matchedFTInfo = null; for (const [fileHandle, ftInfo, fileObserver] of handleRecords) { if (fileObserver !== observer) continue; try { const isSame = await root.isSameEntry(fileHandle); - if (!isSame) continue; + if (isSame) { + matchedFTInfo = ftInfo; + break; + } + } catch (e) { + // 捕捉非预期错误 + console.warn(e); + } + } + if (matchedFTInfo) { + const ftInfo = matchedFTInfo; + try { const file = await root.getFile(); if (file && file.lastModified > 0) { return { ftInfo, file }; @@ -21,6 +33,7 @@ const getHandleRecord = async (root: FileSystemFileHandle, observer: FileSystemO } catch (e) { // 档案改名或删掉时,或会被此捕捉(预期报错) console.warn(e); + unmountFileTrack(root); ftInfo.onFileError(); } } @@ -52,7 +65,7 @@ const callback = async (records: FileSystemChangeRecord[], observer: FileSystemO } } } catch (e) { - // 捕捉其他非预期错误 + // 捕捉非预期错误 console.warn(e); } }; @@ -74,6 +87,7 @@ export const unmountFileTrack = async (fileHandle: FileSystemFileHandle) => { } } } catch (e) { + // 捕捉非预期错误 console.warn(e); } return false; From 675ff88e962e4298983cc43b23a8e51abfaeb4a7 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Thu, 29 Jan 2026 07:14:13 +0900 Subject: [PATCH 5/6] Update file-tracker.ts --- src/pkg/utils/file-tracker.ts | 41 +++++++++++++++++------------------ 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/pkg/utils/file-tracker.ts b/src/pkg/utils/file-tracker.ts index 882f6ab4f..ca3a6b72d 100644 --- a/src/pkg/utils/file-tracker.ts +++ b/src/pkg/utils/file-tracker.ts @@ -9,35 +9,19 @@ export type FTInfo = { }; const getHandleRecord = async (root: FileSystemFileHandle, observer: FileSystemObserverInstance) => { - let matchedFTInfo = null; for (const [fileHandle, ftInfo, fileObserver] of handleRecords) { if (fileObserver !== observer) continue; try { const isSame = await root.isSameEntry(fileHandle); if (isSame) { - matchedFTInfo = ftInfo; - break; + return ftInfo; } } catch (e) { // 捕捉非预期错误 console.warn(e); } } - if (matchedFTInfo) { - const ftInfo = matchedFTInfo; - try { - const file = await root.getFile(); - if (file && file.lastModified > 0) { - return { ftInfo, file }; - } - } catch (e) { - // 档案改名或删掉时,或会被此捕捉(预期报错) - console.warn(e); - unmountFileTrack(root); - ftInfo.onFileError(); - } - } - return { ftInfo: null, file: null }; + return null; }; const callback = async (records: FileSystemChangeRecord[], observer: FileSystemObserverInstance) => { @@ -46,9 +30,24 @@ const callback = async (records: FileSystemChangeRecord[], observer: FileSystemO const { root, type } = record; if (!(root instanceof FileSystemFileHandle)) continue; // 只要 FileSystemObserver 侦测到档案改变,就试一下找记录和读档 - const { ftInfo, file } = await getHandleRecord(root, observer); - // 如没有记录或读档失败则忽略 - if (!ftInfo || !file) continue; + const ftInfo = await getHandleRecord(root, observer); + // 如没有记录则忽略 + if (!ftInfo) continue; + let file: File | null = null; + try { + const fRead = await root.getFile(); + if (fRead && fRead.lastModified > 0 && fRead.size > 0) { + // 有档案内容读取权限,排除空档案 + file = fRead; + } + } catch (e) { + // 档案改名或删掉时,或会被此捕捉(预期报错) + console.warn(e); + unmountFileTrack(root); + ftInfo.onFileError(); + } + // 如读档失败则忽略 + if (!file) continue; // 读档成功且有效 ( 文字档考虑 ==UserScript== 等东西,至少应有 30 bytes ) if (file.size > 30) { // 如成功读档但显示为失败,则重新 observe From 81f7e6b99cda73932e50f11a0891a698d610b452 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Thu, 29 Jan 2026 07:23:18 +0900 Subject: [PATCH 6/6] Update file-tracker.ts --- src/pkg/utils/file-tracker.ts | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/pkg/utils/file-tracker.ts b/src/pkg/utils/file-tracker.ts index ca3a6b72d..246533dac 100644 --- a/src/pkg/utils/file-tracker.ts +++ b/src/pkg/utils/file-tracker.ts @@ -48,19 +48,16 @@ const callback = async (records: FileSystemChangeRecord[], observer: FileSystemO } // 如读档失败则忽略 if (!file) continue; - // 读档成功且有效 ( 文字档考虑 ==UserScript== 等东西,至少应有 30 bytes ) - if (file.size > 30) { - // 如成功读档但显示为失败,则重新 observe - if (type === "errored") { - observer.observe(root); - } - // 以 lastModified 判断避免重复更新 - if (ftInfo.lastModified === file.lastModified) continue; - ftInfo.lastModified = file.lastModified; - const code = await file.text(); - if (code && typeof code === "string") { - ftInfo.setCode(code, false); - } + // 如成功读档但显示为失败,则重新 observe + if (type === "errored") { + observer.observe(root); + } + // 以 lastModified 判断避免重复更新 + if (ftInfo.lastModified === file.lastModified) continue; + ftInfo.lastModified = file.lastModified; + const code = await file.text(); + if (code && typeof code === "string") { + ftInfo.setCode(code, false); } } } catch (e) {