UNPKG

@eyevinn/iaf-plugin-aws

Version:

Eyevinn Ingest Application Framework (IAF) plugin for upload and transcode in AWS

358 lines 16 kB
"use strict"; 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