@remotion/serverless 4.0.244 → 4.0.246

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 (122) hide show
  1. package/.turbo/turbo-make.log +1 -1
  2. package/LICENSE.md +1 -1
  3. package/dist/best-frames-per-function-param.d.ts +1 -0
  4. package/dist/best-frames-per-function-param.js +17 -0
  5. package/dist/calculate-chunk-times.d.ts +5 -0
  6. package/dist/calculate-chunk-times.js +29 -0
  7. package/dist/can-concat-seamlessly.d.ts +3 -0
  8. package/dist/can-concat-seamlessly.js +17 -0
  9. package/dist/cleanup-props.d.ts +9 -0
  10. package/dist/cleanup-props.js +23 -0
  11. package/dist/cleanup-serialized-input-props.d.ts +15 -0
  12. package/dist/cleanup-serialized-input-props.js +34 -0
  13. package/dist/client.d.ts +9 -0
  14. package/dist/client.js +30 -12
  15. package/dist/compress-props.d.ts +6 -2
  16. package/dist/compress-props.js +5 -3
  17. package/dist/concat-videos.d.ts +25 -0
  18. package/dist/concat-videos.js +53 -0
  19. package/dist/constants.d.ts +39 -3
  20. package/dist/constants.js +8 -1
  21. package/dist/create-post-render-data.d.ts +20 -0
  22. package/dist/create-post-render-data.js +68 -0
  23. package/dist/docs-url.d.ts +1 -0
  24. package/dist/docs-url.js +4 -0
  25. package/dist/estimate-price-from-bucket.d.ts +15 -0
  26. package/dist/estimate-price-from-bucket.js +31 -0
  27. package/dist/expected-out-name.d.ts +1 -1
  28. package/dist/find-output-file-in-bucket.d.ts +16 -0
  29. package/dist/find-output-file-in-bucket.js +41 -0
  30. package/dist/format-costs-info.d.ts +2 -0
  31. package/dist/format-costs-info.js +23 -0
  32. package/dist/get-browser-instance.d.ts +5 -12
  33. package/dist/get-browser-instance.js +8 -7
  34. package/dist/get-custom-out-name.d.ts +1 -1
  35. package/dist/get-or-create-bucket.d.ts +1 -1
  36. package/dist/get-overall-progress-from-storage.d.ts +11 -0
  37. package/dist/get-overall-progress-from-storage.js +25 -0
  38. package/dist/get-overall-progress.d.ts +9 -0
  39. package/dist/get-overall-progress.js +23 -0
  40. package/dist/handlers/check-version-mismatch.d.ts +8 -0
  41. package/dist/handlers/check-version-mismatch.js +23 -0
  42. package/dist/handlers/compositions.d.ts +16 -0
  43. package/dist/handlers/compositions.js +81 -0
  44. package/dist/handlers/launch.d.ts +18 -0
  45. package/dist/handlers/launch.js +600 -0
  46. package/dist/handlers/progress.d.ts +16 -0
  47. package/dist/handlers/progress.js +54 -0
  48. package/dist/handlers/renderer.d.ts +24 -0
  49. package/dist/handlers/renderer.js +344 -0
  50. package/dist/handlers/start.d.ts +19 -0
  51. package/dist/handlers/start.js +104 -0
  52. package/dist/handlers/still.d.ts +21 -0
  53. package/dist/handlers/still.js +335 -0
  54. package/dist/index.d.ts +21 -5
  55. package/dist/index.js +54 -7
  56. package/dist/info.d.ts +1 -1
  57. package/dist/inner-routine.d.ts +22 -0
  58. package/dist/inner-routine.js +267 -0
  59. package/dist/inspect-error.d.ts +4 -0
  60. package/dist/inspect-error.js +39 -0
  61. package/dist/invoke-webhook.d.ts +42 -0
  62. package/dist/invoke-webhook.js +116 -0
  63. package/dist/is-warm.d.ts +2 -0
  64. package/dist/is-warm.js +10 -0
  65. package/dist/leak-detection.d.ts +4 -0
  66. package/dist/leak-detection.js +40 -0
  67. package/dist/make-bucket-name.d.ts +1 -1
  68. package/dist/make-timeout-error.d.ts +13 -0
  69. package/dist/make-timeout-error.js +32 -0
  70. package/dist/make-timeout-message.d.ts +12 -0
  71. package/dist/make-timeout-message.js +76 -0
  72. package/dist/merge-chunks.d.ts +38 -0
  73. package/dist/merge-chunks.js +92 -0
  74. package/dist/min-max.d.ts +2 -0
  75. package/dist/min-max.js +33 -0
  76. package/dist/most-expensive-chunks.d.ts +13 -0
  77. package/dist/most-expensive-chunks.js +28 -0
  78. package/dist/on-downloads-helpers.d.ts +2 -0
  79. package/dist/on-downloads-helpers.js +29 -0
  80. package/dist/overall-render-progress.d.ts +59 -0
  81. package/dist/overall-render-progress.js +180 -0
  82. package/dist/plan-frame-ranges.d.ts +7 -0
  83. package/dist/plan-frame-ranges.js +17 -0
  84. package/dist/print-logging-grep-helper.d.ts +4 -0
  85. package/dist/print-logging-grep-helper.js +12 -0
  86. package/dist/progress.d.ts +16 -0
  87. package/dist/progress.js +254 -0
  88. package/dist/provider-implementation.d.ts +152 -3
  89. package/dist/render-has-audio-video.d.ts +6 -0
  90. package/dist/render-has-audio-video.js +21 -0
  91. package/dist/render-metadata.d.ts +1 -1
  92. package/dist/render-progress.d.ts +51 -0
  93. package/dist/return-values.d.ts +38 -0
  94. package/dist/return-values.js +2 -0
  95. package/dist/stackback.d.ts +6 -0
  96. package/dist/stackback.js +59 -0
  97. package/dist/stream-renderer.d.ts +17 -0
  98. package/dist/stream-renderer.js +148 -0
  99. package/dist/streaming/streaming.d.ts +6 -6
  100. package/dist/streaming/streaming.js +3 -3
  101. package/dist/types.d.ts +55 -0
  102. package/dist/types.js +2 -0
  103. package/dist/validate-composition.d.ts +1 -1
  104. package/dist/validate-composition.js +11 -1
  105. package/dist/validate-download-behavior.d.ts +1 -0
  106. package/dist/validate-download-behavior.js +21 -0
  107. package/dist/validate-frames-per-function.d.ts +4 -0
  108. package/dist/validate-frames-per-function.js +29 -0
  109. package/dist/validate-privacy.d.ts +2 -0
  110. package/dist/validate-privacy.js +14 -0
  111. package/dist/validate.d.ts +4 -0
  112. package/dist/validate.js +8 -0
  113. package/dist/why-is-node-running.d.ts +15 -0
  114. package/dist/why-is-node-running.js +89 -0
  115. package/dist/{write-lambda-error.d.ts → write-error-to-storage.d.ts} +4 -4
  116. package/package.json +6 -5
  117. package/tsconfig.tsbuildinfo +1 -1
  118. package/dist/compositions.d.ts +0 -11
  119. package/dist/compositions.js +0 -82
  120. package/dist/still.d.ts +0 -28
  121. /package/dist/{still.js → render-progress.js} +0 -0
  122. /package/dist/{write-lambda-error.js → write-error-to-storage.js} +0 -0
