Skip to content

Commit

Permalink
fix(graceful-fs): added to solve issues with too many open files
Browse files Browse the repository at this point in the history
  • Loading branch information
H4ad committed Oct 23, 2022
1 parent a9cf91d commit 58609ca
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 25 deletions.
36 changes: 28 additions & 8 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Expand Up @@ -86,6 +86,7 @@
"@oclif/plugin-plugins": "^2.1.0",
"@oclif/plugin-version": "^1.1.1",
"esbuild": "~0.15.7",
"graceful-fs": "^4.2.10",
"rimraf": "^3.0.2",
"semver": "^7.3.7",
"yazl": "^2.5.1"
Expand All @@ -97,6 +98,7 @@
"@semantic-release/github": "^8.0.4",
"@types/bluebird": "^3.5.36",
"@types/chai": "^4",
"@types/graceful-fs": "^4.1.5",
"@types/mocha": "^9.0.0",
"@types/mock-fs": "^4.13.1",
"@types/node": "12.20.43",
Expand Down
23 changes: 14 additions & 9 deletions src/commands/run/index.ts
@@ -1,6 +1,5 @@
//#region Imports

import { existsSync, mkdirSync, readFileSync, statSync } from 'fs';
import { join, relative, resolve } from 'path';
import {
DependencyInfo,
Expand All @@ -15,6 +14,12 @@ import rimraf from 'rimraf';
import CustomCommand from '../../common/custom-command';
import CustomError from '../../common/custom-error';
import { defaultIgnoredFileExtensions } from '../../common/extensions';
import {
safeExistsSync,
safeMkdirSync,
safeReadFileSync,
safeStatSync,
} from '../../common/fs';
import { HeadlessOptions } from '../../common/headless';
import { OutputInfo } from '../../common/output-info';
import { FasterZip, TransformAsyncCode, ZipArtifact } from '../../common/zip';
Expand Down Expand Up @@ -231,7 +236,7 @@ export default class Run extends CustomCommand {

await this.zipDirectory(flags, dir, zipArtifacts, outputFilePath);

const size = statSync(outputFilePath).size;
const size = safeStatSync(outputFilePath).size;

return { size, file: outputFile, path: outputPath };
}
Expand All @@ -245,7 +250,7 @@ export default class Run extends CustomCommand {

const nodeModulesFolderPath = join(dir, 'node_modules');

if (existsSync(nodeModulesFolderPath)) {
if (safeExistsSync(nodeModulesFolderPath)) {
this.logMessage(flags, 'log', 'Checking node folder... found');
return;
}
Expand All @@ -270,17 +275,17 @@ export default class Run extends CustomCommand {
const resolvedOutputPath = resolve(dir, outputPath);
const outputFilePath = join(resolvedOutputPath, outputFile);

if (!existsSync(resolvedOutputPath)) {
if (!safeExistsSync(resolvedOutputPath)) {
this.logMessage(
flags,
'log',
`Not found folder in ${outputPath}, creating new one...`,
);

mkdirSync(resolvedOutputPath, { recursive: true });
safeMkdirSync(resolvedOutputPath, { recursive: true });
}

if (!existsSync(outputFilePath)) {
if (!safeExistsSync(outputFilePath)) {
this.logMessage(
flags,
'debug',
Expand Down Expand Up @@ -357,7 +362,7 @@ export default class Run extends CustomCommand {
): ExtractorContainer {
const packageLockFilePath = join(dir, 'package-lock.json');

if (existsSync(packageLockFilePath)) {
if (safeExistsSync(packageLockFilePath)) {
this.logMessage(
flags,
'debug',
Expand All @@ -370,7 +375,7 @@ export default class Run extends CustomCommand {
);

return new NpmExtractor().parse(
readFileSync(packageLockFilePath).toString('utf-8'),
safeReadFileSync(packageLockFilePath).toString('utf-8'),
);
}

Expand Down Expand Up @@ -499,7 +504,7 @@ export default class Run extends CustomCommand {
const [relativePath, pathMappedTo] = includeFile.split(':');

const includeFilePath = join(dir, relativePath);
const stats = statSync(includeFilePath);
const stats = safeStatSync(includeFilePath);
const metadataPath = pathMappedTo
? resolve('/', pathMappedTo).slice(1)
: undefined;
Expand Down
13 changes: 9 additions & 4 deletions src/common/fs.ts
@@ -1,6 +1,11 @@
import fs from 'fs';
import { promisify } from 'util';
import * as gracefulFs from 'graceful-fs';

export const readFileAsync = promisify(fs.readFile);
export const readdirAsync = promisify(fs.readdir);
export const statAsync = promisify(fs.stat);
export const readdirAsync = promisify(gracefulFs.readdir);
export const statAsync = promisify(gracefulFs.stat);
export const safeCreateReadStream = gracefulFs.createReadStream;
export const safeCreateWriteStream = gracefulFs.createWriteStream;
export const safeExistsSync = gracefulFs.existsSync;
export const safeMkdirSync = gracefulFs.mkdirSync;
export const safeReadFileSync = gracefulFs.readFileSync;
export const safeStatSync = gracefulFs.statSync;
13 changes: 9 additions & 4 deletions src/common/zip.ts
@@ -1,7 +1,12 @@
import { Stats, createReadStream, createWriteStream } from 'fs';
import { Stats } from 'fs';
import { join, normalize, relative } from 'path';
import { ZipFile } from 'yazl';
import { readdirAsync, statAsync } from './fs';
import {
readdirAsync,
safeCreateReadStream,
safeCreateWriteStream,
statAsync,
} from './fs';
import { StringStream } from './string-stream';
import { streamToUInt8Array } from './string-to-uint';

Expand Down Expand Up @@ -31,7 +36,7 @@ export class FasterZip {
await new Promise<void>((resolve, reject) => {
(async () => {
const zipfile = new ZipFile();
const stream = createWriteStream(outputPath).once('error', reject);
const stream = safeCreateWriteStream(outputPath).once('error', reject);

zipfile.outputStream.pipe(stream);

Expand Down Expand Up @@ -104,7 +109,7 @@ export class FasterZip {
const transformer =
source.transformer && source.transformer(filePath, metadataPath);

const readStream = createReadStream(filePath).once('error', err =>
const readStream = safeCreateReadStream(filePath).once('error', err =>
onErrorOnStream(err),
);

Expand Down

0 comments on commit 58609ca

Please sign in to comment.