@remotion/serverless 4.0.244 → 4.0.245

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.
Files changed (92) hide show
  1. package/.turbo/turbo-formatting.log +7 -0
  2. package/.turbo/turbo-lint.log +11 -0
  3. package/.turbo/turbo-make.log +1 -1
  4. package/LICENSE.md +1 -1
  5. package/dist/best-frames-per-function-param.d.ts +1 -0
  6. package/dist/best-frames-per-function-param.js +17 -0
  7. package/dist/calculate-chunk-times.d.ts +5 -0
  8. package/dist/calculate-chunk-times.js +29 -0
  9. package/dist/can-concat-seamlessly.d.ts +3 -0
  10. package/dist/can-concat-seamlessly.js +17 -0
  11. package/dist/cleanup-props.d.ts +9 -0
  12. package/dist/cleanup-props.js +23 -0
  13. package/dist/cleanup-serialized-input-props.d.ts +15 -0
  14. package/dist/cleanup-serialized-input-props.js +34 -0
  15. package/dist/concat-videos.d.ts +26 -0
  16. package/dist/concat-videos.js +53 -0
  17. package/dist/create-post-render-data.d.ts +20 -0
  18. package/dist/create-post-render-data.js +68 -0
  19. package/dist/docs-url.d.ts +1 -0
  20. package/dist/docs-url.js +4 -0
  21. package/dist/estimate-price-from-bucket.d.ts +15 -0
  22. package/dist/estimate-price-from-bucket.js +31 -0
  23. package/dist/find-output-file-in-bucket.d.ts +16 -0
  24. package/dist/find-output-file-in-bucket.js +41 -0
  25. package/dist/format-costs-info.d.ts +2 -0
  26. package/dist/format-costs-info.js +23 -0
  27. package/dist/get-overall-progress-from-storage.d.ts +11 -0
  28. package/dist/get-overall-progress-from-storage.js +25 -0
  29. package/dist/get-overall-progress.d.ts +9 -0
  30. package/dist/get-overall-progress.js +23 -0
  31. package/dist/handlers/compositions.d.ts +11 -0
  32. package/dist/handlers/compositions.js +81 -0
  33. package/dist/handlers/launch.d.ts +17 -0
  34. package/dist/handlers/launch.js +601 -0
  35. package/dist/handlers/progress.d.ts +12 -0
  36. package/dist/handlers/progress.js +51 -0
  37. package/dist/handlers/renderer.d.ts +23 -0
  38. package/dist/handlers/renderer.js +342 -0
  39. package/dist/handlers/start.d.ts +14 -0
  40. package/dist/handlers/start.js +105 -0
  41. package/dist/handlers/still.d.ts +20 -0
  42. package/dist/handlers/still.js +334 -0
  43. package/dist/inspect-error.d.ts +4 -0
  44. package/dist/inspect-error.js +39 -0
  45. package/dist/invoke-webhook.d.ts +39 -0
  46. package/dist/invoke-webhook.js +116 -0
  47. package/dist/leak-detection.d.ts +4 -0
  48. package/dist/leak-detection.js +40 -0
  49. package/dist/make-timeout-error.d.ts +13 -0
  50. package/dist/make-timeout-error.js +32 -0
  51. package/dist/make-timeout-message.d.ts +12 -0
  52. package/dist/make-timeout-message.js +75 -0
  53. package/dist/merge-chunks.d.ts +37 -0
  54. package/dist/merge-chunks.js +92 -0
  55. package/dist/min-max.d.ts +2 -0
  56. package/dist/min-max.js +33 -0
  57. package/dist/most-expensive-chunks.d.ts +13 -0
  58. package/dist/most-expensive-chunks.js +28 -0
  59. package/dist/on-downloads-helpers.d.ts +2 -0
  60. package/dist/on-downloads-helpers.js +29 -0
  61. package/dist/overall-render-progress.d.ts +59 -0
  62. package/dist/overall-render-progress.js +180 -0
  63. package/dist/plan-frame-ranges.d.ts +7 -0
  64. package/dist/plan-frame-ranges.js +17 -0
  65. package/dist/progress.d.ts +16 -0
  66. package/dist/progress.js +254 -0
  67. package/dist/render-has-audio-video.d.ts +6 -0
  68. package/dist/render-has-audio-video.js +21 -0
  69. package/dist/render-progress.d.ts +51 -0
  70. package/dist/render-progress.js +2 -0
  71. package/dist/return-values.d.ts +38 -0
  72. package/dist/return-values.js +2 -0
  73. package/dist/stackback.d.ts +6 -0
  74. package/dist/stackback.js +59 -0
  75. package/dist/stream-renderer.d.ts +17 -0
  76. package/dist/stream-renderer.js +148 -0
  77. package/dist/types.d.ts +54 -0
  78. package/dist/types.js +2 -0
  79. package/dist/validate-download-behavior.d.ts +1 -0
  80. package/dist/validate-download-behavior.js +21 -0
  81. package/dist/validate-frames-per-function.d.ts +4 -0
  82. package/dist/validate-frames-per-function.js +29 -0
  83. package/dist/validate-frames-per-lambda.d.ts +4 -0
  84. package/dist/validate-frames-per-lambda.js +29 -0
  85. package/dist/validate-privacy.d.ts +2 -0
  86. package/dist/validate-privacy.js +14 -0
  87. package/dist/validate.d.ts +4 -0
  88. package/dist/validate.js +8 -0
  89. package/dist/why-is-node-running.d.ts +15 -0
  90. package/dist/why-is-node-running.js +89 -0
  91. package/package.json +5 -5
  92. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.rendererHandler = void 0;
