diff options
| author | 2022-09-06 07:22:52 -0700 | |
|---|---|---|
| committer | 2022-09-06 07:22:52 -0700 | |
| commit | 7a5cfc4bae9335ca1124e1e44794ce34912462de (patch) | |
| tree | eda87b88f8453084bf4a0e50ee2025f574b6e6db /src/bun.js | |
| parent | f5129dbd1a0d801dcf2d457917d64d4e0de43f52 (diff) | |
| download | bun-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.zig | 7 | ||||
| -rw-r--r-- | src/bun.js/node/node_fs.zig | 2 | ||||
| -rw-r--r-- | src/bun.js/node/types.zig | 46 |
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, |