@@ -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.245 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 `framesPerFunction` value
12
+ const framesPerFunction = Math.max(frameCount / concurrency, 20);
13
+ // Evenly distribute: For 21 frames over 2 functions, distribute as 11 + 10 ==> framesPerLambda = 11
14
+ const functionsNeeded = Math.ceil(frameCount / framesPerFunction);
15
+ return Math.ceil(frameCount / functionsNeeded);
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;
package/dist/client.d.ts CHANGED
@@ -1,15 +1,24 @@
1
+ export { COMMAND_NOT_FOUND } from './constants';
1
2
  export { Await } from './await';
2
3
  export { compressInputProps, decompressInputProps, getNeedsToUpload, serializeOrThrow, } from './compress-props';
3
4
  export { REMOTION_BUCKET_PREFIX, ServerlessCodec, ServerlessPayload, ServerlessPayloads, ServerlessRoutines, ServerlessStartPayload, ServerlessStatusPayload, artifactName, customOutName, expiryDays, outName, outStillName, overallProgressKey, rendersPrefix, serverlessCodecs, type CustomCredentials, type CustomCredentialsWithoutSensitiveData, type DeleteAfter, type DownloadBehavior, type OutNameInput, type OutNameInputWithoutCredentials, type OutNameOutput, type Privacy, type SerializedInputProps, type WebhookOption, } from './constants';
