diff --git a/changelog.md b/changelog.md index c03ca90..9de980f 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,12 @@ # Changelog +## 2026-03-05 - 1.3.3 - fix(smartfs.provider.node) +replace synchronous readdirSync with async await fs.readdir for directory listings in the Node provider to avoid blocking the event loop + +- Replaced fsSync.readdirSync with await fs.readdir in listDirectory and listDirectoryRecursive. +- Switches from a blocking filesystem call to the non-blocking Node fs API in the node provider. +- Patch bump from 1.3.2 to 1.3.3 is recommended. + ## 2026-03-05 - 1.3.2 - fix(provider(node)) use synchronous readdir to avoid partial results on some filesystems (e.g., XFS) when the process receives signals diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 9ef43fb..6c399e9 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@push.rocks/smartfs', - version: '1.3.2', + version: '1.3.3', description: 'a cross platform extendable fs module' } diff --git a/ts/providers/smartfs.provider.node.ts b/ts/providers/smartfs.provider.node.ts index 580f74b..b5d5efa 100644 --- a/ts/providers/smartfs.provider.node.ts +++ b/ts/providers/smartfs.provider.node.ts @@ -158,11 +158,7 @@ export class SmartFsProviderNode implements ISmartFsProvider { if (options?.recursive) { await this.listDirectoryRecursive(path, entries, options); } else { - // Use readdirSync for reliability — async readdir can return partial results - // on XFS/mounted filesystems when the process receives signals (e.g., from - // SmartExit/smartshell process group management). The synchronous version - // completes the entire getdents64 syscall without event loop interruption. - const dirents = fsSync.readdirSync(path, { withFileTypes: true }); + const dirents = await fs.readdir(path, { withFileTypes: true }); for (const dirent of dirents) { const entryPath = pathModule.join(path, dirent.name); @@ -200,8 +196,7 @@ export class SmartFsProviderNode implements ISmartFsProvider { entries: IDirectoryEntry[], options?: IListOptions, ): Promise { - // Use readdirSync for reliability — see listDirectory comment - const dirents = fsSync.readdirSync(path, { withFileTypes: true }); + const dirents = await fs.readdir(path, { withFileTypes: true }); for (const dirent of dirents) { const entryPath = pathModule.join(path, dirent.name);