aws-sqs-promises
Version:
simple pomise based interface to deal with aws-sqs
201 lines (168 loc) • 5.8 kB
JavaScript
;
var AWS = require('aws-sdk'),
Q = require('q'),
assert = require('assert');
var scriptName = process.pid + ' - [aws-sqs-promises] ';
var logger = {
log: function (msg) {
console.log(scriptName, msg);
},
error: function (msg, err) {
console.error(scriptName, 'Error', msg, err || '');
}
};
/***
* AWS Simple Queue
* @param options : {
* name: <require>,
* useIAMRole: <optional>
* accessKeyId: "<required if useIAMRole = false>",
* secretAccessKey: "<required if useIAMRole = false>",
* region: "<default: us-east-1>",
* apiVersion: <default: '2012-11-05',
* maxMessages: <default: 10>>}
* @constructor
*/
function SimpleQueue(options) {
options = options || {};
assert(options.name, '[aws-sqs-promises] option "name" is not assigned');
if (!options.useIAMRole) {
assert(options.accessKeyId, '[aws-sqs-promises] option "accessKeyId" is not assigned');
assert(options.secretAccessKey, '[aws-sqs-promises] option "secretAccessKey" is not assigned');
}
options.maxMessages = options.maxMessages || 10;
if (options.maxMessages < 0 || options.maxMessages > 10) {
logger.log('Queue options.maxMessages is out of range, setting default value 10');
options.maxMessages = 10;
}
this.name = options.name;
this.maxMessages = options.maxMessages;
this.queueUrl = "";
this.waitTimeSeconds = 10;
this.requestTimeOut = 13;
if (options.useIAMRole) {
logger.log(this.name + ' use IAMRole');
this.client = new AWS.SQS({
region: options.region || "us-east-1",
apiVersion: options.apiVersion || '2012-11-05'
});
} else {
this.client = new AWS.SQS({
accessKeyId: options.accessKeyId,
secretAccessKey: options.secretAccessKey,
region: options.region || "us-east-1",
apiVersion: options.apiVersion || '2012-11-05'
});
}
this.getQueueUrl();
}
module.exports = SimpleQueue;
SimpleQueue.prototype.getQueueUrl = function () {
var self = this;
return Q.Promise(function (resolve, reject) {
if (self.queueUrl) {
return resolve(self.queueUrl);
}
self.client.getQueueUrl({QueueName: self.name}, function (err, data) {
if (err) {
var errMsg = 'Code: ' + (err.code || 'N/A' ) + '. Message: ' + (err.message || err);
logger.error(errMsg);
return reject(errMsg);
}
self.queueUrl = data.QueueUrl;
resolve(self.queueUrl);
});
});
};
SimpleQueue.prototype.getQueueAttributes = function () {
var self = this,
sqs = self.client;
return Q.Promise(function (resolve, reject) {
self.getQueueUrl()
.then(function (queueUrl) {
var params = {
QueueUrl: queueUrl,
AttributeNames: [
'MessageRetentionPeriod | ApproximateNumberOfMessages | ApproximateNumberOfMessagesNotVisible | QueueArn | ApproximateNumberOfMessagesDelayed | DelaySeconds | ReceiveMessageWaitTimeSeconds'
]
};
sqs.getQueueAttributes(params, function (err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
})
.catch(reject);
});
};
SimpleQueue.prototype.sendMessage = function (msgData, delaySeconds) {
var self = this,
sqs = self.client;
return Q.Promise(function (resolve, reject) {
self.getQueueUrl()
.then(function (queueUrl) {
var params = {
QueueUrl: queueUrl,
MessageBody: JSON.stringify(msgData)
};
if (delaySeconds) {
params.DelaySeconds = delaySeconds;
}
sqs.sendMessage(params, function (err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
})
.catch(reject);
});
};
SimpleQueue.prototype.receiveMessage = function () {
var self = this,
sqs = self.client;
return Q.Promise(function (resolve, reject) {
self.getQueueUrl()
.then(function (queueUrl) {
var params = {
QueueUrl: queueUrl,
MaxNumberOfMessages: self.maxMessages,
WaitTimeSeconds: self.waitTimeSeconds
};
sqs.receiveMessage(params, function (err, data) {
if (err) {
reject(err);
} else {
resolve(data.Messages);
}
});
})
.catch(reject);
});
};
var removeMsg = function (receiptHandle) {
var self = this,
sqs = self.client;
return Q.Promise(function (resolve, reject) {
self.getQueueUrl()
.then(function (queueUrl) {
var params = {
QueueUrl: queueUrl,
ReceiptHandle: receiptHandle
};
sqs.deleteMessage(params, function (err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
})
.catch(reject);
});
};
SimpleQueue.prototype.removeMessage = removeMsg;
SimpleQueue.prototype.deleteMessage = removeMsg;