| /* |
| * |
| * Copyright 2015 gRPC authors. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| */ |
| |
| var PROTO_PATH = __dirname + '/../../../proto/math/math.proto'; |
| |
| var grpc = require('grpc'); |
| var protoLoader = require('@grpc/proto-loader'); |
| var packageDefinition = protoLoader.loadSync( |
| PROTO_PATH, |
| {keepCase: true, |
| longs: String, |
| enums: String, |
| defaults: true, |
| oneofs: true |
| }); |
| var math_proto = grpc.loadPackageDefinition(packageDefinition).math; |
| |
| /** |
| * Implements the Div RPC method. |
| */ |
| function Div(call, callback) { |
| var divisor = call.request.divisor; |
| var dividend = call.request.dividend; |
| if (divisor == 0) { |
| callback({ |
| code: grpc.status.INVALID_ARGUMENT, |
| details: 'Cannot divide by zero' |
| }); |
| } else { |
| setTimeout(function () { |
| callback(null, { |
| quotient: Math.floor(dividend / divisor), |
| remainder: dividend % divisor |
| }); |
| }, 1); // 1 millisecond, to make sure 1 microsecond timeout from test |
| // will hit. TODO: Consider fixing this. |
| } |
| } |
| |
| /** |
| * Implements the Fib RPC method. |
| */ |
| function Fib(stream) { |
| var previous = 0, current = 1; |
| for (var i = 0; i < stream.request.limit; i++) { |
| stream.write({ |
| num: current |
| }); |
| var temp = current; |
| current += previous; |
| previous = temp; |
| } |
| stream.end(); |
| } |
| |
| /** |
| * Implements the Sum RPC method. |
| */ |
| function Sum(call, callback) { |
| var sum = 0; |
| call.on('data', function(data) { |
| sum += parseInt(data.num); |
| }); |
| call.on('end', function() { |
| callback(null, { |
| num: sum |
| }); |
| }); |
| } |
| |
| /** |
| * Implements the DivMany RPC method. |
| */ |
| function DivMany(stream) { |
| stream.on('data', function(div_args) { |
| var divisor = div_args.divisor; |
| var dividend = div_args.dividend; |
| if (divisor == 0) { |
| stream.emit('error', { |
| code: grpc.status.INVALID_ARGUMENT, |
| details: 'Cannot divide by zero' |
| }); |
| } else { |
| stream.write({ |
| quotient: Math.floor(dividend / divisor), |
| remainder: dividend % divisor |
| }); |
| } |
| }); |
| stream.on('end', function() { |
| stream.end(); |
| }); |
| } |
| |
| |
| /** |
| * Starts an RPC server that receives requests for the Math service at the |
| * sample server port |
| */ |
| function main() { |
| var server = new grpc.Server(); |
| server.addService(math_proto.Math.service, { |
| Div: Div, |
| Fib: Fib, |
| Sum: Sum, |
| DivMany: DivMany, |
| }); |
| server.bind('0.0.0.0:50052', grpc.ServerCredentials.createInsecure()); |
| var fs = require('fs'); |
| var key_data = fs.readFileSync(__dirname + '/../data/server1.key'); |
| var pem_data = fs.readFileSync(__dirname + '/../data/server1.pem'); |
| server.bind('0.0.0.0:50051', grpc.ServerCredentials.createSsl(null, [{private_key: key_data, |
| cert_chain: pem_data}])); |
| server.start(); |
| } |
| |
| main(); |