@remotion/lambda 4.0.164 → 4.0.165

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 (80) hide show
  1. package/dist/api/delete-render.js +7 -3
  2. package/dist/api/deploy-function.d.ts +0 -1
  3. package/dist/api/deploy-function.js +3 -3
  4. package/dist/api/download-media.js +6 -3
  5. package/dist/api/get-compositions-on-lambda.js +0 -2
  6. package/dist/api/get-render-progress.js +0 -2
  7. package/dist/api/make-lambda-payload.js +2 -1
  8. package/dist/api/render-media-on-lambda.js +0 -2
  9. package/dist/api/render-still-on-lambda.js +37 -25
  10. package/dist/cli/commands/render/progress.d.ts +3 -28
  11. package/dist/cli/commands/render/progress.js +89 -90
  12. package/dist/cli/commands/render/render.js +7 -40
  13. package/dist/cli/commands/sites/create.js +2 -2
  14. package/dist/functions/chunk-optimization/types.d.ts +0 -3
  15. package/dist/functions/helpers/calculate-chunk-times.d.ts +3 -4
  16. package/dist/functions/helpers/calculate-chunk-times.js +4 -8
  17. package/dist/functions/helpers/calculate-price-from-bucket.d.ts +3 -5
  18. package/dist/functions/helpers/calculate-price-from-bucket.js +5 -18
  19. package/dist/functions/helpers/clean-tmpdir.d.ts +0 -2
  20. package/dist/functions/helpers/clean-tmpdir.js +1 -7
  21. package/dist/functions/helpers/concat-videos.d.ts +1 -13
  22. package/dist/functions/helpers/concat-videos.js +7 -131
  23. package/dist/functions/helpers/create-post-render-data.d.ts +6 -6
  24. package/dist/functions/helpers/create-post-render-data.js +17 -37
  25. package/dist/functions/helpers/find-output-file-in-bucket.d.ts +1 -3
  26. package/dist/functions/helpers/find-output-file-in-bucket.js +1 -4
  27. package/dist/functions/helpers/get-encoding-progress-step-size.d.ts +1 -1
  28. package/dist/functions/helpers/get-encoding-progress-step-size.js +0 -3
  29. package/dist/functions/helpers/get-lambdas-invoked-stats.d.ts +1 -6
  30. package/dist/functions/helpers/get-lambdas-invoked-stats.js +0 -13
  31. package/dist/functions/helpers/get-overall-progress-s3.d.ts +4 -2
  32. package/dist/functions/helpers/get-overall-progress-s3.js +8 -6
  33. package/dist/functions/helpers/get-overall-progress.d.ts +1 -2
  34. package/dist/functions/helpers/get-overall-progress.js +2 -4
  35. package/dist/functions/helpers/get-progress.js +78 -154
  36. package/dist/functions/helpers/get-retry-stats.d.ts +0 -5
  37. package/dist/functions/helpers/get-retry-stats.js +0 -18
  38. package/dist/functions/helpers/inspect-errors.d.ts +4 -10
  39. package/dist/functions/helpers/inspect-errors.js +5 -27
  40. package/dist/functions/helpers/io.d.ts +0 -1
  41. package/dist/functions/helpers/io.js +2 -3
  42. package/dist/functions/helpers/lifecycle.d.ts +0 -4
  43. package/dist/functions/helpers/lifecycle.js +2 -3
  44. package/dist/functions/helpers/make-timeout-error.d.ts +0 -2
  45. package/dist/functions/helpers/merge-chunks.d.ts +5 -0
  46. package/dist/functions/helpers/merge-chunks.js +16 -143
  47. package/dist/functions/helpers/min-max.d.ts +1 -1
  48. package/dist/functions/helpers/min-max.js +1 -1
  49. package/dist/functions/helpers/overall-render-progress.d.ts +26 -4
  50. package/dist/functions/helpers/overall-render-progress.js +116 -27
  51. package/dist/functions/helpers/stream-renderer.js +15 -9
  52. package/dist/functions/helpers/streamify-response.d.ts +0 -3
  53. package/dist/functions/helpers/streamify-response.js +2 -14
  54. package/dist/functions/helpers/write-lambda-error.d.ts +3 -6
  55. package/dist/functions/helpers/write-lambda-error.js +1 -21
  56. package/dist/functions/index.d.ts +5 -0
  57. package/dist/functions/index.js +70 -38
  58. package/dist/functions/launch.js +103 -133
  59. package/dist/functions/renderer.d.ts +2 -2
  60. package/dist/functions/renderer.js +70 -123
  61. package/dist/functions/start.d.ts +1 -0
  62. package/dist/functions/start.js +3 -2
  63. package/dist/functions/still.d.ts +7 -2
  64. package/dist/functions/still.js +17 -34
  65. package/dist/functions/streaming/streaming.d.ts +15 -2
  66. package/dist/functions/streaming/streaming.js +8 -6
  67. package/dist/internals.d.ts +2 -1
  68. package/dist/shared/aws-clients.js +8 -0
  69. package/dist/shared/call-lambda.d.ts +5 -4
  70. package/dist/shared/call-lambda.js +53 -44
  71. package/dist/shared/constants.d.ts +14 -35
  72. package/dist/shared/constants.js +3 -31
  73. package/dist/shared/content-disposition-header.d.ts +0 -3
  74. package/dist/shared/get-function-version.js +0 -2
  75. package/dist/shared/is-flaky-error.js +4 -0
  76. package/dist/shared/parse-lambda-timings-key.d.ts +0 -2
  77. package/dist/shared/parse-lambda-timings-key.js +0 -14
  78. package/dist/shared/return-values.d.ts +0 -5
  79. package/package.json +18 -18
  80. package/remotionlambda-arm64.zip +0 -0
