diff options
Diffstat (limited to 'ext/node/polyfills')
-rw-r--r-- | ext/node/polyfills/internal/fs/handle.ts | 63 |
1 files changed, 61 insertions, 2 deletions
diff --git a/ext/node/polyfills/internal/fs/handle.ts b/ext/node/polyfills/internal/fs/handle.ts index 199457787..fbe535840 100644 --- a/ext/node/polyfills/internal/fs/handle.ts +++ b/ext/node/polyfills/internal/fs/handle.ts @@ -1,8 +1,7 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. import { EventEmitter } from "ext:deno_node/events.ts"; import { Buffer } from "ext:deno_node/buffer.ts"; -import { promises, read } from "ext:deno_node/fs.ts"; -import type { Buffer } from "ext:deno_node/buffer.ts"; +import { promises, read, write } from "ext:deno_node/fs.ts"; import { BinaryOptionsArgument, FileOptionsArgument, @@ -10,6 +9,11 @@ import { TextOptionsArgument, } from "ext:deno_node/_fs/_fs_common.ts"; +interface WriteResult { + bytesWritten: number; + buffer: Buffer | string; +} + interface ReadResult { bytesRead: number; buffer: Buffer; @@ -69,6 +73,61 @@ export class FileHandle extends EventEmitter { return promises.readFile(this, opt); } + write( + buffer: Buffer, + offset: number, + length: number, + position: number, + ): Promise<WriteResult>; + write( + str: string, + position: number, + encoding: string, + ): Promise<WriteResult>; + write( + bufferOrStr: Buffer | string, + offsetOrPotition: number, + lengthOrEncoding: number | string, + position?: number, + ): Promise<WriteResult> { + if (bufferOrStr instanceof Buffer) { + const buffer = bufferOrStr; + const offset = offsetOrPotition; + const length = lengthOrEncoding; + + return new Promise((resolve, reject) => { + write( + this.fd, + buffer, + offset, + length, + position, + (err, bytesWritten, buffer) => { + if (err) reject(err); + else resolve({ buffer, bytesWritten }); + }, + ); + }); + } else { + const str = bufferOrStr; + const position = offsetOrPotition; + const encoding = lengthOrEncoding; + + return new Promise((resolve, reject) => { + write( + this.fd, + str, + position, + encoding, + (err, bytesWritten, buffer) => { + if (err) reject(err); + else resolve({ buffer, bytesWritten }); + }, + ); + }); + } + } + close(): Promise<void> { // Note that Deno.close is not async return Promise.resolve(Deno.close(this.fd)); |