|
2 | 2 |
|
3 | 3 | const amqp = require('amqplib/callback_api'); |
4 | 4 | const Ably = require('ably'); |
| 5 | +const request = require('request'); |
| 6 | +const querystring = require("querystring"); |
| 7 | +const WolframEndpoint = 'http://api.wolframalpha.com/v1/result'; |
| 8 | + |
| 9 | +/* Send question over HTTP to Wolfram to find the answer */ |
| 10 | +function getAnswerAndPublish(ablyChannel, wolframUrl, question) { |
| 11 | + console.log('worker:', 'Received question', question, ' - about to ask Wolfram'); |
| 12 | + var timeNow = Date.now(); |
| 13 | + request(wolframUrl, function (error, response, body) { |
| 14 | + var timePassed = Date.now() - timeNow; |
| 15 | + if (!error && response.statusCode == 200) { |
| 16 | + publishAnswer(ablyChannel, question, body, timePassed) |
| 17 | + } else { |
| 18 | + if (body) { |
| 19 | + publishAnswer(ablyChannel, question, "Wolfram couldn't compute: " + body, timePassed); |
| 20 | + } else { |
| 21 | + publishAnswer(ablyChannel, question, "Wolfram error: " + JSON.stringify(error), timePassed); |
| 22 | + } |
| 23 | + } |
| 24 | + }); |
| 25 | +} |
| 26 | + |
| 27 | +function publishAnswer(ablyChannel, question, answer, wolframTime) { |
| 28 | + ablyChannel.publish('answer', { question: question, answer: answer, wolframTime: wolframTime }, function(err) { |
| 29 | + if (err) { |
| 30 | + console.error('worker:', 'Failed to publish question', question, ' - err:', JSON.stringify(err)); |
| 31 | + } |
| 32 | + }) |
| 33 | +} |
5 | 34 |
|
6 | 35 | /* Start the worker that consumes from the AMQP QUEUE */ |
7 | | -exports.start = function(apiKey, answersChannelName, queueName, queueEndpoint) { |
| 36 | +exports.start = function(apiKey, wolframApiKey, answersChannelName, queueName, queueEndpoint) { |
8 | 37 | const appId = apiKey.split('.')[0]; |
9 | 38 | const queue = appId + ":" + queueName; |
10 | 39 | const endpoint = queueEndpoint; |
@@ -34,12 +63,9 @@ exports.start = function(apiKey, answersChannelName, queueName, queueEndpoint) { |
34 | 63 |
|
35 | 64 | const messages = Ably.Realtime.Message.fromEncodedArray(decodedEnvelope.messages); |
36 | 65 | messages.forEach(function(message) { |
37 | | - console.log('worker:', 'Received question', message.data, ' - about to ask Wolfram'); |
38 | | - answersChannel.publish('answer', 'Placeholder until Wolfram connected', function(err) { |
39 | | - if (err) { |
40 | | - console.error('worker:', 'Failed to publish question', message.data, ' - err:', JSON.stringify(err)); |
41 | | - } |
42 | | - }) |
| 66 | + var question = message.data; |
| 67 | + var url = WolframEndpoint + '?' + querystring.stringify({ appid: wolframApiKey, i: question}); |
| 68 | + getAnswerAndPublish(answersChannel, url, question); |
43 | 69 | }); |
44 | 70 |
|
45 | 71 | /* Remove message from queue */ |
|
0 commit comments