An example of an AWS Lambda function that you can invoke with a Ably Reactor Function rule, showing how to process that event and publish a message back to Ably from the same function.
To work, this has to be packaged up with the Ably client library, and uploaded to AWS lambda as a zip file. For an example of such a package that you can close and use yourself, see https://github.com/ably/example-lambda-function
'use strict';
const Ably = require('ably');
const inspect = require('util').inspect;
exports.handler = (event, context, callback) => {
console.log("Received the following event from Ably: ", inspect(event));
// If the message rule uses enveloping, 'event' is an object containing the
// following keys; 'source', 'appId', 'channel', 'site', 'ruleId', and either 'messages'
// or 'presence' single-element arrays.
// If enveloping is off, 'event' is just the data member of the message or presence
// message, and the next line would just be 'JSON.parse(event)'
const details = JSON.parse(event.messages[0].data);
// Note that this uses Ably.Rest, not Realtime. This is because we don't want
// to start a websocket connection to Ably just to make one publish, that
// would be inefficient. Ably.Rest makes the publish as a REST request.
const ably = new Ably.Rest({ key: <...> });
// Now get an Ably channel and publish something on it. Make sure you don't
// publish to a channel that has this reactor rule on it, or you'll get an infinite loop!
const channel = ably.channels.get(<...>);
channel.publish('lambdaresponse', 'success', (err) => {
if(err) {
console.log("Error publishing back to ably:", inspect(err));
callback(err);
} else {
// Make sure to only call the callback (ending execution) in the callback of
// the publish(), or the function will stop executing before it has a chance to
// make the http request
callback(null, 'success');
}
});
};
Further reading: