awscdk-construct-ad-decision-server
Version:
AWS CDK Construct to upload local files to S3 and make them publicly available via CloudFront
76 lines • 8.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.handler = void 0;
const CREATIVES = getCreatives(process.env.CREATIVES);
const CLEARANCE_RULE = process.env.CLEARANCE_RULE;
function getCreatives(str) {
let creatives = [];
try {
creatives = JSON.parse(str);
}
catch (error) {
console.error('Error parsing JSON:', error);
}
return creatives;
}
const handler = async ({ duration }) => {
const d = Number(duration) || 0;
console.log(`Avail duration: ${d}`);
const body = getVASTData(d, CREATIVES).replace(/[\s]+(?![^><]*>)/g, '');
return { body };
};
exports.handler = handler;
function getVASTData(duration, creatives) {
let vastData = '<?xml version="1.0" encoding="UTF-8"?><VAST version="3.0">';
if (CLEARANCE_RULE === 'SEQUENCIAL') {
for (let i = 0; i < creatives.length; i++) {
const creative = creatives[i];
if (duration >= creative.duration) {
vastData += getAdTag(i + 1, creative);
duration -= creative.duration;
}
else {
break;
}
}
}
else {
creatives = creatives.sort((a, b) => b.duration - a.duration);
const shortestDuration = creatives[creatives.length - 1].duration;
for (let i = 0, j = 1; i < creatives.length && duration >= shortestDuration;) {
const creative = creatives[i];
if (duration >= creative.duration) {
vastData += getAdTag(j++, creative);
duration -= creative.duration;
}
else {
i++;
}
}
}
return vastData + '</VAST>';
}
function getAdTag(index, creative) {
const { duration, url, delivery, mimeType, width, height } = creative;
return `
<Ad sequence="${index}">
<InLine>
<AdSystem>2.0</AdSystem>
<AdTitle>ad-${index}</AdTitle>
<Impression/>
<Creatives>
<Creative>
<Linear>
<Duration>00:00:${duration}</Duration>
<MediaFiles>
<MediaFile delivery="${delivery}" type="${mimeType}" width="${width}" height="${height}">
<![CDATA[${url}]]>
</MediaFile>
</MediaFiles>
</Linear>
</Creative>
</Creatives>
</InLine>
</Ad>`;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29kZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFXQSxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFtQixDQUFDLENBQUM7QUFDaEUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUF3QixDQUFDO0FBRTVELFNBQVMsWUFBWSxDQUFDLEdBQVc7SUFDL0IsSUFBSSxTQUFTLEdBQWUsRUFBRSxDQUFDO0lBQy9CLElBQUksQ0FBQztRQUNILFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVNLE1BQU0sT0FBTyxHQUFZLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7SUFDckQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNsQixDQUFDLENBQUM7QUFMVyxRQUFBLE9BQU8sV0FLbEI7QUFFRixTQUFTLFdBQVcsQ0FBQyxRQUFnQixFQUFFLFNBQXFCO0lBQzFELElBQUksUUFBUSxHQUFHLDREQUE0RCxDQUFDO0lBQzVFLElBQUksY0FBYyxLQUFLLFlBQVksRUFBRSxDQUFDO1FBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbEMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN0QyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNoQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlELE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ2xFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksUUFBUSxJQUFJLGdCQUFnQixHQUFHLENBQUM7WUFDN0UsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbEMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDcEMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDaEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLENBQUMsRUFBRSxDQUFDO1lBQ04sQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxRQUFRLEdBQUcsU0FBUyxDQUFDO0FBQzlCLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUFhLEVBQUUsUUFBa0I7SUFDakQsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBQ3RFLE9BQU87Z0JBQ08sS0FBSzs7O2tCQUdILEtBQUs7Ozs7OzRCQUtLLFFBQVE7O21DQUVELFFBQVEsV0FBVyxRQUFRLFlBQVksS0FBSyxhQUFhLE1BQU07eUJBQ3pFLEdBQUc7Ozs7Ozs7TUFPdEIsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYW5kbGVyIH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5cbmludGVyZmFjZSBDcmVhdGl2ZSB7XG4gIHJlYWRvbmx5IGR1cmF0aW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICByZWFkb25seSBkZWxpdmVyeTogc3RyaW5nO1xuICByZWFkb25seSBtaW1lVHlwZTogc3RyaW5nO1xuICByZWFkb25seSB3aWR0aDogbnVtYmVyO1xuICByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcbn1cblxuY29uc3QgQ1JFQVRJVkVTID0gZ2V0Q3JlYXRpdmVzKHByb2Nlc3MuZW52LkNSRUFUSVZFUyBhcyBzdHJpbmcpO1xuY29uc3QgQ0xFQVJBTkNFX1JVTEUgPSBwcm9jZXNzLmVudi5DTEVBUkFOQ0VfUlVMRSBhcyBzdHJpbmc7XG5cbmZ1bmN0aW9uIGdldENyZWF0aXZlcyhzdHI6IHN0cmluZyk6IENyZWF0aXZlW10ge1xuICBsZXQgY3JlYXRpdmVzOiBDcmVhdGl2ZVtdID0gW107XG4gIHRyeSB7XG4gICAgY3JlYXRpdmVzID0gSlNPTi5wYXJzZShzdHIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgSlNPTjonLCBlcnJvcik7XG4gIH1cbiAgcmV0dXJuIGNyZWF0aXZlcztcbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZXI6IEhhbmRsZXIgPSBhc3luYyAoeyBkdXJhdGlvbiB9KSA9PiB7XG4gIGNvbnN0IGQgPSBOdW1iZXIoZHVyYXRpb24pIHx8IDA7XG4gIGNvbnNvbGUubG9nKGBBdmFpbCBkdXJhdGlvbjogJHtkfWApO1xuICBjb25zdCBib2R5ID0gZ2V0VkFTVERhdGEoZCwgQ1JFQVRJVkVTKS5yZXBsYWNlKC9bXFxzXSsoPyFbXj48XSo+KS9nLCAnJyk7XG4gIHJldHVybiB7IGJvZHkgfTtcbn07XG5cbmZ1bmN0aW9uIGdldFZBU1REYXRhKGR1cmF0aW9uOiBudW1iZXIsIGNyZWF0aXZlczogQ3JlYXRpdmVbXSk6IHN0cmluZyB7XG4gIGxldCB2YXN0RGF0YSA9ICc8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz48VkFTVCB2ZXJzaW9uPVwiMy4wXCI+JztcbiAgaWYgKENMRUFSQU5DRV9SVUxFID09PSAnU0VRVUVOQ0lBTCcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNyZWF0aXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY3JlYXRpdmUgPSBjcmVhdGl2ZXNbaV07XG4gICAgICBpZiAoZHVyYXRpb24gPj0gY3JlYXRpdmUuZHVyYXRpb24pIHtcbiAgICAgICAgdmFzdERhdGEgKz0gZ2V0QWRUYWcoaSArIDEsIGNyZWF0aXZlKTtcbiAgICAgICAgZHVyYXRpb24gLT0gY3JlYXRpdmUuZHVyYXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY3JlYXRpdmVzID0gY3JlYXRpdmVzLnNvcnQoKGEsIGIpID0+IGIuZHVyYXRpb24gLSBhLmR1cmF0aW9uKTtcbiAgICBjb25zdCBzaG9ydGVzdER1cmF0aW9uID0gY3JlYXRpdmVzW2NyZWF0aXZlcy5sZW5ndGggLSAxXS5kdXJhdGlvbjtcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDE7IGkgPCBjcmVhdGl2ZXMubGVuZ3RoICYmIGR1cmF0aW9uID49IHNob3J0ZXN0RHVyYXRpb247KSB7XG4gICAgICBjb25zdCBjcmVhdGl2ZSA9IGNyZWF0aXZlc1tpXTtcbiAgICAgIGlmIChkdXJhdGlvbiA+PSBjcmVhdGl2ZS5kdXJhdGlvbikge1xuICAgICAgICB2YXN0RGF0YSArPSBnZXRBZFRhZyhqKyssIGNyZWF0aXZlKTtcbiAgICAgICAgZHVyYXRpb24gLT0gY3JlYXRpdmUuZHVyYXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB2YXN0RGF0YSArICc8L1ZBU1Q+Jztcbn1cblxuZnVuY3Rpb24gZ2V0QWRUYWcoaW5kZXg6IG51bWJlciwgY3JlYXRpdmU6IENyZWF0aXZlKTogc3RyaW5nIHtcbiAgY29uc3QgeyBkdXJhdGlvbiwgdXJsLCBkZWxpdmVyeSwgbWltZVR5cGUsIHdpZHRoLCBoZWlnaHQgfSA9IGNyZWF0aXZlO1xuICByZXR1cm4gYFxuPEFkIHNlcXVlbmNlPVwiJHtpbmRleH1cIj5cbiAgPEluTGluZT5cbiAgICA8QWRTeXN0ZW0+Mi4wPC9BZFN5c3RlbT5cbiAgICA8QWRUaXRsZT5hZC0ke2luZGV4fTwvQWRUaXRsZT5cbiAgICA8SW1wcmVzc2lvbi8+XG4gICAgPENyZWF0aXZlcz5cbiAgICAgIDxDcmVhdGl2ZT5cbiAgICAgICAgPExpbmVhcj5cbiAgICAgICAgICA8RHVyYXRpb24+MDA6MDA6JHtkdXJhdGlvbn08L0R1cmF0aW9uPlxuICAgICAgICAgIDxNZWRpYUZpbGVzPlxuICAgICAgICAgICAgPE1lZGlhRmlsZSBkZWxpdmVyeT1cIiR7ZGVsaXZlcnl9XCIgdHlwZT1cIiR7bWltZVR5cGV9XCIgd2lkdGg9XCIke3dpZHRofVwiIGhlaWdodD1cIiR7aGVpZ2h0fVwiPlxuICAgICAgICAgICAgICA8IVtDREFUQVske3VybH1dXT5cbiAgICAgICAgICAgIDwvTWVkaWFGaWxlPlxuICAgICAgICAgIDwvTWVkaWFGaWxlcz5cbiAgICAgICAgPC9MaW5lYXI+XG4gICAgICA8L0NyZWF0aXZlPlxuICAgIDwvQ3JlYXRpdmVzPlxuICA8L0luTGluZT5cbjwvQWQ+YDtcbn1cbiJdfQ==