@remotion/serverless 4.0.424 → 4.0.426

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.
@@ -18,7 +18,7 @@ const validate_composition_1 = require("../validate-composition");
18
18
  const send_telemetry_event_1 = require("./send-telemetry-event");
19
19
  const innerLaunchHandler = async ({ params, options, overallProgress, registerCleanupTask, providerSpecifics, insideFunctionSpecifics, onBrowser, }) => {
20
20
  var _a, _b;
21
- var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
21
+ var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
22
22
  if (params.type !== serverless_client_2.ServerlessRoutines.launch) {
23
23
  throw new Error('Expected launch type');
24
24
  }
@@ -75,6 +75,8 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
75
75
  port: null,
76
76
  forceHeight: params.forceHeight,
77
77
  forceWidth: params.forceWidth,
78
+ forceFps: (_f = params.forceFps) !== null && _f !== void 0 ? _f : null,
79
+ forceDurationInFrames: (_g = params.forceDurationInFrames) !== null && _g !== void 0 ? _g : null,
78
80
  logLevel: params.logLevel,
79
81
  server: undefined,
80
82
  offthreadVideoCacheSizeInBytes: params.offthreadVideoCacheSizeInBytes,
@@ -95,7 +97,7 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
95
97
  renderer_1.RenderInternals.validateConcurrency({
96
98
  value: params.concurrencyPerFunction,
97
99
  setting: 'concurrencyPerLambda',
98
- checkIfValidForCurrentMachine: ((_f = params.rendererFunctionName) !== null && _f !== void 0 ? _f : null) === null,
100
+ checkIfValidForCurrentMachine: ((_h = params.rendererFunctionName) !== null && _h !== void 0 ? _h : null) === null,
99
101
  });
100
102
  const realFrameRange = renderer_1.RenderInternals.getRealFrameRange(comp.durationInFrames, params.frameRange);
101
103
  const frameCount = renderer_1.RenderInternals.getFramesToRender(realFrameRange, params.everyNthFrame);
@@ -217,7 +219,7 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
217
219
  return payload;
218
220
  });
219
221
  renderer_1.RenderInternals.Log.info(logOptions, 'Render plan: ', chunks.map((c, i) => `Chunk ${i} (Frames ${c[0]} - ${c[1]})`).join(', '));
220
- const rendererFunctionName = (_g = params.rendererFunctionName) !== null && _g !== void 0 ? _g : insideFunctionSpecifics.getCurrentFunctionName();
222
+ const rendererFunctionName = (_j = params.rendererFunctionName) !== null && _j !== void 0 ? _j : insideFunctionSpecifics.getCurrentFunctionName();
221
223
  const renderMetadata = {
222
224
  startedDate,
223
225
  totalChunks: chunks.length,
@@ -239,7 +241,7 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
239
241
  memorySizeInMb: insideFunctionSpecifics.getCurrentMemorySizeInMb(),
240
242
  region: insideFunctionSpecifics.getCurrentRegionInFunction(),
241
243
  renderId: params.renderId,
242
- outName: (0, remove_outname_credentials_1.removeOutnameCredentials)((_h = params.outName) !== null && _h !== void 0 ? _h : undefined),
244
+ outName: (0, remove_outname_credentials_1.removeOutnameCredentials)((_k = params.outName) !== null && _k !== void 0 ? _k : undefined),
243
245
  privacy: params.privacy,
244
246
  everyNthFrame: params.everyNthFrame,
245
247
  frameRange: realFrameRange,
@@ -252,10 +254,10 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
252
254
  metadata: params.metadata,
253
255
  functionName: insideFunctionSpecifics.getCurrentFunctionName(),
254
256
  dimensions: {
255
- width: comp.width * ((_j = params.scale) !== null && _j !== void 0 ? _j : 1),
256
- height: comp.height * ((_k = params.scale) !== null && _k !== void 0 ? _k : 1),
257
+ width: comp.width * ((_l = params.scale) !== null && _l !== void 0 ? _l : 1),
258
+ height: comp.height * ((_m = params.scale) !== null && _m !== void 0 ? _m : 1),
257
259
  },
258
- rendererFunctionName: (_l = params.rendererFunctionName) !== null && _l !== void 0 ? _l : insideFunctionSpecifics.getCurrentFunctionName(),
260
+ rendererFunctionName: (_o = params.rendererFunctionName) !== null && _o !== void 0 ? _o : insideFunctionSpecifics.getCurrentFunctionName(),
259
261
  scale: params.scale,
260
262
  };
