| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 | /* * * 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 messages = require('./route_guide_pb');var services = require('./route_guide_grpc_pb');var async = require('async');var fs = require('fs');var parseArgs = require('minimist');var path = require('path');var _ = require('lodash');var grpc = require('grpc');var client = new services.RouteGuideClient('localhost:50051',                                           grpc.credentials.createInsecure());var COORD_FACTOR = 1e7;/** * Run the getFeature demo. Calls getFeature with a point known to have a * feature and a point known not to have a feature. * @param {function} callback Called when this demo is complete */function runGetFeature(callback) {  var next = _.after(2, callback);  function featureCallback(error, feature) {    if (error) {      callback(error);      return;    }    var latitude = feature.getLocation().getLatitude();    var longitude = feature.getLocation().getLongitude();    if (feature.getName() === '') {      console.log('Found no feature at ' +          latitude/COORD_FACTOR + ', ' + longitude/COORD_FACTOR);    } else {      console.log('Found feature called "' + feature.getName() + '" at ' +          latitude/COORD_FACTOR + ', ' + longitude/COORD_FACTOR);    }    next();  }  var point1 = new messages.Point();  point1.setLatitude(409146138);  point1.setLongitude(-746188906);  var point2 = new messages.Point();  point2.setLatitude(0);  point2.setLongitude(0);  client.getFeature(point1, featureCallback);  client.getFeature(point2, featureCallback);}/** * Run the listFeatures demo. Calls listFeatures with a rectangle containing all * of the features in the pre-generated database. Prints each response as it * comes in. * @param {function} callback Called when this demo is complete */function runListFeatures(callback) {  var rect = new messages.Rectangle();  var lo = new messages.Point();  lo.setLatitude(400000000);  lo.setLongitude(-750000000);  rect.setLo(lo);  var hi = new messages.Point();  hi.setLatitude(420000000);  hi.setLongitude(-730000000);  rect.setHi(hi);  console.log('Looking for features between 40, -75 and 42, -73');  var call = client.listFeatures(rect);  call.on('data', function(feature) {      console.log('Found feature called "' + feature.getName() + '" at ' +          feature.getLocation().getLatitude()/COORD_FACTOR + ', ' +          feature.getLocation().getLongitude()/COORD_FACTOR);  });  call.on('end', callback);}/** * Run the recordRoute demo. Sends several randomly chosen points from the * pre-generated feature database with a variable delay in between. Prints the * statistics when they are sent from the server. * @param {function} callback Called when this demo is complete */function runRecordRoute(callback) {  var argv = parseArgs(process.argv, {    string: 'db_path'  });  fs.readFile(path.resolve(argv.db_path), function(err, data) {    if (err) {      callback(err);      return;    }    // Transform the loaded features to Feature objects    var feature_list = _.map(JSON.parse(data), function(value) {      var feature = new messages.Feature();      feature.setName(value.name);      var location = new messages.Point();      location.setLatitude(value.location.latitude);      location.setLongitude(value.location.longitude);      feature.setLocation(location);      return feature;    });    var num_points = 10;    var call = client.recordRoute(function(error, stats) {      if (error) {        callback(error);        return;      }      console.log('Finished trip with', stats.getPointCount(), 'points');      console.log('Passed', stats.getFeatureCount(), 'features');      console.log('Travelled', stats.getDistance(), 'meters');      console.log('It took', stats.getElapsedTime(), 'seconds');      callback();    });    /**     * Constructs a function that asynchronously sends the given point and then     * delays sending its callback     * @param {messages.Point} location The point to send     * @return {function(function)} The function that sends the point     */    function pointSender(location) {      /**       * Sends the point, then calls the callback after a delay       * @param {function} callback Called when complete       */      return function(callback) {        console.log('Visiting point ' + location.getLatitude()/COORD_FACTOR +            ', ' + location.getLongitude()/COORD_FACTOR);        call.write(location);        _.delay(callback, _.random(500, 1500));      };    }    var point_senders = [];    for (var i = 0; i < num_points; i++) {      var rand_point = feature_list[_.random(0, feature_list.length - 1)];      point_senders[i] = pointSender(rand_point.getLocation());    }    async.series(point_senders, function() {      call.end();    });  });}/** * Run the routeChat demo. Send some chat messages, and print any chat messages * that are sent from the server. * @param {function} callback Called when the demo is complete */function runRouteChat(callback) {  var call = client.routeChat();  call.on('data', function(note) {    console.log('Got message "' + note.getMessage() + '" at ' +        note.getLocation().getLatitude() + ', ' +        note.getLocation().getLongitude());  });  call.on('end', callback);  var notes = [{    location: {      latitude: 0,      longitude: 0    },    message: 'First message'  }, {    location: {      latitude: 0,      longitude: 1    },    message: 'Second message'  }, {    location: {      latitude: 1,      longitude: 0    },    message: 'Third message'  }, {    location: {      latitude: 0,      longitude: 0    },    message: 'Fourth message'  }];  for (var i = 0; i < notes.length; i++) {    var note = notes[i];    console.log('Sending message "' + note.message + '" at ' +        note.location.latitude + ', ' + note.location.longitude);    var noteMsg = new messages.RouteNote();    noteMsg.setMessage(note.message);    var location = new messages.Point();    location.setLatitude(note.location.latitude);    location.setLongitude(note.location.longitude);    noteMsg.setLocation(location);    call.write(noteMsg);  }  call.end();}/** * Run all of the demos in order */function main() {  async.series([    runGetFeature,    runListFeatures,    runRecordRoute,    runRouteChat  ]);}if (require.main === module) {  main();}exports.runGetFeature = runGetFeature;exports.runListFeatures = runListFeatures;exports.runRecordRoute = runRecordRoute;exports.runRouteChat = runRouteChat;
 |