4
5
  export { GetOrCreateBucketInput, GetOrCreateBucketOutput, internalGetOrCreateBucket, } from './get-or-create-bucket';
6
+ export { validateDownloadBehavior } from './validate-download-behavior';
7
+ export { validateFramesPerFunction } from './validate-frames-per-function';
5
8
  export { errorIsOutOfSpaceError, isBrowserCrashedError, isErrInsufficientResourcesErr, } from './error-category';
9
+ export { calculateChunkTimes } from './calculate-chunk-times';
10
+ export { MAX_FUNCTIONS_PER_RENDER } from './constants';
11
+ export { DOCS_URL } from './docs-url';
6
12
  export { getExpectedOutName } from './expected-out-name';
7
13
  export { FileNameAndSize, GetFolderFiles } from './get-files-in-folder';
14
+ export { getOverallProgressFromStorage } from './get-overall-progress-from-storage';
8
15
  export { inputPropsKey, resolvedPropsKey } from './input-props-keys';
9
16
  export { makeBucketName } from './make-bucket-name';
17
+ export { getProgress } from './progress';
10
18
  export { RenderMetadata } from './render-metadata';
11
19
  export { streamToString } from './stream-to-string';
12
20
  export { MessageTypeId, formatMap, makeStreamPayload, messageTypeIdToMessageType, } from './streaming/streaming';
13
21
  export { truthy } from './truthy';
14
22
  export { validateBucketName } from './validate-bucket-name';
23
+ export { validatePrivacy } from './validate-privacy';
15
24
  export { validateWebhook } from './validate-webhook';
package/dist/client.js CHANGED
@@ -1,35 +1,51 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateWebhook = exports.validateBucketName = exports.truthy = exports.messageTypeIdToMessageType = exports.makeStreamPayload = exports.formatMap = exports.streamToString = exports.makeBucketName = exports.resolvedPropsKey = exports.inputPropsKey = exports.getExpectedOutName = exports.isErrInsufficientResourcesErr = exports.isBrowserCrashedError = exports.errorIsOutOfSpaceError = exports.internalGetOrCreateBucket = exports.serverlessCodecs = exports.rendersPrefix = exports.overallProgressKey = exports.outStillName = exports.outName = exports.expiryDays = exports.customOutName = exports.artifactName = exports.ServerlessRoutines = exports.REMOTION_BUCKET_PREFIX = exports.serializeOrThrow = exports.getNeedsToUpload = exports.decompressInputProps = exports.compressInputProps = void 0;
3
+ exports.validateWebhook = exports.validatePrivacy = exports.validateBucketName = exports.truthy = exports.messageTypeIdToMessageType = exports.makeStreamPayload = exports.formatMap = exports.streamToString = exports.getProgress = exports.makeBucketName = exports.resolvedPropsKey = exports.inputPropsKey = exports.getOverallProgressFromStorage = exports.getExpectedOutName = exports.DOCS_URL = exports.MAX_FUNCTIONS_PER_RENDER = exports.calculateChunkTimes = exports.isErrInsufficientResourcesErr = exports.isBrowserCrashedError = exports.errorIsOutOfSpaceError = exports.validateFramesPerFunction = exports.validateDownloadBehavior = exports.internalGetOrCreateBucket = exports.serverlessCodecs = exports.rendersPrefix = exports.overallProgressKey = exports.outStillName = exports.outName = exports.expiryDays = exports.customOutName = exports.artifactName = exports.ServerlessRoutines = exports.REMOTION_BUCKET_PREFIX = exports.serializeOrThrow = exports.getNeedsToUpload = exports.decompressInputProps = exports.compressInputProps = exports.COMMAND_NOT_FOUND = void 0;
4
+ var constants_1 = require("./constants");
5
+ Object.defineProperty(exports, "COMMAND_NOT_FOUND", { enumerable: true, get: function () { return constants_1.COMMAND_NOT_FOUND; } });
4
6
  var compress_props_1 = require("./compress-props");
