@remotion/lambda-client 4.0.320 → 4.0.322

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.
@@ -1,6 +1,6 @@
1
1
 
2
2
  
3
- > @remotion/lambda-client@4.0.320 make /Users/jonathanburger/remotion/packages/lambda-client
3
+ > @remotion/lambda-client@4.0.322 make /Users/jonathanburger/remotion/packages/lambda-client
4
4
  > tsc -d && bun --env-file=../.env.bundle bundle.ts
5
5
 
6
- [78.91ms] Generated.
6
+ [150.24ms] Generated.
@@ -16637,7 +16637,6 @@ var customOutName = (renderId, bucketName, name) => {
16637
16637
  };
16638
16638
  var overallProgressKey = (renderId) => `${rendersPrefix(renderId)}/progress.json`;
16639
16639
  var MAX_FUNCTIONS_PER_RENDER = 200;
16640
- var MINIMUM_FRAMES_PER_FUNCTIONS = 4;
16641
16640
  var validateDownloadBehavior = (downloadBehavior) => {
16642
16641
  if (downloadBehavior === null || downloadBehavior === undefined) {
16643
16642
  return null;
@@ -16655,34 +16654,7 @@ var validateDownloadBehavior = (downloadBehavior) => {
16655
16654
  }
16656
16655
  }
16657
16656
  };
