diff options
-rw-r--r-- | src/bun.js/builtins/WebCoreJSBuiltinInternals.cpp | 8 | ||||
-rw-r--r-- | src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.cpp | 16 | ||||
-rw-r--r-- | src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.h | 37 | ||||
-rw-r--r-- | src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h | 3 | ||||
-rw-r--r-- | src/bun.js/builtins/cpp/WebCoreJSBuiltins.h | 1 | ||||
-rw-r--r-- | src/bun.js/builtins/js/ProcessObjectInternals.js | 16 | ||||
-rw-r--r-- | test/bun.js/process-stdio.test.ts | 69 | ||||
-rw-r--r-- | test/bun.js/stdio-test-instance-a-lot.js | 23 | ||||
-rw-r--r-- | test/bun.js/stdio-test-instance.js | 9 |
9 files changed, 124 insertions, 58 deletions
diff --git a/src/bun.js/builtins/WebCoreJSBuiltinInternals.cpp b/src/bun.js/builtins/WebCoreJSBuiltinInternals.cpp index 697f6b5ee..93e13369a 100644 --- a/src/bun.js/builtins/WebCoreJSBuiltinInternals.cpp +++ b/src/bun.js/builtins/WebCoreJSBuiltinInternals.cpp @@ -52,7 +52,6 @@ namespace WebCore { JSBuiltinInternalFunctions::JSBuiltinInternalFunctions(JSC::VM& vm) : m_vm(vm) - , m_processObjectInternals(m_vm) , m_readableByteStreamInternals(m_vm) , m_readableStreamInternals(m_vm) , m_streamInternals(m_vm) @@ -65,7 +64,6 @@ JSBuiltinInternalFunctions::JSBuiltinInternalFunctions(JSC::VM& vm) template<typename Visitor> void JSBuiltinInternalFunctions::visit(Visitor& visitor) { - m_processObjectInternals.visit(visitor); m_readableByteStreamInternals.visit(visitor); m_readableStreamInternals.visit(visitor); m_streamInternals.visit(visitor); @@ -80,7 +78,6 @@ template void JSBuiltinInternalFunctions::visit(SlotVisitor&); SUPPRESS_ASAN void JSBuiltinInternalFunctions::initialize(JSDOMGlobalObject& globalObject) { UNUSED_PARAM(globalObject); - m_processObjectInternals.init(globalObject); m_readableByteStreamInternals.init(globalObject); m_readableStreamInternals.init(globalObject); m_streamInternals.init(globalObject); @@ -91,11 +88,6 @@ SUPPRESS_ASAN void JSBuiltinInternalFunctions::initialize(JSDOMGlobalObject& glo JSDOMGlobalObject::GlobalPropertyInfo staticGlobals[] = { #define DECLARE_GLOBAL_STATIC(name) \ JSDOMGlobalObject::GlobalPropertyInfo( \ - clientData.builtinFunctions().processObjectInternalsBuiltins().name##PrivateName(), processObjectInternals().m_##name##Function.get() , JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly), - WEBCORE_FOREACH_PROCESSOBJECTINTERNALS_BUILTIN_FUNCTION_NAME(DECLARE_GLOBAL_STATIC) -#undef DECLARE_GLOBAL_STATIC -#define DECLARE_GLOBAL_STATIC(name) \ - JSDOMGlobalObject::GlobalPropertyInfo( \ clientData.builtinFunctions().readableByteStreamInternalsBuiltins().name##PrivateName(), readableByteStreamInternals().m_##name##Function.get() , JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly), WEBCORE_FOREACH_READABLEBYTESTREAMINTERNALS_BUILTIN_FUNCTION_NAME(DECLARE_GLOBAL_STATIC) #undef DECLARE_GLOBAL_STATIC diff --git a/src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.cpp b/src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.cpp index ed5ea553e..07086c4c8 100644 --- a/src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.cpp @@ -52,7 +52,7 @@ namespace WebCore { const JSC::ConstructAbility s_processObjectInternalsGetStdioWriteStreamCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_processObjectInternalsGetStdioWriteStreamCodeConstructorKind = JSC::ConstructorKind::None; const JSC::ImplementationVisibility s_processObjectInternalsGetStdioWriteStreamCodeImplementationVisibility = JSC::ImplementationVisibility::Public; -const int s_processObjectInternalsGetStdioWriteStreamCodeLength = 9885; +const int s_processObjectInternalsGetStdioWriteStreamCodeLength = 9968; static const JSC::Intrinsic s_processObjectInternalsGetStdioWriteStreamCodeIntrinsic = JSC::NoIntrinsic; const char* const s_processObjectInternalsGetStdioWriteStreamCode = "(function (fd_, rawRequire) {\n" \ @@ -235,10 +235,10 @@ const char* const s_processObjectInternalsGetStdioWriteStreamCode = " normalied === \"utf8\" ||\n" \ " normalied === \"utf-8\" ||\n" \ " normalied === \"buffer\" ||\n" \ - " normalied === \"binary\" ||\n" \ - " normalized === \"\"\n" \ + " normalied === \"binary\"\n" \ " );\n" \ " }\n" \ + "\n" \ " var FastStdioWriteStream = class StdioWriteStream extends EventEmitter {\n" \ " #fd;\n" \ " #innerStream;\n" \ @@ -290,6 +290,14 @@ const char* const s_processObjectInternalsGetStdioWriteStreamCode = " return (this.#isTTY ??= require(\"node:tty\").isatty(this.#fd));\n" \ " }\n" \ "\n" \ + " ref() {\n" \ + " this.#getWriter().ref();\n" \ + " }\n" \ + "\n" \ + " unref() {\n" \ + " this.#getWriter().unref();\n" \ + " }\n" \ + "\n" \ " on(event, listener) {\n" \ " if (event === \"close\" || event === \"finish\") {\n" \ " this.#ensureInnerStream();\n" \ @@ -342,7 +350,7 @@ const char* const s_processObjectInternalsGetStdioWriteStreamCode = " var writer = this.#getWriter();\n" \ " const writeResult = writer.write(chunk);\n" \ " this.bytesWritten += writeResult;\n" \ - " const flushResult = writer.flush();\n" \ + " const flushResult = writer.flush(false);\n" \ " return !!(writeResult || flushResult);\n" \ " }\n" \ "\n" \ diff --git a/src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.h b/src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.h index cce9c1564..078eb6234 100644 --- a/src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.h +++ b/src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.h @@ -135,41 +135,4 @@ inline void ProcessObjectInternalsBuiltinsWrapper::exportNames() #undef EXPORT_FUNCTION_NAME } -class ProcessObjectInternalsBuiltinFunctions { -public: - explicit ProcessObjectInternalsBuiltinFunctions(JSC::VM& vm) : m_vm(vm) { } - - void init(JSC::JSGlobalObject&); - template<typename Visitor> void visit(Visitor&); - -public: - JSC::VM& m_vm; - -#define DECLARE_BUILTIN_SOURCE_MEMBERS(functionName) \ - JSC::WriteBarrier<JSC::JSFunction> m_##functionName##Function; - WEBCORE_FOREACH_PROCESSOBJECTINTERNALS_BUILTIN_FUNCTION_NAME(DECLARE_BUILTIN_SOURCE_MEMBERS) -#undef DECLARE_BUILTIN_SOURCE_MEMBERS -}; - -inline void ProcessObjectInternalsBuiltinFunctions::init(JSC::JSGlobalObject& globalObject) -{ -#define EXPORT_FUNCTION(codeName, functionName, overriddenName, length)\ - m_##functionName##Function.set(m_vm, &globalObject, JSC::JSFunction::create(m_vm, codeName##Generator(m_vm), &globalObject)); - WEBCORE_FOREACH_PROCESSOBJECTINTERNALS_BUILTIN_CODE(EXPORT_FUNCTION) -#undef EXPORT_FUNCTION -} - -template<typename Visitor> -inline void ProcessObjectInternalsBuiltinFunctions::visit(Visitor& visitor) -{ -#define VISIT_FUNCTION(name) visitor.append(m_##name##Function); - WEBCORE_FOREACH_PROCESSOBJECTINTERNALS_BUILTIN_FUNCTION_NAME(VISIT_FUNCTION) -#undef VISIT_FUNCTION -} - -template void ProcessObjectInternalsBuiltinFunctions::visit(JSC::AbstractSlotVisitor&); -template void ProcessObjectInternalsBuiltinFunctions::visit(JSC::SlotVisitor&); - - - } // namespace WebCore diff --git a/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h b/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h index ef76cb146..e843b7136 100644 --- a/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h +++ b/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h @@ -40,7 +40,6 @@ namespace Zig { class GlobalObject; } #pragma once -#include "ProcessObjectInternalsBuiltins.h" #include "ReadableByteStreamInternalsBuiltins.h" #include "ReadableStreamInternalsBuiltins.h" #include "StreamInternalsBuiltins.h" @@ -60,7 +59,6 @@ public: template<typename Visitor> void visit(Visitor&); void initialize(JSDOMGlobalObject&); - ProcessObjectInternalsBuiltinFunctions& processObjectInternals() { return m_processObjectInternals; } ReadableByteStreamInternalsBuiltinFunctions& readableByteStreamInternals() { return m_readableByteStreamInternals; } ReadableStreamInternalsBuiltinFunctions& readableStreamInternals() { return m_readableStreamInternals; } StreamInternalsBuiltinFunctions& streamInternals() { return m_streamInternals; } @@ -69,7 +67,6 @@ public: private: JSC::VM& m_vm; - ProcessObjectInternalsBuiltinFunctions m_processObjectInternals; ReadableByteStreamInternalsBuiltinFunctions m_readableByteStreamInternals; ReadableStreamInternalsBuiltinFunctions m_readableStreamInternals; StreamInternalsBuiltinFunctions m_streamInternals; diff --git a/src/bun.js/builtins/cpp/WebCoreJSBuiltins.h b/src/bun.js/builtins/cpp/WebCoreJSBuiltins.h index 22aa58ced..85da33a83 100644 --- a/src/bun.js/builtins/cpp/WebCoreJSBuiltins.h +++ b/src/bun.js/builtins/cpp/WebCoreJSBuiltins.h @@ -89,7 +89,6 @@ public: , m_writableStreamDefaultWriterBuiltins(m_vm) , m_writableStreamInternalsBuiltins(m_vm) { - m_processObjectInternalsBuiltins.exportNames(); m_readableByteStreamInternalsBuiltins.exportNames(); m_readableStreamInternalsBuiltins.exportNames(); m_streamInternalsBuiltins.exportNames(); diff --git a/src/bun.js/builtins/js/ProcessObjectInternals.js b/src/bun.js/builtins/js/ProcessObjectInternals.js index 580152678..13c1da431 100644 --- a/src/bun.js/builtins/js/ProcessObjectInternals.js +++ b/src/bun.js/builtins/js/ProcessObjectInternals.js @@ -23,8 +23,6 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -// @internal - function getStdioWriteStream(fd_, rawRequire) { var module = { path: "node:process", require: rawRequire }; var require = (path) => module.require(path); @@ -203,10 +201,10 @@ function getStdioWriteStream(fd_, rawRequire) { normalied === "utf8" || normalied === "utf-8" || normalied === "buffer" || - normalied === "binary" || - normalized === "" + normalied === "binary" ); } + var FastStdioWriteStream = class StdioWriteStream extends EventEmitter { #fd; #innerStream; @@ -258,6 +256,14 @@ function getStdioWriteStream(fd_, rawRequire) { return (this.#isTTY ??= require("node:tty").isatty(this.#fd)); } + ref() { + this.#getWriter().ref(); + } + + unref() { + this.#getWriter().unref(); + } + on(event, listener) { if (event === "close" || event === "finish") { this.#ensureInnerStream(); @@ -310,7 +316,7 @@ function getStdioWriteStream(fd_, rawRequire) { var writer = this.#getWriter(); const writeResult = writer.write(chunk); this.bytesWritten += writeResult; - const flushResult = writer.flush(); + const flushResult = writer.flush(false); return !!(writeResult || flushResult); } diff --git a/test/bun.js/process-stdio.test.ts b/test/bun.js/process-stdio.test.ts new file mode 100644 index 000000000..886bf9dac --- /dev/null +++ b/test/bun.js/process-stdio.test.ts @@ -0,0 +1,69 @@ +import { spawnSync } from "bun"; +import { describe, expect, it, test } from "bun:test"; +import { bunExe } from "bunExe"; +import { isatty } from "tty"; + +test("process.stdout", () => { + expect(process.stdout).toBeDefined(); + expect(process.stdout.isTTY).toBe(isatty(1)); +}); + +test("process.stderr", () => { + expect(process.stderr).toBeDefined(); + expect(process.stderr.isTTY).toBe(isatty(2)); +}); + +test("process.stdout - write", () => { + const { stdout } = spawnSync({ + cmd: [bunExe(), import.meta.dir + "/stdio-test-instance.js"], + stdout: "pipe", + stdin: null, + stderr: null, + env: { + ...process.env, + BUN_DEBUG_QUIET_LOGS: "1", + }, + }); + + expect(stdout?.toString()).toBe( + `hello worldhello again|😋 Get Emoji — All Emojis to ✂️ Copy and 📋 Paste 👌`, + ); +}); + +test("process.stdout - write a lot (string)", () => { + const { stdout } = spawnSync({ + cmd: [bunExe(), import.meta.dir + "/stdio-test-instance-a-lot.js"], + stdout: "pipe", + stdin: null, + stderr: null, + env: { + ...process.env, + BUN_DEBUG_QUIET_LOGS: "1", + TEST_STDIO_STRING: "1", + }, + }); + + expect(stdout?.toString()).toBe( + `hello worldhello again|😋 Get Emoji — All Emojis to ✂️ Copy and 📋 Paste 👌`.repeat( + 9999, + ), + ); +}); + +test("process.stdout - write a lot (bytes)", () => { + const { stdout } = spawnSync({ + cmd: [bunExe(), import.meta.dir + "/stdio-test-instance-a-lot.js"], + stdout: "pipe", + stdin: null, + stderr: null, + env: { + ...process.env, + BUN_DEBUG_QUIET_LOGS: "1", + }, + }); + expect(stdout?.toString()).toBe( + `hello worldhello again|😋 Get Emoji — All Emojis to ✂️ Copy and 📋 Paste 👌`.repeat( + 9999, + ), + ); +}); diff --git a/test/bun.js/stdio-test-instance-a-lot.js b/test/bun.js/stdio-test-instance-a-lot.js new file mode 100644 index 000000000..2b65d786c --- /dev/null +++ b/test/bun.js/stdio-test-instance-a-lot.js @@ -0,0 +1,23 @@ +import { ArrayBufferSink } from "bun"; + +const sink = new ArrayBufferSink(); + +sink.write("hello"); +sink.write(" "); +sink.write("world"); +sink.write(new TextEncoder().encode("hello again|")); +sink.write( + new TextEncoder().encode( + "😋 Get Emoji — All Emojis to ✂️ Copy and 📋 Paste 👌", + ), +); + +const string = Buffer.from(sink.end()).toString().repeat(9999); + +if (process.env.TEST_STDIO_STRING) { + const result = string; + process.stdout.write(result); +} else { + const result = Buffer.from(string); + process.stdout.write(result); +} diff --git a/test/bun.js/stdio-test-instance.js b/test/bun.js/stdio-test-instance.js new file mode 100644 index 000000000..36e48f472 --- /dev/null +++ b/test/bun.js/stdio-test-instance.js @@ -0,0 +1,9 @@ +process.stdout.write("hello"); +process.stdout.write(" "); +process.stdout.write("world"); +process.stdout.write(new TextEncoder().encode("hello again|")); +process.stdout.write( + new TextEncoder().encode( + "😋 Get Emoji — All Emojis to ✂️ Copy and 📋 Paste 👌", + ), +); |