5
7
  Object.defineProperty(exports, "compressInputProps", { enumerable: true, get: function () { return compress_props_1.compressInputProps; } });
6
8
  Object.defineProperty(exports, "decompressInputProps", { enumerable: true, get: function () { return compress_props_1.decompressInputProps; } });
7
9
  Object.defineProperty(exports, "getNeedsToUpload", { enumerable: true, get: function () { return compress_props_1.getNeedsToUpload; } });
8
10
  Object.defineProperty(exports, "serializeOrThrow", { enumerable: true, get: function () { return compress_props_1.serializeOrThrow; } });
9
- var constants_1 = require("./constants");
10
- Object.defineProperty(exports, "REMOTION_BUCKET_PREFIX", { enumerable: true, get: function () { return constants_1.REMOTION_BUCKET_PREFIX; } });
11
- Object.defineProperty(exports, "ServerlessRoutines", { enumerable: true, get: function () { return constants_1.ServerlessRoutines; } });
12
- Object.defineProperty(exports, "artifactName", { enumerable: true, get: function () { return constants_1.artifactName; } });
13
- Object.defineProperty(exports, "customOutName", { enumerable: true, get: function () { return constants_1.customOutName; } });
14
- Object.defineProperty(exports, "expiryDays", { enumerable: true, get: function () { return constants_1.expiryDays; } });
15
- Object.defineProperty(exports, "outName", { enumerable: true, get: function () { return constants_1.outName; } });
16
- Object.defineProperty(exports, "outStillName", { enumerable: true, get: function () { return constants_1.outStillName; } });
17
- Object.defineProperty(exports, "overallProgressKey", { enumerable: true, get: function () { return constants_1.overallProgressKey; } });
18
- Object.defineProperty(exports, "rendersPrefix", { enumerable: true, get: function () { return constants_1.rendersPrefix; } });
19
- Object.defineProperty(exports, "serverlessCodecs", { enumerable: true, get: function () { return constants_1.serverlessCodecs; } });
11
+ var constants_2 = require("./constants");
12
+ Object.defineProperty(exports, "REMOTION_BUCKET_PREFIX", { enumerable: true, get: function () { return constants_2.REMOTION_BUCKET_PREFIX; } });
13
+ Object.defineProperty(exports, "ServerlessRoutines", { enumerable: true, get: function () { return constants_2.ServerlessRoutines; } });
14
+ Object.defineProperty(exports, "artifactName", { enumerable: true, get: function () { return constants_2.artifactName; } });
15
+ Object.defineProperty(exports, "customOutName", { enumerable: true, get: function () { return constants_2.customOutName; } });
16
+ Object.defineProperty(exports, "expiryDays", { enumerable: true, get: function () { return constants_2.expiryDays; } });
17
+ Object.defineProperty(exports, "outName", { enumerable: true, get: function () { return constants_2.outName; } });
18
+ Object.defineProperty(exports, "outStillName", { enumerable: true, get: function () { return constants_2.outStillName; } });
19
+ Object.defineProperty(exports, "overallProgressKey", { enumerable: true, get: function () { return constants_2.overallProgressKey; } });
20
+ Object.defineProperty(exports, "rendersPrefix", { enumerable: true, get: function () { return constants_2.rendersPrefix; } });
21
+ Object.defineProperty(exports, "serverlessCodecs", { enumerable: true, get: function () { return constants_2.serverlessCodecs; } });
20
22
  var get_or_create_bucket_1 = require("./get-or-create-bucket");
