@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,7 @@
1
+
2
+ 
3
+ > @remotion/serverless@4.0.244 formatting /Users/jonathanburger/remotion/packages/serverless
4
+ > prettier src --check
5
+
6
+ Checking formatting...
7
+ src/await.tssrc/client.tssrc/compositions.tssrc/compress-props.tssrc/constants.tssrc/error-category.tssrc/expected-out-name.tssrc/get-browser-instance.tssrc/get-custom-out-name.tssrc/get-files-in-folder.tssrc/get-or-create-bucket.tssrc/index.tssrc/info.tssrc/input-props-keys.tssrc/make-bucket-name.tssrc/provider-implementation.tssrc/render-metadata.tssrc/serialize-artifact.tssrc/still.tssrc/stream-to-string.tssrc/streaming/response-stream.tssrc/streaming/stream-writer.tssrc/streaming/streaming.tssrc/test/expected-out-name.test.tssrc/truthy.tssrc/validate-bucket-name.tssrc/validate-composition.tssrc/validate-outname.tssrc/validate-webhook.tssrc/write-lambda-error.tsAll matched files use Prettier code style!
@@ -0,0 +1,11 @@
1
+
2
+ 
3
+ > @remotion/serverless@4.0.244 lint /Users/jonathanburger/remotion/packages/serverless
4
+ > eslint src
5
+
6
+ 
7
+ /Users/jonathanburger/remotion/packages/serverless/src/streaming/response-stream.ts
8
+  19:10 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any
9
+ 
10
+ ✖ 1 problem (0 errors, 1 warning)
11
+ 
@@ -1,5 +1,5 @@
1
1
 
2
2
  
3
- > @remotion/serverless@4.0.243 make /Users/jonathanburger/remotion/packages/serverless
3
+ > @remotion/serverless@4.0.244 make /Users/jonathanburger/remotion/packages/serverless
4
4
  > tsc -d
5
5
 
package/LICENSE.md CHANGED
@@ -11,7 +11,7 @@ Depending on the type of your legal entity, you are granted permission to use Re
11
11
 
12
12
  ## Free license
13
13
 
