1/* 2 * 3 * Copyright 2015 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19var PROTO_PATH = __dirname + '/../../../proto/math/math.proto'; 20 21var grpc = require('grpc'); 22var protoLoader = require('@grpc/proto-loader'); 23var packageDefinition = protoLoader.loadSync( 24 PROTO_PATH, 25 {keepCase: true, 26 longs: String, 27 enums: String, 28 defaults: true, 29 oneofs: true 30 }); 31var math_proto = grpc.loadPackageDefinition(packageDefinition).math; 32 33/** 34 * Implements the Div RPC method. 35 */ 36function Div(call, callback) { 37 var divisor = call.request.divisor; 38 var dividend = call.request.dividend; 39 if (divisor == 0) { 40 callback({ 41 code: grpc.status.INVALID_ARGUMENT, 42 details: 'Cannot divide by zero' 43 }); 44 } else { 45 setTimeout(function () { 46 callback(null, { 47 quotient: Math.floor(dividend / divisor), 48 remainder: dividend % divisor 49 }); 50 }, 1); // 1 millisecond, to make sure 1 microsecond timeout from test 51 // will hit. TODO: Consider fixing this. 52 } 53} 54 55/** 56 * Implements the Fib RPC method. 57 */ 58function Fib(stream) { 59 var previous = 0, current = 1; 60 for (var i = 0; i < stream.request.limit; i++) { 61 stream.write({ 62 num: current 63 }); 64 var temp = current; 65 current += previous; 66 previous = temp; 67 } 68 stream.end(); 69} 70 71/** 72 * Implements the Sum RPC method. 73 */ 74function Sum(call, callback) { 75 var sum = 0; 76 call.on('data', function(data) { 77 sum += parseInt(data.num); 78 }); 79 call.on('end', function() { 80 callback(null, { 81 num: sum 82 }); 83 }); 84} 85 86/** 87 * Implements the DivMany RPC method. 88 */ 89function DivMany(stream) { 90 stream.on('data', function(div_args) { 91 var divisor = div_args.divisor; 92 var dividend = div_args.dividend; 93 if (divisor == 0) { 94 stream.emit('error', { 95 code: grpc.status.INVALID_ARGUMENT, 96 details: 'Cannot divide by zero' 97 }); 98 } else { 99 stream.write({ 100 quotient: Math.floor(dividend / divisor), 101 remainder: dividend % divisor 102 }); 103 } 104 }); 105 stream.on('end', function() { 106 stream.end(); 107 }); 108} 109 110 111/** 112 * Starts an RPC server that receives requests for the Math service at the 113 * sample server port 114 */ 115function main() { 116 var server = new grpc.Server(); 117 server.addService(math_proto.Math.service, { 118 Div: Div, 119 Fib: Fib, 120 Sum: Sum, 121 DivMany: DivMany, 122 }); 123 server.bind('0.0.0.0:50052', grpc.ServerCredentials.createInsecure()); 124 var fs = require('fs'); 125 var key_data = fs.readFileSync(__dirname + '/../data/server1.key'); 126 var pem_data = fs.readFileSync(__dirname + '/../data/server1.pem'); 127 server.bind('0.0.0.0:50051', grpc.ServerCredentials.createSsl(null, [{private_key: key_data, 128 cert_chain: pem_data}])); 129 server.start(); 130} 131 132main(); 133