awscdk-construct-hls-session-runner
Version:
AWS CDK construct for deploying a Lambda function and SFN state machines to fetch an HLS manifest
90 lines • 13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.handler = handler;
const HLS = require("hls-parser"); // For reading/writing the HLS manifest
const node_fetch_1 = require("node-fetch"); // For making a request to the origin
const util_1 = require("./util");
const HLS_ENDPOINT_URL = process.env.HLS_ENDPOINT_URL;
const REQUEST_HEADERS = JSON.parse(process.env.REQUEST_HEADERS);
const INDEX_OF_RENDITIONS = Number.parseInt(process.env.INDEX_OF_RENDITIONS, 10);
const SESSION_REQUIREMENTS = JSON.parse(process.env.SESSION_REQUIREMENTS);
const EVENT_START_TIME = new Date(process.env.EVENT_START_TIME);
const SEGMENT_REQUEST = process.env.SEGMENT_REQUEST === 'true';
HLS.setOptions({ silent: true }); // Surpress the error message
async function handler(event) {
const urlList = event.urlList;
const desiredSessionVolume = (0, util_1.getDesiredSessionVolume)(EVENT_START_TIME, SESSION_REQUIREMENTS.graph);
console.log(`Desired session volume: ${desiredSessionVolume}`);
if (urlList.length < desiredSessionVolume) {
const createNum = desiredSessionVolume - urlList.length;
for (let i = 0; i < createNum; i++) {
const url = await getRenditionUrl(HLS_ENDPOINT_URL, INDEX_OF_RENDITIONS);
urlList.push(url);
}
}
else {
urlList.length = desiredSessionVolume;
}
for (const url of urlList) {
if (SEGMENT_REQUEST) {
await getLastSegment(url);
}
else {
await getPlaylist(url, false);
}
}
return { urlList, timestamp: new Date().toISOString() };
}
async function getRenditionUrl(masterPlaylistUrl, index) {
const playlist = await getPlaylist(masterPlaylistUrl);
if (!playlist || !playlist.isMasterPlaylist) {
console.error('Failed to fetch the master playlist');
return undefined;
}
const masterPlaylist = playlist;
if (masterPlaylist.variants.length === 0) {
console.error('No variant found in the master playlist');
return undefined;
}
return (0, util_1.getAbsoluteUrl)(masterPlaylistUrl, masterPlaylist.variants[index].uri);
}
async function getLastSegment(playlistUrl) {
const playlist = await getPlaylist(playlistUrl);
if (!playlist || playlist.isMasterPlaylist) {
console.error('Failed to fetch the media playlist');
return undefined;
}
const mediaPlaylist = playlist;
if (mediaPlaylist.segments.length === 0) {
console.error('No segments found in the media playlist');
return undefined;
}
const lastSegmentUrl = (0, util_1.getAbsoluteUrl)(playlistUrl, mediaPlaylist.segments[mediaPlaylist.segments.length - 1].uri);
return void fetchUrl(lastSegmentUrl); // Don't wait for the response
}
async function getPlaylist(url, parse = true) {
const txt = await fetchUrl(url, true);
if (txt && parse) {
return HLS.parse(txt);
}
return txt;
}
async function fetchUrl(url, returnText = false) {
const headers = process.env.DISABLE_REQUEST_HEADERS === 'true' ? {} : REQUEST_HEADERS;
if (!returnText) {
return void (0, node_fetch_1.default)(url, {
method: 'GET',
headers,
});
}
const res = await (0, node_fetch_1.default)(url, {
method: 'GET',
headers,
});
if (!res.ok) {
console.error(`Failed to fetch the URL: ${res.status} ${res.statusText} - ${url}`);
return undefined;
}
return res.text();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFtYmRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsMEJBcUJDO0FBbENELGtDQUFrQyxDQUFDLHVDQUF1QztBQUMxRSwyQ0FBK0IsQ0FBQyxxQ0FBcUM7QUFDckUsaUNBQWlFO0FBRWpFLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBMEIsQ0FBQztBQUNoRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBeUIsQ0FBQyxDQUFDO0FBQzFFLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUE2QixFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzNGLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUE4QixDQUFDLENBQUM7QUFDcEYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUEwQixDQUFDLENBQUM7QUFDMUUsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEtBQUssTUFBTSxDQUFDO0FBRS9ELEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLDZCQUE2QjtBQUV4RCxLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQVU7SUFDdEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUM5QixNQUFNLG9CQUFvQixHQUFHLElBQUEsOEJBQXVCLEVBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkcsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsb0JBQW9CLEVBQUUsQ0FBQyxD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Q0FBQztJQUN0QyxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNqQixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELEtBQUssVUFBVSxRQUFRLENBQUMsR0FBVyxFQUFFLFVBQVUsR0FBRyxLQUFLO0lBQ3JELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztJQUN0RixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsT0FBTyxLQUFLLElBQUEsb0JBQUssRUFBQyxHQUFHLEVBQUU7WUFDckIsTUFBTSxFQUFFLEtBQUs7WUFDYixPQUFPO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSxvQkFBSyxFQUFDLEdBQUcsRUFBRTtRQUMzQixNQUFNLEVBQUUsS0FBSztRQUNiLE9BQU87S0FDUixDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbkYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBITFMgZnJvbSAnaGxzLXBhcnNlcic7IC8vIEZvciByZWFkaW5nL3dyaXRpbmcgdGhlIEhMUyBtYW5pZmVzdFxuaW1wb3J0IGZldGNoIGZyb20gJ25vZGUtZmV0Y2gnOyAvLyBGb3IgbWFraW5nIGEgcmVxdWVzdCB0byB0aGUgb3JpZ2luXG5pbXBvcnQgeyBnZXREZXNpcmVkU2Vzc2lvblZvbHVtZSwgZ2V0QWJzb2x1dGVVcmwgfSBmcm9tICcuL3V0aWwnO1xuXG5jb25zdCBITFNfRU5EUE9JTlRfVVJMID0gcHJvY2Vzcy5lbnYuSExTX0VORFBPSU5UX1VSTCBhcyBzdHJpbmc7XG5jb25zdCBSRVFVRVNUX0hFQURFUlMgPSBKU09OLnBhcnNlKHByb2Nlc3MuZW52LlJFUVVFU1RfSEVBREVSUyBhcyBzdHJpbmcpO1xuY29uc3QgSU5ERVhfT0ZfUkVORElUSU9OUyA9IE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5JTkRFWF9PRl9SRU5ESVRJT05TIGFzIHN0cmluZywgMTApO1xuY29uc3QgU0VTU0lPTl9SRVFVSVJFTUVOVFMgPSBKU09OLnBhcnNlKHByb2Nlc3MuZW52LlNFU1NJT05fUkVRVUlSRU1FTlRTIGFzIHN0cmluZyk7XG5jb25zdCBFVkVOVF9TVEFSVF9USU1FID0gbmV3IERhdGUocHJvY2Vzcy5lbnYuRVZFTlRfU1RBUlRfVElNRSBhcyBzdHJpbmcpO1xuY29uc3QgU0VHTUVOVF9SRVFVRVNUID0gcHJvY2Vzcy5lbnYuU0VHTUVOVF9SRVFVRVNUID09PSAndHJ1ZSc7XG5cbkhMUy5zZXRPcHRpb25zKHsgc2lsZW50OiB0cnVlIH0pOyAvLyBTdXJwcmVzcyB0aGUgZXJyb3IgbWVzc2FnZVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogYW55KSB7XG4gIGNvbnN0IHVybExpc3QgPSBldmVudC51cmxMaXN0O1xuICBjb25zdCBkZXNpcmVkU2Vzc2lvblZvbHVtZSA9IGdldERlc2lyZWRTZXNzaW9uVm9sdW1lKEVWRU5UX1NUQVJUX1RJTUUsIFNFU1NJT05fUkVRVUlSRU1FTlRTLmdyYXBoKTtcbiAgY29uc29sZS5sb2coYERlc2lyZWQgc2Vzc2lvbiB2b2x1bWU6ICR7ZGVzaXJlZFNlc3Npb25Wb2x1bWV9YCk7XG4gIGlmICh1cmxMaXN0Lmxlbmd0aCA8IGRlc2lyZWRTZXNzaW9uVm9sdW1lKSB7XG4gICAgY29uc3QgY3JlYXRlTnVtID0gZGVzaXJlZFNlc3Npb25Wb2x1bWUgLSB1cmxMaXN0Lmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNyZWF0ZU51bTsgaSsrKSB7XG4gICAgICBjb25zdCB1cmwgPSBhd2FpdCBnZXRSZW5kaXRpb25VcmwoSExTX0VORFBPSU5UX1VSTCwgSU5ERVhfT0ZfUkVORElUSU9OUyk7XG4gICAgICB1cmxMaXN0LnB1c2godXJsKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdXJsTGlzdC5sZW5ndGggPSBkZXNpcmVkU2Vzc2lvblZvbHVtZTtcbiAgfVxuICBmb3IgKGNvbnN0IHVybCBvZiB1cmxMaXN0KSB7XG4gICAgaWYgKFNFR01FTlRfUkVRVUVTVCkge1xuICAgICAgYXdhaXQgZ2V0TGFzdFNlZ21lbnQodXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZ2V0UGxheWxpc3QodXJsLCBmYWxzZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHVybExpc3QsIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJlbmRpdGlvblVybChtYXN0ZXJQbGF5bGlzdFVybDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGxheWxpc3QgPSBhd2FpdCBnZXRQbGF5bGlzdChtYXN0ZXJQbGF5bGlzdFVybCkgYXMgSExTLnR5cGVzLlBsYXlsaXN0IHwgdW5kZWZpbmVkO1xuICBpZiAoIXBsYXlsaXN0IHx8ICFwbGF5bGlzdC5pc01hc3RlclBsYXlsaXN0KSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIHRoZSBtYXN0ZXIgcGxheWxpc3QnKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG1hc3RlclBsYXlsaXN0ID0gcGxheWxpc3QgYXMgSExTLnR5cGVzLk1hc3RlclBsYXlsaXN0O1xuICBpZiAobWFzdGVyUGxheWxpc3QudmFyaWFudHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcignTm8gdmFyaWFudCBmb3VuZCBpbiB0aGUgbWFzdGVyIHBsYXlsaXN0Jyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZ2V0QWJzb2x1dGVVcmwobWFzdGVyUGxheWxpc3RVcmwsIG1hc3RlclBsYXlsaXN0LnZhcmlhbnRzW2luZGV4XS51cmkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXN0U2VnbWVudChwbGF5bGlzdFVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGxheWxpc3QgPSBhd2FpdCBnZXRQbGF5bGlzdChwbGF5bGlzdFVybCkgYXMgSExTLnR5cGVzLlBsYXlsaXN0IHwgdW5kZWZpbmVkO1xuICBpZiAoIXBsYXlsaXN0IHx8IHBsYXlsaXN0LmlzTWFzdGVyUGxheWxpc3QpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggdGhlIG1lZGlhIHBsYXlsaXN0Jyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBtZWRpYVBsYXlsaXN0ID0gcGxheWxpc3QgYXMgSExTLnR5cGVzLk1lZGlhUGxheWxpc3Q7XG4gIGlmIChtZWRpYVBsYXlsaXN0LnNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlZ21lbnRzIGZvdW5kIGluIHRoZSBtZWRpYSBwbGF5bGlzdCcpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbGFzdFNlZ21lbnRVcmwgPSBnZXRBYnNvbHV0ZVVybChwbGF5bGlzdFVybCwgbWVkaWFQbGF5bGlzdC5zZWdtZW50c1ttZWRpYVBsYXlsaXN0LnNlZ21lbnRzLmxlbmd0aCAtIDFdLnVyaSk7XG4gIHJldHVybiB2b2lkIGZldGNoVXJsKGxhc3RTZWdtZW50VXJsKTsgLy8gRG9uJ3Qgd2FpdCBmb3IgdGhlIHJlc3BvbnNlXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBsYXlsaXN0KHVybDogc3RyaW5nLCBwYXJzZSA9IHRydWUpOiBQcm9taXNlPEhMUy50eXBlcy5QbGF5bGlzdCB8IHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB0eHQgPSBhd2FpdCBmZXRjaFVybCh1cmwsIHRydWUpO1xuICBpZiAodHh0ICYmIHBhcnNlKSB7XG4gICAgcmV0dXJuIEhMUy5wYXJzZSh0eHQpO1xuICB9XG4gIHJldHVybiB0eHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVXJsKHVybDogc3RyaW5nLCByZXR1cm5UZXh0ID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBoZWFkZXJzID0gcHJvY2Vzcy5lbnYuRElTQUJMRV9SRVFVRVNUX0hFQURFUlMgPT09ICd0cnVlJyA/IHt9IDogUkVRVUVTVF9IRUFERVJTO1xuICBpZiAoIXJldHVyblRleHQpIHtcbiAgICByZXR1cm4gdm9pZCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzLFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgaGVhZGVycyxcbiAgfSk7XG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoIHRoZSBVUkw6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH0gLSAke3VybH1gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiByZXMudGV4dCgpO1xufSJdfQ==