@remotion/lambda 4.0.254 → 4.0.256

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 (127) hide show
  1. package/dist/api/__mocks__/clean-items.d.ts +2 -0
  2. package/dist/api/__mocks__/clean-items.js +24 -0
  3. package/dist/api/__mocks__/create-function.d.ts +2 -0
  4. package/dist/api/__mocks__/create-function.js +21 -0
  5. package/dist/api/__mocks__/delete-function.d.ts +2 -0
  6. package/dist/api/__mocks__/delete-function.js +9 -0
  7. package/dist/api/__mocks__/get-functions.d.ts +2 -0
  8. package/dist/api/__mocks__/get-functions.js +9 -0
  9. package/dist/api/__mocks__/upload-dir.d.ts +3 -0
  10. package/dist/api/__mocks__/upload-dir.js +47 -0
  11. package/dist/api/mock-functions.d.ts +18 -0
  12. package/dist/api/mock-functions.js +36 -0
  13. package/dist/cli/helpers/__mocks__/quit.d.ts +1 -0
  14. package/dist/cli/helpers/__mocks__/quit.js +7 -0
  15. package/dist/cli/log.d.ts +4 -4
  16. package/dist/functions/chunk-optimization/plan-frame-ranges.d.ts +7 -0
  17. package/dist/functions/chunk-optimization/plan-frame-ranges.js +17 -0
  18. package/dist/functions/chunk-optimization/types.d.ts +8 -0
  19. package/dist/functions/chunk-optimization/types.js +2 -0
  20. package/dist/functions/helpers/__mocks__/get-browser-instance.d.ts +3 -0
  21. package/dist/functions/helpers/__mocks__/get-browser-instance.js +12 -0
  22. package/dist/functions/helpers/__mocks__/leak-detection.d.ts +4 -0
  23. package/dist/functions/helpers/__mocks__/leak-detection.js +9 -0
  24. package/dist/functions/helpers/__mocks__/timer.d.ts +2 -0
  25. package/dist/functions/helpers/__mocks__/timer.js +10 -0
  26. package/dist/functions/helpers/best-frames-per-lambda-param.d.ts +1 -0
  27. package/dist/functions/helpers/best-frames-per-lambda-param.js +17 -0
  28. package/dist/functions/helpers/calculate-chunk-times.d.ts +5 -0
  29. package/dist/functions/helpers/calculate-chunk-times.js +29 -0
  30. package/dist/functions/helpers/calculate-price-from-bucket.d.ts +15 -0
  31. package/dist/functions/helpers/calculate-price-from-bucket.js +30 -0
  32. package/dist/functions/helpers/can-concat-seamlessly.d.ts +3 -0
  33. package/dist/functions/helpers/can-concat-seamlessly.js +17 -0
  34. package/dist/functions/helpers/cleanup-props.d.ts +8 -0
  35. package/dist/functions/helpers/cleanup-props.js +23 -0
  36. package/dist/functions/helpers/concat-videos.d.ts +23 -0
  37. package/dist/functions/helpers/concat-videos.js +54 -0
  38. package/dist/functions/helpers/create-post-render-data.d.ts +17 -0
  39. package/dist/functions/helpers/create-post-render-data.js +67 -0
  40. package/dist/functions/helpers/find-output-file-in-bucket.d.ts +14 -0
  41. package/dist/functions/helpers/find-output-file-in-bucket.js +38 -0
  42. package/dist/functions/helpers/format-costs-info.d.ts +2 -0
  43. package/dist/functions/helpers/format-costs-info.js +23 -0
  44. package/dist/functions/helpers/get-overall-progress-s3.d.ts +10 -0
  45. package/dist/functions/helpers/get-overall-progress-s3.js +24 -0
  46. package/dist/functions/helpers/get-overall-progress.d.ts +9 -0
  47. package/dist/functions/helpers/get-overall-progress.js +23 -0
  48. package/dist/functions/helpers/get-progress.d.ts +15 -0
  49. package/dist/functions/helpers/get-progress.js +254 -0
  50. package/dist/functions/helpers/get-retry-stats.d.ts +5 -0
  51. package/dist/functions/helpers/get-retry-stats.js +2 -0
  52. package/dist/functions/helpers/inspect-errors.d.ts +4 -0
  53. package/dist/functions/helpers/inspect-errors.js +39 -0
  54. package/dist/functions/helpers/is-warm.d.ts +2 -0
  55. package/dist/functions/helpers/is-warm.js +10 -0
  56. package/dist/functions/helpers/leak-detection.d.ts +4 -0
  57. package/dist/functions/helpers/leak-detection.js +40 -0
  58. package/dist/functions/helpers/make-timeout-error.d.ts +10 -0
  59. package/dist/functions/helpers/make-timeout-error.js +31 -0
  60. package/dist/functions/helpers/make-timeout-message.d.ts +10 -0
  61. package/dist/functions/helpers/make-timeout-message.js +75 -0
  62. package/dist/functions/helpers/merge-chunks.d.ts +36 -0
  63. package/dist/functions/helpers/merge-chunks.js +84 -0
  64. package/dist/functions/helpers/min-max.d.ts +2 -0
  65. package/dist/functions/helpers/min-max.js +33 -0
  66. package/dist/functions/helpers/on-downloads-logger.d.ts +2 -0
  67. package/dist/functions/helpers/on-downloads-logger.js +29 -0
  68. package/dist/functions/helpers/overall-render-progress.d.ts +59 -0
  69. package/dist/functions/helpers/overall-render-progress.js +180 -0
  70. package/dist/functions/helpers/print-concurrency-curve.d.ts +1 -0
  71. package/dist/functions/helpers/print-concurrency-curve.js +8 -0
  72. package/dist/functions/helpers/print-logging-helper.d.ts +4 -0
  73. package/dist/functions/helpers/print-logging-helper.js +12 -0
  74. package/dist/functions/helpers/render-has-audio-video.d.ts +6 -0
  75. package/dist/functions/helpers/render-has-audio-video.js +21 -0
  76. package/dist/functions/helpers/request-context.d.ts +5 -0
  77. package/dist/functions/helpers/request-context.js +2 -0
  78. package/dist/functions/helpers/stream-renderer.d.ts +17 -0
  79. package/dist/functions/helpers/stream-renderer.js +148 -0
  80. package/dist/functions/launch.d.ts +10 -0
  81. package/dist/functions/launch.js +595 -0
  82. package/dist/functions/progress.d.ts +11 -0
  83. package/dist/functions/progress.js +51 -0
  84. package/dist/functions/renderer.d.ts +17 -0
  85. package/dist/functions/renderer.js +341 -0
  86. package/dist/functions/start.d.ts +13 -0
  87. package/dist/functions/start.js +112 -0
  88. package/dist/functions/still.d.ts +19 -0
  89. package/dist/functions/still.js +329 -0
  90. package/dist/shared/__mocks__/aws-clients.d.ts +2 -0
  91. package/dist/shared/__mocks__/aws-clients.js +62 -0
  92. package/dist/shared/__mocks__/bundle-site.d.ts +2 -0
  93. package/dist/shared/__mocks__/bundle-site.js +32 -0
  94. package/dist/shared/__mocks__/check-credentials.d.ts +1 -0
  95. package/dist/shared/__mocks__/check-credentials.js +5 -0
  96. package/dist/shared/__mocks__/get-account-id.d.ts +2 -0
  97. package/dist/shared/__mocks__/get-account-id.js +11 -0
  98. package/dist/shared/__mocks__/read-dir.d.ts +2 -0
  99. package/dist/shared/__mocks__/read-dir.js +13 -0
  100. package/dist/shared/call-lambda.d.ts +16 -0
  101. package/dist/shared/call-lambda.js +149 -0
  102. package/dist/shared/cleanup-serialized-input-props.d.ts +14 -0
  103. package/dist/shared/cleanup-serialized-input-props.js +34 -0
  104. package/dist/shared/docs-url.d.ts +1 -0
  105. package/dist/shared/docs-url.js +4 -0
  106. package/dist/shared/get-most-expensive-chunks.d.ts +8 -0
  107. package/dist/shared/get-most-expensive-chunks.js +28 -0
  108. package/dist/shared/invoke-webhook.d.ts +48 -0
  109. package/dist/shared/invoke-webhook.js +140 -0
  110. package/dist/shared/parse-lambda-timings-key.d.ts +5 -0
  111. package/dist/shared/parse-lambda-timings-key.js +2 -0
  112. package/dist/shared/return-values.d.ts +16 -0
  113. package/dist/shared/return-values.js +2 -0
  114. package/dist/shared/stackback.d.ts +6 -0
  115. package/dist/shared/stackback.js +59 -0
  116. package/dist/shared/validate-download-behavior.d.ts +1 -0
  117. package/dist/shared/validate-download-behavior.js +21 -0
  118. package/dist/shared/validate-frames-per-lambda.d.ts +4 -0
  119. package/dist/shared/validate-frames-per-lambda.js +29 -0
  120. package/dist/shared/validate-privacy.d.ts +2 -0
  121. package/dist/shared/validate-privacy.js +14 -0
  122. package/dist/shared/validate.d.ts +4 -0
  123. package/dist/shared/validate.js +8 -0
  124. package/dist/shared/why-is-node-running.d.ts +15 -0
  125. package/dist/shared/why-is-node-running.js +88 -0
  126. package/package.json +12 -12
  127. package/remotionlambda-arm64.zip +0 -0
