forked from akai/readest
981579c255
* refactor(sync): kind-agnostic replica primitives Extract dict-only sync into shared primitives (registry, pull/apply orchestrator, persist env, schema allowlist) so other kinds can plug in. Companion changes: per-replica Storage Manager grouping, useReplicaPull boot-race recovery, manifest=null reconciliation on every boot pull, copyFile takes explicit srcBase + dstBase, settled- event helpers, lenient webDownload Content-Length (R2/S3 signed URLs commonly omit it), and generic "File" transfer toast copy any replica kind can share. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(sync): cross-device custom font sync Plug the font replica adapter into the kind-agnostic primitives: font store gains replica wiring, custom font import publishes the replica row + queues a binary upload, and bootstrap registers the font adapter and download-complete handler. Includes legacy flat-path migration so pre-existing fonts sync without re-import, full @font-face activation on auto-download (load + mount the rule, mirroring manual import), and a fix to createCustomFont so contentId / bundleDir / byteSize survive the trip through addFont — otherwise import-time publish silently no-oped on missing contentId. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
25 lines
838 B
TypeScript
25 lines
838 B
TypeScript
import { AppService, FileItem } from '@/types/system';
|
|
|
|
export const copyFiles = async (appService: AppService, srcDir: string, dstDir: string) => {
|
|
let filesToCopy: FileItem[] = [];
|
|
try {
|
|
filesToCopy = await appService.readDirectory(srcDir, 'None');
|
|
} catch {
|
|
throw new Error(`Dir ${srcDir} failed to read.`);
|
|
}
|
|
|
|
for (let i = 0; i < filesToCopy.length; i++) {
|
|
const file = filesToCopy[i]!;
|
|
const srcPath = `${srcDir}/${file.path}`;
|
|
const destPath = `${dstDir}/${file.path}`;
|
|
await appService.copyFile(srcPath, 'None', destPath, 'None');
|
|
}
|
|
|
|
const filesCopied = await appService.readDirectory(dstDir, 'None');
|
|
for (const file of filesToCopy) {
|
|
if (!filesCopied.find((f) => f.path === file.path && f.size === file.size)) {
|
|
throw new Error(`File ${file.path} failed to copy.`);
|
|
}
|
|
}
|
|
};
|