@@ -3,13 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.rendererHandler = exports.ENABLE_SLOW_LEAK_DETECTION = void 0;
6
+ exports.rendererHandler = void 0;
7
7
  const renderer_1 = require("@remotion/renderer");
8
8
  const node_fs_1 = __importDefault(require("node:fs"));
9
9
  const node_path_1 = __importDefault(require("node:path"));
10
10
  const version_1 = require("remotion/version");
11
- const call_lambda_1 = require("../shared/call-lambda");
12
- const chunk_progress_1 = require("../shared/chunk-progress");
13
11
  const compress_props_1 = require("../shared/compress-props");
14
12
  const constants_1 = require("../shared/constants");
15
13
  const is_flaky_error_1 = require("../shared/is-flaky-error");
@@ -19,11 +17,10 @@ const can_concat_seamlessly_1 = require("./helpers/can-concat-seamlessly");
19
17
  const get_browser_instance_1 = require("./helpers/get-browser-instance");
20
18
  const get_chromium_executable_path_1 = require("./helpers/get-chromium-executable-path");
21
19
  const get_current_region_1 = require("./helpers/get-current-region");
22
- const io_1 = require("./helpers/io");
23
20
  const leak_detection_1 = require("./helpers/leak-detection");
24
21
  const on_downloads_logger_1 = require("./helpers/on-downloads-logger");
25
22
  const write_lambda_error_1 = require("./helpers/write-lambda-error");
