├── .gitignore ├── README.md ├── client.js ├── delete_todo.js ├── get_todos.js ├── insert_one.js ├── package-lock.json ├── package.json ├── server.js ├── todo.proto └── update_todo.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Simple TODO Application built using gRPC and Node.js 2 | It's a simple Todo Applcation build using gRPC and Node.js 3 | ### To Run 4 | - cd 5 | - npm install 6 | - node server.js 7 | - node get_todos.js (To List all the todos) 8 | - node insert_one.js (TO Insert todo) -------------------------------------------------------------------------------- /client.js: -------------------------------------------------------------------------------- 1 | const grpc = require('grpc'); 2 | 3 | const PROTO_PATH = './todo.proto' 4 | 5 | const TodoService = grpc.load(PROTO_PATH).TodoService 6 | 7 | const client = new TodoService('localhost:50051', 8 | grpc.credentials.createInsecure()) 9 | 10 | module.exports = client -------------------------------------------------------------------------------- /delete_todo.js: -------------------------------------------------------------------------------- 1 | const client =require('./client') 2 | 3 | client.delete({ id : 'd544a8f0-7352-11e9-98b4-d9f50be459c8' },(error,_) => { 4 | if(!error){ 5 | console.log('Todo is deleted Successfully') 6 | } 7 | else{ 8 | console.error(error) 9 | } 10 | 11 | }) 12 | -------------------------------------------------------------------------------- /get_todos.js: -------------------------------------------------------------------------------- 1 | const client = require('./client') 2 | 3 | client.list({},(error,todos) => { 4 | if(!error){ 5 | console.log('successfullt fetched todo lists'); 6 | console.log(todos); 7 | } 8 | else{ 9 | console.error(error); 10 | } 11 | }); 12 | 13 | -------------------------------------------------------------------------------- /insert_one.js: -------------------------------------------------------------------------------- 1 | const client = require('./client') 2 | 3 | let newTodo = { 4 | title : 'New checklist', 5 | iscompleted : false 6 | } 7 | 8 | client.insert(newTodo,(error,todo) => { 9 | if(!error){ 10 | console.log('New Todo inserted successfully'); 11 | 12 | } 13 | else{ 14 | console.error(error); 15 | } 16 | }) -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grpc-node", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@grpc/proto-loader": { 8 | "version": "0.5.0", 9 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.0.tgz", 10 | "integrity": "sha512-kF5toaC4A7PRjAuIxE0fYAv8WarJ6JELYlmHpkoo4EGTFvXUsQwVfyj2bgPV2023M77s2TtDn36wPMJB0sz8nA==", 11 | "requires": { 12 | "lodash.camelcase": "^4.3.0", 13 | "protobufjs": "^6.8.6" 14 | }, 15 | "dependencies": { 16 | "long": { 17 | "version": "4.0.0", 18 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 19 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 20 | }, 21 | "protobufjs": { 22 | "version": "6.8.8", 23 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", 24 | "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", 25 | "requires": { 26 | "@protobufjs/aspromise": "^1.1.2", 27 | "@protobufjs/base64": "^1.1.2", 28 | "@protobufjs/codegen": "^2.0.4", 29 | "@protobufjs/eventemitter": "^1.1.0", 30 | "@protobufjs/fetch": "^1.1.0", 31 | "@protobufjs/float": "^1.0.2", 32 | "@protobufjs/inquire": "^1.1.0", 33 | "@protobufjs/path": "^1.1.2", 34 | "@protobufjs/pool": "^1.1.0", 35 | "@protobufjs/utf8": "^1.1.0", 36 | "@types/long": "^4.0.0", 37 | "@types/node": "^10.1.0", 38 | "long": "^4.0.0" 39 | } 40 | } 41 | } 42 | }, 43 | "@protobufjs/aspromise": { 44 | "version": "1.1.2", 45 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 46 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 47 | }, 48 | "@protobufjs/base64": { 49 | "version": "1.1.2", 50 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 51 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 52 | }, 53 | "@protobufjs/codegen": { 54 | "version": "2.0.4", 55 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 56 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 57 | }, 58 | "@protobufjs/eventemitter": { 59 | "version": "1.1.0", 60 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 61 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 62 | }, 63 | "@protobufjs/fetch": { 64 | "version": "1.1.0", 65 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 66 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 67 | "requires": { 68 | "@protobufjs/aspromise": "^1.1.1", 69 | "@protobufjs/inquire": "^1.1.0" 70 | } 71 | }, 72 | "@protobufjs/float": { 73 | "version": "1.0.2", 74 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 75 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 76 | }, 77 | "@protobufjs/inquire": { 78 | "version": "1.1.0", 79 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 80 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 81 | }, 82 | "@protobufjs/path": { 83 | "version": "1.1.2", 84 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 85 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 86 | }, 87 | "@protobufjs/pool": { 88 | "version": "1.1.0", 89 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 90 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 91 | }, 92 | "@protobufjs/utf8": { 93 | "version": "1.1.0", 94 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 95 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 96 | }, 97 | "@types/long": { 98 | "version": "4.0.0", 99 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", 100 | "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" 101 | }, 102 | "@types/node": { 103 | "version": "10.14.6", 104 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.6.tgz", 105 | "integrity": "sha512-Fvm24+u85lGmV4hT5G++aht2C5I4Z4dYlWZIh62FAfFO/TfzXtPpoLI6I7AuBWkIFqZCnhFOoTT7RjjaIL5Fjg==" 106 | }, 107 | "ansi-regex": { 108 | "version": "2.1.1", 109 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 110 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 111 | }, 112 | "ascli": { 113 | "version": "1.0.1", 114 | "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", 115 | "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", 116 | "requires": { 117 | "colour": "~0.7.1", 118 | "optjs": "~3.2.2" 119 | } 120 | }, 121 | "balanced-match": { 122 | "version": "1.0.0", 123 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 124 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 125 | }, 126 | "brace-expansion": { 127 | "version": "1.1.11", 128 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 129 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 130 | "requires": { 131 | "balanced-match": "^1.0.0", 132 | "concat-map": "0.0.1" 133 | } 134 | }, 135 | "bytebuffer": { 136 | "version": "5.0.1", 137 | "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", 138 | "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", 139 | "requires": { 140 | "long": "~3" 141 | } 142 | }, 143 | "camelcase": { 144 | "version": "2.1.1", 145 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 146 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 147 | }, 148 | "cliui": { 149 | "version": "3.2.0", 150 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 151 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 152 | "requires": { 153 | "string-width": "^1.0.1", 154 | "strip-ansi": "^3.0.1", 155 | "wrap-ansi": "^2.0.0" 156 | } 157 | }, 158 | "code-point-at": { 159 | "version": "1.1.0", 160 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 161 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 162 | }, 163 | "colour": { 164 | "version": "0.7.1", 165 | "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", 166 | "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" 167 | }, 168 | "concat-map": { 169 | "version": "0.0.1", 170 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 171 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 172 | }, 173 | "decamelize": { 174 | "version": "1.2.0", 175 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 176 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 177 | }, 178 | "fs.realpath": { 179 | "version": "1.0.0", 180 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 181 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 182 | }, 183 | "glob": { 184 | "version": "7.1.4", 185 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 186 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 187 | "requires": { 188 | "fs.realpath": "^1.0.0", 189 | "inflight": "^1.0.4", 190 | "inherits": "2", 191 | "minimatch": "^3.0.4", 192 | "once": "^1.3.0", 193 | "path-is-absolute": "^1.0.0" 194 | } 195 | }, 196 | "grpc": { 197 | "version": "1.20.3", 198 | "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.20.3.tgz", 199 | "integrity": "sha512-GsEsi0NVj6usS/xor8pF/xDbDiwZQR59aZl5NUZ59Sy2bdPQFZ3UePr5wevZjHboirRCIQCKRI1cCgvSWUe2ag==", 200 | "requires": { 201 | "lodash.camelcase": "^4.3.0", 202 | "lodash.clone": "^4.5.0", 203 | "nan": "^2.13.2", 204 | "node-pre-gyp": "^0.13.0", 205 | "protobufjs": "^5.0.3" 206 | }, 207 | "dependencies": { 208 | "abbrev": { 209 | "version": "1.1.1", 210 | "bundled": true 211 | }, 212 | "ansi-regex": { 213 | "version": "2.1.1", 214 | "bundled": true 215 | }, 216 | "aproba": { 217 | "version": "1.2.0", 218 | "bundled": true 219 | }, 220 | "are-we-there-yet": { 221 | "version": "1.1.5", 222 | "bundled": true, 223 | "requires": { 224 | "delegates": "^1.0.0", 225 | "readable-stream": "^2.0.6" 226 | } 227 | }, 228 | "balanced-match": { 229 | "version": "1.0.0", 230 | "bundled": true 231 | }, 232 | "brace-expansion": { 233 | "version": "1.1.11", 234 | "bundled": true, 235 | "requires": { 236 | "balanced-match": "^1.0.0", 237 | "concat-map": "0.0.1" 238 | } 239 | }, 240 | "chownr": { 241 | "version": "1.1.1", 242 | "bundled": true 243 | }, 244 | "code-point-at": { 245 | "version": "1.1.0", 246 | "bundled": true 247 | }, 248 | "concat-map": { 249 | "version": "0.0.1", 250 | "bundled": true 251 | }, 252 | "console-control-strings": { 253 | "version": "1.1.0", 254 | "bundled": true 255 | }, 256 | "core-util-is": { 257 | "version": "1.0.2", 258 | "bundled": true 259 | }, 260 | "deep-extend": { 261 | "version": "0.6.0", 262 | "bundled": true 263 | }, 264 | "delegates": { 265 | "version": "1.0.0", 266 | "bundled": true 267 | }, 268 | "detect-libc": { 269 | "version": "1.0.3", 270 | "bundled": true 271 | }, 272 | "fs-minipass": { 273 | "version": "1.2.5", 274 | "bundled": true, 275 | "requires": { 276 | "minipass": "^2.2.1" 277 | } 278 | }, 279 | "fs.realpath": { 280 | "version": "1.0.0", 281 | "bundled": true 282 | }, 283 | "gauge": { 284 | "version": "2.7.4", 285 | "bundled": true, 286 | "requires": { 287 | "aproba": "^1.0.3", 288 | "console-control-strings": "^1.0.0", 289 | "has-unicode": "^2.0.0", 290 | "object-assign": "^4.1.0", 291 | "signal-exit": "^3.0.0", 292 | "string-width": "^1.0.1", 293 | "strip-ansi": "^3.0.1", 294 | "wide-align": "^1.1.0" 295 | } 296 | }, 297 | "has-unicode": { 298 | "version": "2.0.1", 299 | "bundled": true 300 | }, 301 | "iconv-lite": { 302 | "version": "0.4.23", 303 | "bundled": true, 304 | "requires": { 305 | "safer-buffer": ">= 2.1.2 < 3" 306 | } 307 | }, 308 | "ignore-walk": { 309 | "version": "3.0.1", 310 | "bundled": true, 311 | "requires": { 312 | "minimatch": "^3.0.4" 313 | } 314 | }, 315 | "inflight": { 316 | "version": "1.0.6", 317 | "bundled": true, 318 | "requires": { 319 | "once": "^1.3.0", 320 | "wrappy": "1" 321 | } 322 | }, 323 | "inherits": { 324 | "version": "2.0.3", 325 | "bundled": true 326 | }, 327 | "ini": { 328 | "version": "1.3.5", 329 | "bundled": true 330 | }, 331 | "is-fullwidth-code-point": { 332 | "version": "1.0.0", 333 | "bundled": true, 334 | "requires": { 335 | "number-is-nan": "^1.0.0" 336 | } 337 | }, 338 | "isarray": { 339 | "version": "1.0.0", 340 | "bundled": true 341 | }, 342 | "minimatch": { 343 | "version": "3.0.4", 344 | "bundled": true, 345 | "requires": { 346 | "brace-expansion": "^1.1.7" 347 | } 348 | }, 349 | "minimist": { 350 | "version": "1.2.0", 351 | "bundled": true 352 | }, 353 | "minipass": { 354 | "version": "2.3.5", 355 | "bundled": true, 356 | "requires": { 357 | "safe-buffer": "^5.1.2", 358 | "yallist": "^3.0.0" 359 | } 360 | }, 361 | "minizlib": { 362 | "version": "1.2.1", 363 | "bundled": true, 364 | "requires": { 365 | "minipass": "^2.2.1" 366 | } 367 | }, 368 | "mkdirp": { 369 | "version": "0.5.1", 370 | "bundled": true, 371 | "requires": { 372 | "minimist": "0.0.8" 373 | }, 374 | "dependencies": { 375 | "minimist": { 376 | "version": "0.0.8", 377 | "bundled": true 378 | } 379 | } 380 | }, 381 | "needle": { 382 | "version": "2.3.1", 383 | "bundled": true, 384 | "requires": { 385 | "debug": "^4.1.0", 386 | "iconv-lite": "^0.4.4", 387 | "sax": "^1.2.4" 388 | }, 389 | "dependencies": { 390 | "debug": { 391 | "version": "4.1.1", 392 | "bundled": true, 393 | "requires": { 394 | "ms": "^2.1.1" 395 | } 396 | }, 397 | "ms": { 398 | "version": "2.1.1", 399 | "bundled": true 400 | } 401 | } 402 | }, 403 | "node-pre-gyp": { 404 | "version": "0.13.0", 405 | "bundled": true, 406 | "requires": { 407 | "detect-libc": "^1.0.2", 408 | "mkdirp": "^0.5.1", 409 | "needle": "^2.2.1", 410 | "nopt": "^4.0.1", 411 | "npm-packlist": "^1.1.6", 412 | "npmlog": "^4.0.2", 413 | "rc": "^1.2.7", 414 | "rimraf": "^2.6.1", 415 | "semver": "^5.3.0", 416 | "tar": "^4" 417 | } 418 | }, 419 | "nopt": { 420 | "version": "4.0.1", 421 | "bundled": true, 422 | "requires": { 423 | "abbrev": "1", 424 | "osenv": "^0.1.4" 425 | } 426 | }, 427 | "npm-bundled": { 428 | "version": "1.0.6", 429 | "bundled": true 430 | }, 431 | "npm-packlist": { 432 | "version": "1.4.1", 433 | "bundled": true, 434 | "requires": { 435 | "ignore-walk": "^3.0.1", 436 | "npm-bundled": "^1.0.1" 437 | } 438 | }, 439 | "npmlog": { 440 | "version": "4.1.2", 441 | "bundled": true, 442 | "requires": { 443 | "are-we-there-yet": "~1.1.2", 444 | "console-control-strings": "~1.1.0", 445 | "gauge": "~2.7.3", 446 | "set-blocking": "~2.0.0" 447 | } 448 | }, 449 | "number-is-nan": { 450 | "version": "1.0.1", 451 | "bundled": true 452 | }, 453 | "object-assign": { 454 | "version": "4.1.1", 455 | "bundled": true 456 | }, 457 | "once": { 458 | "version": "1.4.0", 459 | "bundled": true, 460 | "requires": { 461 | "wrappy": "1" 462 | } 463 | }, 464 | "os-homedir": { 465 | "version": "1.0.2", 466 | "bundled": true 467 | }, 468 | "os-tmpdir": { 469 | "version": "1.0.2", 470 | "bundled": true 471 | }, 472 | "osenv": { 473 | "version": "0.1.5", 474 | "bundled": true, 475 | "requires": { 476 | "os-homedir": "^1.0.0", 477 | "os-tmpdir": "^1.0.0" 478 | } 479 | }, 480 | "path-is-absolute": { 481 | "version": "1.0.1", 482 | "bundled": true 483 | }, 484 | "process-nextick-args": { 485 | "version": "2.0.0", 486 | "bundled": true 487 | }, 488 | "rc": { 489 | "version": "1.2.8", 490 | "bundled": true, 491 | "requires": { 492 | "deep-extend": "^0.6.0", 493 | "ini": "~1.3.0", 494 | "minimist": "^1.2.0", 495 | "strip-json-comments": "~2.0.1" 496 | } 497 | }, 498 | "readable-stream": { 499 | "version": "2.3.6", 500 | "bundled": true, 501 | "requires": { 502 | "core-util-is": "~1.0.0", 503 | "inherits": "~2.0.3", 504 | "isarray": "~1.0.0", 505 | "process-nextick-args": "~2.0.0", 506 | "safe-buffer": "~5.1.1", 507 | "string_decoder": "~1.1.1", 508 | "util-deprecate": "~1.0.1" 509 | } 510 | }, 511 | "rimraf": { 512 | "version": "2.6.3", 513 | "bundled": true, 514 | "requires": { 515 | "glob": "^7.1.3" 516 | }, 517 | "dependencies": { 518 | "glob": { 519 | "version": "7.1.3", 520 | "bundled": true, 521 | "requires": { 522 | "fs.realpath": "^1.0.0", 523 | "inflight": "^1.0.4", 524 | "inherits": "2", 525 | "minimatch": "^3.0.4", 526 | "once": "^1.3.0", 527 | "path-is-absolute": "^1.0.0" 528 | } 529 | } 530 | } 531 | }, 532 | "safe-buffer": { 533 | "version": "5.1.2", 534 | "bundled": true 535 | }, 536 | "safer-buffer": { 537 | "version": "2.1.2", 538 | "bundled": true 539 | }, 540 | "sax": { 541 | "version": "1.2.4", 542 | "bundled": true 543 | }, 544 | "semver": { 545 | "version": "5.7.0", 546 | "bundled": true 547 | }, 548 | "set-blocking": { 549 | "version": "2.0.0", 550 | "bundled": true 551 | }, 552 | "signal-exit": { 553 | "version": "3.0.2", 554 | "bundled": true 555 | }, 556 | "string-width": { 557 | "version": "1.0.2", 558 | "bundled": true, 559 | "requires": { 560 | "code-point-at": "^1.0.0", 561 | "is-fullwidth-code-point": "^1.0.0", 562 | "strip-ansi": "^3.0.0" 563 | } 564 | }, 565 | "string_decoder": { 566 | "version": "1.1.1", 567 | "bundled": true, 568 | "requires": { 569 | "safe-buffer": "~5.1.0" 570 | } 571 | }, 572 | "strip-ansi": { 573 | "version": "3.0.1", 574 | "bundled": true, 575 | "requires": { 576 | "ansi-regex": "^2.0.0" 577 | } 578 | }, 579 | "strip-json-comments": { 580 | "version": "2.0.1", 581 | "bundled": true 582 | }, 583 | "tar": { 584 | "version": "4.4.8", 585 | "bundled": true, 586 | "requires": { 587 | "chownr": "^1.1.1", 588 | "fs-minipass": "^1.2.5", 589 | "minipass": "^2.3.4", 590 | "minizlib": "^1.1.1", 591 | "mkdirp": "^0.5.0", 592 | "safe-buffer": "^5.1.2", 593 | "yallist": "^3.0.2" 594 | } 595 | }, 596 | "util-deprecate": { 597 | "version": "1.0.2", 598 | "bundled": true 599 | }, 600 | "wide-align": { 601 | "version": "1.1.3", 602 | "bundled": true, 603 | "requires": { 604 | "string-width": "^1.0.2 || 2" 605 | } 606 | }, 607 | "wrappy": { 608 | "version": "1.0.2", 609 | "bundled": true 610 | }, 611 | "yallist": { 612 | "version": "3.0.3", 613 | "bundled": true 614 | } 615 | } 616 | }, 617 | "inflight": { 618 | "version": "1.0.6", 619 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 620 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 621 | "requires": { 622 | "once": "^1.3.0", 623 | "wrappy": "1" 624 | } 625 | }, 626 | "inherits": { 627 | "version": "2.0.3", 628 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 629 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 630 | }, 631 | "invert-kv": { 632 | "version": "1.0.0", 633 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 634 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 635 | }, 636 | "is-fullwidth-code-point": { 637 | "version": "1.0.0", 638 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 639 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 640 | "requires": { 641 | "number-is-nan": "^1.0.0" 642 | } 643 | }, 644 | "lcid": { 645 | "version": "1.0.0", 646 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 647 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 648 | "requires": { 649 | "invert-kv": "^1.0.0" 650 | } 651 | }, 652 | "lodash.camelcase": { 653 | "version": "4.3.0", 654 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 655 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 656 | }, 657 | "lodash.clone": { 658 | "version": "4.5.0", 659 | "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", 660 | "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" 661 | }, 662 | "long": { 663 | "version": "3.2.0", 664 | "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", 665 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" 666 | }, 667 | "minimatch": { 668 | "version": "3.0.4", 669 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 670 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 671 | "requires": { 672 | "brace-expansion": "^1.1.7" 673 | } 674 | }, 675 | "nan": { 676 | "version": "2.13.2", 677 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", 678 | "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" 679 | }, 680 | "number-is-nan": { 681 | "version": "1.0.1", 682 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 683 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 684 | }, 685 | "once": { 686 | "version": "1.4.0", 687 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 688 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 689 | "requires": { 690 | "wrappy": "1" 691 | } 692 | }, 693 | "optjs": { 694 | "version": "3.2.2", 695 | "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", 696 | "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" 697 | }, 698 | "os-locale": { 699 | "version": "1.4.0", 700 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 701 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 702 | "requires": { 703 | "lcid": "^1.0.0" 704 | } 705 | }, 706 | "path-is-absolute": { 707 | "version": "1.0.1", 708 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 709 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 710 | }, 711 | "protobufjs": { 712 | "version": "5.0.3", 713 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", 714 | "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", 715 | "requires": { 716 | "ascli": "~1", 717 | "bytebuffer": "~5", 718 | "glob": "^7.0.5", 719 | "yargs": "^3.10.0" 720 | } 721 | }, 722 | "string-width": { 723 | "version": "1.0.2", 724 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 725 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 726 | "requires": { 727 | "code-point-at": "^1.0.0", 728 | "is-fullwidth-code-point": "^1.0.0", 729 | "strip-ansi": "^3.0.0" 730 | } 731 | }, 732 | "strip-ansi": { 733 | "version": "3.0.1", 734 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 735 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 736 | "requires": { 737 | "ansi-regex": "^2.0.0" 738 | } 739 | }, 740 | "uuid": { 741 | "version": "3.3.2", 742 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 743 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 744 | }, 745 | "window-size": { 746 | "version": "0.1.4", 747 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 748 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" 749 | }, 750 | "wrap-ansi": { 751 | "version": "2.1.0", 752 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 753 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 754 | "requires": { 755 | "string-width": "^1.0.1", 756 | "strip-ansi": "^3.0.1" 757 | } 758 | }, 759 | "wrappy": { 760 | "version": "1.0.2", 761 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 762 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 763 | }, 764 | "y18n": { 765 | "version": "3.2.1", 766 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 767 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 768 | }, 769 | "yargs": { 770 | "version": "3.32.0", 771 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", 772 | "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 773 | "requires": { 774 | "camelcase": "^2.0.1", 775 | "cliui": "^3.0.3", 776 | "decamelize": "^1.1.1", 777 | "os-locale": "^1.4.0", 778 | "string-width": "^1.0.1", 779 | "window-size": "^0.1.4", 780 | "y18n": "^3.2.0" 781 | } 782 | } 783 | } 784 | } 785 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grpc-node", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@grpc/proto-loader": "^0.5.0", 14 | "grpc": "^1.20.3", 15 | "uuid": "^3.3.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const grpc = require('grpc'); 2 | const uuid = require('uuid/v1'); 3 | const todoproto = grpc.load('todo.proto') 4 | const server = new grpc.Server() 5 | 6 | let todos = [ 7 | { id : '1',title : 'Todo 1',iscompleted : false } 8 | ] 9 | 10 | server.addService(todoproto.TodoService.service,{ 11 | list : (_,callback) =>{ 12 | callback(null,todos) 13 | }, 14 | insert : (call,callback) => { 15 | let todo = call.request; 16 | todo.id = uuid() 17 | todos.push(todo) 18 | 19 | callback(null,todo) 20 | }, 21 | update : (call,callback) => { 22 | let todo = todos.find((t) => t.id === call.request.id); 23 | if(todo){ 24 | 25 | todo.title = call.request.title 26 | todo.iscompleted = call.request.iscompleted 27 | 28 | callback(null,todo) 29 | } 30 | else{ 31 | 32 | callback({ 33 | code : grpc.status.NOT_FOUND, 34 | details : "Not Found" 35 | }) 36 | 37 | } 38 | }, 39 | delete : (call,callback) => { 40 | let todoDelete = todos.find((n) => n.id === call.request.id); 41 | if(todoDelete != -1){ 42 | 43 | todos.splice(todoDelete,1) 44 | callback(null,{}) 45 | 46 | } 47 | else{ 48 | 49 | callback({ 50 | code : grpc.status.NOT_FOUND, 51 | details : "Not Found" 52 | }) 53 | 54 | } 55 | } 56 | 57 | }) 58 | 59 | server.bind('127.0.0.1:50051', 60 | grpc.ServerCredentials.createInsecure()) 61 | console.log('server is running at http://127.0.0.1:50051') 62 | server.start() 63 | 64 | -------------------------------------------------------------------------------- /todo.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | 4 | service TodoService { 5 | 6 | rpc List(Empty) returns (TodoList) {} 7 | rpc Insert(Todo) returns (Todo) {} 8 | rpc get(TodoRequestId) returns (Todo) {} 9 | rpc update(Todo) returns (Todo) {} 10 | rpc delete(TodoRequestId) returns (Empty) {} 11 | } 12 | 13 | message Empty {} 14 | 15 | message Todo { 16 | string id=1; 17 | string title = 2; 18 | bool iscompleted = 3; 19 | } 20 | 21 | message TodoList { 22 | repeated Todo todo = 1; 23 | } 24 | 25 | message TodoRequestId { 26 | string id = 1; 27 | } 28 | -------------------------------------------------------------------------------- /update_todo.js: -------------------------------------------------------------------------------- 1 | const client = require('./client'); 2 | 3 | let todo = { 4 | id : '1', 5 | title : 'Hello gRPC', 6 | iscompleted : true 7 | } 8 | 9 | client.update(todo,(error,todo) => { 10 | if(!error){ 11 | console.log('Note is updated successfully',todo) 12 | } 13 | else{ 14 | 15 | console.error(error) 16 | } 17 | }) --------------------------------------------------------------------------------