node_grpc.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /*
  2. *
  3. * Copyright 2015, Google Inc.
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions are
  8. * met:
  9. *
  10. * * Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * * Redistributions in binary form must reproduce the above
  13. * copyright notice, this list of conditions and the following disclaimer
  14. * in the documentation and/or other materials provided with the
  15. * distribution.
  16. * * Neither the name of Google Inc. nor the names of its
  17. * contributors may be used to endorse or promote products derived from
  18. * this software without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  23. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  24. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  25. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  26. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  27. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  28. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  29. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  30. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. *
  32. */
  33. #include <node.h>
  34. #include <nan.h>
  35. #include <v8.h>
  36. #include "grpc/grpc.h"
  37. #include "call.h"
  38. #include "call_credentials.h"
  39. #include "channel.h"
  40. #include "channel_credentials.h"
  41. #include "server.h"
  42. #include "completion_queue_async_worker.h"
  43. #include "server_credentials.h"
  44. using v8::Local;
  45. using v8::Value;
  46. using v8::Object;
  47. using v8::Uint32;
  48. using v8::String;
  49. void InitStatusConstants(Local<Object> exports) {
  50. Nan::HandleScope scope;
  51. Local<Object> status = Nan::New<Object>();
  52. Nan::Set(exports, Nan::New("status").ToLocalChecked(), status);
  53. Local<Value> OK(Nan::New<Uint32, uint32_t>(GRPC_STATUS_OK));
  54. Nan::Set(status, Nan::New("OK").ToLocalChecked(), OK);
  55. Local<Value> CANCELLED(Nan::New<Uint32, uint32_t>(GRPC_STATUS_CANCELLED));
  56. Nan::Set(status, Nan::New("CANCELLED").ToLocalChecked(), CANCELLED);
  57. Local<Value> UNKNOWN(Nan::New<Uint32, uint32_t>(GRPC_STATUS_UNKNOWN));
  58. Nan::Set(status, Nan::New("UNKNOWN").ToLocalChecked(), UNKNOWN);
  59. Local<Value> INVALID_ARGUMENT(
  60. Nan::New<Uint32, uint32_t>(GRPC_STATUS_INVALID_ARGUMENT));
  61. Nan::Set(status, Nan::New("INVALID_ARGUMENT").ToLocalChecked(),
  62. INVALID_ARGUMENT);
  63. Local<Value> DEADLINE_EXCEEDED(
  64. Nan::New<Uint32, uint32_t>(GRPC_STATUS_DEADLINE_EXCEEDED));
  65. Nan::Set(status, Nan::New("DEADLINE_EXCEEDED").ToLocalChecked(),
  66. DEADLINE_EXCEEDED);
  67. Local<Value> NOT_FOUND(Nan::New<Uint32, uint32_t>(GRPC_STATUS_NOT_FOUND));
  68. Nan::Set(status, Nan::New("NOT_FOUND").ToLocalChecked(), NOT_FOUND);
  69. Local<Value> ALREADY_EXISTS(
  70. Nan::New<Uint32, uint32_t>(GRPC_STATUS_ALREADY_EXISTS));
  71. Nan::Set(status, Nan::New("ALREADY_EXISTS").ToLocalChecked(), ALREADY_EXISTS);
  72. Local<Value> PERMISSION_DENIED(
  73. Nan::New<Uint32, uint32_t>(GRPC_STATUS_PERMISSION_DENIED));
  74. Nan::Set(status, Nan::New("PERMISSION_DENIED").ToLocalChecked(),
  75. PERMISSION_DENIED);
  76. Local<Value> UNAUTHENTICATED(
  77. Nan::New<Uint32, uint32_t>(GRPC_STATUS_UNAUTHENTICATED));
  78. Nan::Set(status, Nan::New("UNAUTHENTICATED").ToLocalChecked(),
  79. UNAUTHENTICATED);
  80. Local<Value> RESOURCE_EXHAUSTED(
  81. Nan::New<Uint32, uint32_t>(GRPC_STATUS_RESOURCE_EXHAUSTED));
  82. Nan::Set(status, Nan::New("RESOURCE_EXHAUSTED").ToLocalChecked(),
  83. RESOURCE_EXHAUSTED);
  84. Local<Value> FAILED_PRECONDITION(
  85. Nan::New<Uint32, uint32_t>(GRPC_STATUS_FAILED_PRECONDITION));
  86. Nan::Set(status, Nan::New("FAILED_PRECONDITION").ToLocalChecked(),
  87. FAILED_PRECONDITION);
  88. Local<Value> ABORTED(Nan::New<Uint32, uint32_t>(GRPC_STATUS_ABORTED));
  89. Nan::Set(status, Nan::New("ABORTED").ToLocalChecked(), ABORTED);
  90. Local<Value> OUT_OF_RANGE(
  91. Nan::New<Uint32, uint32_t>(GRPC_STATUS_OUT_OF_RANGE));
  92. Nan::Set(status, Nan::New("OUT_OF_RANGE").ToLocalChecked(), OUT_OF_RANGE);
  93. Local<Value> UNIMPLEMENTED(
  94. Nan::New<Uint32, uint32_t>(GRPC_STATUS_UNIMPLEMENTED));
  95. Nan::Set(status, Nan::New("UNIMPLEMENTED").ToLocalChecked(), UNIMPLEMENTED);
  96. Local<Value> INTERNAL(Nan::New<Uint32, uint32_t>(GRPC_STATUS_INTERNAL));
  97. Nan::Set(status, Nan::New("INTERNAL").ToLocalChecked(), INTERNAL);
  98. Local<Value> UNAVAILABLE(Nan::New<Uint32, uint32_t>(GRPC_STATUS_UNAVAILABLE));
  99. Nan::Set(status, Nan::New("UNAVAILABLE").ToLocalChecked(), UNAVAILABLE);
  100. Local<Value> DATA_LOSS(Nan::New<Uint32, uint32_t>(GRPC_STATUS_DATA_LOSS));
  101. Nan::Set(status, Nan::New("DATA_LOSS").ToLocalChecked(), DATA_LOSS);
  102. }
  103. void InitCallErrorConstants(Local<Object> exports) {
  104. Nan::HandleScope scope;
  105. Local<Object> call_error = Nan::New<Object>();
  106. Nan::Set(exports, Nan::New("callError").ToLocalChecked(), call_error);
  107. Local<Value> OK(Nan::New<Uint32, uint32_t>(GRPC_CALL_OK));
  108. Nan::Set(call_error, Nan::New("OK").ToLocalChecked(), OK);
  109. Local<Value> ERROR(Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR));
  110. Nan::Set(call_error, Nan::New("ERROR").ToLocalChecked(), ERROR);
  111. Local<Value> NOT_ON_SERVER(
  112. Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_NOT_ON_SERVER));
  113. Nan::Set(call_error, Nan::New("NOT_ON_SERVER").ToLocalChecked(),
  114. NOT_ON_SERVER);
  115. Local<Value> NOT_ON_CLIENT(
  116. Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_NOT_ON_CLIENT));
  117. Nan::Set(call_error, Nan::New("NOT_ON_CLIENT").ToLocalChecked(),
  118. NOT_ON_CLIENT);
  119. Local<Value> ALREADY_INVOKED(
  120. Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_ALREADY_INVOKED));
  121. Nan::Set(call_error, Nan::New("ALREADY_INVOKED").ToLocalChecked(),
  122. ALREADY_INVOKED);
  123. Local<Value> NOT_INVOKED(
  124. Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_NOT_INVOKED));
  125. Nan::Set(call_error, Nan::New("NOT_INVOKED").ToLocalChecked(), NOT_INVOKED);
  126. Local<Value> ALREADY_FINISHED(
  127. Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_ALREADY_FINISHED));
  128. Nan::Set(call_error, Nan::New("ALREADY_FINISHED").ToLocalChecked(),
  129. ALREADY_FINISHED);
  130. Local<Value> TOO_MANY_OPERATIONS(
  131. Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_TOO_MANY_OPERATIONS));
  132. Nan::Set(call_error, Nan::New("TOO_MANY_OPERATIONS").ToLocalChecked(),
  133. TOO_MANY_OPERATIONS);
  134. Local<Value> INVALID_FLAGS(
  135. Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_INVALID_FLAGS));
  136. Nan::Set(call_error, Nan::New("INVALID_FLAGS").ToLocalChecked(),
  137. INVALID_FLAGS);
  138. }
  139. void InitOpTypeConstants(Local<Object> exports) {
  140. Nan::HandleScope scope;
  141. Local<Object> op_type = Nan::New<Object>();
  142. Nan::Set(exports, Nan::New("opType").ToLocalChecked(), op_type);
  143. Local<Value> SEND_INITIAL_METADATA(
  144. Nan::New<Uint32, uint32_t>(GRPC_OP_SEND_INITIAL_METADATA));
  145. Nan::Set(op_type, Nan::New("SEND_INITIAL_METADATA").ToLocalChecked(),
  146. SEND_INITIAL_METADATA);
  147. Local<Value> SEND_MESSAGE(
  148. Nan::New<Uint32, uint32_t>(GRPC_OP_SEND_MESSAGE));
  149. Nan::Set(op_type, Nan::New("SEND_MESSAGE").ToLocalChecked(), SEND_MESSAGE);
  150. Local<Value> SEND_CLOSE_FROM_CLIENT(
  151. Nan::New<Uint32, uint32_t>(GRPC_OP_SEND_CLOSE_FROM_CLIENT));
  152. Nan::Set(op_type, Nan::New("SEND_CLOSE_FROM_CLIENT").ToLocalChecked(),
  153. SEND_CLOSE_FROM_CLIENT);
  154. Local<Value> SEND_STATUS_FROM_SERVER(
  155. Nan::New<Uint32, uint32_t>(GRPC_OP_SEND_STATUS_FROM_SERVER));
  156. Nan::Set(op_type, Nan::New("SEND_STATUS_FROM_SERVER").ToLocalChecked(),
  157. SEND_STATUS_FROM_SERVER);
  158. Local<Value> RECV_INITIAL_METADATA(
  159. Nan::New<Uint32, uint32_t>(GRPC_OP_RECV_INITIAL_METADATA));
  160. Nan::Set(op_type, Nan::New("RECV_INITIAL_METADATA").ToLocalChecked(),
  161. RECV_INITIAL_METADATA);
  162. Local<Value> RECV_MESSAGE(
  163. Nan::New<Uint32, uint32_t>(GRPC_OP_RECV_MESSAGE));
  164. Nan::Set(op_type, Nan::New("RECV_MESSAGE").ToLocalChecked(), RECV_MESSAGE);
  165. Local<Value> RECV_STATUS_ON_CLIENT(
  166. Nan::New<Uint32, uint32_t>(GRPC_OP_RECV_STATUS_ON_CLIENT));
  167. Nan::Set(op_type, Nan::New("RECV_STATUS_ON_CLIENT").ToLocalChecked(),
  168. RECV_STATUS_ON_CLIENT);
  169. Local<Value> RECV_CLOSE_ON_SERVER(
  170. Nan::New<Uint32, uint32_t>(GRPC_OP_RECV_CLOSE_ON_SERVER));
  171. Nan::Set(op_type, Nan::New("RECV_CLOSE_ON_SERVER").ToLocalChecked(),
  172. RECV_CLOSE_ON_SERVER);
  173. }
  174. void InitPropagateConstants(Local<Object> exports) {
  175. Nan::HandleScope scope;
  176. Local<Object> propagate = Nan::New<Object>();
  177. Nan::Set(exports, Nan::New("propagate").ToLocalChecked(), propagate);
  178. Local<Value> DEADLINE(Nan::New<Uint32, uint32_t>(GRPC_PROPAGATE_DEADLINE));
  179. Nan::Set(propagate, Nan::New("DEADLINE").ToLocalChecked(), DEADLINE);
  180. Local<Value> CENSUS_STATS_CONTEXT(
  181. Nan::New<Uint32, uint32_t>(GRPC_PROPAGATE_CENSUS_STATS_CONTEXT));
  182. Nan::Set(propagate, Nan::New("CENSUS_STATS_CONTEXT").ToLocalChecked(),
  183. CENSUS_STATS_CONTEXT);
  184. Local<Value> CENSUS_TRACING_CONTEXT(
  185. Nan::New<Uint32, uint32_t>(GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT));
  186. Nan::Set(propagate, Nan::New("CENSUS_TRACING_CONTEXT").ToLocalChecked(),
  187. CENSUS_TRACING_CONTEXT);
  188. Local<Value> CANCELLATION(
  189. Nan::New<Uint32, uint32_t>(GRPC_PROPAGATE_CANCELLATION));
  190. Nan::Set(propagate, Nan::New("CANCELLATION").ToLocalChecked(), CANCELLATION);
  191. Local<Value> DEFAULTS(Nan::New<Uint32, uint32_t>(GRPC_PROPAGATE_DEFAULTS));
  192. Nan::Set(propagate, Nan::New("DEFAULTS").ToLocalChecked(), DEFAULTS);
  193. }
  194. void InitConnectivityStateConstants(Local<Object> exports) {
  195. Nan::HandleScope scope;
  196. Local<Object> channel_state = Nan::New<Object>();
  197. Nan::Set(exports, Nan::New("connectivityState").ToLocalChecked(),
  198. channel_state);
  199. Local<Value> IDLE(Nan::New<Uint32, uint32_t>(GRPC_CHANNEL_IDLE));
  200. Nan::Set(channel_state, Nan::New("IDLE").ToLocalChecked(), IDLE);
  201. Local<Value> CONNECTING(Nan::New<Uint32, uint32_t>(GRPC_CHANNEL_CONNECTING));
  202. Nan::Set(channel_state, Nan::New("CONNECTING").ToLocalChecked(), CONNECTING);
  203. Local<Value> READY(Nan::New<Uint32, uint32_t>(GRPC_CHANNEL_READY));
  204. Nan::Set(channel_state, Nan::New("READY").ToLocalChecked(), READY);
  205. Local<Value> TRANSIENT_FAILURE(
  206. Nan::New<Uint32, uint32_t>(GRPC_CHANNEL_TRANSIENT_FAILURE));
  207. Nan::Set(channel_state, Nan::New("TRANSIENT_FAILURE").ToLocalChecked(),
  208. TRANSIENT_FAILURE);
  209. Local<Value> FATAL_FAILURE(
  210. Nan::New<Uint32, uint32_t>(GRPC_CHANNEL_FATAL_FAILURE));
  211. Nan::Set(channel_state, Nan::New("FATAL_FAILURE").ToLocalChecked(),
  212. FATAL_FAILURE);
  213. }
  214. void InitWriteFlags(Local<Object> exports) {
  215. Nan::HandleScope scope;
  216. Local<Object> write_flags = Nan::New<Object>();
  217. Nan::Set(exports, Nan::New("writeFlags").ToLocalChecked(), write_flags);
  218. Local<Value> BUFFER_HINT(Nan::New<Uint32, uint32_t>(GRPC_WRITE_BUFFER_HINT));
  219. Nan::Set(write_flags, Nan::New("BUFFER_HINT").ToLocalChecked(), BUFFER_HINT);
  220. Local<Value> NO_COMPRESS(Nan::New<Uint32, uint32_t>(GRPC_WRITE_NO_COMPRESS));
  221. Nan::Set(write_flags, Nan::New("NO_COMPRESS").ToLocalChecked(), NO_COMPRESS);
  222. }
  223. void init(Local<Object> exports) {
  224. Nan::HandleScope scope;
  225. grpc_init();
  226. InitStatusConstants(exports);
  227. InitCallErrorConstants(exports);
  228. InitOpTypeConstants(exports);
  229. InitPropagateConstants(exports);
  230. InitConnectivityStateConstants(exports);
  231. InitWriteFlags(exports);
  232. grpc::node::Call::Init(exports);
  233. grpc::node::CallCredentials::Init(exports);
  234. grpc::node::Channel::Init(exports);
  235. grpc::node::ChannelCredentials::Init(exports);
  236. grpc::node::Server::Init(exports);
  237. grpc::node::CompletionQueueAsyncWorker::Init(exports);
  238. grpc::node::ServerCredentials::Init(exports);
  239. }
  240. NODE_MODULE(grpc_node, init)