Add OPTION_DO_NOT_REUSE_PORT, update uWS

This commit is contained in:
Alex Hultman 2019-04-17 22:09:11 +02:00
parent 533000b490
commit c22e417cf9
3 changed files with 26 additions and 13 deletions

View File

@ -179,30 +179,40 @@ template <typename APP>
void uWS_App_listen(const FunctionCallbackInfo<Value> &args) { void uWS_App_listen(const FunctionCallbackInfo<Value> &args) {
APP *app = (APP *) args.Holder()->GetAlignedPointerFromInternalField(0); APP *app = (APP *) args.Holder()->GetAlignedPointerFromInternalField(0);
/* Invalid use */ /* Require at least two arguments */
if (args.Length() != 2 && args.Length() != 3) { if (args.Length() < 2) {
/* Throw here */ /* Throw here */
args.GetReturnValue().Set(isolate->ThrowException(String::NewFromUtf8(isolate, "App.listen takes 2 or 3 arguments"))); args.GetReturnValue().Set(isolate->ThrowException(String::NewFromUtf8(isolate, "App.listen requires port and callback")));
return; return;
} }
/* Callback is last */
auto cb = [&args](auto *token) { auto cb = [&args](auto *token) {
/* Return a false boolean if listen failed */ /* Return a false boolean if listen failed */
Local<Value> argv[] = {token ? Local<Value>::Cast(External::New(isolate, token)) : Local<Value>::Cast(Boolean::New(isolate, false))}; Local<Value> argv[] = {token ? Local<Value>::Cast(External::New(isolate, token)) : Local<Value>::Cast(Boolean::New(isolate, false))};
Local<Function>::Cast(args[args.Length() - 1])->Call(isolate->GetCurrentContext()->Global(), 1, argv); Local<Function>::Cast(args[args.Length() - 1])->Call(isolate->GetCurrentContext()->Global(), 1, argv);
}; };
if (args.Length() == 2) { /* Host is first, if present */
/* Port, callback */ std::string host;
int port = args[0]->Uint32Value(args.GetIsolate()->GetCurrentContext()).ToChecked(); if (!args[0]->IsNumber()) {
app->listen(port, std::move(cb)); NativeString h(isolate, args[0]);
} else if (args.Length() == 3) { if (h.isInvalid(args)) {
/* Host, port, callback */ return;
NativeString host(isolate, args[0]); }
int port = args[1]->Uint32Value(args.GetIsolate()->GetCurrentContext()).ToChecked(); host = h.getString();
app->listen(std::string(host.getString().data(), host.getString().length()), port, std::move(cb));
} }
/* Port, options are in the middle, if present */
std::vector<int> numbers;
for (int i = std::min<int>(1, host.length()); i < args.Length() - 1; i++) {
numbers.push_back(args[i]->Uint32Value(args.GetIsolate()->GetCurrentContext()).ToChecked());
}
/* We only use the most complete overload */
app->listen(host, numbers.size() ? numbers[0] : 0,
numbers.size() > 1 ? numbers[1] : 0, std::move(cb));
args.GetReturnValue().Set(args.Holder()); args.GetReturnValue().Set(args.Holder());
} }

View File

@ -89,6 +89,9 @@ void Main(Local<Object> exports) {
exports->Set(String::NewFromUtf8(isolate, "SHARED_COMPRESSOR"), Integer::NewFromUnsigned(isolate, uWS::SHARED_COMPRESSOR)); exports->Set(String::NewFromUtf8(isolate, "SHARED_COMPRESSOR"), Integer::NewFromUnsigned(isolate, uWS::SHARED_COMPRESSOR));
exports->Set(String::NewFromUtf8(isolate, "DEDICATED_COMPRESSOR"), Integer::NewFromUnsigned(isolate, uWS::DEDICATED_COMPRESSOR)); exports->Set(String::NewFromUtf8(isolate, "DEDICATED_COMPRESSOR"), Integer::NewFromUnsigned(isolate, uWS::DEDICATED_COMPRESSOR));
/* Listen options */
exports->Set(String::NewFromUtf8(isolate, "OPTION_DO_NOT_REUSE_PORT"), Integer::NewFromUnsigned(isolate, /*uWS::*/OPTION_DO_NOT_REUSE_PORT));
/* The template for websockets */ /* The template for websockets */
WebSocketWrapper::initWsTemplate<0>(); WebSocketWrapper::initWsTemplate<0>();
WebSocketWrapper::initWsTemplate<1>(); WebSocketWrapper::initWsTemplate<1>();

@ -1 +1 @@
Subproject commit 31574ec63ab36c6d6d0dcc8f35aba7200bc5d2e8 Subproject commit ba5f6560419f78cca1b0f4f67f961039b7291718