7
+ const renderer_1 = require("@remotion/renderer");
8
+ const pure_1 = require("@remotion/renderer/pure");
9
+ const node_fs_1 = __importDefault(require("node:fs"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const version_1 = require("remotion/version");
12
+ const can_concat_seamlessly_1 = require("../can-concat-seamlessly");
13
+ const compress_props_1 = require("../compress-props");
14
+ const constants_1 = require("../constants");
15
+ const leak_detection_1 = require("../leak-detection");
16
+ const on_downloads_helpers_1 = require("../on-downloads-helpers");
17
+ const serialize_artifact_1 = require("../serialize-artifact");
18
+ const truthy_1 = require("../truthy");
19
+ const why_is_node_running_1 = require("../why-is-node-running");
20
+ const write_lambda_error_1 = require("../write-lambda-error");
21
+ const renderHandler = async ({ params, options, logs, onStream, providerSpecifics, }) => {
22
+ if (params.type !== constants_1.ServerlessRoutines.renderer) {
23
+ throw new Error('Params must be renderer');
24
+ }
25
+ if (params.launchFunctionConfig.version !== version_1.VERSION) {
26
+ throw new Error(`The version of the function that was specified as "rendererFunctionName" is ${version_1.VERSION} but the version of the function that invoked the render is ${params.launchFunctionConfig.version}. Please make sure that the version of the function that is specified as "rendererFunctionName" is the same as the version of the function that is invoked.`);
27
+ }
28
+ const inputPropsPromise = (0, compress_props_1.decompressInputProps)({
29
+ bucketName: params.bucketName,
30
+ expectedBucketOwner: options.expectedBucketOwner,
31
+ region: providerSpecifics.getCurrentRegionInFunction(),
32
+ serialized: params.inputProps,
33
+ propsType: 'input-props',
34
+ providerSpecifics,
35
+ forcePathStyle: params.forcePathStyle,
36
+ });
37
+ const resolvedPropsPromise = (0, compress_props_1.decompressInputProps)({
38
+ bucketName: params.bucketName,
39
+ expectedBucketOwner: options.expectedBucketOwner,
40
+ region: providerSpecifics.getCurrentRegionInFunction(),
41
+ serialized: params.resolvedProps,
42
+ propsType: 'resolved-props',
43
+ providerSpecifics,
44
+ forcePathStyle: params.forcePathStyle,
45
+ });
46
+ const browserInstance = await providerSpecifics.getBrowserInstance({
47
+ logLevel: params.logLevel,
48
+ indent: false,
49
+ chromiumOptions: params.chromiumOptions,
50
+ providerSpecifics,
51
+ });
52
+ const outputPath = renderer_1.RenderInternals.tmpDir('remotion-render-');
53
+ if (typeof params.chunk !== 'number') {
54
+ throw new Error('must pass chunk');
55
+ }
56
+ if (!params.frameRange) {
57
+ throw new Error('must pass framerange');
58
+ }
59
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Rendering frames ${params.frameRange[0]}-${params.frameRange[1]} in this Lambda function`);
60
+ const start = Date.now();
61
+ const chunkTimingData = {
62
+ timings: {},
63
+ chunk: params.chunk,
64
+ frameRange: params.frameRange,
65
+ startDate: start,
66
+ };
67
+ const outdir = renderer_1.RenderInternals.tmpDir(constants_1.RENDERER_PATH_TOKEN);
68
+ const chunk = `localchunk-${String(params.chunk).padStart(8, '0')}`;
69
+ const defaultAudioCodec = renderer_1.RenderInternals.getDefaultAudioCodec({
70
+ codec: params.codec,
71
+ preferLossless: params.preferLossless,
72
+ });
73
+ const seamlessAudio = (0, can_concat_seamlessly_1.canConcatAudioSeamlessly)(defaultAudioCodec, params.framesPerLambda);
74
+ const seamlessVideo = (0, can_concat_seamlessly_1.canConcatVideoSeamlessly)(params.codec);
75
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Preparing for rendering a chunk. Audio = ${seamlessAudio ? 'seamless' : 'normal'}, Video = ${seamlessVideo ? 'seamless' : 'normal'}`, params.logLevel);
76
+ const chunkCodec = seamlessVideo && params.codec === 'h264'
77
+ ? 'h264-ts'
78
+ : params.codec === 'gif'
79
+ ? 'h264-ts'
80
+ : params.codec;
81
+ const audioCodec = defaultAudioCodec === null
82
+ ? null
83
+ : seamlessAudio
84
+ ? defaultAudioCodec
85
+ : 'pcm-16';
86
+ const videoExtension = renderer_1.RenderInternals.getFileExtensionFromCodec(chunkCodec, audioCodec);
87
+ const audioExtension = audioCodec
88
+ ? renderer_1.RenderInternals.getExtensionFromAudioCodec(audioCodec)
89
+ : null;
90
+ const videoOutputLocation = node_path_1.default.join(outdir, `${chunk}.${videoExtension}`);
91
+ const willRenderAudioEval = renderer_1.RenderInternals.getShouldRenderAudio({
92
+ assetsInfo: null,
93
+ codec: params.codec,
94
+ enforceAudioTrack: true,
95
+ muted: params.muted,
96
+ });
97
+ if (willRenderAudioEval === 'maybe') {
98
+ throw new Error('Cannot determine whether to render audio or not');
99
+ }
100
+ const audioOutputLocation = willRenderAudioEval === 'no'
101
+ ? null
102
+ : pure_1.NoReactAPIs.isAudioCodec(params.codec)
103
+ ? null
104
+ : audioExtension
105
+ ? node_path_1.default.join(outdir, `${chunk}.${audioExtension}`)
106
+ : null;
107
+ const resolvedProps = await resolvedPropsPromise;
108
+ const serializedInputPropsWithCustomSchema = await inputPropsPromise;
109
+ const allFrames = renderer_1.RenderInternals.getFramesToRender(params.frameRange, params.everyNthFrame);
110
+ const onArtifact = (artifact) => {
111
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, `Received artifact on frame ${artifact.frame}:`, artifact.filename, artifact.content.length + 'bytes. Streaming to main function');
112
+ const startTimestamp = Date.now();
113
+ onStream({
114
+ type: 'artifact-emitted',
115
+ payload: {
116
+ artifact: (0, serialize_artifact_1.serializeArtifact)(artifact),
117
+ },
118
+ })
119
+ .then(() => {
120
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, `Streaming artifact ${artifact.filename} to main function took ${Date.now() - startTimestamp}ms`);
121
+ })
122
+ .catch((e) => {
123
+ renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, `Error streaming artifact ${artifact.filename} to main function`, e);
124
+ });
125
+ };
126
+ await new Promise((resolve, reject) => {
127
+ var _a, _b, _c, _d, _e;
128
+ renderer_1.RenderInternals.internalRenderMedia({
129
+ repro: false,
130
+ composition: {
131
+ id: params.composition,
132
+ durationInFrames: params.durationInFrames,
133
+ fps: params.fps,
134
+ height: params.height,
135
+ width: params.width,
136
+ defaultCodec: null,
137
+ },
138
+ imageFormat: params.imageFormat,
139
+ serializedInputPropsWithCustomSchema,
140
+ frameRange: params.frameRange,
141
+ onProgress: ({ renderedFrames, encodedFrames, stitchStage }) => {
142
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Rendered ${renderedFrames} frames, encoded ${encodedFrames} frames, stage = ${stitchStage}`);
143
+ const allFramesRendered = allFrames.length === renderedFrames;
144
+ const allFramesEncoded = allFrames.length === encodedFrames;
145
+ const frameReportPoint = (renderedFrames % params.progressEveryNthFrame === 0 ||
146
+ allFramesRendered) &&
147
+ !allFramesEncoded;
148
+ const encodedFramesReportPoint = (encodedFrames % params.progressEveryNthFrame === 0 ||
149
+ allFramesEncoded) &&
150
+ allFramesRendered;
151
+ if (frameReportPoint || encodedFramesReportPoint) {
152
+ onStream({
153
+ type: 'frames-rendered',
154
+ payload: { rendered: renderedFrames, encoded: encodedFrames },
155
+ });
156
+ }
157
+ if (renderedFrames === allFrames.length) {
158
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Rendered all frames!');
159
+ }
160
+ chunkTimingData.timings[renderedFrames] = Date.now() - start;
161
+ },
162
+ concurrency: params.concurrencyPerLambda,
163
+ onStart: () => {
164
+ onStream({
165
+ type: 'lambda-invoked',
166
+ payload: {
167
+ attempt: params.attempt,
168
+ },
169
+ });
170
+ },
171
+ puppeteerInstance: browserInstance.instance,
172
+ serveUrl: params.serveUrl,
173
+ jpegQuality: (_a = params.jpegQuality) !== null && _a !== void 0 ? _a : renderer_1.RenderInternals.DEFAULT_JPEG_QUALITY,
174
+ envVariables: (_b = params.envVariables) !== null && _b !== void 0 ? _b : {},
175
+ logLevel: params.logLevel,
176
+ onBrowserLog: (log) => {
177
+ logs.push(log);
178
+ },
179
+ outputLocation: videoOutputLocation,
180
+ codec: chunkCodec,
181
+ crf: (_c = params.crf) !== null && _c !== void 0 ? _c : null,
182
+ pixelFormat: (_d = params.pixelFormat) !== null && _d !== void 0 ? _d : renderer_1.RenderInternals.DEFAULT_PIXEL_FORMAT,
183
+ proResProfile: (_e = params.proResProfile) !== null && _e !== void 0 ? _e : undefined,
184
+ x264Preset: params.x264Preset,
185
+ onDownload: (0, on_downloads_helpers_1.onDownloadsHelper)(params.logLevel),
186
+ overwrite: false,
187
+ chromiumOptions: params.chromiumOptions,
188
+ scale: params.scale,
189
+ timeoutInMilliseconds: params.timeoutInMilliseconds,
190
+ port: null,
191
+ everyNthFrame: params.everyNthFrame,
192
+ numberOfGifLoops: null,
193
+ muted: params.muted,
194
+ enforceAudioTrack: true,
195
+ audioBitrate: params.audioBitrate,
196
+ videoBitrate: params.videoBitrate,
197
+ encodingBufferSize: params.encodingBufferSize,
198
+ encodingMaxRate: params.encodingMaxRate,
199
+ audioCodec,
200
+ preferLossless: params.preferLossless,
201
+ browserExecutable: providerSpecifics.getChromiumPath(),
202
+ cancelSignal: undefined,
203
+ disallowParallelEncoding: false,
204
+ ffmpegOverride: ({ args }) => args,
205
+ indent: false,
206
+ onCtrlCExit: () => undefined,
207
+ server: undefined,
208
+ serializedResolvedPropsWithCustomSchema: resolvedProps,
209
+ offthreadVideoCacheSizeInBytes: params.offthreadVideoCacheSizeInBytes,
210
+ colorSpace: params.colorSpace,
211
+ binariesDirectory: null,
212
+ separateAudioTo: audioOutputLocation,
213
+ forSeamlessAacConcatenation: seamlessAudio,
214
+ compositionStart: params.compositionStart,
215
+ onBrowserDownload: () => {
216
+ throw new Error('Should not download a browser in Lambda');
217
+ },
218
+ onArtifact,
219
+ metadata: params.metadata,
220
+ hardwareAcceleration: 'disable',
221
+ })
222
+ .then(({ slowestFrames }) => {
223
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Slowest frames:`);
224
+ slowestFrames.forEach(({ frame, time }) => {
225
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, ` Frame ${frame} (${time.toFixed(3)}ms)`);
226
+ });
227
+ resolve();
228
+ })
229
+ .catch((err) => reject(err));
230
+ });
231
+ const streamTimer = providerSpecifics.timer('Streaming chunk to the main function', params.logLevel);
232
+ if (audioOutputLocation) {
233
+ const audioChunkTimer = providerSpecifics.timer('Sending audio chunk', params.logLevel);
234
+ await onStream({
235
+ type: 'audio-chunk-rendered',
236
+ payload: node_fs_1.default.readFileSync(audioOutputLocation),
237
+ });
238
+ audioChunkTimer.end();
239
+ }
240
+ if (videoOutputLocation) {
241
+ const videoChunkTimer = providerSpecifics.timer('Sending main chunk', params.logLevel);
242
+ await onStream({
243
+ type: pure_1.NoReactAPIs.isAudioCodec(params.codec)
244
+ ? 'audio-chunk-rendered'
245
+ : 'video-chunk-rendered',
246
+ payload: node_fs_1.default.readFileSync(videoOutputLocation),
247
+ });
248
+ videoChunkTimer.end();
249
+ }
250
+ const endRendered = Date.now();
251
+ await onStream({
252
+ type: 'chunk-complete',
253
+ payload: {
254
+ rendered: endRendered,
255
+ start,
256
+ },
257
+ });
258
+ streamTimer.end();
259
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Cleaning up and writing timings');
260
+ await Promise.all([
261
+ node_fs_1.default.promises.rm(videoOutputLocation, { recursive: true }),
262
+ audioOutputLocation
263
+ ? node_fs_1.default.promises.rm(audioOutputLocation, { recursive: true })
264
+ : null,
265
+ node_fs_1.default.promises.rm(outputPath, { recursive: true }),
266
+ ].filter(truthy_1.truthy));
267
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Done!');
268
+ return {};
269
+ };
270
+ const ENABLE_SLOW_LEAK_DETECTION = false;
271
+ const rendererHandler = async ({ onStream, options, params, providerSpecifics, requestContext, }) => {
272
+ if (params.type !== constants_1.ServerlessRoutines.renderer) {
273
+ throw new Error('Params must be renderer');
274
+ }
275
+ const logs = [];
276
+ const leakDetection = (0, why_is_node_running_1.enableNodeIntrospection)(ENABLE_SLOW_LEAK_DETECTION);
277
+ let shouldKeepBrowserOpen = true;
278
+ try {
279
+ await renderHandler({
280
+ params,
281
+ options,
282
+ logs,
283
+ onStream,
284
+ providerSpecifics,
285
+ });
286
+ return {
287
+ type: 'success',
288
+ };
289
+ }
290
+ catch (err) {
291
+ if (process.env.NODE_ENV === 'test') {
292
+ // eslint-disable-next-line no-console
293
+ console.log({ err });
294
+ throw err;
295
+ }
296
+ // If this error is encountered, we can just retry as it
297
+ // is a very rare error to occur
298
+ const isRetryableError = providerSpecifics.isFlakyError(err);
299
+ if (isRetryableError) {
300
+ shouldKeepBrowserOpen = false;
301
+ }
302
+ const shouldNotRetry = err.name === 'CancelledError';
303
+ const shouldRetry = isRetryableError && params.retriesLeft > 0 && !shouldNotRetry;
304
+ renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, `Error occurred (will retry = ${String(shouldRetry)})`);
305
+ renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, err.stack);
306
+ onStream({
307
+ type: 'error-occurred',
308
+ payload: {
309
+ error: err.stack,
310
+ shouldRetry,
311
+ errorInfo: {
312
+ name: err.name,
313
+ message: err.message,
314
+ stack: err.stack,
315
+ chunk: params.chunk,
316
+ frame: null,
317
+ type: 'renderer',
318
+ isFatal: !shouldRetry,
319
+ tmpDir: (0, write_lambda_error_1.getTmpDirStateIfENoSp)(err.stack, providerSpecifics),
320
+ attempt: params.attempt,
321
+ totalAttempts: params.retriesLeft + params.attempt,
322
+ willRetry: shouldRetry,
323
+ },
324
+ },
325
+ });
326
+ throw err;
327
+ }
328
+ finally {
329
+ if (shouldKeepBrowserOpen) {
330
+ providerSpecifics.forgetBrowserEventLoop(params.logLevel);
331
+ }
332
+ else {
333
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, 'Lambda did not succeed with flaky error, not keeping browser open.');
334
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, 'Quitting Lambda forcefully now to force not keeping the Lambda warm.');
335
+ process.exit(0);
336
+ }
337
+ if (ENABLE_SLOW_LEAK_DETECTION) {
338
+ (0, leak_detection_1.startLeakDetection)(leakDetection, requestContext.awsRequestId);
339
+ }
340
+ }
341
+ };
342
+ exports.rendererHandler = rendererHandler;
@@ -0,0 +1,14 @@
1
+ import type { ServerlessPayload } from '../constants';
2
+ import type { ProviderSpecifics } from '../provider-implementation';
3
+ import type { CloudProvider } from '../types';
4
+ type Options = {
5
+ expectedBucketOwner: string;
6
+ timeoutInMilliseconds: number;
7
+ renderId: string;
8
+ };
9
+ export declare const startHandler: <Provider extends CloudProvider>(params: ServerlessPayload<Provider>, options: Options, providerSpecifics: ProviderSpecifics<Provider>) => Promise<{
10
+ type: "success";
11
+ bucketName: string;
12
+ renderId: string;
13
+ }>;
14
+ export {};
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startHandler = void 0;
4
+ const version_1 = require("remotion/version");
5
+ const constants_1 = require("../constants");
6
+ const get_or_create_bucket_1 = require("../get-or-create-bucket");
7
+ const overall_render_progress_1 = require("../overall-render-progress");
8
+ const startHandler = async (params, options, providerSpecifics) => {
9
+ var _a, _b, _c, _d;
10
+ if (params.type !== constants_1.ServerlessRoutines.start) {
11
+ throw new TypeError('Expected type start');
12
+ }
13
+ if (params.version !== version_1.VERSION) {
14
+ if (!params.version) {
15
+ throw new Error(`Version mismatch: When calling renderMediaOnLambda(), you called the function ${process.env.AWS_LAMBDA_FUNCTION_NAME} which has the version ${version_1.VERSION} but the @remotion/lambda package is an older version. Deploy a new function and use it to call renderMediaOnLambda(). See: https://www.remotion.dev/docs/lambda/upgrading`);
16
+ }
17
+ throw new Error(`Version mismatch: When calling renderMediaOnLambda(), you passed ${process.env.AWS_LAMBDA_FUNCTION_NAME} as the function, which has the version ${version_1.VERSION}, but the @remotion/lambda package you used to invoke the function has version ${params.version}. Deploy a new function and use it to call renderMediaOnLambda(). See: https://www.remotion.dev/docs/lambda/upgrading`);
18
+ }
19
+ const region = providerSpecifics.getCurrentRegionInFunction();
20
+ const bucketName = (_a = params.bucketName) !== null && _a !== void 0 ? _a : (await (0, get_or_create_bucket_1.internalGetOrCreateBucket)({
21
+ region: providerSpecifics.getCurrentRegionInFunction(),
22
+ enableFolderExpiry: null,
23
+ customCredentials: null,
24
+ providerSpecifics,
25
+ forcePathStyle: params.forcePathStyle,
26
+ skipPutAcl: false,
27
+ })).bucketName;
28
+ const realServeUrl = providerSpecifics.convertToServeUrl({
29
+ urlOrId: params.serveUrl,
30
+ region,
31
+ bucketName,
32
+ });
33
+ providerSpecifics.validateDeleteAfter(params.deleteAfter);
34
+ const initialFile = providerSpecifics.writeFile({
35
+ bucketName,
36
+ downloadBehavior: null,
37
+ region,
38
+ body: JSON.stringify((0, overall_render_progress_1.makeInitialOverallRenderProgress)(options.timeoutInMilliseconds + Date.now())),
39
+ expectedBucketOwner: options.expectedBucketOwner,
40
+ key: (0, constants_1.overallProgressKey)(options.renderId),
41
+ privacy: 'private',
42
+ customCredentials: null,
43
+ forcePathStyle: params.forcePathStyle,
44
+ });
45
+ const payload = {
46
+ type: constants_1.ServerlessRoutines.launch,
47
+ framesPerLambda: params.framesPerLambda,
48
+ composition: params.composition,
49
+ serveUrl: realServeUrl,
50
+ inputProps: params.inputProps,
51
+ bucketName,
52
+ renderId: options.renderId,
53
+ codec: params.codec,
54
+ imageFormat: params.imageFormat,
55
+ crf: (_b = params.crf) !== null && _b !== void 0 ? _b : null,
56
+ envVariables: params.envVariables,
57
+ pixelFormat: (_c = params.pixelFormat) !== null && _c !== void 0 ? _c : null,
58
+ proResProfile: (_d = params.proResProfile) !== null && _d !== void 0 ? _d : null,
59
+ x264Preset: params.x264Preset,
60
+ jpegQuality: params.jpegQuality,
61
+ maxRetries: params.maxRetries,
62
+ privacy: params.privacy,
63
+ logLevel: params.logLevel,
64
+ frameRange: params.frameRange,
65
+ outName: params.outName,
66
+ timeoutInMilliseconds: params.timeoutInMilliseconds,
67
+ chromiumOptions: params.chromiumOptions,
68
+ scale: params.scale,
69
+ numberOfGifLoops: params.numberOfGifLoops,
70
+ everyNthFrame: params.everyNthFrame,
71
+ concurrencyPerLambda: params.concurrencyPerLambda,
72
+ downloadBehavior: params.downloadBehavior,
73
+ muted: params.muted,
74
+ overwrite: params.overwrite,
75
+ webhook: params.webhook,
76
+ audioBitrate: params.audioBitrate,
77
+ videoBitrate: params.videoBitrate,
78
+ encodingBufferSize: params.encodingBufferSize,
79
+ encodingMaxRate: params.encodingMaxRate,
80
+ forceHeight: params.forceHeight,
81
+ forceWidth: params.forceWidth,
82
+ rendererFunctionName: params.rendererFunctionName,
83
+ audioCodec: params.audioCodec,
84
+ offthreadVideoCacheSizeInBytes: params.offthreadVideoCacheSizeInBytes,
85
+ deleteAfter: params.deleteAfter,
86
+ colorSpace: params.colorSpace,
87
+ preferLossless: params.preferLossless,
88
+ forcePathStyle: params.forcePathStyle,
89
+ metadata: params.metadata,
90
+ };
91
+ await providerSpecifics.callFunctionAsync({
92
+ functionName: providerSpecifics.getCurrentFunctionName(),
93
+ type: constants_1.ServerlessRoutines.launch,
94
+ payload,
95
+ region,
96
+ timeoutInTest: options.timeoutInMilliseconds,
97
+ });
98
+ await initialFile;
99
+ return {
100
+ type: 'success',
101
+ bucketName,
102
+ renderId: options.renderId,
103
+ };
104
+ };
105
+ exports.startHandler = startHandler;
@@ -0,0 +1,20 @@
1
+ import type { ServerlessPayload } from '../constants';
2
+ import type { ProviderSpecifics } from '../provider-implementation';
3
+ import type { OnStream } from '../streaming/streaming';
4
+ import type { CloudProvider } from '../types';
5
+ type Options<Provider extends CloudProvider> = {
6
+ params: ServerlessPayload<Provider>;
7
+ renderId: string;
8
+ expectedBucketOwner: string;
9
+ onStream: OnStream<Provider>;
10
+ timeoutInMilliseconds: number;
11
+ providerSpecifics: ProviderSpecifics<Provider>;
12
+ };
13
+ export declare const stillHandler: <Provider extends CloudProvider>(options: Options<Provider>) => Promise<{
14
+ type: "success";
15
+ } | {
16
+ type: "error";
17
+ message: string;
18
+ stack: string;
19
+ }>;
20
+ export {};