@eyevinn/iaf-plugin-aws
Version:
Eyevinn Ingest Application Framework (IAF) plugin for upload and transcode in AWS
358 lines • 16 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const aws_sdk_client_mock_1 = require("aws-sdk-client-mock");
const client_mediaconvert_1 = require("@aws-sdk/client-mediaconvert");
const mediaConvertDispatcher_1 = require("./mediaConvertDispatcher");
const fs = __importStar(require("fs"));
const logger_1 = __importDefault(require("./utils/logger"));
jest.mock('fs');
const logger = new logger_1.default();
const mockParams = {
"Settings": {
"Inputs": [
{}
],
"OutputGroups": [
{
"Name": "testName",
"Outputs": [
{
"OutputSettings": {
"HlsSettings": {}
},
}
],
"OutputGroupSettings": {
"Type": "HLS_GROUP_SETTINGS",
"HlsGroupSettings": {
"SegmentLength": 10,
"Destination": "PLACEHOLDER",
"MinSegmentLength": 0
}
},
"AutomatedEncodingSettings": {
"AbrSettings": {
"MaxAbrBitrate": 5000000
}
}
}
],
"TimecodeConfig": {
"Source": "ZEROBASED"
}
},
"Role": "placeholder"
};
const getJob = {
$metadata: {
httpStatusCode: 200,
requestId: 'c6ff334a-990f-47ea-80da-1bd825fa04ce',
cfId: 'e12345bA==',
attempts: 1,
totalRetryDelay: 0,
},
Job: {
AccelerationSettings: { Mode: 'DISABLED' },
AccelerationStatus: 'NOT_APPLICABLE',
Arn: 'arn:aws:mediaconvert:eu-north-1:1234:jobs/123456-61zf86',
Id: '123456-61zf86',
Messages: { Info: [], Warning: [] },
Priority: 0,
Queue: 'arn:aws:mediaconvert:eu-north-1:123456789:queues/Default',
Role: 'arn:aws:iam::1234:role/MediaConvert_Default_Role',
Settings: {
Inputs: [
{
AudioSelectors: {
'Audio Selector 1': { DefaultSelection: 'DEFAULT' },
},
FileInput: 's3://inputBucket/test-file.mp4',
TimecodeSource: 'ZEROBASED',
VideoSelector: { ColorSpace: 'FOLLOW' },
},
],
OutputGroups: [
{
Name: 'HLS',
OutputGroupSettings: {
HlsGroupSettings: {
Destination: 's3://outputBucket/test-file.mp4/manifest',
MinSegmentLength: 0,
SegmentLength: 6,
},
Type: 'HLS_GROUP_SETTINGS',
},
Outputs: [
{
ContainerSettings: { Container: 'M3U8', M3u8Settings: {} },
NameModifier: '1080p8300',
OutputSettings: { HlsSettings: {} },
VideoDescription: {
CodecSettings: {
Codec: 'H_264',
H264Settings: {
Bitrate: 8300000,
CodecProfile: 'HIGH',
RateControlMode: 'CBR',
},
},
Height: 1080,
Width: 1920,
},
},
{
AudioDescriptions: [
{
AudioSourceName: 'Audio Selector 1',
CodecSettings: {
AacSettings: {
Bitrate: 192000,
CodecProfile: 'LC',
CodingMode: 'CODING_MODE_2_0',
SampleRate: 44100,
},
Codec: 'AAC',
},
LanguageCode: 'ENG',
LanguageCodeControl: 'USE_CONFIGURED',
StreamName: 'Stereo',
},
],
ContainerSettings: { Container: 'M3U8', M3u8Settings: {} },
NameModifier: '_stereo',
OutputSettings: {
HlsSettings: {
AudioGroupId: 'default-audio-group',
AudioTrackType: 'ALTERNATE_AUDIO_AUTO_SELECT',
},
},
},
{
AudioDescriptions: [
{
AudioSourceName: 'Audio Selector 1',
CodecSettings: {
Codec: 'EAC3',
Eac3Settings: {
Bitrate: 384000,
CodingMode: 'CODING_MODE_3_2',
},
},
LanguageCode: 'ENG',
LanguageCodeControl: 'USE_CONFIGURED',
StreamName: 'Surround',
},
],
ContainerSettings: { Container: 'M3U8', M3u8Settings: {} },
NameModifier: '_51_surround',
OutputSettings: {
HlsSettings: {
AudioGroupId: 'default-audio-group',
AudioTrackType: 'ALTERNATE_AUDIO_AUTO_SELECT_DEFAULT',
},
},
},
],
},
],
TimecodeConfig: { Source: 'ZEROBASED' },
},
Status: 'SUBMITTED',
StatusUpdateInterval: 'SECONDS_60',
UserMetadata: {},
},
};
jest.spyOn(fs, 'readFileSync').mockReturnValue(JSON.stringify(mockParams));
const mcMock = (0, aws_sdk_client_mock_1.mockClient)(client_mediaconvert_1.MediaConvertClient);
const dispatcher = new mediaConvertDispatcher_1.MediaConvertDispatcher("testString1", "testRegion1", "inputBucket", "outputBucket", "fakeARN", "playlistName", null, logger);
beforeEach(() => {
mcMock.reset();
});
test("Should return transcoding job data on successful dispatch", () => __awaiter(void 0, void 0, void 0, function* () {
const mockResp = {
"$metadata": {
httpStatusCode: 201
},
Job: {
Id: "1",
Role: "test",
Settings: {}
}
};
//TODO: finish this test
mcMock.on(client_mediaconvert_1.CreateJobCommand).resolves(mockResp);
const response = yield dispatcher.dispatch("filename");
expect(response).toStrictEqual(mockResp);
}));
test("Should return transcoding job data on successful dispatch with custom encodeParams", () => __awaiter(void 0, void 0, void 0, function* () {
let encodeParams = JSON.stringify(mockParams);
const customDispatcher = new mediaConvertDispatcher_1.MediaConvertDispatcher("testString1", "testRegion1", "inputBucket", "outputBucket", "fakeARN", "playlistName", encodeParams, logger);
const mockResp = {
"$metadata": {
httpStatusCode: 201
},
Job: {
Id: "1",
Role: "test",
Settings: {}
}
};
//TODO: finish this test
mcMock.on(client_mediaconvert_1.CreateJobCommand).resolves(mockResp);
const response = yield customDispatcher.dispatch("filename");
expect(response).toStrictEqual(mockResp);
}));
test("Should throw an error when failing to dispatch the job", () => __awaiter(void 0, void 0, void 0, function* () {
const mockErr = "Failed to create transcoding job!";
mcMock.on(client_mediaconvert_1.CreateJobCommand).rejects(mockErr);
yield expect(dispatcher.dispatch("filename"))
.rejects
.toThrow(mockErr);
}));
test("Should return job info", () => __awaiter(void 0, void 0, void 0, function* () {
const mockResp = {
AccelerationSettings: { Mode: 'DISABLED' },
AccelerationStatus: 'NOT_APPLICABLE',
Arn: 'arn:aws:mediaconvert:eu-north-1:1234:jobs/123456-61zf86',
Id: '123456-61zf86',
Messages: { Info: [], Warning: [] },
Priority: 0,
Queue: 'arn:aws:mediaconvert:eu-north-1:123456789:queues/Default',
Role: 'arn:aws:iam::1234:role/MediaConvert_Default_Role',
Settings: {
Inputs: [
{
AudioSelectors: {
'Audio Selector 1': { DefaultSelection: 'DEFAULT' },
},
FileInput: 's3://inputBucket/test-file.mp4',
TimecodeSource: 'ZEROBASED',
VideoSelector: { ColorSpace: 'FOLLOW' },
},
],
OutputGroups: [
{
Name: 'HLS',
OutputGroupSettings: {
HlsGroupSettings: {
Destination: 's3://outputBucket/test-file.mp4/manifest',
MinSegmentLength: 0,
SegmentLength: 6,
},
Type: 'HLS_GROUP_SETTINGS',
},
Outputs: [
{
ContainerSettings: { Container: 'M3U8', M3u8Settings: {} },
NameModifier: '1080p8300',
OutputSettings: { HlsSettings: {} },
VideoDescription: {
CodecSettings: {
Codec: 'H_264',
H264Settings: {
Bitrate: 8300000,
CodecProfile: 'HIGH',
RateControlMode: 'CBR',
},
},
Height: 1080,
Width: 1920,
},
},
{
AudioDescriptions: [
{
AudioSourceName: 'Audio Selector 1',
CodecSettings: {
AacSettings: {
Bitrate: 192000,
CodecProfile: 'LC',
CodingMode: 'CODING_MODE_2_0',
SampleRate: 44100,
},
Codec: 'AAC',
},
LanguageCode: 'ENG',
LanguageCodeControl: 'USE_CONFIGURED',
StreamName: 'Stereo',
},
],
ContainerSettings: { Container: 'M3U8', M3u8Settings: {} },
NameModifier: '_stereo',
OutputSettings: {
HlsSettings: {
AudioGroupId: 'default-audio-group',
AudioTrackType: 'ALTERNATE_AUDIO_AUTO_SELECT',
},
},
},
{
AudioDescriptions: [
{
AudioSourceName: 'Audio Selector 1',
CodecSettings: {
Codec: 'EAC3',
Eac3Settings: {
Bitrate: 384000,
CodingMode: 'CODING_MODE_3_2',
},
},
LanguageCode: 'ENG',
LanguageCodeControl: 'USE_CONFIGURED',
StreamName: 'Surround',
},
],
ContainerSettings: { Container: 'M3U8', M3u8Settings: {} },
NameModifier: '_51_surround',
OutputSettings: {
HlsSettings: {
AudioGroupId: 'default-audio-group',
AudioTrackType: 'ALTERNATE_AUDIO_AUTO_SELECT_DEFAULT',
},
},
},
],
},
],
TimecodeConfig: { Source: 'ZEROBASED' },
},
Status: 'SUBMITTED',
StatusUpdateInterval: 'SECONDS_60',
UserMetadata: {},
};
mcMock.on(client_mediaconvert_1.GetJobCommand).resolves(getJob);
const response = yield dispatcher.getJob("123456-61zf86");
expect(response).toStrictEqual(mockResp);
}));
//# sourceMappingURL=mediaConvertDispatcher.test.js.map