fix(desktop): recover from macOS directory permission failures

This commit is contained in:
deatheros
2026-08-07 01:49:44 +03:00
parent 7e0e22f6e2
commit d8518bf053
30 changed files with 497 additions and 106 deletions
+35
View File
@@ -13,6 +13,7 @@ import {
setSyncPerformanceDiagnosticsEnabled,
} from './performance-diagnostics';
import { DIR_IDLE_TTL_MS } from './types';
import { FilesystemError } from '@/lib/api/files-errors';
const deferred = () => {
let resolve!: () => void;
@@ -414,6 +415,40 @@ describe('ChildStoreManager directory bootstrap scheduler', () => {
manager.disposeAll();
});
test('records os-permission failures and clears them on forced retry', async () => {
const manager = new ChildStoreManager();
let denied = true;
const cleanup = manager.configure({
onBootstrap: () => {
if (denied) {
throw new FilesystemError('Access denied', { reason: 'os-permission', status: 403 });
}
},
});
manager.requestBootstrap({ directory: '/protected', priority: 'selected', reason: 'current-directory' });
await settle();
await settle();
expect(manager.getBootstrapState('/protected')).toBe('failed');
expect(manager.getBootstrapFailure('/protected')).toBe('os-permission');
denied = false;
manager.requestBootstrap({
directory: '/protected',
priority: 'selected',
reason: 'action-demand',
force: true,
});
await settle();
await settle();
expect(manager.getBootstrapState('/protected')).toBe('complete');
expect(manager.getBootstrapFailure('/protected')).toBe(undefined);
cleanup();
manager.disposeAll();
});
test('continues after a synchronous bootstrap failure', async () => {
const manager = new ChildStoreManager();
const started: string[] = [];