@remotion/lambda 4.0.200 → 4.0.202

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 (142) hide show
  1. package/dist/api/bucket-exists.js +6 -2
  2. package/dist/api/clean-items.d.ts +2 -1
  3. package/dist/api/clean-items.js +2 -1
  4. package/dist/api/create-bucket.js +5 -5
  5. package/dist/api/delete-render.d.ts +2 -0
  6. package/dist/api/delete-render.js +6 -0
  7. package/dist/api/delete-site.d.ts +11 -5
  8. package/dist/api/delete-site.js +7 -1
  9. package/dist/api/deploy-site.d.ts +7 -3
  10. package/dist/api/deploy-site.js +17 -4
  11. package/dist/api/download-media.d.ts +2 -0
  12. package/dist/api/download-media.js +4 -1
  13. package/dist/api/get-aws-client.d.ts +2 -1
  14. package/dist/api/get-aws-client.js +2 -1
  15. package/dist/api/get-buckets.js +11 -3
  16. package/dist/api/get-compositions-on-lambda.d.ts +2 -1
  17. package/dist/api/get-compositions-on-lambda.js +3 -1
  18. package/dist/api/get-or-create-bucket.js +1 -0
  19. package/dist/api/get-render-progress.d.ts +1 -0
  20. package/dist/api/get-sites.d.ts +9 -4
  21. package/dist/api/get-sites.js +15 -5
  22. package/dist/api/make-lambda-payload.d.ts +4 -3
  23. package/dist/api/make-lambda-payload.js +9 -4
  24. package/dist/api/presign-url.d.ts +8 -3
  25. package/dist/api/presign-url.js +26 -12
  26. package/dist/api/render-media-on-lambda.d.ts +1 -0
  27. package/dist/api/render-media-on-lambda.js +2 -1
  28. package/dist/api/render-still-on-lambda.d.ts +1 -0
  29. package/dist/api/render-still-on-lambda.js +2 -1
  30. package/dist/api/upload-dir.d.ts +2 -1
  31. package/dist/api/upload-dir.js +2 -2
  32. package/dist/cli/args.d.ts +1 -0
  33. package/dist/cli/commands/render/render.js +3 -1
  34. package/dist/cli/commands/sites/create.js +22 -2
  35. package/dist/cli/commands/sites/rm.js +1 -0
  36. package/dist/cli/commands/sites/rmall.js +1 -0
  37. package/dist/cli/commands/still.d.ts +6 -1
  38. package/dist/cli/commands/still.js +2 -1
  39. package/dist/cli/helpers/progress-bar.d.ts +5 -0
  40. package/dist/cli/helpers/progress-bar.js +19 -1
  41. package/dist/cli/index.js +6 -1
  42. package/dist/functions/chunk-optimization/plan-frame-ranges.d.ts +1 -4
  43. package/dist/functions/helpers/check-if-render-exists.d.ts +3 -0
  44. package/dist/functions/helpers/check-if-render-exists.js +15 -0
  45. package/dist/functions/helpers/cleanup-props.d.ts +6 -2
  46. package/dist/functions/helpers/cleanup-props.js +3 -1
  47. package/dist/functions/helpers/delete-chunks.d.ts +9 -0
  48. package/dist/functions/helpers/delete-chunks.js +25 -0
  49. package/dist/functions/helpers/expected-out-name.d.ts +1 -1
  50. package/dist/functions/helpers/find-output-file-in-bucket.d.ts +2 -1
  51. package/dist/functions/helpers/find-output-file-in-bucket.js +2 -1
  52. package/dist/functions/helpers/get-browser-instance.d.ts +2 -3
  53. package/dist/functions/helpers/get-browser-instance.js +4 -3
  54. package/dist/functions/helpers/get-cleanup-progress.d.ts +10 -0
  55. package/dist/functions/helpers/get-cleanup-progress.js +35 -0
  56. package/dist/functions/helpers/get-current-region.d.ts +1 -1
  57. package/dist/functions/helpers/get-custom-out-name.d.ts +1 -1
  58. package/dist/functions/helpers/get-encoding-metadata.d.ts +7 -0
  59. package/dist/functions/helpers/get-encoding-metadata.js +15 -0
  60. package/dist/functions/helpers/get-encoding-progress-step-size.d.ts +1 -0
  61. package/dist/functions/helpers/get-encoding-progress-step-size.js +7 -0
  62. package/dist/functions/helpers/get-files-to-delete.d.ts +10 -0
  63. package/dist/functions/helpers/get-files-to-delete.js +52 -0
  64. package/dist/functions/helpers/get-final-encoding-status.d.ts +6 -0
  65. package/dist/functions/helpers/get-final-encoding-status.js +18 -0
  66. package/dist/functions/helpers/get-folder-size.d.ts +1 -0
  67. package/dist/functions/helpers/get-folder-size.js +8 -0
  68. package/dist/functions/helpers/get-lambdas-invoked-stats.d.ts +8 -0
  69. package/dist/functions/helpers/get-lambdas-invoked-stats.js +14 -0
  70. package/dist/functions/helpers/get-overall-progress-s3.d.ts +2 -1
  71. package/dist/functions/helpers/get-overall-progress-s3.js +2 -1
  72. package/dist/functions/helpers/get-post-render-data.d.ts +8 -0
  73. package/dist/functions/helpers/get-post-render-data.js +22 -0
  74. package/dist/functions/helpers/get-progress.d.ts +2 -1
  75. package/dist/functions/helpers/get-progress.js +2 -1
  76. package/dist/functions/helpers/get-render-metadata.d.ts +8 -0
  77. package/dist/functions/helpers/get-render-metadata.js +17 -0
  78. package/dist/functions/helpers/get-rendered-frames-progress.d.ts +8 -0
  79. package/dist/functions/helpers/get-rendered-frames-progress.js +37 -0
  80. package/dist/functions/helpers/get-time-to-finish.d.ts +5 -0
  81. package/dist/functions/helpers/get-time-to-finish.js +13 -0
  82. package/dist/functions/helpers/io.d.ts +33 -3
  83. package/dist/functions/helpers/io.js +104 -3
  84. package/dist/functions/helpers/merge-chunks.d.ts +1 -0
  85. package/dist/functions/helpers/merge-chunks.js +2 -0
  86. package/dist/functions/helpers/overall-render-progress.d.ts +2 -1
  87. package/dist/functions/helpers/overall-render-progress.js +2 -1
  88. package/dist/functions/helpers/print-cloudwatch-helper.d.ts +1 -1
  89. package/dist/functions/helpers/print-cloudwatch-helper.js +3 -3
  90. package/dist/functions/helpers/read-with-progress.d.ts +2 -1
  91. package/dist/functions/helpers/read-with-progress.js +2 -2
  92. package/dist/functions/helpers/streaming-payloads.d.ts +19 -0
  93. package/dist/functions/helpers/streaming-payloads.js +25 -0
  94. package/dist/functions/helpers/write-lambda-error.d.ts +3 -2
  95. package/dist/functions/helpers/write-lambda-error.js +2 -3
  96. package/dist/functions/helpers/write-post-render-data.d.ts +9 -0
  97. package/dist/functions/helpers/write-post-render-data.js +18 -0
  98. package/dist/functions/launch.js +8 -0
  99. package/dist/functions/merge.d.ts +9 -0
  100. package/dist/functions/merge.js +61 -0
  101. package/dist/functions/progress.js +1 -0
  102. package/dist/functions/renderer.js +2 -0
  103. package/dist/functions/start.js +3 -0
  104. package/dist/functions/still.js +6 -0
  105. package/dist/index.d.ts +2 -2
  106. package/dist/internals.d.ts +12 -9
  107. package/dist/io/delete-file.js +2 -2
  108. package/dist/io/head-file.js +6 -2
  109. package/dist/io/list-objects.js +12 -3
  110. package/dist/io/read-file.d.ts +2 -1
  111. package/dist/io/read-file.js +6 -2
  112. package/dist/io/write-file.js +6 -2
  113. package/dist/shared/__mocks__/read-dir.js +2 -2
  114. package/dist/shared/aws-clients.js +15 -2
  115. package/dist/shared/chunk-progress.d.ts +9 -0
  116. package/dist/shared/chunk-progress.js +2034 -0
  117. package/dist/shared/cleanup-serialized-input-props.d.ts +4 -2
  118. package/dist/shared/cleanup-serialized-input-props.js +4 -2
  119. package/dist/shared/compress-props.d.ts +6 -8
  120. package/dist/shared/compress-props.js +14 -11
  121. package/dist/shared/get-etag.d.ts +1 -1
  122. package/dist/shared/get-etag.js +33 -12
  123. package/dist/shared/get-s3-client.d.ts +5 -1
  124. package/dist/shared/get-s3-client.js +2 -1
  125. package/dist/shared/get-s3-operations.d.ts +2 -1
  126. package/dist/shared/get-s3-operations.js +38 -20
  127. package/dist/shared/get-service-client.d.ts +2 -1
  128. package/dist/shared/get-service-client.js +4 -2
  129. package/dist/shared/lifecycle-rules.d.ts +2 -1
  130. package/dist/shared/lifecycle-rules.js +17 -7
  131. package/dist/shared/parse-chunk-key.d.ts +5 -0
  132. package/dist/shared/parse-chunk-key.js +15 -0
  133. package/dist/shared/parse-lambda-initialized-key.d.ts +5 -0
  134. package/dist/shared/parse-lambda-initialized-key.js +15 -0
  135. package/dist/shared/read-dir.d.ts +6 -5
  136. package/dist/shared/read-dir.js +9 -6
  137. package/dist/shared/serialize-props.d.ts +14 -0
  138. package/dist/shared/serialize-props.js +36 -0
  139. package/package.json +11 -11
  140. package/remotionlambda-arm64.zip +0 -0
  141. package/dist/functions/provider-implementation.d.ts +0 -0
  142. package/dist/functions/provider-implementation.js +0 -1
