UNPKG

awscdk-construct-scte-scheduler

Version:

AWS CDK Construct for scheduling SCTE-35 events using the MediaLive schedule API

76 lines 12.8 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.ScteScheduler = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const crypto = require("crypto"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_events_1 = require("aws-cdk-lib/aws-events"); const aws_stepfunctions_1 = require("aws-cdk-lib/aws-stepfunctions"); const aws_stepfunctions_tasks_1 = require("aws-cdk-lib/aws-stepfunctions-tasks"); const custom_resources_1 = require("aws-cdk-lib/custom-resources"); const constructs_1 = require("constructs"); const EventBridgeSchedule_1 = require("./EventBridgeSchedule"); const Lambda_1 = require("./Lambda"); class ScteScheduler extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); const { channelId, scteDurationInSeconds, intervalInMinutes, cronOptions, repeatCount = Infinity, callback, } = props; // Create Lambda function to insert SCTE message using the MediaLive schedule API this.lambda = new Lambda_1.Lambda(this, 'LambdaFunction', { channelId, scteDurationInSeconds, }); // Create Step Functions state machine to invoke the Lambda function N times const invoke = new aws_stepfunctions_tasks_1.LambdaInvoke(this, 'Invoke SCTE scheduler Lambda function', { lambdaFunction: this.lambda.func, inputPath: '$.Payload', }); const wait1 = new aws_stepfunctions_1.Wait(this, `Wait for ${intervalInMinutes}-min`, { time: aws_stepfunctions_1.WaitTime.duration(aws_cdk_lib_1.Duration.minutes(intervalInMinutes)), }); const wait2 = new aws_stepfunctions_1.Wait(this, `Wait for ${intervalInMinutes * 60 + scteDurationInSeconds}-sec`, { time: aws_stepfunctions_1.WaitTime.duration(aws_cdk_lib_1.Duration.seconds(intervalInMinutes * 60 + scteDurationInSeconds)), }); const lastTask = callback ? new aws_stepfunctions_tasks_1.LambdaInvoke(this, 'Callback', { lambdaFunction: callback, }) : new aws_stepfunctions_1.Succeed(this, 'Done'); const stateMachine = new aws_stepfunctions_1.StateMachine(this, 'StateMachine', { definitionBody: aws_stepfunctions_1.DefinitionBody.fromChainable(aws_stepfunctions_1.Chain.start(new aws_stepfunctions_1.Pass(this, 'Start', { parameters: { Payload: { i: 0 } } })) .next(wait1) .next(invoke) .next(new aws_stepfunctions_1.Choice(this, `Check if repaeted ${repeatCount} times`) .when(aws_stepfunctions_1.Condition.numberLessThan('$.Payload.i', repeatCount), wait1) .otherwise(aws_stepfunctions_1.Chain.start(wait2).next(lastTask)))), }); if (cronOptions) { // Create EventBridge rule to invoke the Lambda function every N minutes this.schedule = new EventBridgeSchedule_1.EventBridgeSchedule(this, 'EventBridgeSchedule', { target: stateMachine, schedule: aws_events_1.Schedule.cron(cronOptions), }); } else { // Start the execution of the state machine immediately new custom_resources_1.AwsCustomResource(scope, 'StartStateMachine', { onCreate: { service: 'StepFunctions', action: 'StartExecution', parameters: { stateMachineArn: stateMachine.stateMachineArn, input: '{ "Payload": { "i": 0 } }', }, physicalResourceId: custom_resources_1.PhysicalResourceId.of(`${crypto.randomUUID()}`), }, //Will ignore any resource and use the assumedRoleArn as resource and 'sts:AssumeRole' for service:action policy: custom_resources_1.AwsCustomResourcePolicy.fromSdkCalls({ resources: custom_resources_1.AwsCustomResourcePolicy.ANY_RESOURCE, }), }); } } } exports.ScteScheduler = ScteScheduler; _a = JSII_RTTI_SYMBOL_1; ScteScheduler[_a] = { fqn: "awscdk-construct-scte-scheduler.ScteScheduler", version: "0.0.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2N0ZVNjaGVkdWxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TY3RlU2NoZWR1bGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaUNBQWlDO0FBQ2pDLDZDQUF1QztBQUN2Qyx1REFBK0Q7QUFFL0QscUVBVXVDO0FBQ3ZDLGlGQUFtRTtBQUNuRSxtRUFBOEc7QUFDOUcsMkNBQXVDO0FBQ3ZDLCtEQUE0RDtBQUM1RCxxQ0FBa0M7QUFXbEMsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFJMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF5QjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sRUFDSixTQUFTLEVBQ1QscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixXQUFXLEVBQ1gsV0FBVyxHQUFHLFFBQVEsRUFDdEIsUUFBUSxHQUNULEdBQUcsS0FBSyxDQUFDO1FBRVYsaUZBQWlGO1FBQ2pGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQy9DLFNBQVM7WUFDVCxxQkFBcUI7U0FDdEIsQ0FBQyxDQUFDO1FBRUgsNEVBQTRFO1FBQzVFLE1BQU0sTUFBTSxHQUFHLElBQUksc0NBQVksQ0FBQyxJQUFJLEVBQUUsdUNBQXVDLEVBQUU7WUFDN0UsY0FBYyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTtZQUNoQyxTQUFTLEVBQUUsV0FBVztTQUN2QixDQUFDLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLHdCQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksaUJBQWlCLE1BQU0sRUFBRTtZQUNoRSxJQUFJLEVBQUUsNEJBQVEsQ0FBQyxRQUFRLENBQUMsc0JBQVEsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUM3RCxDQUFDLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLHdCQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksaUJBQWlCLEdBQUcsRUFBRSxHQUFHLHFCQUFxQixNQUFNLEVBQUU7WUFDN0YsSUFBSSxFQUFFLDRCQUFRLENBQUMsUUFBUSxDQUFDLHNCQUFRLENBQUMsT0FBTyxDQUFDLGlCQUFpQixHQUFHLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDO1NBQzFGLENBQUMsQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxzQ0FBWSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDN0QsY0FBYyxFQUFFLFFBQVE7U0FDekIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLDJCQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUFHLElBQUksZ0NBQVksQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQzFELGNBQWMsRUFBRSxrQ0FBYyxDQUFDLGFBQWEsQ0FDMUMseUJBQUssQ0FBQyxLQUFLLENBQ1QsSUFBSSx3QkFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQy9EO2lCQUNFLElBQUksQ0FBQyxLQUFLLENBQUM7aUJBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQztpQkFDWixJQUFJLENBQ0gsSUFBSSwwQkFBTSxDQUFDLElBQUksRUFBRSxxQkFBcUIsV0FBVyxRQUFRLENBQUM7aUJBQ3ZELElBQUksQ0FDSCw2QkFBUyxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLEVBQ3BELEtBQUssQ0FDTjtpQkFDQSxTQUFTLENBQ1IseUJBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUNsQyxDQUNKLENBQ0o7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLHdFQUF3RTtZQUN4RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUkseUNBQW1CLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO2dCQUNuRSxNQUFNLEVBQUUsWUFBWTtnQkFDcEIsUUFBUSxFQUFFLHFCQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUNyQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLHVEQUF1RDtZQUN2RCxJQUFJLG9DQUFpQixDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtnQkFDaEQsUUFBUSxFQUFFO29CQUNSLE9BQU8sRUFBRSxlQUFlO29CQUN4QixNQUFNLEVBQUUsZ0JBQWdCO29CQUN4QixVQUFVLEVBQUU7d0JBQ1YsZUFBZSxFQUFFLFlBQVksQ0FBQyxlQUFlO3dCQUM3QyxLQUFLLEVBQUUsMkJBQTJCO3FCQUNuQztvQkFDRCxrQkFBa0IsRUFBRSxxQ0FBa0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztpQkFDcEU7Z0JBQ0QseUdBQXlHO2dCQUN6RyxNQUFNLEVBQUUsMENBQXVCLENBQUMsWUFBWSxDQUFDO29CQUMzQyxTQUFTLEVBQUUsMENBQXVCLENBQUMsWUFBWTtpQkFDaEQsQ0FBQzthQUNILENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOztBQS9FSCxzQ0FnRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgU2NoZWR1bGUsIENyb25PcHRpb25zIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBJRnVuY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7XG4gIFN0YXRlTWFjaGluZSxcbiAgRGVmaW5pdGlvbkJvZHksXG4gIENoYWluLFxuICBDaG9pY2UsXG4gIENvbmRpdGlvbixcbiAgV2FpdCxcbiAgV2FpdFRpbWUsXG4gIFBhc3MsXG4gIFN1Y2NlZWQsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zJztcbmltcG9ydCB7IExhbWJkYUludm9rZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzJztcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlLCBBd3NDdXN0b21SZXNvdXJjZVBvbGljeSwgUGh5c2ljYWxSZXNvdXJjZUlkIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEV2ZW50QnJpZGdlU2NoZWR1bGUgfSBmcm9tICcuL0V2ZW50QnJpZGdlU2NoZWR1bGUnO1xuaW1wb3J0IHsgTGFtYmRhIH0gZnJvbSAnLi9MYW1iZGEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjdGVTY2hlZHVsZXJQcm9wcyB7XG4gIHJlYWRvbmx5IGNoYW5uZWxJZDogc3RyaW5nO1xuICByZWFkb25seSBzY3RlRHVyYXRpb25JblNlY29uZHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgaW50ZXJ2YWxJbk1pbnV0ZXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgY3Jvbk9wdGlvbnM/OiBDcm9uT3B0aW9ucztcbiAgcmVhZG9ubHkgcmVwZWF0Q291bnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNhbGxiYWNrPzogSUZ1bmN0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgU2N0ZVNjaGVkdWxlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBsYW1iZGE6IExhbWJkYTtcbiAgcHVibGljIHJlYWRvbmx5IHNjaGVkdWxlPzogRXZlbnRCcmlkZ2VTY2hlZHVsZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2N0ZVNjaGVkdWxlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIHNjdGVEdXJhdGlvbkluU2Vjb25kcyxcbiAgICAgIGludGVydmFsSW5NaW51dGVzLFxuICAgICAgY3Jvbk9wdGlvbnMsXG4gICAgICByZXBlYXRDb3VudCA9IEluZmluaXR5LFxuICAgICAgY2FsbGJhY2ssXG4gICAgfSA9IHByb3BzO1xuXG4gICAgLy8gQ3JlYXRlIExhbWJkYSBmdW5jdGlvbiB0byBpbnNlcnQgU0NURSBtZXNzYWdlIHVzaW5nIHRoZSBNZWRpYUxpdmUgc2NoZWR1bGUgQVBJXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgTGFtYmRhKHRoaXMsICdMYW1iZGFGdW5jdGlvbicsIHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIHNjdGVEdXJhdGlvbkluU2Vjb25kcyxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBTdGVwIEZ1bmN0aW9ucyBzdGF0ZSBtYWNoaW5lIHRvIGludm9rZSB0aGUgTGFtYmRhIGZ1bmN0aW9uIE4gdGltZXNcbiAgICBjb25zdCBpbnZva2UgPSBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdJbnZva2UgU0NURSBzY2hlZHVsZXIgTGFtYmRhIGZ1bmN0aW9uJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMubGFtYmRhLmZ1bmMsXG4gICAgICBpbnB1dFBhdGg6ICckLlBheWxvYWQnLFxuICAgIH0pO1xuICAgIGNvbnN0IHdhaXQxID0gbmV3IFdhaXQodGhpcywgYFdhaXQgZm9yICR7aW50ZXJ2YWxJbk1pbnV0ZXN9LW1pbmAsIHtcbiAgICAgIHRpbWU6IFdhaXRUaW1lLmR1cmF0aW9uKER1cmF0aW9uLm1pbnV0ZXMoaW50ZXJ2YWxJbk1pbnV0ZXMpKSxcbiAgICB9KTtcbiAgICBjb25zdCB3YWl0MiA9IG5ldyBXYWl0KHRoaXMsIGBXYWl0IGZvciAke2ludGVydmFsSW5NaW51dGVzICogNjAgKyBzY3RlRHVyYXRpb25JblNlY29uZHN9LXNlY2AsIHtcbiAgICAgIHRpbWU6IFdhaXRUaW1lLmR1cmF0aW9uKER1cmF0aW9uLnNlY29uZHMoaW50ZXJ2YWxJbk1pbnV0ZXMgKiA2MCArIHNjdGVEdXJhdGlvbkluU2Vjb25kcykpLFxuICAgIH0pO1xuICAgIGNvbnN0IGxhc3RUYXNrID0gY2FsbGJhY2sgPyBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdDYWxsYmFjaycsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiBjYWxsYmFjayxcbiAgICB9KSA6IG5ldyBTdWNjZWVkKHRoaXMsICdEb25lJyk7XG4gICAgY29uc3Qgc3RhdGVNYWNoaW5lID0gbmV3IFN0YXRlTWFjaGluZSh0aGlzLCAnU3RhdGVNYWNoaW5lJywge1xuICAgICAgZGVmaW5pdGlvbkJvZHk6IERlZmluaXRpb25Cb2R5LmZyb21DaGFpbmFibGUoXG4gICAgICAgIENoYWluLnN0YXJ0KFxuICAgICAgICAgIG5ldyBQYXNzKHRoaXMsICdTdGFydCcsIHsgcGFyYW1ldGVyczogeyBQYXlsb2FkOiB7IGk6IDAgfSB9IH0pLFxuICAgICAgICApXG4gICAgICAgICAgLm5leHQod2FpdDEpXG4gICAgICAgICAgLm5leHQoaW52b2tlKVxuICAgICAgICAgIC5uZXh0KFxuICAgICAgICAgICAgbmV3IENob2ljZSh0aGlzLCBgQ2hlY2sgaWYgcmVwYWV0ZWQgJHtyZXBlYXRDb3VudH0gdGltZXNgKVxuICAgICAgICAgICAgICAud2hlbihcbiAgICAgICAgICAgICAgICBDb25kaXRpb24ubnVtYmVyTGVzc1RoYW4oJyQuUGF5bG9hZC5pJywgcmVwZWF0Q291bnQpLFxuICAgICAgICAgICAgICAgIHdhaXQxLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5vdGhlcndpc2UoXG4gICAgICAgICAgICAgICAgQ2hhaW4uc3RhcnQod2FpdDIpLm5leHQobGFzdFRhc2spLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICApLFxuICAgIH0pO1xuICAgIGlmIChjcm9uT3B0aW9ucykge1xuICAgICAgLy8gQ3JlYXRlIEV2ZW50QnJpZGdlIHJ1bGUgdG8gaW52b2tlIHRoZSBMYW1iZGEgZnVuY3Rpb24gZXZlcnkgTiBtaW51dGVzXG4gICAgICB0aGlzLnNjaGVkdWxlID0gbmV3IEV2ZW50QnJpZGdlU2NoZWR1bGUodGhpcywgJ0V2ZW50QnJpZGdlU2NoZWR1bGUnLCB7XG4gICAgICAgIHRhcmdldDogc3RhdGVNYWNoaW5lLFxuICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUuY3Jvbihjcm9uT3B0aW9ucyksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RhcnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc3RhdGUgbWFjaGluZSBpbW1lZGlhdGVseVxuICAgICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHNjb3BlLCAnU3RhcnRTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgICAgc2VydmljZTogJ1N0ZXBGdW5jdGlvbnMnLFxuICAgICAgICAgIGFjdGlvbjogJ1N0YXJ0RXhlY3V0aW9uJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBzdGF0ZU1hY2hpbmVBcm46IHN0YXRlTWFjaGluZS5zdGF0ZU1hY2hpbmVBcm4sXG4gICAgICAgICAgICBpbnB1dDogJ3sgXCJQYXlsb2FkXCI6IHsgXCJpXCI6IDAgfSB9JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogUGh5c2ljYWxSZXNvdXJjZUlkLm9mKGAke2NyeXB0by5yYW5kb21VVUlEKCl9YCksXG4gICAgICAgIH0sXG4gICAgICAgIC8vV2lsbCBpZ25vcmUgYW55IHJlc291cmNlIGFuZCB1c2UgdGhlIGFzc3VtZWRSb2xlQXJuIGFzIHJlc291cmNlIGFuZCAnc3RzOkFzc3VtZVJvbGUnIGZvciBzZXJ2aWNlOmFjdGlvblxuICAgICAgICBwb2xpY3k6IEF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TZGtDYWxscyh7XG4gICAgICAgICAgcmVzb3VyY2VzOiBBd3NDdXN0b21SZXNvdXJjZVBvbGljeS5BTllfUkVTT1VSQ0UsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=