@@ -0,0 +1,10 @@
1
+ import type { CloudProvider } from '@remotion/serverless';
2
+ import type { RenderMetadata } from '@remotion/serverless/client';
3
+ export declare const makeTimeoutMessage: <Provider extends CloudProvider>({ timeoutInMilliseconds, missingChunks, renderMetadata, renderId, functionName, region, }: {
4
+ timeoutInMilliseconds: number;
5
+ missingChunks: number[];
6
+ renderMetadata: RenderMetadata<Provider>;
7
+ renderId: string;
8
+ region: Provider["region"];
9
+ functionName: string;
10
+ }) => string;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeTimeoutMessage = void 0;
4
+ const client_1 = require("@remotion/serverless/client");
5
+ const docs_url_1 = require("../../shared/docs-url");
6
+ const get_aws_urls_1 = require("../../shared/get-aws-urls");
7
+ const MAX_MISSING_CHUNKS = 5;
8
+ const makeChunkMissingMessage = ({ missingChunks, renderMetadata, region, }) => {
9
+ if (missingChunks.length === 0) {
10
+ return 'All chunks have been successfully rendered, but the main function has timed out.';
11
+ }
12
+ return [
13
+ `The following chunks are missing (showing ${Math.min(MAX_MISSING_CHUNKS, missingChunks.length)} out of ${missingChunks.length}):`,
14
+ ...missingChunks
15
+ .map((ch) => {
16
+ const isLastChunk = ch === renderMetadata.totalChunks - 1;
17
+ const start = ch * renderMetadata.framesPerLambda;
18
+ const end = renderMetadata.type === 'still'
19
+ ? 0
20
+ : isLastChunk
21
+ ? renderMetadata.frameRange[1]
22
+ : (ch + 1) * renderMetadata.framesPerLambda - 1;
23
+ const msg = `Chunk ${ch} (Frames ${start} - ${end})`;
24
+ return [
25
+ msg,
26
+ `▸ Logs for chunk ${ch}: ${(0, get_aws_urls_1.getCloudwatchRendererUrl)({
27
+ functionName: process.env.AWS_LAMBDA_FUNCTION_NAME,
28
+ region: region,
29
+ rendererFunctionName: null,
30
+ renderId: renderMetadata.renderId,
31
+ chunk: ch,
32
+ })}`,
33
+ ].join('\n');
34
+ })
35
+ .slice(0, 5),
36
+ ].join('\n');
37
+ };
38
+ const makeTimeoutMessage = ({ timeoutInMilliseconds, missingChunks, renderMetadata, renderId, functionName, region, }) => {
39
+ const cloudWatchRendererUrl = (0, get_aws_urls_1.getCloudwatchRendererUrl)({
40
+ renderId,
41
+ functionName,
42
+ region: region,
43
+ rendererFunctionName: functionName,
44
+ chunk: null,
45
+ });
46
+ const cloudWatchLaunchUrl = (0, get_aws_urls_1.getCloudwatchMethodUrl)({
47
+ renderId,
48
+ functionName,
49
+ method: client_1.ServerlessRoutines.launch,
50
+ region: region,
51
+ rendererFunctionName: functionName,
52
+ });
53
+ const message = [
54
+ `The main function timed out after ${timeoutInMilliseconds}ms.`,
55
+ makeChunkMissingMessage({
56
+ missingChunks,
57
+ renderMetadata,
58
+ region,
59
+ }),
60
+ '',
61
+ `Consider increasing the timeout of your function.`,
62
+ `▸ You can use the "--timeout" parameter when deploying a function via CLI, or the "timeoutInSeconds" parameter when using the deployFunction() API.`,
63
+ `${docs_url_1.DOCS_URL}/docs/lambda/cli/functions#deploy`,
64
+ '',
65
+ '▸ Visit the logs for the main function:',
66
+ cloudWatchLaunchUrl,
67
+ '▸ Visit the logs for the renderer functions:',
68
+ cloudWatchRendererUrl,
69
+ '',
70
+ '▸ Get help on debugging this error:',
71
+ `${docs_url_1.DOCS_URL}/docs/lambda/troubleshooting/debug`,
72
+ ].join('\n');
73
+ return message;
74
+ };
75
+ exports.makeTimeoutMessage = makeTimeoutMessage;
@@ -0,0 +1,36 @@
1
+ import type { AudioCodec, LogLevel } from '@remotion/renderer';
2
+ import type { CloudProvider, ProviderSpecifics } from '@remotion/serverless';
3
+ import type { CustomCredentials, DownloadBehavior, Privacy, RenderMetadata, SerializedInputProps, ServerlessCodec } from '@remotion/serverless/client';
4
+ import type { PostRenderData } from '../../shared/constants';
5
+ import type { OverallProgressHelper } from './overall-render-progress';
6
+ export declare const mergeChunksAndFinishRender: <Provider extends CloudProvider>(options: {
7
+ bucketName: string;
8
+ renderId: string;
9
+ expectedBucketOwner: string;
10
+ numberOfFrames: number;
11
+ codec: ServerlessCodec;
12
+ chunkCount: number;
13
+ fps: number;
14
+ numberOfGifLoops: number | null;
15
+ audioCodec: AudioCodec | null;
16
+ renderBucketName: string;
17
+ customCredentials: CustomCredentials<Provider> | null;
18
+ downloadBehavior: DownloadBehavior;
19
+ key: string;
20
+ privacy: Privacy;
21
+ inputProps: SerializedInputProps;
22
+ serializedResolvedProps: SerializedInputProps;
23
+ renderMetadata: RenderMetadata<Provider>;
24
+ audioBitrate: string | null;
25
+ logLevel: LogLevel;
26
+ framesPerLambda: number;
27
+ binariesDirectory: string | null;
28
+ preferLossless: boolean;
29
+ compositionStart: number;
30
+ outdir: string;
31
+ files: string[];
32
+ overallProgress: OverallProgressHelper<Provider>;
33
+ startTime: number;
34
+ providerSpecifics: ProviderSpecifics<Provider>;
35
+ forcePathStyle: boolean;
36
+ }) => Promise<PostRenderData<Provider>>;
@@ -0,0 +1,84 @@
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.mergeChunksAndFinishRender = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const cleanup_props_1 = require("./cleanup-props");
9
+ const concat_videos_1 = require("./concat-videos");
10
+ const create_post_render_data_1 = require("./create-post-render-data");
11
+ const get_output_url_from_metadata_1 = require("./get-output-url-from-metadata");
12
+ const inspect_errors_1 = require("./inspect-errors");
13
+ const timer_1 = require("./timer");
14
+ const mergeChunksAndFinishRender = async (options) => {
15
+ const onProgress = (framesEncoded) => {
16
+ options.overallProgress.setCombinedFrames(framesEncoded);
17
+ };
18
+ const encodingStart = Date.now();
19
+ if (options.renderMetadata.type === 'still') {
20
+ throw new Error('Cannot merge stills');
21
+ }
22
+ const { outfile, cleanupChunksProm } = await (0, concat_videos_1.concatVideos)({
23
+ onProgress,
24
+ numberOfFrames: options.numberOfFrames,
25
+ codec: options.codec,
26
+ fps: options.fps,
27
+ numberOfGifLoops: options.numberOfGifLoops,
28
+ files: options.files,
29
+ outdir: options.outdir,
30
+ audioCodec: options.audioCodec,
31
+ audioBitrate: options.audioBitrate,
32
+ logLevel: options.logLevel,
33
+ framesPerLambda: options.framesPerLambda,
34
+ binariesDirectory: options.binariesDirectory,
35
+ cancelSignal: undefined,
36
+ preferLossless: options.preferLossless,
37
+ muted: options.renderMetadata.muted,
38
+ metadata: options.renderMetadata.metadata,
39
+ });
40
+ const encodingStop = Date.now();
41
+ options.overallProgress.setTimeToCombine(encodingStop - encodingStart);
42
+ const outputSize = fs_1.default.statSync(outfile).size;
43
+ const writeToBucket = (0, timer_1.timer)(`Writing to bucket (${outputSize} bytes)`, options.logLevel);
44
+ await options.providerSpecifics.writeFile({
45
+ bucketName: options.renderBucketName,
46
+ key: options.key,
47
+ body: fs_1.default.createReadStream(outfile),
48
+ region: options.providerSpecifics.getCurrentRegionInFunction(),
49
+ privacy: options.privacy,
50
+ expectedBucketOwner: options.expectedBucketOwner,
51
+ downloadBehavior: options.downloadBehavior,
52
+ customCredentials: options.customCredentials,
53
+ forcePathStyle: options.forcePathStyle,
54
+ });
55
+ writeToBucket.end();
56
+ const errorExplanations = (0, inspect_errors_1.inspectErrors)({
57
+ errors: options.overallProgress.get().errors,
58
+ });
59
+ const cleanupProm = (0, cleanup_props_1.cleanupProps)({
60
+ inputProps: options.inputProps,
61
+ serializedResolvedProps: options.serializedResolvedProps,
62
+ providerSpecifics: options.providerSpecifics,
63
+ forcePathStyle: options.forcePathStyle,
64
+ });
65
+ const { url: outputUrl } = (0, get_output_url_from_metadata_1.getOutputUrlFromMetadata)(options.renderMetadata, options.bucketName, options.customCredentials, options.providerSpecifics.getCurrentRegionInFunction());
66
+ const postRenderData = (0, create_post_render_data_1.createPostRenderData)({
67
+ region: options.providerSpecifics.getCurrentRegionInFunction(),
68
+ memorySizeInMb: Number(process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE),
69
+ renderMetadata: options.renderMetadata,
70
+ errorExplanations,
71
+ timeToDelete: (await cleanupProm).reduce((a, b) => Math.max(a, b), 0),
72
+ outputFile: {
73
+ url: outputUrl,
74
+ },
75
+ outputSize,
76
+ timeToCombine: encodingStop - encodingStart,
77
+ overallProgress: options.overallProgress.get(),
78
+ timeToFinish: Date.now() - options.startTime,
79
+ });
80
+ options.overallProgress.setPostRenderData(postRenderData);
81
+ await Promise.all([cleanupChunksProm, fs_1.default.promises.rm(outfile)]);
82
+ return postRenderData;
83
+ };
84
+ exports.mergeChunksAndFinishRender = mergeChunksAndFinishRender;
@@ -0,0 +1,2 @@
1
+ export declare const min: (arr: number[]) => number;
2
+ export declare const max: (arr: number[]) => number;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ // Standard library Math.min and Math.max can throw
3
+ // if array length is very long. Fixing this with own implementation
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.max = exports.min = void 0;
6
+ const min = (arr) => {
7
+ if (arr.length === 0) {
8
+ throw new Error('Array of 0 length');
9
+ }
10
+ let smallest = arr[0];
11
+ for (let i = 0; i < arr.length; i++) {
12
+ const elem = arr[i];
13
+ if (elem < smallest) {
14
+ smallest = elem;
15
+ }
16
+ }
17
+ return smallest;
18
+ };
19
+ exports.min = min;
20
+ const max = (arr) => {
21
+ if (arr.length === 0) {
22
+ throw new Error('Array of 0 length');
23
+ }
24
+ let biggest = arr[0];
25
+ for (let i = 0; i < arr.length; i++) {
26
+ const elem = arr[i];
27
+ if (elem > biggest) {
28
+ biggest = elem;
29
+ }
30
+ }
31
+ return biggest;
32
+ };
33
+ exports.max = max;
@@ -0,0 +1,2 @@
1
+ import type { LogLevel, RenderMediaOnDownload } from '@remotion/renderer';
2
+ export declare const onDownloadsHelper: (logLevel: LogLevel) => RenderMediaOnDownload;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.onDownloadsHelper = void 0;
4
+ const renderer_1 = require("@remotion/renderer");
5
+ const onDownloadsHelper = (logLevel) => {
6
+ const downloads = {};
7
+ return (src) => {
8
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, 'Downloading', src);
9
+ downloads[src] = 0;
10
+ return ({ percent, downloaded }) => {
11
+ if (percent === null) {
12
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, `Download progress (${src}): ${downloaded} bytes. Don't know final size of download, no Content-Length header.`);
13
+ return;
14
+ }
15
+ if (
16
+ // Only report every 10% change
17
+ downloads[src] > percent - 0.1 &&
18
+ percent !== 1) {
19
+ return;
20
+ }
21
+ downloads[src] = percent;
22
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, `Download progress (${src}): ${downloaded} bytes, ${(percent * 100).toFixed(1)}%`);
23
+ if (percent === 1) {
24
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, `Download complete: ${src}`);
25
+ }
26
+ };
27
+ };
28
+ };
29
+ exports.onDownloadsHelper = onDownloadsHelper;
@@ -0,0 +1,59 @@
1
+ import type { LogLevel } from '@remotion/renderer';
2
+ import type { CloudProvider, LambdaErrorInfo, ProviderSpecifics, ReceivedArtifact } from '@remotion/serverless';
3
+ import { type RenderMetadata } from '@remotion/serverless/client';
4
+ import type { PostRenderData } from '../../shared/constants';
5
+ import type { ParsedTiming } from '../../shared/parse-lambda-timings-key';
6
+ import type { ChunkRetry } from './get-retry-stats';
7
+ export type OverallRenderProgress<Provider extends CloudProvider> = {
8
+ chunks: number[];
9
+ framesRendered: number;
10
+ framesEncoded: number;
11
+ combinedFrames: number;
12
+ timeToCombine: number | null;
13
+ timeToEncode: number | null;
14
+ timeToRenderFrames: number | null;
15
+ lambdasInvoked: number;
16
+ retries: ChunkRetry[];
17
+ postRenderData: PostRenderData<Provider> | null;
18
+ timings: ParsedTiming[];
19
+ renderMetadata: RenderMetadata<Provider> | null;
20
+ errors: LambdaErrorInfo[];
21
+ timeoutTimestamp: number;
22
+ functionLaunched: number;
23
+ serveUrlOpened: number | null;
24
+ compositionValidated: number | null;
25
+ receivedArtifact: ReceivedArtifact<Provider>[];
26
+ };
27
+ export type OverallProgressHelper<Provider extends CloudProvider> = {
28
+ upload: () => Promise<void>;
29
+ setFrames: ({ encoded, rendered, index, }: {
30
+ rendered: number;
31
+ encoded: number;
32
+ index: number;
33
+ }) => void;
34
+ setLambdaInvoked: (chunk: number) => void;
35
+ addChunkCompleted: (chunkIndex: number, start: number, rendered: number) => void;
36
+ setCombinedFrames: (framesEncoded: number) => void;
37
+ setTimeToCombine: (timeToCombine: number) => void;
38
+ addRetry: (retry: ChunkRetry) => void;
39
+ setPostRenderData: (postRenderData: PostRenderData<Provider>) => void;
40
+ setRenderMetadata: (renderMetadata: RenderMetadata<Provider>) => void;
41
+ addErrorWithoutUpload: (errorInfo: LambdaErrorInfo) => void;
42
+ setExpectedChunks: (expectedChunks: number) => void;
43
+ get: () => OverallRenderProgress<Provider>;
44
+ setServeUrlOpened: (timestamp: number) => void;
45
+ setCompositionValidated: (timestamp: number) => void;
46
+ addReceivedArtifact: (asset: ReceivedArtifact<Provider>) => void;
47
+ getReceivedArtifacts: () => ReceivedArtifact<Provider>[];
48
+ };
49
+ export declare const makeInitialOverallRenderProgress: <Provider extends CloudProvider>(timeoutTimestamp: number) => OverallRenderProgress<Provider>;
50
+ export declare const makeOverallRenderProgress: <Provider extends CloudProvider>({ renderId, bucketName, expectedBucketOwner, region, timeoutTimestamp, logLevel, providerSpecifics, forcePathStyle, }: {
51
+ renderId: string;
52
+ bucketName: string;
53
+ expectedBucketOwner: string;
54
+ region: Provider["region"];
55
+ timeoutTimestamp: number;
56
+ logLevel: LogLevel;
57
+ providerSpecifics: ProviderSpecifics<Provider>;
58
+ forcePathStyle: boolean;
59
+ }) => OverallProgressHelper<Provider>;
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeOverallRenderProgress = exports.makeInitialOverallRenderProgress = void 0;
4
+ const renderer_1 = require("@remotion/renderer");
5
+ const client_1 = require("@remotion/serverless/client");
6
+ const makeInitialOverallRenderProgress = (timeoutTimestamp) => {
7
+ return {
8
+ chunks: [],
9
+ framesRendered: 0,
10
+ framesEncoded: 0,
11
+ combinedFrames: 0,
12
+ timeToCombine: null,
13
+ timeToEncode: null,
14
+ lambdasInvoked: 0,
15
+ retries: [],
16
+ postRenderData: null,
17
+ timings: [],
18
+ renderMetadata: null,
19
+ errors: [],
20
+ timeToRenderFrames: null,
21
+ timeoutTimestamp,
22
+ functionLaunched: Date.now(),
23
+ serveUrlOpened: null,
24
+ compositionValidated: null,
25
+ receivedArtifact: [],
26
+ };
27
+ };
28
+ exports.makeInitialOverallRenderProgress = makeInitialOverallRenderProgress;
29
+ const makeOverallRenderProgress = ({ renderId, bucketName, expectedBucketOwner, region, timeoutTimestamp, logLevel, providerSpecifics, forcePathStyle, }) => {
30
+ let framesRendered = [];
31
+ let framesEncoded = [];
32
+ let lambdasInvoked = [];
33
+ const renderProgress = (0, exports.makeInitialOverallRenderProgress)(timeoutTimestamp);
34
+ let currentUploadPromise = null;
35
+ const getCurrentProgress = () => renderProgress;
36
+ let latestUploadRequest = 0;
37
+ const getLatestRequestId = () => latestUploadRequest;
38
+ let encodeStartTime = null;
39
+ let renderFramesStartTime = null;
40
+ const upload = async () => {
41
+ const uploadRequestId = ++latestUploadRequest;
42
+ if (currentUploadPromise) {
43
+ await currentUploadPromise;
44
+ }
45
+ // If request has been replaced by a new one
46
+ if (getLatestRequestId() !== uploadRequestId) {
47
+ return;
48
+ }
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, client_1.overallProgressKey)(renderId),
59
+ privacy: 'private',
60
+ region,
61
+ forcePathStyle,
62
+ })
63
+ .then(() => {
64
+ // By default, upload is way too fast (~20 requests per second)
65
+ // Space out the requests a bit
66
+ return new Promise((resolve) => {
67
+ setTimeout(resolve, 250 - (Date.now() - start));
68
+ });
69
+ })
70
+ .catch((err) => {
71
+ // If an error occurs in uploading the state that contains the errors,
72
+ // that is unfortunate. We just log it.
73
+ renderer_1.RenderInternals.Log.error({ indent: false, logLevel }, 'Error uploading progress', err);
74
+ });
75
+ await currentUploadPromise;
76
+ currentUploadPromise = null;
77
+ };
78
+ return {
79
+ upload,
80
+ setFrames: ({ encoded, rendered, index, }) => {
81
+ if (framesRendered.length === 0) {
82
+ throw new Error('Expected chunks to be set before frames are set');
83
+ }
84
+ if (framesEncoded.length === 0) {
85
+ throw new Error('Expected chunks to be set before frames are set');
86
+ }
87
+ framesRendered[index] = rendered;
88
+ framesEncoded[index] = encoded;
89
+ const totalFramesEncoded = framesEncoded.reduce((a, b) => a + b, 0);
90
+ const totalFramesRendered = framesRendered.reduce((a, b) => a + b, 0);
91
+ if (renderProgress.framesEncoded === 0 && totalFramesEncoded > 0) {
92
+ encodeStartTime = Date.now();
93
+ }
94
+ if (renderProgress.framesRendered === 0 && totalFramesRendered > 0) {
95
+ renderFramesStartTime = Date.now();
96
+ }
97
+ if (renderProgress.timeToRenderFrames === null) {
98
+ const frameCount = renderProgress.renderMetadata &&
99
+ renderProgress.renderMetadata.type === 'video'
100
+ ? renderer_1.RenderInternals.getFramesToRender(renderProgress.renderMetadata.frameRange, renderProgress.renderMetadata.everyNthFrame).length
101
+ : null;
102
+ if (frameCount === totalFramesRendered) {
103
+ const timeToRenderFrames = Date.now() - (renderFramesStartTime !== null && renderFramesStartTime !== void 0 ? renderFramesStartTime : Date.now());
104
+ renderProgress.timeToRenderFrames = timeToRenderFrames;
105
+ }
106
+ }
107
+ renderProgress.framesRendered = totalFramesRendered;
108
+ renderProgress.framesEncoded = totalFramesEncoded;
109
+ upload();
110
+ },
111
+ addChunkCompleted: (chunkIndex, start, rendered) => {
112
+ var _a;
113
+ renderProgress.chunks.push(chunkIndex);
114
+ if (renderProgress.chunks.length ===
115
+ ((_a = renderProgress.renderMetadata) === null || _a === void 0 ? void 0 : _a.totalChunks)) {
116
+ const timeToEncode = Date.now() - (encodeStartTime !== null && encodeStartTime !== void 0 ? encodeStartTime : Date.now());
117
+ renderProgress.timeToEncode = timeToEncode;
118
+ }
119
+ renderProgress.timings.push({
120
+ chunk: chunkIndex,
121
+ start,
122
+ rendered,
123
+ });
124
+ upload();
125
+ },
126
+ setCombinedFrames: (frames) => {
127
+ renderProgress.combinedFrames = frames;
128
+ upload();
129
+ },
130
+ setTimeToCombine: (timeToCombine) => {
131
+ renderProgress.timeToCombine = timeToCombine;
132
+ upload();
133
+ },
134
+ setLambdaInvoked(chunk) {
135
+ if (lambdasInvoked.length === 0) {
136
+ throw new Error('Expected chunks to be set before lambdas are set');
137
+ }
138
+ lambdasInvoked[chunk] = true;
139
+ renderProgress.lambdasInvoked = lambdasInvoked.reduce((a, b) => a + Number(b), 0);
140
+ upload();
141
+ },
142
+ setPostRenderData(postRenderData) {
143
+ renderProgress.postRenderData = postRenderData;
144
+ upload();
145
+ },
146
+ setRenderMetadata: (renderMetadata) => {
147
+ renderProgress.renderMetadata = renderMetadata;
148
+ upload();
149
+ },
150
+ addErrorWithoutUpload: (errorInfo) => {
151
+ renderProgress.errors.push(errorInfo);
152
+ },
153
+ setExpectedChunks: (expectedChunks) => {
154
+ framesRendered = new Array(expectedChunks).fill(0);
155
+ framesEncoded = new Array(expectedChunks).fill(0);
156
+ lambdasInvoked = new Array(expectedChunks).fill(false);
157
+ },
158
+ setCompositionValidated(timestamp) {
159
+ renderProgress.compositionValidated = timestamp;
160
+ upload();
161
+ },
162
+ setServeUrlOpened(timestamp) {
163
+ renderProgress.serveUrlOpened = timestamp;
164
+ upload();
165
+ },
166
+ addRetry(retry) {
167
+ renderProgress.retries.push(retry);
168
+ upload();
169
+ },
170
+ addReceivedArtifact(asset) {
171
+ renderProgress.receivedArtifact.push(asset);
172
+ upload();
173
+ },
174
+ getReceivedArtifacts() {
175
+ return renderProgress.receivedArtifact;
176
+ },
177
+ get: () => renderProgress,
178
+ };
179
+ };
180
+ exports.makeOverallRenderProgress = makeOverallRenderProgress;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const best_frames_per_lambda_param_1 = require("./best-frames-per-lambda-param");
4
+ const entries = [];
5
+ for (let i = 0; i < 18000; i += 100) {
6
+ entries.push([i, (0, best_frames_per_lambda_param_1.bestFramesPerLambdaParam)(i)]);
7
+ }
8
+ console.log(entries.map((e) => e.join(',')).join('\n'));
@@ -0,0 +1,4 @@
1
+ import type { LogLevel } from '@remotion/renderer';
2
+ import type { ServerlessRoutines } from '@remotion/serverless/client';
3
+ export type PrintLoggingHelper = (type: ServerlessRoutines, data: Record<string, string | boolean>, logLevel: LogLevel) => void;
4
+ export declare const printLoggingGrepHelper: PrintLoggingHelper;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.printLoggingGrepHelper = void 0;
4
+ const renderer_1 = require("@remotion/renderer");
5
+ const printLoggingGrepHelper = (type, data, logLevel) => {
6
+ const d = Object.keys(data).reduce((a, b) => {
7
+ return [...a, `${b}=${data[b]}`];
8
+ }, []);
9
+ const msg = [`method=${type}`, ...d].join(',');
10
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, msg);
11
+ };
12
+ exports.printLoggingGrepHelper = printLoggingGrepHelper;
@@ -0,0 +1,6 @@
1
+ import type { CloudProvider } from '@remotion/serverless';
2
+ import type { RenderMetadata } from '@remotion/serverless/client';
3
+ export declare const lambdaRenderHasAudioVideo: <Provider extends CloudProvider>(renderMetadata: RenderMetadata<Provider>) => {
4
+ hasAudio: boolean;
5
+ hasVideo: boolean;
6
+ };
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lambdaRenderHasAudioVideo = void 0;
4
+ const pure_1 = require("@remotion/renderer/pure");
5
+ const lambdaRenderHasAudioVideo = (renderMetadata) => {
6
+ if (renderMetadata.type === 'still') {
7
+ throw new Error('Cannot merge stills');
8
+ }
9
+ const support = pure_1.NoReactAPIs.codecSupportsMedia(renderMetadata.codec);
10
+ const hasVideo = renderMetadata
11
+ ? !pure_1.NoReactAPIs.isAudioCodec(renderMetadata.codec)
12
+ : false;
13
+ const hasAudio = renderMetadata
14
+ ? !renderMetadata.muted && support.audio
15
+ : false;
16
+ return {
17
+ hasAudio,
18
+ hasVideo,
19
+ };
20
+ };
21
+ exports.lambdaRenderHasAudioVideo = lambdaRenderHasAudioVideo;
@@ -0,0 +1,5 @@
1
+ export type RequestContext = {
2
+ invokedFunctionArn: string;
3
+ getRemainingTimeInMillis: () => number;
4
+ awsRequestId: string;
5
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,17 @@
1
+ import type { EmittedArtifact, LogLevel } from '@remotion/renderer';
2
+ import type { CloudProvider } from '@remotion/serverless';
3
+ import { type ProviderSpecifics } from '@remotion/serverless';
4
+ import type { ServerlessPayload } from '@remotion/serverless/client';
5
+ import type { OverallProgressHelper } from './overall-render-progress';
6
+ export declare const streamRendererFunctionWithRetry: <Provider extends CloudProvider>({ payload, files, functionName, outdir, overallProgress, logLevel, onArtifact, providerSpecifics, }: {
7
+ payload: ServerlessPayload<Provider>;
8
+ functionName: string;
9
+ outdir: string;
10
+ overallProgress: OverallProgressHelper<Provider>;
11
+ files: string[];
12
+ logLevel: LogLevel;
13
+ onArtifact: (asset: EmittedArtifact) => {
14
+ alreadyExisted: boolean;
15
+ };
16
+ providerSpecifics: ProviderSpecifics<Provider>;
17
+ }) => Promise<unknown>;