diff options
author | murgatroid99 <mlumish@google.com> | 2015-02-19 18:19:10 -0800 |
---|---|---|
committer | murgatroid99 <mlumish@google.com> | 2015-02-19 18:19:10 -0800 |
commit | d7e8765aaa1cd0aaacff401e5003ed91a1f5b9ee (patch) | |
tree | 2cf25e410f44fc8cc6aad53674aec3fdc84dbed1 /src/node | |
parent | a6793f2dd6e3f14e95392ba3c03faaead3077ebf (diff) |
Added client and fixed some server bugs
Diffstat (limited to 'src/node')
-rw-r--r-- | src/node/examples/route_guide_client.js | 190 | ||||
-rw-r--r-- | src/node/examples/route_guide_server.js | 27 | ||||
-rw-r--r-- | src/node/package.json | 5 |
3 files changed, 208 insertions, 14 deletions
diff --git a/src/node/examples/route_guide_client.js b/src/node/examples/route_guide_client.js new file mode 100644 index 0000000000..549c9b7806 --- /dev/null +++ b/src/node/examples/route_guide_client.js @@ -0,0 +1,190 @@ +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +var async = require('async'); +var fs = require('fs'); +var _ = require('underscore'); +var grpc = require('..'); +var examples = grpc.load(__dirname + '/route_guide.proto').examples; +var client = new examples.RouteGuide('localhost:50051'); + +var COORD_FACTOR = 1e7; + +function runGetFeature(callback) { + var next = _.after(2, callback); + function featureCallback(error, feature) { + if (error) { + callback(error); + } + if (feature.name === '') { + console.log('Found no feature at ' + + feature.location.latitude/COORD_FACTOR + ', ' + + feature.location.longitude/COORD_FACTOR); + } else { + console.log('Found feature called "' + feature.name + '" at ' + + feature.location.latitude/COORD_FACTOR + ', ' + + feature.location.longitude/COORD_FACTOR); + } + next(); + } + var point1 = { + latitude: 409146138, + longitude: -746188906 + }; + var point2 = { + latitude: 0, + longitude: 0 + }; + client.getFeature(point1, featureCallback); + client.getFeature(point2, featureCallback); +} + +function runListFeatures(callback) { + var rectangle = { + lo: { + latitude: 400000000, + longitude: -750000000 + }, + hi: { + latitude: 420000000, + longitude: -730000000 + } + }; + console.log('Looking for features between 40, -75 and 42, -73'); + var call = client.listFeatures(rectangle); + call.on('data', function(feature) { + console.log('Found feature called "' + feature.name + '" at ' + + feature.location.latitude/COORD_FACTOR + ', ' + + feature.location.longitude/COORD_FACTOR); + }); + call.on('end', callback); +} + +function runRecordRoute(callback) { + fs.readFile(__dirname + '/route_guide_db.json', function(err, data) { + if (err) callback(err); + var feature_list = JSON.parse(data); + + var num_points = 10; + var call = client.recordRoute(function(error, stats) { + if (error) { + callback(error); + } + console.log('Finished trip with', stats.point_count, 'points'); + console.log('Passed', stats.feature_count, 'features'); + console.log('Travelled', stats.distance, 'meters'); + console.log('It took', stats.elapsed_time, 'seconds'); + callback(); + }); + function pointSender(lat, lng) { + return function(callback) { + console.log('Visiting point ' + lat/COORD_FACTOR + ', ' + + lng/COORD_FACTOR); + call.write({ + latitude: lat, + longitude: lng + }); + _.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.location.latitude, + rand_point.location.longitude); + } + async.series(point_senders, function() { + call.end(); + }); + }); +} + +function runRouteChat(callback) { + var call = client.routeChat(); + call.on('data', function(note) { + console.log('Got message "' + note.message + '" at ' + + note.location.latitude + ', ' + note.location.longitude); + }); + + 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); + call.write(note); + } + call.end(); +} + +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; diff --git a/src/node/examples/route_guide_server.js b/src/node/examples/route_guide_server.js index 5b7eda7c06..89d8d27cfb 100644 --- a/src/node/examples/route_guide_server.js +++ b/src/node/examples/route_guide_server.js @@ -59,8 +59,8 @@ function checkFeature(point) { // Check if there is already a feature object for the given point for (var i = 0; i < feature_list.length; i++) { feature = feature_list[i]; - if (feature.point.latitude === point.latitude && - feature.point.longitude === point.longitude) { + if (feature.location.latitude === point.latitude && + feature.location.longitude === point.longitude) { return feature; } } @@ -91,10 +91,10 @@ function getFeature(call, callback) { function listFeatures(call) { var lo = call.request.lo; var hi = call.request.hi; - var left = _.min(lo.longitude, hi.longitude); - var right = _.max(lo.longitude, hi.longitude); - var top = _.max(lo.latitude, hi.latitude); - var bottom = _.max(lo.latitude, hi.latitude); + var left = _.min([lo.longitude, hi.longitude]); + var right = _.max([lo.longitude, hi.longitude]); + var top = _.max([lo.latitude, hi.latitude]); + var bottom = _.min([lo.latitude, hi.latitude]); // For each feature, check if it is in the given bounding box _.each(feature_list, function(feature) { if (feature.name === '') { @@ -118,15 +118,18 @@ function listFeatures(call) { * @return The distance between the points in meters */ function getDistance(start, end) { + function toRadians(num) { + return num * Math.PI / 180; + } var lat1 = start.latitude / COORD_FACTOR; var lat2 = end.latitude / COORD_FACTOR; var lon1 = start.longitude / COORD_FACTOR; var lon2 = end.longitude / COORD_FACTOR; var R = 6371000; // metres - var φ1 = lat1.toRadians(); - var φ2 = lat2.toRadians(); - var Δφ = (lat2-lat1).toRadians(); - var Δλ = (lon2-lon1).toRadians(); + var φ1 = toRadians(lat1); + var φ2 = toRadians(lat2); + var Δφ = toRadians(lat2-lat1); + var Δλ = toRadians(lon2-lon1); var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) + Math.cos(φ1) * Math.cos(φ2) * @@ -204,7 +207,7 @@ function routeChat(call) { route_notes[key] = []; } // Then add the new note to the list - route_notes[key].push(note); + route_notes[key].push(JSON.parse(JSON.stringify(note))); }); call.on('end', function() { call.end(); @@ -230,7 +233,7 @@ function getServer() { if (require.main === module) { // If this is run as a script, start a server on an unused port var routeServer = getServer(); - routeServer.bind('0.0.0.0:0'); + routeServer.bind('0.0.0.0:50051'); fs.readFile(__dirname + '/route_guide_db.json', function(err, data) { if (err) throw err; feature_list = JSON.parse(data); diff --git a/src/node/package.json b/src/node/package.json index bbd89be77d..898281a915 100644 --- a/src/node/package.json +++ b/src/node/package.json @@ -15,9 +15,10 @@ "underscore.string": "^3.0.0" }, "devDependencies": { - "mocha": "~1.21.0", + "async": "^0.9.0", + "googleauth": "google/google-auth-library-nodejs", "minimist": "^1.1.0", - "googleauth": "google/google-auth-library-nodejs" + "mocha": "~1.21.0" }, "files": [ "README.md", |