261
263
  const { key, renderBucketName, customCredentials } = (0, serverless_client_2.getExpectedOutName)({
@@ -264,7 +266,7 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
264
266
  customCredentials: typeof params.outName === 'string' ||
265
267
  typeof params.outName === 'undefined'
266
268
  ? null
267
- : ((_m = (_b = params.outName) === null || _b === void 0 ? void 0 : _b.s3OutputProvider) !== null && _m !== void 0 ? _m : null),
269
+ : ((_p = (_b = params.outName) === null || _b === void 0 ? void 0 : _b.s3OutputProvider) !== null && _p !== void 0 ? _p : null),
268
270
  bucketNamePrefix: providerSpecifics.getBucketPrefix(),
269
271
  });
270
272
  if (!params.overwrite) {
@@ -341,7 +343,7 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
341
343
  willRetry: false,
342
344
  totalAttempts: 1,
343
345
  });
344
- overallProgress.upload();
346
+ overallProgress.upload('artifactWriteError');
345
347
  renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, 'Failed to write artifact to S3', err);
346
348
  });
347
349
  return { alreadyExisted: false };
@@ -486,7 +488,7 @@ const launchHandler = async ({ params, options, providerSpecifics, insideFunctio
486
488
  willRetry: false,
487
489
  totalAttempts: 1,
488
490
  });
489
- overallProgress.upload();
491
+ overallProgress.upload('timeoutWebhookError');
490
492
  }
491
493
  };
492
494
  let webhookInvoked = false;
@@ -563,7 +565,7 @@ const launchHandler = async ({ params, options, providerSpecifics, insideFunctio
563
565
  willRetry: false,
564
566
  totalAttempts: 1,
565
567
  });
566
- overallProgress.upload();
568
+ overallProgress.upload('successWebhookError');
567
569
  renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, 'Failed to invoke webhook:');
568
570
  renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, err);
569
571
  }
@@ -587,7 +589,7 @@ const launchHandler = async ({ params, options, providerSpecifics, insideFunctio
587
589
  willRetry: false,
588
590
  message: err.message,
589
591
  });
590
- await overallProgress.upload();
592
+ await overallProgress.upload('fatalError');
591
593
  runCleanupTasks();
592
594
  renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, 'Wrote error to S3');
593
595
  clearTimeout(webhookDueToTimeout);
@@ -631,7 +633,7 @@ const launchHandler = async ({ params, options, providerSpecifics, insideFunctio
631
633
  willRetry: false,
632
634
  totalAttempts: 1,
633
635
  });
634
- overallProgress.upload();
636
+ overallProgress.upload('errorWebhookError');
635
637
  renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, 'Failed to invoke webhook:');
636
638
  renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, error);
637
639
  }
@@ -5,7 +5,7 @@ const serverless_client_1 = require("@remotion/serverless-client");
5
5
  const overall_render_progress_1 = require("../overall-render-progress");
6
6
  const check_version_mismatch_1 = require("./check-version-mismatch");
