deep-package-manager
Version:
DEEP Package Manager
249 lines (199 loc) • 6.39 kB
JavaScript
/**
* Created by mgoria on 01/19/16.
*/
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SQSService = undefined;
var _AbstractService = require('./AbstractService');
var _deepCore = require('deep-core');
var _deepCore2 = _interopRequireDefault(_deepCore);
var _AwsRequestSyncStack = require('../../Helpers/AwsRequestSyncStack');
var _FailedToCreateSqsQueueException = require('./Exception/FailedToCreateSqsQueueException');
var _objectMerge = require('object-merge');
var _objectMerge2 = _interopRequireDefault(_objectMerge);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* SQS service
*/
class SQSService extends _AbstractService.AbstractService {
/**
* @param {Array} args
*/
constructor(...args) {
super(...args);
}
/**
* @returns {String}
*/
name() {
return _deepCore2.default.AWS.Service.SIMPLE_QUEUE_SERVICE;
}
/**
* @returns {String}
*/
static get RUM_QUEUE() {
return 'rum';
}
/**
* @returns {String}
*/
static get DB_OFFLOAD_QUEUE() {
return 'dbol';
}
/**
* @returns {String[]}
*/
static get AVAILABLE_REGIONS() {
return [_deepCore2.default.AWS.Region.AP_NORTHEAST_TOKYO, _deepCore2.default.AWS.Region.AP_NORTHEAST_SEOUL, _deepCore2.default.AWS.Region.AP_SOUTHEAST_SYDNEY, _deepCore2.default.AWS.Region.AP_SOUTHEAST_SINGAPORE, _deepCore2.default.AWS.Region.AP_SOUTH_MUMBAI, _deepCore2.default.AWS.Region.EU_CENTRAL_FRANKFURT, _deepCore2.default.AWS.Region.EU_WEST_IRELAND, _deepCore2.default.AWS.Region.EU_WEST_LONDON, _deepCore2.default.AWS.Region.SA_EAST_SAO_PAULO, _deepCore2.default.AWS.Region.CA_CENTRAL_MONTREAL, _deepCore2.default.AWS.Region.US_EAST_VIRGINIA, _deepCore2.default.AWS.Region.US_EAST_OHIO, _deepCore2.default.AWS.Region.US_WEST_CALIFORNIA, _deepCore2.default.AWS.Region.US_WEST_OREGON];
}
/**
* @param {Core.Generic.ObjectStorage} services
* @returns {SQSService}
*/
_setup(services) {
let oldQueues = {};
let queuesConfig = {};
let rum = this.getRumConfig();
let dbOffload = this.getDBOffloadConfig();
let dbOffloadQueues = {};
if (this._isUpdate) {
oldQueues = this._config.queues || {};
dbOffloadQueues = this._config.dbOffloadQueues || {};
}
if (rum.enabled && !oldQueues.hasOwnProperty(SQSService.RUM_QUEUE)) {
queuesConfig[SQSService.RUM_QUEUE] = {}; // @note - here you can add some sqs queue config options
}
if (dbOffload.enabled) {
this._dynamoDBModelsVector.forEach(modelName => {
let modelQueueName = `${SQSService.DB_OFFLOAD_QUEUE}-${modelName}`;
if (!oldQueues.hasOwnProperty(modelQueueName)) {
queuesConfig[modelQueueName] = {}; // @note - here you can add some sqs queue config options
dbOffloadQueues[modelQueueName] = modelName;
}
});
}
this._createQueues(queuesConfig)(queues => {
this._config.queues = (0, _objectMerge2.default)(oldQueues, queues);
this._config.dbOffloadQueues = dbOffloadQueues;
this._ready = true;
});
return this;
}
/**
* @returns {String[]}
*/
get _dynamoDBModelsVector() {
let modelsVector = [];
let models = this.provisioning.property.config.models;
for (let modelKey in models) {
if (!models.hasOwnProperty(modelKey)) {
continue;
}
let backendModels = models[modelKey];
for (let modelName in backendModels) {
if (!backendModels.hasOwnProperty(modelName)) {
continue;
}
modelsVector.push(modelName);
}
}
return modelsVector;
}
/**
* @param {Core.Generic.ObjectStorage} services
* @returns {SQSService}
*/
_postProvision(services) {
if (this._isUpdate) {
this._readyTeardown = true;
return this;
}
this._readyTeardown = true;
return this;
}
/**
* @param {Core.Generic.ObjectStorage} services
* @returns {SQSService}
*/
_postDeployProvision(services) {
if (this._isUpdate) {
this._ready = true;
return this;
}
this._ready = true;
return this;
}
/**
* @returns {Object}
*/
getDBOffloadConfig() {
return {
enabled: true // todo: Set it configurable from config or runtime
};
}
/**
* Gets RUM config from global
* @returns {Object}
*/
getRumConfig() {
let globalsConfig = this.property.config.globals;
let rum = {
enabled: false
};
if (globalsConfig.logDrivers && globalsConfig.logDrivers.rum) {
rum = globalsConfig.logDrivers.rum;
}
return rum;
}
/**
* @param {Object} queuesConfig
* @returns {Function}
* @private
*/
_createQueues(queuesConfig) {
let sqs = this.provisioning.sqs;
let syncStack = new _AwsRequestSyncStack.AwsRequestSyncStack();
let queues = {};
for (let queueName in queuesConfig) {
if (!queuesConfig.hasOwnProperty(queueName)) {
continue;
}
let params = {
QueueName: this.generateAwsResourceName(`${_AbstractService.AbstractService.capitalizeFirst(queueName)}Queue`, this.name()),
Attributes: queuesConfig[queueName]
};
syncStack.push(sqs.createQueue(params), (error, data) => {
if (error) {
throw new _FailedToCreateSqsQueueException.FailedToCreateSqsQueueException(params.QueueName, error);
}
queues[queueName] = {
name: params.QueueName,
url: data.QueueUrl
};
});
}
return callback => {
return syncStack.join().ready(() => {
callback(queues);
});
};
}
/**
* Allow Cognito Identities and Lambda functions to send messages to SQS queue
*
* @param {Array} actions
* @returns {Core.AWS.IAM.Statement}
*/
generateAllowActionsStatement(actions = ['SendMessage', 'SendMessageBatch']) {
let policy = new _deepCore2.default.AWS.IAM.Policy();
let statement = policy.statement.add();
actions.forEach(action => {
statement.action.add(_deepCore2.default.AWS.Service.SIMPLE_QUEUE_SERVICE, action);
});
statement.resource.add(_deepCore2.default.AWS.Service.SIMPLE_QUEUE_SERVICE, this.provisioning.sqs.config.region, this.awsAccountId, this._getGlobalResourceMask());
return statement;
}
}
exports.SQSService = SQSService;