@amaabca/aws-lex-custom-resources
Version:
AWS Lex infrastructure as code via the CDK
114 lines (113 loc) • 4.2 kB
JavaScript
;
const AWS = require('aws-sdk');
const Lex = new AWS.LexModelBuildingService();
exports.handler = async (event, context) => {
try {
return await (() => {
return new Promise((resolve, reject) => {
console.log(event, context);
let params = JSON.parse(event.ResourceProperties.props);
console.log(params);
if (event.RequestType === 'Create') {
console.log("Creating now...");
Lex.putIntent(params, (err, data) => {
if (err) {
reject(err);
}
else {
console.log("Created, waiting for it to show up.");
getIntentReady(params.name, 0, resolve, reject);
}
});
}
else if (event.RequestType === 'Delete') {
deleteIntent(params.name, 0, resolve, reject);
}
else if (event.RequestType === 'Update') {
Lex.getIntent({ name: params.name, version: "$LATEST" }, (err, intentData) => {
if (err) {
reject(err);
}
else {
params.checksum = intentData.checksum;
Lex.putIntent(params, (err, data) => {
if (err) {
reject(err);
}
else {
getIntentReady(params.name, 0, resolve, reject);
}
});
}
});
}
});
})();
}
catch (err) {
console.error(err);
throw new Error(err);
}
};
const getIntentGone = (name, retries, onSuccess, onFailure) => {
setTimeout(() => {
Lex.getIntent({ name: name, version: "$LATEST" }, (err, intentData) => {
if (err) {
console.error(`GET INTENT GONE ERROR: ${err}`);
onSuccess("Deleted!");
}
else {
console.log(intentData);
retries++;
if (retries >= process.env.RETRIES) {
console.log("TIMED OUT");
onFailure("TIMED OUT");
}
else {
getIntentGone(name, retries, onSuccess, onFailure);
}
}
});
}, process.env.WAIT_TIME);
};
const deleteIntent = (name, retries, onSuccess, onFailure) => {
setTimeout(() => {
Lex.deleteIntent({ name: name }, (err, data) => {
if (err) {
console.error(`GET INTENT READY ERROR: ${err}`);
retries++;
if (retries >= process.env.RETRIES) {
console.error("TIMED OUT");
}
else {
deleteIntent(name, retries, onSuccess, onFailure);
}
}
else {
console.log(data);
getIntentGone(name, 0, onSuccess, onFailure);
}
});
}, process.env.WAIT_TIME);
};
const getIntentReady = (name, retries, onSuccess, onFailure) => {
setTimeout(() => {
Lex.getIntent({ name: name, version: "$LATEST" }, (err, intentData) => {
if (err) {
console.error(`GET INTENT READY ERROR: ${err}`);
retries++;
if (retries >= process.env.RETRIES) {
console.error("TIMED OUT");
deleteIntent(name, onFailure, onFailure); //pass onFailure twice as this is a fail case
}
else {
getIntentReady(name, retries, onSuccess, onFailure);
}
}
else {
console.log(intentData);
onSuccess(intentData);
}
});
}, process.env.WAIT_TIME);
};