aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bun.js/bindings/ScriptExecutionContext.cpp11
-rw-r--r--src/bun.js/bindings/ScriptExecutionContext.h2
-rw-r--r--src/bun.js/bindings/webcrypto/CryptoAlgorithm.cpp4
-rw-r--r--src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA1.cpp15
-rw-r--r--src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA224.cpp14
-rw-r--r--src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA256.cpp13
-rw-r--r--src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA384.cpp15
-rw-r--r--src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA512.cpp15
8 files changed, 83 insertions, 6 deletions
diff --git a/src/bun.js/bindings/ScriptExecutionContext.cpp b/src/bun.js/bindings/ScriptExecutionContext.cpp
index d93478ed8..47908b385 100644
--- a/src/bun.js/bindings/ScriptExecutionContext.cpp
+++ b/src/bun.js/bindings/ScriptExecutionContext.cpp
@@ -5,6 +5,7 @@
#include "webcore/WebSocket.h"
#include "libusockets.h"
#include "_libusockets.h"
+#include "BunClientData.h"
extern "C" void Bun__startLoop(us_loop_t* loop);
@@ -58,6 +59,16 @@ us_socket_context_t* ScriptExecutionContext::webSocketContextSSL()
return m_ssl_client_websockets_ctx;
}
+extern "C" void Bun__eventLoop__incrementRefConcurrently(void* bunVM, int delta);
+
+void ScriptExecutionContext::refEventLoop()
+{
+ Bun__eventLoop__incrementRefConcurrently(WebCore::clientData(vm())->bunVM, 1);
+}
+void ScriptExecutionContext::unrefEventLoop()
+{
+ Bun__eventLoop__incrementRefConcurrently(WebCore::clientData(vm())->bunVM, -1);
+}
bool ScriptExecutionContext::postTaskTo(ScriptExecutionContextIdentifier identifier, Function<void(ScriptExecutionContext&)>&& task)
{
diff --git a/src/bun.js/bindings/ScriptExecutionContext.h b/src/bun.js/bindings/ScriptExecutionContext.h
index 580c1be25..b0e4e2096 100644
--- a/src/bun.js/bindings/ScriptExecutionContext.h
+++ b/src/bun.js/bindings/ScriptExecutionContext.h
@@ -107,6 +107,8 @@ public:
}
static ScriptExecutionContext* getScriptExecutionContext(ScriptExecutionContextIdentifier identifier);
+ void refEventLoop();
+ void unrefEventLoop();
const WTF::URL& url() const
{
diff --git a/src/bun.js/bindings/webcrypto/CryptoAlgorithm.cpp b/src/bun.js/bindings/webcrypto/CryptoAlgorithm.cpp
index ca3b97bff..3c958bdfc 100644
--- a/src/bun.js/bindings/webcrypto/CryptoAlgorithm.cpp
+++ b/src/bun.js/bindings/webcrypto/CryptoAlgorithm.cpp
@@ -95,10 +95,12 @@ ExceptionOr<size_t> CryptoAlgorithm::getKeyLength(const CryptoAlgorithmParameter
template<typename ResultCallbackType, typename OperationType>
static void dispatchAlgorithmOperation(WorkQueue& workQueue, ScriptExecutionContext& context, ResultCallbackType&& callback, CryptoAlgorithm::ExceptionCallback&& exceptionCallback, OperationType&& operation)
{
+ context.refEventLoop();
workQueue.dispatch(
[operation = WTFMove(operation), callback = WTFMove(callback), exceptionCallback = WTFMove(exceptionCallback), contextIdentifier = context.identifier()]() mutable {
auto result = operation();
- ScriptExecutionContext::postTaskTo(contextIdentifier, [result = crossThreadCopy(WTFMove(result)), callback = WTFMove(callback), exceptionCallback = WTFMove(exceptionCallback)](auto&) mutable {
+ ScriptExecutionContext::postTaskTo(contextIdentifier, [result = crossThreadCopy(WTFMove(result)), callback = WTFMove(callback), exceptionCallback = WTFMove(exceptionCallback)](auto& context) mutable {
+ context.unrefEventLoop();
if (result.hasException()) {
exceptionCallback(result.releaseException().code());
return;
diff --git a/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA1.cpp b/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA1.cpp
index f602467e0..8a2a8829f 100644
--- a/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA1.cpp
+++ b/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA1.cpp
@@ -51,10 +51,23 @@ void CryptoAlgorithmSHA1::digest(Vector<uint8_t>&& message, VectorCallback&& cal
return;
}
+ if (message.size() < 64) {
+ auto moved = WTFMove(message);
+ digest->addBytes(moved.data(), moved.size());
+ auto result = digest->computeHash();
+ ScriptExecutionContext::postTaskTo(context.identifier(), [callback = WTFMove(callback), result = WTFMove(result)](auto&) {
+ callback(result);
+ });
+ return;
+ }
+
+ context.refEventLoop();
+
workQueue.dispatch([digest = WTFMove(digest), message = WTFMove(message), callback = WTFMove(callback), contextIdentifier = context.identifier()]() mutable {
digest->addBytes(message.data(), message.size());
auto result = digest->computeHash();
- ScriptExecutionContext::postTaskTo(contextIdentifier, [callback = WTFMove(callback), result = WTFMove(result)](auto&) {
+ ScriptExecutionContext::postTaskTo(contextIdentifier, [callback = WTFMove(callback), result = WTFMove(result)](auto& context) {
+ context.unrefEventLoop();
callback(result);
});
});
diff --git a/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA224.cpp b/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA224.cpp
index dfb8204b5..3591215bf 100644
--- a/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA224.cpp
+++ b/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA224.cpp
@@ -51,10 +51,22 @@ void CryptoAlgorithmSHA224::digest(Vector<uint8_t>&& message, VectorCallback&& c
return;
}
+ if (message.size() < 64) {
+ auto moved = WTFMove(message);
+ digest->addBytes(moved.data(), moved.size());
+ auto result = digest->computeHash();
+ ScriptExecutionContext::postTaskTo(context.identifier(), [callback = WTFMove(callback), result = WTFMove(result)](auto&) {
+ callback(result);
+ });
+ return;
+ }
+
+ context.refEventLoop();
workQueue.dispatch([digest = WTFMove(digest), message = WTFMove(message), callback = WTFMove(callback), contextIdentifier = context.identifier()]() mutable {
digest->addBytes(message.data(), message.size());
auto result = digest->computeHash();
- ScriptExecutionContext::postTaskTo(contextIdentifier, [callback = WTFMove(callback), result = WTFMove(result)](auto&) {
+ ScriptExecutionContext::postTaskTo(contextIdentifier, [callback = WTFMove(callback), result = WTFMove(result)](auto& context) {
+ context.unrefEventLoop();
callback(result);
});
});
diff --git a/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA256.cpp b/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA256.cpp
index 216eccb5d..c9bad917b 100644
--- a/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA256.cpp
+++ b/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA256.cpp
@@ -51,10 +51,21 @@ void CryptoAlgorithmSHA256::digest(Vector<uint8_t>&& message, VectorCallback&& c
return;
}
+ if (message.size() < 64) {
+ auto moved = WTFMove(message);
+ digest->addBytes(moved.data(), moved.size());
+ auto result = digest->computeHash();
+ ScriptExecutionContext::postTaskTo(context.identifier(), [callback = WTFMove(callback), result = WTFMove(result)](auto&) {
+ callback(result);
+ });
+ return;
+ }
+ context.refEventLoop();
workQueue.dispatch([digest = WTFMove(digest), message = WTFMove(message), callback = WTFMove(callback), contextIdentifier = context.identifier()]() mutable {
digest->addBytes(message.data(), message.size());
auto result = digest->computeHash();
- ScriptExecutionContext::postTaskTo(contextIdentifier, [callback = WTFMove(callback), result = WTFMove(result)](auto&) {
+ ScriptExecutionContext::postTaskTo(contextIdentifier, [callback = WTFMove(callback), result = WTFMove(result)](auto& context) {
+ context.unrefEventLoop();
callback(result);
});
});
diff --git a/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA384.cpp b/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA384.cpp
index 134e89bd8..890d317b9 100644
--- a/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA384.cpp
+++ b/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA384.cpp
@@ -51,10 +51,23 @@ void CryptoAlgorithmSHA384::digest(Vector<uint8_t>&& message, VectorCallback&& c
return;
}
+ if (message.size() < 64) {
+ auto moved = WTFMove(message);
+ digest->addBytes(moved.data(), moved.size());
+ auto result = digest->computeHash();
+ ScriptExecutionContext::postTaskTo(context.identifier(), [callback = WTFMove(callback), result = WTFMove(result)](auto&) {
+ callback(result);
+ });
+ return;
+ }
+
+ context.refEventLoop();
+
workQueue.dispatch([digest = WTFMove(digest), message = WTFMove(message), callback = WTFMove(callback), contextIdentifier = context.identifier()]() mutable {
digest->addBytes(message.data(), message.size());
auto result = digest->computeHash();
- ScriptExecutionContext::postTaskTo(contextIdentifier, [callback = WTFMove(callback), result = WTFMove(result)](auto&) {
+ ScriptExecutionContext::postTaskTo(contextIdentifier, [callback = WTFMove(callback), result = WTFMove(result)](auto& context) {
+ context.unrefEventLoop();
callback(result);
});
});
diff --git a/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA512.cpp b/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA512.cpp
index 016a47bf1..38a9fbe18 100644
--- a/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA512.cpp
+++ b/src/bun.js/bindings/webcrypto/CryptoAlgorithmSHA512.cpp
@@ -51,10 +51,23 @@ void CryptoAlgorithmSHA512::digest(Vector<uint8_t>&& message, VectorCallback&& c
return;
}
+ if (message.size() < 64) {
+ auto moved = WTFMove(message);
+ digest->addBytes(moved.data(), moved.size());
+ auto result = digest->computeHash();
+ ScriptExecutionContext::postTaskTo(context.identifier(), [callback = WTFMove(callback), result = WTFMove(result)](auto&) {
+ callback(result);
+ });
+ return;
+ }
+
+ context.refEventLoop();
workQueue.dispatch([digest = WTFMove(digest), message = WTFMove(message), callback = WTFMove(callback), contextIdentifier = context.identifier()]() mutable {
digest->addBytes(message.data(), message.size());
auto result = digest->computeHash();
- ScriptExecutionContext::postTaskTo(contextIdentifier, [callback = WTFMove(callback), result = WTFMove(result)](auto&) {
+
+ ScriptExecutionContext::postTaskTo(contextIdentifier, [callback = WTFMove(callback), result = WTFMove(result)](auto& context) {
+ context.unrefEventLoop();
callback(result);
});
});