@@ -0,0 +1,10 @@
1
+ import type { _Object } from '@aws-sdk/client-s3';
2
+ import type { CleanupInfo } from '../../shared/constants';
3
+ export declare const getCleanupProgress: ({ contents, output, chunkCount, renderId, hasAudio, hasVideo, }: {
4
+ contents: _Object[];
5
+ output: string | null;
6
+ chunkCount: number;
7
+ renderId: string;
8
+ hasAudio: boolean;
9
+ hasVideo: boolean;
10
+ }) => null | CleanupInfo;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCleanupProgress = void 0;
4
+ const get_files_to_delete_1 = require("./get-files-to-delete");
5
+ const getCleanupProgress = ({ contents, output, chunkCount, renderId, hasAudio, hasVideo, }) => {
6
+ if (output === null) {
7
+ return null;
8
+ }
9
+ const filesToDelete = (0, get_files_to_delete_1.getFilesToDelete)({
10
+ chunkCount,
11
+ renderId,
12
+ hasAudio,
13
+ hasVideo,
14
+ });
15
+ const filesStillThere = contents.filter((c) => {
16
+ return filesToDelete.find((f) => {
17
+ var _a;
18
+ if (f.type === 'exact') {
19
+ return f.name === c.Key;
20
+ }
21
+ if (f.type === 'prefix') {
22
+ return (_a = c.Key) === null || _a === void 0 ? void 0 : _a.startsWith(f.name);
23
+ }
24
+ throw new Error('Unexpected in getCleanupProgress');
25
+ });
26
+ });
27
+ const filesDeleted = Math.max(0, filesToDelete.length - filesStillThere.length);
28
+ return {
29
+ minFilesToDelete: filesToDelete.length,
30
+ filesDeleted,
31
+ // We don't know. Only if post render data is saved, we know the timing
32
+ doneIn: null,
33
+ };
34
+ };
35
+ exports.getCleanupProgress = getCleanupProgress;
@@ -1 +1 @@
1
- export declare const getCurrentRegionInFunctionImplementation: () => "eu-central-1" | "eu-west-1" | "eu-west-2" | "eu-west-3" | "eu-south-1" | "eu-north-1" | "us-east-1" | "us-east-2" | "us-west-1" | "us-west-2" | "af-south-1" | "ap-south-1" | "ap-east-1" | "ap-southeast-1" | "ap-southeast-2" | "ap-northeast-1" | "ap-northeast-2" | "ap-northeast-3" | "ca-central-1" | "me-south-1" | "sa-east-1";
1
+ export declare const getCurrentRegionInFunctionImplementation: () => "us-east-1" | "eu-central-1" | "eu-west-1" | "eu-west-2" | "eu-west-3" | "eu-south-1" | "eu-north-1" | "us-east-2" | "us-west-1" | "us-west-2" | "af-south-1" | "ap-south-1" | "ap-east-1" | "ap-southeast-1" | "ap-southeast-2" | "ap-northeast-1" | "ap-northeast-2" | "ap-northeast-3" | "ca-central-1" | "me-south-1" | "sa-east-1";
@@ -1,6 +1,6 @@
1
1
  import type { CustomCredentials, OutNameInput } from '@remotion/serverless/client';
