fix(cafs): use graceful-fs for reading files (#3411)

close #3378
This commit is contained in:
Zoltan Kochan
2021-04-30 00:35:41 +03:00
committed by GitHub
parent cf7fdfcc59
commit ef0ca24be0
4 changed files with 15 additions and 4 deletions

View File

@@ -0,0 +1,5 @@
---
"@pnpm/cafs": patch
---
Use graceful-fs for reading files.

View File

@@ -20,6 +20,7 @@
"concat-stream": "^2.0.0",
"decompress-maybe": "^1.0.0",
"get-stream": "^6.0.0",
"graceful-fs": "^4.2.6",
"p-limit": "^3.1.0",
"path-temp": "^2.0.0",
"rename-overwrite": "^4.0.0",

View File

@@ -1,13 +1,16 @@
import { createReadStream, promises as fs } from 'fs'
import { promises as fs } from 'fs'
import gracefulFS from 'graceful-fs'
import { DeferredManifestPromise, PackageFileInfo } from '@pnpm/fetcher-base'
import rimraf from '@zkochan/rimraf'
import pLimit from 'p-limit'
import ssri from 'ssri'
import { promisify } from 'util'
import { getFilePathByModeInCafs } from './getFilePathInCafs'
import { parseJsonBuffer } from './parseJson'
const limit = pLimit(20)
const MAX_BULK_SIZE = 1 * 1024 * 1024 // 1MB
const readFile = promisify(gracefulFS.readFile)
export interface PackageFilesIndex {
// name and version are nullable for backward compatibility
@@ -69,7 +72,7 @@ async function verifyFile (
return verifyFileIntegrity(filename, fstat, deferredManifest)
}
if (deferredManifest != null) {
parseJsonBuffer(await fs.readFile(filename), deferredManifest)
parseJsonBuffer(await readFile(filename), deferredManifest)
}
// If a file was not edited, we are skipping integrity check.
// We assume that nobody will manually remove a file in the store and create a new one.
@@ -83,13 +86,13 @@ export async function verifyFileIntegrity (
) {
try {
if (expectedFile.size > MAX_BULK_SIZE && (deferredManifest == null)) {
const ok = Boolean(await ssri.checkStream(createReadStream(filename), expectedFile.integrity))
const ok = Boolean(await ssri.checkStream(gracefulFS.createReadStream(filename), expectedFile.integrity))
if (!ok) {
await rimraf(filename)
}
return ok
}
const data = await fs.readFile(filename)
const data = await readFile(filename)
const ok = Boolean(ssri.checkData(data, expectedFile.integrity))
if (!ok) {
await rimraf(filename)

2
pnpm-lock.yaml generated
View File

@@ -140,6 +140,7 @@ importers:
concat-stream: ^2.0.0
decompress-maybe: ^1.0.0
get-stream: ^6.0.0
graceful-fs: ^4.2.6
p-limit: ^3.1.0
path-temp: ^2.0.0
rename-overwrite: ^4.0.0
@@ -154,6 +155,7 @@ importers:
concat-stream: 2.0.0
decompress-maybe: 1.0.0
get-stream: 6.0.1
graceful-fs: 4.2.6
p-limit: 3.1.0
path-temp: 2.0.0
rename-overwrite: 4.0.0