7
7
  const startHandler = async ({ params, options, providerSpecifics, insideFunctionSpecifics, }) => {
8
- var _a, _b, _c, _d, _e;
8
+ var _a, _b, _c, _d, _e, _f, _g;
9
9
  if (params.type !== serverless_client_1.ServerlessRoutines.start) {
10
10
  throw new TypeError('Expected type start');
11
11
  }
@@ -82,6 +82,8 @@ const startHandler = async ({ params, options, providerSpecifics, insideFunction
82
82
  encodingMaxRate: params.encodingMaxRate,
83
83
  forceHeight: params.forceHeight,
84
84
  forceWidth: params.forceWidth,
85
+ forceFps: (_e = params.forceFps) !== null && _e !== void 0 ? _e : null,
86
+ forceDurationInFrames: (_f = params.forceDurationInFrames) !== null && _f !== void 0 ? _f : null,
85
87
  rendererFunctionName: params.rendererFunctionName,
86
88
  audioCodec: params.audioCodec,
87
89
  offthreadVideoCacheSizeInBytes: params.offthreadVideoCacheSizeInBytes,
@@ -94,7 +96,7 @@ const startHandler = async ({ params, options, providerSpecifics, insideFunction
94
96
  offthreadVideoThreads: params.offthreadVideoThreads,
95
97
  storageClass: params.storageClass,
96
98
  mediaCacheSizeInBytes: params.mediaCacheSizeInBytes,
97
- isProduction: (_e = params.isProduction) !== null && _e !== void 0 ? _e : true,
99
+ isProduction: (_g = params.isProduction) !== null && _g !== void 0 ? _g : true,
98
100
  };
99
101
  await providerSpecifics.callFunctionAsync({
100
102
  functionName: insideFunctionSpecifics.getCurrentFunctionName(),
@@ -17,7 +17,7 @@ const validate_composition_1 = require("../validate-composition");
17
17
  const check_version_mismatch_1 = require("./check-version-mismatch");
18
18
  const send_telemetry_event_1 = require("./send-telemetry-event");
19
19
  const innerStillHandler = async ({ params, expectedBucketOwner, renderId, onStream, timeoutInMilliseconds, providerSpecifics, insideFunctionSpecifics, }, cleanup) => {
20
- var _a, _b, _c, _d, _e, _f, _g;
20
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
21
21
  if (params.type !== serverless_client_1.ServerlessRoutines.still) {
22
22
  throw new TypeError('Expected still type');
23
23
  }
@@ -107,6 +107,8 @@ const innerStillHandler = async ({ params, expectedBucketOwner, renderId, onStre
107
107
  port: null,
108
108
  forceHeight: params.forceHeight,
109
109
  forceWidth: params.forceWidth,
110
+ forceFps: (_d = params.forceFps) !== null && _d !== void 0 ? _d : null,
111
+ forceDurationInFrames: (_e = params.forceDurationInFrames) !== null && _e !== void 0 ? _e : null,
110
112
  logLevel: params.logLevel,
111
113
  server,
112
114
  offthreadVideoCacheSizeInBytes: params.offthreadVideoCacheSizeInBytes,
@@ -134,7 +136,7 @@ const innerStillHandler = async ({ params, expectedBucketOwner, renderId, onStre
134
136
  memorySizeInMb: insideFunctionSpecifics.getCurrentMemorySizeInMb(),
135
137
  region: insideFunctionSpecifics.getCurrentRegionInFunction(),
136
138
  renderId,
137
- outName: (0, remove_outname_credentials_1.removeOutnameCredentials)((_d = params.outName) !== null && _d !== void 0 ? _d : undefined),
139
+ outName: (0, remove_outname_credentials_1.removeOutnameCredentials)((_f = params.outName) !== null && _f !== void 0 ? _f : undefined),
138
140
  privacy: params.privacy,
139
141
  audioCodec: null,
140
142
  deleteAfter: params.deleteAfter,
@@ -214,7 +216,7 @@ const innerStillHandler = async ({ params, expectedBucketOwner, renderId, onStre
214
216
  composition,
215
217
  output: outputPath,
216
218
  serveUrl,
217
- envVariables: (_e = params.envVariables) !== null && _e !== void 0 ? _e : {},
219
+ envVariables: (_g = params.envVariables) !== null && _g !== void 0 ? _g : {},
218
220
  frame: renderer_1.RenderInternals.convertToPositiveFrameIndex({
219
221
  frame: params.frame,
220
222
  durationInFrames: composition.durationInFrames,
@@ -223,7 +225,7 @@ const innerStillHandler = async ({ params, expectedBucketOwner, renderId, onStre
223
225
  serializedInputPropsWithCustomSchema,
224
226
  overwrite: false,
225
227
  puppeteerInstance: browserInstance.instance,
226
- jpegQuality: (_f = params.jpegQuality) !== null && _f !== void 0 ? _f : renderer_1.RenderInternals.DEFAULT_JPEG_QUALITY,
228
+ jpegQuality: (_h = params.jpegQuality) !== null && _h !== void 0 ? _h : renderer_1.RenderInternals.DEFAULT_JPEG_QUALITY,
227
229
  chromiumOptions: params.chromiumOptions,
228
230
  scale: params.scale,
229
231
  timeoutInMilliseconds: params.timeoutInMilliseconds,
@@ -278,7 +280,7 @@ const innerStillHandler = async ({ params, expectedBucketOwner, renderId, onStre
278
280
  licenseKey: params.licenseKey,
279
281
  logLevel: params.logLevel,
280
282
  isStill: true,
281
- isProduction: (_g = params.isProduction) !== null && _g !== void 0 ? _g : true,
283
+ isProduction: (_j = params.isProduction) !== null && _j !== void 0 ? _j : true,
282
284
  }),
283
285
  ]);
284
286
  const estimatedPrice = providerSpecifics.estimatePrice({
@@ -89,7 +89,7 @@ const mergeChunksAndFinishRender = async (options) => {
89
89
  timeToFinish: Date.now() - options.startTime,
90
90
  providerSpecifics: options.providerSpecifics,
91
91
  });
92
- options.overallProgress.setPostRenderData(postRenderData);
92
+ await options.overallProgress.setPostRenderData(postRenderData);
93
93
  fs_1.default.unlinkSync(outfile);
94
94
  await cleanupChunksProm;
95
95
  return postRenderData;
@@ -1,6 +1,6 @@
1
1
  import type { ChunkRetry, CloudProvider, FunctionErrorInfo, OverallRenderProgress, PostRenderData, ProviderSpecifics, ReceivedArtifact, RenderMetadata } from '@remotion/serverless-client';
2
2
  export type OverallProgressHelper<Provider extends CloudProvider> = {
3
- upload: () => Promise<void>;
3
+ upload: (reason: string) => Promise<void>;
4
4
  setFrames: ({ encoded, rendered, index }: {
5
5
  rendered: number;
6
6
  encoded: number;
@@ -11,7 +11,7 @@ export type OverallProgressHelper<Provider extends CloudProvider> = {
11
11
  setCombinedFrames: (framesEncoded: number) => void;
12
12
  setTimeToCombine: (timeToCombine: number) => void;
13
13
  addRetry: (retry: ChunkRetry) => void;
14
- setPostRenderData: (postRenderData: PostRenderData<Provider>) => void;
14
+ setPostRenderData: (postRenderData: PostRenderData<Provider>) => Promise<void>;
15
15
  setRenderMetadata: (renderMetadata: RenderMetadata<Provider>) => void;
16
16
  addErrorWithoutUpload: (errorInfo: FunctionErrorInfo) => void;
17
17
  setExpectedChunks: (expectedChunks: number) => void;
@@ -31,51 +31,57 @@ const makeOverallRenderProgress = ({ renderId, bucketName, expectedBucketOwner,
31
31
  let framesEncoded = [];
32
32
  let lambdasInvoked = [];
33
33
  const renderProgress = (0, exports.makeInitialOverallRenderProgress)(timeoutTimestamp);
34
- let currentUploadPromise = null;
35
- const getCurrentProgress = () => renderProgress;
36
- let latestUploadRequest = 0;
37
- const getLatestRequestId = () => latestUploadRequest;
34
+ let dirty = false;
35
+ let dirtyReasons = [];
36
+ let uploadLoopPromise = null;
38
37
  let encodeStartTime = null;
39
38
  let renderFramesStartTime = null;
40
- const upload = async () => {
41
- const uploadRequestId = ++latestUploadRequest;
42
- if (currentUploadPromise) {
43
- await currentUploadPromise;
39
+ const markDirty = (reason) => {
40
+ dirty = true;
41
+ dirtyReasons.push(reason);
42
+ };
43
+ const runUploadLoop = async () => {
44
+ while (dirty) {
45
+ dirty = false;
46
+ const reasons = dirtyReasons.join(', ');
47
+ dirtyReasons = [];
48
+ const toWrite = JSON.stringify(renderProgress);
49
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel }, `Uploading progress - ${reasons} (${toWrite.length} bytes)`);
50
+ const start = Date.now();
51
+ try {
52
+ await providerSpecifics.writeFile({
53
+ body: toWrite,
54
+ bucketName,
55
+ customCredentials: null,
56
+ downloadBehavior: null,
57
+ expectedBucketOwner,
58
+ key: (0, serverless_client_1.overallProgressKey)(renderId),
59
+ privacy: 'private',
60
+ region,
61
+ forcePathStyle,
62
+ storageClass: null,
63
+ requestHandler: null,
64
+ });
65
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel }, `Uploaded progress in ${Date.now() - start}ms`);
66
+ // Space out the requests a bit
67
+ await new Promise((resolve) => {
68
+ setTimeout(resolve, Math.max(0, 250 - (Date.now() - start)));
69
+ });
70
+ }
71
+ catch (err) {
72
+ // If an error occurs in uploading the state that contains the errors,
73
+ // that is unfortunate. We just log it.
74
+ renderer_1.RenderInternals.Log.error({ indent: false, logLevel }, 'Error uploading progress', err);
75
+ }
44
76
  }
45
- // If request has been replaced by a new one
46
- if (getLatestRequestId() !== uploadRequestId) {
47
- return;
77
+ uploadLoopPromise = null;
78
+ };
79
+ const upload = async (reason) => {
80
+ markDirty(reason);
81
+ if (!uploadLoopPromise) {
82
+ uploadLoopPromise = runUploadLoop();
48
83
  }
49
- const toWrite = JSON.stringify(getCurrentProgress());
50
- const start = Date.now();
51
- currentUploadPromise = providerSpecifics
52
- .writeFile({
53
- body: toWrite,
54
- bucketName,
55
- customCredentials: null,
56
- downloadBehavior: null,
57
- expectedBucketOwner,
58
- key: (0, serverless_client_1.overallProgressKey)(renderId),
59
- privacy: 'private',
60
- region,
61
- forcePathStyle,
62
- storageClass: null,
63
- requestHandler: null,
64
- })
65
- .then(() => {
66
- // By default, upload is way too fast (~20 requests per second)
67
- // Space out the requests a bit
68
- return new Promise((resolve) => {
69
- setTimeout(resolve, Math.max(0, 250 - (Date.now() - start)));
70
- });
71
- })
72
- .catch((err) => {
73
- // If an error occurs in uploading the state that contains the errors,
74
- // that is unfortunate. We just log it.
75
- renderer_1.RenderInternals.Log.error({ indent: false, logLevel }, 'Error uploading progress', err);
76
- });
77
- await currentUploadPromise;
78
- currentUploadPromise = null;
84
+ await uploadLoopPromise;
79
85
  };
80
86
  return {
81
87
  upload,
@@ -108,7 +114,7 @@ const makeOverallRenderProgress = ({ renderId, bucketName, expectedBucketOwner,
108
114
  }
109
115
  renderProgress.framesRendered = totalFramesRendered;
110
116
  renderProgress.framesEncoded = totalFramesEncoded;
111
- upload();
117
+ upload(`setFrames(rendered=${totalFramesRendered}, encoded=${totalFramesEncoded})`);
112
118
  },
113
119
  addChunkCompleted: (chunkIndex, start, rendered) => {
114
120
  var _a;
@@ -123,15 +129,15 @@ const makeOverallRenderProgress = ({ renderId, bucketName, expectedBucketOwner,
123
129
  start,
124
130
  rendered,
125
131
  });
126
- upload();
132
+ upload(`addChunkCompleted(chunk=${chunkIndex})`);
127
133
  },
128
134
  setCombinedFrames: (frames) => {
129
135
  renderProgress.combinedFrames = frames;
130
- upload();
136
+ upload(`setCombinedFrames(${frames})`);
131
137
  },
132
138
  setTimeToCombine: (timeToCombine) => {
133
139
  renderProgress.timeToCombine = timeToCombine;
134
- upload();
140
+ upload(`setTimeToCombine(${timeToCombine})`);
135
141
  },
136
142
  setLambdaInvoked(chunk) {
137
143
  if (lambdasInvoked.length === 0) {
@@ -139,15 +145,15 @@ const makeOverallRenderProgress = ({ renderId, bucketName, expectedBucketOwner,
139
145
  }
140
146
  lambdasInvoked[chunk] = true;
141
147
  renderProgress.lambdasInvoked = lambdasInvoked.reduce((a, b) => a + Number(b), 0);
142
- upload();
148
+ upload(`setLambdaInvoked(chunk=${chunk})`);
143
149
  },
144
- setPostRenderData(postRenderData) {
150
+ async setPostRenderData(postRenderData) {
145
151
  renderProgress.postRenderData = postRenderData;
146
- upload();
152
+ await upload('setPostRenderData');
147
153
  },
148
154
  setRenderMetadata: (renderMetadata) => {
149
155
  renderProgress.renderMetadata = renderMetadata;
150
- upload();
156
+ upload('setRenderMetadata');
151
157
  },
152
158
  addErrorWithoutUpload: (errorInfo) => {
153
159
  renderProgress.errors.push(errorInfo);
@@ -159,19 +165,19 @@ const makeOverallRenderProgress = ({ renderId, bucketName, expectedBucketOwner,
159
165
  },
160
166
  setCompositionValidated(timestamp) {
161
167
  renderProgress.compositionValidated = timestamp;
162
- upload();
168
+ upload('setCompositionValidated');
163
169
  },
164
170
  setServeUrlOpened(timestamp) {
165
171
  renderProgress.serveUrlOpened = timestamp;
166
- upload();
172
+ upload('setServeUrlOpened');
167
173
  },
168
174
  addRetry(retry) {
169
175
  renderProgress.retries.push(retry);
170
- upload();
176
+ upload('addRetry');
171
177
  },
172
178
  addReceivedArtifact(asset) {
173
179
  renderProgress.receivedArtifact.push(asset);
174
- upload();
180
+ upload('addReceivedArtifact');
175
181
  },
176
182
  getReceivedArtifacts() {
177
183
  return renderProgress.receivedArtifact;
@@ -11,6 +11,8 @@ type ValidateCompositionOptions<Provider extends CloudProvider> = {
11
11
  port: number | null;
12
12
  forceHeight: number | null;
13
13
  forceWidth: number | null;
14
+ forceFps: number | null;
15
+ forceDurationInFrames: number | null;
14
16
  logLevel: LogLevel;
15
17
  server: RemotionServer | undefined;
16
18
  offthreadVideoCacheSizeInBytes: number | null;
@@ -20,5 +22,5 @@ type ValidateCompositionOptions<Provider extends CloudProvider> = {
20
22
  onServeUrlVisited: () => void;
21
23
  providerSpecifics: ProviderSpecifics<Provider>;
22
24
  };
23
- export declare const validateComposition: <Provider extends CloudProvider<string, Record<string, unknown>, Record<string, unknown>, string, object>>({ serveUrl, composition, browserInstance, serializedInputPropsWithCustomSchema, envVariables, timeoutInMilliseconds, chromiumOptions, port, forceHeight, forceWidth, logLevel, server, offthreadVideoCacheSizeInBytes, onBrowserDownload, onServeUrlVisited, providerSpecifics, offthreadVideoThreads, mediaCacheSizeInBytes, }: ValidateCompositionOptions<Provider>) => Promise<VideoConfig>;
25
+ export declare const validateComposition: <Provider extends CloudProvider<string, Record<string, unknown>, Record<string, unknown>, string, object>>({ serveUrl, composition, browserInstance, serializedInputPropsWithCustomSchema, envVariables, timeoutInMilliseconds, chromiumOptions, port, forceHeight, forceWidth, forceFps, forceDurationInFrames, logLevel, server, offthreadVideoCacheSizeInBytes, onBrowserDownload, onServeUrlVisited, providerSpecifics, offthreadVideoThreads, mediaCacheSizeInBytes, }: ValidateCompositionOptions<Provider>) => Promise<VideoConfig>;
24
26
  export {};
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateComposition = void 0;
4
4
  const renderer_1 = require("@remotion/renderer");
5
5
  const validate_1 = require("./validate");
6
- const validateComposition = async ({ serveUrl, composition, browserInstance, serializedInputPropsWithCustomSchema, envVariables, timeoutInMilliseconds, chromiumOptions, port, forceHeight, forceWidth, logLevel, server, offthreadVideoCacheSizeInBytes, onBrowserDownload, onServeUrlVisited, providerSpecifics, offthreadVideoThreads, mediaCacheSizeInBytes, }) => {
6
+ const validateComposition = async ({ serveUrl, composition, browserInstance, serializedInputPropsWithCustomSchema, envVariables, timeoutInMilliseconds, chromiumOptions, port, forceHeight, forceWidth, forceFps, forceDurationInFrames, logLevel, server, offthreadVideoCacheSizeInBytes, onBrowserDownload, onServeUrlVisited, providerSpecifics, offthreadVideoThreads, mediaCacheSizeInBytes, }) => {
7
7
  const { metadata: comp } = await renderer_1.RenderInternals.internalSelectComposition({
8
8
  id: composition,
9
9
  puppeteerInstance: browserInstance,
@@ -30,6 +30,8 @@ const validateComposition = async ({ serveUrl, composition, browserInstance, ser
30
30
  ...comp,
31
31
  height: forceHeight !== null && forceHeight !== void 0 ? forceHeight : comp.height,
32
32
  width: forceWidth !== null && forceWidth !== void 0 ? forceWidth : comp.width,
33
+ fps: forceFps !== null && forceFps !== void 0 ? forceFps : comp.fps,
34
+ durationInFrames: forceDurationInFrames !== null && forceDurationInFrames !== void 0 ? forceDurationInFrames : comp.durationInFrames,
33
35
  };
34
36
  const reason = `of the "<Composition />" component with the id "${composition}"`;
35
37
  (0, validate_1.validateDurationInFrames)(comp.durationInFrames, {
package/package.json CHANGED
@@ -3,13 +3,13 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/serverless"
4
4
  },
5
5
  "name": "@remotion/serverless",
6
- "version": "4.0.424",
6
+ "version": "4.0.426",
7
7
  "description": "A runtime for distributed rendering",
8
8
  "main": "dist",
9
9
  "sideEffects": false,
10
10
  "scripts": {
11
11
  "lint": "eslint src",
12
- "formatting": "prettier --experimental-cli src --check",
12
+ "formatting": "prettier src --check",
13
13
  "test": "bun test src",
14
14
  "make": "tsgo -d"
15
15
  },
@@ -23,13 +23,13 @@
23
23
  "access": "public"
24
24
  },
25
25
  "dependencies": {
26
- "@remotion/renderer": "4.0.424",
27
- "@remotion/bundler": "4.0.424",
28
- "@remotion/licensing": "4.0.424",
29
- "@remotion/serverless-client": "4.0.424"
26
+ "@remotion/renderer": "4.0.426",
27
+ "@remotion/bundler": "4.0.426",
28
+ "@remotion/licensing": "4.0.426",
29
+ "@remotion/serverless-client": "4.0.426"
30
30
  },
31
31
  "devDependencies": {
32
- "@remotion/eslint-config-internal": "4.0.424",
32
+ "@remotion/eslint-config-internal": "4.0.426",
33
33
  "eslint": "9.19.0",
34
34
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
35
35
  },