Skip to content

Commit 3807c2e

Browse files
committed
Use node-readable-to-web-readable-stream for unit testing
1 parent ea9229e commit 3807c2e

File tree

4 files changed

+36
-60
lines changed

4 files changed

+36
-60
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
"chai-as-promised": "^8.0.1",
6868
"del-cli": "^6.0.0",
6969
"mocha": "^11.1.0",
70+
"node-readable-to-web-readable-stream": "^0.4.2",
7071
"remark-cli": "^12.0.1",
7172
"remark-preset-lint-recommended": "^7.0.1",
7273
"token-types": "^6.0.0",

test/test.ts

+8-13
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { EndOfStreamError } from 'peek-readable';
2121
import mocha from 'mocha';
2222
import { stringToUint8Array } from 'uint8array-extras';
2323

24-
import { DelayedStream, makeReadableByteFileStream } from './util.js';
24+
import { DelayedStream, makeByteReadableStreamFromFile } from './util.js';
2525
import process from 'node:process';
2626

2727
use(chaiAsPromised);
@@ -64,8 +64,8 @@ describe('Matrix tests', () => {
6464
}, {
6565
name: 'fromWebStream()',
6666
loadTokenizer: async (testFile, delay, abortSignal?: AbortSignal) => {
67-
const fileStream = await makeReadableByteFileStream(Path.join(__dirname, 'resources', testFile), delay);
68-
return fromWebStream(fileStream.stream, {onClose: () => fileStream.closeFile(), abortSignal});
67+
const fileStream = makeByteReadableStreamFromFile(Path.join(__dirname, 'resources', testFile), delay);
68+
return fromWebStream(fileStream, {abortSignal});
6969
},
7070
hasFileInfo: false,
7171
abortable: true,
@@ -1068,15 +1068,10 @@ it('should determine the file size using a file stream', async () => {
10681068

10691069
it('should release stream after close', async () => {
10701070

1071-
const fileStream = await makeReadableByteFileStream(Path.join(__dirname, 'resources', 'test1.dat'), 0);
1072-
const stream = fileStream.stream;
1073-
assert.isFalse(stream.locked, 'stream is unlocked before initializing tokenizer');
1074-
const webStreamTokenizer = fromWebStream(fileStream.stream, {
1075-
onClose: () => {
1076-
return fileStream.closeFile();
1077-
}
1078-
});
1079-
assert.isTrue(stream.locked, 'stream is locked after initializing tokenizer');
1071+
const fileStream = makeByteReadableStreamFromFile(Path.join(__dirname, 'resources', 'test1.dat'), 0);
1072+
assert.isFalse(fileStream.locked, 'stream is unlocked before initializing tokenizer');
1073+
const webStreamTokenizer = fromWebStream(fileStream);
1074+
assert.isTrue(fileStream.locked, 'stream is locked after initializing tokenizer');
10801075
await webStreamTokenizer.close();
1081-
assert.isFalse(stream.locked, 'stream is unlocked after closing tokenizer');
1076+
assert.isFalse(fileStream.locked, 'stream is unlocked after closing tokenizer');
10821077
});

test/util.ts

+19-47
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,23 @@
1-
import * as fs from 'node:fs/promises';
2-
import { ReadableStream } from 'node:stream/web';
3-
import { Readable } from 'node:stream';
4-
5-
export async function makeReadableByteFileStream(filename: string, delay = 0): Promise<{ stream: ReadableStream<Uint8Array>, closeFile: () => Promise<void> }> {
6-
7-
let position = 0;
8-
const fileHandle = await fs.open(filename, 'r');
9-
10-
return {
11-
stream: new ReadableStream({
12-
type: 'bytes',
13-
14-
async pull(controller) {
15-
16-
// @ts-ignore
17-
const view = controller.byobRequest.view;
18-
19-
setTimeout(async () => {
20-
try {
21-
const {bytesRead} = await fileHandle.read(view, 0, view.byteLength, position);
22-
if (bytesRead === 0) {
23-
await fileHandle.close();
24-
controller.close();
25-
// @ts-ignore
26-
controller.byobRequest.respond(0);
27-
} else {
28-
position += bytesRead;
29-
// @ts-ignore
30-
controller.byobRequest.respond(bytesRead);
31-
}
32-
} catch (err) {
33-
controller.error(err);
34-
await fileHandle.close();
35-
}
36-
}, delay);
37-
},
38-
39-
cancel() {
40-
return fileHandle.close();
41-
},
42-
43-
autoAllocateChunkSize: 1024
44-
}),
45-
closeFile: () => {
46-
return fileHandle.close();
1+
import { createReadStream } from 'node:fs';
2+
import { Transform, Readable } from 'node:stream';
3+
import { makeByteReadableStreamFromNodeReadable } from 'node-readable-to-web-readable-stream';
4+
5+
export function makeByteReadableStreamFromFile(filename: string, delay = 0): ReadableStream<Uint8Array> {
6+
7+
// Create a Node.js Readable stream
8+
const nodeReadable = createReadStream(filename);
9+
10+
// Create a Transform stream to introduce delay
11+
const delayTransform = new Transform({
12+
transform(chunk, encoding, callback) {
13+
setTimeout(() => callback(null, chunk), delay);
4714
}
48-
};
15+
});
16+
17+
// Pipe through the delay transform
18+
const delayedNodeStream = nodeReadable.pipe(delayTransform);
19+
20+
return makeByteReadableStreamFromNodeReadable(delayedNodeStream);
4921
}
5022

5123
export class DelayedStream extends Readable {

yarn.lock

+8
Original file line numberDiff line numberDiff line change
@@ -2359,6 +2359,13 @@ __metadata:
23592359
languageName: node
23602360
linkType: hard
23612361

2362+
"node-readable-to-web-readable-stream@npm:^0.4.2":
2363+
version: 0.4.2
2364+
resolution: "node-readable-to-web-readable-stream@npm:0.4.2"
2365+
checksum: 10c0/8c3d09cac51c5f886e1636fa2a5404d664245c8bdc9a65e102552894963ed1b27207d5b94de59e37045d81cb9e8970cf79e561006df7ee8821cb761e728b3a80
2366+
languageName: node
2367+
linkType: hard
2368+
23622369
"nopt@npm:^7.0.0, nopt@npm:^7.2.1":
23632370
version: 7.2.1
23642371
resolution: "nopt@npm:7.2.1"
@@ -3136,6 +3143,7 @@ __metadata:
31363143
chai-as-promised: "npm:^8.0.1"
31373144
del-cli: "npm:^6.0.0"
31383145
mocha: "npm:^11.1.0"
3146+
node-readable-to-web-readable-stream: "npm:^0.4.2"
31393147
peek-readable: "npm:^7.0.0"
31403148
remark-cli: "npm:^12.0.1"
31413149
remark-preset-lint-recommended: "npm:^7.0.1"

0 commit comments

Comments
 (0)