From 397a5599e364b99a66dbd5a8fd9a46011f656eb8 Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Tue, 27 Oct 2026 12:42:21 +0800 Subject: [PATCH] refactor(asar): retain admitted archive extents --- src/artifacts/AsarArtifactReader.ts | 33 +++++++++++++---------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/artifacts/AsarArtifactReader.ts b/src/artifacts/AsarArtifactReader.ts index 7f7d923b48..f8bba0ff6a 100644 --- a/src/artifacts/AsarArtifactReader.ts +++ b/src/artifacts/AsarArtifactReader.ts @@ -25,7 +25,11 @@ import { type ArtifactReader, } from "./ArtifactReader.js"; import { closeAsarHandle, readValidatedAsarEntry } from "./AsarEntryStream.js"; -import { admitAsarHeader, readAsarHeader } from "./AsarHeader.js"; +import { + admitAsarHeader, + readAsarHeader, + type AsarHeaderExtents, +} from "./AsarHeader.js"; import { OwnedFileHandle } from "../filesystem/OwnedFileHandle.js"; import type { FileHandleChunkStream } from "../filesystem/readFileHandleChunks.js"; import { readArtifactFileChunks } from "./readArtifactFileChunks.js"; @@ -45,9 +49,8 @@ import { readAsarListing, type AsarListedEntry } from "./AsarListing.js"; */ export class AsarArtifactReader implements ArtifactReader { readonly format = "asar" as const; - #archiveSize: number | undefined; + #extents: AsarHeaderExtents | undefined; #selectedCanonicalSource: string | undefined; - #headerSize: number | undefined; readonly #entries = new Map(); readonly #ownedHandles = new Map(); #snapshot: { readonly path: string; readonly sha256: string } | undefined; @@ -68,18 +71,13 @@ export class AsarArtifactReader implements ArtifactReader { this.#resetArchiveState(); this.#entries.clear(); const admitted = await this.#admitHeader(snapshotPath, signal); - this.#archiveSize = admitted.archiveBytes; - this.#headerSize = admitted.headerBytes; + this.#extents = { + archiveBytes: admitted.archiveBytes, + headerBytes: admitted.headerBytes, + jsonBytes: admitted.jsonBytes, + }; assertAsarReadActive(signal); - const ordered = await readAsarListing(admitted.header, signal); - const archiveMetadata = await lstat(snapshotPath); - if (!archiveMetadata.isFile() || archiveMetadata.isSymbolicLink()) - throw new ArtifactReaderFailure( - "format", - "ASAR container is not a regular file", - ); - this.#archiveSize = archiveMetadata.size; - return ordered; + return readAsarListing(admitted.header, signal); }, signal); } catch (cause: unknown) { throw asarFailure(this.path, "inventory", cause); @@ -196,8 +194,8 @@ export class AsarArtifactReader implements ArtifactReader { signal?: AbortSignal, ): Promise { const { facts, entry: producedEntry } = state; - const archiveSize = this.#archiveSize; - const headerSize = this.#headerSize; + const archiveSize = this.#extents?.archiveBytes; + const headerSize = this.#extents?.headerBytes; const offset = facts.packedOffset; const start = offset === undefined || headerSize === undefined @@ -602,8 +600,7 @@ export class AsarArtifactReader implements ArtifactReader { } #resetArchiveState(): void { - this.#archiveSize = undefined; - this.#headerSize = undefined; + this.#extents = undefined; } }