@incdevco/framework
Version:
node.js lambda framework
168 lines (97 loc) • 3.67 kB
JavaScript
var AWS = require('aws-sdk');
var Consumer = require('../consumer');
function Director(config) {
config = config || {};
this.consumer = config.consumer || new Consumer();
this.maxNumberOfMessages = config.maxNumberOfMessages || 1;
this.queueUrl = config.queueUrl;
this.useSns = (config.useSns) ? true : false;
this.sqs = config.sqs || new AWS.SQS();
this.topicArn = config.topicArn;
this.visibilityTimeout = config.visibilityTimeout || 30;
this.waitTimeSeconds = config.waitSeconds || 0;
}
Director.prototype.consume = function (action, index, deleteMessageFn) {
console.log('action', index, JSON.stringify(action, null, 2));
return this.consumer.consume(action, index, deleteMessageFn)
.then(function (result) {
console.log('result', index, JSON.stringify(result, null, 2));
return result;
})
.catch(function (exception) {
console.log('exception', index, JSON.stringify(exception, null, 2));
throw exception;
});
};
Director.prototype.deleteMessage = function (message) {
return this.sqs.deleteMessage({
ReceiptHandle: message.ReceiptHandle,
QueueUrl: this.queueUrl
}).promise()
.then(function (result) {
console.log('result', JSON.stringify(result, null, 2));
return result;
})
.catch(function (exception) {
console.log('exception', JSON.stringify(exception, null, 2));
throw exception;
});
};
// will poll sqs to receive messages
Director.prototype.poll = function (params) {
var self = this;
params = params || {};
params.QueueUrl = params.QueueUrl || this.queueUrl;
params.MaxNumberOfMessages = params.MaxNumberOfMessages
|| this.maxNumberOfMessages;
params.VisibilityTimeout = params.VisibilityTimeout
|| this.visibilityTimeout;
params.WaitTimeSeconds = params.WaitTimeSeconds
|| this.waitTimeSeconds;
console.log('sqs.receiveMessages', JSON.stringify(params, null, 2));
return this.sqs.receiveMessage(params).promise()
.then(function (result) {
var promise = Promise.resolve(true);
console.log('result', JSON.stringify(result, null, 2));
if (result.Messages) {
result.Messages.forEach(function (message, index) {
var action = JSON.parse(message.Body);
promise = promise.then(function () {
return self.consume(action, function () {
return self.deleteMessage(message);
}, index);
});
});
}
return promise;
})
.then(function (result) {
console.log('result', JSON.stringify(result, null, 2));
return result;
})
.catch(function (exception) {
console.log('exception', JSON.stringify(exception, null, 2));
throw exception;
});
};
// will receive events with delivered with SNS
Director.prototype.receive = function (event) {
var promise = Promise.resolve(true), self = this;
console.log('event', JSON.stringify(event, null, 2));
event.Records.forEach(function (record, index) {
var action = JSON.parse(record.Sns.Message);
promise = promise.then(function () {
return self.consume(action, index);
});
});
return promise
.then(function (result) {
console.log('result', JSON.stringify(result, null, 2));
return result;
})
.catch(function (exception) {
console.log('exception', JSON.stringify(exception, null, 2));
throw exception;
});
};
module.exports = Director;