21
23
  Object.defineProperty(exports, "internalGetOrCreateBucket", { enumerable: true, get: function () { return get_or_create_bucket_1.internalGetOrCreateBucket; } });
24
+ var validate_download_behavior_1 = require("./validate-download-behavior");
25
+ Object.defineProperty(exports, "validateDownloadBehavior", { enumerable: true, get: function () { return validate_download_behavior_1.validateDownloadBehavior; } });
26
+ var validate_frames_per_function_1 = require("./validate-frames-per-function");
27
+ Object.defineProperty(exports, "validateFramesPerFunction", { enumerable: true, get: function () { return validate_frames_per_function_1.validateFramesPerFunction; } });
22
28
  var error_category_1 = require("./error-category");
23
29
  Object.defineProperty(exports, "errorIsOutOfSpaceError", { enumerable: true, get: function () { return error_category_1.errorIsOutOfSpaceError; } });
24
30
  Object.defineProperty(exports, "isBrowserCrashedError", { enumerable: true, get: function () { return error_category_1.isBrowserCrashedError; } });
25
31
  Object.defineProperty(exports, "isErrInsufficientResourcesErr", { enumerable: true, get: function () { return error_category_1.isErrInsufficientResourcesErr; } });
32
+ var calculate_chunk_times_1 = require("./calculate-chunk-times");
33
+ Object.defineProperty(exports, "calculateChunkTimes", { enumerable: true, get: function () { return calculate_chunk_times_1.calculateChunkTimes; } });
34
+ var constants_3 = require("./constants");
35
+ Object.defineProperty(exports, "MAX_FUNCTIONS_PER_RENDER", { enumerable: true, get: function () { return constants_3.MAX_FUNCTIONS_PER_RENDER; } });
36
+ var docs_url_1 = require("./docs-url");
37
+ Object.defineProperty(exports, "DOCS_URL", { enumerable: true, get: function () { return docs_url_1.DOCS_URL; } });
26
38
  var expected_out_name_1 = require("./expected-out-name");
27
39
  Object.defineProperty(exports, "getExpectedOutName", { enumerable: true, get: function () { return expected_out_name_1.getExpectedOutName; } });
40
+ var get_overall_progress_from_storage_1 = require("./get-overall-progress-from-storage");
41
+ Object.defineProperty(exports, "getOverallProgressFromStorage", { enumerable: true, get: function () { return get_overall_progress_from_storage_1.getOverallProgressFromStorage; } });
28
42
  var input_props_keys_1 = require("./input-props-keys");
29
43
  Object.defineProperty(exports, "inputPropsKey", { enumerable: true, get: function () { return input_props_keys_1.inputPropsKey; } });
30
44
  Object.defineProperty(exports, "resolvedPropsKey", { enumerable: true, get: function () { return input_props_keys_1.resolvedPropsKey; } });
31
45
  var make_bucket_name_1 = require("./make-bucket-name");
32
46
  Object.defineProperty(exports, "makeBucketName", { enumerable: true, get: function () { return make_bucket_name_1.makeBucketName; } });
47
+ var progress_1 = require("./progress");
48
+ Object.defineProperty(exports, "getProgress", { enumerable: true, get: function () { return progress_1.getProgress; } });
33
49
  var stream_to_string_1 = require("./stream-to-string");
34
50
  Object.defineProperty(exports, "streamToString", { enumerable: true, get: function () { return stream_to_string_1.streamToString; } });
35
51
  var streaming_1 = require("./streaming/streaming");
@@ -40,5 +56,7 @@ var truthy_1 = require("./truthy");
40
56
  Object.defineProperty(exports, "truthy", { enumerable: true, get: function () { return truthy_1.truthy; } });