16658
- var validateFramesPerFunction = ({
16659
- framesPerFunction,
16660
- durationInFrames
16661
- }) => {
16662
- if (framesPerFunction === null) {
16663
- return;
16664
- }
16665
- if (framesPerFunction === undefined) {
16666
- return;
16667
- }
16668
- if (typeof framesPerFunction !== "number") {
16669
- throw new TypeError(`'framesPerLambda' needs to be a number, passed ${JSON.stringify(framesPerFunction)}`);
16670
- }
16671
- if (!Number.isFinite(framesPerFunction)) {
16672
- throw new TypeError(`'framesPerLambda' needs to be finite, passed ${framesPerFunction}`);
16673
- }
16674
- if (Number.isNaN(framesPerFunction)) {
16675
- throw new TypeError(`'framesPerLambda' needs to be NaN, passed ${framesPerFunction}`);
16676
- }
16677
- if (framesPerFunction % 1 !== 0) {
16678
- throw new TypeError(`'framesPerLambda' needs to be an integer, passed ${framesPerFunction}`);
16679
- }
16680
- const effectiveMinimum = Math.min(MINIMUM_FRAMES_PER_FUNCTIONS, durationInFrames);
16681
- if (framesPerFunction < effectiveMinimum) {
16682
- throw new TypeError(`The framesPerLambda needs to be at least ${effectiveMinimum}, but is ${framesPerFunction}`);
16683
- }
16684
- };
16685
- var VERSION = "4.0.320";
16657
+ var VERSION = "4.0.322";
16686
16658
  var isColorSupported = () => {
16687
16659
  const env = process.env || {};
16688
16660
  const isForceDisabled = "NO_COLOR" in env;
@@ -21093,6 +21065,7 @@ var makeLambdaRenderMediaPayload = async ({
21093
21065
  rendererFunctionName,
21094
21066
  frameRange,
21095
21067
  framesPerLambda,
21068
+ concurrency,
21096
21069
  forceBucketName: bucketName,
21097
21070
  codec,
21098
21071
  composition,
@@ -21140,10 +21113,6 @@ var makeLambdaRenderMediaPayload = async ({
21140
21113
  }) => {
21141
21114
  const actualCodec = validateLambdaCodec(codec);
21142
21115
  validateServeUrl(serveUrl);
21143
- validateFramesPerFunction({
21144
- framesPerFunction: framesPerLambda ?? null,
21145
- durationInFrames: 1
21146
- });
21147
21116
  validateDownloadBehavior(downloadBehavior);
21148
21117
  validateWebhook(webhook);
21149
21118
  const stringifiedInputProps = serializeOrThrow(inputProps ?? {}, "input-props");
@@ -21168,6 +21137,7 @@ var makeLambdaRenderMediaPayload = async ({
21168
21137
  return {
21169
21138
  rendererFunctionName,
21170
21139
  framesPerLambda,
21140
+ concurrency,
21171
21141
  composition,
21172
21142
  serveUrl,
21173
21143
  inputProps: serialized,
@@ -21371,6 +21341,7 @@ var renderMediaOnLambdaOptionalToRequired = (options) => {
21371
21341
  colorSpace: options.colorSpace ?? null,
21372
21342
  composition: options.composition,
21373
21343
  concurrencyPerLambda: options.concurrencyPerLambda ?? 1,
21344
+ concurrency: options.concurrency ?? null,
21374
21345
  crf: options.crf,
21375
21346
  downloadBehavior: options.downloadBehavior ?? { type: "play-in-browser" },
21376
21347
  envVariables: options.envVariables ?? {},
package/dist/index.d.ts CHANGED
@@ -71,7 +71,7 @@ export declare const LambdaClientInternals: {
71
71
  parseBucketName: (name: string) => {
72
72
  region: import("./regions").AwsRegion | null;
73
73
  };
74
- makeLambdaRenderMediaPayload: ({ rendererFunctionName, frameRange, framesPerLambda, forceBucketName: bucketName, codec, composition, serveUrl, imageFormat, inputProps, region, crf, envVariables, pixelFormat, proResProfile, x264Preset, maxRetries, privacy, logLevel, outName, timeoutInMilliseconds, chromiumOptions, scale, everyNthFrame, numberOfGifLoops, audioBitrate, concurrencyPerLambda, audioCodec, forceHeight, forceWidth, webhook, videoBitrate, encodingMaxRate, encodingBufferSize, downloadBehavior, muted, overwrite, jpegQuality, offthreadVideoCacheSizeInBytes, deleteAfter, colorSpace, preferLossless, forcePathStyle, metadata, apiKey, offthreadVideoThreads, storageClass, requestHandler, }: import("./make-lambda-payload").InnerRenderMediaOnLambdaInput) => Promise<import("@remotion/serverless-client").ServerlessStartPayload<import("./aws-provider").AwsProvider>>;
74
+ makeLambdaRenderMediaPayload: ({ rendererFunctionName, frameRange, framesPerLambda, concurrency, forceBucketName: bucketName, codec, composition, serveUrl, imageFormat, inputProps, region, crf, envVariables, pixelFormat, proResProfile, x264Preset, maxRetries, privacy, logLevel, outName, timeoutInMilliseconds, chromiumOptions, scale, everyNthFrame, numberOfGifLoops, audioBitrate, concurrencyPerLambda, audioCodec, forceHeight, forceWidth, webhook, videoBitrate, encodingMaxRate, encodingBufferSize, downloadBehavior, muted, overwrite, jpegQuality, offthreadVideoCacheSizeInBytes, deleteAfter, colorSpace, preferLossless, forcePathStyle, metadata, apiKey, offthreadVideoThreads, storageClass, requestHandler, }: import("./make-lambda-payload").InnerRenderMediaOnLambdaInput) => Promise<import("@remotion/serverless-client").ServerlessStartPayload<import("./aws-provider").AwsProvider>>;
75
75
  renderMediaOnLambdaOptionalToRequired: (options: import("./render-media-on-lambda").RenderMediaOnLambdaInput) => import("./make-lambda-payload").InnerRenderMediaOnLambdaInput;
76
76
  internalDeleteRender: (input: import("./delete-render").DeleteRenderInput & {
77
77
  providerSpecifics: import("@remotion/serverless-client").ProviderSpecifics<import("./aws-provider").AwsProvider>;
@@ -23,6 +23,7 @@ export type InnerRenderMediaOnLambdaInput = {
23
23
  jpegQuality: number;
24
24
  maxRetries: number;
25
25
  framesPerLambda: number | null;
26
+ concurrency: number | null;
26
27
  logLevel: LogLevel;
27
28
  frameRange: FrameRange | null;
28
29
  outName: OutNameInput<AwsProvider> | null;
@@ -53,6 +54,6 @@ export type InnerRenderMediaOnLambdaInput = {
53
54
  storageClass: StorageClass | null;
54
55
  requestHandler: RequestHandler | null;
55
56
  } & ToOptions<typeof BrowserSafeApis.optionsMap.renderMediaOnLambda>;
56
- export declare const makeLambdaRenderMediaPayload: ({ rendererFunctionName, frameRange, framesPerLambda, forceBucketName: bucketName, codec, composition, serveUrl, imageFormat, inputProps, region, crf, envVariables, pixelFormat, proResProfile, x264Preset, maxRetries, privacy, logLevel, outName, timeoutInMilliseconds, chromiumOptions, scale, everyNthFrame, numberOfGifLoops, audioBitrate, concurrencyPerLambda, audioCodec, forceHeight, forceWidth, webhook, videoBitrate, encodingMaxRate, encodingBufferSize, downloadBehavior, muted, overwrite, jpegQuality, offthreadVideoCacheSizeInBytes, deleteAfter, colorSpace, preferLossless, forcePathStyle, metadata, apiKey, offthreadVideoThreads, storageClass, requestHandler, }: InnerRenderMediaOnLambdaInput) => Promise<ServerlessStartPayload<AwsProvider>>;
57
+ export declare const makeLambdaRenderMediaPayload: ({ rendererFunctionName, frameRange, framesPerLambda, concurrency, forceBucketName: bucketName, codec, composition, serveUrl, imageFormat, inputProps, region, crf, envVariables, pixelFormat, proResProfile, x264Preset, maxRetries, privacy, logLevel, outName, timeoutInMilliseconds, chromiumOptions, scale, everyNthFrame, numberOfGifLoops, audioBitrate, concurrencyPerLambda, audioCodec, forceHeight, forceWidth, webhook, videoBitrate, encodingMaxRate, encodingBufferSize, downloadBehavior, muted, overwrite, jpegQuality, offthreadVideoCacheSizeInBytes, deleteAfter, colorSpace, preferLossless, forcePathStyle, metadata, apiKey, offthreadVideoThreads, storageClass, requestHandler, }: InnerRenderMediaOnLambdaInput) => Promise<ServerlessStartPayload<AwsProvider>>;
57
58
  export declare const getRenderProgressPayload: ({ bucketName, renderId, s3OutputProvider, logLevel, forcePathStyle, }: GetRenderProgressInput) => ServerlessStatusPayload<AwsProvider>;
58
59
  export declare const makeLambdaRenderStillPayload: ({ serveUrl, inputProps, imageFormat, envVariables, jpegQuality, region, maxRetries, composition, privacy, frame, logLevel, outName, timeoutInMilliseconds, chromiumOptions, scale, downloadBehavior, forceHeight, forceWidth, forceBucketName, offthreadVideoCacheSizeInBytes, deleteAfter, forcePathStyle, apiKey, storageClass, requestHandler, }: RenderStillOnLambdaNonNullInput) => Promise<ServerlessPayloads<AwsProvider>[ServerlessRoutines.still]>;
@@ -6,13 +6,9 @@ const aws_provider_1 = require("./aws-provider");
6
6
  const serverless_client_2 = require("@remotion/serverless-client");
7
7
  const validate_lambda_codec_1 = require("./validate-lambda-codec");
8
8
  const validate_serveurl_1 = require("./validate-serveurl");
9
- const makeLambdaRenderMediaPayload = async ({ rendererFunctionName, frameRange, framesPerLambda, forceBucketName: bucketName, codec, composition, serveUrl, imageFormat, inputProps, region, crf, envVariables, pixelFormat, proResProfile, x264Preset, maxRetries, privacy, logLevel, outName, timeoutInMilliseconds, chromiumOptions, scale, everyNthFrame, numberOfGifLoops, audioBitrate, concurrencyPerLambda, audioCodec, forceHeight, forceWidth, webhook, videoBitrate, encodingMaxRate, encodingBufferSize, downloadBehavior, muted, overwrite, jpegQuality, offthreadVideoCacheSizeInBytes, deleteAfter, colorSpace, preferLossless, forcePathStyle, metadata, apiKey, offthreadVideoThreads, storageClass, requestHandler, }) => {
9
+ const makeLambdaRenderMediaPayload = async ({ rendererFunctionName, frameRange, framesPerLambda, concurrency, forceBucketName: bucketName, codec, composition, serveUrl, imageFormat, inputProps, region, crf, envVariables, pixelFormat, proResProfile, x264Preset, maxRetries, privacy, logLevel, outName, timeoutInMilliseconds, chromiumOptions, scale, everyNthFrame, numberOfGifLoops, audioBitrate, concurrencyPerLambda, audioCodec, forceHeight, forceWidth, webhook, videoBitrate, encodingMaxRate, encodingBufferSize, downloadBehavior, muted, overwrite, jpegQuality, offthreadVideoCacheSizeInBytes, deleteAfter, colorSpace, preferLossless, forcePathStyle, metadata, apiKey, offthreadVideoThreads, storageClass, requestHandler, }) => {
10
10
  const actualCodec = (0, validate_lambda_codec_1.validateLambdaCodec)(codec);
11
11
  (0, validate_serveurl_1.validateServeUrl)(serveUrl);
12
- (0, serverless_client_1.validateFramesPerFunction)({
13
- framesPerFunction: framesPerLambda !== null && framesPerLambda !== void 0 ? framesPerLambda : null,
14
- durationInFrames: 1,
15
- });
16
12
  (0, serverless_client_1.validateDownloadBehavior)(downloadBehavior);
17
13
  (0, serverless_client_2.validateWebhook)(webhook);
18
14
  const stringifiedInputProps = (0, serverless_client_1.serializeOrThrow)(inputProps !== null && inputProps !== void 0 ? inputProps : {}, 'input-props');
@@ -37,6 +33,7 @@ const makeLambdaRenderMediaPayload = async ({ rendererFunctionName, frameRange,
37
33
  return {
38
34
  rendererFunctionName,
39
35
  framesPerLambda,
36
+ concurrency,
40
37
  composition,
41
38
  serveUrl,
42
39
  inputProps: serialized,
@@ -24,6 +24,7 @@ export type RenderMediaOnLambdaInput = {
24
24
  jpegQuality?: number;
25
25
  maxRetries?: number;
26
26
  framesPerLambda?: number;
27
+ concurrency?: number;
27
28
  frameRange?: FrameRange;
28
29
  outName?: OutNameInput<AwsProvider>;
29
30
  chromiumOptions?: Omit<ChromiumOptions, 'enableMultiProcessOnLinux'>;
@@ -59,7 +59,7 @@ const internalRenderMediaOnLambdaRaw = async (input) => {
59
59
  };
60
60
  exports.internalRenderMediaOnLambdaRaw = internalRenderMediaOnLambdaRaw;
61
61
  const renderMediaOnLambdaOptionalToRequired = (options) => {
62
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17;
62
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18;
63
63
  return {
64
64
  offthreadVideoThreads: (_a = options.offthreadVideoThreads) !== null && _a !== void 0 ? _a : null,
65
65
  audioBitrate: (_b = options.audioBitrate) !== null && _b !== void 0 ? _b : null,
@@ -69,47 +69,48 @@ const renderMediaOnLambdaOptionalToRequired = (options) => {
69
69
  colorSpace: (_e = options.colorSpace) !== null && _e !== void 0 ? _e : null,
70
70
  composition: options.composition,
71
71
  concurrencyPerLambda: (_f = options.concurrencyPerLambda) !== null && _f !== void 0 ? _f : 1,
72
+ concurrency: (_g = options.concurrency) !== null && _g !== void 0 ? _g : null,
72
73
  crf: options.crf,
73
- downloadBehavior: (_g = options.downloadBehavior) !== null && _g !== void 0 ? _g : { type: 'play-in-browser' },
74
- envVariables: (_h = options.envVariables) !== null && _h !== void 0 ? _h : {},
75
- everyNthFrame: (_j = options.everyNthFrame) !== null && _j !== void 0 ? _j : 1,
76
- forceBucketName: (_k = options.forceBucketName) !== null && _k !== void 0 ? _k : null,
77
- forceHeight: (_l = options.forceHeight) !== null && _l !== void 0 ? _l : null,
78
- forceWidth: (_m = options.forceWidth) !== null && _m !== void 0 ? _m : null,
79
- frameRange: (_o = options.frameRange) !== null && _o !== void 0 ? _o : null,
80
- framesPerLambda: (_p = options.framesPerLambda) !== null && _p !== void 0 ? _p : null,
74
+ downloadBehavior: (_h = options.downloadBehavior) !== null && _h !== void 0 ? _h : { type: 'play-in-browser' },
75
+ envVariables: (_j = options.envVariables) !== null && _j !== void 0 ? _j : {},
76
+ everyNthFrame: (_k = options.everyNthFrame) !== null && _k !== void 0 ? _k : 1,
77
+ forceBucketName: (_l = options.forceBucketName) !== null && _l !== void 0 ? _l : null,
78
+ forceHeight: (_m = options.forceHeight) !== null && _m !== void 0 ? _m : null,
79
+ forceWidth: (_o = options.forceWidth) !== null && _o !== void 0 ? _o : null,
80
+ frameRange: (_p = options.frameRange) !== null && _p !== void 0 ? _p : null,
81
+ framesPerLambda: (_q = options.framesPerLambda) !== null && _q !== void 0 ? _q : null,
81
82
  functionName: options.functionName,
82
- imageFormat: (_q = options.imageFormat) !== null && _q !== void 0 ? _q : 'jpeg',
83
- inputProps: (_r = options.inputProps) !== null && _r !== void 0 ? _r : {},
84
- jpegQuality: (_s = options.jpegQuality) !== null && _s !== void 0 ? _s : 80,
85
- logLevel: (_t = options.logLevel) !== null && _t !== void 0 ? _t : 'info',
86
- maxRetries: (_u = options.maxRetries) !== null && _u !== void 0 ? _u : 1,
87
- muted: (_v = options.muted) !== null && _v !== void 0 ? _v : false,
88
- numberOfGifLoops: (_w = options.numberOfGifLoops) !== null && _w !== void 0 ? _w : null,
89
- offthreadVideoCacheSizeInBytes: (_x = options.offthreadVideoCacheSizeInBytes) !== null && _x !== void 0 ? _x : null,
90
- outName: (_y = options.outName) !== null && _y !== void 0 ? _y : null,
91
- overwrite: (_z = options.overwrite) !== null && _z !== void 0 ? _z : false,
92
- pixelFormat: (_0 = options.pixelFormat) !== null && _0 !== void 0 ? _0 : undefined,
93
- privacy: (_1 = options.privacy) !== null && _1 !== void 0 ? _1 : 'public',
94
- proResProfile: (_2 = options.proResProfile) !== null && _2 !== void 0 ? _2 : undefined,
83
+ imageFormat: (_r = options.imageFormat) !== null && _r !== void 0 ? _r : 'jpeg',
84
+ inputProps: (_s = options.inputProps) !== null && _s !== void 0 ? _s : {},
85
+ jpegQuality: (_t = options.jpegQuality) !== null && _t !== void 0 ? _t : 80,
86
+ logLevel: (_u = options.logLevel) !== null && _u !== void 0 ? _u : 'info',
87
+ maxRetries: (_v = options.maxRetries) !== null && _v !== void 0 ? _v : 1,
88
+ muted: (_w = options.muted) !== null && _w !== void 0 ? _w : false,
89
+ numberOfGifLoops: (_x = options.numberOfGifLoops) !== null && _x !== void 0 ? _x : null,
90
+ offthreadVideoCacheSizeInBytes: (_y = options.offthreadVideoCacheSizeInBytes) !== null && _y !== void 0 ? _y : null,
91
+ outName: (_z = options.outName) !== null && _z !== void 0 ? _z : null,
92
+ overwrite: (_0 = options.overwrite) !== null && _0 !== void 0 ? _0 : false,
93
+ pixelFormat: (_1 = options.pixelFormat) !== null && _1 !== void 0 ? _1 : undefined,
94
+ privacy: (_2 = options.privacy) !== null && _2 !== void 0 ? _2 : 'public',
95
+ proResProfile: (_3 = options.proResProfile) !== null && _3 !== void 0 ? _3 : undefined,
95
96
  region: options.region,
96
- rendererFunctionName: (_3 = options.rendererFunctionName) !== null && _3 !== void 0 ? _3 : null,
97
- scale: (_4 = options.scale) !== null && _4 !== void 0 ? _4 : 1,
97
+ rendererFunctionName: (_4 = options.rendererFunctionName) !== null && _4 !== void 0 ? _4 : null,
98
+ scale: (_5 = options.scale) !== null && _5 !== void 0 ? _5 : 1,
98
99
  serveUrl: options.serveUrl,
99
- timeoutInMilliseconds: (_5 = options.timeoutInMilliseconds) !== null && _5 !== void 0 ? _5 : 30000,
100
- videoBitrate: (_6 = options.videoBitrate) !== null && _6 !== void 0 ? _6 : null,
101
- encodingMaxRate: (_7 = options.encodingMaxRate) !== null && _7 !== void 0 ? _7 : null,
102
- encodingBufferSize: (_8 = options.encodingBufferSize) !== null && _8 !== void 0 ? _8 : null,
103
- webhook: (_9 = options.webhook) !== null && _9 !== void 0 ? _9 : null,
104
- x264Preset: (_10 = options.x264Preset) !== null && _10 !== void 0 ? _10 : null,
105
- deleteAfter: (_11 = options.deleteAfter) !== null && _11 !== void 0 ? _11 : null,
106
- preferLossless: (_12 = options.preferLossless) !== null && _12 !== void 0 ? _12 : false,
107
- forcePathStyle: (_13 = options.forcePathStyle) !== null && _13 !== void 0 ? _13 : false,
100
+ timeoutInMilliseconds: (_6 = options.timeoutInMilliseconds) !== null && _6 !== void 0 ? _6 : 30000,
101
+ videoBitrate: (_7 = options.videoBitrate) !== null && _7 !== void 0 ? _7 : null,
102
+ encodingMaxRate: (_8 = options.encodingMaxRate) !== null && _8 !== void 0 ? _8 : null,
103
+ encodingBufferSize: (_9 = options.encodingBufferSize) !== null && _9 !== void 0 ? _9 : null,
104
+ webhook: (_10 = options.webhook) !== null && _10 !== void 0 ? _10 : null,
105
+ x264Preset: (_11 = options.x264Preset) !== null && _11 !== void 0 ? _11 : null,
106
+ deleteAfter: (_12 = options.deleteAfter) !== null && _12 !== void 0 ? _12 : null,
107
+ preferLossless: (_13 = options.preferLossless) !== null && _13 !== void 0 ? _13 : false,
108
+ forcePathStyle: (_14 = options.forcePathStyle) !== null && _14 !== void 0 ? _14 : false,
108
109
  indent: false,
109
- metadata: (_14 = options.metadata) !== null && _14 !== void 0 ? _14 : null,
110
- apiKey: (_15 = options.apiKey) !== null && _15 !== void 0 ? _15 : null,
111
- storageClass: (_16 = options.storageClass) !== null && _16 !== void 0 ? _16 : null,
112
- requestHandler: (_17 = options.requestHandler) !== null && _17 !== void 0 ? _17 : null,
110
+ metadata: (_15 = options.metadata) !== null && _15 !== void 0 ? _15 : null,
111
+ apiKey: (_16 = options.apiKey) !== null && _16 !== void 0 ? _16 : null,
112
+ storageClass: (_17 = options.storageClass) !== null && _17 !== void 0 ? _17 : null,
113
+ requestHandler: (_18 = options.requestHandler) !== null && _18 !== void 0 ? _18 : null,
113
114
  };
114
115
  };
115
116
  exports.renderMediaOnLambdaOptionalToRequired = renderMediaOnLambdaOptionalToRequired;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const serverless_client_1 = require("@remotion/serverless-client");
4
+ const bun_test_1 = require("bun:test");
5
+ const make_lambda_payload_1 = require("../make-lambda-payload");
6
+ (0, bun_test_1.test)('Should include concurrency field in payload', async () => {
7
+ const payload = await (0, make_lambda_payload_1.makeLambdaRenderMediaPayload)({
8
+ region: 'us-east-1',
9
+ functionName: 'test-function',
10
+ serveUrl: 'https://example.com',
11
+ composition: 'test-composition',
12
+ inputProps: {},
13
+ codec: 'h264',
14
+ imageFormat: 'jpeg',
15
+ crf: undefined,
16
+ envVariables: {},
17
+ pixelFormat: undefined,
18
+ proResProfile: undefined,
19
+ x264Preset: null,
20
+ privacy: 'public',
21
+ jpegQuality: 80,
22
+ maxRetries: 1,
23
+ framesPerLambda: null,
24
+ concurrency: 10,
25
+ logLevel: 'info',
26
+ frameRange: null,
27
+ outName: null,
28
+ timeoutInMilliseconds: 30000,
29
+ chromiumOptions: {},
30
+ scale: 1,
31
+ everyNthFrame: 1,
32
+ numberOfGifLoops: null,
33
+ concurrencyPerLambda: 1,
34
+ downloadBehavior: { type: 'play-in-browser' },
35
+ muted: false,
36
+ overwrite: false,
37
+ audioBitrate: null,
38
+ videoBitrate: null,
39
+ encodingMaxRate: null,
40
+ encodingBufferSize: null,
41
+ webhook: null,
42
+ forceHeight: null,
43
+ forceWidth: null,
44
+ rendererFunctionName: null,
45
+ forceBucketName: null,
46
+ audioCodec: null,
47
+ colorSpace: null,
48
+ deleteAfter: null,
49
+ indent: false,
50
+ forcePathStyle: false,
51
+ metadata: null,
52
+ apiKey: null,
53
+ offthreadVideoCacheSizeInBytes: null,
54
+ offthreadVideoThreads: null,
55
+ storageClass: null,
56
+ requestHandler: null,
57
+ preferLossless: false,
58
+ });
59
+ (0, bun_test_1.expect)(payload.type).toBe(serverless_client_1.ServerlessRoutines.start);
60
+ (0, bun_test_1.expect)(payload.concurrency).toBe(10);
61
+ });
62
+ (0, bun_test_1.test)('Should handle null concurrency', async () => {
63
+ const payload = await (0, make_lambda_payload_1.makeLambdaRenderMediaPayload)({
64
+ region: 'us-east-1',
65
+ functionName: 'test-function',
66
+ serveUrl: 'https://example.com',
67
+ composition: 'test-composition',
68
+ inputProps: {},
69
+ codec: 'h264',
70
+ imageFormat: 'jpeg',
71
+ crf: undefined,
72
+ envVariables: {},
73
+ pixelFormat: undefined,
74
+ proResProfile: undefined,
75
+ x264Preset: null,
76
+ privacy: 'public',
77
+ jpegQuality: 80,
78
+ maxRetries: 1,
79
+ framesPerLambda: null,
80
+ concurrency: null,
81
+ logLevel: 'info',
82
+ frameRange: null,
83
+ outName: null,
84
+ timeoutInMilliseconds: 30000,
85
+ chromiumOptions: {},
86
+ scale: 1,
87
+ everyNthFrame: 1,
88
+ numberOfGifLoops: null,
89
+ concurrencyPerLambda: 1,
90
+ downloadBehavior: { type: 'play-in-browser' },
91
+ muted: false,
92
+ overwrite: false,
93
+ audioBitrate: null,
94
+ videoBitrate: null,
95
+ encodingMaxRate: null,
96
+ encodingBufferSize: null,
97
+ webhook: null,
98
+ forceHeight: null,
99
+ forceWidth: null,
100
+ rendererFunctionName: null,
101
+ forceBucketName: null,
102
+ audioCodec: null,
103
+ colorSpace: null,
104
+ deleteAfter: null,
105
+ indent: false,
106
+ forcePathStyle: false,
107
+ metadata: null,
108
+ apiKey: null,
109
+ offthreadVideoCacheSizeInBytes: null,
110
+ offthreadVideoThreads: null,
111
+ storageClass: null,
112
+ requestHandler: null,
113
+ preferLossless: false,
114
+ });
115
+ (0, bun_test_1.expect)(payload.type).toBe(serverless_client_1.ServerlessRoutines.start);
116
+ (0, bun_test_1.expect)(payload.concurrency).toBe(null);
117
+ });
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/lambda-client"
4
4
  },
5
5
  "name": "@remotion/lambda-client",
6
- "version": "4.0.320",
6
+ "version": "4.0.322",
7
7
  "main": "dist/index.js",
8
8
  "sideEffects": false,
9
9
  "author": "Jonny Burger <jonny@remotion.dev>",
@@ -26,8 +26,8 @@
26
26
  "eslint": "9.19.0",
27
27
  "next": "15.2.4",
28
28
  "@types/mime-types": "2.1.1",
29
- "@remotion/serverless-client": "4.0.320",
30
- "@remotion/eslint-config-internal": "4.0.320"
29
+ "@remotion/serverless-client": "4.0.322",
30
+ "@remotion/eslint-config-internal": "4.0.322"
31
31
  },
32
32
  "publishConfig": {
33
33
  "access": "public"
@@ -28,7 +28,6 @@ import {
28
28
  getNeedsToUpload,
29
29
  serializeOrThrow,
30
30
  validateDownloadBehavior,
31
- validateFramesPerFunction,
32
31
  } from '@remotion/serverless-client';
33
32
  import type {AwsProvider} from './aws-provider';
34
33
  import {awsImplementation} from './aws-provider';
@@ -59,6 +58,7 @@ export type InnerRenderMediaOnLambdaInput = {
59
58
  jpegQuality: number;
60
59
  maxRetries: number;
61
60
  framesPerLambda: number | null;
61
+ concurrency: number | null;
62
62
  logLevel: LogLevel;
63
63
  frameRange: FrameRange | null;
64
64
  outName: OutNameInput<AwsProvider> | null;
@@ -94,6 +94,7 @@ export const makeLambdaRenderMediaPayload = async ({
94
94
  rendererFunctionName,
95
95
  frameRange,
96
96
  framesPerLambda,
97
+ concurrency,
97
98
  forceBucketName: bucketName,
98
99
  codec,
99
100
  composition,
@@ -143,10 +144,6 @@ export const makeLambdaRenderMediaPayload = async ({
143
144
  > => {
144
145
  const actualCodec = validateLambdaCodec(codec);
145
146
  validateServeUrl(serveUrl);
146
- validateFramesPerFunction({
147
- framesPerFunction: framesPerLambda ?? null,
148
- durationInFrames: 1,
149
- });
150
147
  validateDownloadBehavior(downloadBehavior);
151
148
  validateWebhook(webhook);
152
149
 
@@ -176,6 +173,7 @@ export const makeLambdaRenderMediaPayload = async ({
176
173
  return {
177
174
  rendererFunctionName,
178
175
  framesPerLambda,
176
+ concurrency,
179
177
  composition,
180
178
  serveUrl,
181
179
  inputProps: serialized,
@@ -51,6 +51,7 @@ export type RenderMediaOnLambdaInput = {
51
51
  jpegQuality?: number;
52
52
  maxRetries?: number;
53
53
  framesPerLambda?: number;
54
+ concurrency?: number;
54
55
  frameRange?: FrameRange;
55
56
  outName?: OutNameInput<AwsProvider>;
56
57
  chromiumOptions?: Omit<ChromiumOptions, 'enableMultiProcessOnLinux'>;
@@ -155,6 +156,7 @@ export const renderMediaOnLambdaOptionalToRequired = (
155
156
  colorSpace: options.colorSpace ?? null,
156
157
  composition: options.composition,
157
158
  concurrencyPerLambda: options.concurrencyPerLambda ?? 1,
159
+ concurrency: options.concurrency ?? null,
158
160
  crf: options.crf,
159
161
  downloadBehavior: options.downloadBehavior ?? {type: 'play-in-browser'},
160
162
  envVariables: options.envVariables ?? {},
@@ -0,0 +1,119 @@
1
+ import {ServerlessRoutines} from '@remotion/serverless-client';
2
+ import {expect, test} from 'bun:test';
3
+ import {makeLambdaRenderMediaPayload} from '../make-lambda-payload';
4
+
5
+ test('Should include concurrency field in payload', async () => {
6
+ const payload = await makeLambdaRenderMediaPayload({
7
+ region: 'us-east-1',
8
+ functionName: 'test-function',
9
+ serveUrl: 'https://example.com',
10
+ composition: 'test-composition',
11
+ inputProps: {},
12
+ codec: 'h264',
13
+ imageFormat: 'jpeg',
14
+ crf: undefined,
15
+ envVariables: {},
16
+ pixelFormat: undefined,
17
+ proResProfile: undefined,
18
+ x264Preset: null,
19
+ privacy: 'public',
20
+ jpegQuality: 80,
21
+ maxRetries: 1,
22
+ framesPerLambda: null,
23
+ concurrency: 10,
24
+ logLevel: 'info',
25
+ frameRange: null,
26
+ outName: null,
27
+ timeoutInMilliseconds: 30000,
28
+ chromiumOptions: {},
29
+ scale: 1,
30
+ everyNthFrame: 1,
31
+ numberOfGifLoops: null,
32
+ concurrencyPerLambda: 1,
33
+ downloadBehavior: {type: 'play-in-browser'},
34
+ muted: false,
35
+ overwrite: false,
36
+ audioBitrate: null,
37
+ videoBitrate: null,
38
+ encodingMaxRate: null,
39
+ encodingBufferSize: null,
40
+ webhook: null,
41
+ forceHeight: null,
42
+ forceWidth: null,
43
+ rendererFunctionName: null,
44
+ forceBucketName: null,
45
+ audioCodec: null,
46
+ colorSpace: null,
47
+ deleteAfter: null,
48
+ indent: false,
49
+ forcePathStyle: false,
50
+ metadata: null,
51
+ apiKey: null,
52
+ offthreadVideoCacheSizeInBytes: null,
53
+ offthreadVideoThreads: null,
54
+ storageClass: null,
55
+ requestHandler: null,
56
+ preferLossless: false,
57
+ });
58
+
59
+ expect(payload.type).toBe(ServerlessRoutines.start);
60
+ expect(payload.concurrency).toBe(10);
61
+ });
62
+
63
+ test('Should handle null concurrency', async () => {
64
+ const payload = await makeLambdaRenderMediaPayload({
65
+ region: 'us-east-1',
66
+ functionName: 'test-function',
67
+ serveUrl: 'https://example.com',
68
+ composition: 'test-composition',
69
+ inputProps: {},
70
+ codec: 'h264',
71
+ imageFormat: 'jpeg',
72
+ crf: undefined,
73
+ envVariables: {},
74
+ pixelFormat: undefined,
75
+ proResProfile: undefined,
76
+ x264Preset: null,
77
+ privacy: 'public',
78
+ jpegQuality: 80,
79
+ maxRetries: 1,
80
+ framesPerLambda: null,
81
+ concurrency: null,
82
+ logLevel: 'info',
83
+ frameRange: null,
84
+ outName: null,
85
+ timeoutInMilliseconds: 30000,
86
+ chromiumOptions: {},
87
+ scale: 1,
88
+ everyNthFrame: 1,
89
+ numberOfGifLoops: null,
90
+ concurrencyPerLambda: 1,
91
+ downloadBehavior: {type: 'play-in-browser'},
92
+ muted: false,
93
+ overwrite: false,
94
+ audioBitrate: null,
95
+ videoBitrate: null,
96
+ encodingMaxRate: null,
97
+ encodingBufferSize: null,
98
+ webhook: null,
99
+ forceHeight: null,
100
+ forceWidth: null,
101
+ rendererFunctionName: null,
102
+ forceBucketName: null,
103
+ audioCodec: null,
104
+ colorSpace: null,
105
+ deleteAfter: null,
106
+ indent: false,
107
+ forcePathStyle: false,
108
+ metadata: null,
109
+ apiKey: null,
110
+ offthreadVideoCacheSizeInBytes: null,
111
+ offthreadVideoThreads: null,
112
+ storageClass: null,
113
+ requestHandler: null,
114
+ preferLossless: false,
115
+ });
116
+
117
+ expect(payload.type).toBe(ServerlessRoutines.start);
118
+ expect(payload.concurrency).toBe(null);
119
+ });
@@ -1,7 +0,0 @@
1
-
2
- 
3
- > @remotion/lambda-client@4.0.318 formatting /Users/jonathanburger/remotion/packages/lambda-client
4
- > prettier --experimental-cli src --check
5
-
6
- [?25l- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ Checking formatting...- Checking formatting...\ Checking formatting...| Checking formatting.../ src/clean-items.ts- src/clean-items.ts\ src/clean-items.ts| src/clean-items.ts/ src/clean-items.ts- src/clean-items.ts\ src/clean-items.ts| src/check-credentials.ts/ src/aws-provider.ts- src/constants.ts\ src/constants.ts| src/call-lambda-async.ts/ src/call-lambda-async.ts- src/call-lambda-async.ts\ src/app-router-webhook.ts| src/convert-to-serve-url.ts/ src/convert-to-serve-url.ts- src/content-disposition-header.ts\ src/bucket-exists.ts| src/apply-lifecycle.ts/ src/apply-lifecycle.ts- src/apply-lifecycle.ts\ src/apply-lifecycle.ts| src/apply-lifecycle.ts/ src/create-bucket.ts- src/create-bucket.ts\ src/delete-function.ts| src/estimate-price.ts/ src/aws-clients.ts- src/aws-clients.ts\ src/encode-aws-url-params.ts| src/delete-render.ts/ src/get-account-id.ts- src/get-account-id.ts\ src/get-account-id.ts| src/get-aws-urls.ts/ src/get-aws-urls.ts- src/get-env-variable.ts\ src/get-buckets.ts| src/get-buckets.ts/ src/get-aws-client.ts- src/get-aws-client.ts\ src/get-function-version.ts| src/get-function-version.ts/ src/get-compositions-on-lambda.ts- src/get-compositions-on-lambda.ts\ src/get-function-name.ts| src/get-functions.ts/ src/get-s3-client.ts- src/get-output-url-from-metadata.ts\ src/index.ts| src/get-sites.ts/ src/get-sites.ts- src/lambda-version-string.ts\ src/lambda-version-string.ts| src/lambda-version-string.ts/ src/is-likely-to-have-aws-profile.ts- src/make-s3-url.ts\ src/make-s3-url.ts| src/p-limit.ts/ src/parse-function-name.ts- src/pages-router-webhook.ts\ src/pages-router-webhook.ts| src/pages-router-webhook.ts/ src/pages-router-webhook.ts- src/make-lambda-payload.ts\ src/make-lambda-payload.ts| src/lifecycle-rules.ts/ src/lifecycle-rules.ts- src/validate-aws-region.ts\ src/runtime-preference.ts| src/runtime-preference.ts/ src/runtime-preference.ts- src/price-per-1s.ts\ src/price-per-1s.ts| src/validate-bucketname.ts/ src/validate-disk-size-in-mb.ts- src/validate-disk-size-in-mb.ts\ src/validate-disk-size-in-mb.ts| src/validate-serveurl.ts/ src/validate-serveurl.ts- src/speculate-function-name.ts\ src/speculate-function-name.ts| src/validate-presign-expiration.ts/ src/validate-presign-expiration.ts- src/validate-memory-size.ts\ src/validate-memory-size.ts| src/validate-memory-size.ts/ src/test/encode-aws-url.test.ts- src/test/validate-disk-size-in-mb.test.ts\ src/test/pricing.test.ts| src/test/pricing.test.ts/ src/test/price-calculation.test.ts- src/call-lambda-sync.ts\ src/call-lambda-sync.ts| src/call-lambda-sync.ts/ src/call-lambda-sync.ts- src/call-lambda-sync.ts\ src/call-lambda-sync.ts| src/call-lambda-sync.ts/ src/call-lambda-sync.ts[?25hChecking formatting...
7
- [?25hAll matched files use Prettier code style!
@@ -1,28 +0,0 @@
1
-
2
- 
3
- > @remotion/lambda-client@4.0.318 lint /Users/jonathanburger/remotion/packages/lambda-client
4
- > eslint src
5
-
6
- =============
7
-
8
- WARNING: You are currently running a version of TypeScript which is not officially supported by @typescript-eslint/typescript-estree.
9
-
10
- You may find that it works just fine, or you may not.
11
-
12
- SUPPORTED TYPESCRIPT VERSIONS: >=4.7.4 <5.7.0
13
-
14
- YOUR TYPESCRIPT VERSION: 5.8.2
15
-
16
- Please only submit bug reports when using the officially supported version.
17
-
18
- =============
19
- 
20
- /Users/jonathanburger/remotion/packages/lambda-client/src/aws-clients.ts
21
-  25:2 warning Unused eslint-disable directive (no problems were reported from '@typescript-eslint/no-unused-vars')
22
- 
23
- /Users/jonathanburger/remotion/packages/lambda-client/src/constants.ts
24
-  20:1 warning Unexpected 'todo' comment: 'TODO: In V5, Enable set this to 10240' no-warning-comments
25
- 
26
- ✖ 2 problems (0 errors, 2 warnings)
27
-  0 errors and 1 warning potentially fixable with the `--fix` option.
28
-