14
- Copyright © 2024 [Remotion](https://www.remotion.dev)
14
+ Copyright © 2025 [Remotion](https://www.remotion.dev)
15
15
 
16
16
  ### Eligibility
17
17
 
@@ -0,0 +1 @@
1
+ export declare const bestFramesPerFunctionParam: (frameCount: number) => number;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bestFramesPerFunctionParam = void 0;
4
+ const no_react_1 = require("remotion/no-react");
5
+ // Always update the code in docs/lambda/concurrency.md too
6
+ const bestFramesPerFunctionParam = (frameCount) => {
7
+ // Between 0 and 10 minutes (at 30fps), interpolate the concurrency from 75 to 150
8
+ const concurrency = (0, no_react_1.interpolate)(frameCount, [0, 18000], [75, 150], {
9
+ extrapolateRight: 'clamp',
10
+ });
11
+ // At least have 20 as a `framesPerLambda` value
12
+ const framesPerLambda = Math.max(frameCount / concurrency, 20);
13
+ // Evenly distribute: For 21 frames over 2 lambda functions, distribute as 11 + 10 ==> framesPerLambda = 11
14
+ const lambdasNeeded = Math.ceil(frameCount / framesPerLambda);
15
+ return Math.ceil(frameCount / lambdasNeeded);
16
+ };
17
+ exports.bestFramesPerFunctionParam = bestFramesPerFunctionParam;
@@ -0,0 +1,5 @@
1
+ import type { ParsedTiming } from './types';
2
+ export declare const calculateChunkTimes: ({ type, timings, }: {
3
+ type: "combined-time-for-cost-calculation" | "absolute-time";
4
+ timings: ParsedTiming[];
5
+ }) => number;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateChunkTimes = void 0;
4
+ const min_max_1 = require("./min-max");
5
+ const getAbsoluteTime = (parsedTimings) => {
6
+ if (parsedTimings.length === 0) {
7
+ return 0;
8
+ }
9
+ const allEnds = parsedTimings.map((p) => p.rendered);
10
+ const allStarts = parsedTimings.map((p) => p.start);
11
+ const biggestEnd = (0, min_max_1.max)(allEnds);
12
+ const smallestStart = (0, min_max_1.min)(allStarts);
13
+ return Math.max(0, biggestEnd - smallestStart);
14
+ };
15
+ const calculateChunkTimes = ({ type, timings, }) => {
16
+ const parsedTimings = timings;
17
+ const absoluteTime = getAbsoluteTime(parsedTimings);
18
+ if (type === 'combined-time-for-cost-calculation') {
19
+ const totalEncodingTimings = parsedTimings
20
+ .map((p) => Math.max(0, p.rendered - p.start))
21
+ .reduce((a, b) => a + b, 0);
22
+ return totalEncodingTimings + absoluteTime;
23
+ }
24
+ if (type === 'absolute-time') {
25
+ return absoluteTime;
26
+ }
27
+ throw new Error('invalid time for calculate chunk times');
28
+ };
29
+ exports.calculateChunkTimes = calculateChunkTimes;
@@ -0,0 +1,3 @@
1
+ import type { AudioCodec, Codec } from '@remotion/renderer';
2
+ export declare const canConcatAudioSeamlessly: (audioCodec: AudioCodec | null, chunkDurationInFrames: number) => boolean;
3
+ export declare const canConcatVideoSeamlessly: (codec: Codec) => codec is "h264";
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canConcatVideoSeamlessly = exports.canConcatAudioSeamlessly = void 0;
4
+ // Cannot do WAV yet, because currently assumes AAC in+outpoint
5
+ const canConcatAudioSeamlessly = (audioCodec, chunkDurationInFrames) => {
6
+ // Rendering a chunk that is too small generates too much overhead
7
+ // and is currently buggy
8
+ if (chunkDurationInFrames <= 4) {
9
+ return false;
10
+ }
11
+ return audioCodec === 'aac';
12
+ };
13
+ exports.canConcatAudioSeamlessly = canConcatAudioSeamlessly;
14
+ const canConcatVideoSeamlessly = (codec) => {
15
+ return codec === 'h264';
16
+ };
17
+ exports.canConcatVideoSeamlessly = canConcatVideoSeamlessly;
@@ -0,0 +1,9 @@
1
+ import type { SerializedInputProps } from './constants';
2
+ import type { ProviderSpecifics } from './provider-implementation';
3
+ import type { CloudProvider } from './types';
4
+ export declare const cleanupProps: <Provider extends CloudProvider>({ serializedResolvedProps, inputProps, providerSpecifics, forcePathStyle, }: {
5
+ serializedResolvedProps: SerializedInputProps;
6
+ inputProps: SerializedInputProps;
7
+ providerSpecifics: ProviderSpecifics<Provider>;
8
+ forcePathStyle: boolean;
9
+ }) => Promise<[number, number]>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cleanupProps = void 0;
4
+ const cleanup_serialized_input_props_1 = require("./cleanup-serialized-input-props");
5
+ const cleanupProps = ({ serializedResolvedProps, inputProps, providerSpecifics, forcePathStyle, }) => {
6
+ const cleanupSerializedInputPropsProm = (0, cleanup_serialized_input_props_1.cleanupSerializedInputProps)({
7
+ region: providerSpecifics.getCurrentRegionInFunction(),
8
+ serialized: inputProps,
9
+ providerSpecifics,
10
+ forcePathStyle,
11
+ });
12
+ const cleanupResolvedInputPropsProm = (0, cleanup_serialized_input_props_1.cleanupSerializedResolvedProps)({
13
+ region: providerSpecifics.getCurrentRegionInFunction(),
14
+ serialized: serializedResolvedProps,
15
+ providerSpecifics,
16
+ forcePathStyle,
17
+ });
18
+ return Promise.all([
19
+ cleanupSerializedInputPropsProm,
20
+ cleanupResolvedInputPropsProm,
21
+ ]);
22
+ };
23
+ exports.cleanupProps = cleanupProps;
@@ -0,0 +1,15 @@
1
+ import type { SerializedInputProps } from './constants';
2
+ import type { ProviderSpecifics } from './provider-implementation';
3
+ import type { CloudProvider } from './types';
4
+ export declare const cleanupSerializedInputProps: <Provider extends CloudProvider>({ serialized, region, providerSpecifics, forcePathStyle, }: {
5
+ serialized: SerializedInputProps;
6
+ region: Provider["region"];
7
+ providerSpecifics: ProviderSpecifics<Provider>;
8
+ forcePathStyle: boolean;
9
+ }) => Promise<number>;
10
+ export declare const cleanupSerializedResolvedProps: <Provider extends CloudProvider>({ serialized, region, providerSpecifics, forcePathStyle, }: {
11
+ serialized: SerializedInputProps;
12
+ region: Provider["region"];
13
+ providerSpecifics: ProviderSpecifics<Provider>;
14
+ forcePathStyle: boolean;
15
+ }) => Promise<number>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cleanupSerializedResolvedProps = exports.cleanupSerializedInputProps = void 0;
4
+ const input_props_keys_1 = require("./input-props-keys");
5
+ const cleanupSerializedInputProps = async ({ serialized, region, providerSpecifics, forcePathStyle, }) => {
6
+ if (serialized.type === 'payload') {
7
+ return 0;
8
+ }
9
+ const time = Date.now();
10
+ await providerSpecifics.deleteFile({
11
+ bucketName: serialized.bucketName,
12
+ key: (0, input_props_keys_1.inputPropsKey)(serialized.hash),
13
+ region,
14
+ customCredentials: null,
15
+ forcePathStyle,
16
+ });
17
+ return Date.now() - time;
18
+ };
19
+ exports.cleanupSerializedInputProps = cleanupSerializedInputProps;
20
+ const cleanupSerializedResolvedProps = async ({ serialized, region, providerSpecifics, forcePathStyle, }) => {
21
+ if (serialized.type === 'payload') {
22
+ return 0;
23
+ }
24
+ const time = Date.now();
25
+ await providerSpecifics.deleteFile({
26
+ bucketName: serialized.bucketName,
27
+ key: (0, input_props_keys_1.resolvedPropsKey)(serialized.hash),
28
+ region,
29
+ customCredentials: null,
30
+ forcePathStyle,
31
+ });
32
+ return Date.now() - time;
33
+ };
34
+ exports.cleanupSerializedResolvedProps = cleanupSerializedResolvedProps;
@@ -0,0 +1,26 @@
1
+ import type { AudioCodec, CancelSignal, LogLevel } from '@remotion/renderer';
2
+ import { type ServerlessCodec } from './constants';
3
+ import type { ProviderSpecifics } from './provider-implementation';
4
+ import type { CloudProvider } from './types';
5
+ export declare const concatVideos: <Provider extends CloudProvider>({ onProgress, numberOfFrames, codec, fps, numberOfGifLoops, files, outdir, audioCodec, audioBitrate, logLevel, framesPerLambda, binariesDirectory, cancelSignal, preferLossless, muted, metadata, providerSpecifics, }: {
6
+ onProgress: (frames: number) => void;
7
+ numberOfFrames: number;
8
+ codec: ServerlessCodec;
9
+ fps: number;
10
+ numberOfGifLoops: number | null;
11
+ files: string[];
12
+ outdir: string;
13
+ audioCodec: AudioCodec | null;
14
+ audioBitrate: string | null;
15
+ logLevel: LogLevel;
16
+ framesPerLambda: number;
17
+ binariesDirectory: string | null;
18
+ cancelSignal: CancelSignal | undefined;
19
+ preferLossless: boolean;
20
+ muted: boolean;
21
+ metadata: Record<string, string> | null;
22
+ providerSpecifics: ProviderSpecifics<Provider>;
23
+ }) => Promise<{
24
+ outfile: string;
25
+ cleanupChunksProm: Promise<void>;
26
+ }>;
@@ -0,0 +1,53 @@
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.concatVideos = void 0;
7
+ const renderer_1 = require("@remotion/renderer");
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = require("node:path");
10
+ const can_concat_seamlessly_1 = require("./can-concat-seamlessly");
11
+ const constants_1 = require("./constants");
12
+ const concatVideos = async ({ onProgress, numberOfFrames, codec, fps, numberOfGifLoops, files, outdir, audioCodec, audioBitrate, logLevel, framesPerLambda, binariesDirectory, cancelSignal, preferLossless, muted, metadata, providerSpecifics, }) => {
13
+ const outfile = (0, node_path_1.join)(renderer_1.RenderInternals.tmpDir(constants_1.REMOTION_CONCATED_TOKEN), `concat.${renderer_1.RenderInternals.getFileExtensionFromCodec(codec, audioCodec)}`);
14
+ const combine = providerSpecifics.timer('Combine chunks', logLevel);
15
+ const filelistDir = renderer_1.RenderInternals.tmpDir(constants_1.REMOTION_FILELIST_TOKEN);
16
+ const chunkDurationInSeconds = framesPerLambda / fps;
17
+ const resolvedAudioCodec = renderer_1.RenderInternals.resolveAudioCodec({
18
+ setting: audioCodec,
19
+ codec,
20
+ preferLossless,
21
+ separateAudioTo: null,
22
+ });
23
+ const seamlessAudio = (0, can_concat_seamlessly_1.canConcatAudioSeamlessly)(resolvedAudioCodec, framesPerLambda);
24
+ const seamlessVideo = (0, can_concat_seamlessly_1.canConcatVideoSeamlessly)(codec);
25
+ await renderer_1.RenderInternals.combineChunks({
26
+ files,
27
+ filelistDir,
28
+ output: outfile,
29
+ onProgress,
30
+ numberOfFrames,
31
+ codec,
32
+ fps,
33
+ numberOfGifLoops,
34
+ resolvedAudioCodec,
35
+ audioBitrate,
36
+ indent: false,
37
+ logLevel,
38
+ chunkDurationInSeconds,
39
+ binariesDirectory,
40
+ cancelSignal,
41
+ seamlessAudio,
42
+ seamlessVideo,
43
+ muted,
44
+ metadata,
45
+ });
46
+ combine.end();
47
+ const cleanupChunksProm = node_fs_1.default.promises.rm(outdir, {
48
+ recursive: true,
49
+ force: true,
50
+ });
51
+ return { outfile, cleanupChunksProm };
52
+ };
53
+ exports.concatVideos = concatVideos;
@@ -0,0 +1,20 @@
1
+ import type { PostRenderData } from './constants';
2
+ import type { OutputFileMetadata } from './find-output-file-in-bucket';
3
+ import type { OverallRenderProgress } from './overall-render-progress';
4
+ import type { ProviderSpecifics } from './provider-implementation';
5
+ import type { RenderMetadata } from './render-metadata';
6
+ import type { CloudProvider } from './types';
7
+ import type { EnhancedErrorInfo } from './write-lambda-error';
8
+ export declare const createPostRenderData: <Provider extends CloudProvider>({ region, memorySizeInMb, renderMetadata, errorExplanations, timeToDelete, outputFile, timeToCombine, overallProgress, timeToFinish, outputSize, providerSpecifics, }: {
9
+ region: Provider["region"];
10
+ memorySizeInMb: number;
11
+ renderMetadata: RenderMetadata<Provider>;
12
+ timeToDelete: number;
13
+ errorExplanations: EnhancedErrorInfo[];
14
+ outputFile: OutputFileMetadata;
15
+ timeToCombine: number | null;
16
+ overallProgress: OverallRenderProgress<Provider>;
17
+ timeToFinish: number;
18
+ outputSize: number;
19
+ providerSpecifics: ProviderSpecifics<Provider>;
20
+ }) => PostRenderData<Provider>;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPostRenderData = void 0;
4
+ const calculate_chunk_times_1 = require("./calculate-chunk-times");
5
+ const most_expensive_chunks_1 = require("./most-expensive-chunks");
6
+ const createPostRenderData = ({ region, memorySizeInMb, renderMetadata, errorExplanations, timeToDelete, outputFile, timeToCombine, overallProgress, timeToFinish, outputSize, providerSpecifics, }) => {
7
+ const parsedTimings = overallProgress.timings;
8
+ const estimatedBillingDurationInMilliseconds = parsedTimings
9
+ .map((p) => p.rendered - p.start + most_expensive_chunks_1.OVERHEAD_TIME_PER_LAMBDA)
10
+ .reduce((a, b) => a + b);
11
+ const cost = providerSpecifics.estimatePrice({
12
+ durationInMilliseconds: estimatedBillingDurationInMilliseconds,
13
+ memorySizeInMb,
14
+ region,
15
+ lambdasInvoked: renderMetadata.estimatedTotalLambdaInvokations,
16
+ diskSizeInMb: providerSpecifics.getEphemeralStorageForPriceCalculation(),
17
+ });
18
+ if (!outputFile) {
19
+ throw new Error('Cannot wrap up without an output file in the S3 bucket.');
20
+ }
21
+ const endTime = Date.now();
22
+ if (overallProgress.timeToEncode === null) {
23
+ throw new Error('Expected time to encode to be set');
24
+ }
25
+ if (overallProgress.timeToRenderFrames === null) {
26
+ throw new Error('Expected time to encode to be set');
27
+ }
28
+ return {
29
+ cost: {
30
+ currency: 'USD',
31
+ disclaimer: 'Estimated cost for lambda invocations only. Does not include cost for S3 storage and data transfer.',
32
+ estimatedCost: cost,
33
+ estimatedDisplayCost: `$${new Intl.NumberFormat('en-US', {
34
+ currency: 'USD',
35
+ currencyDisplay: 'narrowSymbol',
36
+ }).format(cost)}`,
37
+ },
38
+ outputFile: outputFile.url,
39
+ timeToFinish,
40
+ errors: errorExplanations,
41
+ startTime: renderMetadata.startedDate,
42
+ endTime,
43
+ outputSize,
44
+ renderSize: outputSize,
45
+ filesCleanedUp: 0,
46
+ timeToEncode: overallProgress.timeToEncode,
47
+ timeToCleanUp: timeToDelete,
48
+ timeToRenderChunks: (0, calculate_chunk_times_1.calculateChunkTimes)({
49
+ type: 'absolute-time',
50
+ timings: overallProgress.timings,
51
+ }),
52
+ timeToRenderFrames: overallProgress.timeToRenderFrames,
53
+ retriesInfo: overallProgress.retries,
54
+ mostExpensiveFrameRanges: renderMetadata.type === 'still'
55
+ ? []
56
+ : (0, most_expensive_chunks_1.getMostExpensiveChunks)({
57
+ parsedTimings,
58
+ framesPerLambda: renderMetadata.framesPerLambda,
59
+ firstFrame: renderMetadata.frameRange[0],
60
+ lastFrame: renderMetadata.frameRange[1],
61
+ }),
62
+ deleteAfter: renderMetadata.deleteAfter,
63
+ estimatedBillingDurationInMilliseconds,
64
+ timeToCombine: timeToCombine !== null && timeToCombine !== void 0 ? timeToCombine : null,
65
+ artifactProgress: overallProgress.receivedArtifact,
66
+ };
67
+ };
68
+ exports.createPostRenderData = createPostRenderData;
@@ -0,0 +1 @@
1
+ export declare const DOCS_URL = "https://remotion.dev";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DOCS_URL = void 0;
4
+ exports.DOCS_URL = 'https://remotion.dev';
@@ -0,0 +1,15 @@
1
+ import type { ProviderSpecifics } from './provider-implementation';
2
+ import type { RenderMetadata } from './render-metadata';
3
+ import type { CloudProvider, ParsedTiming } from './types';
4
+ export declare const estimatePriceFromBucket: <Provider extends CloudProvider>({ renderMetadata, memorySizeInMb, diskSizeInMb, lambdasInvoked, timings, region, providerSpecifics, }: {
5
+ renderMetadata: RenderMetadata<Provider> | null;
6
+ memorySizeInMb: number;
7
+ diskSizeInMb: number;
8
+ lambdasInvoked: number;
9
+ timings: ParsedTiming[];
10
+ region: Provider["region"];
11
+ providerSpecifics: ProviderSpecifics<Provider>;
12
+ }) => {
13
+ accruedSoFar: number;
14
+ estimatedBillingDurationInMilliseconds: number;
15
+ } | null;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.estimatePriceFromBucket = void 0;
4
+ const calculate_chunk_times_1 = require("./calculate-chunk-times");
5
+ const estimatePriceFromBucket = ({ renderMetadata, memorySizeInMb, diskSizeInMb, lambdasInvoked, timings, region, providerSpecifics, }) => {
6
+ var _a, _b;
7
+ if (!renderMetadata) {
8
+ return null;
9
+ }
10
+ const elapsedTime = Math.max(0, Date.now() - ((_a = renderMetadata === null || renderMetadata === void 0 ? void 0 : renderMetadata.startedDate) !== null && _a !== void 0 ? _a : 0));
11
+ const unfinished = Math.max(0, ((_b = renderMetadata === null || renderMetadata === void 0 ? void 0 : renderMetadata.totalChunks) !== null && _b !== void 0 ? _b : 0) - timings.length);
12
+ const timeElapsedOfUnfinished = new Array(unfinished)
13
+ .fill(true)
14
+ .map(() => elapsedTime)
15
+ .reduce((a, b) => a + b, 0);
16
+ const estimatedBillingDurationInMilliseconds = (0, calculate_chunk_times_1.calculateChunkTimes)({
17
+ type: 'combined-time-for-cost-calculation',
18
+ timings,
19
+ }) + timeElapsedOfUnfinished;
20
+ const accruedSoFar = Number(providerSpecifics
21
+ .estimatePrice({
22
+ region,
23
+ durationInMilliseconds: estimatedBillingDurationInMilliseconds,
24
+ memorySizeInMb,
25
+ diskSizeInMb,
26
+ lambdasInvoked,
27
+ })
28
+ .toPrecision(5));
29
+ return { accruedSoFar, estimatedBillingDurationInMilliseconds };
30
+ };
31
+ exports.estimatePriceFromBucket = estimatePriceFromBucket;
@@ -0,0 +1,16 @@
1
+ import type { CustomCredentials } from './constants';
2
+ import type { ProviderSpecifics } from './provider-implementation';
3
+ import type { RenderMetadata } from './render-metadata';
4
+ import type { CloudProvider } from './types';
5
+ export type OutputFileMetadata = {
6
+ url: string;
7
+ };
8
+ export declare const findOutputFileInBucket: <Provider extends CloudProvider>({ region, renderMetadata, bucketName, customCredentials, currentRegion, providerSpecifics, forcePathStyle, }: {
9
+ region: Provider["region"];
10
+ renderMetadata: RenderMetadata<Provider>;
11
+ bucketName: string;
12
+ customCredentials: CustomCredentials<Provider> | null;
13
+ currentRegion: Provider["region"];
14
+ providerSpecifics: ProviderSpecifics<Provider>;
15
+ forcePathStyle: boolean;
16
+ }) => Promise<OutputFileMetadata | null>;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findOutputFileInBucket = void 0;
4
+ const expected_out_name_1 = require("./expected-out-name");
5
+ const findOutputFileInBucket = async ({ region, renderMetadata, bucketName, customCredentials, currentRegion, providerSpecifics, forcePathStyle, }) => {
6
+ if (!renderMetadata) {
7
+ throw new Error('unexpectedly did not get renderMetadata');
8
+ }
9
+ const { renderBucketName, key } = (0, expected_out_name_1.getExpectedOutName)(renderMetadata, bucketName, customCredentials);
10
+ try {
11
+ await providerSpecifics.headFile({
12
+ bucketName,
13
+ key,
14
+ region,
15
+ customCredentials,
16
+ forcePathStyle,
17
+ });
18
+ return {
19
+ url: providerSpecifics.getOutputUrl({
20
+ renderMetadata,
21
+ bucketName,
22
+ customCredentials,
23
+ currentRegion,
24
+ }).url,
25
+ };
26
+ }
27
+ catch (err) {
28
+ if (err.name === 'NotFound') {
29
+ return null;
30
+ }
31
+ if (err.message === 'UnknownError' ||
32
+ err.$metadata
33
+ .httpStatusCode === 403) {
34
+ throw new Error(`Unable to access item "${key}" from bucket "${renderBucketName}" ${(customCredentials === null || customCredentials === void 0 ? void 0 : customCredentials.endpoint)
35
+ ? `(S3 Endpoint = ${customCredentials === null || customCredentials === void 0 ? void 0 : customCredentials.endpoint})`
36
+ : ''}. The Lambda role must have permission for both "s3:GetObject" and "s3:ListBucket" actions.`);
37
+ }
38
+ throw err;
39
+ }
40
+ };
41
+ exports.findOutputFileInBucket = findOutputFileInBucket;
@@ -0,0 +1,2 @@
1
+ import type { CostsInfo } from './types';
2
+ export declare const formatCostsInfo: (accrued: number) => CostsInfo;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatCostsInfo = void 0;
4
+ const display = (accrued) => {
5
+ if (accrued < 0.001) {
6
+ return '<$0.001';
7
+ }
8
+ return new Intl.NumberFormat('en-US', {
9
+ currency: 'USD',
10
+ style: 'currency',
11
+ currencyDisplay: 'narrowSymbol',
12
+ minimumFractionDigits: 3,
13
+ }).format(accrued);
14
+ };
15
+ const formatCostsInfo = (accrued) => {
16
+ return {
17
+ accruedSoFar: accrued,
18
+ displayCost: display(accrued),
19
+ currency: 'USD',
20
+ disclaimer: 'Estimated cost only. Does not include charges for other AWS services.',
21
+ };
22
+ };
23
+ exports.formatCostsInfo = formatCostsInfo;
@@ -0,0 +1,11 @@
1
+ import type { OverallRenderProgress } from './overall-render-progress';
2
+ import type { ProviderSpecifics } from './provider-implementation';
3
+ import type { CloudProvider } from './types';
4
+ export declare const getOverallProgressFromStorage: <Provider extends CloudProvider>({ renderId, bucketName, expectedBucketOwner, region, providerSpecifics, forcePathStyle, }: {
5
+ renderId: string;
6
+ expectedBucketOwner: string | null;
7
+ bucketName: string;
8
+ region: Provider["region"];
9
+ providerSpecifics: ProviderSpecifics<Provider>;
10
+ forcePathStyle: boolean;
11
+ }) => Promise<OverallRenderProgress<Provider>>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getOverallProgressFromStorage = void 0;
4
+ const constants_1 = require("./constants");
5
+ const stream_to_string_1 = require("./stream-to-string");
6
+ const getOverallProgressFromStorage = async ({ renderId, bucketName, expectedBucketOwner, region, providerSpecifics, forcePathStyle, }) => {
7
+ try {
8
+ const Body = await providerSpecifics.readFile({
9
+ bucketName,
10
+ key: (0, constants_1.overallProgressKey)(renderId),
11
+ expectedBucketOwner,
12
+ region,
13
+ forcePathStyle,
14
+ });
15
+ const str = await (0, stream_to_string_1.streamToString)(Body);
16
+ return JSON.parse(str);
17
+ }
18
+ catch (err) {
19
+ if (err.name === 'NotFound') {
20
+ throw new TypeError(`No render with ID "${renderId}" found in bucket ${bucketName} and region ${region}`);
21
+ }
22
+ throw err;
23
+ }
24
+ };
25
+ exports.getOverallProgressFromStorage = getOverallProgressFromStorage;
@@ -0,0 +1,9 @@
1
+ export declare const getOverallProgress: ({ encoding, invoking, frames, invokedLambda, visitedServeUrl, gotComposition, combining, }: {
2
+ invokedLambda: number;
3
+ visitedServeUrl: number | null;
4
+ gotComposition: number | null;
5
+ encoding: number;
6
+ invoking: number;
7
+ frames: number;
8
+ combining: number;
9
+ }) => number;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getOverallProgress = void 0;
4
+ const weights = {
5
+ evaluating: 0.1,
6
+ encoding: 0.1,
7
+ frames: 0.6,
8
+ invoking: 0.1,
9
+ combining: 0.1,
10
+ };
11
+ const getOverallProgress = ({ encoding, invoking, frames, invokedLambda, visitedServeUrl, gotComposition, combining, }) => {
12
+ const evaluationProgress = [
13
+ Boolean(invokedLambda),
14
+ Boolean(visitedServeUrl),
15
+ Boolean(gotComposition),
16
+ ].reduce((a, b) => Number(a) + Number(b), 0) / 3;
17
+ return (evaluationProgress * weights.evaluating +
18
+ encoding * weights.encoding +
19
+ invoking * weights.invoking +
20
+ frames * weights.frames +
21
+ combining * weights.combining);
22
+ };
23
+ exports.getOverallProgress = getOverallProgress;
@@ -0,0 +1,11 @@
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
+ };
7
+ export declare const compositionsHandler: <Provider extends CloudProvider>(lambdaParams: ServerlessPayload<Provider>, options: Options, providerSpecifics: ProviderSpecifics<Provider>) => Promise<{
8
+ compositions: import("remotion").VideoConfig[];
9
+ type: "success";
10
+ }>;
11
+ export {};