2
2
  import type { RenderMetadata } from '../../defaults';
3
3
  export declare const getCustomOutName: <Region extends string>({ renderMetadata, customCredentials, }: {
4
- renderMetadata: RenderMetadata;
4
+ renderMetadata: RenderMetadata<Region>;
5
5
  customCredentials: CustomCredentials<Region> | null;
6
6
  }) => OutNameInput<Region> | null;
@@ -0,0 +1,7 @@
1
+ import type { _Object } from '@aws-sdk/client-s3';
2
+ import type { EncodingProgress } from '../../defaults';
3
+ export declare const getEncodingMetadata: ({ exists, frameCount, stepSize, }: {
4
+ exists: _Object | undefined;
5
+ frameCount: number;
6
+ stepSize: number;
7
+ }) => EncodingProgress | null;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getEncodingMetadata = void 0;
4
+ const chunk_progress_1 = require("../../shared/chunk-progress");
5
+ const getEncodingMetadata = ({ exists, frameCount, stepSize, }) => {
6
+ if (!exists) {
7
+ return null;
8
+ }
9
+ const framesEncoded = (0, chunk_progress_1.getProgressOfChunk)(exists.ETag);
10
+ // We only report every 100 frames encoded so that we are able to report up to 2000 * 100 ETags => 200000 frames
11
+ return {
12
+ framesEncoded: Math.min(frameCount, framesEncoded * stepSize),
13
+ };
14
+ };
15
+ exports.getEncodingMetadata = getEncodingMetadata;
@@ -0,0 +1 @@
1
+ export declare const getEncodingProgressStepSize: (totalFrames: number) => number;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getEncodingProgressStepSize = void 0;
4
+ const getEncodingProgressStepSize = (totalFrames) => {
5
+ return Math.min(100, Math.max(5, totalFrames / 10));
6
+ };
7
+ exports.getEncodingProgressStepSize = getEncodingProgressStepSize;
@@ -0,0 +1,10 @@
1
+ export type CleanupJob = {
2
+ name: string;
3
+ type: 'exact' | 'prefix';
4
+ };
5
+ export declare const getFilesToDelete: ({ chunkCount, renderId, hasVideo, hasAudio, }: {
6
+ chunkCount: number;
7
+ renderId: string;
8
+ hasVideo: boolean;
9
+ hasAudio: boolean;
10
+ }) => CleanupJob[];
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFilesToDelete = void 0;
4
+ const constants_1 = require("../../shared/constants");
5
+ const getFilesToDelete = ({ chunkCount, renderId, hasVideo, hasAudio, }) => {
6
+ const videoChunks = hasVideo
7
+ ? new Array(chunkCount).fill(true).map((_x, i) => (0, constants_1.chunkKeyForIndex)({
8
+ index: i,
9
+ renderId,
10
+ type: 'video',
11
+ }))
12
+ : [];
13
+ const audioChunks = hasAudio
14
+ ? new Array(chunkCount).fill(true).map((_x, i) => (0, constants_1.chunkKeyForIndex)({
15
+ index: i,
16
+ renderId,
17
+ type: 'audio',
18
+ }))
19
+ : [];
20
+ const lambdaTimings = new Array(chunkCount)
21
+ .fill(true)
22
+ .map((_x, i) => (0, constants_1.lambdaTimingsPrefixForChunk)(renderId, i));
23
+ return [
24
+ {
25
+ name: (0, constants_1.lambdaChunkInitializedPrefix)(renderId),
26
+ type: 'prefix',
27
+ },
28
+ ...videoChunks.map((i) => {
29
+ return {
30
+ name: i,
31
+ type: 'exact',
32
+ };
33
+ }),
34
+ ...audioChunks.map((i) => {
35
+ return {
36
+ name: i,
37
+ type: 'exact',
38
+ };
39
+ }),
40
+ ...lambdaTimings.map((i) => {
41
+ return {
42
+ name: i,
43
+ type: 'prefix',
44
+ };
45
+ }),
46
+ {
47
+ name: (0, constants_1.encodingProgressKey)(renderId),
48
+ type: 'exact',
49
+ },
50
+ ];
51
+ };
52
+ exports.getFilesToDelete = getFilesToDelete;
@@ -0,0 +1,6 @@
1
+ import type { EncodingProgress, RenderMetadata } from '../../shared/constants';
2
+ export declare const getFinalEncodingStatus: ({ encodingProgress, renderMetadata, outputFileExists, }: {
3
+ encodingProgress: EncodingProgress | null;
4
+ renderMetadata: RenderMetadata | null;
5
+ outputFileExists: boolean;
6
+ }) => EncodingProgress | null;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFinalEncodingStatus = void 0;
4
+ const getFinalEncodingStatus = ({ encodingProgress, renderMetadata, outputFileExists, }) => {
5
+ if (!renderMetadata) {
6
+ return null;
7
+ }
8
+ if (encodingProgress) {
9
+ return encodingProgress;
10
+ }
11
+ if (outputFileExists) {
12
+ return {
13
+ framesEncoded: renderMetadata.videoConfig.durationInFrames,
14
+ };
15
+ }
16
+ return null;
17
+ };
18
+ exports.getFinalEncodingStatus = getFinalEncodingStatus;
@@ -0,0 +1 @@
1
+ export declare function getFolderSizeRecursively(folder: string): number;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFolderSizeRecursively = void 0;
4
+ const get_files_in_folder_1 = require("./get-files-in-folder");
5
+ function getFolderSizeRecursively(folder) {
6
+ return (0, get_files_in_folder_1.getFolderFiles)(folder).reduce((a, b) => a + b.size, 0);
7
+ }
8
+ exports.getFolderSizeRecursively = getFolderSizeRecursively;
@@ -0,0 +1,8 @@
1
+ import type { _Object } from '@aws-sdk/client-s3';
2
+ export type LambdaInvokeStats = {
3
+ lambdasInvoked: number;
4
+ };
5
+ export declare const getLambdasInvokedStats: ({ contents, renderId, }: {
6
+ contents: _Object[];
7
+ renderId: string;
8
+ }) => LambdaInvokeStats;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLambdasInvokedStats = void 0;
4
+ const constants_1 = require("../../shared/constants");
5
+ const parse_lambda_initialized_key_1 = require("../../shared/parse-lambda-initialized-key");
6
+ const getLambdasInvokedStats = ({ contents, renderId, }) => {
7
+ const lambdasInvoked = contents
8
+ .filter((c) => { var _a; return (_a = c.Key) === null || _a === void 0 ? void 0 : _a.startsWith((0, constants_1.lambdaChunkInitializedPrefix)(renderId)); })
9
+ .filter((c) => (0, parse_lambda_initialized_key_1.parseLambdaInitializedKey)(c.Key).attempt === 1);
10
+ return {
11
+ lambdasInvoked: lambdasInvoked.length,
12
+ };
13
+ };
14
+ exports.getLambdasInvokedStats = getLambdasInvokedStats;
@@ -1,9 +1,10 @@
1
1
  import type { CloudProvider, ProviderSpecifics } from '@remotion/serverless';
