





















@@ -45,8 +45,8 @@ type RegistryEntry = {
4545containerName: string;
4646};
474748-type RegistryFile<T extends RegistryEntry> = {
49-entries: T[];
48+type RegistryFile = {
49+entries: RegistryEntry[];
5050};
51515252// Schemas are shared between the per-entry files (live writes) and the
@@ -101,7 +101,7 @@ async function readEntryFile<T extends RegistryEntry>(
101101return parsed ?? null;
102102}
103103104-async function writeEntryFile<T extends RegistryEntry>(dir: string, entry: T): Promise<void> {
104+async function writeEntryFile(dir: string, entry: RegistryEntry): Promise<void> {
105105await fs.mkdir(dir, { recursive: true });
106106await writeJsonAtomic(entryFilePath(dir, entry.containerName), entry, { trailingNewline: true });
107107}
@@ -148,10 +148,7 @@ async function readAllEntries<T extends RegistryEntry>(dir: string): Promise<T[]
148148149149// ── One-shot migration from monolithic file → per-entry files ──────────
150150151-async function migrateMonolithicIfNeeded<T extends RegistryEntry>(
152-oldPath: string,
153-newDir: string,
154-): Promise<void> {
151+async function migrateMonolithicIfNeeded(oldPath: string, newDir: string): Promise<void> {
155152let raw: string;
156153try {
157154raw = await fs.readFile(oldPath, "utf-8");
@@ -160,7 +157,7 @@ async function migrateMonolithicIfNeeded<T extends RegistryEntry>(
160157// fresh install). Nothing to do.
161158return;
162159}
163-const parsed = safeParseJsonWithSchema(RegistryFileSchema, raw) as RegistryFile<T> | null;
160+const parsed = safeParseJsonWithSchema(RegistryFileSchema, raw) as RegistryFile | null;
164161if (!parsed || parsed.entries.length === 0) {
165162// Corrupt or empty — drop it (and its stale lock) so we don't re-attempt
166163// migration every read.
@@ -185,10 +182,7 @@ async function migrateMonolithicIfNeeded<T extends RegistryEntry>(
185182// ── Public API: Container Registry ─────────────────────────────────────
186183187184export async function readRegistry(): Promise<SandboxRegistry> {
188-await migrateMonolithicIfNeeded<SandboxRegistryEntry>(
189-SANDBOX_REGISTRY_PATH,
190-SANDBOX_CONTAINERS_DIR,
191-);
185+await migrateMonolithicIfNeeded(SANDBOX_REGISTRY_PATH, SANDBOX_CONTAINERS_DIR);
192186const entries = await readAllEntries<SandboxRegistryEntry>(SANDBOX_CONTAINERS_DIR);
193187return { entries: entries.map(normalizeSandboxRegistryEntry) };
194188}
@@ -202,19 +196,13 @@ export async function readRegistry(): Promise<SandboxRegistry> {
202196export async function readRegistryEntry(
203197containerName: string,
204198): Promise<SandboxRegistryEntry | null> {
205-await migrateMonolithicIfNeeded<SandboxRegistryEntry>(
206-SANDBOX_REGISTRY_PATH,
207-SANDBOX_CONTAINERS_DIR,
208-);
199+await migrateMonolithicIfNeeded(SANDBOX_REGISTRY_PATH, SANDBOX_CONTAINERS_DIR);
209200const entry = await readEntryFile<SandboxRegistryEntry>(SANDBOX_CONTAINERS_DIR, containerName);
210201return entry ? normalizeSandboxRegistryEntry(entry) : null;
211202}
212203213204export async function updateRegistry(entry: SandboxRegistryEntry): Promise<void> {
214-await migrateMonolithicIfNeeded<SandboxRegistryEntry>(
215-SANDBOX_REGISTRY_PATH,
216-SANDBOX_CONTAINERS_DIR,
217-);
205+await migrateMonolithicIfNeeded(SANDBOX_REGISTRY_PATH, SANDBOX_CONTAINERS_DIR);
218206const existing = await readEntryFile<SandboxRegistryEntry>(
219207SANDBOX_CONTAINERS_DIR,
220208entry.containerName,
@@ -238,18 +226,12 @@ export async function removeRegistryEntry(containerName: string): Promise<void>
238226// ── Public API: Browser Registry ───────────────────────────────────────
239227240228export async function readBrowserRegistry(): Promise<SandboxBrowserRegistry> {
241-await migrateMonolithicIfNeeded<SandboxBrowserRegistryEntry>(
242-SANDBOX_BROWSER_REGISTRY_PATH,
243-SANDBOX_BROWSERS_DIR,
244-);
229+await migrateMonolithicIfNeeded(SANDBOX_BROWSER_REGISTRY_PATH, SANDBOX_BROWSERS_DIR);
245230return { entries: await readAllEntries<SandboxBrowserRegistryEntry>(SANDBOX_BROWSERS_DIR) };
246231}
247232248233export async function updateBrowserRegistry(entry: SandboxBrowserRegistryEntry): Promise<void> {
249-await migrateMonolithicIfNeeded<SandboxBrowserRegistryEntry>(
250-SANDBOX_BROWSER_REGISTRY_PATH,
251-SANDBOX_BROWSERS_DIR,
252-);
234+await migrateMonolithicIfNeeded(SANDBOX_BROWSER_REGISTRY_PATH, SANDBOX_BROWSERS_DIR);
253235const existing = await readEntryFile<SandboxBrowserRegistryEntry>(
254236SANDBOX_BROWSERS_DIR,
255237entry.containerName,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。