diff options
author | 2022-06-02 18:36:10 -0700 | |
---|---|---|
committer | 2022-06-02 18:36:10 -0700 | |
commit | 549e5bbbcdbfec70b1649b1400b2bb59b4791974 (patch) | |
tree | adb1549c670e66b175722824f7614cbfddb6d97e | |
parent | 57ad68a4b096d4cbe2b7a7e0373d546444ff7602 (diff) | |
download | bun-549e5bbbcdbfec70b1649b1400b2bb59b4791974.tar.gz bun-549e5bbbcdbfec70b1649b1400b2bb59b4791974.tar.zst bun-549e5bbbcdbfec70b1649b1400b2bb59b4791974.zip |
Handle empty files/blobs
11 files changed, 54 insertions, 396 deletions
diff --git a/src/javascript/jsc/bindings/BlobReadableStreamSource.cpp b/src/javascript/jsc/bindings/BlobReadableStreamSource.cpp deleted file mode 100644 index b697f62d9..000000000 --- a/src/javascript/jsc/bindings/BlobReadableStreamSource.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include "BlobReadableStreamSource.h" -#include "ReadableStream.h" -#include "JavaScriptCore/JSCInlines.h" - -extern "C" void BlobStore__ref(void*); -extern "C" void BlobStore__deref(void*); - -extern "C" bool BlobStore__requestRead(void* store, void* streamer, WeakPtr<WebCore::BlobReadableStreamSource> ctx, size_t offset, size_t size); -extern "C" bool BlobStore__requestStart(void* store, void** streamer, WeakPtr<WebCore::BlobReadableStreamSource> ctx, size_t offset, size_t size); -extern "C" bool BlobReadableStreamSource_isCancelled(WeakPtr<WebCore::BlobReadableStreamSource> source) -{ - if (source) - return source->isCancelled(); - - return true; -} -extern "C" void BlobStore__onClose(RefPtr<WebCore::BlobReadableStreamSource> source) -{ - if (!source) - return; - source->close(); -} -extern "C" void BlobStore__onError(RefPtr<WebCore::BlobReadableStreamSource> source, const SystemError* error, Zig::GlobalObject* globalObject) -{ - if (!source || source->isCancelled()) - return; - - source->error(JSC::JSValue::decode(SystemError__toErrorInstance(error, globalObject))); -} -extern "C" bool BlobStore__onRead(RefPtr<WebCore::BlobReadableStreamSource> source, const uint8_t* ptr, size_t read) -{ - if (!source) - return false; - - auto result = source->enqueue(ptr, read); - source->deref(); - return result; -} - -extern "C" bool BlobStore__onReadExternal(RefPtr<WebCore::BlobReadableStreamSource> source, uint8_t* ptr, size_t read, void* ctx, JSTypedArrayBytesDeallocator bytesDeallocator) -{ - if (!source) { - bytesDeallocator(ctx, ptr); - return false; - } - - auto result = source->enqueue(ptr, read, ctx, bytesDeallocator); - source->deref(); - return result; -} - -extern "C" JSC__JSValue ReadableStream__empty(Zig::GlobalObject* globalObject) -{ - auto source = WebCore::SimpleReadableStreamSource::create(); - auto result = WebCore::ReadableStream::create(*globalObject, WTFMove(source)); - if (UNLIKELY(result.hasException())) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - result.releaseException(); - return JSC::JSValue::encode(JSC::jsUndefined()); - } - source->close(); - return JSC::JSValue::encode(WebCore::toJSNewlyCreated(globalObject, globalObject, result.releaseReturnValue())); -} - -extern "C" JSC__JSValue ReadableStream__fromBlob(Zig::GlobalObject* globalObject, void* store, size_t offset, size_t size) -{ - auto source = WebCore::BlobReadableStreamSource::create(store, offset, size); - - auto result = WebCore::ReadableStream::create(*globalObject, WTFMove(source)); - if (UNLIKELY(result.hasException())) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - result.releaseException(); - return JSC::JSValue::encode(JSC::jsUndefined()); - } - - return JSC::JSValue::encode(WebCore::toJSNewlyCreated(globalObject, globalObject, result.releaseReturnValue())); -} - -namespace WebCore { - -Ref<BlobReadableStreamSource> BlobReadableStreamSource::create(void* store, size_t offset, size_t size) -{ - return adoptRef(*new BlobReadableStreamSource(store, offset, size)); -} - -void BlobReadableStreamSource::doStart() -{ - RefPtr<BlobReadableStreamSource> weakThis = this; - weakThis->ref(); - - if (!BlobStore__requestStart(m_store, &m_streamer, weakThis, m_offset, m_size > m_offset ? m_size - m_offset : 0)) { - if (m_promise) { - close(); - } - return; - } -} -void BlobReadableStreamSource::doPull() -{ - RefPtr<BlobReadableStreamSource> weakThis = this; - weakThis->ref(); - if (!BlobStore__requestRead(m_store, m_streamer, weakThis, m_offset, m_size > m_offset ? m_size - m_offset : 0)) { - close(); - - return; - } -} - -void BlobReadableStreamSource::doCancel() -{ - m_isCancelled = true; -} - -void BlobReadableStreamSource::close() -{ - if (!m_isCancelled) - controller().close(); -} - -void BlobReadableStreamSource::enqueue(JSC::JSValue value) -{ - if (!m_isCancelled) - controller().enqueue(value); -} - -bool BlobReadableStreamSource::enqueue(const uint8_t* ptr, size_t size) -{ - - if (m_isCancelled) - return false; - - auto arrayBuffer = JSC::ArrayBuffer::tryCreate(ptr, size); - if (!arrayBuffer) - return false; - controller().enqueue(WTFMove(arrayBuffer)); - this->m_offset += size; - return true; -} - -bool BlobReadableStreamSource::enqueue(uint8_t* ptr, size_t read, void* ctx, JSTypedArrayBytesDeallocator bytesDeallocator) -{ - - if (m_isCancelled) { - bytesDeallocator(ctx, ptr); - return false; - } - - auto buffer = ArrayBuffer::createFromBytes(ptr, read, createSharedTask<void(void*)>([bytesDeallocator, ctx](void* p) { - if (bytesDeallocator) { - bytesDeallocator(p, ctx); - } - })); - - controller().enqueue(WTFMove(buffer)); - this->m_offset += read; - return true; -} - -BlobReadableStreamSource::~BlobReadableStreamSource() -{ - if (m_store) - BlobStore__deref(m_store); -} -} diff --git a/src/javascript/jsc/bindings/BlobReadableStreamSource.h b/src/javascript/jsc/bindings/BlobReadableStreamSource.h deleted file mode 100644 index a0ce35b59..000000000 --- a/src/javascript/jsc/bindings/BlobReadableStreamSource.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#include "root.h" -#include "ReadableStreamSource.h" -#include <wtf/WeakPtr.h> - -namespace WebCore { - -class BlobReadableStreamSource - : public ReadableStreamSource, - public CanMakeWeakPtr<BlobReadableStreamSource> { -public: - static Ref<BlobReadableStreamSource> create(void* store, size_t offset, size_t size); - - void close(); - void enqueue(JSC::JSValue); - bool enqueue(const uint8_t* ptr, size_t length); - bool enqueue(uint8_t* ptr, size_t read, void* deallocator, JSTypedArrayBytesDeallocator bytesDeallocator); - bool isCancelled() const { return m_isCancelled; } - - void* streamer() const { return m_streamer; } - -private: - BlobReadableStreamSource(void* store, size_t offset, size_t size) - : ReadableStreamSource() - , m_store(store) - , m_offset(offset) - , m_size(size) - , m_isCancelled(false) - { - } - ~BlobReadableStreamSource(); - - // ReadableStreamSource - void setActive() final - { - } - void setInactive() final {} - void doStart() final; - void doPull() final; - void doCancel() final; - - bool m_isCancelled { false }; - - uint64_t m_size = 0; - uint64_t m_offset = 0; - void* m_store = nullptr; - void* m_streamer = nullptr; -}; - -} diff --git a/src/javascript/jsc/bindings/BunBuiltinNames.h b/src/javascript/jsc/bindings/BunBuiltinNames.h index e849f914d..23bbad2ca 100644 --- a/src/javascript/jsc/bindings/BunBuiltinNames.h +++ b/src/javascript/jsc/bindings/BunBuiltinNames.h @@ -69,6 +69,7 @@ using namespace JSC; macro(cork) \ macro(createFIFO) \ macro(createNativeReadableStream) \ + macro(createEmptyReadableStream) \ macro(createReadableStream) \ macro(createUninitializedArrayBuffer) \ macro(createWritableStreamFromInternal) \ diff --git a/src/javascript/jsc/bindings/ReadableStreamBuiltins.cpp b/src/javascript/jsc/bindings/ReadableStreamBuiltins.cpp index 68155a460..47fa24988 100644 --- a/src/javascript/jsc/bindings/ReadableStreamBuiltins.cpp +++ b/src/javascript/jsc/bindings/ReadableStreamBuiltins.cpp @@ -117,9 +117,25 @@ const char* const s_readableStreamInitializeReadableStreamCode = "})\n" \ ; +const JSC::ConstructAbility s_readableStreamCreateEmptyReadableStreamCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_readableStreamCreateEmptyReadableStreamCodeConstructorKind = JSC::ConstructorKind::None; +const int s_readableStreamCreateEmptyReadableStreamCodeLength = 178; +static const JSC::Intrinsic s_readableStreamCreateEmptyReadableStreamCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_readableStreamCreateEmptyReadableStreamCode = + "(function () {\n" \ + " var stream = new @ReadableStream({\n" \ + " pull() {},\n" \ + " start() {},\n" \ + " cancel() {},\n" \ + " });\n" \ + " @readableStreamClose(stream);\n" \ + " return stream;\n" \ + "})\n" \ +; + const JSC::ConstructAbility s_readableStreamCreateNativeReadableStreamCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_readableStreamCreateNativeReadableStreamCodeConstructorKind = JSC::ConstructorKind::None; -const int s_readableStreamCreateNativeReadableStreamCodeLength = 3152; +const int s_readableStreamCreateNativeReadableStreamCodeLength = 2956; static const JSC::Intrinsic s_readableStreamCreateNativeReadableStreamCodeIntrinsic = JSC::NoIntrinsic; const char* const s_readableStreamCreateNativeReadableStreamCode = "(function (nativePtr, nativeType, autoAllocateChunkSize) {\n" \ @@ -135,7 +151,6 @@ const char* const s_readableStreamCreateNativeReadableStreamCode = " var {c, v} = this;\n" \ " this.c = @undefined;\n" \ " this.v = @undefined;\n" \ - " closer[0] = false;\n" \ " handleResult(val, c, v);\n" \ " }\n" \ " \n" \ @@ -204,19 +219,7 @@ const char* const s_readableStreamCreateNativeReadableStreamCode = "\n" \ " //\n" \ " if (chunkSize === 0) {\n" \ - " return new @ReadableStream({\n" \ - " start(controller) {\n" \ - " controller.close();\n" \ - " },\n" \ - "\n" \ - " pull() {\n" \ - "\n" \ - " },\n" \ - "\n" \ - " cancel() {\n" \ - "\n" \ - " },\n" \ - " });\n" \ + " return @createEmptyReadableStream();\n" \ " }\n" \ "\n" \ " var instance = new Prototype(nativePtr, chunkSize);\n" \ diff --git a/src/javascript/jsc/bindings/ReadableStreamBuiltins.h b/src/javascript/jsc/bindings/ReadableStreamBuiltins.h index 2cd7f6b6e..34ad16846 100644 --- a/src/javascript/jsc/bindings/ReadableStreamBuiltins.h +++ b/src/javascript/jsc/bindings/ReadableStreamBuiltins.h @@ -51,6 +51,10 @@ extern const char* const s_readableStreamInitializeReadableStreamCode; extern const int s_readableStreamInitializeReadableStreamCodeLength; extern const JSC::ConstructAbility s_readableStreamInitializeReadableStreamCodeConstructAbility; extern const JSC::ConstructorKind s_readableStreamInitializeReadableStreamCodeConstructorKind; +extern const char* const s_readableStreamCreateEmptyReadableStreamCode; +extern const int s_readableStreamCreateEmptyReadableStreamCodeLength; +extern const JSC::ConstructAbility s_readableStreamCreateEmptyReadableStreamCodeConstructAbility; +extern const JSC::ConstructorKind s_readableStreamCreateEmptyReadableStreamCodeConstructorKind; extern const char* const s_readableStreamCreateNativeReadableStreamCode; extern const int s_readableStreamCreateNativeReadableStreamCodeLength; extern const JSC::ConstructAbility s_readableStreamCreateNativeReadableStreamCodeConstructAbility; @@ -82,6 +86,7 @@ extern const JSC::ConstructorKind s_readableStreamLockedCodeConstructorKind; #define WEBCORE_FOREACH_READABLESTREAM_BUILTIN_DATA(macro) \ macro(initializeReadableStream, readableStreamInitializeReadableStream, 2) \ + macro(createEmptyReadableStream, readableStreamCreateEmptyReadableStream, 0) \ macro(createNativeReadableStream, readableStreamCreateNativeReadableStream, 3) \ macro(cancel, readableStreamCancel, 1) \ macro(getReader, readableStreamGetReader, 1) \ @@ -91,6 +96,7 @@ extern const JSC::ConstructorKind s_readableStreamLockedCodeConstructorKind; macro(locked, readableStreamLocked, 0) \ #define WEBCORE_BUILTIN_READABLESTREAM_INITIALIZEREADABLESTREAM 1 +#define WEBCORE_BUILTIN_READABLESTREAM_CREATEEMPTYREADABLESTREAM 1 #define WEBCORE_BUILTIN_READABLESTREAM_CREATENATIVEREADABLESTREAM 1 #define WEBCORE_BUILTIN_READABLESTREAM_CANCEL 1 #define WEBCORE_BUILTIN_READABLESTREAM_GETREADER 1 @@ -101,6 +107,7 @@ extern const JSC::ConstructorKind s_readableStreamLockedCodeConstructorKind; #define WEBCORE_FOREACH_READABLESTREAM_BUILTIN_CODE(macro) \ macro(readableStreamInitializeReadableStreamCode, initializeReadableStream, ASCIILiteral(), s_readableStreamInitializeReadableStreamCodeLength) \ + macro(readableStreamCreateEmptyReadableStreamCode, createEmptyReadableStream, ASCIILiteral(), s_readableStreamCreateEmptyReadableStreamCodeLength) \ macro(readableStreamCreateNativeReadableStreamCode, createNativeReadableStream, ASCIILiteral(), s_readableStreamCreateNativeReadableStreamCodeLength) \ macro(readableStreamCancelCode, cancel, ASCIILiteral(), s_readableStreamCancelCodeLength) \ macro(readableStreamGetReaderCode, getReader, ASCIILiteral(), s_readableStreamGetReaderCodeLength) \ @@ -111,6 +118,7 @@ extern const JSC::ConstructorKind s_readableStreamLockedCodeConstructorKind; #define WEBCORE_FOREACH_READABLESTREAM_BUILTIN_FUNCTION_NAME(macro) \ macro(cancel) \ + macro(createEmptyReadableStream) \ macro(createNativeReadableStream) \ macro(getReader) \ macro(initializeReadableStream) \ diff --git a/src/javascript/jsc/bindings/ReadableStreamInternalsBuiltins.cpp b/src/javascript/jsc/bindings/ReadableStreamInternalsBuiltins.cpp index b7ae6f1df..b6481d5f9 100644 --- a/src/javascript/jsc/bindings/ReadableStreamInternalsBuiltins.cpp +++ b/src/javascript/jsc/bindings/ReadableStreamInternalsBuiltins.cpp @@ -895,7 +895,7 @@ const char* const s_readableStreamInternalsReadableStreamDefaultControllerPullCo const JSC::ConstructAbility s_readableStreamInternalsReadableStreamDefaultControllerCloseCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_readableStreamInternalsReadableStreamDefaultControllerCloseCodeConstructorKind = JSC::ConstructorKind::None; -const int s_readableStreamInternalsReadableStreamDefaultControllerCloseCodeLength = 346; +const int s_readableStreamInternalsReadableStreamDefaultControllerCloseCodeLength = 342; static const JSC::Intrinsic s_readableStreamInternalsReadableStreamDefaultControllerCloseCodeIntrinsic = JSC::NoIntrinsic; const char* const s_readableStreamInternalsReadableStreamDefaultControllerCloseCode = "(function (controller)\n" \ @@ -904,7 +904,7 @@ const char* const s_readableStreamInternalsReadableStreamDefaultControllerCloseC "\n" \ " @assert(@readableStreamDefaultControllerCanCloseOrEnqueue(controller));\n" \ " @putByIdDirectPrivate(controller, \"closeRequested\", true);\n" \ - " if (!@getByIdDirectPrivate(controller, \"queue\")?.isNotEmpty())\n" \ + " if (@getByIdDirectPrivate(controller, \"queue\")?.isEmpty())\n" \ " @readableStreamClose(@getByIdDirectPrivate(controller, \"controlledReadableStream\"));\n" \ "})\n" \ ; diff --git a/src/javascript/jsc/bindings/ZigGlobalObject.cpp b/src/javascript/jsc/bindings/ZigGlobalObject.cpp index c3ba74cf4..692c69b96 100644 --- a/src/javascript/jsc/bindings/ZigGlobalObject.cpp +++ b/src/javascript/jsc/bindings/ZigGlobalObject.cpp @@ -1353,8 +1353,10 @@ void GlobalObject::addBuiltinGlobals(JSC::VM& vm) extraStaticGlobals.releaseBuffer(); putDirectBuiltinFunction(vm, this, builtinNames.createFIFOPrivateName(), streamInternalsCreateFIFOCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); - putDirectNativeFunction(vm, this, builtinNames.createUninitializedArrayBufferPrivateName(), 1, functionCreateUninitializedArrayBuffer, NoIntrinsic, PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly | PropertyAttribute::Function); putDirectBuiltinFunction(vm, this, builtinNames.createNativeReadableStreamPrivateName(), readableStreamCreateNativeReadableStreamCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); + putDirectBuiltinFunction(vm, this, builtinNames.createEmptyReadableStreamPrivateName(), readableStreamCreateEmptyReadableStreamCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); + + putDirectNativeFunction(vm, this, builtinNames.createUninitializedArrayBufferPrivateName(), 1, functionCreateUninitializedArrayBuffer, NoIntrinsic, PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly | PropertyAttribute::Function); putDirectCustomAccessor(vm, JSC::Identifier::fromString(vm, "process"_s), JSC::CustomGetterSetter::create(vm, property_lazyProcessGetter, property_lazyProcessSetter), JSC::PropertyAttribute::CustomAccessor | 0); diff --git a/src/javascript/jsc/bindings/bindings.cpp b/src/javascript/jsc/bindings/bindings.cpp index c27752b7b..7505a8a8f 100644 --- a/src/javascript/jsc/bindings/bindings.cpp +++ b/src/javascript/jsc/bindings/bindings.cpp @@ -889,6 +889,14 @@ static JSC::JSValue doLink(JSC__JSGlobalObject* globalObject, JSC::JSValue modul return JSC::linkAndEvaluateModule(globalObject, moduleKey, JSC::JSValue()); } +JSC__JSValue ReadableStream__empty(Zig::GlobalObject* globalObject) +{ + auto& vm = globalObject->vm(); + auto clientData = WebCore::clientData(vm); + auto* function = globalObject->getDirect(vm, clientData->builtinNames().createEmptyReadableStreamPrivateName()).getObject(); + return JSValue::encode(JSC::call(globalObject, function, JSC::ArgList(), "ReadableStream.create"_s)); +} + JSC__JSValue JSC__JSValue__createRangeError(const ZigString* message, const ZigString* arg1, JSC__JSGlobalObject* globalObject) { diff --git a/src/javascript/jsc/bindings/builtins/js/ReadableStream.js b/src/javascript/jsc/bindings/builtins/js/ReadableStream.js index 4d7113888..f3ab66d5c 100644 --- a/src/javascript/jsc/bindings/builtins/js/ReadableStream.js +++ b/src/javascript/jsc/bindings/builtins/js/ReadableStream.js @@ -89,6 +89,17 @@ function initializeReadableStream(underlyingSource, strategy) } @globalPrivate +function createEmptyReadableStream() { + var stream = new @ReadableStream({ + pull() {}, + start() {}, + cancel() {}, + }); + @readableStreamClose(stream); + return stream; +} + +@globalPrivate function createNativeReadableStream(nativePtr, nativeType, autoAllocateChunkSize) { "use strict"; var cached = globalThis[Symbol.for("Bun.nativeReadableStreamPrototype")] ||= new @Map; @@ -96,7 +107,7 @@ function createNativeReadableStream(nativePtr, nativeType, autoAllocateChunkSize if (Prototype === @undefined) { var [pull, start, cancel, setClose, deinit] = globalThis[Symbol.for("Bun.lazy")](nativeType); var closer = [false]; -var handleResult; + var handleResult; function handleNativeReadableStreamPromiseResult(val) { "use strict"; var {c, v} = this; @@ -104,7 +115,6 @@ var handleResult; this.v = @undefined; handleResult(val, c, v); } - handleResult = function handleResult(result, controller, view) { "use strict"; @@ -170,19 +180,7 @@ var handleResult; // empty file, no need for native back-and-forth on this if (chunkSize === 0) { - return new @ReadableStream({ - start(controller) { - controller.close(); - }, - - pull() { - - }, - - cancel() { - - }, - }); + return @createEmptyReadableStream(); } var instance = new Prototype(nativePtr, chunkSize); diff --git a/src/javascript/jsc/bindings/builtins/js/ReadableStreamInternals.js b/src/javascript/jsc/bindings/builtins/js/ReadableStreamInternals.js index f441858cc..18e82262c 100644 --- a/src/javascript/jsc/bindings/builtins/js/ReadableStreamInternals.js +++ b/src/javascript/jsc/bindings/builtins/js/ReadableStreamInternals.js @@ -691,7 +691,7 @@ function readableStreamDefaultControllerClose(controller) @assert(@readableStreamDefaultControllerCanCloseOrEnqueue(controller)); @putByIdDirectPrivate(controller, "closeRequested", true); - if (!@getByIdDirectPrivate(controller, "queue")?.isNotEmpty()) + if (@getByIdDirectPrivate(controller, "queue")?.isEmpty()) @readableStreamClose(@getByIdDirectPrivate(controller, "controlledReadableStream")); } diff --git a/src/javascript/jsc/webcore/response.zig b/src/javascript/jsc/webcore/response.zig index f72ac5989..d85139525 100644 --- a/src/javascript/jsc/webcore/response.zig +++ b/src/javascript/jsc/webcore/response.zig @@ -1557,153 +1557,6 @@ pub const Blob = struct { is_all_ascii: ?bool = null, allocator: std.mem.Allocator, - // 2 MB ought to be enough - pub const max_chunk_size = 1024 * 1024 * 2; - - pub export fn BlobStore__ref(ptr: *anyopaque) void { - var this = bun.cast(*Store, ptr); - this.ref(); - } - - pub export fn BlobStore__deref(ptr: *anyopaque) void { - var this = bun.cast(*Store, ptr); - this.deref(); - } - - // pub const BlobStoreStreamer = Pointer - extern fn BlobStore__onRead(source: ?*anyopaque, ptr: ?[*]const u8, len: usize) bool; - extern fn BlobStore__onError(source: ?*anyopaque, system_error: *const JSC.SystemError, global: *JSGlobalObject) void; - extern fn BlobReadableStreamSource_isCancelled(source: ?*anyopaque) bool; - extern fn BlobStore__onReadExternal(source: ?*anyopaque, ptr: [*]u8, read: usize, deallocator: ?*anyopaque, deallocator: JSC.C.JSTypedArrayBytesDeallocator) bool; - - pub export fn BlobStore__onFinish(store: *Store, stream: ?*anyopaque) void { - _ = store; - _ = stream; - const fd = @intCast(JSC.Node.FileDescriptor, @ptrToInt(stream)); - _ = fd; - } - - pub export fn BlobStore__requestRead( - store: *Blob.Store, - stream: ReadableStream.StreamTag, - ctx: ?*anyopaque, - offset: usize, - length: usize, - ) bool { - _ = store; - _ = stream; - _ = ctx; - _ = offset; - _ = length; - return false; - // _ = stream; - // store.ref(); - // defer store.deref(); - // if (comptime JSC.is_bindgen) unreachable; - // switch (store.data) { - // .bytes => |*bytes| { - // var slice = bytes.slice(); - // var base = slice[@minimum(offset, slice.len)..]; - // slice = base; - // slice = if (length > 0) - // slice[0..@minimum(@minimum(slice.len, length), max_chunk_size)] - // else - // slice[0..@minimum(slice.len, max_chunk_size)]; - // if (slice.len == 0) - // return false; - - // const has_more = base.len > slice.len; - - // return BlobStore__onRead(ctx, slice.ptr, slice.len) and has_more; - // }, - // .file => |*file| { - // _ = file; - // const fd = stream.fd(); - - // // invalid fd - // if (fd == std.math.maxInt(@TypeOf(fd))) { - // return false; - // } - // const auto_close = file.pathlike == .path; - - // const chunk_size = if (length > 0) @minimum(length, max_chunk_size) else max_chunk_size; - - // const this_chunk_size = if (file.max_size > 0) - // @minimum(chunk_size, file.max_size) - // else if (std.os.S.ISFIFO(file.mode)) - // fifo_chunk_size - // else - // chunk_size; - - // var buf = bun.default_allocator.alloc( - // u8, - // this_chunk_size, - // ) catch { - // const err = JSC.SystemError{ - // .code = ZigString.init("ENOMEM"), - // .path = if (file.pathlike == .path) - // ZigString.init(file.pathlike.path.slice()) - // else - // ZigString.Empty, - // .message = ZigString.init("Out of memory"), - // .syscall = ZigString.init("malloc"), - // }; - // BlobStore__onError(ctx, &err, JSC.VirtualMachine.vm.global); - - // if (auto_close) { - // _ = JSC.Node.Syscall.close(fd); - // } - // return false; - // }; - // }, - // } - - // return false; - } - - const fifo_chunk_size = 512; - pub export fn BlobStore__requestStart( - store: *Blob.Store, - streamer: *ReadableStream.StreamTag, - ctx: ?*anyopaque, - offset: usize, - length: usize, - ) bool { - _ = store; - _ = streamer; - _ = ctx; - _ = offset; - _ = length; - return false; - // store.ref(); - // defer store.deref(); - // if (comptime JSC.is_bindgen) unreachable; - // const chunk_size = if (length > 0) @minimum(length, max_chunk_size) else max_chunk_size; - // switch (store.data) { - // .bytes => |*bytes| { - // var slice = bytes.slice(); - // var base = slice[@minimum(offset, slice.len)..]; - // slice = base; - // slice = slice[0..@minimum(slice.len, chunk_size)]; - // if (slice.len == 0) - // return false; - - // const has_more = base.len > slice.len; - - // return BlobStore__onRead(ctx, slice.ptr, slice.len) and has_more; - // }, - - } - - comptime { - if (!JSC.is_bindgen) { - _ = BlobStore__ref; - _ = BlobStore__deref; - _ = BlobStore__requestRead; - _ = BlobStore__requestStart; - } - } - pub fn size(this: *const Store) SizeType { return switch (this.data) { .bytes => this.data.bytes.len, |