mirror of
https://github.com/uNetworking/uWebSockets.js.git
synced 2026-04-17 17:00:24 -04:00
Replace NativeString heap allocations with thread-local pool allocator (#1263)
* Initial plan * Update NativeString callers to use new NativeStringContext parameter Add NativeStringContext nativeStringContext; as the first local variable in each function containing NativeString constructions, and pass it as the first argument to each NativeString constructor. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: uNetworkingAB <110806833+uNetworkingAB@users.noreply.github.com> * Add NativeStringContext and update NativeString to use pool allocation in Utilities.h Agent-Logs-Url: https://github.com/uNetworking/uWebSockets.js/sessions/0a6be420-47f1-4fb3-a5d5-55f6d09eb1b5 Co-authored-by: uNetworkingAB <110806833+uNetworkingAB@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: uNetworkingAB <110806833+uNetworkingAB@users.noreply.github.com>
This commit is contained in:
@@ -37,7 +37,8 @@ void uWS_App_ws(const FunctionCallbackInfo<Value> &args) {
|
||||
/* This one is default constructed with defaults */
|
||||
typename APP::template WebSocketBehavior<PerSocketData> behavior = {};
|
||||
|
||||
NativeString pattern(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString pattern(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (pattern.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -313,8 +314,9 @@ template <typename APP, typename F>
|
||||
void uWS_App_get(F f, const FunctionCallbackInfo<Value> &args) {
|
||||
APP *app = (APP *) args.This()->GetAlignedPointerFromInternalField(0);
|
||||
|
||||
NativeStringContext nativeStringContext;
|
||||
/* Pattern */
|
||||
NativeString pattern(args.GetIsolate(), args[0]);
|
||||
NativeString pattern(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (pattern.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -328,7 +330,7 @@ void uWS_App_get(F f, const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
/* If the handler is String */
|
||||
if (args[1]->IsArrayBuffer()) {
|
||||
NativeString constantString(args.GetIsolate(), args[1]);
|
||||
NativeString constantString(nativeStringContext, args.GetIsolate(), args[1]);
|
||||
if (constantString.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -513,7 +515,8 @@ void uWS_App_listen_unix(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
/* Path is last */
|
||||
std::string path;
|
||||
NativeString h(isolate, args[args.Length() - 1]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString h(nativeStringContext, isolate, args[args.Length() - 1]);
|
||||
if (h.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -545,8 +548,9 @@ void uWS_App_listen(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
/* Host is first, if present */
|
||||
std::string host;
|
||||
NativeStringContext nativeStringContext;
|
||||
if (!args[0]->IsNumber()) {
|
||||
NativeString h(isolate, args[0]);
|
||||
NativeString h(nativeStringContext, isolate, args[0]);
|
||||
if (h.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -605,7 +609,8 @@ void uWS_App_domain(const FunctionCallbackInfo<Value> &args) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString serverName(isolate, args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString serverName(nativeStringContext, isolate, args[0]);
|
||||
if (serverName.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -626,12 +631,13 @@ void uWS_App_publish(const FunctionCallbackInfo<Value> &args) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString topic(isolate, args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString topic(nativeStringContext, isolate, args[0]);
|
||||
if (topic.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString message(isolate, args[1]);
|
||||
NativeString message(nativeStringContext, isolate, args[1]);
|
||||
if (message.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -652,7 +658,8 @@ void uWS_App_numSubscribers(const FunctionCallbackInfo<Value> &args) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString topic(isolate, args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString topic(nativeStringContext, isolate, args[0]);
|
||||
if (topic.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -675,8 +682,9 @@ std::pair<uWS::SocketContextOptions, bool> readOptionsObject(const FunctionCallb
|
||||
|
||||
Local<Object> optionsObject = Local<Object>::Cast(args[index]);
|
||||
|
||||
NativeStringContext nativeStringContext;
|
||||
/* Key file name */
|
||||
NativeString keyFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "key_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
NativeString keyFileNameValue(nativeStringContext, isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "key_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
if (keyFileNameValue.isInvalid(args)) {
|
||||
return {};
|
||||
}
|
||||
@@ -686,7 +694,7 @@ std::pair<uWS::SocketContextOptions, bool> readOptionsObject(const FunctionCallb
|
||||
}
|
||||
|
||||
/* Cert file name */
|
||||
NativeString certFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "cert_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
NativeString certFileNameValue(nativeStringContext, isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "cert_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
if (certFileNameValue.isInvalid(args)) {
|
||||
return {};
|
||||
}
|
||||
@@ -696,7 +704,7 @@ std::pair<uWS::SocketContextOptions, bool> readOptionsObject(const FunctionCallb
|
||||
}
|
||||
|
||||
/* Passphrase */
|
||||
NativeString passphraseValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "passphrase", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
NativeString passphraseValue(nativeStringContext, isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "passphrase", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
if (passphraseValue.isInvalid(args)) {
|
||||
return {};
|
||||
}
|
||||
@@ -706,7 +714,7 @@ std::pair<uWS::SocketContextOptions, bool> readOptionsObject(const FunctionCallb
|
||||
}
|
||||
|
||||
/* DH params file name */
|
||||
NativeString dhParamsFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "dh_params_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
NativeString dhParamsFileNameValue(nativeStringContext, isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "dh_params_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
if (dhParamsFileNameValue.isInvalid(args)) {
|
||||
return {};
|
||||
}
|
||||
@@ -716,7 +724,7 @@ std::pair<uWS::SocketContextOptions, bool> readOptionsObject(const FunctionCallb
|
||||
}
|
||||
|
||||
/* CA file name */
|
||||
NativeString caFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "ca_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
NativeString caFileNameValue(nativeStringContext, isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "ca_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
if (caFileNameValue.isInvalid(args)) {
|
||||
return {};
|
||||
}
|
||||
@@ -729,7 +737,7 @@ std::pair<uWS::SocketContextOptions, bool> readOptionsObject(const FunctionCallb
|
||||
options.ssl_prefer_low_memory_usage = optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "ssl_prefer_low_memory_usage", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked()->BooleanValue(isolate);
|
||||
|
||||
/* ssl_ciphers */
|
||||
NativeString sslCiphersValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "ssl_ciphers", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
NativeString sslCiphersValue(nativeStringContext, isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "ssl_ciphers", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||
if (sslCiphersValue.isInvalid(args)) {
|
||||
return {};
|
||||
}
|
||||
@@ -824,7 +832,8 @@ void uWS_App_addServerName(const FunctionCallbackInfo<Value> &args) {
|
||||
APP *app = (APP *) args.This()->GetAlignedPointerFromInternalField(0);
|
||||
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeString hostnamePatternValue(isolate, args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString hostnamePatternValue(nativeStringContext, isolate, args[0]);
|
||||
if (hostnamePatternValue.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -848,7 +857,8 @@ void uWS_App_removeServerName(const FunctionCallbackInfo<Value> &args) {
|
||||
APP *app = (APP *) args.This()->GetAlignedPointerFromInternalField(0);
|
||||
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeString hostnamePatternValue(isolate, args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString hostnamePatternValue(nativeStringContext, isolate, args[0]);
|
||||
if (hostnamePatternValue.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -930,8 +940,9 @@ void uWS_App(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
APP *app = (APP *) args.This()->GetAlignedPointerFromInternalField(0);
|
||||
|
||||
NativeStringContext nativeStringContext;
|
||||
/* Pattern */
|
||||
NativeString pattern(args.GetIsolate(), args[0]);
|
||||
NativeString pattern(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (pattern.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ struct HttpRequestWrapper {
|
||||
template <int QUIC>
|
||||
static void req_getParameter(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *req = getHttpRequest<QUIC>(args);
|
||||
if (req) {
|
||||
|
||||
@@ -71,7 +72,7 @@ struct HttpRequestWrapper {
|
||||
int index = args[0]->Uint32Value(isolate->GetCurrentContext()).ToChecked();
|
||||
parameter = req->getParameter(index);
|
||||
} else {
|
||||
NativeString data(args.GetIsolate(), args[0]);
|
||||
NativeString data(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (data.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -98,9 +99,10 @@ struct HttpRequestWrapper {
|
||||
template <int QUIC>
|
||||
static void req_getHeader(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *req = getHttpRequest<QUIC>(args);
|
||||
if (req) {
|
||||
NativeString data(args.GetIsolate(), args[0]);
|
||||
NativeString data(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (data.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -152,13 +154,14 @@ struct HttpRequestWrapper {
|
||||
template <int QUIC>
|
||||
static void req_getQuery(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *req = getHttpRequest<QUIC>(args);
|
||||
if (req) {
|
||||
std::string_view query;
|
||||
|
||||
/* Do we have a key argument? */
|
||||
if (args.Length() == 1) {
|
||||
NativeString keyString(isolate, args[0]);
|
||||
NativeString keyString(nativeStringContext, isolate, args[0]);
|
||||
if (keyString.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -369,7 +369,8 @@ struct HttpResponseWrapper {
|
||||
static void res_writeStatus(const FunctionCallbackInfo<Value> &args) {
|
||||
auto *res = getHttpResponse<SSL>(args);
|
||||
if (res) {
|
||||
NativeString data(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString data(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (data.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -409,7 +410,8 @@ struct HttpResponseWrapper {
|
||||
static void res_end(const FunctionCallbackInfo<Value> &args) {
|
||||
auto *res = getHttpResponse<PROTOCOL>(args);
|
||||
if (res) {
|
||||
NativeString data(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString data(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (data.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -432,9 +434,10 @@ struct HttpResponseWrapper {
|
||||
template <int PROTOCOL>
|
||||
static void res_tryEnd(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *res = getHttpResponse<PROTOCOL>(args);
|
||||
if (res) {
|
||||
NativeString data(args.GetIsolate(), args[0]);
|
||||
NativeString data(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (data.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -465,9 +468,10 @@ struct HttpResponseWrapper {
|
||||
template <int PROTOCOL>
|
||||
static void res_write(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *res = getHttpResponse<PROTOCOL>(args);
|
||||
if (res) {
|
||||
NativeString data(args.GetIsolate(), args[0]);
|
||||
NativeString data(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (data.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -482,13 +486,14 @@ struct HttpResponseWrapper {
|
||||
template <int PROTOCOL>
|
||||
static void res_writeHeader(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *res = getHttpResponse<PROTOCOL>(args);
|
||||
if (res) {
|
||||
NativeString header(args.GetIsolate(), args[0]);
|
||||
NativeString header(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (header.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
NativeString value(args.GetIsolate(), args[1]);
|
||||
NativeString value(nativeStringContext, args.GetIsolate(), args[1]);
|
||||
if (value.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -521,6 +526,7 @@ struct HttpResponseWrapper {
|
||||
template <int SSL>
|
||||
static void res_upgrade(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *res = getHttpResponse<SSL>(args);
|
||||
if (res) {
|
||||
/* We require exactly 5 arguments */
|
||||
@@ -528,17 +534,17 @@ struct HttpResponseWrapper {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString secWebSocketKey(args.GetIsolate(), args[1]);
|
||||
NativeString secWebSocketKey(nativeStringContext, args.GetIsolate(), args[1]);
|
||||
if (secWebSocketKey.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString secWebSocketProtocol(args.GetIsolate(), args[2]);
|
||||
NativeString secWebSocketProtocol(nativeStringContext, args.GetIsolate(), args[2]);
|
||||
if (secWebSocketProtocol.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString secWebSocketExtensions(args.GetIsolate(), args[3]);
|
||||
NativeString secWebSocketExtensions(nativeStringContext, args.GetIsolate(), args[3]);
|
||||
if (secWebSocketExtensions.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <openssl/ssl.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <v8.h>
|
||||
#include <vector>
|
||||
using namespace v8;
|
||||
|
||||
/* Unfortunately we _have_ to depend on Node.js crap */
|
||||
@@ -118,13 +119,26 @@ struct Callback {
|
||||
}
|
||||
};
|
||||
|
||||
class NativeStringContext {
|
||||
inline static thread_local std::vector<char> pool = std::vector<char>(8 * 1024 * 1024);
|
||||
size_t pool_offset = 0;
|
||||
public:
|
||||
char *alloc(size_t size) {
|
||||
if (pool_offset + size > pool.size()) {
|
||||
pool.resize(pool_offset + size);
|
||||
}
|
||||
char *ptr = pool.data() + pool_offset;
|
||||
pool_offset += size;
|
||||
return ptr;
|
||||
}
|
||||
};
|
||||
|
||||
class NativeString {
|
||||
char *data;
|
||||
size_t length;
|
||||
bool strAllocated = false;
|
||||
bool invalid = false;
|
||||
public:
|
||||
NativeString(Isolate *isolate, const Local<Value> &value) {
|
||||
NativeString(NativeStringContext &ctx, Isolate *isolate, const Local<Value> &value) {
|
||||
if (value->IsUndefined()) {
|
||||
data = nullptr;
|
||||
length = 0;
|
||||
@@ -138,15 +152,13 @@ public:
|
||||
data = (char *) strView.data8();
|
||||
} else {
|
||||
// utf16: copy and convert to utf8
|
||||
strAllocated = true;
|
||||
length = string->Utf8LengthV2(isolate);
|
||||
data = new char[length];
|
||||
data = ctx.alloc(length);
|
||||
string->WriteUtf8V2(isolate, data, length);
|
||||
}
|
||||
#else // Fallback Node.js < 24
|
||||
strAllocated = true;
|
||||
length = string->Utf8Length(isolate);
|
||||
data = new char[length];
|
||||
data = ctx.alloc(length);
|
||||
string->WriteUtf8(isolate, data, length, nullptr, String::WriteOptions::NO_NULL_TERMINATION);
|
||||
#endif
|
||||
} else if (value->IsArrayBufferView()) { /* DataView or TypedArray */
|
||||
@@ -179,12 +191,6 @@ public:
|
||||
std::string_view getString() {
|
||||
return {data, length};
|
||||
}
|
||||
|
||||
~NativeString() {
|
||||
if (strAllocated) {
|
||||
delete[] data;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Utility function to extract raw certificate data
|
||||
|
||||
@@ -50,9 +50,10 @@ struct WebSocketWrapper {
|
||||
template <bool SSL>
|
||||
static void uWS_WebSocket_subscribe(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *ws = getWebSocket<SSL>(args);
|
||||
if (ws) {
|
||||
NativeString topic(isolate, args[0]);
|
||||
NativeString topic(nativeStringContext, isolate, args[0]);
|
||||
if (topic.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -66,9 +67,10 @@ struct WebSocketWrapper {
|
||||
template <bool SSL>
|
||||
static void uWS_WebSocket_unsubscribe(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *ws = getWebSocket<SSL>(args);
|
||||
if (ws) {
|
||||
NativeString topic(isolate, args[0]);
|
||||
NativeString topic(nativeStringContext, isolate, args[0]);
|
||||
if (topic.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -82,17 +84,18 @@ struct WebSocketWrapper {
|
||||
template <bool SSL>
|
||||
static void uWS_WebSocket_publish(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *ws = getWebSocket<SSL>(args);
|
||||
if (ws) {
|
||||
if (missingArguments(2, args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString topic(isolate, args[0]);
|
||||
NativeString topic(nativeStringContext, isolate, args[0]);
|
||||
if (topic.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
NativeString message(isolate, args[1]);
|
||||
NativeString message(nativeStringContext, isolate, args[1]);
|
||||
if (message.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -119,6 +122,7 @@ struct WebSocketWrapper {
|
||||
template <bool SSL>
|
||||
static void uWS_WebSocket_end(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *ws = getWebSocket<SSL>(args);
|
||||
if (ws) {
|
||||
int code = 0;
|
||||
@@ -126,7 +130,7 @@ struct WebSocketWrapper {
|
||||
code = args[0]->Uint32Value(isolate->GetCurrentContext()).ToChecked();
|
||||
}
|
||||
|
||||
NativeString message(args.GetIsolate(), args[1]);
|
||||
NativeString message(nativeStringContext, args.GetIsolate(), args[1]);
|
||||
if (message.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -186,9 +190,10 @@ struct WebSocketWrapper {
|
||||
template <bool SSL>
|
||||
static void uWS_WebSocket_sendFirstFragment(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *ws = getWebSocket<SSL>(args);
|
||||
if (ws) {
|
||||
NativeString message(args.GetIsolate(), args[0]);
|
||||
NativeString message(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (message.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -203,9 +208,10 @@ struct WebSocketWrapper {
|
||||
template <bool SSL>
|
||||
static void uWS_WebSocket_sendFragment(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *ws = getWebSocket<SSL>(args);
|
||||
if (ws) {
|
||||
NativeString message(args.GetIsolate(), args[0]);
|
||||
NativeString message(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (message.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -220,9 +226,10 @@ struct WebSocketWrapper {
|
||||
template <bool SSL>
|
||||
static void uWS_WebSocket_sendLastFragment(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *ws = getWebSocket<SSL>(args);
|
||||
if (ws) {
|
||||
NativeString message(args.GetIsolate(), args[0]);
|
||||
NativeString message(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (message.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -237,9 +244,10 @@ struct WebSocketWrapper {
|
||||
template <bool SSL>
|
||||
static void uWS_WebSocket_send(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *ws = getWebSocket<SSL>(args);
|
||||
if (ws) {
|
||||
NativeString message(args.GetIsolate(), args[0]);
|
||||
NativeString message(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (message.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -254,9 +262,10 @@ struct WebSocketWrapper {
|
||||
template <bool SSL>
|
||||
static void uWS_WebSocket_isSubscribed(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *ws = getWebSocket<SSL>(args);
|
||||
if (ws) {
|
||||
NativeString topic(args.GetIsolate(), args[0]);
|
||||
NativeString topic(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (topic.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -271,9 +280,10 @@ struct WebSocketWrapper {
|
||||
template <bool SSL>
|
||||
static void uWS_WebSocket_ping(const FunctionCallbackInfo<Value> &args) {
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
NativeStringContext nativeStringContext;
|
||||
auto *ws = getWebSocket<SSL>(args);
|
||||
if (ws) {
|
||||
NativeString message(args.GetIsolate(), args[0]);
|
||||
NativeString message(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (message.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -46,14 +46,15 @@ void uWS_getParts(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
/* Because we mutate the strings, it is important that we get mutable input like
|
||||
* ArrayBuffer or Buffer, not String! */
|
||||
NativeStringContext nativeStringContext;
|
||||
Isolate *isolate = args.GetIsolate();
|
||||
|
||||
NativeString body(args.GetIsolate(), args[0]);
|
||||
NativeString body(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (body.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString contentType(args.GetIsolate(), args[1]);
|
||||
NativeString contentType(nativeStringContext, args.GetIsolate(), args[1]);
|
||||
if (contentType.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -149,7 +150,8 @@ void uWS_clearTimeout(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
/* Pass various undocumented configs */
|
||||
void uWS_cfg(const FunctionCallbackInfo<Value> &args) {
|
||||
NativeString key(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString key(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (key.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -183,12 +185,13 @@ std::mutex kvMutex;
|
||||
|
||||
// getString(key, collection)
|
||||
void uWS_getString(const FunctionCallbackInfo<Value> &args) {
|
||||
NativeString key(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString key(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (key.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString collection(args.GetIsolate(), args[1]);
|
||||
NativeString collection(nativeStringContext, args.GetIsolate(), args[1]);
|
||||
if (collection.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -199,16 +202,17 @@ void uWS_getString(const FunctionCallbackInfo<Value> &args) {
|
||||
}
|
||||
|
||||
void uWS_setString(const FunctionCallbackInfo<Value> &args) {
|
||||
NativeString key(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString key(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (key.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
NativeString value(args.GetIsolate(), args[1]);
|
||||
NativeString value(nativeStringContext, args.GetIsolate(), args[1]);
|
||||
if (value.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString collection(args.GetIsolate(), args[2]);
|
||||
NativeString collection(nativeStringContext, args.GetIsolate(), args[2]);
|
||||
if (collection.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -217,12 +221,13 @@ void uWS_setString(const FunctionCallbackInfo<Value> &args) {
|
||||
}
|
||||
|
||||
void uWS_getInteger(const FunctionCallbackInfo<Value> &args) {
|
||||
NativeString key(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString key(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (key.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString collection(args.GetIsolate(), args[1]);
|
||||
NativeString collection(nativeStringContext, args.GetIsolate(), args[1]);
|
||||
if (collection.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -233,14 +238,15 @@ void uWS_getInteger(const FunctionCallbackInfo<Value> &args) {
|
||||
}
|
||||
|
||||
void uWS_setInteger(const FunctionCallbackInfo<Value> &args) {
|
||||
NativeString key(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString key(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (key.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t value = Local<Integer>::Cast(args[1])->Value();
|
||||
|
||||
NativeString collection(args.GetIsolate(), args[2]);
|
||||
NativeString collection(nativeStringContext, args.GetIsolate(), args[2]);
|
||||
if (collection.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -249,14 +255,15 @@ void uWS_setInteger(const FunctionCallbackInfo<Value> &args) {
|
||||
}
|
||||
|
||||
void uWS_incInteger(const FunctionCallbackInfo<Value> &args) {
|
||||
NativeString key(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString key(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (key.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t change = Local<Integer>::Cast(args[1])->Value();
|
||||
|
||||
NativeString collection(args.GetIsolate(), args[2]);
|
||||
NativeString collection(nativeStringContext, args.GetIsolate(), args[2]);
|
||||
if (collection.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -269,7 +276,8 @@ void uWS_incInteger(const FunctionCallbackInfo<Value> &args) {
|
||||
/* This one will spike memory usage for large stores */
|
||||
void uWS_getStringKeys(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
NativeString collection(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString collection(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (collection.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -287,7 +295,8 @@ void uWS_getStringKeys(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
void uWS_getIntegerKeys(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
NativeString collection(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString collection(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (collection.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -305,12 +314,13 @@ void uWS_getIntegerKeys(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
void uWS_deleteString(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
NativeString key(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString key(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (key.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString collection(args.GetIsolate(), args[1]);
|
||||
NativeString collection(nativeStringContext, args.GetIsolate(), args[1]);
|
||||
if (collection.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -322,12 +332,13 @@ void uWS_deleteString(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
void uWS_deleteInteger(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
NativeString key(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString key(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (key.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
NativeString collection(args.GetIsolate(), args[1]);
|
||||
NativeString collection(nativeStringContext, args.GetIsolate(), args[1]);
|
||||
if (collection.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -339,7 +350,8 @@ void uWS_deleteInteger(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
void uWS_deleteStringCollection(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
NativeString collection(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString collection(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (collection.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
@@ -351,7 +363,8 @@ void uWS_deleteStringCollection(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
void uWS_deleteIntegerCollection(const FunctionCallbackInfo<Value> &args) {
|
||||
|
||||
NativeString collection(args.GetIsolate(), args[0]);
|
||||
NativeStringContext nativeStringContext;
|
||||
NativeString collection(nativeStringContext, args.GetIsolate(), args[0]);
|
||||
if (collection.isInvalid(args)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user