├── .gitignore ├── README.md ├── client └── client.js ├── package.json ├── protos └── greet.proto └── server └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # grpc-node-course-dynamic-codegen 2 | Dynamic Codegen with gRPC Nodejs - 3 | 4 | Install the following modules: 5 | 6 | `npm install grpc` 7 | 8 | `npm install @grpc/proto-loader` 9 | 10 | 11 | -------------------------------------------------------------------------------- /client/client.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const protoLoader = require('@grpc/proto-loader') //require('@grpc/proto-loader') 3 | const grpc = require('grpc') 4 | 5 | 6 | //grpc service definition for greet 7 | 8 | const greetProtoPath = path.join(__dirname, "..", "protos", "greet.proto") 9 | const greetProtoDefinition = protoLoader.loadSync(greetProtoPath, { 10 | keepCase: true, 11 | longs: String, 12 | enums: String, 13 | defaults: true, 14 | oneofs: true 15 | }); 16 | 17 | const greetPackageDefinition = grpc.loadPackageDefinition(greetProtoDefinition).greet 18 | 19 | const client = new greetPackageDefinition.GreetService("localhost:50051", 20 | grpc.credentials.createInsecure() 21 | ) 22 | 23 | function callGreetings() { 24 | var request = { 25 | greeting: { 26 | first_name: "Jerry", 27 | last_name: "Tom" 28 | } 29 | } 30 | 31 | 32 | client.greet(request, (error, response) => { 33 | if(!error) { 34 | console.log("Greeting Response: ", response.result); 35 | 36 | 37 | }else { 38 | console.error(error) 39 | 40 | 41 | } 42 | }) 43 | } 44 | 45 | 46 | function main() { 47 | callGreetings() 48 | 49 | } 50 | main() -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grpc-dynamic", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "pdichone", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@grpc/proto-loader": "^0.5.3", 13 | "grpc": "^1.24.2", 14 | "proto-loader": "^0.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /protos/greet.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package greet; 4 | 5 | service GreetService { 6 | 7 | //Unary API 8 | rpc Greet (GreetRequest) returns (GreetResponse) {}; 9 | } 10 | 11 | message Greeting { 12 | string first_name = 1; 13 | string last_name = 2; 14 | } 15 | 16 | message GreetRequest { 17 | Greeting greeting = 1; 18 | } 19 | 20 | message GreetResponse { 21 | string result = 1; 22 | } 23 | 24 | 25 | -------------------------------------------------------------------------------- /server/index.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const protoLoader = require('@grpc/proto-loader') //require('@grpc/proto-loader') 3 | const grpc = require('grpc') 4 | 5 | 6 | //grpc service definition for greet 7 | 8 | const greetProtoPath = path.join(__dirname, "..", "protos", "greet.proto") 9 | const greetProtoDefinition = protoLoader.loadSync(greetProtoPath, { 10 | keepCase: true, 11 | longs: String, 12 | enums: String, 13 | defaults: true, 14 | oneofs: true 15 | }); 16 | 17 | const greetPackageDefinition = grpc.loadPackageDefinition(greetProtoDefinition).greet 18 | 19 | function greet(call, callback) { 20 | var firstName = call.request.greeting.first_name; 21 | var lastName = call.request.greeting.last_name; 22 | 23 | callback(null, {result: "Hello " + firstName + " " + lastName}) 24 | 25 | } 26 | 27 | function main() { 28 | const server = new grpc.Server() 29 | 30 | server.addService(greetPackageDefinition.GreetService.service, { 31 | greet: greet 32 | }) 33 | 34 | server.bind("127.0.0.1:50051", grpc.ServerCredentials.createInsecure()) 35 | server.start() 36 | console.log("Server Runnig at http://127.0.0.1:50051") 37 | 38 | 39 | 40 | } 41 | main() --------------------------------------------------------------------------------