@remotion/lambda 4.0.45 → 4.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/log.d.ts +4 -4
- package/dist/functions/chunk-optimization/plan-frame-ranges.d.ts +4 -1
- package/dist/functions/helpers/concat-videos.d.ts +2 -1
- package/dist/functions/helpers/concat-videos.js +2 -1
- package/dist/functions/helpers/merge-chunks.d.ts +1 -0
- package/dist/functions/helpers/merge-chunks.js +4 -4
- package/dist/functions/launch.js +3 -0
- package/dist/functions/merge.js +1 -0
- package/dist/functions/still.js +1 -0
- package/dist/functions/streaming/streaming.d.ts +54 -6
- package/dist/functions/streaming/streaming.js +60 -16
- package/dist/shared/constants.d.ts +1 -0
- package/dist/shared/invoke-webhook.d.ts +0 -2
- package/package.json +9 -9
- package/remotionlambda-arm64.zip +0 -0
- package/dist/cli/helpers/validate.d.ts +0 -4
- package/dist/cli/helpers/validate.js +0 -8
package/dist/cli/log.d.ts
CHANGED
|
@@ -2,24 +2,24 @@ export declare const Log: {
|
|
|
2
2
|
verbose: (message?: any, ...optionalParams: any[]) => void;
|
|
3
3
|
verboseAdvanced: (options: {
|
|
4
4
|
indent: boolean;
|
|
5
|
-
logLevel: "
|
|
5
|
+
logLevel: "error" | "verbose" | "info" | "warn";
|
|
6
6
|
} & {
|
|
7
7
|
tag?: string | undefined;
|
|
8
8
|
}, message?: any, ...optionalParams: any[]) => void;
|
|
9
9
|
info: (message?: any, ...optionalParams: any[]) => void;
|
|
10
10
|
infoAdvanced: (options: {
|
|
11
11
|
indent: boolean;
|
|
12
|
-
logLevel: "
|
|
12
|
+
logLevel: "error" | "verbose" | "info" | "warn";
|
|
13
13
|
}, message?: any, ...optionalParams: any[]) => void;
|
|
14
14
|
warn: (message?: any, ...optionalParams: any[]) => void;
|
|
15
15
|
warnAdvanced: (options: {
|
|
16
16
|
indent: boolean;
|
|
17
|
-
logLevel: "
|
|
17
|
+
logLevel: "error" | "verbose" | "info" | "warn";
|
|
18
18
|
}, message?: any, ...optionalParams: any[]) => void;
|
|
19
19
|
error: (message?: any, ...optionalParams: any[]) => void;
|
|
20
20
|
errorAdvanced: (options: {
|
|
21
21
|
indent: boolean;
|
|
22
|
-
logLevel: "
|
|
22
|
+
logLevel: "error" | "verbose" | "info" | "warn";
|
|
23
23
|
} & {
|
|
24
24
|
tag?: string | undefined;
|
|
25
25
|
}, message?: any, ...optionalParams: any[]) => void;
|
|
@@ -11,7 +11,7 @@ export declare const getAllFilesS3: ({ bucket, expectedFiles, outdir, renderId,
|
|
|
11
11
|
expectedBucketOwner: string;
|
|
12
12
|
onErrors: (errors: EnhancedErrorInfo[]) => void;
|
|
13
13
|
}) => Promise<string[]>;
|
|
14
|
-
export declare const concatVideosS3: ({ onProgress, numberOfFrames, codec, fps, numberOfGifLoops, files, outdir, audioCodec, }: {
|
|
14
|
+
export declare const concatVideosS3: ({ onProgress, numberOfFrames, codec, fps, numberOfGifLoops, files, outdir, audioCodec, audioBitrate, }: {
|
|
15
15
|
onProgress: (frames: number) => void;
|
|
16
16
|
numberOfFrames: number;
|
|
17
17
|
codec: LambdaCodec;
|
|
@@ -20,6 +20,7 @@ export declare const concatVideosS3: ({ onProgress, numberOfFrames, codec, fps,
|
|
|
20
20
|
files: string[];
|
|
21
21
|
outdir: string;
|
|
22
22
|
audioCodec: AudioCodec | null;
|
|
23
|
+
audioBitrate: string | null;
|
|
23
24
|
}) => Promise<{
|
|
24
25
|
outfile: string;
|
|
25
26
|
cleanupChunksProm: Promise<void>;
|
|
@@ -133,7 +133,7 @@ const getAllFilesS3 = ({ bucket, expectedFiles, outdir, renderId, region, expect
|
|
|
133
133
|
});
|
|
134
134
|
};
|
|
135
135
|
exports.getAllFilesS3 = getAllFilesS3;
|
|
136
|
-
const concatVideosS3 = async ({ onProgress, numberOfFrames, codec, fps, numberOfGifLoops, files, outdir, audioCodec, }) => {
|
|
136
|
+
const concatVideosS3 = async ({ onProgress, numberOfFrames, codec, fps, numberOfGifLoops, files, outdir, audioCodec, audioBitrate, }) => {
|
|
137
137
|
const outfile = (0, node_path_1.join)(renderer_1.RenderInternals.tmpDir(constants_1.REMOTION_CONCATED_TOKEN), 'concat.' + renderer_1.RenderInternals.getFileExtensionFromCodec(codec, audioCodec));
|
|
138
138
|
const combine = (0, timer_1.timer)('Combine videos');
|
|
139
139
|
const filelistDir = renderer_1.RenderInternals.tmpDir(constants_1.REMOTION_FILELIST_TOKEN);
|
|
@@ -147,6 +147,7 @@ const concatVideosS3 = async ({ onProgress, numberOfFrames, codec, fps, numberOf
|
|
|
147
147
|
fps,
|
|
148
148
|
numberOfGifLoops,
|
|
149
149
|
audioCodec,
|
|
150
|
+
audioBitrate,
|
|
150
151
|
});
|
|
151
152
|
combine.end();
|
|
152
153
|
const cleanupChunksProm = node_fs_1.default.promises.rm(outdir, {
|
|
@@ -23,12 +23,11 @@ const write_post_render_data_1 = require("./write-post-render-data");
|
|
|
23
23
|
const mergeChunksAndFinishRender = async (options) => {
|
|
24
24
|
let lastProgressUploaded = 0;
|
|
25
25
|
const onProgress = (framesEncoded) => {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
if (deltaSinceLastProgressUploaded < 0.1) {
|
|
26
|
+
const deltaSinceLastProgressUploaded = framesEncoded - lastProgressUploaded;
|
|
27
|
+
if (deltaSinceLastProgressUploaded < 200) {
|
|
29
28
|
return;
|
|
30
29
|
}
|
|
31
|
-
lastProgressUploaded =
|
|
30
|
+
lastProgressUploaded = framesEncoded;
|
|
32
31
|
(0, io_1.lambdaWriteFile)({
|
|
33
32
|
bucketName: options.bucketName,
|
|
34
33
|
key: (0, constants_1.encodingProgressKey)(options.renderId),
|
|
@@ -100,6 +99,7 @@ const mergeChunksAndFinishRender = async (options) => {
|
|
|
100
99
|
files,
|
|
101
100
|
outdir,
|
|
102
101
|
audioCodec: options.audioCodec,
|
|
102
|
+
audioBitrate: options.audioBitrate,
|
|
103
103
|
});
|
|
104
104
|
const encodingStop = Date.now();
|
|
105
105
|
const outputSize = fs_1.default.statSync(outfile);
|
package/dist/functions/launch.js
CHANGED
|
@@ -206,6 +206,7 @@ const innerLaunchHandler = async ({ functionName, params, options, onAllChunksAv
|
|
|
206
206
|
deleteAfter: params.deleteAfter,
|
|
207
207
|
numberOfGifLoops: params.numberOfGifLoops,
|
|
208
208
|
downloadBehavior: params.downloadBehavior,
|
|
209
|
+
audioBitrate: params.audioBitrate,
|
|
209
210
|
};
|
|
210
211
|
const { key, renderBucketName, customCredentials } = (0, expected_out_name_1.getExpectedOutName)(renderMetadata, params.bucketName, typeof params.outName === 'string' || typeof params.outName === 'undefined'
|
|
211
212
|
? null
|
|
@@ -265,6 +266,7 @@ const innerLaunchHandler = async ({ functionName, params, options, onAllChunksAv
|
|
|
265
266
|
verbose,
|
|
266
267
|
renderMetadata,
|
|
267
268
|
onAllChunks: onAllChunksAvailable,
|
|
269
|
+
audioBitrate: params.audioBitrate,
|
|
268
270
|
});
|
|
269
271
|
return postRenderData;
|
|
270
272
|
};
|
|
@@ -468,6 +470,7 @@ const launchHandler = async (params, options) => {
|
|
|
468
470
|
expectedBucketOwner: options.expectedBucketOwner,
|
|
469
471
|
renderId: params.renderId,
|
|
470
472
|
});
|
|
473
|
+
renderer_1.RenderInternals.Log.error('Wrote error to S3');
|
|
471
474
|
clearTimeout(webhookDueToTimeout);
|
|
472
475
|
if (params.webhook && !webhookInvoked) {
|
|
473
476
|
try {
|
package/dist/functions/merge.js
CHANGED
|
@@ -50,6 +50,7 @@ const mergeHandler = async (params, options) => {
|
|
|
50
50
|
onAllChunks: () => {
|
|
51
51
|
renderer_1.RenderInternals.Log.info('All chunks have been downloaded now.');
|
|
52
52
|
},
|
|
53
|
+
audioBitrate: renderMetadata.audioBitrate,
|
|
53
54
|
});
|
|
54
55
|
return { type: 'success', postRenderData };
|
|
55
56
|
};
|
package/dist/functions/still.js
CHANGED
|
@@ -117,6 +117,7 @@ const innerStillHandler = async ({ params: lambdaParams, expectedBucketOwner, re
|
|
|
117
117
|
deleteAfter: lambdaParams.deleteAfter,
|
|
118
118
|
numberOfGifLoops: null,
|
|
119
119
|
downloadBehavior: lambdaParams.downloadBehavior,
|
|
120
|
+
audioBitrate: null,
|
|
120
121
|
};
|
|
121
122
|
await (0, io_1.lambdaWriteFile)({
|
|
122
123
|
bucketName,
|
|
@@ -1,12 +1,60 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
declare const framesRendered: "frames-rendered";
|
|
3
|
+
declare const errorOccurred: "error-occurred";
|
|
4
|
+
declare const renderIdDetermined: "render-id-determined";
|
|
5
|
+
declare const chunkRendered: "chunk-rendered";
|
|
6
|
+
declare const messageTypes: {
|
|
7
|
+
readonly '1': {
|
|
8
|
+
readonly type: "frames-rendered";
|
|
9
|
+
};
|
|
10
|
+
readonly '2': {
|
|
11
|
+
readonly type: "error-occurred";
|
|
12
|
+
};
|
|
13
|
+
readonly '3': {
|
|
14
|
+
readonly type: "render-id-determined";
|
|
15
|
+
};
|
|
16
|
+
readonly '4': {
|
|
17
|
+
readonly type: "chunk-rendered";
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
type MessageTypeId = keyof typeof messageTypes;
|
|
21
|
+
type MessageType = (typeof messageTypes)[MessageTypeId]['type'];
|
|
22
|
+
export declare const formatMap: {
|
|
23
|
+
[key in MessageType]: 'json' | 'binary';
|
|
5
24
|
};
|
|
6
|
-
export declare const makePayloadMessage: (nonce: number, data: Buffer, status: 0 | 1) => Buffer;
|
|
7
25
|
export type StreamingPayload = {
|
|
8
|
-
type:
|
|
9
|
-
|
|
26
|
+
type: typeof framesRendered;
|
|
27
|
+
payload: {
|
|
28
|
+
frames: number;
|
|
29
|
+
};
|
|
30
|
+
} | {
|
|
31
|
+
type: typeof chunkRendered;
|
|
32
|
+
payload: Buffer;
|
|
33
|
+
} | {
|
|
34
|
+
type: typeof errorOccurred;
|
|
35
|
+
payload: {
|
|
36
|
+
error: string;
|
|
37
|
+
};
|
|
38
|
+
} | {
|
|
39
|
+
type: typeof renderIdDetermined;
|
|
40
|
+
payload: {
|
|
41
|
+
renderId: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export declare const messageTypeIdToMessage: (messageTypeId: MessageTypeId) => MessageType;
|
|
45
|
+
export declare const messageTypeToMessageId: (messageType: MessageType) => MessageTypeId;
|
|
46
|
+
export type OnMessage = (options: {
|
|
47
|
+
successType: 'error' | 'success';
|
|
48
|
+
message: StreamingPayload;
|
|
49
|
+
}) => void;
|
|
50
|
+
export declare const makeStreaming: (options: {
|
|
51
|
+
onMessage: OnMessage;
|
|
52
|
+
}) => {
|
|
53
|
+
addData: (data: Buffer) => void;
|
|
10
54
|
};
|
|
55
|
+
export declare const makePayloadMessage: ({ message, status, }: {
|
|
56
|
+
message: StreamingPayload;
|
|
57
|
+
status: 0 | 1;
|
|
58
|
+
}) => Buffer;
|
|
11
59
|
export type OnStream = (payload: StreamingPayload) => void;
|
|
12
60
|
export {};
|
|
@@ -1,21 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.makePayloadMessage = exports.makeStreaming = void 0;
|
|
4
|
-
const
|
|
3
|
+
exports.makePayloadMessage = exports.makeStreaming = exports.messageTypeToMessageId = exports.messageTypeIdToMessage = exports.formatMap = void 0;
|
|
4
|
+
const framesRendered = 'frames-rendered';
|
|
5
|
+
const errorOccurred = 'error-occurred';
|
|
6
|
+
const renderIdDetermined = 'render-id-determined';
|
|
7
|
+
const chunkRendered = 'chunk-rendered';
|
|
8
|
+
const messageTypes = {
|
|
9
|
+
'1': { type: framesRendered },
|
|
10
|
+
'2': { type: errorOccurred },
|
|
11
|
+
'3': { type: renderIdDetermined },
|
|
12
|
+
'4': { type: chunkRendered },
|
|
13
|
+
};
|
|
14
|
+
exports.formatMap = {
|
|
15
|
+
[framesRendered]: 'json',
|
|
16
|
+
[errorOccurred]: 'json',
|
|
17
|
+
[renderIdDetermined]: 'json',
|
|
18
|
+
[chunkRendered]: 'binary',
|
|
19
|
+
};
|
|
20
|
+
const messageTypeIdToMessage = (messageTypeId) => {
|
|
21
|
+
const types = messageTypes[messageTypeId];
|
|
22
|
+
if (!types) {
|
|
23
|
+
throw new Error(`Unknown message type id ${messageTypeId}`);
|
|
24
|
+
}
|
|
25
|
+
return types.type;
|
|
26
|
+
};
|
|
27
|
+
exports.messageTypeIdToMessage = messageTypeIdToMessage;
|
|
28
|
+
const messageTypeToMessageId = (messageType) => {
|
|
29
|
+
const id = Object.keys(messageTypes).find((key) => messageTypes[key].type === messageType);
|
|
30
|
+
if (!id) {
|
|
31
|
+
throw new Error(`Unknown message type ${messageType}`);
|
|
32
|
+
}
|
|
33
|
+
return id;
|
|
34
|
+
};
|
|
35
|
+
exports.messageTypeToMessageId = messageTypeToMessageId;
|
|
36
|
+
const magicSeparator = Buffer.from('remotion_buffer:');
|
|
37
|
+
const makeStreaming = (options) => {
|
|
5
38
|
let outputBuffer = Buffer.from('');
|
|
6
|
-
const separator = Buffer.from('remotion_buffer:');
|
|
7
39
|
let unprocessedBuffers = [];
|
|
8
40
|
let missingData = null;
|
|
9
41
|
const processInput = () => {
|
|
10
|
-
let separatorIndex = outputBuffer.indexOf(
|
|
42
|
+
let separatorIndex = outputBuffer.indexOf(magicSeparator);
|
|
11
43
|
if (separatorIndex === -1) {
|
|
12
44
|
return;
|
|
13
45
|
}
|
|
14
|
-
separatorIndex +=
|
|
15
|
-
let
|
|
46
|
+
separatorIndex += magicSeparator.length;
|
|
47
|
+
let messageTypeString = '';
|
|
16
48
|
let lengthString = '';
|
|
17
49
|
let statusString = '';
|
|
18
|
-
// Each message
|
|
50
|
+
// Each message has the structure with `remotion_buffer:{[message_type_id]}:{[length]}`
|
|
19
51
|
// Let's read the buffer to extract the nonce, and if the full length is available,
|
|
20
52
|
// we'll extract the data and pass it to the callback.
|
|
21
53
|
// eslint-disable-next-line no-constant-condition
|
|
@@ -27,7 +59,7 @@ const makeStreaming = (onMessage) => {
|
|
|
27
59
|
break;
|
|
28
60
|
}
|
|
29
61
|
separatorIndex++;
|
|
30
|
-
|
|
62
|
+
messageTypeString += String.fromCharCode(nextDigit);
|
|
31
63
|
}
|
|
32
64
|
// eslint-disable-next-line no-constant-condition
|
|
33
65
|
while (true) {
|
|
@@ -58,7 +90,17 @@ const makeStreaming = (onMessage) => {
|
|
|
58
90
|
return;
|
|
59
91
|
}
|
|
60
92
|
const data = outputBuffer.subarray(separatorIndex + 1, separatorIndex + 1 + Number(lengthString));
|
|
61
|
-
|
|
93
|
+
const messageType = (0, exports.messageTypeIdToMessage)(messageTypeString);
|
|
94
|
+
const payload = {
|
|
95
|
+
type: messageType,
|
|
96
|
+
payload: exports.formatMap[messageType] === 'json'
|
|
97
|
+
? JSON.parse(data.toString('utf-8'))
|
|
98
|
+
: data,
|
|
99
|
+
};
|
|
100
|
+
options.onMessage({
|
|
101
|
+
successType: status === 1 ? 'error' : 'success',
|
|
102
|
+
message: payload,
|
|
103
|
+
});
|
|
62
104
|
missingData = null;
|
|
63
105
|
outputBuffer = outputBuffer.subarray(separatorIndex + Number(lengthString) + 1);
|
|
64
106
|
processInput();
|
|
@@ -66,7 +108,7 @@ const makeStreaming = (onMessage) => {
|
|
|
66
108
|
return {
|
|
67
109
|
addData: (data) => {
|
|
68
110
|
unprocessedBuffers.push(data);
|
|
69
|
-
const separatorIndex = data.indexOf(
|
|
111
|
+
const separatorIndex = data.indexOf(magicSeparator);
|
|
70
112
|
if (separatorIndex === -1) {
|
|
71
113
|
if (missingData) {
|
|
72
114
|
missingData.dataMissing -= data.length;
|
|
@@ -78,22 +120,24 @@ const makeStreaming = (onMessage) => {
|
|
|
78
120
|
unprocessedBuffers.unshift(outputBuffer);
|
|
79
121
|
outputBuffer = Buffer.concat(unprocessedBuffers);
|
|
80
122
|
unprocessedBuffers = [];
|
|
81
|
-
console.log('the unprocessed input is now', new TextDecoder('utf-8').decode(outputBuffer));
|
|
82
123
|
processInput();
|
|
83
124
|
},
|
|
84
125
|
};
|
|
85
126
|
};
|
|
86
127
|
exports.makeStreaming = makeStreaming;
|
|
87
|
-
const makePayloadMessage = (
|
|
128
|
+
const makePayloadMessage = ({ message, status, }) => {
|
|
129
|
+
const body = exports.formatMap[message.type] === 'json'
|
|
130
|
+
? Buffer.from(JSON.stringify(message.payload))
|
|
131
|
+
: message.payload;
|
|
88
132
|
const concat = Buffer.concat([
|
|
89
|
-
|
|
90
|
-
Buffer.from(
|
|
133
|
+
magicSeparator,
|
|
134
|
+
Buffer.from((0, exports.messageTypeToMessageId)(message.type).toString()),
|
|
91
135
|
Buffer.from(':'),
|
|
92
|
-
Buffer.from(
|
|
136
|
+
Buffer.from(body.length.toString()),
|
|
93
137
|
Buffer.from(':'),
|
|
94
138
|
Buffer.from(String(status)),
|
|
95
139
|
Buffer.from(':'),
|
|
96
|
-
|
|
140
|
+
body,
|
|
97
141
|
]);
|
|
98
142
|
return concat;
|
|
99
143
|
};
|
|
@@ -329,6 +329,7 @@ export type RenderMetadata = Discriminated & {
|
|
|
329
329
|
everyNthFrame: number;
|
|
330
330
|
deleteAfter: DeleteAfter | null;
|
|
331
331
|
numberOfGifLoops: number | null;
|
|
332
|
+
audioBitrate: string | null;
|
|
332
333
|
downloadBehavior: DownloadBehavior;
|
|
333
334
|
};
|
|
334
335
|
export type AfterRenderCost = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotion/lambda",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.46",
|
|
4
4
|
"description": "Distributed renderer for Remotion based on AWS Lambda",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
"@aws-sdk/s3-request-presigner": "3.382.0",
|
|
26
26
|
"aws-policies": "^1.0.1",
|
|
27
27
|
"mime-types": "2.1.34",
|
|
28
|
-
"zod": "3.
|
|
29
|
-
"@remotion/
|
|
30
|
-
"
|
|
31
|
-
"@remotion/renderer": "4.0.
|
|
32
|
-
"remotion": "4.0.
|
|
28
|
+
"zod": "3.22.3",
|
|
29
|
+
"@remotion/bundler": "4.0.46",
|
|
30
|
+
"remotion": "4.0.46",
|
|
31
|
+
"@remotion/renderer": "4.0.46",
|
|
32
|
+
"@remotion/cli": "4.0.46"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@jonny/eslint-config": "3.0.266",
|
|
@@ -43,11 +43,11 @@
|
|
|
43
43
|
"ts-node": "^10.8.0",
|
|
44
44
|
"vitest": "0.31.1",
|
|
45
45
|
"zip-lib": "^0.7.2",
|
|
46
|
-
"@remotion/bundler": "4.0.
|
|
47
|
-
"@remotion/compositor-linux-arm64-gnu": "4.0.
|
|
46
|
+
"@remotion/bundler": "4.0.46",
|
|
47
|
+
"@remotion/compositor-linux-arm64-gnu": "4.0.46"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@remotion/bundler": "4.0.
|
|
50
|
+
"@remotion/bundler": "4.0.46"
|
|
51
51
|
},
|
|
52
52
|
"publishConfig": {
|
|
53
53
|
"access": "public"
|
package/remotionlambda-arm64.zip
CHANGED
|
Binary file
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateDurationInFrames = exports.validateDimension = exports.validateFps = void 0;
|
|
4
|
-
/* eslint-disable prefer-destructuring */
|
|
5
|
-
const remotion_1 = require("remotion");
|
|
6
|
-
exports.validateFps = remotion_1.Internals.validateFps;
|
|
7
|
-
exports.validateDimension = remotion_1.Internals.validateDimension;
|
|
8
|
-
exports.validateDurationInFrames = remotion_1.Internals.validateDurationInFrames;
|