@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.
- package/dist/api/__mocks__/clean-items.d.ts +2 -0
- package/dist/api/__mocks__/clean-items.js +24 -0
- package/dist/api/__mocks__/create-function.d.ts +2 -0
- package/dist/api/__mocks__/create-function.js +21 -0
- package/dist/api/__mocks__/delete-function.d.ts +2 -0
- package/dist/api/__mocks__/delete-function.js +9 -0
- package/dist/api/__mocks__/get-functions.d.ts +2 -0
- package/dist/api/__mocks__/get-functions.js +9 -0
- package/dist/api/__mocks__/upload-dir.d.ts +3 -0
- package/dist/api/__mocks__/upload-dir.js +47 -0
- package/dist/api/mock-functions.d.ts +18 -0
- package/dist/api/mock-functions.js +36 -0
- package/dist/cli/helpers/__mocks__/quit.d.ts +1 -0
- package/dist/cli/helpers/__mocks__/quit.js +7 -0
- package/dist/cli/log.d.ts +4 -4
- package/dist/functions/chunk-optimization/plan-frame-ranges.d.ts +7 -0
- package/dist/functions/chunk-optimization/plan-frame-ranges.js +17 -0
- package/dist/functions/chunk-optimization/types.d.ts +8 -0
- package/dist/functions/chunk-optimization/types.js +2 -0
- package/dist/functions/helpers/__mocks__/get-browser-instance.d.ts +3 -0
- package/dist/functions/helpers/__mocks__/get-browser-instance.js +12 -0
- package/dist/functions/helpers/__mocks__/leak-detection.d.ts +4 -0
- package/dist/functions/helpers/__mocks__/leak-detection.js +9 -0
- package/dist/functions/helpers/__mocks__/timer.d.ts +2 -0
- package/dist/functions/helpers/__mocks__/timer.js +10 -0
- package/dist/functions/helpers/best-frames-per-lambda-param.d.ts +1 -0
- package/dist/functions/helpers/best-frames-per-lambda-param.js +17 -0
- package/dist/functions/helpers/calculate-chunk-times.d.ts +5 -0
- package/dist/functions/helpers/calculate-chunk-times.js +29 -0
- package/dist/functions/helpers/calculate-price-from-bucket.d.ts +15 -0
- package/dist/functions/helpers/calculate-price-from-bucket.js +30 -0
- package/dist/functions/helpers/can-concat-seamlessly.d.ts +3 -0
- package/dist/functions/helpers/can-concat-seamlessly.js +17 -0
- package/dist/functions/helpers/cleanup-props.d.ts +8 -0
- package/dist/functions/helpers/cleanup-props.js +23 -0
- package/dist/functions/helpers/concat-videos.d.ts +23 -0
- package/dist/functions/helpers/concat-videos.js +54 -0
- package/dist/functions/helpers/create-post-render-data.d.ts +17 -0
- package/dist/functions/helpers/create-post-render-data.js +67 -0
- package/dist/functions/helpers/find-output-file-in-bucket.d.ts +14 -0
- package/dist/functions/helpers/find-output-file-in-bucket.js +38 -0
- package/dist/functions/helpers/format-costs-info.d.ts +2 -0
- package/dist/functions/helpers/format-costs-info.js +23 -0
- package/dist/functions/helpers/get-overall-progress-s3.d.ts +10 -0
- package/dist/functions/helpers/get-overall-progress-s3.js +24 -0
- package/dist/functions/helpers/get-overall-progress.d.ts +9 -0
- package/dist/functions/helpers/get-overall-progress.js +23 -0
- package/dist/functions/helpers/get-progress.d.ts +15 -0
- package/dist/functions/helpers/get-progress.js +254 -0
- package/dist/functions/helpers/get-retry-stats.d.ts +5 -0
- package/dist/functions/helpers/get-retry-stats.js +2 -0
- package/dist/functions/helpers/inspect-errors.d.ts +4 -0
- package/dist/functions/helpers/inspect-errors.js +39 -0
- package/dist/functions/helpers/is-warm.d.ts +2 -0
- package/dist/functions/helpers/is-warm.js +10 -0
- package/dist/functions/helpers/leak-detection.d.ts +4 -0
- package/dist/functions/helpers/leak-detection.js +40 -0
- package/dist/functions/helpers/make-timeout-error.d.ts +10 -0
- package/dist/functions/helpers/make-timeout-error.js +31 -0
- package/dist/functions/helpers/make-timeout-message.d.ts +10 -0
- package/dist/functions/helpers/make-timeout-message.js +75 -0
- package/dist/functions/helpers/merge-chunks.d.ts +36 -0
- package/dist/functions/helpers/merge-chunks.js +84 -0
- package/dist/functions/helpers/min-max.d.ts +2 -0
- package/dist/functions/helpers/min-max.js +33 -0
- package/dist/functions/helpers/on-downloads-logger.d.ts +2 -0
- package/dist/functions/helpers/on-downloads-logger.js +29 -0
- package/dist/functions/helpers/overall-render-progress.d.ts +59 -0
- package/dist/functions/helpers/overall-render-progress.js +180 -0
- package/dist/functions/helpers/print-concurrency-curve.d.ts +1 -0
- package/dist/functions/helpers/print-concurrency-curve.js +8 -0
- package/dist/functions/helpers/print-logging-helper.d.ts +4 -0
- package/dist/functions/helpers/print-logging-helper.js +12 -0
- package/dist/functions/helpers/render-has-audio-video.d.ts +6 -0
- package/dist/functions/helpers/render-has-audio-video.js +21 -0
- package/dist/functions/helpers/request-context.d.ts +5 -0
- package/dist/functions/helpers/request-context.js +2 -0
- package/dist/functions/helpers/stream-renderer.d.ts +17 -0
- package/dist/functions/helpers/stream-renderer.js +148 -0
- package/dist/functions/launch.d.ts +10 -0
- package/dist/functions/launch.js +595 -0
- package/dist/functions/progress.d.ts +11 -0
- package/dist/functions/progress.js +51 -0
- package/dist/functions/renderer.d.ts +17 -0
- package/dist/functions/renderer.js +341 -0
- package/dist/functions/start.d.ts +13 -0
- package/dist/functions/start.js +112 -0
- package/dist/functions/still.d.ts +19 -0
- package/dist/functions/still.js +329 -0
- package/dist/shared/__mocks__/aws-clients.d.ts +2 -0
- package/dist/shared/__mocks__/aws-clients.js +62 -0
- package/dist/shared/__mocks__/bundle-site.d.ts +2 -0
- package/dist/shared/__mocks__/bundle-site.js +32 -0
- package/dist/shared/__mocks__/check-credentials.d.ts +1 -0
- package/dist/shared/__mocks__/check-credentials.js +5 -0
- package/dist/shared/__mocks__/get-account-id.d.ts +2 -0
- package/dist/shared/__mocks__/get-account-id.js +11 -0
- package/dist/shared/__mocks__/read-dir.d.ts +2 -0
- package/dist/shared/__mocks__/read-dir.js +13 -0
- package/dist/shared/call-lambda.d.ts +16 -0
- package/dist/shared/call-lambda.js +149 -0
- package/dist/shared/cleanup-serialized-input-props.d.ts +14 -0
- package/dist/shared/cleanup-serialized-input-props.js +34 -0
- package/dist/shared/docs-url.d.ts +1 -0
- package/dist/shared/docs-url.js +4 -0
- package/dist/shared/get-most-expensive-chunks.d.ts +8 -0
- package/dist/shared/get-most-expensive-chunks.js +28 -0
- package/dist/shared/invoke-webhook.d.ts +48 -0
- package/dist/shared/invoke-webhook.js +140 -0
- package/dist/shared/parse-lambda-timings-key.d.ts +5 -0
- package/dist/shared/parse-lambda-timings-key.js +2 -0
- package/dist/shared/return-values.d.ts +16 -0
- package/dist/shared/return-values.js +2 -0
- package/dist/shared/stackback.d.ts +6 -0
- package/dist/shared/stackback.js +59 -0
- package/dist/shared/validate-download-behavior.d.ts +1 -0
- package/dist/shared/validate-download-behavior.js +21 -0
- package/dist/shared/validate-frames-per-lambda.d.ts +4 -0
- package/dist/shared/validate-frames-per-lambda.js +29 -0
- package/dist/shared/validate-privacy.d.ts +2 -0
- package/dist/shared/validate-privacy.js +14 -0
- package/dist/shared/validate.d.ts +4 -0
- package/dist/shared/validate.js +8 -0
- package/dist/shared/why-is-node-running.d.ts +15 -0
- package/dist/shared/why-is-node-running.js +88 -0
- package/package.json +12 -12
- 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,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,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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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,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>;
|