From a3958190e8f106adca7fbf4ba2605056cb22aced Mon Sep 17 00:00:00 2001 From: dave caruso Date: Mon, 16 Oct 2023 20:01:24 -0700 Subject: fix(runtime): improve IPC reliability + organization pass on that code (#6475) * dfghj * Handle messages that did not finish * tidy * ok * a * Merge remote-tracking branch 'origin/main' into dave/ipc-fixes * test failures --------- Co-authored-by: Jarred Sumner --- src/bun.js/bindings/Serialization.cpp | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) (limited to 'src/bun.js/bindings/Serialization.cpp') diff --git a/src/bun.js/bindings/Serialization.cpp b/src/bun.js/bindings/Serialization.cpp index 89937ebbb..fdaf2ab75 100644 --- a/src/bun.js/bindings/Serialization.cpp +++ b/src/bun.js/bindings/Serialization.cpp @@ -8,9 +8,15 @@ using namespace JSC; using namespace WebCore; -/// This is used for Bun.spawn() IPC because otherwise we would have to copy the data once to get it to zig, then write it. -/// Returns `true` on success, `false` on failure + throws a JS error. -extern "C" bool Bun__serializeJSValueForSubprocess(JSGlobalObject* globalObject, EncodedJSValue encodedValue, int fd) +// Must be synced with bindings.zig's JSValue.SerializedScriptValue.External +struct SerializedValueSlice { + uint8_t* bytes; + size_t size; + WebCore::SerializedScriptValue* value; +}; + +/// Returns a "slice" that also contains a pointer to the SerializedScriptValue. Must be freed by the caller +extern "C" SerializedValueSlice Bun__serializeJSValue(JSGlobalObject* globalObject, EncodedJSValue encodedValue) { JSValue value = JSValue::decode(encodedValue); @@ -25,19 +31,23 @@ extern "C" bool Bun__serializeJSValueForSubprocess(JSGlobalObject* globalObject, if (serialized.hasException()) { WebCore::propagateException(*globalObject, scope, serialized.releaseException()); - RELEASE_AND_RETURN(scope, false); + RELEASE_AND_RETURN(scope, { 0 }); } auto serializedValue = serialized.releaseReturnValue(); - auto bytes = serializedValue.ptr()->wireBytes(); - uint8_t id = 2; // IPCMessageType.SerializedMessage - write(fd, &id, sizeof(uint8_t)); - uint32_t size = bytes.size(); - write(fd, &size, sizeof(uint32_t)); - write(fd, bytes.data(), size); + auto bytes = serializedValue->wireBytes(); - RELEASE_AND_RETURN(scope, true); + return { + bytes.data(), + bytes.size(), + &serializedValue.leakRef(), + }; +} + +extern "C" void Bun__SerializedScriptSlice__free(SerializedScriptValue* value) +{ + delete value; } extern "C" EncodedJSValue Bun__JSValue__deserialize(JSGlobalObject* globalObject, const uint8_t* bytes, size_t size) -- cgit v1.2.3