26
- const renderHandler = async (params, options, logs) => {
23
+ const renderHandler = async ({ params, options, logs, onStream, }) => {
27
24
  if (params.type !== constants_1.LambdaRoutines.renderer) {
28
25
  throw new Error('Params must be renderer');
29
26
  }
@@ -98,6 +95,7 @@ const renderHandler = async (params, options, logs) => {
98
95
  : null;
99
96
  const resolvedProps = await resolvedPropsPromise;
100
97
  const serializedInputPropsWithCustomSchema = await inputPropsPromise;
98
+ const allFrames = renderer_1.RenderInternals.getFramesToRender(params.frameRange, params.everyNthFrame);
101
99
  await new Promise((resolve, reject) => {
102
100
  var _a, _b, _c, _d;
103
101
  renderer_1.RenderInternals.internalRenderMedia({
@@ -114,24 +112,21 @@ const renderHandler = async (params, options, logs) => {
114
112
  serializedInputPropsWithCustomSchema,
115
113
  frameRange: params.frameRange,
116
114
  onProgress: ({ renderedFrames, encodedFrames, stitchStage }) => {
117
- if (renderedFrames % 5 === 0) {
118
- renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, `Rendered ${renderedFrames} frames, encoded ${encodedFrames} frames, stage = ${stitchStage}`);
119
- (0, chunk_progress_1.writeLambdaInitializedFile)({
120
- attempt: params.attempt,
121
- bucketName: params.bucketName,
122
- chunk: params.chunk,
123
- expectedBucketOwner: options.expectedBucketOwner,
124
- framesRendered: renderedFrames,
125
- renderId: params.renderId,
126
- }).catch((err) => {
127
- console.log('Could not write progress', err);
128
- return reject(err);
115
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Rendered ${renderedFrames} frames, encoded ${encodedFrames} frames, stage = ${stitchStage}`);
116
+ const allFramesRendered = allFrames.length === renderedFrames;
117
+ const allFramesEncoded = allFrames.length === encodedFrames;
118
+ const frameReportPoint = (renderedFrames % params.progressEveryNthFrame === 0 ||
119
+ allFramesRendered) &&
120
+ !allFramesEncoded;
121
+ const encodedFramesReportPoint = (encodedFrames % params.progressEveryNthFrame === 0 ||
122
+ allFramesEncoded) &&
123
+ allFramesRendered;
124
+ if (frameReportPoint || encodedFramesReportPoint) {
125
+ onStream({
126
+ type: 'frames-rendered',
127
+ payload: { rendered: renderedFrames, encoded: encodedFrames },
129
128
  });
130
129
  }
131
- else {
132
- renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Rendered ${renderedFrames} frames, encoded ${encodedFrames} frames, stage = ${stitchStage}`);
133
- }
134
- const allFrames = renderer_1.RenderInternals.getFramesToRender(params.frameRange, params.everyNthFrame);
135
130
  if (renderedFrames === allFrames.length) {
136
131
  renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Rendered all frames!');
137
132
  }
@@ -139,14 +134,12 @@ const renderHandler = async (params, options, logs) => {
139
134
  },
140
135
  concurrency: params.concurrencyPerLambda,
141
136
  onStart: () => {
142
- (0, chunk_progress_1.writeLambdaInitializedFile)({
143
- attempt: params.attempt,
144
- bucketName: params.bucketName,
145
- chunk: params.chunk,
146
- expectedBucketOwner: options.expectedBucketOwner,
147
- framesRendered: 0,
148
- renderId: params.renderId,
149
- }).catch((err) => reject(err));
137
+ onStream({
138
+ type: 'lambda-invoked',
139
+ payload: {
140
+ attempt: params.attempt,
141
+ },
142
+ });
150
143
  },
151
144
  puppeteerInstance: browserInstance.instance,
152
145
  serveUrl: params.serveUrl,
@@ -205,46 +198,31 @@ const renderHandler = async (params, options, logs) => {
205
198
  })
206
199
  .catch((err) => reject(err));
207
200
  });
201
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Streaming chunks to main function');
202
+ if (audioOutputLocation) {
203
+ onStream({
204
+ type: 'audio-chunk-rendered',
205
+ payload: node_fs_1.default.readFileSync(audioOutputLocation),
206
+ });
207
+ }
208
+ if (videoOutputLocation) {
209
+ onStream({
210
+ type: renderer_1.RenderInternals.isAudioCodec(params.codec)
211
+ ? 'audio-chunk-rendered'
212
+ : 'video-chunk-rendered',
213
+ payload: node_fs_1.default.readFileSync(videoOutputLocation),
214
+ });
215
+ }
208
216
  const endRendered = Date.now();
209
- const condensedTimingData = {
210
- ...chunkTimingData,
211
- timings: Object.values(chunkTimingData.timings),
212
- };
213
- renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Writing chunk to S3');
217
+ onStream({
218
+ type: 'chunk-complete',
219
+ payload: {
220
+ rendered: endRendered,
221
+ start,
222
+ },
223
+ });
214
224
  const writeStart = Date.now();
215
- await Promise.all([
216
- (0, io_1.lambdaWriteFile)({
217
- bucketName: params.bucketName,
218
- key: (0, constants_1.chunkKeyForIndex)({
219
- renderId: params.renderId,
220
- index: params.chunk,
221
- type: renderer_1.RenderInternals.isAudioCodec(params.codec) ? 'audio' : 'video',
222
- }),
223
- body: node_fs_1.default.createReadStream(videoOutputLocation),
224
- region: (0, get_current_region_1.getCurrentRegionInFunction)(),
225
- privacy: params.privacy,
226
- expectedBucketOwner: options.expectedBucketOwner,
227
- downloadBehavior: null,
228
- customCredentials: null,
229
- }),
230
- audioOutputLocation
231
- ? (0, io_1.lambdaWriteFile)({
232
- bucketName: params.bucketName,
233
- key: (0, constants_1.chunkKeyForIndex)({
234
- renderId: params.renderId,
235
- index: params.chunk,
236
- type: 'audio',
237
- }),
238
- body: node_fs_1.default.createReadStream(audioOutputLocation),
239
- region: (0, get_current_region_1.getCurrentRegionInFunction)(),
240
- privacy: params.privacy,
241
- expectedBucketOwner: options.expectedBucketOwner,
242
- downloadBehavior: null,
243
- customCredentials: null,
244
- })
245
- : null,
246
- ]);
247
- renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Wrote chunk to S3 (${Date.now() - writeStart}ms)`);
225
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Streamed chunk to main function (${Date.now() - writeStart}ms)`);
248
226
  renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Cleaning up and writing timings');
249
227
  await Promise.all([
250
228
  node_fs_1.default.promises.rm(videoOutputLocation, { recursive: true }),
@@ -252,34 +230,19 @@ const renderHandler = async (params, options, logs) => {
252
230
  ? node_fs_1.default.promises.rm(audioOutputLocation, { recursive: true })
253
231
  : null,
254
232
  node_fs_1.default.promises.rm(outputPath, { recursive: true }),
255
- (0, io_1.lambdaWriteFile)({
256
- bucketName: params.bucketName,
257
- body: JSON.stringify(condensedTimingData, null, 2),
258
- key: (0, constants_1.lambdaTimingsKey)({
259
- renderId: params.renderId,
260
- chunk: params.chunk,
261
- rendered: endRendered,
262
- start,
263
- }),
264
- region: (0, get_current_region_1.getCurrentRegionInFunction)(),
265
- privacy: 'private',
266
- expectedBucketOwner: options.expectedBucketOwner,
267
- downloadBehavior: null,
268
- customCredentials: null,
269
- }),
270
233
  ].filter(truthy_1.truthy));
271
234
  renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Done!');
272
235
  return {};
273
236
  };
274
- exports.ENABLE_SLOW_LEAK_DETECTION = false;
275
- const rendererHandler = async (params, options, requestContext) => {
237
+ const ENABLE_SLOW_LEAK_DETECTION = false;
238
+ const rendererHandler = async (params, options, onStream, requestContext) => {
276
239
  if (params.type !== constants_1.LambdaRoutines.renderer) {
277
240
  throw new Error('Params must be renderer');
278
241
  }
279
242
  const logs = [];
280
- const leakDetection = (0, why_is_node_running_1.enableNodeIntrospection)(exports.ENABLE_SLOW_LEAK_DETECTION);
243
+ const leakDetection = (0, why_is_node_running_1.enableNodeIntrospection)(ENABLE_SLOW_LEAK_DETECTION);
281
244
  try {
282
- await renderHandler(params, options, logs);
245
+ await renderHandler({ params, options, logs, onStream });
283
246
  return {
284
247
  type: 'success',
285
248
  };
@@ -293,45 +256,29 @@ const rendererHandler = async (params, options, requestContext) => {
293
256
  // is a very rare error to occur
294
257
  const isRetryableError = (0, is_flaky_error_1.isFlakyError)(err);
295
258
  const shouldNotRetry = err.name === 'CancelledError';
296
- const willRetry = isRetryableError && params.retriesLeft > 0 && !shouldNotRetry;
297
- const isFatal = !willRetry;
298
- console.log(`Error occurred (will retry = ${String(willRetry)})`);
299
- console.log(err);
300
- await (0, write_lambda_error_1.writeLambdaError)({
301
- bucketName: params.bucketName,
302
- errorInfo: {
303
- name: err.name,
304
- message: err.message,
305
- stack: err.stack,
306
- chunk: params.chunk,
307
- frame: null,
308
- type: 'renderer',
309
- isFatal,
310
- tmpDir: (0, write_lambda_error_1.getTmpDirStateIfENoSp)(err.stack),
311
- attempt: params.attempt,
312
- totalAttempts: params.retriesLeft + params.attempt,
313
- willRetry,
259
+ const shouldRetry = isRetryableError && params.retriesLeft > 0 && !shouldNotRetry;
260
+ renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, `Error occurred (will retry = ${String(shouldRetry)})`);
261
+ renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, err);
262
+ onStream({
263
+ type: 'error-occurred',
264
+ payload: {
265
+ error: err.stack,
266
+ shouldRetry,
267
+ errorInfo: {
268
+ name: err.name,
269
+ message: err.message,
270
+ stack: err.stack,
271
+ chunk: params.chunk,
272
+ frame: null,
273
+ type: 'renderer',
274
+ isFatal: !shouldRetry,
275
+ tmpDir: (0, write_lambda_error_1.getTmpDirStateIfENoSp)(err.stack),
276
+ attempt: params.attempt,
277
+ totalAttempts: params.retriesLeft + params.attempt,
278
+ willRetry: shouldRetry,
279
+ },
314
280
  },
315
- renderId: params.renderId,
316
- expectedBucketOwner: options.expectedBucketOwner,
317
281
  });
318
- if (willRetry) {
319
- const retryPayload = {
320
- ...params,
321
- retriesLeft: params.retriesLeft - 1,
322
- attempt: params.attempt + 1,
323
- };
324
- const res = await (0, call_lambda_1.callLambda)({
325
- functionName: process.env.AWS_LAMBDA_FUNCTION_NAME,
326
- payload: retryPayload,
327
- type: constants_1.LambdaRoutines.renderer,
328
- region: (0, get_current_region_1.getCurrentRegionInFunction)(),
329
- receivedStreamingPayload: () => undefined,
330
- timeoutInTest: 120000,
331
- retriesRemaining: 0,
332
- });
333
- return res;
334
- }
335
282
  throw err;
336
283
  }
337
284
  finally {
@@ -1,6 +1,7 @@
1
1
  import type { LambdaPayload } from '../shared/constants';
2
2
  type Options = {
3
3
  expectedBucketOwner: string;
4
+ timeoutInMilliseconds: number;
4
5
  };
5
6
  export declare const startHandler: (params: LambdaPayload, options: Options) => Promise<{
6
7
  type: "success";
@@ -10,6 +10,7 @@ const convert_to_serve_url_1 = require("../shared/convert-to-serve-url");
10
10
  const get_current_region_1 = require("./helpers/get-current-region");
11
11
  const io_1 = require("./helpers/io");
12
12
  const lifecycle_1 = require("./helpers/lifecycle");
13
+ const overall_render_progress_1 = require("./helpers/overall-render-progress");
13
14
  const startHandler = async (params, options) => {
14
15
  var _a;
15
16
  if (params.type !== constants_1.LambdaRoutines.start) {
@@ -38,9 +39,9 @@ const startHandler = async (params, options) => {
38
39
  bucketName,
39
40
  downloadBehavior: null,
40
41
  region,
41
- body: 'Render was initialized',
42
+ body: JSON.stringify((0, overall_render_progress_1.makeInitialOverallRenderProgress)(options.timeoutInMilliseconds + Date.now())),
42
43
  expectedBucketOwner: options.expectedBucketOwner,
43
- key: (0, constants_1.initalizedMetadataKey)(renderId),
44
+ key: (0, constants_1.overallProgressKey)(renderId),
44
45
  privacy: 'private',
45
46
  customCredentials: null,
46
47
  });
@@ -1,10 +1,13 @@
1
1
  import type { CostsInfo, LambdaPayload } from '../shared/constants';
2
+ import type { OnStream } from './streaming/streaming';
2
3
  type Options = {
3
4
  params: LambdaPayload;
4
5
  renderId: string;
5
6
  expectedBucketOwner: string;
7
+ onStream: OnStream;
8
+ timeoutInMilliseconds: number;
6
9
  };
7
- type RenderStillLambdaResponsePayload = {
10
+ export type RenderStillLambdaResponsePayload = {
8
11
  type: 'success';
9
12
  output: string;
10
13
  outKey: string;
@@ -14,5 +17,7 @@ type RenderStillLambdaResponsePayload = {
14
17
  estimatedPrice: CostsInfo;
15
18
  renderId: string;
16
19
  };
17
- export declare const stillHandler: (options: Options) => Promise<RenderStillLambdaResponsePayload>;
20
+ export declare const stillHandler: (options: Options) => Promise<{
21
+ type: 'success';
22
+ }>;
18
23
  export {};
@@ -28,9 +28,9 @@ const get_current_region_1 = require("./helpers/get-current-region");
28
28
  const get_output_url_from_metadata_1 = require("./helpers/get-output-url-from-metadata");
29
29
  const io_1 = require("./helpers/io");
30
30
  const on_downloads_logger_1 = require("./helpers/on-downloads-logger");
31
+ const overall_render_progress_1 = require("./helpers/overall-render-progress");
31
32
  const validate_composition_1 = require("./helpers/validate-composition");
32
- const write_lambda_error_1 = require("./helpers/write-lambda-error");
33
- const innerStillHandler = async ({ params: lambdaParams, expectedBucketOwner, renderId, }) => {
33
+ const innerStillHandler = async ({ params: lambdaParams, expectedBucketOwner, renderId, onStream, timeoutInMilliseconds, }) => {
34
34
  var _a, _b, _c, _d, _e;
35
35
  if (lambdaParams.type !== constants_1.LambdaRoutines.still) {
36
36
  throw new TypeError('Expected still type');
@@ -127,10 +127,12 @@ const innerStillHandler = async ({ params: lambdaParams, expectedBucketOwner, re
127
127
  downloadBehavior: lambdaParams.downloadBehavior,
128
128
  audioBitrate: null,
129
129
  };
130
+ const still = (0, overall_render_progress_1.makeInitialOverallRenderProgress)(timeoutInMilliseconds);
131
+ still.renderMetadata = renderMetadata;
130
132
  await (0, io_1.lambdaWriteFile)({
131
133
  bucketName,
132
- key: (0, constants_1.renderMetadataKey)(renderId),
133
- body: JSON.stringify(renderMetadata),
134
+ key: (0, constants_1.overallProgressKey)(renderId),
135
+ body: JSON.stringify(still),
134
136
  region: (0, get_current_region_1.getCurrentRegionInFunction)(),
135
137
  privacy: 'private',
136
138
  expectedBucketOwner,
@@ -205,7 +207,7 @@ const innerStillHandler = async ({ params: lambdaParams, expectedBucketOwner, re
205
207
  diskSizeInMb: constants_1.MAX_EPHEMERAL_STORAGE_IN_MB,
206
208
  });
207
209
  const { key: outKey, url } = (0, get_output_url_from_metadata_1.getOutputUrlFromMetadata)(renderMetadata, bucketName, customCredentials);
208
- return {
210
+ const payload = {
209
211
  type: 'success',
210
212
  output: url,
211
213
  size,
@@ -215,15 +217,19 @@ const innerStillHandler = async ({ params: lambdaParams, expectedBucketOwner, re
215
217
  renderId,
216
218
  outKey,
217
219
  };
220
+ onStream({
221
+ type: 'still-rendered',
222
+ payload,
223
+ });
218
224
  };
219
225
  const stillHandler = async (options) => {
220
- var _a;
221
226
  const { params } = options;
222
227
  if (params.type !== constants_1.LambdaRoutines.still) {
223
228
  throw new Error('Params must be renderer');
224
229
  }
225
230
  try {
226
- return await innerStillHandler(options);
231
+ await innerStillHandler(options);
232
+ return { type: 'success' };
227
233
  }
228
234
  catch (err) {
229
235
  // If this error is encountered, we can just retry as it
@@ -233,6 +239,10 @@ const stillHandler = async (options) => {
233
239
  if (!willRetry) {
234
240
  throw err;
235
241
  }
242
+ renderer_1.RenderInternals.Log.error({
243
+ indent: false,
244
+ logLevel: params.logLevel,
245
+ }, 'Got error:', err.stack, 'Will retry.');
236
246
  const retryPayload = {
237
247
  ...params,
238
248
  maxRetries: params.maxRetries - 1,
@@ -243,34 +253,7 @@ const stillHandler = async (options) => {
243
253
  payload: retryPayload,
244
254
  region: (0, get_current_region_1.getCurrentRegionInFunction)(),
245
255
  type: constants_1.LambdaRoutines.still,
246
- receivedStreamingPayload: () => undefined,
247
256
  timeoutInTest: 120000,
248
- retriesRemaining: 0,
249
- });
250
- const bucketName = (_a = params.bucketName) !== null && _a !== void 0 ? _a : (await (0, get_or_create_bucket_1.internalGetOrCreateBucket)({
251
- region: (0, get_current_region_1.getCurrentRegionInFunction)(),
252
- enableFolderExpiry: null,
253
- customCredentials: null,
254
- })).bucketName;
255
- // `await` elided on purpose here; using `void` to mark it as intentional
256
- // eslint-disable-next-line no-void
257
- void (0, write_lambda_error_1.writeLambdaError)({
258
- bucketName,
259
- errorInfo: {
260
- chunk: null,
261
- frame: null,
262
- isFatal: false,
263
- name: err.name,
264
- message: err.message,
265
- stack: err.stack,
266
- type: 'browser',
267
- tmpDir: (0, write_lambda_error_1.getTmpDirStateIfENoSp)(err.stack),
268
- attempt: params.attempt,
269
- totalAttempts: params.attempt + params.maxRetries,
270
- willRetry,
271
- },
272
- expectedBucketOwner: options.expectedBucketOwner,
273
- renderId: options.renderId,
274
257
  });
275
258
  return res;
276
259
  }
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ import type { LambdaErrorInfo } from '../helpers/write-lambda-error';
2
3
  import type { RenderStillLambdaResponsePayload } from '../still';
3
4
  declare const framesRendered: "frames-rendered";
4
5
  declare const errorOccurred: "error-occurred";
@@ -7,6 +8,7 @@ declare const videoChunkRendered: "video-chunk-rendered";
7
8
  declare const audioChunkRendered: "audio-chunk-rendered";
8
9
  declare const chunkComplete: "chunk-complete";
9
10
  declare const stillRendered: "still-rendered";
11
+ declare const lambdaInvoked: "lambda-invoked";
10
12
  declare const messageTypes: {
11
13
  readonly '1': {
12
14
  readonly type: "frames-rendered";
@@ -29,6 +31,9 @@ declare const messageTypes: {
29
31
  readonly '7': {
30
32
  readonly type: "chunk-complete";
31
33
  };
34
+ readonly '8': {
35
+ readonly type: "lambda-invoked";
36
+ };
32
37
  };
33
38
  export type MessageTypeId = keyof typeof messageTypes;
34
39
  type MessageType = (typeof messageTypes)[MessageTypeId]['type'];
@@ -52,6 +57,7 @@ export type StreamingPayload = {
52
57
  payload: {
53
58
  error: string;
54
59
  shouldRetry: boolean;
60
+ errorInfo: LambdaErrorInfo;
55
61
  };
56
62
  } | {
57
63
  type: typeof renderIdDetermined;
@@ -63,10 +69,17 @@ export type StreamingPayload = {
63
69
  payload: RenderStillLambdaResponsePayload;
64
70
  } | {
65
71
  type: typeof chunkComplete;
66
- payload: {};
72
+ payload: {
73
+ start: number;
74
+ rendered: number;
75
+ };
76
+ } | {
77
+ type: typeof lambdaInvoked;
78
+ payload: {
79
+ attempt: number;
80
+ };
67
81
  };
68
82
  export declare const messageTypeIdToMessageType: (messageTypeId: MessageTypeId) => MessageType;
69
- export declare const messageTypeToMessageId: (messageType: MessageType) => MessageTypeId;
70
83
  export type StreamingMessage = {
71
84
  successType: 'error' | 'success';
72
85
  message: StreamingPayload;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeStreamPayload = exports.messageTypeToMessageId = exports.messageTypeIdToMessageType = exports.formatMap = void 0;
4
- const client_1 = require("@remotion/renderer/client");
3
+ exports.makeStreamPayload = exports.messageTypeIdToMessageType = exports.formatMap = void 0;
4
+ const pure_1 = require("@remotion/renderer/pure");
5
5
  const framesRendered = 'frames-rendered';
6
6
  const errorOccurred = 'error-occurred';
7
7
  const renderIdDetermined = 'render-id-determined';
@@ -9,6 +9,7 @@ const videoChunkRendered = 'video-chunk-rendered';
9
9
  const audioChunkRendered = 'audio-chunk-rendered';
10
10
  const chunkComplete = 'chunk-complete';
11
11
  const stillRendered = 'still-rendered';
12
+ const lambdaInvoked = 'lambda-invoked';
12
13
  const messageTypes = {
13
14
  '1': { type: framesRendered },
14
15
  '2': { type: errorOccurred },
@@ -17,6 +18,7 @@ const messageTypes = {
17
18
  '5': { type: audioChunkRendered },
18
19
  '6': { type: stillRendered },
19
20
  '7': { type: chunkComplete },
21
+ '8': { type: lambdaInvoked },
20
22
  };
21
23
  exports.formatMap = {
22
24
  [framesRendered]: 'json',
@@ -26,6 +28,7 @@ exports.formatMap = {
26
28
  [audioChunkRendered]: 'binary',
27
29
  [stillRendered]: 'json',
28
30
  [chunkComplete]: 'json',
31
+ [lambdaInvoked]: 'json',
29
32
  };
30
33
  const messageTypeIdToMessageType = (messageTypeId) => {
31
34
  const types = messageTypes[messageTypeId];
@@ -42,14 +45,13 @@ const messageTypeToMessageId = (messageType) => {
42
45
  }
43
46
  return id;
44
47
  };
45
- exports.messageTypeToMessageId = messageTypeToMessageId;
46
48
  const makeStreamPayload = ({ message }) => {
47
49
  const body = exports.formatMap[message.type] === 'json'
48
- ? Buffer.from(JSON.stringify(message.payload))
50
+ ? new TextEncoder().encode(JSON.stringify(message.payload))
49
51
  : message.payload;
50
- return client_1.BrowserSafeApis.makeStreamPayloadMessage({
52
+ return pure_1.NoReactAPIs.makeStreamPayloadMessage({
51
53
  body,
52
- nonce: (0, exports.messageTypeToMessageId)(message.type),
54
+ nonce: messageTypeToMessageId(message.type),
53
55
  status: 0,
54
56
  });
55
57
  };
@@ -1,7 +1,7 @@
1
1
  export declare const LambdaInternals: {
2
2
  executeCommand: (args: string[], remotionRoot: string, logLevel: "error" | "verbose" | "info" | "warn") => Promise<void>;
3
3
  makeLambdaRenderMediaPayload: ({ rendererFunctionName, frameRange, framesPerLambda, forceBucketName: bucketName, codec, composition, serveUrl, imageFormat, inputProps, region, crf, envVariables, pixelFormat, proResProfile, x264Preset, maxRetries, privacy, logLevel, outName, timeoutInMilliseconds, chromiumOptions, scale, everyNthFrame, numberOfGifLoops, audioBitrate, concurrencyPerLambda, audioCodec, forceHeight, forceWidth, webhook, videoBitrate, encodingMaxRate, encodingBufferSize, downloadBehavior, muted, overwrite, jpegQuality, offthreadVideoCacheSizeInBytes, deleteAfter, colorSpace, preferLossless, }: import("./api/make-lambda-payload").InnerRenderMediaOnLambdaInput) => Promise<import("./defaults").LambdaStartPayload>;
4
- getRenderProgressPayload: ({ bucketName, renderId, s3OutputProvider, logLevel, }: import(".").GetRenderProgressInput) => import("./defaults").LambdaStatusPayload;
4
+ getRenderProgressPayload: ({ bucketName, renderId, s3OutputProvider, logLevel, }: import("./client").GetRenderProgressInput) => import("./defaults").LambdaStatusPayload;
5
5
  makeLambdaRenderStillPayload: ({ serveUrl, inputProps, imageFormat, envVariables, quality, jpegQuality, region, maxRetries, composition, privacy, frame, logLevel, outName, timeoutInMilliseconds, chromiumOptions, scale, downloadBehavior, forceHeight, forceWidth, forceBucketName, offthreadVideoCacheSizeInBytes, deleteAfter, }: import("./api/render-still-on-lambda").RenderStillOnLambdaNonNullInput) => Promise<{
6
6
  type: import("./defaults").LambdaRoutines.still;
7
7
  serveUrl: string;
@@ -26,6 +26,7 @@ export declare const LambdaInternals: {
26
26
  bucketName: string | null;
27
27
  offthreadVideoCacheSizeInBytes: number | null;
28
28
  deleteAfter: "1-day" | "3-days" | "7-days" | "30-days" | null;
29
+ streamed: boolean;
29
30
  }>;
30
31
  internalDeploySite: (args_0: {
31
32
  entryPoint: string;
@@ -10,6 +10,7 @@ const client_sts_1 = require("@aws-sdk/client-sts");
10
10
  const credential_providers_1 = require("@aws-sdk/credential-providers");
11
11
  const no_react_1 = require("remotion/no-react");
12
12
  const check_credentials_1 = require("./check-credentials");
13
+ const constants_1 = require("./constants");
13
14
  const is_in_lambda_1 = require("./is-in-lambda");
14
15
  const _clients = {};
15
16
  const getCredentials = () => {
@@ -141,6 +142,13 @@ const getServiceClient = ({ region, service, customCredentials, }) => {
141
142
  : new Client({
142
143
  region,
143
144
  credentials: getCredentials(),
145
+ requestHandler: service === 'lambda'
146
+ ? {
147
+ httpsAgent: {
148
+ maxSockets: constants_1.MAX_FUNCTIONS_PER_RENDER + 50,
149
+ },
150
+ }
151
+ : undefined,
144
152
  });
145
153
  if (process.env.REMOTION_DISABLE_AWS_CLIENT_CACHE) {
146
154
  return client;
@@ -1,4 +1,4 @@
1
- import type { StreamingPayloads } from '../functions/helpers/streaming-payloads';
1
+ import type { OnMessage } from '../functions/streaming/streaming';
2
2
  import type { AwsRegion } from '../pricing/aws-regions';
3
3
  import type { LambdaPayloads, LambdaRoutines } from './constants';
4
4
  import type { LambdaReturnValues } from './return-values';
@@ -7,10 +7,11 @@ type Options<T extends LambdaRoutines> = {
7
7
  type: T;
8
8
  payload: Omit<LambdaPayloads[T], 'type'>;
9
9
  region: AwsRegion;
10
- receivedStreamingPayload: (streamPayload: StreamingPayloads) => void;
11
10
  timeoutInTest: number;
12
11
  };
13
- export declare const callLambda: <T extends LambdaRoutines>(options: Options<T> & {
12
+ export declare const callLambda: <T extends LambdaRoutines>(options: Options<T>) => Promise<LambdaReturnValues[T]>;
13
+ export declare const callLambdaWithStreaming: <T extends LambdaRoutines>(options: Options<T> & {
14
+ receivedStreamingPayload: OnMessage;
14
15
  retriesRemaining: number;
15
- }) => Promise<LambdaReturnValues[T]>;
16
+ }) => Promise<void>;
16
17
  export {};