Skip to content

Commit

Permalink
feat: 🎸 implement readFileSync() method
Browse files Browse the repository at this point in the history
  • Loading branch information
streamich committed Jun 18, 2023
1 parent bb803e2 commit 953d276
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 11 deletions.
4 changes: 3 additions & 1 deletion demo/fsa/main.ts
Expand Up @@ -17,7 +17,9 @@ const demo = async (dir: fsa.IFileSystemDirectoryHandle) => {
// fs.accessSync('/test.txt', fs.constants.F_OK);
console.log('/test.txt', fs.statSync('/test.txt'), fs.statSync('/test.txt').isFile(), fs.statSync('/test.txt').isDirectory());
console.log('/dir', fs.statSync('/dir'), fs.statSync('/dir').isFile(), fs.statSync('/dir').isDirectory());
console.log('data', fs.readFileSync('/test.txt', 'utf8'));
console.log('/test.txt', fs.readFileSync('/test.txt', 'utf8'));
fs.writeFileSync('/cool.txt', 'worlds');
console.log('/cool.txt', fs.readFileSync('/cool.txt', 'utf8'));
// await fs.promises.mkdir('storage/a/b/c', {recursive: true});
// await fs.promises.rm('storage/a/b', {recursive: true});

Expand Down
9 changes: 9 additions & 0 deletions src/fsa-to-node/FsaNodeCore.ts
Expand Up @@ -124,4 +124,13 @@ export class FsaNodeCore {
this.fds.set(fd, file);
return file;
}

protected getFileName(id: misc.TFileId): string {
if (typeof id === 'number') {
const openFile = this.fds.get(id);
if (!openFile) throw createError('EBADF', 'readFile');
return openFile.filename;
}
return pathToFilename(id);
}
}
21 changes: 13 additions & 8 deletions src/fsa-to-node/FsaNodeFs.ts
Expand Up @@ -16,6 +16,7 @@ import {
getStatOptions,
} from '../node/options';
import {
bufToUint8,
bufferToEncoding,
createError,
dataToBuffer,
Expand Down Expand Up @@ -778,21 +779,26 @@ export class FsaNodeFs extends FsaNodeCore implements FsCallbackApi, FsSynchrono
adapter.call('access', {filename, mode});
};

public readonly readFileSync: FsSynchronousApi['readFileSync'] = (file: misc.TFileId, options?: opts.IReadFileOptions | string): misc.TDataOut => {
public readonly readFileSync: FsSynchronousApi['readFileSync'] = (id: misc.TFileId, options?: opts.IReadFileOptions | string): misc.TDataOut => {
const opts = getReadFileOptions(options);
const flagsNum = flagsToNumber(opts.flag);
let filename: string = '';
if (typeof file === 'number') {
const openFile = this.fds.get(file);
if (!openFile) throw createError('EBADF', 'readFile');
filename = openFile.filename;
} else filename = pathToFilename(file);
const filename = this.getFileName(id);
const adapter = this.getSyncAdapter();
const uint8 = adapter.call('readFile', {filename, opts});
const buffer = Buffer.from(uint8.buffer, uint8.byteOffset, uint8.byteLength);
return bufferToEncoding(buffer, opts.encoding);
};

public readonly writeFileSync: FsSynchronousApi['writeFileSync'] = (id: misc.TFileId, data: misc.TData, options?: opts.IWriteFileOptions): void => {
const opts = getWriteFileOptions(options);
const flagsNum = flagsToNumber(opts.flag);
const modeNum = modeToNumber(opts.mode);
const buf = dataToBuffer(data, opts.encoding);
const filename = this.getFileName(id);
const adapter = this.getSyncAdapter();
adapter.call('writeFile', {filename, data: bufToUint8(buf), opts});
};

public readonly appendFileSync: FsSynchronousApi['appendFileSync'] = notSupported;
public readonly chmodSync: FsSynchronousApi['chmodSync'] = noop;
public readonly chownSync: FsSynchronousApi['chownSync'] = noop;
Expand Down Expand Up @@ -824,7 +830,6 @@ export class FsaNodeFs extends FsaNodeCore implements FsCallbackApi, FsSynchrono
public readonly truncateSync: FsSynchronousApi['truncateSync'] = notSupported;
public readonly unlinkSync: FsSynchronousApi['unlinkSync'] = notSupported;
public readonly utimesSync: FsSynchronousApi['utimesSync'] = noop;
public readonly writeFileSync: FsSynchronousApi['writeFileSync'] = notSupported;
public readonly writeSync: FsSynchronousApi['writeSync'] = notSupported;

// ------------------------------------------------------------ FsPromisesApi
Expand Down
3 changes: 2 additions & 1 deletion src/fsa-to-node/types.ts
Expand Up @@ -8,7 +8,8 @@ export type FsLocation = [folder: string[], file: string];
export interface FsaNodeSyncAdapterApi {
stat(location: FsLocation): FsaNodeSyncAdapterStats;
access(req: {filename: string, mode: number}): void;
readFile(req: {filename: string, opts: opts.IReadFileOptions}): Uint8Array;
readFile(req: {filename: string, opts?: opts.IReadFileOptions}): Uint8Array;
writeFile(req: {filename: string, data: Uint8Array, opts?: opts.IWriteFileOptions}): void;
}

export interface FsaNodeSyncAdapter {
Expand Down
3 changes: 3 additions & 0 deletions src/fsa-to-node/worker/FsaNodeSyncWorker.ts
Expand Up @@ -129,5 +129,8 @@ export class FsaNodeSyncWorker {
const uint8 = new Uint8Array(buf, buf.byteOffset, buf.byteLength);
return uint8;
},
writeFile: async ({filename, data, opts}): Promise<void> => {
await this.fs.promises.writeFile(filename, data, {...opts, encoding: 'buffer'});
},
};
}
3 changes: 3 additions & 0 deletions src/node/util.ts
Expand Up @@ -177,6 +177,9 @@ export function dataToBuffer(data: misc.TData, encoding: string = ENCODING_UTF8)
else return bufferFrom(String(data), encoding);
}

export const bufToUint8 = (buf: Buffer): Uint8Array =>
new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);

export const getWriteArgs = (
fd: number,
a?: unknown,
Expand Down
2 changes: 1 addition & 1 deletion src/volume.ts
Expand Up @@ -1009,7 +1009,7 @@ export class Volume {
}
}

writeFileSync(id: TFileId, data: TData, options?: opts.IWriteFileOptions) {
writeFileSync(id: TFileId, data: TData, options?: opts.IWriteFileOptions): void {
const opts = getWriteFileOptions(options);
const flagsNum = flagsToNumber(opts.flag);
const modeNum = modeToNumber(opts.mode);
Expand Down

0 comments on commit 953d276

Please sign in to comment.