Skip to content

Commit c3ddc6c

Browse files
committedJul 27, 2024·
feat: 🎸 implement FileHandle.readableWebStream()
1 parent ad54ddb commit c3ddc6c

File tree

4 files changed

+28
-2
lines changed

4 files changed

+28
-2
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { fromStream } from '@jsonjoy.com/util/lib/streams/fromStream';
2+
import { createFs } from '../util';
3+
4+
describe('FileHandle', () => {
5+
describe('.readableWebStream()', () => {
6+
it('can read contest of a file', async () => {
7+
const fs = createFs();
8+
fs.writeFileSync('/foo', 'bar');
9+
const handle = await fs.promises.open('/foo', 'r');
10+
const stream = handle.readableWebStream();
11+
expect(stream).toBeInstanceOf(ReadableStream);
12+
const data = fromStream(stream);
13+
expect(await data).toEqual(Buffer.from('bar'));
14+
});
15+
});
16+
});

‎src/node/FileHandle.ts

+10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ export class FileHandle implements IFileHandle {
3333
return promisify(this.fs, 'fdatasync')(this.fd);
3434
}
3535

36+
readableWebStream(options?: opts.IReadableWebStreamOptions): ReadableStream {
37+
return new ReadableStream({
38+
pull: async (controller) => {
39+
const data = await this.readFile();
40+
controller.enqueue(data);
41+
controller.close();
42+
},
43+
});
44+
};
45+
3646
read(buffer: Buffer | Uint8Array, offset: number, length: number, position: number): Promise<TFileHandleReadResult> {
3747
return promisify(this.fs, 'read', bytesRead => ({ bytesRead, buffer }))(this.fd, buffer, offset, length, position);
3848
}

‎src/node/types/FsPromisesApi.ts

-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ export interface FsPromisesApi {
2020
mkdtemp(prefix: string, options?: opts.IOptions): Promise<misc.TDataOut>;
2121
open(path: misc.PathLike, flags?: misc.TFlags, mode?: misc.TMode): Promise<misc.IFileHandle>;
2222
opendir(path: misc.PathLike, options?: opts.IOpendirOptions): Promise<misc.IDir>;
23-
readableWebStream: (options?: opts.IReadableWebStreamOptions) => ReadableStream;
2423
readdir(path: misc.PathLike, options?: opts.IReaddirOptions | string): Promise<misc.TDataOut[] | misc.IDirent[]>;
2524
readFile(id: misc.TFileHandle, options?: opts.IReadFileOptions | string): Promise<misc.TDataOut>;
2625
readlink(path: misc.PathLike, options?: opts.IOptions): Promise<misc.TDataOut>;

‎src/node/types/misc.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import type { EventEmitter } from 'events';
44
import type { TSetTimeout } from '../../setTimeoutUnref';
55
import type {
66
IAppendFileOptions,
7+
IReadableWebStreamOptions,
78
IReadFileOptions,
8-
IReadStreamOptions,
99
IStatOptions,
1010
IWriteFileOptions,
1111
} from './options';
@@ -129,6 +129,7 @@ export interface IFileHandle {
129129
chown(uid: number, gid: number): Promise<void>;
130130
close(): Promise<void>;
131131
datasync(): Promise<void>;
132+
readableWebStream(options?: IReadableWebStreamOptions): ReadableStream;
132133
read(buffer: Buffer | Uint8Array, offset: number, length: number, position: number): Promise<TFileHandleReadResult>;
133134
readv(buffers: ArrayBufferView[], position?: number | null): Promise<TFileHandleReadvResult>;
134135
readFile(options?: IReadFileOptions | string): Promise<TDataOut>;

0 commit comments

Comments
 (0)
Please sign in to comment.