aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-06 07:22:52 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-06 07:22:52 -0700
commit7a5cfc4bae9335ca1124e1e44794ce34912462de (patch)
treeeda87b88f8453084bf4a0e50ee2025f574b6e6db /src/bun.js
parentf5129dbd1a0d801dcf2d457917d64d4e0de43f52 (diff)
downloadbun-7a5cfc4bae9335ca1124e1e44794ce34912462de.tar.gz
bun-7a5cfc4bae9335ca1124e1e44794ce34912462de.tar.zst
bun-7a5cfc4bae9335ca1124e1e44794ce34912462de.zip
Return a `Buffer` object for fs.readFile
Diffstat (limited to 'src/bun.js')
-rw-r--r--src/bun.js/base.zig7
-rw-r--r--src/bun.js/node/node_fs.zig2
-rw-r--r--src/bun.js/node/types.zig46
3 files changed, 54 insertions, 1 deletions
diff --git a/src/bun.js/base.zig b/src/bun.js/base.zig
index fac45dc59..c1bfbf544 100644
--- a/src/bun.js/base.zig
+++ b/src/bun.js/base.zig
@@ -2600,7 +2600,14 @@ pub const MarkedArrayBuffer = struct {
return container;
}
+ pub fn toNodeBuffer(this: MarkedArrayBuffer, ctx: js.JSContextRef) js.JSObjectRef {
+ return JSValue.createBufferWithCtx(ctx, this.buffer.byteSlice(), this.buffer.ptr, MarkedArrayBuffer_deallocator).asObjectRef();
+ }
+
pub fn toJSObjectRef(this: MarkedArrayBuffer, ctx: js.JSContextRef, exception: js.ExceptionRef) js.JSObjectRef {
+ if (!this.buffer.value.isEmptyOrUndefinedOrNull()) {
+ return this.buffer.value.asObjectRef();
+ }
return js.JSObjectMakeTypedArrayWithBytesNoCopy(
ctx,
this.buffer.typed_array_type.toC(),
diff --git a/src/bun.js/node/node_fs.zig b/src/bun.js/node/node_fs.zig
index a8bd7107d..29464b3a2 100644
--- a/src/bun.js/node/node_fs.zig
+++ b/src/bun.js/node/node_fs.zig
@@ -2290,7 +2290,7 @@ const Return = struct {
};
}
};
- pub const ReadFile = StringOrBuffer;
+ pub const ReadFile = JSC.Node.StringOrNodeBuffer;
pub const Readlink = StringOrBuffer;
pub const Realpath = StringOrBuffer;
pub const RealpathNative = Realpath;
diff --git a/src/bun.js/node/types.zig b/src/bun.js/node/types.zig
index d6581a1cc..3a1f34fcd 100644
--- a/src/bun.js/node/types.zig
+++ b/src/bun.js/node/types.zig
@@ -222,6 +222,52 @@ pub const StringOrBuffer = union(Tag) {
}
};
+/// Like StringOrBuffer but actually returns a Node.js Buffer
+pub const StringOrNodeBuffer = union(Tag) {
+ string: string,
+ buffer: Buffer,
+
+ pub const Tag = enum { string, buffer };
+
+ pub fn slice(this: StringOrNodeBuffer) []const u8 {
+ return switch (this) {
+ .string => this.string,
+ .buffer => this.buffer.slice(),
+ };
+ }
+
+ pub fn toJS(this: StringOrNodeBuffer, ctx: JSC.C.JSContextRef, _: JSC.C.ExceptionRef) JSC.C.JSValueRef {
+ return switch (this) {
+ .string => {
+ const input = this.string;
+ if (strings.toUTF16Alloc(bun.default_allocator, input, false) catch null) |utf16| {
+ bun.default_allocator.free(bun.constStrToU8(input));
+ return JSC.ZigString.toExternalU16(utf16.ptr, utf16.len, ctx.ptr()).asObjectRef();
+ }
+
+ return JSC.ZigString.init(input).toExternalValue(ctx.ptr()).asObjectRef();
+ },
+ .buffer => this.buffer.toNodeBuffer(ctx),
+ };
+ }
+
+ pub fn fromJS(global: *JSC.JSGlobalObject, allocator: std.mem.Allocator, value: JSC.JSValue, exception: JSC.C.ExceptionRef) ?StringOrBuffer {
+ return switch (value.jsType()) {
+ JSC.JSValue.JSType.String, JSC.JSValue.JSType.StringObject, JSC.JSValue.JSType.DerivedStringObject, JSC.JSValue.JSType.Object => {
+ var zig_str = value.toSlice(global, allocator);
+ return StringOrNodeBuffer{ .string = zig_str.slice() };
+ },
+ JSC.JSValue.JSType.ArrayBuffer => StringOrNodeBuffer{
+ .buffer = Buffer.fromArrayBuffer(global.ref(), value, exception),
+ },
+ JSC.JSValue.JSType.Uint8Array, JSC.JSValue.JSType.DataView => StringOrBuffer{
+ .buffer = Buffer.fromArrayBuffer(global.ref(), value, exception),
+ },
+ else => null,
+ };
+ }
+};
+
pub const SliceOrBuffer = union(Tag) {
string: JSC.ZigString.Slice,
buffer: Buffer,