From 4caf28b13990b95122eec5ac17177deb47f23144 Mon Sep 17 00:00:00 2001 From: Vadim Dalecky Date: Mon, 19 Jun 2023 00:12:52 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20add=20truncateSync()=20a?= =?UTF-8?q?nd=20ftruncateSync()=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo/fsa/main.ts | 5 +++++ src/fsa-to-node/FsaNodeFs.ts | 13 +++++++++++-- src/fsa-to-node/types.ts | 1 + src/fsa-to-node/worker/FsaNodeSyncWorker.ts | 3 +++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/demo/fsa/main.ts b/demo/fsa/main.ts index 1a016b76e..dceeee119 100644 --- a/demo/fsa/main.ts +++ b/demo/fsa/main.ts @@ -66,6 +66,11 @@ const demo = async (dir: fsa.IFileSystemDirectoryHandle) => { await fs.promises.mkdir('/tmp'); const tmpDirName = fs.mkdtempSync('/tmp/temporary-'); strictEqual(fs.statSync(tmpDirName).isDirectory(), true); + + console.log('truncateSync() - can truncate a file'); + await fs.promises.writeFile('/truncated.txt', 'truncate here: abcdefghijklmnopqrstuvwxyz'); + fs.truncateSync('/truncated.txt', 14); + strictEqual(fs.readFileSync('/truncated.txt', 'utf8'), 'truncate here:'); }; const main = async () => { diff --git a/src/fsa-to-node/FsaNodeFs.ts b/src/fsa-to-node/FsaNodeFs.ts index c1ea2a130..96f03428e 100644 --- a/src/fsa-to-node/FsaNodeFs.ts +++ b/src/fsa-to-node/FsaNodeFs.ts @@ -891,12 +891,21 @@ export class FsaNodeFs extends FsaNodeCore implements FsCallbackApi, FsSynchrono return bufferToEncoding(buffer, opts.encoding); }; - public readonly ftruncateSync: FsSynchronousApi['ftruncateSync'] = notSupported; + public readonly truncateSync: FsSynchronousApi['truncateSync'] = (id: misc.TFileId, len?: number): void => { + if (isFd(id)) return this.ftruncateSync(id as number, len); + const filename = pathToFilename(id as misc.PathLike); + this.getSyncAdapter().call('trunc', [filename, Number(len) || 0]); + }; + + public readonly ftruncateSync: FsSynchronousApi['ftruncateSync'] = (fd: number, len?: number): void => { + const filename = this.getFileName(fd); + this.truncateSync(filename, len); + }; + public readonly openSync: FsSynchronousApi['openSync'] = notSupported; public readonly readdirSync: FsSynchronousApi['readdirSync'] = notSupported; public readonly readSync: FsSynchronousApi['readSync'] = notSupported; public readonly realpathSync: FsSynchronousApi['realpathSync'] = notSupported; - public readonly truncateSync: FsSynchronousApi['truncateSync'] = notSupported; public readonly unlinkSync: FsSynchronousApi['unlinkSync'] = notSupported; public readonly writeSync: FsSynchronousApi['writeSync'] = notSupported; diff --git a/src/fsa-to-node/types.ts b/src/fsa-to-node/types.ts index 24db7d05e..50de9e687 100644 --- a/src/fsa-to-node/types.ts +++ b/src/fsa-to-node/types.ts @@ -18,6 +18,7 @@ export interface FsaNodeSyncAdapterApi { rm(req: [filename: string, opts?: opts.IRmOptions]): void; mkdir(req: [filename: string, opts?: misc.TMode | opts.IMkdirOptions]): string | undefined; mkdtemp(req: [filename: string, opts?: misc.TMode | opts.IOptions]): string; + trunc(req: [filename: string, len: number]): void; } export interface FsaNodeSyncAdapter { diff --git a/src/fsa-to-node/worker/FsaNodeSyncWorker.ts b/src/fsa-to-node/worker/FsaNodeSyncWorker.ts index 70f2f8f39..69ef8f9b4 100644 --- a/src/fsa-to-node/worker/FsaNodeSyncWorker.ts +++ b/src/fsa-to-node/worker/FsaNodeSyncWorker.ts @@ -153,5 +153,8 @@ export class FsaNodeSyncWorker { mkdtemp: async ([filename]): Promise => { return await this.fs.promises.mkdtemp(filename, {encoding: 'utf8'}) as string; }, + trunc: async ([filename, len]): Promise => { + await this.fs.promises.truncate(filename, len); + }, }; }