From 646efafe2355794509d67ef13e59e5afcbbae8ae Mon Sep 17 00:00:00 2001 From: streamich Date: Sun, 18 Jun 2023 20:05:01 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20implement=20closeSync()?= =?UTF-8?q?=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/fsa-to-node/FsaNodeCore.ts | 6 +++++- src/fsa-to-node/FsaNodeFs.ts | 37 +++++++++++++++++++++------------- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/fsa-to-node/FsaNodeCore.ts b/src/fsa-to-node/FsaNodeCore.ts index 759f9ec03..b66fbc3fe 100644 --- a/src/fsa-to-node/FsaNodeCore.ts +++ b/src/fsa-to-node/FsaNodeCore.ts @@ -89,13 +89,17 @@ export class FsaNodeCore { } } - protected async getFileByFd(fd: number, funcName?: string): Promise { + protected getFileByFd(fd: number, funcName?: string): FsaNodeFsOpenFile { if (!isFd(fd)) throw TypeError(ERRSTR.FD); const file = this.fds.get(fd); if (!file) throw createError('EBADF', funcName); return file; } + protected async getFileByFdAsync(fd: number, funcName?: string): Promise { + return this.getFileByFd(fd, funcName); + } + protected async getFileById( id: misc.TFileId, funcName?: string, diff --git a/src/fsa-to-node/FsaNodeFs.ts b/src/fsa-to-node/FsaNodeFs.ts index 3b038ee15..60ea25375 100644 --- a/src/fsa-to-node/FsaNodeFs.ts +++ b/src/fsa-to-node/FsaNodeFs.ts @@ -87,11 +87,12 @@ export class FsaNodeFs extends FsaNodeCore implements FsCallbackApi, FsSynchrono public readonly close: FsCallbackApi['close'] = (fd: number, callback: misc.TCallback): void => { validateFd(fd); - this.getFileByFd(fd, 'close') + this.getFileByFdAsync(fd, 'close') .then(file => file.close()) .then( () => { this.fds.delete(fd); + this.releasedFds.push(fd); callback(null); }, error => { @@ -511,7 +512,7 @@ export class FsaNodeFs extends FsaNodeCore implements FsCallbackApi, FsSynchrono ): void => { const len: number = typeof a === 'number' ? a : 0; const callback: misc.TCallback = validateCallback(typeof a === 'number' ? b : a); - this.getFileByFd(fd) + this.getFileByFdAsync(fd) .then(file => file.file.createWritable({ keepExistingData: true })) .then(writable => writable.truncate(len).then(() => writable.close())) .then( @@ -735,7 +736,7 @@ export class FsaNodeFs extends FsaNodeCore implements FsCallbackApi, FsSynchrono const filename = pathToFilename(path); const flags = flagsToNumber(optionsObj.flags ?? 'w'); const fd: number = optionsObj.fd ? (typeof optionsObj.fd === 'number' ? optionsObj.fd : optionsObj.fd.fd) : 0; - const handle = fd ? this.getFileByFd(fd) : this.__open(filename, flags, 0); + const handle = fd ? this.getFileByFdAsync(fd) : this.__open(filename, flags, 0); const stream = new FsaNodeWriteStream(handle, filename, optionsObj); if (optionsObj.autoClose) { stream.once('finish', () => { @@ -799,21 +800,19 @@ export class FsaNodeFs extends FsaNodeCore implements FsCallbackApi, FsSynchrono adapter.call('writeFile', {filename, data: bufToUint8(buf), opts}); }; + public readonly closeSync: FsSynchronousApi['closeSync'] = (fd: number) => { + validateFd(fd); + const file = this.getFileByFd(fd, 'close'); + file.close().catch(() => {}); + this.fds.delete(fd); + this.releasedFds.push(fd); + }; + public readonly appendFileSync: FsSynchronousApi['appendFileSync'] = notSupported; - public readonly chmodSync: FsSynchronousApi['chmodSync'] = noop; - public readonly chownSync: FsSynchronousApi['chownSync'] = noop; - public readonly closeSync: FsSynchronousApi['closeSync'] = notSupported; public readonly copyFileSync: FsSynchronousApi['copyFileSync'] = notSupported; public readonly existsSync: FsSynchronousApi['existsSync'] = notSupported; - public readonly fchmodSync: FsSynchronousApi['fchmodSync'] = noop; - public readonly fchownSync: FsSynchronousApi['fchownSync'] = noop; - public readonly fdatasyncSync: FsSynchronousApi['fdatasyncSync'] = noop; public readonly fstatSync: FsSynchronousApi['fstatSync'] = notSupported; - public readonly fsyncSync: FsSynchronousApi['fsyncSync'] = noop; public readonly ftruncateSync: FsSynchronousApi['ftruncateSync'] = notSupported; - public readonly futimesSync: FsSynchronousApi['futimesSync'] = noop; - public readonly lchmodSync: FsSynchronousApi['lchmodSync'] = noop; - public readonly lchownSync: FsSynchronousApi['lchownSync'] = noop; public readonly linkSync: FsSynchronousApi['linkSync'] = notSupported; public readonly mkdirSync: FsSynchronousApi['mkdirSync'] = notSupported; public readonly mkdirpSync: FsSynchronousApi['mkdirpSync'] = notSupported; @@ -829,8 +828,18 @@ export class FsaNodeFs extends FsaNodeCore implements FsCallbackApi, FsSynchrono public readonly symlinkSync: FsSynchronousApi['symlinkSync'] = notSupported; public readonly truncateSync: FsSynchronousApi['truncateSync'] = notSupported; public readonly unlinkSync: FsSynchronousApi['unlinkSync'] = notSupported; - public readonly utimesSync: FsSynchronousApi['utimesSync'] = noop; public readonly writeSync: FsSynchronousApi['writeSync'] = notSupported; + + public readonly fsyncSync: FsSynchronousApi['fsyncSync'] = noop; + public readonly chmodSync: FsSynchronousApi['chmodSync'] = noop; + public readonly chownSync: FsSynchronousApi['chownSync'] = noop; + public readonly fchmodSync: FsSynchronousApi['fchmodSync'] = noop; + public readonly fchownSync: FsSynchronousApi['fchownSync'] = noop; + public readonly fdatasyncSync: FsSynchronousApi['fdatasyncSync'] = noop; + public readonly futimesSync: FsSynchronousApi['futimesSync'] = noop; + public readonly lchmodSync: FsSynchronousApi['lchmodSync'] = noop; + public readonly lchownSync: FsSynchronousApi['lchownSync'] = noop; + public readonly utimesSync: FsSynchronousApi['utimesSync'] = noop; // ------------------------------------------------------------ FsPromisesApi