aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bun.js/builtins/WebCoreJSBuiltinInternals.cpp8
-rw-r--r--src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.cpp16
-rw-r--r--src/bun.js/builtins/cpp/ProcessObjectInternalsBuiltins.h37
-rw-r--r--src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h3
-rw-r--r--src/bun.js/builtins/cpp/WebCoreJSBuiltins.h1
-rw-r--r--src/bun.js/builtins/js/ProcessObjectInternals.js16
-rw-r--r--test/bun.js/process-stdio.test.ts69
-rw-r--r--test/bun.js/stdio-test-instance-a-lot.js23
-rw-r--r--test/bun.js/stdio-test-instance.js9
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 👌",
+ ),
+);