2
2
  import type { OverallRenderProgress } from './overall-render-progress';
3
- export declare const getOverallProgressS3: <Provider extends CloudProvider<string, Record<string, unknown>>>({ renderId, bucketName, expectedBucketOwner, region, providerSpecifics, }: {
3
+ export declare const getOverallProgressS3: <Provider extends CloudProvider<string, Record<string, unknown>>>({ renderId, bucketName, expectedBucketOwner, region, providerSpecifics, forcePathStyle, }: {
4
4
  renderId: string;
5
5
  expectedBucketOwner: string;
6
6
  bucketName: string;
7
7
  region: Provider["region"];
8
8
  providerSpecifics: ProviderSpecifics<Provider>;
9
+ forcePathStyle: boolean;
9
10
  }) => Promise<OverallRenderProgress<Provider>>;
@@ -2,13 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getOverallProgressS3 = void 0;
4
4
  const client_1 = require("@remotion/serverless/client");
5
- const getOverallProgressS3 = async ({ renderId, bucketName, expectedBucketOwner, region, providerSpecifics, }) => {
5
+ const getOverallProgressS3 = async ({ renderId, bucketName, expectedBucketOwner, region, providerSpecifics, forcePathStyle, }) => {
6
6
  try {
7
7
  const Body = await providerSpecifics.readFile({
8
8
  bucketName,
9
9
  key: (0, client_1.overallProgressKey)(renderId),
10
10
  expectedBucketOwner,
11
11
  region,
12
+ forcePathStyle,
12
13
  });
13
14
  const str = await (0, client_1.streamToString)(Body);
14
15
  return JSON.parse(str);
@@ -0,0 +1,8 @@
1
+ import type { AwsRegion } from '../../pricing/aws-regions';
2
+ import type { PostRenderData } from '../../shared/constants';
3
+ export declare const getPostRenderData: ({ bucketName, renderId, region, expectedBucketOwner, }: {
4
+ bucketName: string;
5
+ renderId: string;
6
+ region: AwsRegion;
7
+ expectedBucketOwner: string;
8
+ }) => Promise<PostRenderData | null>;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPostRenderData = void 0;
4
+ const constants_1 = require("../../shared/constants");
5
+ const stream_to_string_1 = require("../../shared/stream-to-string");
6
+ const io_1 = require("./io");
7
+ const getPostRenderData = async ({ bucketName, renderId, region, expectedBucketOwner, }) => {
8
+ try {
9
+ const data = await (0, io_1.lambdaReadFile)({
10
+ bucketName,
11
+ key: (0, constants_1.postRenderDataKey)(renderId),
12
+ region,
13
+ expectedBucketOwner,
14
+ });
15
+ return JSON.parse(await (0, stream_to_string_1.streamToString)(data));
16
+ }
17
+ catch (err) {
18
+ // Does not exist
19
+ return null;
20
+ }
21
+ };
22
+ exports.getPostRenderData = getPostRenderData;
@@ -1,7 +1,7 @@
1
1
  import type { CloudProvider, ProviderSpecifics } from '@remotion/serverless';
2
2
  import { type CustomCredentials } from '@remotion/serverless/client';
3
3
  import type { GenericRenderProgress } from '../../shared/constants';
4
- export declare const getProgress: <Provider extends CloudProvider<string, Record<string, unknown>>>({ bucketName, renderId, expectedBucketOwner, region, memorySizeInMb, timeoutInMilliseconds, customCredentials, providerSpecifics, }: {
4
+ export declare const getProgress: <Provider extends CloudProvider<string, Record<string, unknown>>>({ bucketName, renderId, expectedBucketOwner, region, memorySizeInMb, timeoutInMilliseconds, customCredentials, providerSpecifics, forcePathStyle, }: {
5
5
  bucketName: string;
6
6
  renderId: string;
7
7
  expectedBucketOwner: string;
@@ -10,4 +10,5 @@ export declare const getProgress: <Provider extends CloudProvider<string, Record
10
10
  timeoutInMilliseconds: number;
11
11
  customCredentials: CustomCredentials<Provider> | null;
12
12
  providerSpecifics: ProviderSpecifics<Provider>;
13
+ forcePathStyle: boolean;
13
14
  }) => Promise<GenericRenderProgress<Provider>>;
@@ -13,7 +13,7 @@ const get_overall_progress_s3_1 = require("./get-overall-progress-s3");
13
13
  const inspect_errors_1 = require("./inspect-errors");
14
14
  const make_timeout_error_1 = require("./make-timeout-error");
15
15
  const render_has_audio_video_1 = require("./render-has-audio-video");
16
- const getProgress = async ({ bucketName, renderId, expectedBucketOwner, region, memorySizeInMb, timeoutInMilliseconds, customCredentials, providerSpecifics, }) => {
16
+ const getProgress = async ({ bucketName, renderId, expectedBucketOwner, region, memorySizeInMb, timeoutInMilliseconds, customCredentials, providerSpecifics, forcePathStyle, }) => {
17
17
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
18
18
  const overallProgress = await (0, get_overall_progress_s3_1.getOverallProgressS3)({
19
19
  renderId,
@@ -21,6 +21,7 @@ const getProgress = async ({ bucketName, renderId, expectedBucketOwner, region,
21
21
  expectedBucketOwner,
22
22
  region,
23
23
  providerSpecifics,
24
+ forcePathStyle,
24
25
  });
25
26
  if (overallProgress.postRenderData) {
26
27
  if (!overallProgress.renderMetadata) {
@@ -0,0 +1,8 @@
1
+ import type { AwsRegion } from '../../pricing/aws-regions';
2
+ import type { RenderMetadata } from '../../shared/constants';
3
+ export declare const getRenderMetadata: ({ bucketName, renderId, region, expectedBucketOwner, }: {
4
+ bucketName: string;
5
+ renderId: string;
6
+ region: AwsRegion;
7
+ expectedBucketOwner: string;
8
+ }) => Promise<RenderMetadata>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRenderMetadata = void 0;
4
+ const constants_1 = require("../../shared/constants");
5
+ const stream_to_string_1 = require("../../shared/stream-to-string");
6
+ const io_1 = require("./io");
7
+ const getRenderMetadata = async ({ bucketName, renderId, region, expectedBucketOwner, }) => {
8
+ const Body = await (0, io_1.lambdaReadFile)({
9
+ bucketName,
10
+ key: (0, constants_1.renderMetadataKey)(renderId),
11
+ region,
12
+ expectedBucketOwner,
13
+ });
14
+ const renderMetadataResponse = JSON.parse(await (0, stream_to_string_1.streamToString)(Body));
15
+ return renderMetadataResponse;
16
+ };
17
+ exports.getRenderMetadata = getRenderMetadata;
@@ -0,0 +1,8 @@
1
+ import type { _Object } from '@aws-sdk/client-s3';
2
+ export declare const getRenderedFramesProgress: ({ contents, renderId, framesPerLambda, everyNthFrame, frameRange, }: {
3
+ contents: _Object[];
4
+ renderId: string;
5
+ framesPerLambda: number;
6
+ frameRange: [number, number];
7
+ everyNthFrame: number;
8
+ }) => number;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRenderedFramesProgress = void 0;
4
+ const chunk_progress_1 = require("../../shared/chunk-progress");
5
+ const constants_1 = require("../../shared/constants");
6
+ const parse_chunk_key_1 = require("../../shared/parse-chunk-key");
7
+ const parse_lambda_initialized_key_1 = require("../../shared/parse-lambda-initialized-key");
8
+ const plan_frame_ranges_1 = require("../chunk-optimization/plan-frame-ranges");
9
+ const getRenderedFramesProgress = ({ contents, renderId, framesPerLambda, everyNthFrame, frameRange, }) => {
10
+ const chunkProgress = {};
11
+ const { chunks } = (0, plan_frame_ranges_1.planFrameRanges)({
12
+ everyNthFrame,
13
+ frameRange,
14
+ framesPerLambda,
15
+ });
16
+ // Sort, so only the latest attempt is used
17
+ const sortedChunks = contents
18
+ .filter((c) => {
19
+ return c.Key.startsWith((0, constants_1.lambdaChunkInitializedPrefix)(renderId));
20
+ })
21
+ .sort((a, b) => {
22
+ return a.Key.localeCompare(b.Key);
23
+ });
24
+ for (const chunk of sortedChunks) {
25
+ const key = (0, parse_lambda_initialized_key_1.parseLambdaInitializedKey)(chunk.Key);
26
+ chunkProgress[key.chunk] = (0, chunk_progress_1.getProgressOfChunk)(chunk.ETag);
27
+ }
28
+ for (const chunk of contents.filter((c) => { var _a; return (_a = c.Key) === null || _a === void 0 ? void 0 : _a.startsWith((0, constants_1.chunkKey)(renderId)); })) {
29
+ const parsed = (0, parse_chunk_key_1.parseLambdaChunkKey)(chunk.Key);
30
+ const frameRangeInChunk = chunks[parsed.chunk];
31
+ chunkProgress[parsed.chunk] =
32
+ frameRangeInChunk[1] - frameRangeInChunk[0] + 1;
33
+ }
34
+ const framesRendered = Object.values(chunkProgress).reduce((a, b) => a + b, 0);
35
+ return framesRendered;
36
+ };
37
+ exports.getRenderedFramesProgress = getRenderedFramesProgress;
@@ -0,0 +1,5 @@
1
+ import type { RenderMetadata } from '../../defaults';
2
+ export declare const getTimeToFinish: ({ renderMetadata, lastModified, }: {
3
+ renderMetadata: RenderMetadata | null;
4
+ lastModified: number | null;
5
+ }) => number | null;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTimeToFinish = void 0;
4
+ const getTimeToFinish = ({ renderMetadata, lastModified, }) => {
5
+ if (!lastModified) {
6
+ return null;
7
+ }
8
+ if (!renderMetadata) {
9
+ return null;
10
+ }
11
+ return Math.max(0, lastModified - renderMetadata.startedDate);
12
+ };
13
+ exports.getTimeToFinish = getTimeToFinish;
@@ -1,6 +1,9 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
1
3
  import type { _Object } from '@aws-sdk/client-s3';
2
- import type { CustomCredentials } from '@remotion/serverless/client';
3
- import type { AwsRegion } from '../../regions';
4
+ import type { AwsRegion, CustomCredentials, DownloadBehavior, Privacy } from '@remotion/serverless/client';
5
+ import type { ReadStream } from 'node:fs';
6
+ import type { Readable } from 'stream';
4
7
  export type LambdaLSInput = {
5
8
  bucketName: string;
6
9
  prefix: string;
@@ -9,12 +12,39 @@ export type LambdaLSInput = {
9
12
  continuationToken?: string;
10
13
  };
11
14
  export type LambdaLsReturnType = Promise<_Object[]>;
15
+ export declare const lambdaLs: ({ bucketName, prefix, region, expectedBucketOwner, continuationToken, }: LambdaLSInput) => LambdaLsReturnType;
16
+ export declare const lambdaDeleteFile: ({ bucketName, key, region, customCredentials, }: {
17
+ region: AwsRegion;
18
+ bucketName: string;
19
+ key: string;
20
+ customCredentials: CustomCredentials | null;
21
+ }) => Promise<void>;
22
+ type LambdaWriteFileInput = {
23
+ bucketName: string;
24
+ key: string;
25
+ body: ReadStream | string | Uint8Array;
26
+ region: AwsRegion;
27
+ privacy: Privacy;
28
+ expectedBucketOwner: string | null;
29
+ downloadBehavior: DownloadBehavior | null;
30
+ customCredentials: CustomCredentials | null;
31
+ };
32
+ export declare const lambdaWriteFile: (params: LambdaWriteFileInput & {
33
+ retries?: number;
34
+ }) => Promise<void>;
35
+ export declare const lambdaReadFile: ({ bucketName, key, region, expectedBucketOwner, }: {
36
+ bucketName: string;
37
+ key: string;
38
+ region: AwsRegion;
39
+ expectedBucketOwner: string;
40
+ }) => Promise<Readable>;
12
41
  export declare const lambdaHeadCommand: ({ bucketName, key, region, customCredentials, }: {
13
42
  bucketName: string;
14
43
  key: string;
15
44
  region: AwsRegion;
16
- customCredentials: CustomCredentials<AwsRegion> | null;
45
+ customCredentials: CustomCredentials | null;
17
46
  }) => Promise<{
18
47
  LastModified?: Date | undefined;
19
48
  ContentLength?: number | undefined;
20
49
  }>;
50
+ export {};
@@ -1,10 +1,111 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.lambdaHeadCommand = void 0;
6
+ exports.lambdaHeadCommand = exports.lambdaReadFile = exports.lambdaWriteFile = exports.lambdaDeleteFile = exports.lambdaLs = void 0;
4
7
  const client_s3_1 = require("@aws-sdk/client-s3");
5
- const get_s3_client_1 = require("../../shared/get-s3-client");
8
+ const mime_types_1 = __importDefault(require("mime-types"));
9
+ const aws_clients_1 = require("../../shared/aws-clients");
10
+ const content_disposition_header_1 = require("../../shared/content-disposition-header");
11
+ const lambdaLs = async ({ bucketName, prefix, region, expectedBucketOwner, continuationToken, }) => {
12
+ var _a, _b, _c;
13
+ try {
14
+ const list = await (0, aws_clients_1.getS3Client)(region, null).send(new client_s3_1.ListObjectsV2Command({
15
+ Bucket: bucketName,
16
+ Prefix: prefix,
17
+ ExpectedBucketOwner: expectedBucketOwner !== null && expectedBucketOwner !== void 0 ? expectedBucketOwner : undefined,
18
+ ContinuationToken: continuationToken,
19
+ }));
20
+ if (list.NextContinuationToken) {
21
+ return [
22
+ ...((_a = list.Contents) !== null && _a !== void 0 ? _a : []),
23
+ ...(await (0, exports.lambdaLs)({
24
+ bucketName,
25
+ prefix,
26
+ expectedBucketOwner,
27
+ region,
28
+ continuationToken: list.NextContinuationToken,
29
+ })),
30
+ ];
31
+ }
32
+ return (_b = list.Contents) !== null && _b !== void 0 ? _b : [];
33
+ }
34
+ catch (err) {
35
+ if (!expectedBucketOwner) {
36
+ throw err;
37
+ }
38
+ // Prevent from accessing a foreign bucket, retry without ExpectedBucketOwner and see if it works. If it works then it's an owner mismatch.
39
+ if ((_c = err.stack) === null || _c === void 0 ? void 0 : _c.includes('AccessDenied')) {
40
+ await (0, aws_clients_1.getS3Client)(region, null).send(new client_s3_1.ListObjectsV2Command({
41
+ Bucket: bucketName,
42
+ Prefix: prefix,
43
+ }));
44
+ throw new Error(`Bucket owner mismatch: Expected the bucket ${bucketName} to be owned by you (AWS Account ID: ${expectedBucketOwner}) but it's not the case. Did you accidentially specify the wrong bucket?`);
45
+ }
46
+ throw err;
47
+ }
48
+ };
49
+ exports.lambdaLs = lambdaLs;
50
+ const lambdaDeleteFile = async ({ bucketName, key, region, customCredentials, }) => {
51
+ await (0, aws_clients_1.getS3Client)(region, customCredentials).send(new client_s3_1.DeleteObjectCommand({
52
+ Bucket: bucketName,
53
+ Key: key,
54
+ }));
55
+ };
56
+ exports.lambdaDeleteFile = lambdaDeleteFile;
57
+ const tryLambdaWriteFile = async ({ bucketName, key, body, region, privacy, expectedBucketOwner, downloadBehavior, customCredentials, }) => {
58
+ await (0, aws_clients_1.getS3Client)(region, customCredentials).send(new client_s3_1.PutObjectCommand({
59
+ Bucket: bucketName,
60
+ Key: key,
61
+ Body: body,
62
+ ACL: privacy === 'no-acl'
63
+ ? undefined
64
+ : privacy === 'private'
65
+ ? 'private'
66
+ : 'public-read',
67
+ ExpectedBucketOwner: customCredentials
68
+ ? undefined
69
+ : expectedBucketOwner !== null && expectedBucketOwner !== void 0 ? expectedBucketOwner : undefined,
70
+ ContentType: mime_types_1.default.lookup(key) || 'application/octet-stream',
71
+ ContentDisposition: (0, content_disposition_header_1.getContentDispositionHeader)(downloadBehavior),
72
+ }));
73
+ };
74
+ const lambdaWriteFile = async (params) => {
75
+ var _a;
76
+ const remainingRetries = (_a = params.retries) !== null && _a !== void 0 ? _a : 2;
77
+ try {
78
+ await tryLambdaWriteFile(params);
79
+ }
80
+ catch (err) {
81
+ if (remainingRetries === 0) {
82
+ throw err;
83
+ }
84
+ const backoff = 2 ** (2 - remainingRetries) * 2000;
85
+ await new Promise((resolve) => {
86
+ setTimeout(resolve, backoff);
87
+ });
88
+ console.warn('Failed to write file to Lambda:');
89
+ console.warn(err);
90
+ console.warn(`Retrying (${remainingRetries} retries remaining)...`);
91
+ return (0, exports.lambdaWriteFile)({
92
+ ...params,
93
+ retries: remainingRetries - 1,
94
+ });
95
+ }
96
+ };
97
+ exports.lambdaWriteFile = lambdaWriteFile;
98
+ const lambdaReadFile = async ({ bucketName, key, region, expectedBucketOwner, }) => {
99
+ const { Body } = await (0, aws_clients_1.getS3Client)(region, null).send(new client_s3_1.GetObjectCommand({
100
+ Bucket: bucketName,
101
+ Key: key,
102
+ ExpectedBucketOwner: expectedBucketOwner,
103
+ }));
104
+ return Body;
105
+ };
106
+ exports.lambdaReadFile = lambdaReadFile;
6
107
  const lambdaHeadCommand = async ({ bucketName, key, region, customCredentials, }) => {
7
- const head = await (0, get_s3_client_1.getS3Client)(region, customCredentials).send(new client_s3_1.HeadObjectCommand({
108
+ const head = await (0, aws_clients_1.getS3Client)(region, customCredentials).send(new client_s3_1.HeadObjectCommand({
8
109
  Bucket: bucketName,
9
110
  Key: key,
10
111
  }));
@@ -32,4 +32,5 @@ export declare const mergeChunksAndFinishRender: <Provider extends CloudProvider
32
32
  overallProgress: OverallProgressHelper<Provider>;
33
33
  startTime: number;
34
34
  providerSpecifics: ProviderSpecifics<Provider>;
35
+ forcePathStyle: boolean;
35
36
  }) => Promise<PostRenderData<Provider>>;
@@ -49,6 +49,7 @@ const mergeChunksAndFinishRender = async (options) => {
49
49
  expectedBucketOwner: options.expectedBucketOwner,
50
50
  downloadBehavior: options.downloadBehavior,
51
51
  customCredentials: options.customCredentials,
52
+ forcePathStyle: options.forcePathStyle,
52
53
  });
53
54
  writeToBucket.end();
54
55
  const errorExplanations = (0, inspect_errors_1.inspectErrors)({
@@ -58,6 +59,7 @@ const mergeChunksAndFinishRender = async (options) => {
58
59
  inputProps: options.inputProps,
59
60
  serializedResolvedProps: options.serializedResolvedProps,
60
61
  providerSpecifics: options.providerSpecifics,
62
+ forcePathStyle: options.forcePathStyle,
61
63
  });
62
64
  const { url: outputUrl } = (0, get_output_url_from_metadata_1.getOutputUrlFromMetadata)(options.renderMetadata, options.bucketName, options.customCredentials, options.providerSpecifics.getCurrentRegionInFunction());
63
65
  const postRenderData = (0, create_post_render_data_1.createPostRenderData)({
@@ -47,7 +47,7 @@ export type OverallProgressHelper<Provider extends CloudProvider> = {
47
47
  getReceivedArtifacts: () => ReceivedArtifact<Provider>[];
48
48
  };
49
49
  export declare const makeInitialOverallRenderProgress: <Provider extends CloudProvider<string, Record<string, unknown>>>(timeoutTimestamp: number) => OverallRenderProgress<Provider>;
50
- export declare const makeOverallRenderProgress: <Provider extends CloudProvider<string, Record<string, unknown>>>({ renderId, bucketName, expectedBucketOwner, region, timeoutTimestamp, logLevel, providerSpecifics, }: {
50
+ export declare const makeOverallRenderProgress: <Provider extends CloudProvider<string, Record<string, unknown>>>({ renderId, bucketName, expectedBucketOwner, region, timeoutTimestamp, logLevel, providerSpecifics, forcePathStyle, }: {
51
51
  renderId: string;
52
52
  bucketName: string;
53
53
  expectedBucketOwner: string;
@@ -55,4 +55,5 @@ export declare const makeOverallRenderProgress: <Provider extends CloudProvider<
55
55
  timeoutTimestamp: number;
56
56
  logLevel: LogLevel;
57
57
  providerSpecifics: ProviderSpecifics<Provider>;
58
+ forcePathStyle: boolean;
58
59
  }) => OverallProgressHelper<Provider>;