@remotion/serverless 4.0.471 → 4.0.473

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.
@@ -1,7 +1,5 @@
1
- import type { CloudProvider, CustomCredentials, ProviderSpecifics, RenderMetadata } from '@remotion/serverless-client';
2
- export type OutputFileMetadata = {
3
- url: string;
4
- };
1
+ import type { CloudProvider, CustomCredentials, OutputFileMetadata, ProviderSpecifics, RenderMetadata } from '@remotion/serverless-client';
2
+ export type { OutputFileMetadata } from '@remotion/serverless-client';
5
3
  export declare const findOutputFileInBucket: <Provider extends CloudProvider<string, Record<string, unknown>, Record<string, unknown>, string, object>>({ region, renderMetadata, bucketName, customCredentials, currentRegion, providerSpecifics, forcePathStyle, requestHandler, }: {
6
4
  region: Provider["region"];
7
5
  renderMetadata: RenderMetadata<Provider>;
@@ -2,46 +2,19 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findOutputFileInBucket = void 0;
4
4
  const serverless_client_1 = require("@remotion/serverless-client");
5
- const findOutputFileInBucket = async ({ region, renderMetadata, bucketName, customCredentials, currentRegion, providerSpecifics, forcePathStyle, requestHandler, }) => {
5
+ const findOutputFileInBucket = ({ region, renderMetadata, bucketName, customCredentials, currentRegion, providerSpecifics, forcePathStyle, requestHandler, }) => {
6
6
  if (!renderMetadata) {
7
7
  throw new Error('unexpectedly did not get renderMetadata');
8
8
  }
9
- const { renderBucketName, key } = (0, serverless_client_1.getExpectedOutName)({
9
+ return (0, serverless_client_1.findOutputFileInBucket)({
10
+ region,
10
11
  renderMetadata,
11
12
  bucketName,
12
13
  customCredentials,
13
- bucketNamePrefix: providerSpecifics.getBucketPrefix(),
14
+ currentRegion,
15
+ providerSpecifics,
16
+ forcePathStyle,
17
+ requestHandler,
14
18
  });
15
- try {
16
- await providerSpecifics.headFile({
17
- bucketName,
18
- key,
19
- region,
20
- customCredentials,
21
- forcePathStyle,
22
- requestHandler,
23
- });
24
- return {
25
- url: providerSpecifics.getOutputUrl({
26
- renderMetadata,
27
- bucketName,
28
- customCredentials,
29
- currentRegion,
30
- }).url,
31
- };
32
- }
33
- catch (err) {
34
- if (err.name === 'NotFound') {
35
- return null;
36
- }
37
- if (err.message === 'UnknownError' ||
38
- err.$metadata
39
- .httpStatusCode === 403) {
40
- throw new Error(`Unable to access item "${key}" from bucket "${renderBucketName}" ${(customCredentials === null || customCredentials === void 0 ? void 0 : customCredentials.endpoint)
41
- ? `(S3 Endpoint = ${customCredentials === null || customCredentials === void 0 ? void 0 : customCredentials.endpoint})`
42
- : ''} - got a 403 error when heading the file. Check your credentials and permissions. The Lambda role must have permission for both "s3:GetObject" and "s3:ListBucket" actions.`, { cause: err });
43
- }
44
- throw err;
45
- }
46
19
  };
47
20
  exports.findOutputFileInBucket = findOutputFileInBucket;
@@ -82,6 +82,7 @@ const mergeChunksAndFinishRender = async (options) => {
82
82
  errorExplanations,
83
83
  timeToDelete: (await cleanupProm).reduce((a, b) => Math.max(a, b), 0),
84
84
  outputFile: {
85
+ sizeInBytes: outputSize,
85
86
  url: outputUrl,
86
87
  },
87
88
  outputSize,
@@ -3,6 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeOverallRenderProgress = exports.makeInitialOverallRenderProgress = void 0;
4
4
  const renderer_1 = require("@remotion/renderer");
5
5
  const serverless_client_1 = require("@remotion/serverless-client");
6
+ const progressUploadAttempts = 3;
7
+ const wait = (duration) => {
8
+ return new Promise((resolve) => {
9
+ setTimeout(resolve, duration);
10
+ });
11
+ };
6
12
  const makeInitialOverallRenderProgress = (timeoutTimestamp) => {
7
13
  return {
8
14
  chunks: [],
@@ -41,17 +47,12 @@ const makeOverallRenderProgress = ({ renderId, bucketName, expectedBucketOwner,
41
47
  dirty = true;
42
48
  dirtyReasons.push(reason);
43
49
  };
44
- const runUploadLoop = async () => {
45
- while (dirty) {
46
- dirty = false;
47
- const reasons = dirtyReasons.join(', ');
48
- dirtyReasons = [];
49
- const toWrite = JSON.stringify(renderProgress);
50
- renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel }, `Uploading progress - ${reasons} (${toWrite.length} bytes)`);
50
+ const uploadWithRetries = async (body, reasons) => {
51
+ for (let attempt = 1; attempt <= progressUploadAttempts; attempt++) {
51
52
  const start = Date.now();
52
53
  try {
53
54
  await providerSpecifics.writeFile({
54
- body: toWrite,
55
+ body,
55
56
  bucketName,
56
57
  customCredentials: null,
57
58
  downloadBehavior: null,
@@ -64,17 +65,31 @@ const makeOverallRenderProgress = ({ renderId, bucketName, expectedBucketOwner,
64
65
  requestHandler: null,
65
66
  });
66
67
  renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel }, `Uploaded progress in ${Date.now() - start}ms`);
67
- // Space out the requests a bit
68
- await new Promise((resolve) => {
69
- setTimeout(resolve, Math.max(0, 250 - (Date.now() - start)));
70
- });
68
+ return;
71
69
  }
72
70
  catch (err) {
73
- // If an error occurs in uploading the state that contains the errors,
74
- // that is unfortunate. We just log it.
75
- renderer_1.RenderInternals.Log.error({ indent: false, logLevel }, 'Error uploading progress', err);
71
+ const willRetry = attempt < progressUploadAttempts;
72
+ renderer_1.RenderInternals.Log.error({ indent: false, logLevel }, willRetry
73
+ ? `Error uploading progress (${reasons}), retrying (${attempt}/${progressUploadAttempts})`
74
+ : `Error uploading progress (${reasons})`, err);
75
+ if (willRetry) {
76
+ await wait(100 * 2 ** (attempt - 1));
77
+ }
76
78
  }
77
79
  }
80
+ };
81
+ const runUploadLoop = async () => {
82
+ while (dirty) {
83
+ dirty = false;
84
+ const reasons = dirtyReasons.join(', ');
85
+ dirtyReasons = [];
86
+ const toWrite = JSON.stringify(renderProgress);
87
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel }, `Uploading progress - ${reasons} (${toWrite.length} bytes)`);
88
+ const start = Date.now();
89
+ await uploadWithRetries(toWrite, reasons);
90
+ // Space out the requests a bit
91
+ await wait(Math.max(0, 250 - (Date.now() - start)));
92
+ }
78
93
  uploadLoopPromise = null;
79
94
  };
80
95
  const upload = async (reason) => {
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/serverless"
4
4
  },
5
5
  "name": "@remotion/serverless",
6
- "version": "4.0.471",
6
+ "version": "4.0.473",
7
7
  "description": "A runtime for distributed rendering",
8
8
  "main": "dist",
9
9
  "scripts": {
@@ -23,13 +23,13 @@
23
23
  "access": "public"
24
24
  },
25
25
  "dependencies": {
26
- "@remotion/renderer": "4.0.471",
27
- "@remotion/bundler": "4.0.471",
28
- "@remotion/licensing": "4.0.471",
29
- "@remotion/serverless-client": "4.0.471"
26
+ "@remotion/renderer": "4.0.473",
27
+ "@remotion/bundler": "4.0.473",
28
+ "@remotion/licensing": "4.0.473",
29
+ "@remotion/serverless-client": "4.0.473"
30
30
  },
31
31
  "devDependencies": {
32
- "@remotion/eslint-config-internal": "4.0.471",
32
+ "@remotion/eslint-config-internal": "4.0.473",
33
33
  "eslint": "9.19.0",
34
34
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
35
35
  },