@remotion/serverless 4.0.522 → 4.0.523

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.
@@ -2,7 +2,7 @@ import type { CloudProvider, CustomCredentials, DownloadBehavior, PostRenderData
2
2
  import type { OverallProgressHelper } from './overall-render-progress';
3
3
  import type { InsideFunctionSpecifics } from './provider-implementation';
4
4
  export declare const finishRender: <Provider extends CloudProvider<string, Record<string, unknown>, Record<string, unknown>, string, object>>({ expectedBucketOwner, renderBucketName, customCredentials, downloadBehavior, key, privacy, inputProps, serializedResolvedProps, renderMetadata, logLevel, overallProgress, startTime, providerSpecifics, insideFunctionSpecifics, forcePathStyle, storageClass, requestHandler, outputFile, timeToCombine, }: {
5
- expectedBucketOwner: string;
5
+ expectedBucketOwner: string | null;
6
6
  renderBucketName: string;
7
7
  customCredentials: CustomCredentials<Provider> | null;
8
8
  downloadBehavior: DownloadBehavior;
@@ -11,7 +11,7 @@ const create_post_render_data_1 = require("./create-post-render-data");
11
11
  const finishRender = async ({ expectedBucketOwner, renderBucketName, customCredentials, downloadBehavior, key, privacy, inputProps, serializedResolvedProps, renderMetadata, logLevel, overallProgress, startTime, providerSpecifics, insideFunctionSpecifics, forcePathStyle, storageClass, requestHandler, outputFile, timeToCombine, }) => {
12
12
  const outputSize = node_fs_1.default.statSync(outputFile).size;
13
13
  const writeToBucket = insideFunctionSpecifics.timer(`Writing to bucket (${outputSize} bytes)`, logLevel);
14
- await providerSpecifics.writeFile({
14
+ const writeOptions = {
15
15
  bucketName: renderBucketName,
16
16
  key,
17
17
  body: node_fs_1.default.createReadStream(outputFile),
@@ -23,7 +23,16 @@ const finishRender = async ({ expectedBucketOwner, renderBucketName, customCrede
23
23
  forcePathStyle,
24
24
  storageClass,
25
25
  requestHandler,
26
- });
26
+ };
27
+ if (renderMetadata.outputFileIsConditional) {
28
+ if (!providerSpecifics.writeFileIfNotExists) {
29
+ throw new Error('The provider does not support conditional output uploads');
30
+ }
31
+ await providerSpecifics.writeFileIfNotExists(writeOptions);
32
+ }
33
+ else {
34
+ await providerSpecifics.writeFile(writeOptions);
35
+ }
27
36
  writeToBucket.end();
28
37
  const errorExplanations = (0, serverless_client_1.inspectErrors)({
29
38
  errors: overallProgress.get().errors,
@@ -1,9 +1,10 @@
1
1
  import type { openBrowser } from '@remotion/renderer';
2
2
  import type { Await } from '@remotion/serverless-client';
3
- import type { ForgetBrowserEventLoop, GetBrowserInstance } from './provider-implementation';
3
+ import type { CloseBrowserInstance, ForgetBrowserEventLoop, GetBrowserInstance } from './provider-implementation';
4
4
  export type LaunchedBrowser = {
5
5
  instance: Await<ReturnType<typeof openBrowser>>;
6
6
  configurationString: string;
7
7
  };
8
8
  export declare const forgetBrowserEventLoopImplementation: ForgetBrowserEventLoop;
9
+ export declare const closeBrowserInstanceImplementation: CloseBrowserInstance;
9
10
  export declare const getBrowserInstanceImplementation: GetBrowserInstance;
@@ -1,18 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getBrowserInstanceImplementation = exports.forgetBrowserEventLoopImplementation = void 0;
3
+ exports.getBrowserInstanceImplementation = exports.closeBrowserInstanceImplementation = exports.forgetBrowserEventLoopImplementation = void 0;
4
4
  const renderer_1 = require("@remotion/renderer");
5
5
  const serverless_client_1 = require("@remotion/serverless-client");
6
6
  const makeConfigurationString = (options, logLevel) => {
7
- var _a, _b, _c;
7
+ var _a, _b, _c, _d;
8
8
  return [
9
9
  `web-security-${Boolean(options.disableWebSecurity)}`,
10
- `multi-process-${Boolean(options.enableMultiProcessOnLinux)}`,
10
+ `multi-process-${(_a = options.enableMultiProcessOnLinux) !== null && _a !== void 0 ? _a : true}`,
11
11
  `ignore-certificate-errors-${Boolean(options.ignoreCertificateErrors)}`,
12
12
  `log-level-${logLevel}`,
13
- `gl-${(_a = options.gl) !== null && _a !== void 0 ? _a : null}`,
14
- `userAgent-${(_b = options.userAgent) !== null && _b !== void 0 ? _b : null}`,
15
- `headless-${(_c = options.headless) !== null && _c !== void 0 ? _c : false}`,
13
+ `gl-${(_b = options.gl) !== null && _b !== void 0 ? _b : null}`,
14
+ `userAgent-${(_c = options.userAgent) !== null && _c !== void 0 ? _c : null}`,
15
+ `headless-${(_d = options.headless) !== null && _d !== void 0 ? _d : false}`,
16
16
  ].join('/');
17
17
  };
18
18
  let _browserInstance;
@@ -37,8 +37,15 @@ const forgetBrowserEventLoopImplementation = ({ logLevel, launchedBrowser, }) =>
37
37
  launchedBrowser.instance.runner.deleteBrowserCaches();
38
38
  };
39
39
  exports.forgetBrowserEventLoopImplementation = forgetBrowserEventLoopImplementation;
40
+ const closeBrowserInstanceImplementation = async ({ launchedBrowser, }) => {
41
+ if (_browserInstance === launchedBrowser) {
42
+ _browserInstance = null;
43
+ }
44
+ await launchedBrowser.instance.close({ silent: true });
45
+ };
46
+ exports.closeBrowserInstanceImplementation = closeBrowserInstanceImplementation;
40
47
  const getBrowserInstanceImplementation = async ({ logLevel, indent, chromiumOptions, providerSpecifics, insideFunctionSpecifics, }) => {
41
- var _a, _b, _c, _d, _e, _f;
48
+ var _a, _b, _c, _d, _e;
42
49
  const actualChromiumOptions = {
43
50
  ...chromiumOptions,
44
51
  darkMode: (_a = chromiumOptions.darkMode) !== null && _a !== void 0 ? _a : false,
@@ -46,9 +53,6 @@ const getBrowserInstanceImplementation = async ({ logLevel, indent, chromiumOpti
46
53
  headless: (_c = chromiumOptions.headless) !== null && _c !== void 0 ? _c : true,
47
54
  userAgent: (_d = chromiumOptions.userAgent) !== null && _d !== void 0 ? _d : null,
48
55
  ignoreCertificateErrors: (_e = chromiumOptions.ignoreCertificateErrors) !== null && _e !== void 0 ? _e : false,
49
- // Override the `null` value, which might come from CLI with swANGLE
50
- gl: (_f = chromiumOptions.gl) !== null && _f !== void 0 ? _f : 'swangle',
51
- enableMultiProcessOnLinux: false,
52
56
  };
53
57
  const configurationString = makeConfigurationString(actualChromiumOptions, logLevel);
54
58
  renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, `Rendering with Remotion v${serverless_client_1.VERSION}.`);
@@ -62,38 +66,45 @@ const getBrowserInstanceImplementation = async ({ logLevel, indent, chromiumOpti
62
66
  if (!_browserInstance) {
63
67
  renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, 'Cold function, launching new browser instance');
64
68
  launching = true;
65
- const execPath = providerSpecifics.getChromiumPath();
66
- const instance = await renderer_1.RenderInternals.internalOpenBrowser({
67
- browser: 'chrome',
68
- browserExecutable: execPath,
69
- chromiumOptions: actualChromiumOptions,
70
- forceDeviceScaleFactor: undefined,
71
- indent: false,
72
- viewport: null,
73
- logLevel,
74
- onBrowserDownload: () => {
75
- throw new Error('Should not download a browser in serverless');
76
- },
77
- chromeMode: 'headless-shell',
78
- });
79
- instance.on('disconnected', () => {
80
- var _a;
81
- renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, 'Browser disconnected or crashed.');
82
- insideFunctionSpecifics.forgetBrowserEventLoop({
69
+ try {
70
+ const execPath = providerSpecifics.getChromiumPath();
71
+ const instance = await renderer_1.RenderInternals.internalOpenBrowser({
72
+ browser: 'chrome',
73
+ browserExecutable: execPath,
74
+ chromiumOptions: actualChromiumOptions,
75
+ forceDeviceScaleFactor: undefined,
76
+ indent: false,
77
+ viewport: null,
83
78
  logLevel,
84
- launchedBrowser: _browserInstance,
79
+ onBrowserDownload: () => {
80
+ throw new Error('Should not download a browser in serverless');
81
+ },
82
+ chromeMode: 'headless-shell',
85
83
  });
86
- (_a = _browserInstance === null || _browserInstance === void 0 ? void 0 : _browserInstance.instance) === null || _a === void 0 ? void 0 : _a.close({ silent: true }).catch((err) => {
87
- renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, 'Could not close browser instance', err);
84
+ const launchedBrowser = {
85
+ instance,
86
+ configurationString,
87
+ };
88
+ _browserInstance = launchedBrowser;
89
+ instance.on('disconnected', () => {
90
+ if (_browserInstance !== launchedBrowser) {
91
+ return;
92
+ }
93
+ _browserInstance = null;
94
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, 'Browser disconnected or crashed.');
95
+ insideFunctionSpecifics.forgetBrowserEventLoop({
96
+ logLevel,
97
+ launchedBrowser,
98
+ });
99
+ launchedBrowser.instance.close({ silent: true }).catch((err) => {
100
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, 'Could not close browser instance', err);
101
+ });
88
102
  });
89
- _browserInstance = null;
90
- });
91
- _browserInstance = {
92
- instance,
93
- configurationString,
94
- };
95
- launching = false;
96
- return _browserInstance;
103
+ return launchedBrowser;
104
+ }
105
+ finally {
106
+ launching = false;
107
+ }
97
108
  }
98
109
  if (_browserInstance.configurationString !== configurationString) {
99
110
  renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, 'Warm function, but Browser configuration changed. Killing old browser instance.');
@@ -1,7 +1,7 @@
1
1
  import type { CloudProvider, ProviderSpecifics, ServerlessPayload } from '@remotion/serverless-client';
2
2
  import type { InsideFunctionSpecifics } from '../provider-implementation';
3
3
  type Options = {
4
- expectedBucketOwner: string;
4
+ expectedBucketOwner: string | null;
5
5
  };
6
6
  export declare const compositionsHandler: <Provider extends CloudProvider<string, Record<string, unknown>, Record<string, unknown>, string, object>>({ params, options, providerSpecifics, insideFunctionSpecifics, }: {
7
7
  params: ServerlessPayload<Provider>;
@@ -2,7 +2,7 @@ import type { CloudProvider, ProviderSpecifics, ServerlessPayload } from '@remot
2
2
  import type { InsideFunctionSpecifics } from '../provider-implementation';
3
3
  import type { RequestContext } from './renderer';
4
4
  type Options = {
5
- expectedBucketOwner: string;
5
+ expectedBucketOwner: string | null;
6
6
  getRemainingTimeInMillis: () => number;
7
7
  requestContext: RequestContext | null;
8
8
  };
@@ -10,7 +10,6 @@ const artifact_registry_1 = require("../artifact-registry");
10
10
  const cleanup_props_1 = require("../cleanup-props");
11
11
  const find_output_file_in_bucket_1 = require("../find-output-file-in-bucket");
12
12
  const finish_render_1 = require("../finish-render");
13
- const get_tmp_dir_1 = require("../get-tmp-dir");
14
13
  const merge_chunks_1 = require("../merge-chunks");
15
14
  const overall_render_progress_1 = require("../overall-render-progress");
16
15
  const plan_frame_ranges_1 = require("../plan-frame-ranges");
@@ -21,16 +20,15 @@ const validate_composition_1 = require("../validate-composition");
21
20
  const send_telemetry_event_1 = require("./send-telemetry-event");
22
21
  const innerLaunchHandler = async ({ params, options, overallProgress, registerCleanupTask, providerSpecifics, insideFunctionSpecifics, onBrowser, }) => {
23
22
  var _a, _b;
24
- var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
23
+ var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
25
24
  if (params.type !== serverless_client_2.ServerlessRoutines.launch) {
26
25
  throw new Error('Expected launch type');
27
26
  }
28
27
  const startedDate = Date.now();
29
- const chromiumParams = { ...((_c = params.chromiumOptions) !== null && _c !== void 0 ? _c : {}) };
30
- if (((_a = params.chromiumOptions) === null || _a === void 0 ? void 0 : _a.gl) === 'angle') {
31
- renderer_1.RenderInternals.Log.warn({ indent: false, logLevel: params.logLevel }, 'gl=angle is not supported in Lambda. Changing to gl=swangle instead.');
32
- chromiumParams.gl = 'swangle';
33
- }
28
+ const chromiumParams = (_d = (_a = insideFunctionSpecifics.normalizeChromiumOptions) === null || _a === void 0 ? void 0 : _a.call(insideFunctionSpecifics, {
29
+ chromiumOptions: (_c = params.chromiumOptions) !== null && _c !== void 0 ? _c : {},
30
+ logLevel: params.logLevel,
31
+ })) !== null && _d !== void 0 ? _d : { ...((_e = params.chromiumOptions) !== null && _e !== void 0 ? _e : {}) };
34
32
  const browserInstance = insideFunctionSpecifics.getBrowserInstance({
35
33
  logLevel: params.logLevel,
36
34
  indent: false,
@@ -72,14 +70,14 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
72
70
  composition: params.composition,
73
71
  browserInstance: instance,
74
72
  serializedInputPropsWithCustomSchema,
75
- envVariables: (_d = params.envVariables) !== null && _d !== void 0 ? _d : {},
73
+ envVariables: (_f = params.envVariables) !== null && _f !== void 0 ? _f : {},
76
74
  timeoutInMilliseconds: validateCompositionTimeout,
77
- chromiumOptions: (_e = params.chromiumOptions) !== null && _e !== void 0 ? _e : {},
75
+ chromiumOptions: (_g = params.chromiumOptions) !== null && _g !== void 0 ? _g : {},
78
76
  port: null,
79
77
  forceHeight: params.forceHeight,
80
78
  forceWidth: params.forceWidth,
81
- forceFps: (_f = params.forceFps) !== null && _f !== void 0 ? _f : null,
82
- forceDurationInFrames: (_g = params.forceDurationInFrames) !== null && _g !== void 0 ? _g : null,
79
+ forceFps: (_h = params.forceFps) !== null && _h !== void 0 ? _h : null,
80
+ forceDurationInFrames: (_j = params.forceDurationInFrames) !== null && _j !== void 0 ? _j : null,
83
81
  logLevel: params.logLevel,
84
82
  server: undefined,
85
83
  offthreadVideoCacheSizeInBytes: params.offthreadVideoCacheSizeInBytes,
@@ -100,7 +98,7 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
100
98
  renderer_1.RenderInternals.validateConcurrency({
101
99
  value: params.concurrencyPerFunction,
102
100
  setting: 'concurrencyPerLambda',
103
- checkIfValidForCurrentMachine: ((_h = params.rendererFunctionName) !== null && _h !== void 0 ? _h : null) === null,
101
+ checkIfValidForCurrentMachine: ((_k = params.rendererFunctionName) !== null && _k !== void 0 ? _k : null) === null,
104
102
  });
105
103
  const realFrameRange = renderer_1.RenderInternals.getRealFrameRange(comp.durationInFrames, params.frameRange);
106
104
  const frameCount = renderer_1.RenderInternals.getFramesToRender(realFrameRange, params.everyNthFrame);
@@ -225,11 +223,16 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
225
223
  return payload;
226
224
  });
227
225
  renderer_1.RenderInternals.Log.info(logOptions, 'Render plan: ', chunks.map((c, i) => `Chunk ${i} (Frames ${c[0]} - ${c[1]})`).join(', '));
228
- const rendererFunctionName = (_j = params.rendererFunctionName) !== null && _j !== void 0 ? _j : insideFunctionSpecifics.getCurrentFunctionName();
226
+ const rendererFunctionName = (_l = params.rendererFunctionName) !== null && _l !== void 0 ? _l : insideFunctionSpecifics.getCurrentFunctionName();
229
227
  const shouldRenderDirectly = params.concurrency === 1 &&
230
228
  params.rendererFunctionName === null &&
231
229
  options.requestContext !== null;
232
230
  const renderMetadata = {
231
+ outputFileIsConditional: !params.overwrite &&
232
+ providerSpecifics.supportsConditionalOutput({
233
+ customCredentials: (0, serverless_client_2.getCredentialsFromOutName)((_m = params.outName) !== null && _m !== void 0 ? _m : null),
234
+ }) &&
235
+ providerSpecifics.writeFileIfNotExists !== null,
233
236
  startedDate,
234
237
  totalChunks: chunks.length,
235
238
  estimatedTotalLambdaInvokations: [
@@ -249,7 +252,7 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
249
252
  memorySizeInMb: insideFunctionSpecifics.getCurrentMemorySizeInMb(),
250
253
  region: insideFunctionSpecifics.getCurrentRegionInFunction(),
251
254
  renderId: params.renderId,
252
- outName: (0, remove_outname_credentials_1.removeOutnameCredentials)((_k = params.outName) !== null && _k !== void 0 ? _k : undefined),
255
+ outName: (0, remove_outname_credentials_1.removeOutnameCredentials)((_o = params.outName) !== null && _o !== void 0 ? _o : undefined),
253
256
  privacy: params.privacy,
254
257
  everyNthFrame: params.everyNthFrame,
255
258
  frameRange: realFrameRange,
@@ -262,10 +265,10 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
262
265
  metadata: params.metadata,
263
266
  functionName: insideFunctionSpecifics.getCurrentFunctionName(),
264
267
  dimensions: {
265
- width: comp.width * ((_l = params.scale) !== null && _l !== void 0 ? _l : 1),
266
- height: comp.height * ((_m = params.scale) !== null && _m !== void 0 ? _m : 1),
268
+ width: comp.width * ((_p = params.scale) !== null && _p !== void 0 ? _p : 1),
269
+ height: comp.height * ((_q = params.scale) !== null && _q !== void 0 ? _q : 1),
267
270
  },
268
- rendererFunctionName: (_o = params.rendererFunctionName) !== null && _o !== void 0 ? _o : insideFunctionSpecifics.getCurrentFunctionName(),
271
+ rendererFunctionName: (_r = params.rendererFunctionName) !== null && _r !== void 0 ? _r : insideFunctionSpecifics.getCurrentFunctionName(),
269
272
  scale: params.scale,
270
273
  };
271
274
  const { key, renderBucketName, customCredentials } = (0, serverless_client_2.getExpectedOutName)({
@@ -274,7 +277,7 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
274
277
  customCredentials: typeof params.outName === 'string' ||
275
278
  typeof params.outName === 'undefined'
276
279
  ? null
277
- : ((_p = (_b = params.outName) === null || _b === void 0 ? void 0 : _b.s3OutputProvider) !== null && _p !== void 0 ? _p : null),
280
+ : ((_s = (_b = params.outName) === null || _b === void 0 ? void 0 : _b.s3OutputProvider) !== null && _s !== void 0 ? _s : null),
278
281
  bucketNamePrefix: providerSpecifics.getBucketPrefix(),
279
282
  });
280
283
  if (!params.overwrite) {
@@ -288,6 +291,13 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
288
291
  providerSpecifics,
289
292
  forcePathStyle: params.forcePathStyle,
290
293
  requestHandler: null,
294
+ }).catch((err) => {
295
+ if (err instanceof serverless_client_2.OutputFileAccessDeniedError &&
296
+ renderMetadata.outputFileIsConditional) {
297
+ // The final conditional upload still enforces overwrite: false.
298
+ return null;
299
+ }
300
+ throw err;
291
301
  });
292
302
  if (output) {
293
303
  throw new TypeError(`Output file "${key}" in bucket "${renderBucketName}" in region "${insideFunctionSpecifics.getCurrentRegionInFunction()}" already exists. Delete it before re-rendering, or set the 'overwrite' option in renderMediaOnLambda() to overwrite it."`);
@@ -483,7 +493,8 @@ const innerLaunchHandler = async ({ params, options, overallProgress, registerCl
483
493
  return postRenderData;
484
494
  };
485
495
  const launchHandler = async ({ params, options, providerSpecifics, insideFunctionSpecifics, }) => {
486
- var _a, _b, _c, _d, _e;
496
+ var _a;
497
+ var _b, _c, _d, _e, _f, _g;
487
498
  if (params.type !== serverless_client_2.ServerlessRoutines.launch) {
488
499
  throw new Error('Expected launch type');
489
500
  }
@@ -597,7 +608,7 @@ const launchHandler = async ({ params, options, providerSpecifics, insideFunctio
597
608
  const webhookDueToTimeout = setTimeout(onTimeout, Math.max(options.getRemainingTimeInMillis() - 1000, 1000));
598
609
  renderer_1.RenderInternals.Log.info(logOptions, `Function has ${Math.max(options.getRemainingTimeInMillis() - 1000, 1000)} before it times out`);
599
610
  const overallProgress = (0, overall_render_progress_1.makeOverallRenderProgress)({
600
- cancellationEnabled: (_a = params.enableCancellation) !== null && _a !== void 0 ? _a : false,
611
+ cancellationEnabled: (_b = params.enableCancellation) !== null && _b !== void 0 ? _b : false,
601
612
  renderId: params.renderId,
602
613
  bucketName: params.bucketName,
603
614
  expectedBucketOwner: options.expectedBucketOwner,
@@ -621,10 +632,10 @@ const launchHandler = async ({ params, options, providerSpecifics, insideFunctio
621
632
  });
622
633
  clearTimeout(webhookDueToTimeout);
623
634
  (0, send_telemetry_event_1.sendTelemetryEvent)({
624
- licenseKey: (_b = params.licenseKey) !== null && _b !== void 0 ? _b : null,
635
+ licenseKey: (_c = params.licenseKey) !== null && _c !== void 0 ? _c : null,
625
636
  logLevel: params.logLevel,
626
637
  isStill: false,
627
- isProduction: (_c = params.isProduction) !== null && _c !== void 0 ? _c : true,
638
+ isProduction: (_d = params.isProduction) !== null && _d !== void 0 ? _d : true,
628
639
  });
629
640
  if (!params.webhook || webhookInvoked) {
630
641
  return;
@@ -639,7 +650,7 @@ const launchHandler = async ({ params, options, providerSpecifics, insideFunctio
639
650
  renderId: params.renderId,
640
651
  expectedBucketOwner: options.expectedBucketOwner,
641
652
  bucketName: params.bucketName,
642
- customData: (_d = params.webhook.customData) !== null && _d !== void 0 ? _d : null,
653
+ customData: (_e = params.webhook.customData) !== null && _e !== void 0 ? _e : null,
643
654
  outputUrl: postRenderData.outputFile,
644
655
  lambdaErrors: postRenderData.errors,
645
656
  outputFile: postRenderData.outputFile,
@@ -687,7 +698,7 @@ const launchHandler = async ({ params, options, providerSpecifics, insideFunctio
687
698
  stack: err.stack,
688
699
  type: 'stitcher',
689
700
  isFatal: true,
690
- tmpDir: (0, get_tmp_dir_1.getTmpDirStateIfENoSp)(err.stack, insideFunctionSpecifics),
701
+ tmpDir: (_f = (_a = insideFunctionSpecifics.getTmpDirState) === null || _a === void 0 ? void 0 : _a.call(insideFunctionSpecifics, err.stack)) !== null && _f !== void 0 ? _f : null,
691
702
  attempt: 1,
692
703
  totalAttempts: 1,
693
704
  willRetry: false,
@@ -708,7 +719,7 @@ const launchHandler = async ({ params, options, providerSpecifics, insideFunctio
708
719
  renderId: params.renderId,
709
720
  expectedBucketOwner: options.expectedBucketOwner,
710
721
  bucketName: params.bucketName,
711
- customData: (_e = params.webhook.customData) !== null && _e !== void 0 ? _e : null,
722
+ customData: (_g = params.webhook.customData) !== null && _g !== void 0 ? _g : null,
712
723
  errors: [err].map((e) => ({
713
724
  message: e.message,
714
725
  name: e.name,
@@ -1,7 +1,7 @@
1
1
  import type { CloudProvider, GenericRenderProgress, ProviderSpecifics, ServerlessPayload } from '@remotion/serverless-client';
2
2
  import type { InsideFunctionSpecifics } from '../provider-implementation';
3
3
  type Options<Provider extends CloudProvider> = {
4
- expectedBucketOwner: string;
4
+ expectedBucketOwner: string | null;
5
5
  timeoutInMilliseconds: number;
6
6
  retriesRemaining: number;
7
7
  providerSpecifics: ProviderSpecifics<Provider>;
@@ -1,13 +1,13 @@
1
1
  import type { CloudProvider, OnStream, ProviderSpecifics, ServerlessPayload } from '@remotion/serverless-client';
2
2
  import type { InsideFunctionSpecifics } from '../provider-implementation';
3
3
  type Options = {
4
- expectedBucketOwner: string;
4
+ expectedBucketOwner: string | null;
5
5
  isWarm: boolean;
6
6
  };
7
7
  export type RequestContext = {
8
- invokedFunctionArn: string;
8
+ expectedBucketOwner: string | null;
9
9
  getRemainingTimeInMillis: () => number;
10
- awsRequestId: string;
10
+ requestId: string;
11
11
  };
12
12
  export declare const rendererHandler: <Provider extends CloudProvider<string, Record<string, unknown>, Record<string, unknown>, string, object>>({ onStream, options, params, providerSpecifics, requestContext, insideFunctionSpecifics, onMediaFiles, executionMode, }: {
13
13
  params: ServerlessPayload<Provider>;
@@ -10,18 +10,17 @@ const renderer_1 = require("@remotion/renderer");
10
10
  const pure_1 = require("@remotion/renderer/pure");
11
11
  const serverless_client_1 = require("@remotion/serverless-client");
12
12
  const cancellation_polling_1 = require("../cancellation-polling");
13
- const get_tmp_dir_1 = require("../get-tmp-dir");
14
- const leak_detection_1 = require("../leak-detection");
15
13
  const on_downloads_helpers_1 = require("../on-downloads-helpers");
16
- const why_is_node_running_1 = require("../why-is-node-running");
17
14
  const renderHandler = async ({ params, options, logs, onStream, providerSpecifics, insideFunctionSpecifics, onBrowserInstance, onMediaFiles, cancelSignal, }) => {
15
+ var _a;
16
+ var _b;
18
17
  if (params.type !== serverless_client_1.ServerlessRoutines.renderer) {
19
18
  throw new Error('Params must be renderer');
20
19
  }
21
- if (params.chromiumOptions.gl === 'angle') {
22
- renderer_1.RenderInternals.Log.warn({ indent: false, logLevel: params.logLevel }, 'gl=angle is not supported in Lambda. Changing to gl=swangle instead.');
23
- params.chromiumOptions.gl = 'swangle';
24
- }
20
+ const chromiumOptions = (_b = (_a = insideFunctionSpecifics.normalizeChromiumOptions) === null || _a === void 0 ? void 0 : _a.call(insideFunctionSpecifics, {
21
+ chromiumOptions: params.chromiumOptions,
22
+ logLevel: params.logLevel,
23
+ })) !== null && _b !== void 0 ? _b : params.chromiumOptions;
25
24
  if (params.launchFunctionConfig.version !== serverless_client_1.VERSION) {
26
25
  throw new Error(`The version of the function that was specified as "rendererFunctionName" is ${serverless_client_1.VERSION} but the version of the function that invoked the render is ${params.launchFunctionConfig.version}. Please make sure that the version of the function that is specified as "rendererFunctionName" is the same as the version of the function that is invoked.`);
27
26
  }
@@ -49,7 +48,7 @@ const renderHandler = async ({ params, options, logs, onStream, providerSpecific
49
48
  const browserInstance = await insideFunctionSpecifics.getBrowserInstance({
50
49
  logLevel: params.logLevel,
51
50
  indent: false,
52
- chromiumOptions: params.chromiumOptions,
51
+ chromiumOptions,
53
52
  providerSpecifics,
54
53
  insideFunctionSpecifics,
55
54
  });
@@ -195,7 +194,7 @@ const renderHandler = async ({ params, options, logs, onStream, providerSpecific
195
194
  gopSize: (_f = params.gopSize) !== null && _f !== void 0 ? _f : null,
196
195
  onDownload: (0, on_downloads_helpers_1.onDownloadsHelper)(params.logLevel),
197
196
  overwrite: false,
198
- chromiumOptions: params.chromiumOptions,
197
+ chromiumOptions,
199
198
  scale: params.scale,
200
199
  timeoutInMilliseconds: params.timeoutInMilliseconds,
201
200
  port: null,
@@ -294,13 +293,14 @@ const renderHandler = async ({ params, options, logs, onStream, providerSpecific
294
293
  renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Done!');
295
294
  return {};
296
295
  };
297
- const ENABLE_SLOW_LEAK_DETECTION = false;
298
296
  const rendererHandler = async ({ onStream, options, params, providerSpecifics, requestContext, insideFunctionSpecifics, onMediaFiles, executionMode, }) => {
297
+ var _a, _b;
298
+ var _c, _d;
299
299
  if (params.type !== serverless_client_1.ServerlessRoutines.renderer) {
300
300
  throw new Error('Params must be renderer');
301
301
  }
302
302
  const logs = [];
303
- const leakDetection = (0, why_is_node_running_1.enableNodeIntrospection)(ENABLE_SLOW_LEAK_DETECTION);
303
+ const finishRendererDiagnostics = (_c = (_a = insideFunctionSpecifics.startRendererDiagnostics) === null || _a === void 0 ? void 0 : _a.call(insideFunctionSpecifics, requestContext.requestId)) !== null && _c !== void 0 ? _c : null;
304
304
  let shouldKeepBrowserOpen = true;
305
305
  let instance;
306
306
  let cancellationRequested = false;
@@ -364,7 +364,7 @@ const rendererHandler = async ({ onStream, options, params, providerSpecifics, r
364
364
  frame: null,
365
365
  type: 'renderer',
366
366
  isFatal: !shouldRetry,
367
- tmpDir: (0, get_tmp_dir_1.getTmpDirStateIfENoSp)(err.stack, insideFunctionSpecifics),
367
+ tmpDir: (_d = (_b = insideFunctionSpecifics.getTmpDirState) === null || _b === void 0 ? void 0 : _b.call(insideFunctionSpecifics, err.stack)) !== null && _d !== void 0 ? _d : null,
368
368
  attempt: params.attempt,
369
369
  totalAttempts: params.retriesLeft + params.attempt,
370
370
  willRetry: shouldRetry,
@@ -374,28 +374,28 @@ const rendererHandler = async ({ onStream, options, params, providerSpecifics, r
374
374
  }
375
375
  finally {
376
376
  stopCancellationPolling();
377
- if (executionMode === 'direct') {
378
- if (!shouldKeepBrowserOpen && instance) {
379
- await instance.instance.close({ silent: true });
377
+ if (!shouldKeepBrowserOpen && instance) {
378
+ try {
379
+ await insideFunctionSpecifics.closeBrowserInstance({
380
+ launchedBrowser: instance,
381
+ });
382
+ }
383
+ catch (err) {
384
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, 'Could not close browser instance after flaky error', err);
380
385
  }
381
386
  }
382
- else if (shouldKeepBrowserOpen && instance) {
387
+ else if (executionMode === 'invoked' &&
388
+ shouldKeepBrowserOpen &&
389
+ instance) {
383
390
  insideFunctionSpecifics.forgetBrowserEventLoop({
384
391
  logLevel: params.logLevel,
385
392
  launchedBrowser: instance,
386
393
  });
387
394
  }
388
- else {
395
+ if (!shouldKeepBrowserOpen) {
389
396
  renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, 'Function did not succeed with flaky error, not keeping browser open.');
390
- renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, 'Waiting 2 seconds to allow for response to be sent');
391
- setTimeout(() => {
392
- renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, 'Quitting Function forcefully now to force not keeping the Function warm.');
393
- process.exit(0);
394
- }, 2000);
395
- }
396
- if (ENABLE_SLOW_LEAK_DETECTION) {
397
- (0, leak_detection_1.startLeakDetection)(leakDetection, requestContext.awsRequestId);
398
397
  }
398
+ finishRendererDiagnostics === null || finishRendererDiagnostics === void 0 ? void 0 : finishRendererDiagnostics();
399
399
  }
400
400
  };
401
401
  exports.rendererHandler = rendererHandler;
@@ -1,7 +1,7 @@
1
1
  import type { CloudProvider, ProviderSpecifics, ServerlessPayload } from '@remotion/serverless-client';
2
2
  import type { InsideFunctionSpecifics } from '../provider-implementation';
3
3
  type Options = {
4
- expectedBucketOwner: string;
4
+ expectedBucketOwner: string | null;
5
5
  timeoutInMilliseconds: number;
6
6
  renderId: string;
7
7
  };
@@ -3,7 +3,7 @@ import type { InsideFunctionSpecifics } from '../provider-implementation';
3
3
  type Options<Provider extends CloudProvider> = {
4
4
  params: ServerlessPayload<Provider>;
5
5
  renderId: string;
6
- expectedBucketOwner: string;
6
+ expectedBucketOwner: string | null;
7
7
  onStream: OnStream<Provider>;
8
8
  timeoutInMilliseconds: number;
9
9
  providerSpecifics: ProviderSpecifics<Provider>;
@@ -9,7 +9,6 @@ const node_path_1 = __importDefault(require("node:path"));
9
9
  const renderer_1 = require("@remotion/renderer");
10
10
  const serverless_client_1 = require("@remotion/serverless-client");
11
11
  const cleanup_serialized_input_props_1 = require("../cleanup-serialized-input-props");
12
- const get_tmp_dir_1 = require("../get-tmp-dir");
13
12
  const on_downloads_helpers_1 = require("../on-downloads-helpers");
14
13
  const overall_render_progress_1 = require("../overall-render-progress");
15
14
  const remove_outname_credentials_1 = require("../remove-outname-credentials");
@@ -122,6 +121,7 @@ const innerStillHandler = async ({ params, expectedBucketOwner, renderId, onStre
122
121
  mediaCacheSizeInBytes: params.mediaCacheSizeInBytes,
123
122
  });
124
123
  const renderMetadata = {
124
+ outputFileIsConditional: null,
125
125
  startedDate: Date.now(),
126
126
  codec: null,
127
127
  compositionId: params.composition,
@@ -315,6 +315,8 @@ const innerStillHandler = async ({ params, expectedBucketOwner, renderId, onStre
315
315
  await server.closeServer(true);
316
316
  };
317
317
  const stillHandler = async (options) => {
318
+ var _a, _b;
319
+ var _c;
318
320
  const { params } = options;
319
321
  const cleanUpFn = [];
320
322
  if (params.type !== serverless_client_1.ServerlessRoutines.still) {
@@ -347,7 +349,7 @@ const stillHandler = async (options) => {
347
349
  frame: params.frame,
348
350
  type: 'renderer',
349
351
  isFatal: false,
350
- tmpDir: (0, get_tmp_dir_1.getTmpDirStateIfENoSp)(err.stack, options.insideFunctionSpecifics),
352
+ tmpDir: (_c = (_b = (_a = options.insideFunctionSpecifics).getTmpDirState) === null || _b === void 0 ? void 0 : _b.call(_a, err.stack)) !== null && _c !== void 0 ? _c : null,
351
353
  attempt: params.attempt,
352
354
  totalAttempts: 1 + params.maxRetries,
353
355
  willRetry,
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export * from '@remotion/serverless-client';
2
- export { forgetBrowserEventLoopImplementation, getBrowserInstanceImplementation, } from './get-browser-instance';
2
+ export { closeBrowserInstanceImplementation, forgetBrowserEventLoopImplementation, getBrowserInstanceImplementation, } from './get-browser-instance';
3
3
  export { compositionsHandler } from './handlers/compositions';
4
4
  export { launchHandler } from './handlers/launch';
5
5
  export { progressHandler } from './handlers/progress';
@@ -9,7 +9,6 @@ export { stillHandler } from './handlers/still';
9
9
  export { infoHandler } from './info';
10
10
  export { innerHandler, innerRoutine } from './inner-routine';
11
11
  export { invokeWebhook } from './invoke-webhook';
12
- export { setCurrentRequestId, stopLeakDetection } from './leak-detection';
13
12
  export * from './provider-implementation';
14
13
  export { ResponseStream } from './streaming/response-stream';
15
14
  export { type ResponseStreamWriter, streamWriter, } from './streaming/stream-writer';
package/dist/index.js CHANGED
@@ -14,9 +14,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.validateComposition = exports.streamWriter = exports.ResponseStream = exports.stopLeakDetection = exports.setCurrentRequestId = exports.invokeWebhook = exports.innerRoutine = exports.innerHandler = exports.infoHandler = exports.stillHandler = exports.startHandler = exports.rendererHandler = exports.progressHandler = exports.launchHandler = exports.compositionsHandler = exports.getBrowserInstanceImplementation = exports.forgetBrowserEventLoopImplementation = void 0;
17
+ exports.validateComposition = exports.streamWriter = exports.ResponseStream = exports.invokeWebhook = exports.innerRoutine = exports.innerHandler = exports.infoHandler = exports.stillHandler = exports.startHandler = exports.rendererHandler = exports.progressHandler = exports.launchHandler = exports.compositionsHandler = exports.getBrowserInstanceImplementation = exports.forgetBrowserEventLoopImplementation = exports.closeBrowserInstanceImplementation = void 0;
18
18
  __exportStar(require("@remotion/serverless-client"), exports);
19
19
  const get_browser_instance_1 = require("./get-browser-instance");
20
+ Object.defineProperty(exports, "closeBrowserInstanceImplementation", { enumerable: true, get: function () { return get_browser_instance_1.closeBrowserInstanceImplementation; } });
20
21
  Object.defineProperty(exports, "forgetBrowserEventLoopImplementation", { enumerable: true, get: function () { return get_browser_instance_1.forgetBrowserEventLoopImplementation; } });
21
22
  Object.defineProperty(exports, "getBrowserInstanceImplementation", { enumerable: true, get: function () { return get_browser_instance_1.getBrowserInstanceImplementation; } });
22
23
  const compositions_1 = require("./handlers/compositions");
@@ -38,9 +39,6 @@ Object.defineProperty(exports, "innerHandler", { enumerable: true, get: function
38
39
  Object.defineProperty(exports, "innerRoutine", { enumerable: true, get: function () { return inner_routine_1.innerRoutine; } });
39
40
  const invoke_webhook_1 = require("./invoke-webhook");
40
41
  Object.defineProperty(exports, "invokeWebhook", { enumerable: true, get: function () { return invoke_webhook_1.invokeWebhook; } });
41
- const leak_detection_1 = require("./leak-detection");
42
- Object.defineProperty(exports, "setCurrentRequestId", { enumerable: true, get: function () { return leak_detection_1.setCurrentRequestId; } });
43
- Object.defineProperty(exports, "stopLeakDetection", { enumerable: true, get: function () { return leak_detection_1.stopLeakDetection; } });
44
42
  __exportStar(require("./provider-implementation"), exports);
45
43
  const response_stream_1 = require("./streaming/response-stream");
46
44
  Object.defineProperty(exports, "ResponseStream", { enumerable: true, get: function () { return response_stream_1.ResponseStream; } });
@@ -11,25 +11,14 @@ const start_1 = require("./handlers/start");
11
11
  const still_1 = require("./handlers/still");
12
12
  const info_1 = require("./info");
13
13
  const is_warm_1 = require("./is-warm");
14
- const leak_detection_1 = require("./leak-detection");
15
14
  const print_logging_grep_helper_1 = require("./print-logging-grep-helper");
16
15
  const s3_renderer_output_1 = require("./s3-renderer-output");
17
16
  const innerHandler = async ({ params, responseWriter, context, providerSpecifics, insideFunctionSpecifics, }) => {
18
- (0, leak_detection_1.setCurrentRequestId)(context.awsRequestId);
19
- process.env.__RESERVED_IS_INSIDE_REMOTION_LAMBDA = 'true';
20
17
  const timeoutInMilliseconds = context.getRemainingTimeInMillis();
21
- renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'AWS Request ID:', context.awsRequestId);
22
- (0, leak_detection_1.stopLeakDetection)();
23
- if (!(context === null || context === void 0 ? void 0 : context.invokedFunctionArn)) {
24
- throw new Error('Lambda function unexpectedly does not have context.invokedFunctionArn');
25
- }
18
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Request ID:', context.requestId);
26
19
  await insideFunctionSpecifics.deleteTmpDir();
27
20
  const isWarm = (0, is_warm_1.getWarm)();
28
21
  (0, is_warm_1.setWarm)();
29
- const currentUserId = context.invokedFunctionArn.split(':')[4];
30
- if (!currentUserId) {
31
- throw new Error('Expected current user ID');
32
- }
33
22
  if (params.type === serverless_client_1.ServerlessRoutines.still) {
34
23
  providerSpecifics.validateDeleteAfter(params.deleteAfter);
35
24
  const renderId = insideFunctionSpecifics.generateRandomId({
@@ -75,7 +64,7 @@ const innerHandler = async ({ params, responseWriter, context, providerSpecifics
75
64
  });
76
65
  }
77
66
  (0, still_1.stillHandler)({
78
- expectedBucketOwner: currentUserId,
67
+ expectedBucketOwner: context.expectedBucketOwner,
79
68
  params,
80
69
  renderId,
81
70
  onStream,
@@ -122,7 +111,7 @@ const innerHandler = async ({ params, responseWriter, context, providerSpecifics
122
111
  const response = await (0, start_1.startHandler)({
123
112
  params,
124
113
  options: {
125
- expectedBucketOwner: currentUserId,
114
+ expectedBucketOwner: context.expectedBucketOwner,
126
115
  timeoutInMilliseconds,
127
116
  renderId,
128
117
  },
@@ -157,7 +146,7 @@ const innerHandler = async ({ params, responseWriter, context, providerSpecifics
157
146
  await (0, launch_1.launchHandler)({
158
147
  params,
159
148
  options: {
160
- expectedBucketOwner: currentUserId,
149
+ expectedBucketOwner: context.expectedBucketOwner,
161
150
  getRemainingTimeInMillis: context.getRemainingTimeInMillis,
162
151
  requestContext: context,
163
152
  },
@@ -178,7 +167,7 @@ const innerHandler = async ({ params, responseWriter, context, providerSpecifics
178
167
  const response = await (0, progress_1.progressHandler)({
179
168
  params,
180
169
  options: {
181
- expectedBucketOwner: currentUserId,
170
+ expectedBucketOwner: context.expectedBucketOwner,
182
171
  timeoutInMilliseconds,
183
172
  retriesRemaining: 2,
184
173
  providerSpecifics,
@@ -204,7 +193,7 @@ const innerHandler = async ({ params, responseWriter, context, providerSpecifics
204
193
  const s3Output = transport === 's3'
205
194
  ? (0, s3_renderer_output_1.makeS3RendererOutput)({
206
195
  params,
207
- expectedBucketOwner: currentUserId,
196
+ expectedBucketOwner: context.expectedBucketOwner,
208
197
  region,
209
198
  providerSpecifics,
210
199
  })
@@ -215,7 +204,7 @@ const innerHandler = async ({ params, responseWriter, context, providerSpecifics
215
204
  (0, renderer_2.rendererHandler)({
216
205
  params,
217
206
  options: {
218
- expectedBucketOwner: currentUserId,
207
+ expectedBucketOwner: context.expectedBucketOwner,
219
208
  isWarm,
220
209
  },
221
210
  onStream: s3Output
@@ -272,7 +261,7 @@ const innerHandler = async ({ params, responseWriter, context, providerSpecifics
272
261
  const response = await (0, compositions_1.compositionsHandler)({
273
262
  params,
274
263
  options: {
275
- expectedBucketOwner: currentUserId,
264
+ expectedBucketOwner: context.expectedBucketOwner,
276
265
  },
277
266
  providerSpecifics,
278
267
  insideFunctionSpecifics,
@@ -6,7 +6,7 @@ import type { InsideFunctionSpecifics } from './provider-implementation';
6
6
  export declare const mergeChunksAndFinishRender: <Provider extends CloudProvider<string, Record<string, unknown>, Record<string, unknown>, string, object>>(options: {
7
7
  bucketName: string;
8
8
  renderId: string;
9
- expectedBucketOwner: string;
9
+ expectedBucketOwner: string | null;
10
10
  numberOfFrames: number;
11
11
  codec: "aac" | "gif" | "h264" | "h265" | "mp3" | "prores" | "vp8" | "vp9" | "wav";
12
12
  chunkCount: number;
@@ -25,7 +25,7 @@ export declare const makeInitialOverallRenderProgress: <Provider extends CloudPr
25
25
  export declare const makeOverallRenderProgress: <Provider extends CloudProvider<string, Record<string, unknown>, Record<string, unknown>, string, object>>({ renderId, bucketName, expectedBucketOwner, region, timeoutTimestamp, logLevel, providerSpecifics, forcePathStyle, cancellationEnabled, }: {
26
26
  renderId: string;
27
27
  bucketName: string;
28
- expectedBucketOwner: string;
28
+ expectedBucketOwner: string | null;
29
29
  region: Provider["region"];
30
30
  timeoutTimestamp: number;
31
31
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
@@ -1,6 +1,6 @@
1
1
  import type { BundlerInternals } from '@remotion/bundler';
2
2
  import type { ChromiumOptions, EmittedArtifact, LogLevel, X264Preset } from '@remotion/renderer';
3
- import type { CloudProvider, DeleteAfter, GetFolderFiles, Privacy, ProviderSpecifics, ReceivedArtifact, WebhookPayload } from '@remotion/serverless-client';
3
+ import type { CloudProvider, DeleteAfter, FunctionErrorInfo, Privacy, ProviderSpecifics, ReceivedArtifact, WebhookPayload } from '@remotion/serverless-client';
4
4
  import type { LaunchedBrowser } from './get-browser-instance';
5
5
  export type MakeArtifactWithDetails<Provider extends CloudProvider> = (params: {
6
6
  region: Provider['region'];
@@ -22,6 +22,9 @@ export type ForgetBrowserEventLoop = (options: {
22
22
  logLevel: LogLevel;
23
23
  launchedBrowser: LaunchedBrowser;
24
24
  }) => void;
25
+ export type CloseBrowserInstance = (options: {
26
+ launchedBrowser: LaunchedBrowser;
27
+ }) => Promise<void>;
25
28
  export type GenerateRenderId = (options: {
26
29
  deleteAfter: DeleteAfter | null;
27
30
  randomHashFn: () => string;
@@ -67,7 +70,7 @@ export type CreateFunction<Provider extends CloudProvider> = (options: CreateFun
67
70
  FunctionName: string;
68
71
  }>;
69
72
  export type InvokeWebhookOptions = {
70
- payload: WebhookPayload;
73
+ payload: WebhookPayload<string | null>;
71
74
  url: string;
72
75
  secret: string | null;
73
76
  };
@@ -82,6 +85,7 @@ export type InsideFunctionSpecifics<Provider extends CloudProvider> = {
82
85
  defaultX264Preset: X264Preset | null;
83
86
  getBrowserInstance: GetBrowserInstance;
84
87
  forgetBrowserEventLoop: ForgetBrowserEventLoop;
88
+ closeBrowserInstance: CloseBrowserInstance;
85
89
  timer: DebuggingTimer;
86
90
  generateRandomId: GenerateRenderId;
87
91
  deleteTmpDir: () => Promise<void>;
@@ -90,7 +94,12 @@ export type InsideFunctionSpecifics<Provider extends CloudProvider> = {
90
94
  invokeWebhook: InvokeWebhook;
91
95
  getCurrentRegionInFunction: () => Provider['region'];
92
96
  makeArtifactWithDetails: MakeArtifactWithDetails<Provider>;
93
- getFolderFiles: GetFolderFiles;
97
+ normalizeChromiumOptions: ((options: {
98
+ chromiumOptions: ChromiumOptions;
99
+ logLevel: LogLevel;
100
+ }) => ChromiumOptions) | null;
101
+ getTmpDirState: ((error: string) => FunctionErrorInfo['tmpDir']) | null;
102
+ startRendererDiagnostics: ((requestId: string) => () => void) | null;
94
103
  };
95
104
  export type FullClientSpecifics<Provider extends CloudProvider> = {
96
105
  id: '__remotion_full_client_specifics';
@@ -2,7 +2,7 @@ import type { EmittedArtifact } from '@remotion/renderer';
2
2
  import type { CloudProvider, OnStream, ProviderSpecifics, S3RendererArtifactMetadata, ServerlessPayload } from '@remotion/serverless-client';
3
3
  export declare const makeS3RendererOutput: <Provider extends CloudProvider<string, Record<string, unknown>, Record<string, unknown>, string, object>>({ params, expectedBucketOwner, region, providerSpecifics, }: {
4
4
  params: ServerlessPayload<Provider>;
5
- expectedBucketOwner: string;
5
+ expectedBucketOwner: string | null;
6
6
  region: Provider["region"];
7
7
  providerSpecifics: ProviderSpecifics<Provider>;
8
8
  }) => {
@@ -13,5 +13,5 @@ export declare const renderRendererFunctionWithRetry: <Provider extends CloudPro
13
13
  providerSpecifics: ProviderSpecifics<Provider>;
14
14
  insideFunctionSpecifics: InsideFunctionSpecifics<Provider>;
15
15
  requestHandler: Provider["requestHandler"] | null;
16
- expectedBucketOwner: string;
16
+ expectedBucketOwner: string | null;
17
17
  }) => Promise<unknown>;
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.522",
6
+ "version": "4.0.523",
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.522",
27
- "@remotion/bundler": "4.0.522",
28
- "@remotion/licensing": "4.0.522",
29
- "@remotion/serverless-client": "4.0.522"
26
+ "@remotion/renderer": "4.0.523",
27
+ "@remotion/bundler": "4.0.523",
28
+ "@remotion/licensing": "4.0.523",
29
+ "@remotion/serverless-client": "4.0.523"
30
30
  },
31
31
  "devDependencies": {
32
- "@remotion/eslint-config-internal": "4.0.522",
32
+ "@remotion/eslint-config-internal": "4.0.523",
33
33
  "eslint": "9.19.0",
34
34
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
35
35
  },