feat: init disk remote source

This commit is contained in:
DarkSky
2026-02-27 02:39:53 +08:00
parent 895e774569
commit 6557e5d01d
51 changed files with 6793 additions and 158 deletions
@@ -0,0 +1,118 @@
import type { DiskSyncEvent } from '@affine/nbstore/disk';
import { beforeEach, describe, expect, it, vi } from 'vitest';
const diskSyncMocks = vi.hoisted(() => {
return {
startSession: vi.fn(async () => {}),
stopSession: vi.fn(async () => {}),
applyLocalUpdate: vi.fn(async () => ({
docId: 'doc-1',
timestamp: new Date('2026-01-06T00:00:00.000Z'),
})),
subscribeEvents: vi.fn(
(
_sessionId: string,
_callback: (err: Error | null, event: DiskSyncEvent) => void
) => {
return Promise.resolve({
unsubscribe: () => {},
});
}
),
};
});
vi.mock('@affine/native', () => {
class DiskSyncMock {
subscribeEvents(
sessionId: string,
callback: (err: Error | null, event: DiskSyncEvent) => void
) {
return diskSyncMocks.subscribeEvents(sessionId, callback);
}
startSession(
sessionId: string,
options: { workspaceId: string; syncFolder: string }
) {
return diskSyncMocks.startSession(sessionId, options);
}
stopSession(sessionId: string) {
return diskSyncMocks.stopSession(sessionId);
}
applyLocalUpdate(
sessionId: string,
update: { docId: string; bin: Uint8Array },
origin?: string
) {
return diskSyncMocks.applyLocalUpdate(sessionId, update, origin);
}
}
return { DiskSync: DiskSyncMock };
});
import {
applyLocalUpdate,
startSession,
stopSession,
} from '../../src/helper/disk-sync/handlers';
import { diskSyncSubjects } from '../../src/helper/disk-sync/subjects';
describe('disk helper handlers', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('forwards subscribeEvents payload and unsubscribes on stop', async () => {
const unsubscribe = vi.fn();
diskSyncMocks.subscribeEvents.mockImplementation(
(
_sessionId: string,
callback: (err: Error | null, event: DiskSyncEvent) => void
) => {
callback(null, {
type: 'ready',
} as DiskSyncEvent);
return Promise.resolve({
unsubscribe,
});
}
);
const seen: string[] = [];
const subscription = diskSyncSubjects.event$.subscribe(payload => {
seen.push(payload.event.type);
});
await startSession('session-subscribe', {
workspaceId: 'workspace-subscribe',
syncFolder: '/tmp/disk-sync',
});
expect(seen).toContain('ready');
expect(diskSyncMocks.subscribeEvents).toHaveBeenCalledWith(
'session-subscribe',
expect.any(Function)
);
await stopSession('session-subscribe');
expect(unsubscribe).toHaveBeenCalledTimes(1);
subscription.unsubscribe();
});
it('throws when native applyLocalUpdate returns Error payload', async () => {
diskSyncMocks.applyLocalUpdate.mockResolvedValueOnce(
new Error('invalid_binary')
);
await expect(
applyLocalUpdate('session-subscribe', {
docId: 'doc-failed',
bin: new Uint8Array([1, 2, 3]),
})
).rejects.toThrow('[disk] applyLocalUpdate failed: invalid_binary');
});
});