in provider-utils/awscloudformation/cloudformation-templates/livestream-helpers/LambdaFunctions/psdemo-js-live-workflow_v0.4.0/lib/babelfish.js [501:626]
async update() {
// first get existing endpoints
const diff = this.compareUpdates(this.$event.OldResourceProperties, this.$event.ResourceProperties);
if (Object.keys(diff).length === 0) {
return 'Nothing has changed';
}
const response = await this.describeChannel();
const {
OriginEndpoints,
} = await this.listOrigins();
const { Id, Arn, HlsIngest: { IngestEndpoints } } = response;
this.storeResponseData('Id', Id);
this.storeResponseData('Arn', Arn);
/* store parameters as list, comma separator */
['Url', 'Username', 'Password'].forEach((k) => {
this.storeResponseData(k, IngestEndpoints.map(x => x[k]).join(','));
});
const streamsUp = OriginEndpoints.map(x => x.Id.replace(`${this.channelId.toLowerCase()}-`, '').toUpperCase());
let promises = streamsUp.map((x) => {
const location = diff.PS_ENDPOINTS.indexOf(x);
let params;
if (location >= 0) {
// Update'
switch (x.toLowerCase()) {
case 'hls':
params = this.createHlsPackageParams();
break;
case 'dash':
params = this.createDashPackageParams();
break;
case 'mss':
params = this.createMssPackageParams();
break;
case 'cmaf':
params = this.createCmafPackageParams();
break;
}
delete params.ChannelId;
diff.PS_ENDPOINTS.splice(location, 1);
return (params !== undefined)
? this.babelfish.updateOriginEndpoint(params).promise()
: undefined;
}
// Delete
return this.babelfish.deleteOriginEndpoint({ Id: `${this.channelId.toLowerCase()}-${x.toLowerCase()}` }).promise();
});
if (diff.PS_ENDPOINTS) {
const createPromises = diff.PS_ENDPOINTS.map((endpoint) => {
let params;
switch (endpoint.toLowerCase()) {
case 'hls':
params = this.createHlsPackageParams();
break;
case 'dash':
params = this.createDashPackageParams();
break;
case 'mss':
params = this.createMssPackageParams();
break;
case 'cmaf':
params = this.createCmafPackageParams();
break;
default:
console.log(`${endpoint} NOT IMPL`);
params = undefined;
}
return (params !== undefined)
? this.babelfish.createOriginEndpoint(params).promise()
: undefined;
});
promises = promises.concat(createPromises);
}
const responses = await Promise.all(promises);
/* even if package is not created, we still need to report it to CF */
const initSettings = {
HlsEndpoint: '',
DashEndpoint: '',
MssEndpoint: '',
CmafEndpoint: '',
};
const results = responses.filter(x => Object.keys(x).length > 0).reduce((acc, cur) => {
const {
Url, CmafPackage, DashPackage, HlsPackage, MssPackage,
} = cur;
if (Object.keys(cur).length != 0) {
}
acc.DomainEndpoint = acc.DomainEndpoint || new Set();
console.log(cur);
acc.DomainEndpoint.add(URL.parse(Url).hostname);
if (HlsPackage) {
return Object.assign({}, acc, { HlsEndpoint: Url });
}
if (DashPackage) {
return Object.assign({}, acc, { DashEndpoint: Url });
}
if (MssPackage) {
return Object.assign({}, acc, { MssEndpoint: Url });
}
if (CmafPackage) {
return Object.assign({}, acc, { CmafEndpoint: CmafPackage.HlsManifests[0].Url });
}
return acc;
}, initSettings);
/* serialize DomainName array */
// results.DomainEndpoint = Array.from(results.DomainEndpoint).join(',');
/**
* CAUTION: AWS::CloudFront::Distribution could only take a single origin (string)
* If we would need to support multiple origins, we might need to go with CustomResource!
*/
const [DomainEndpoint] = Array.from(results.DomainEndpoint);
results.DomainEndpoint = DomainEndpoint;
this.storeResponseData('ParameterStoreKey', `${this.ssmKey}-0,${this.ssmKey}-1`);
Object.keys(results).forEach(x => this.storeResponseData(x, results[x]));
console.log(`responseData = ${JSON.stringify(this.responseData, null, 2)}`);
return this.responseData;
}