Skip to content

Commit 1ba1549

Browse files
committed
Add support for reading from a WebStreams
- Stream Blob via a WebStreams, instead of buffering the full content - Update strtok3 to v7.0.0
1 parent 37233b1 commit 1ba1549

File tree

4 files changed

+24
-15
lines changed

4 files changed

+24
-15
lines changed

.github/workflows/main.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ jobs:
1010
fail-fast: false
1111
matrix:
1212
node-version:
13+
- 22
1314
- 20
14-
- 18
1515
steps:
1616
- uses: actions/checkout@v4
1717
- uses: actions/setup-node@v4

browser.js

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import {ReadableWebToNodeStream} from 'readable-web-to-node-stream';
2-
import {fileTypeFromStream as coreFileTypeFromStream} from './core.js';
1+
import {fileTypeFromWebStream} from './core.js';
32

4-
export async function fileTypeFromStream(stream) {
5-
const readableWebToNodeStream = new ReadableWebToNodeStream(stream);
6-
const fileType = await coreFileTypeFromStream(readableWebToNodeStream);
7-
await readableWebToNodeStream.close();
3+
export async function fileTypeFromStream(webStream) {
4+
const fileType = await fileTypeFromWebStream(webStream);
5+
await webStream.close();
86
return fileType;
97
}
108

core.js

+17-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import {extensions, mimeTypes} from './supported.js';
1010

1111
const minimumBytes = 4100; // A fair amount of file-types are detectable within this range.
1212

13+
export async function fileTypeFromWebStream(webStream) {
14+
return new FileTypeParser().fromWebStream(webStream);
15+
}
16+
1317
export async function fileTypeFromStream(stream) {
1418
return new FileTypeParser().fromStream(stream);
1519
}
@@ -88,8 +92,7 @@ export class FileTypeParser {
8892
}
8993

9094
async fromBlob(blob) {
91-
const buffer = await blob.arrayBuffer();
92-
return this.fromBuffer(new Uint8Array(buffer));
95+
return this.fromWebStream(blob.stream());
9396
}
9497

9598
async fromStream(stream) {
@@ -101,6 +104,15 @@ export class FileTypeParser {
101104
}
102105
}
103106

107+
async fromWebStream(webStream) {
108+
const tokenizer = await strtok3.fromWebStream(webStream);
109+
try {
110+
return await this.fromTokenizer(tokenizer);
111+
} finally {
112+
await tokenizer.close();
113+
}
114+
}
115+
104116
async toDetectionStream(readableStream, options = {}) {
105117
const {default: stream} = await import('node:stream');
106118
const {sampleSize = minimumBytes} = options;
@@ -576,7 +588,7 @@ export class FileTypeParser {
576588
) {
577589
// They all can have MIME `video/mp4` except `application/mp4` special-case which is hard to detect.
578590
// For some cases, we're specific, everything else falls to `video/mp4` with `mp4` extension.
579-
const brandMajor = this.buffer.toString('binary', 8, 12).replace('\0', ' ').trim();
591+
const brandMajor = this.buffer.toString('latin1', 8, 12).replace('\0', ' ').trim();
580592
switch (brandMajor) {
581593
case 'avif':
582594
case 'avis':
@@ -1059,7 +1071,7 @@ export class FileTypeParser {
10591071
}
10601072

10611073
if (this.checkString('AC')) {
1062-
const version = this.buffer.toString('binary', 2, 6);
1074+
const version = this.buffer.toString('latin1', 2, 6);
10631075
if (version.match('^d*') && version >= 1000 && version <= 1050) {
10641076
return {
10651077
ext: 'dwg',
@@ -1126,7 +1138,7 @@ export class FileTypeParser {
11261138
async function readChunkHeader() {
11271139
return {
11281140
length: await tokenizer.readToken(Token.INT32_BE),
1129-
type: await tokenizer.readToken(new Token.StringType(4, 'binary')),
1141+
type: await tokenizer.readToken(new Token.StringType(4, 'latin1')),
11301142
};
11311143
}
11321144

package.json

+2-3
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,8 @@
210210
"fbx"
211211
],
212212
"dependencies": {
213-
"readable-web-to-node-stream": "^3.0.2",
214-
"strtok3": "^7.0.0",
215-
"token-types": "^5.0.1"
213+
"strtok3": "^7.1.0",
214+
"token-types": "^6.0.0"
216215
},
217216
"devDependencies": {
218217
"@tokenizer/token": "^0.3.0",

0 commit comments

Comments
 (0)