Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix file info size check #476

Merged
merged 3 commits into from
Aug 2, 2021
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion core.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ async function _fromTokenizer(tokenizer) {
const checkString = (header, options) => check(stringToBytes(header), options);

// Keep reading until EOF if the file size is unknown.
if (tokenizer.fileInfo.size === 0) {
if (tokenizer.fileInfo.size === undefined || tokenizer.fileInfo.size === null || tokenizer.fileInfo.size === 0) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's specifically undefined and not null, but I figured it would be better to accept both?

It's also never 0 (in the tests at least), I think before they are using undefined to indicate that the size hasn't been set yet. So potentially we want to remove 0? 馃

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Borewit The .size property is not documented to be undefined. The docs should use number? instead of number to make that clear.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@LinusU Let's only check for undefined.

Copy link
Collaborator

@Borewit Borewit Jul 31, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just started looking into the failing tests as well. I noticed 2 things:

  1. The fileInfo.size is, for some reason, not set reading from a file-stream (fs.createReadStream) includes the original file path which is used to determine the file size)
    2. There are cases fileInfo.size is undefined (because the stream length is not known), so that code needs to be improved. The file fileInfo.size is overwritten to Number.MAX_SAFE_INTEGER in case the length is unknown.

I don't directly remember where the 0 is coming from. I will try to give some clarity on that and improve the documentation accordingly.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Issue with size being 0 introduced here: https://github.com/sindresorhus/file-type/blame/331b1620c0d6a29b70a2e8e6c246cb2bdd93b183/core.js#L73

Yes, the linter auto-fix assumed .size would be a number and never undefined. It doesn't read the types. The previous check was too loose anyway though, so it's good that we make it more strict now.

tokenizer.fileInfo.size = Number.MAX_SAFE_INTEGER;
}

Expand Down
4 changes: 2 additions & 2 deletions index.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ expectType<Promise<FileTypeResult | undefined>>(fileTypeFromBuffer(new ArrayBuff
}
})();

expectType<Set<FileExtension>>(supportedExtensions);
expectType<ReadonlySet<FileExtension>>(supportedExtensions);

expectType<Set<MimeType>>(supportedMimeTypes);
expectType<ReadonlySet<MimeType>>(supportedMimeTypes);

const readableStream = fs.createReadStream('file.png');
const streamWithFileType = fileTypeStream(readableStream);
Expand Down