|
|
|
@ -35,15 +35,15 @@ |
|
|
|
|
|
|
|
|
|
#include "server.h" |
|
|
|
|
|
|
|
|
|
#include <node.h> |
|
|
|
|
#include <nan.h> |
|
|
|
|
#include <node.h> |
|
|
|
|
|
|
|
|
|
#include <vector> |
|
|
|
|
#include "call.h" |
|
|
|
|
#include "completion_queue_async_worker.h" |
|
|
|
|
#include "grpc/grpc.h" |
|
|
|
|
#include "grpc/grpc_security.h" |
|
|
|
|
#include "grpc/support/log.h" |
|
|
|
|
#include "call.h" |
|
|
|
|
#include "completion_queue_async_worker.h" |
|
|
|
|
#include "server_credentials.h" |
|
|
|
|
#include "timeval.h" |
|
|
|
|
|
|
|
|
@ -100,8 +100,8 @@ class NewCallOp : public Op { |
|
|
|
|
Nan::Set(obj, Nan::New("host").ToLocalChecked(), |
|
|
|
|
Nan::New(details.host).ToLocalChecked()); |
|
|
|
|
Nan::Set(obj, Nan::New("deadline").ToLocalChecked(), |
|
|
|
|
Nan::New<Date>( |
|
|
|
|
TimespecToMilliseconds(details.deadline)).ToLocalChecked()); |
|
|
|
|
Nan::New<Date>(TimespecToMilliseconds(details.deadline)) |
|
|
|
|
.ToLocalChecked()); |
|
|
|
|
Nan::Set(obj, Nan::New("metadata").ToLocalChecked(), |
|
|
|
|
ParseMetadata(&request_metadata)); |
|
|
|
|
return scope.Escape(obj); |
|
|
|
@ -117,14 +117,13 @@ class NewCallOp : public Op { |
|
|
|
|
grpc_metadata_array request_metadata; |
|
|
|
|
|
|
|
|
|
protected: |
|
|
|
|
std::string GetTypeString() const { |
|
|
|
|
return "new_call"; |
|
|
|
|
} |
|
|
|
|
std::string GetTypeString() const { return "new_call"; } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Server::Server(grpc_server *server) : wrapped_server(server) { |
|
|
|
|
shutdown_queue = grpc_completion_queue_create(NULL); |
|
|
|
|
grpc_server_register_completion_queue(server, shutdown_queue, NULL); |
|
|
|
|
grpc_server_register_non_listening_completion_queue(server, shutdown_queue, |
|
|
|
|
NULL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Server::~Server() { |
|
|
|
@ -156,8 +155,7 @@ bool Server::HasInstance(Local<Value> val) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Server::ShutdownServer() { |
|
|
|
|
grpc_server_shutdown_and_notify(this->wrapped_server, |
|
|
|
|
this->shutdown_queue, |
|
|
|
|
grpc_server_shutdown_and_notify(this->wrapped_server, this->shutdown_queue, |
|
|
|
|
NULL); |
|
|
|
|
grpc_server_cancel_all_calls(this->wrapped_server); |
|
|
|
|
grpc_completion_queue_pluck(this->shutdown_queue, NULL, |
|
|
|
@ -170,8 +168,8 @@ NAN_METHOD(Server::New) { |
|
|
|
|
if (!info.IsConstructCall()) { |
|
|
|
|
const int argc = 1; |
|
|
|
|
Local<Value> argv[argc] = {info[0]}; |
|
|
|
|
MaybeLocal<Object> maybe_instance = constructor->GetFunction()->NewInstance( |
|
|
|
|
argc, argv); |
|
|
|
|
MaybeLocal<Object> maybe_instance = |
|
|
|
|
constructor->GetFunction()->NewInstance(argc, argv); |
|
|
|
|
if (maybe_instance.IsEmpty()) { |
|
|
|
|
// There's probably a pending exception
|
|
|
|
|
return; |
|
|
|
@ -185,8 +183,9 @@ NAN_METHOD(Server::New) { |
|
|
|
|
grpc_channel_args *channel_args; |
|
|
|
|
if (!ParseChannelArgs(info[0], &channel_args)) { |
|
|
|
|
DeallocateChannelArgs(channel_args); |
|
|
|
|
return Nan::ThrowTypeError("Server options must be an object with " |
|
|
|
|
"string keys and integer or string values"); |
|
|
|
|
return Nan::ThrowTypeError( |
|
|
|
|
"Server options must be an object with " |
|
|
|
|
"string keys and integer or string values"); |
|
|
|
|
} |
|
|
|
|
wrapped_server = grpc_server_create(channel_args, NULL); |
|
|
|
|
DeallocateChannelArgs(channel_args); |
|
|
|
@ -218,8 +217,7 @@ NAN_METHOD(Server::RequestCall) { |
|
|
|
|
|
|
|
|
|
NAN_METHOD(Server::AddHttp2Port) { |
|
|
|
|
if (!HasInstance(info.This())) { |
|
|
|
|
return Nan::ThrowTypeError( |
|
|
|
|
"addHttp2Port can only be called on a Server"); |
|
|
|
|
return Nan::ThrowTypeError("addHttp2Port can only be called on a Server"); |
|
|
|
|
} |
|
|
|
|
if (!info[0]->IsString()) { |
|
|
|
|
return Nan::ThrowTypeError( |
|
|
|
@ -239,8 +237,7 @@ NAN_METHOD(Server::AddHttp2Port) { |
|
|
|
|
*Utf8String(info[0])); |
|
|
|
|
} else { |
|
|
|
|
port = grpc_server_add_secure_http2_port(server->wrapped_server, |
|
|
|
|
*Utf8String(info[0]), |
|
|
|
|
creds); |
|
|
|
|
*Utf8String(info[0]), creds); |
|
|
|
|
} |
|
|
|
|
info.GetReturnValue().Set(Nan::New<Number>(port)); |
|
|
|
|
} |
|
|
|
@ -262,8 +259,7 @@ NAN_METHOD(Server::TryShutdown) { |
|
|
|
|
Server *server = ObjectWrap::Unwrap<Server>(info.This()); |
|
|
|
|
unique_ptr<OpVec> ops(new OpVec()); |
|
|
|
|
grpc_server_shutdown_and_notify( |
|
|
|
|
server->wrapped_server, |
|
|
|
|
CompletionQueueAsyncWorker::GetQueue(), |
|
|
|
|
server->wrapped_server, CompletionQueueAsyncWorker::GetQueue(), |
|
|
|
|
new struct tag(new Nan::Callback(info[0].As<Function>()), ops.release(), |
|
|
|
|
shared_ptr<Resources>(nullptr))); |
|
|
|
|
CompletionQueueAsyncWorker::Next(); |
|
|
|
|