From f942eeb54b3ae8298a417bf56f46f296d67f6a9e Mon Sep 17 00:00:00 2001 From: k-nasa Date: Tue, 6 Jun 2023 21:25:56 +0900 Subject: [PATCH 1/7] Implement write method --- ext/node/polyfills/internal/fs/handle.ts | 27 +++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/ext/node/polyfills/internal/fs/handle.ts b/ext/node/polyfills/internal/fs/handle.ts index a1ee263ead6c6c..722686c813a09f 100644 --- a/ext/node/polyfills/internal/fs/handle.ts +++ b/ext/node/polyfills/internal/fs/handle.ts @@ -1,13 +1,26 @@ // 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 } from "ext:deno_node/fs.ts"; +import { promises, write } from "ext:deno_node/fs.ts"; import { BinaryOptionsArgument, FileOptionsArgument, TextOptionsArgument, } from "ext:deno_node/_fs/_fs_common.ts"; + +interface WriteResult { + bytesRead: number; + buffer: Buffer; +} + +type WriteOptions = { + buffer: Buffer | Uint8Array; + offset: number; + length: number; + position: number | null; +}; + export class FileHandle extends EventEmitter { #rid: number; constructor(rid: number) { @@ -25,6 +38,18 @@ export class FileHandle extends EventEmitter { return promises.readFile(this, opt); } + write(buffer: Buffer, offset: number, length: number, position: number): promise { + return new Promise((resolve, reject) => { + write(this.rid, buffer, offset, length, position, (err, bytesWritten, buffer) => { + if (err) { + reject(err); + } else { + resolve({ bytesRead: bytesWritten, buffer }); + } + } + }; + } + close(): Promise { // Note that Deno.close is not async return Promise.resolve(Deno.close(this.fd)); From 3b563a7883ae5c1bc686a5f60f21cf6bfbf50eba Mon Sep 17 00:00:00 2001 From: k-nasa Date: Tue, 6 Jun 2023 21:38:37 +0900 Subject: [PATCH 2/7] implement write method --- cli/tests/unit_node/_fs/_fs_handle_test.ts | 35 ++++++++++++++++ ext/node/polyfills/internal/fs/handle.ts | 48 ++++++++++++++++------ 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/cli/tests/unit_node/_fs/_fs_handle_test.ts b/cli/tests/unit_node/_fs/_fs_handle_test.ts index 165608e1ce771e..81a1f9e4e4f188 100644 --- a/cli/tests/unit_node/_fs/_fs_handle_test.ts +++ b/cli/tests/unit_node/_fs/_fs_handle_test.ts @@ -18,3 +18,38 @@ Deno.test("readFileSuccess", async function () { await fileHandle.close(); }); + +Deno.test("write", async function () { + const tempFile: string = await Deno.makeTempFile(); + const fileHandle = await fs.open(tempFile); + + const buffer = Buffer.from("hello world"); + const bytesWrite = await filehandle.write(buffer, 0, 5, 0); + fileHandle.close(); + + const data = await fileHandle.readFile(); + await Deno.remove(tempFile); + + assertEquals(bytesWrite, 5); + assertEquals(decoder.decode(data), "hello"); +}); + +Deno.test("write with opt", async function () { + const tempFile: string = await Deno.makeTempFile(); + const fileHandle = await fs.open(tempFile); + + const buffer = Buffer.from("hello world"); + const opt = { + buffer, + offset: 0, + length: 5, + }; + + fileHandle.close(); + + const data = await fileHandle.readFile(); + await Deno.remove(tempFile); + + assertEquals(bytesWrite, 5); + assertEquals(decoder.decode(data), "hello"); +}); diff --git a/ext/node/polyfills/internal/fs/handle.ts b/ext/node/polyfills/internal/fs/handle.ts index 722686c813a09f..7a127d4c5e1104 100644 --- a/ext/node/polyfills/internal/fs/handle.ts +++ b/ext/node/polyfills/internal/fs/handle.ts @@ -8,9 +8,8 @@ import { TextOptionsArgument, } from "ext:deno_node/_fs/_fs_common.ts"; - interface WriteResult { - bytesRead: number; + bytesWritten: number; buffer: Buffer; } @@ -38,16 +37,41 @@ export class FileHandle extends EventEmitter { return promises.readFile(this, opt); } - write(buffer: Buffer, offset: number, length: number, position: number): promise { - return new Promise((resolve, reject) => { - write(this.rid, buffer, offset, length, position, (err, bytesWritten, buffer) => { - if (err) { - reject(err); - } else { - resolve({ bytesRead: bytesWritten, buffer }); - } - } - }; + write( + buffer: Buffer, + offset: number, + length: number, + position: number, + ): Promise; + write(buffer: Buffer, opt: WriteOptions): Promise; + write( + buffer: Buffer, + offsetOrOpt: number | WriteOptions, + length?: number, + position?: number, + ): Promise { + if (offsetOrOpt instanceof number) { + return new Promise((resolve, reject) => { + write( + this.fd, + offsetOrOpt, + offset, + length, + position, + (err, bytesWritten, buffer) => { + if (err) reject(err); + else resolve({ buffer, bytesWritten }); + }, + ); + }); + } else { + return new Promise((resolve, reject) => { + write(this.fd, offsetOrOpt, (err, bytesWritten, buffer) => { + if (err) reject(err); + else resolve({ buffer, bytesWritten }); + }); + }); + } } close(): Promise { From f074df7f0bb6a8a8bef00b3be1143c06ae0ca94d Mon Sep 17 00:00:00 2001 From: k-nasa Date: Tue, 6 Jun 2023 22:31:59 +0900 Subject: [PATCH 3/7] fix --- cli/tests/unit_node/_fs/_fs_handle_test.ts | 26 +++++++------ ext/node/polyfills/internal/fs/handle.ts | 44 ++++++++++------------ 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/cli/tests/unit_node/_fs/_fs_handle_test.ts b/cli/tests/unit_node/_fs/_fs_handle_test.ts index 81a1f9e4e4f188..1f813e9a9b477c 100644 --- a/cli/tests/unit_node/_fs/_fs_handle_test.ts +++ b/cli/tests/unit_node/_fs/_fs_handle_test.ts @@ -1,5 +1,6 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. import * as path from "../../../../test_util/std/path/mod.ts"; +import { Buffer } from "node:buffer"; import { assert, assertEquals, @@ -7,30 +8,31 @@ import { const moduleDir = path.dirname(path.fromFileUrl(import.meta.url)); const testData = path.resolve(moduleDir, "testdata", "hello.txt"); +const fs = await import("node:fs/promises"); +const decoder = new TextDecoder(); Deno.test("readFileSuccess", async function () { - const fs = await import("node:fs/promises"); const fileHandle = await fs.open(testData); const data = await fileHandle.readFile(); assert(data instanceof Uint8Array); - assertEquals(new TextDecoder().decode(data as Uint8Array), "hello world"); + assertEquals(decoder.decode(data as Uint8Array), "hello world"); await fileHandle.close(); }); Deno.test("write", async function () { const tempFile: string = await Deno.makeTempFile(); - const fileHandle = await fs.open(tempFile); + const fileHandle = await fs.open(tempFile, "a+"); const buffer = Buffer.from("hello world"); - const bytesWrite = await filehandle.write(buffer, 0, 5, 0); - fileHandle.close(); + const res = await fileHandle.write(buffer, 0, 5, 0); - const data = await fileHandle.readFile(); + const data = Deno.readFileSync(tempFile); await Deno.remove(tempFile); + await fileHandle.close(); - assertEquals(bytesWrite, 5); + assertEquals(res.bytesWritten, 5); assertEquals(decoder.decode(data), "hello"); }); @@ -40,16 +42,16 @@ Deno.test("write with opt", async function () { const buffer = Buffer.from("hello world"); const opt = { - buffer, offset: 0, length: 5, + potition: 0, }; + const res = await fileHandle.write(buffer, opt); - fileHandle.close(); - - const data = await fileHandle.readFile(); + const data = Deno.readFileSync(tempFile); await Deno.remove(tempFile); + await fileHandle.close(); - assertEquals(bytesWrite, 5); + assertEquals(res.bytesWritten, 5); assertEquals(decoder.decode(data), "hello"); }); diff --git a/ext/node/polyfills/internal/fs/handle.ts b/ext/node/polyfills/internal/fs/handle.ts index 7a127d4c5e1104..1dd46d351924a4 100644 --- a/ext/node/polyfills/internal/fs/handle.ts +++ b/ext/node/polyfills/internal/fs/handle.ts @@ -14,7 +14,6 @@ interface WriteResult { } type WriteOptions = { - buffer: Buffer | Uint8Array; offset: number; length: number; position: number | null; @@ -41,37 +40,34 @@ export class FileHandle extends EventEmitter { buffer: Buffer, offset: number, length: number, - position: number, + position: number | null, ): Promise; write(buffer: Buffer, opt: WriteOptions): Promise; write( - buffer: Buffer, - offsetOrOpt: number | WriteOptions, + buffer: string, + position: number | null, + encoding: string, + ): Promise; + write( + buffer: Buffer | string, + offsetOrPotitionOrOpt?: number | WriteOptions | null, length?: number, position?: number, ): Promise { - if (offsetOrOpt instanceof number) { - return new Promise((resolve, reject) => { - write( - this.fd, - offsetOrOpt, - offset, - length, - position, - (err, bytesWritten, buffer) => { - if (err) reject(err); - else resolve({ buffer, bytesWritten }); - }, - ); - }); - } else { - return new Promise((resolve, reject) => { - write(this.fd, offsetOrOpt, (err, bytesWritten, buffer) => { + console.log({ buffer, offsetOrOpt, length, position }); + return new Promise((resolve, reject) => { + write( + this.fd, + buffer, + offsetOrPotitionOrOpt, + length, + position, + (err, bytesWritten, buffer) => { if (err) reject(err); else resolve({ buffer, bytesWritten }); - }); - }); - } + }, + ); + }); } close(): Promise { From 6e615897b643f06ffd7b89a9f98711cbaba9e369 Mon Sep 17 00:00:00 2001 From: k-nasa Date: Wed, 7 Jun 2023 08:42:10 +0900 Subject: [PATCH 4/7] implement filehandle.write --- cli/tests/unit_node/_fs/_fs_handle_test.ts | 19 +++--- ext/node/polyfills/internal/fs/handle.ts | 71 +++++++++++++--------- 2 files changed, 50 insertions(+), 40 deletions(-) diff --git a/cli/tests/unit_node/_fs/_fs_handle_test.ts b/cli/tests/unit_node/_fs/_fs_handle_test.ts index 1f813e9a9b477c..bee78c97b59642 100644 --- a/cli/tests/unit_node/_fs/_fs_handle_test.ts +++ b/cli/tests/unit_node/_fs/_fs_handle_test.ts @@ -21,7 +21,7 @@ Deno.test("readFileSuccess", async function () { await fileHandle.close(); }); -Deno.test("write", async function () { +Deno.test("[node/fs filehandle.write] Write from Buffer", async function () { const tempFile: string = await Deno.makeTempFile(); const fileHandle = await fs.open(tempFile, "a+"); @@ -36,22 +36,17 @@ Deno.test("write", async function () { assertEquals(decoder.decode(data), "hello"); }); -Deno.test("write with opt", async function () { +Deno.test("[node/fs filehandle.write] Write from string", async function () { const tempFile: string = await Deno.makeTempFile(); - const fileHandle = await fs.open(tempFile); + const fileHandle = await fs.open(tempFile, "a+"); - const buffer = Buffer.from("hello world"); - const opt = { - offset: 0, - length: 5, - potition: 0, - }; - const res = await fileHandle.write(buffer, opt); + const str = "hello world"; + const res = await fileHandle.write(str); const data = Deno.readFileSync(tempFile); await Deno.remove(tempFile); await fileHandle.close(); - assertEquals(res.bytesWritten, 5); - assertEquals(decoder.decode(data), "hello"); + assertEquals(res.bytesWritten, 11); + assertEquals(decoder.decode(data), "hello world"); }); diff --git a/ext/node/polyfills/internal/fs/handle.ts b/ext/node/polyfills/internal/fs/handle.ts index 1dd46d351924a4..e1e7189de3ef81 100644 --- a/ext/node/polyfills/internal/fs/handle.ts +++ b/ext/node/polyfills/internal/fs/handle.ts @@ -10,15 +10,9 @@ import { interface WriteResult { bytesWritten: number; - buffer: Buffer; + buffer: Buffer | string; } -type WriteOptions = { - offset: number; - length: number; - position: number | null; -}; - export class FileHandle extends EventEmitter { #rid: number; constructor(rid: number) { @@ -40,34 +34,55 @@ export class FileHandle extends EventEmitter { buffer: Buffer, offset: number, length: number, - position: number | null, + position: number, ): Promise; - write(buffer: Buffer, opt: WriteOptions): Promise; write( - buffer: string, - position: number | null, + str: string, + position: number, encoding: string, ): Promise; write( - buffer: Buffer | string, - offsetOrPotitionOrOpt?: number | WriteOptions | null, - length?: number, + bufferOrStr: Buffer | string, + offsetOrPotition: number, + lengthOrEncoding: number | string, position?: number, ): Promise { - console.log({ buffer, offsetOrOpt, length, position }); - return new Promise((resolve, reject) => { - write( - this.fd, - buffer, - offsetOrPotitionOrOpt, - length, - position, - (err, bytesWritten, buffer) => { - if (err) reject(err); - else resolve({ buffer, bytesWritten }); - }, - ); - }); + 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 { From 147388acaf0a6ced1dd234130144d52aac0c0eb8 Mon Sep 17 00:00:00 2001 From: k-nasa Date: Wed, 7 Jun 2023 08:46:47 +0900 Subject: [PATCH 5/7] fmt --- ext/node/polyfills/internal/fs/handle.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/node/polyfills/internal/fs/handle.ts b/ext/node/polyfills/internal/fs/handle.ts index e1e7189de3ef81..6e3a822cac88a6 100644 --- a/ext/node/polyfills/internal/fs/handle.ts +++ b/ext/node/polyfills/internal/fs/handle.ts @@ -70,7 +70,7 @@ export class FileHandle extends EventEmitter { const position = offsetOrPotition; const encoding = lengthOrEncoding; - return new Promise((resolve, reject)=> { + return new Promise((resolve, reject) => { write( this.fd, str, From 1e4fa31b148cb44085c8af3bd1dceaced7d6e849 Mon Sep 17 00:00:00 2001 From: k-nasa Date: Wed, 7 Jun 2023 09:34:11 +0900 Subject: [PATCH 6/7] [ci] kick ci From 82ea4ea64c1a9228b97cfa362b117b25df5e44b1 Mon Sep 17 00:00:00 2001 From: k-nasa Date: Thu, 8 Jun 2023 22:36:21 +0900 Subject: [PATCH 7/7] fmt --- cli/tests/unit_node/_fs/_fs_handle_test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/tests/unit_node/_fs/_fs_handle_test.ts b/cli/tests/unit_node/_fs/_fs_handle_test.ts index cde8bae8a4c249..8cfbf64906d072 100644 --- a/cli/tests/unit_node/_fs/_fs_handle_test.ts +++ b/cli/tests/unit_node/_fs/_fs_handle_test.ts @@ -21,7 +21,6 @@ Deno.test("readFileSuccess", async function () { await fileHandle.close(); }); - Deno.test("read", async function () { const fileHandle = await fs.open(testData); const byteLength = "hello world".length;