41
57
  var validate_bucket_name_1 = require("./validate-bucket-name");
42
58
  Object.defineProperty(exports, "validateBucketName", { enumerable: true, get: function () { return validate_bucket_name_1.validateBucketName; } });
59
+ var validate_privacy_1 = require("./validate-privacy");
60
+ Object.defineProperty(exports, "validatePrivacy", { enumerable: true, get: function () { return validate_privacy_1.validatePrivacy; } });
43
61
  var validate_webhook_1 = require("./validate-webhook");
44
62
  Object.defineProperty(exports, "validateWebhook", { enumerable: true, get: function () { return validate_webhook_1.validateWebhook; } });
@@ -1,9 +1,13 @@
1
1
  import type { SerializedInputProps } from './constants';
2
2
  import type { ProviderSpecifics } from './provider-implementation';
3
- import type { CloudProvider } from './still';
3
+ import type { CloudProvider } from './types';
4
4
  type PropsType = 'input-props' | 'resolved-props';
5
5
  export declare const serializeOrThrow: (inputProps: Record<string, unknown>, propsType: PropsType) => string;
6
- export declare const getNeedsToUpload: (type: "still" | "video-or-audio", sizes: number[]) => boolean;
6
+ export declare const getNeedsToUpload: <Provider extends CloudProvider>({ type, sizes, providerSpecifics, }: {
7
+ type: "still" | "video-or-audio";
8
+ sizes: number[];
9
+ providerSpecifics: ProviderSpecifics<Provider>;
10
+ }) => boolean;
7
11
  export declare const compressInputProps: <Provider extends CloudProvider>({ stringifiedInputProps, region, userSpecifiedBucketName, propsType, needsToUpload, providerSpecifics, forcePathStyle, skipPutAcl, }: {
8
12
  stringifiedInputProps: string;
9
13
  region: Provider["region"];
@@ -26,13 +26,15 @@ const serializeOrThrow = (inputProps, propsType) => {
26
26
  }
27
27
  };
28
28
  exports.serializeOrThrow = serializeOrThrow;
29
- const getNeedsToUpload = (type, sizes) => {
29
+ const getNeedsToUpload = ({ type, sizes, providerSpecifics, }) => {
30
30
  const MARGIN = 5000 + validate_webhook_1.MAX_WEBHOOK_CUSTOM_DATA_SIZE;
31
- const MAX_INLINE_PAYLOAD_SIZE = (type === 'still' ? 5000000 : 200000) - MARGIN;
31
+ const MAX_INLINE_PAYLOAD_SIZE = (type === 'still'
32
+ ? providerSpecifics.getMaxStillInlinePayloadSize()
33
+ : providerSpecifics.getMaxNonInlinePayloadSizePerFunction()) - MARGIN;
32
34
  const sizesAlreadyUsed = sizes.reduce((a, b) => a + b);
33
35
  if (sizesAlreadyUsed > MAX_INLINE_PAYLOAD_SIZE) {
34
36
  // eslint-disable-next-line no-console
35
- console.warn(`Warning: The props are over ${Math.round(MAX_INLINE_PAYLOAD_SIZE / 1000)}KB (${Math.ceil(sizesAlreadyUsed / 1024)}KB) in size. Uploading them to S3 to circumvent AWS Lambda payload size, which may lead to slowdown.`);
37
+ console.warn(`Warning: The props are over ${Math.round(MAX_INLINE_PAYLOAD_SIZE / 1000)}KB (${Math.ceil(sizesAlreadyUsed / 1024)}KB) in size. Uploading them to ${providerSpecifics.serverStorageProductName()} to circumvent AWS Lambda payload size, which may lead to slowdown.`);
36
38
  return true;
37
39
  }
38
40
  return false;
@@ -0,0 +1,25 @@
1
+ import type { AudioCodec, CancelSignal, LogLevel } from '@remotion/renderer';
2
+ import { type ServerlessCodec } from './constants';
3
+ import type { InsideFunctionSpecifics } from './provider-implementation';
4
+ export declare const concatVideos: ({ onProgress, numberOfFrames, codec, fps, numberOfGifLoops, files, outdir, audioCodec, audioBitrate, logLevel, framesPerLambda, binariesDirectory, cancelSignal, preferLossless, muted, metadata, insideFunctionSpecifics, }: {
5
+ onProgress: (frames: number) => void;
6
+ numberOfFrames: number;
7
+ codec: ServerlessCodec;
8
+ fps: number;
9
+ numberOfGifLoops: number | null;
10
+ files: string[];
11
+ outdir: string;
12
+ audioCodec: AudioCodec | null;
13
+ audioBitrate: string | null;
14
+ logLevel: LogLevel;
15
+ framesPerLambda: number;
16
+ binariesDirectory: string | null;
17
+ cancelSignal: CancelSignal | undefined;
18
+ preferLossless: boolean;
19
+ muted: boolean;
20
+ metadata: Record<string, string> | null;
21
+ insideFunctionSpecifics: InsideFunctionSpecifics;
22
+ }) => Promise<{
23
+ outfile: string;
24
+ cleanupChunksProm: Promise<void>;
25
+ }>;
@@ -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, insideFunctionSpecifics, }) => {
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 = insideFunctionSpecifics.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;
@@ -1,6 +1,8 @@
1
1
  import type { AudioCodec, ChromiumOptions, ColorSpace, FrameRange, LogLevel, PixelFormat, ProResProfile, StillImageFormat, ToOptions, VideoImageFormat, X264Preset } from '@remotion/renderer';
2
2
  import type { BrowserSafeApis } from '@remotion/renderer/client';
3
- import type { CloudProvider } from './still';
3
+ import type { ExpensiveChunk } from './most-expensive-chunks';
4
+ import type { ChunkRetry, CloudProvider, ReceivedArtifact } from './types';
5
+ import type { EnhancedErrorInfo } from './write-error-to-storage';
4
6
  export declare const expiryDays: {
5
7
  readonly '1-day': 1;
6
8
  readonly '3-days': 3;
@@ -122,7 +124,7 @@ export type ServerlessPayloads<Provider extends CloudProvider> = {
122
124
  type: ServerlessRoutines.launch;
123
125
  serveUrl: string;
124
126
  composition: string;
125
- framesPerLambda: number | null;
127
+ framesPerFunction: number | null;
126
128
  bucketName: string;
127
129
  inputProps: SerializedInputProps;
128
130
  renderId: string;
@@ -145,7 +147,7 @@ export type ServerlessPayloads<Provider extends CloudProvider> = {
145
147
  scale: number;
146
148
  everyNthFrame: number;
147
149
  numberOfGifLoops: number | null;
148
- concurrencyPerLambda: number;
150
+ concurrencyPerFunction: number;
149
151
  downloadBehavior: DownloadBehavior;
150
152
  muted: boolean;
151
153
  overwrite: boolean;
@@ -272,4 +274,38 @@ export declare const outName: (renderId: string, extension: string) => string;
272
274
  export declare const customOutName: <Provider extends CloudProvider>(renderId: string, bucketName: string, name: OutNameInput<Provider>) => OutNameOutput<Provider>;
273
275
  export declare const overallProgressKey: (renderId: string) => string;
274
276
  export declare const artifactName: (renderId: string, name: string) => string;
277
+ export type PostRenderData<Provider extends CloudProvider> = {
278
+ cost: AfterRenderCost;
279
+ outputFile: string;
280
+ outputSize: number;
281
+ renderSize: number;
282
+ timeToFinish: number;
283
+ timeToRenderFrames: number;
284
+ errors: EnhancedErrorInfo[];
285
+ startTime: number;
286
+ endTime: number;
287
+ filesCleanedUp: number;
288
+ timeToEncode: number;
289
+ timeToCleanUp: number;
290
+ timeToRenderChunks: number;
291
+ retriesInfo: ChunkRetry[];
292
+ mostExpensiveFrameRanges: ExpensiveChunk[] | undefined;
293
+ estimatedBillingDurationInMilliseconds: number;
294
+ deleteAfter: DeleteAfter | null;
295
+ timeToCombine: number | null;
296
+ artifactProgress: ReceivedArtifact<Provider>[];
297
+ };
298
+ export type AfterRenderCost = {
299
+ estimatedCost: number;
300
+ estimatedDisplayCost: string;
301
+ currency: string;
302
+ disclaimer: string;
303
+ };
304
+ export declare const CONCAT_FOLDER_TOKEN = "remotion-concat";
305
+ export declare const MAX_FUNCTIONS_PER_RENDER = 200;
306
+ export declare const MINIMUM_FRAMES_PER_LAMBDA = 4;
307
+ export declare const REMOTION_CONCATED_TOKEN = "remotion-concated-token";
308
+ export declare const REMOTION_FILELIST_TOKEN = "remotion-filelist";
309
+ export declare const RENDERER_PATH_TOKEN = "remotion-bucket";
310
+ export declare const COMMAND_NOT_FOUND = "Command not found";
275
311
  export {};
package/dist/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.artifactName = exports.overallProgressKey = exports.customOutName = exports.outName = exports.outStillName = exports.rendersPrefix = exports.REMOTION_BUCKET_PREFIX = exports.serverlessCodecs = exports.ServerlessRoutines = exports.expiryDays = void 0;
3
+ exports.COMMAND_NOT_FOUND = exports.RENDERER_PATH_TOKEN = exports.REMOTION_FILELIST_TOKEN = exports.REMOTION_CONCATED_TOKEN = exports.MINIMUM_FRAMES_PER_LAMBDA = exports.MAX_FUNCTIONS_PER_RENDER = exports.CONCAT_FOLDER_TOKEN = exports.artifactName = exports.overallProgressKey = exports.customOutName = exports.outName = exports.outStillName = exports.rendersPrefix = exports.REMOTION_BUCKET_PREFIX = exports.serverlessCodecs = exports.ServerlessRoutines = exports.expiryDays = void 0;
4
4
  // Needs to be in sync with renderer/src/options/delete-after.ts#L7
5
5
  exports.expiryDays = {
6
6
  '1-day': 1,
@@ -56,3 +56,10 @@ const overallProgressKey = (renderId) => `${(0, exports.rendersPrefix)(renderId)
56
56
  exports.overallProgressKey = overallProgressKey;
57
57
  const artifactName = (renderId, name) => `${(0, exports.rendersPrefix)(renderId)}/artifacts/${name}`;
58
58
  exports.artifactName = artifactName;
59
+ exports.CONCAT_FOLDER_TOKEN = 'remotion-concat';
60
+ exports.MAX_FUNCTIONS_PER_RENDER = 200;
61
+ exports.MINIMUM_FRAMES_PER_LAMBDA = 4;
62
+ exports.REMOTION_CONCATED_TOKEN = 'remotion-concated-token';
63
+ exports.REMOTION_FILELIST_TOKEN = 'remotion-filelist';
64
+ exports.RENDERER_PATH_TOKEN = 'remotion-bucket';
65
+ exports.COMMAND_NOT_FOUND = 'Command not found';
@@ -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-error-to-storage';
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 function invocations only. Does not include cost for 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
+ framesPerFunction: 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 estimatePriceFromMetadata: <Provider extends CloudProvider>({ renderMetadata, memorySizeInMb, diskSizeInMb, functionsInvoked, timings, region, providerSpecifics, }: {
5
+ renderMetadata: RenderMetadata<Provider> | null;
6
+ memorySizeInMb: number;
7
+ diskSizeInMb: number;
8
+ functionsInvoked: number;
9
+ timings: ParsedTiming[];
10
+ region: Provider["region"];
11
+ providerSpecifics: ProviderSpecifics<Provider>;
12
+ }) => {
13
+ accruedSoFar: number;
14
+ estimatedBillingDurationInMilliseconds: number;
15
+ } | null;