serverless-step-functions
Version:
The module is AWS Step Functions plugin for Serverless Framework
108 lines (94 loc) • 3.02 kB
JavaScript
'use strict';
const BbPromise = require('bluebird');
const path = require('path');
module.exports = {
getStateMachineArn() {
const stateMachineOutputKey = this.getStateMachineOutputLogicalId(this.options.name,
this.serverless.service.stepFunctions.stateMachines[this.options.name]);
const stackName = this.provider.naming.getStackName(this.options.stage);
return this.provider.request('CloudFormation',
'describeStacks',
{ StackName: stackName },
this.options.stage,
this.options.region)
.then((result) => {
if (result) {
result.Stacks[0].Outputs.forEach((output) => {
if (output.OutputKey === stateMachineOutputKey) {
this.stateMachineArn = output.OutputValue;
}
});
if (!this.stateMachineArn) {
const errorMessage = [
`"${this.options.name}" stateMachine does not exists.`,
].join('');
throw new this.serverless.classes.Error(errorMessage);
}
}
return BbPromise.resolve();
});
},
startExecution() {
let inputData = '';
if (this.options.data) {
inputData = this.options.data;
} else if (this.options.path) {
const absolutePath = path.isAbsolute(this.options.path)
? this.options.path
: path.join(this.serverless.config.servicePath, this.options.path);
if (!this.serverless.utils.fileExistsSync(absolutePath)) {
throw new this.serverless.classes.Error('The file you provided does not exist.');
}
inputData = JSON.stringify(this.serverless.utils.readFileSync(absolutePath));
}
const params = {
stateMachineArn: this.stateMachineArn,
};
if (inputData) {
params.input = inputData;
}
return this.provider.request('StepFunctions',
'startExecution',
params,
this.options.stage,
this.options.region)
.then((result) => {
this.executionArn = result.executionArn;
return BbPromise.resolve();
}).catch((error) => {
throw new this.serverless.classes.Error(error.message);
});
},
describeExecution() {
return this.provider.request('StepFunctions',
'describeExecution',
{
executionArn: this.executionArn,
},
this.options.stage,
this.options.region)
.then((result) => {
if (result.status === 'RUNNING') {
this.serverless.cli.printDot();
return this.setTimeout()
.then(() => this.describeExecution());
}
return BbPromise.resolve(result);
});
},
getExecutionHistory() {
return this.provider.request('StepFunctions',
'getExecutionHistory',
{
executionArn: this.executionArn,
},
this.options.stage,
this.options.region)
.then(result => BbPromise.resolve(result));
},
setTimeout() {
return new BbPromise((resolve) => {
setTimeout(resolve, 5000);
});
},
};