@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 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: "verbose" | "info" | "warn" | "error";
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: "verbose" | "info" | "warn" | "error";
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: "verbose" | "info" | "warn" | "error";
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: "verbose" | "info" | "warn" | "error";
22
+ logLevel: "error" | "verbose" | "info" | "warn";
23
23
  } & {
24
24
  tag?: string | undefined;
25
25
  }, message?: any, ...optionalParams: any[]) => void;
@@ -3,5 +3,8 @@ export declare const planFrameRanges: ({ framesPerLambda, frameRange, everyNthFr
3
3
  frameRange: [number, number];
4
4
  everyNthFrame: number;
5
5
  }) => {
6
- chunks: [number, number][];
6
+ chunks: [
7
+ number,
8
+ number
9
+ ][];
7
10
  };
@@ -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, {
@@ -27,4 +27,5 @@ export declare const mergeChunksAndFinishRender: (options: {
27
27
  serializedResolvedProps: SerializedInputProps;
28
28
  renderMetadata: RenderMetadata;
29
29
  onAllChunks: OnAllChunksAvailable;
30
+ audioBitrate: string | null;
30
31
  }) => Promise<PostRenderData>;
@@ -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 relativeProgress = framesEncoded / options.frameCountLength;
27
- const deltaSinceLastProgressUploaded = relativeProgress - lastProgressUploaded;
28
- if (deltaSinceLastProgressUploaded < 0.1) {
26
+ const deltaSinceLastProgressUploaded = framesEncoded - lastProgressUploaded;
27
+ if (deltaSinceLastProgressUploaded < 200) {
29
28
  return;
30
29
  }
31
- lastProgressUploaded = relativeProgress;
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);
@@ -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 {
@@ -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
  };
@@ -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
- type OnMessage = (type: 'error' | 'success', nonce: string, data: Buffer) => void;
3
- export declare const makeStreaming: (onMessage: OnMessage) => {
4
- addData: (data: Buffer) => void;
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: 'frames-rendered';
9
- frames: number;
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 makeStreaming = (onMessage) => {
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(separator);
42
+ let separatorIndex = outputBuffer.indexOf(magicSeparator);
11
43
  if (separatorIndex === -1) {
12
44
  return;
13
45
  }
14
- separatorIndex += separator.length;
15
- let nonceString = '';
46
+ separatorIndex += magicSeparator.length;
47
+ let messageTypeString = '';
16
48
  let lengthString = '';
17
49
  let statusString = '';
18
- // Each message from Rust is prefixed with `remotion_buffer;{[nonce]}:{[length]}`
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
- nonceString += String.fromCharCode(nextDigit);
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
- onMessage(status === 1 ? 'error' : 'success', nonceString, data);
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(separator);
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 = (nonce, data, status) => {
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
- Buffer.from('remotion_buffer:'),
90
- Buffer.from(nonce.toString()),
133
+ magicSeparator,
134
+ Buffer.from((0, exports.messageTypeToMessageId)(message.type).toString()),
91
135
  Buffer.from(':'),
92
- Buffer.from(data.length.toString()),
136
+ Buffer.from(body.length.toString()),
93
137
  Buffer.from(':'),
94
138
  Buffer.from(String(status)),
95
139
  Buffer.from(':'),
96
- data,
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 = {
@@ -1,5 +1,3 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
1
  import https from 'https';
4
2
  import http from 'node:http';
5
3
  import type { EnhancedErrorInfo } from '../functions/helpers/write-lambda-error';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/lambda",
3
- "version": "4.0.45",
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.21.4",
29
- "@remotion/cli": "4.0.45",
30
- "@remotion/bundler": "4.0.45",
31
- "@remotion/renderer": "4.0.45",
32
- "remotion": "4.0.45"
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.45",
47
- "@remotion/compositor-linux-arm64-gnu": "4.0.45"
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.45"
50
+ "@remotion/bundler": "4.0.46"
51
51
  },
52
52
  "publishConfig": {
53
53
  "access": "public"
Binary file
@@ -1,4 +0,0 @@
1
- import { Internals } from 'remotion';
2
- export declare const validateFps: typeof Internals.validateFps;
3
- export declare const validateDimension: typeof Internals.validateDimension;
4
- export declare const validateDurationInFrames: typeof Internals.validateDurationInFrames;
@@ -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;