@remotion/renderer 4.0.255 → 4.0.256

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 (58) hide show
  1. package/dist/browser/Browser.d.ts +23 -6
  2. package/dist/browser/Browser.js +22 -12
  3. package/dist/browser/BrowserConnector.d.ts +19 -0
  4. package/dist/browser/BrowserConnector.js +17 -0
  5. package/dist/browser/BrowserPage.d.ts +5 -2
  6. package/dist/browser/BrowserPage.js +4 -2
  7. package/dist/browser/Launcher.js +1 -1
  8. package/dist/browser/PuppeteerNode.d.ts +30 -0
  9. package/dist/browser/PuppeteerNode.js +52 -0
  10. package/dist/browser/Target.d.ts +7 -1
  11. package/dist/browser/Target.js +6 -1
  12. package/dist/browser/mitt/index.js +3 -3
  13. package/dist/browser/node.d.ts +2 -0
  14. package/dist/browser/node.js +5 -0
  15. package/dist/browser-instances.js +1 -1
  16. package/dist/can-use-parallel-encoding.d.ts +1 -0
  17. package/dist/can-use-parallel-encoding.js +9 -1
  18. package/dist/client.d.ts +2 -2
  19. package/dist/copy-to-clipboard.d.ts +2 -0
  20. package/dist/copy-to-clipboard.js +18 -0
  21. package/dist/cycle-browser-tabs.d.ts +6 -1
  22. package/dist/cycle-browser-tabs.js +2 -2
  23. package/dist/example-videos.d.ts +34 -0
  24. package/dist/example-videos.js +43 -0
  25. package/dist/get-browser-instance.d.ts +2 -1
  26. package/dist/get-browser-instance.js +14 -4
  27. package/dist/get-codec-name.d.ts +1 -1
  28. package/dist/get-compositions.js +1 -0
  29. package/dist/get-local-browser.d.ts +1 -0
  30. package/dist/get-local-browser.js +19 -0
  31. package/dist/index.d.ts +3 -3
  32. package/dist/make-page.d.ts +27 -0
  33. package/dist/make-page.js +71 -0
  34. package/dist/next-frame-to-render.d.ts +10 -0
  35. package/dist/next-frame-to-render.js +35 -0
  36. package/dist/open-browser.js +3 -3
  37. package/dist/options/gl.d.ts +1 -1
  38. package/dist/options/index.d.ts +2 -2
  39. package/dist/options/metadata.d.ts +1 -1
  40. package/dist/options/webhook-custom-data.d.ts +1 -1
  41. package/dist/pool.d.ts +7 -6
  42. package/dist/render-frame-and-retry-target-close.d.ts +50 -0
  43. package/dist/render-frame-and-retry-target-close.js +165 -0
  44. package/dist/render-frame-with-option-to-reject.d.ts +43 -0
  45. package/dist/render-frame-with-option-to-reject.js +136 -0
  46. package/dist/render-frame.d.ts +43 -0
  47. package/dist/render-frame.js +46 -0
  48. package/dist/render-frames.js +86 -312
  49. package/dist/render-partitions.d.ts +7 -0
  50. package/dist/render-partitions.js +50 -0
  51. package/dist/render-still.js +7 -2
  52. package/dist/replace-browser.js +1 -1
  53. package/dist/select-composition.js +1 -0
  54. package/dist/take-frame-and-compose.d.ts +22 -0
  55. package/dist/take-frame-and-compose.js +100 -0
  56. package/dist/test-gpu.js +1 -0
  57. package/ensure-browser.mjs +458 -514
  58. package/package.json +12 -12
@@ -9,7 +9,7 @@ export declare const hasSpecifiedUnsupportedHardwareQualifySettings: ({ encoding
9
9
  encodingMaxRate: string | null;
10
10
  encodingBufferSize: string | null;
11
11
  crf: unknown;
12
- }) => "crf" | "encodingBufferSize" | "encodingMaxRate" | null;
12
+ }) => "encodingMaxRate" | "encodingBufferSize" | "crf" | null;
13
13
  export declare const getCodecName: ({ codec, encodingMaxRate, encodingBufferSize, crf, hardwareAcceleration, logLevel, indent, }: {
14
14
  codec: Codec;
15
15
  hardwareAcceleration: HardwareAccelerationOption;
@@ -91,6 +91,7 @@ const internalGetCompositionsRaw = async ({ browserExecutable, chromiumOptions,
91
91
  logLevel,
92
92
  onBrowserDownload,
93
93
  chromeMode,
94
+ pageIndex: 0,
94
95
  });
95
96
  const cleanup = [cleanupPage];
96
97
  return new Promise((resolve, reject) => {
@@ -0,0 +1 @@
1
+ export declare const getLocalBrowser: () => null;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getLocalBrowser = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const getSearchPathsForProduct = () => {
9
+ return [];
10
+ };
11
+ const getLocalBrowser = () => {
12
+ for (const p of getSearchPathsForProduct()) {
13
+ if (fs_1.default.existsSync(p)) {
14
+ return p;
15
+ }
16
+ }
17
+ return null;
18
+ };
19
+ exports.getLocalBrowser = getLocalBrowser;
package/dist/index.d.ts CHANGED
@@ -140,7 +140,7 @@ export declare const RenderInternals: {
140
140
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
141
141
  DEFAULT_BROWSER: "chrome";
142
142
  validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
143
- DEFAULT_OPENGL_RENDERER: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
143
+ DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
144
144
  validateOpenGlRenderer: (option: unknown) => import("./options/gl").OpenGlRenderer | null;
145
145
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "h264-ts", "gif"];
146
146
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
@@ -353,8 +353,8 @@ export declare const RenderInternals: {
353
353
  }) => execa.ExecaChildProcess<string>;
354
354
  validStillImageFormats: readonly ["png", "jpeg", "pdf", "webp"];
355
355
  validVideoImageFormats: readonly ["png", "jpeg", "none"];
356
- DEFAULT_STILL_IMAGE_FORMAT: "jpeg" | "png" | "webp" | "pdf";
357
- DEFAULT_VIDEO_IMAGE_FORMAT: "jpeg" | "png" | "none";
356
+ DEFAULT_STILL_IMAGE_FORMAT: "png" | "jpeg" | "pdf" | "webp";
357
+ DEFAULT_VIDEO_IMAGE_FORMAT: "png" | "jpeg" | "none";
358
358
  DEFAULT_JPEG_QUALITY: number;
359
359
  chalk: {
360
360
  enabled: () => boolean;
@@ -0,0 +1,27 @@
1
+ import type { VideoConfig } from 'remotion/no-react';
2
+ import type { BrowserLog } from './browser-log';
3
+ import type { Page } from './browser/BrowserPage';
4
+ import type { SourceMapGetter } from './browser/source-map-getter';
5
+ import type { VideoImageFormat } from './image-format';
6
+ import type { LogLevel } from './log-level';
7
+ import type { BrowserReplacer } from './replace-browser';
8
+ export declare const makePage: ({ context, initialFrame, browserReplacer, logLevel, indent, pagesArray, onBrowserLog, scale, timeoutInMilliseconds, composition, proxyPort, serveUrl, muted, envVariables, serializedInputPropsWithCustomSchema, imageFormat, serializedResolvedPropsWithCustomSchema, pageIndex, }: {
9
+ context: SourceMapGetter;
10
+ initialFrame: number;
11
+ browserReplacer: BrowserReplacer;
12
+ logLevel: LogLevel;
13
+ indent: boolean;
14
+ pagesArray: Page[];
15
+ onBrowserLog: ((log: BrowserLog) => void) | undefined | null;
16
+ scale: number;
17
+ timeoutInMilliseconds: number;
18
+ composition: Omit<VideoConfig, "defaultProps" | "props">;
19
+ proxyPort: number;
20
+ serveUrl: string;
21
+ muted: boolean;
22
+ envVariables: Record<string, string>;
23
+ serializedInputPropsWithCustomSchema: string;
24
+ serializedResolvedPropsWithCustomSchema: string;
25
+ imageFormat: VideoImageFormat;
26
+ pageIndex: number;
27
+ }) => Promise<Page>;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makePage = void 0;
4
+ const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
5
+ const set_props_and_env_1 = require("./set-props-and-env");
6
+ const makePage = async ({ context, initialFrame, browserReplacer, logLevel, indent, pagesArray, onBrowserLog, scale, timeoutInMilliseconds, composition, proxyPort, serveUrl, muted, envVariables, serializedInputPropsWithCustomSchema, imageFormat, serializedResolvedPropsWithCustomSchema, pageIndex, }) => {
7
+ const page = await browserReplacer
8
+ .getBrowser()
9
+ .newPage({ context, logLevel, indent, pageIndex });
10
+ pagesArray.push(page);
11
+ await page.setViewport({
12
+ width: composition.width,
13
+ height: composition.height,
14
+ deviceScaleFactor: scale,
15
+ });
16
+ const logCallback = (log) => {
17
+ onBrowserLog === null || onBrowserLog === void 0 ? void 0 : onBrowserLog({
18
+ stackTrace: log.stackTrace(),
19
+ text: log.text,
20
+ type: log.type,
21
+ });
22
+ };
23
+ if (onBrowserLog) {
24
+ page.on('console', logCallback);
25
+ }
26
+ await (0, set_props_and_env_1.setPropsAndEnv)({
27
+ serializedInputPropsWithCustomSchema,
28
+ envVariables,
29
+ page,
30
+ serveUrl,
31
+ initialFrame,
32
+ timeoutInMilliseconds,
33
+ proxyPort,
34
+ retriesRemaining: 2,
35
+ audioEnabled: !muted,
36
+ videoEnabled: imageFormat !== 'none',
37
+ indent,
38
+ logLevel,
39
+ onServeUrlVisited: () => undefined,
40
+ });
41
+ await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
42
+ // eslint-disable-next-line max-params
43
+ pageFunction: (id, props, durationInFrames, fps, height, width, defaultCodec) => {
44
+ window.remotion_setBundleMode({
45
+ type: 'composition',
46
+ compositionName: id,
47
+ serializedResolvedPropsWithSchema: props,
48
+ compositionDurationInFrames: durationInFrames,
49
+ compositionFps: fps,
50
+ compositionHeight: height,
51
+ compositionWidth: width,
52
+ compositionDefaultCodec: defaultCodec,
53
+ });
54
+ },
55
+ args: [
56
+ composition.id,
57
+ serializedResolvedPropsWithCustomSchema,
58
+ composition.durationInFrames,
59
+ composition.fps,
60
+ composition.height,
61
+ composition.width,
62
+ composition.defaultCodec,
63
+ ],
64
+ frame: null,
65
+ page,
66
+ timeoutInMilliseconds,
67
+ });
68
+ page.off('console', logCallback);
69
+ return page;
70
+ };
71
+ exports.makePage = makePage;
@@ -0,0 +1,10 @@
1
+ export declare const nextFrameToRenderState: ({ allFramesAndExtraFrames, concurrencyOrFramesToRender: _concurrency, }: {
2
+ allFramesAndExtraFrames: number[];
3
+ concurrencyOrFramesToRender: number;
4
+ }) => {
5
+ getNextFrame: (_pageIndex: number) => number;
6
+ };
7
+ type Fn = typeof nextFrameToRenderState;
8
+ export type NextFrameToRender = ReturnType<Fn>;
9
+ export declare const partitionedNextFrameToRenderState: Fn;
10
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.partitionedNextFrameToRenderState = exports.nextFrameToRenderState = void 0;
4
+ const render_partitions_1 = require("./render-partitions");
5
+ const nextFrameToRenderState = ({ allFramesAndExtraFrames,
6
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
7
+ concurrencyOrFramesToRender: _concurrency, }) => {
8
+ const rendered = new Map();
9
+ return {
10
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
11
+ getNextFrame: (_pageIndex) => {
12
+ const nextFrame = allFramesAndExtraFrames.find((frame) => {
13
+ return !rendered.has(frame);
14
+ });
15
+ if (nextFrame === undefined) {
16
+ throw new Error('No more frames to render');
17
+ }
18
+ rendered.set(nextFrame, true);
19
+ return nextFrame;
20
+ },
21
+ };
22
+ };
23
+ exports.nextFrameToRenderState = nextFrameToRenderState;
24
+ const partitionedNextFrameToRenderState = ({ allFramesAndExtraFrames, concurrencyOrFramesToRender: concurrency, }) => {
25
+ const partitions = (0, render_partitions_1.renderPartitions)({
26
+ frames: allFramesAndExtraFrames,
27
+ concurrency,
28
+ });
29
+ return {
30
+ getNextFrame: (pageIndex) => {
31
+ return partitions.getNextFrame(pageIndex);
32
+ },
33
+ };
34
+ };
35
+ exports.partitionedNextFrameToRenderState = partitionedNextFrameToRenderState;
@@ -51,7 +51,7 @@ const getOpenGlRenderer = (option) => {
51
51
  return [`--use-gl=${renderer}`];
52
52
  };
53
53
  const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, onBrowserDownload, chromeMode, }) => {
54
- var _a, _b, _c;
54
+ var _a, _b, _c, _d;
55
55
  // @ts-expect-error Firefox
56
56
  if (browser === 'firefox') {
57
57
  throw new TypeError('Firefox supported is not yet turned on. Stay tuned for the future.');
@@ -165,8 +165,8 @@ const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions
165
165
  deviceScaleFactor: 1,
166
166
  },
167
167
  });
168
- const pages = await browserInstance.pages(logLevel, indent);
169
- await pages[0].close();
168
+ const pages = await browserInstance.pages();
169
+ await ((_d = pages[0]) === null || _d === void 0 ? void 0 : _d.close());
170
170
  (0, browser_instances_1.addHeadlessBrowser)(browserInstance);
171
171
  return browserInstance;
172
172
  };
@@ -1,7 +1,7 @@
1
1
  export declare const validOpenGlRenderers: readonly ["swangle", "angle", "egl", "swiftshader", "vulkan", "angle-egl"];
2
2
  export type OpenGlRenderer = (typeof validOpenGlRenderers)[number];
3
3
  export declare const DEFAULT_OPENGL_RENDERER: OpenGlRenderer | null;
4
- export declare const getChromiumOpenGlRenderer: () => "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
4
+ export declare const getChromiumOpenGlRenderer: () => "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
5
5
  export declare const setChromiumOpenGlRenderer: (renderer: OpenGlRenderer) => void;
6
6
  export declare const glOption: {
7
7
  cliFlag: "gl";
@@ -171,7 +171,7 @@ export declare const allOptions: {
171
171
  webhookCustomDataOption: {
172
172
  name: string;
173
173
  cliFlag: "webhook-custom-data";
174
- description: (type: "ssr" | "cli") => import("react/jsx-runtime").JSX.Element;
174
+ description: (type: "cli" | "ssr") => import("react/jsx-runtime").JSX.Element;
175
175
  ssrName: "customData";
176
176
  docLink: string;
177
177
  type: Record<string, unknown> | null;
@@ -584,7 +584,7 @@ export declare const allOptions: {
584
584
  metadataOption: {
585
585
  name: string;
586
586
  cliFlag: "metadata";
587
- description: (mode: "ssr" | "cli") => import("react/jsx-runtime").JSX.Element;
587
+ description: (mode: "cli" | "ssr") => import("react/jsx-runtime").JSX.Element;
588
588
  docLink: string;
589
589
  type: import("./metadata").Metadata;
590
590
  getValue: ({ commandLine }: {
@@ -2,7 +2,7 @@ export type Metadata = Record<string, string>;
2
2
  export declare const metadataOption: {
3
3
  name: string;
4
4
  cliFlag: "metadata";
5
- description: (mode: "ssr" | "cli") => import("react/jsx-runtime").JSX.Element;
5
+ description: (mode: "cli" | "ssr") => import("react/jsx-runtime").JSX.Element;
6
6
  docLink: string;
7
7
  type: Metadata;
8
8
  getValue: ({ commandLine }: {
@@ -1,7 +1,7 @@
1
1
  export declare const webhookCustomDataOption: {
2
2
  name: string;
3
3
  cliFlag: "webhook-custom-data";
4
- description: (type: "ssr" | "cli") => import("react/jsx-runtime").JSX.Element;
4
+ description: (type: "cli" | "ssr") => import("react/jsx-runtime").JSX.Element;
5
5
  ssrName: "customData";
6
6
  docLink: string;
7
7
  type: Record<string, unknown> | null;
package/dist/pool.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- export declare class Pool<T> {
2
- resources: T[];
3
- waiters: ((r: T) => void)[];
4
- constructor(resources: T[]);
5
- acquire(): Promise<T>;
6
- release(resource: T): void;
1
+ import type { Page } from './browser/BrowserPage';
2
+ export declare class Pool {
3
+ resources: Page[];
4
+ waiters: ((r: Page) => void)[];
5
+ constructor(resources: Page[]);
6
+ acquire(): Promise<Page>;
7
+ release(resource: Page): void;
7
8
  }
@@ -0,0 +1,50 @@
1
+ import type { VideoConfig } from 'remotion/no-react';
2
+ import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
+ import type { DownloadMap } from './assets/download-map';
4
+ import type { HeadlessBrowser } from './browser/Browser';
5
+ import type { Page } from './browser/BrowserPage';
6
+ import type { CountType } from './get-frame-padded-index';
7
+ import type { VideoImageFormat } from './image-format';
8
+ import type { LogLevel } from './log-level';
9
+ import type { CancelSignal } from './make-cancel-signal';
10
+ import type { NextFrameToRender } from './next-frame-to-render';
11
+ import type { Pool } from './pool';
12
+ import type { FrameAndAssets, OnArtifact } from './render-frames';
13
+ import type { BrowserReplacer } from './replace-browser';
14
+ export declare const renderFrameAndRetryTargetClose: ({ retriesLeft, attempt, assets, imageFormat, binariesDirectory, cancelSignal, composition, countType, downloadMap, frameDir, framesToRender, jpegQuality, onArtifact, onDownload, onError, outputDir, poolPromise, scale, stoppedSignal, timeoutInMilliseconds, indent, logLevel, makeBrowser, makeNewPage, browserReplacer, concurrencyOrFramesToRender, framesRenderedObj, lastFrame, onFrameBuffer, onFrameUpdate, nextFrameToRender, }: {
15
+ retriesLeft: number;
16
+ attempt: number;
17
+ imageFormat: VideoImageFormat;
18
+ cancelSignal: CancelSignal | undefined;
19
+ binariesDirectory: string | null;
20
+ poolPromise: Promise<Pool>;
21
+ jpegQuality: number;
22
+ frameDir: string;
23
+ scale: number;
24
+ countType: CountType;
25
+ assets: FrameAndAssets[];
26
+ framesToRender: number[];
27
+ onArtifact: OnArtifact | null;
28
+ onDownload: RenderMediaOnDownload | null;
29
+ downloadMap: DownloadMap;
30
+ composition: Omit<VideoConfig, "defaultProps" | "props">;
31
+ onError: (err: Error) => void;
32
+ stoppedSignal: {
33
+ stopped: boolean;
34
+ };
35
+ timeoutInMilliseconds: number;
36
+ outputDir: string | null;
37
+ indent: boolean;
38
+ logLevel: LogLevel;
39
+ makeBrowser: () => Promise<HeadlessBrowser>;
40
+ makeNewPage: (frame: number, pageIndex: number) => Promise<Page>;
41
+ browserReplacer: BrowserReplacer;
42
+ concurrencyOrFramesToRender: number;
43
+ lastFrame: number;
44
+ framesRenderedObj: {
45
+ count: number;
46
+ };
47
+ onFrameBuffer: null | ((buffer: Buffer, frame: number) => void) | undefined;
48
+ onFrameUpdate: null | ((framesRendered: number, frameIndex: number, timeToRenderInMilliseconds: number) => void);
49
+ nextFrameToRender: NextFrameToRender;
50
+ }) => Promise<void>;
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderFrameAndRetryTargetClose = void 0;
4
+ const no_react_1 = require("remotion/no-react");
5
+ const flaky_errors_1 = require("./browser/flaky-errors");
6
+ const is_delay_render_error_with_retry_1 = require("./is-delay-render-error-with-retry");
7
+ const logger_1 = require("./logger");
8
+ const make_cancel_signal_1 = require("./make-cancel-signal");
9
+ const render_frame_1 = require("./render-frame");
10
+ const renderFrameAndRetryTargetClose = async ({ retriesLeft, attempt, assets, imageFormat, binariesDirectory, cancelSignal, composition, countType, downloadMap, frameDir, framesToRender, jpegQuality, onArtifact, onDownload, onError, outputDir, poolPromise, scale, stoppedSignal, timeoutInMilliseconds, indent, logLevel, makeBrowser, makeNewPage, browserReplacer, concurrencyOrFramesToRender, framesRenderedObj, lastFrame, onFrameBuffer, onFrameUpdate, nextFrameToRender, }) => {
11
+ var _a;
12
+ const currentPool = await poolPromise;
13
+ if (stoppedSignal.stopped) {
14
+ return;
15
+ }
16
+ const freePage = await currentPool.acquire();
17
+ const frame = nextFrameToRender.getNextFrame(freePage.pageIndex);
18
+ try {
19
+ await Promise.race([
20
+ (0, render_frame_1.renderFrame)({
21
+ attempt,
22
+ assets,
23
+ binariesDirectory,
24
+ cancelSignal,
25
+ countType,
26
+ downloadMap,
27
+ frameDir,
28
+ framesToRender,
29
+ imageFormat,
30
+ indent,
31
+ jpegQuality,
32
+ logLevel,
33
+ onArtifact,
34
+ onDownload,
35
+ scale,
36
+ composition,
37
+ framesRenderedObj,
38
+ lastFrame,
39
+ onError,
40
+ onFrameBuffer,
41
+ onFrameUpdate,
42
+ outputDir,
43
+ stoppedSignal,
44
+ timeoutInMilliseconds,
45
+ nextFrameToRender,
46
+ frame,
47
+ page: freePage,
48
+ }),
49
+ new Promise((_, reject) => {
50
+ cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
51
+ reject(new Error(make_cancel_signal_1.cancelErrorMessages.renderFrames));
52
+ });
53
+ }),
54
+ ]);
55
+ currentPool.release(freePage);
56
+ }
57
+ catch (err) {
58
+ const isTargetClosedError = (0, flaky_errors_1.isTargetClosedErr)(err);
59
+ const shouldRetryError = (_a = err.stack) === null || _a === void 0 ? void 0 : _a.includes(no_react_1.NoReactInternals.DELAY_RENDER_RETRY_TOKEN);
60
+ const flakyNetworkError = (0, flaky_errors_1.isFlakyNetworkError)(err);
61
+ if ((0, make_cancel_signal_1.isUserCancelledRender)(err) && !shouldRetryError) {
62
+ throw err;
63
+ }
64
+ if (!isTargetClosedError && !shouldRetryError && !flakyNetworkError) {
65
+ throw err;
66
+ }
67
+ if (stoppedSignal.stopped) {
68
+ return;
69
+ }
70
+ if (retriesLeft === 0) {
71
+ logger_1.Log.warn({
72
+ indent,
73
+ logLevel,
74
+ }, `The browser crashed ${attempt} times while rendering frame ${frame}. Not retrying anymore. Learn more about this error under https://www.remotion.dev/docs/target-closed`);
75
+ throw err;
76
+ }
77
+ if (shouldRetryError) {
78
+ const pool = await poolPromise;
79
+ // Replace the closed page
80
+ const newPage = await makeNewPage(frame, freePage.pageIndex);
81
+ pool.release(newPage);
82
+ logger_1.Log.warn({ indent, logLevel }, `delayRender() timed out while rendering frame ${frame}: ${err.message}`);
83
+ const actualRetriesLeft = (0, is_delay_render_error_with_retry_1.getRetriesLeftFromError)(err);
84
+ return (0, exports.renderFrameAndRetryTargetClose)({
85
+ retriesLeft: actualRetriesLeft,
86
+ attempt: attempt + 1,
87
+ assets,
88
+ imageFormat,
89
+ binariesDirectory,
90
+ cancelSignal,
91
+ composition,
92
+ countType,
93
+ downloadMap,
94
+ frameDir,
95
+ framesToRender,
96
+ indent,
97
+ jpegQuality,
98
+ logLevel,
99
+ onArtifact,
100
+ onDownload,
101
+ onError,
102
+ outputDir,
103
+ poolPromise,
104
+ scale,
105
+ stoppedSignal,
106
+ timeoutInMilliseconds,
107
+ makeBrowser,
108
+ makeNewPage,
109
+ browserReplacer,
110
+ concurrencyOrFramesToRender,
111
+ framesRenderedObj,
112
+ lastFrame,
113
+ onFrameBuffer,
114
+ onFrameUpdate,
115
+ nextFrameToRender,
116
+ });
117
+ }
118
+ logger_1.Log.warn({ indent, logLevel }, `The browser crashed while rendering frame ${frame}, retrying ${retriesLeft} more times. Learn more about this error under https://www.remotion.dev/docs/target-closed`);
119
+ // Replace the entire browser
120
+ await browserReplacer.replaceBrowser(makeBrowser, async () => {
121
+ const pages = new Array(concurrencyOrFramesToRender)
122
+ .fill(true)
123
+ .map((_, i) => makeNewPage(frame, i));
124
+ const puppeteerPages = await Promise.all(pages);
125
+ const pool = await poolPromise;
126
+ for (const newPage of puppeteerPages) {
127
+ pool.release(newPage);
128
+ }
129
+ });
130
+ await (0, exports.renderFrameAndRetryTargetClose)({
131
+ retriesLeft: retriesLeft - 1,
132
+ attempt: attempt + 1,
133
+ assets,
134
+ binariesDirectory,
135
+ cancelSignal,
136
+ composition,
137
+ countType,
138
+ downloadMap,
139
+ frameDir,
140
+ framesToRender,
141
+ imageFormat,
142
+ indent,
143
+ jpegQuality,
144
+ logLevel,
145
+ onArtifact,
146
+ makeBrowser,
147
+ onDownload,
148
+ onError,
149
+ outputDir,
150
+ poolPromise,
151
+ scale,
152
+ stoppedSignal,
153
+ timeoutInMilliseconds,
154
+ browserReplacer,
155
+ makeNewPage,
156
+ concurrencyOrFramesToRender,
157
+ framesRenderedObj,
158
+ lastFrame,
159
+ onFrameBuffer,
160
+ onFrameUpdate,
161
+ nextFrameToRender,
162
+ });
163
+ }
164
+ };
165
+ exports.renderFrameAndRetryTargetClose = renderFrameAndRetryTargetClose;
@@ -0,0 +1,43 @@
1
+ import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
2
+ import type { DownloadMap } from './assets/download-map';
3
+ import type { Page } from './browser/BrowserPage';
4
+ import type { CountType } from './get-frame-padded-index';
5
+ import type { VideoImageFormat } from './image-format';
6
+ import type { LogLevel } from './log-level';
7
+ import type { CancelSignal } from './make-cancel-signal';
8
+ import type { FrameAndAssets, OnArtifact } from './render-frames';
9
+ export declare const renderFrameWithOptionToReject: ({ reject, width, height, compId, attempt, stoppedSignal, indent, logLevel, timeoutInMilliseconds, outputDir, onFrameBuffer, imageFormat, onError, lastFrame, jpegQuality, frameDir, scale, countType, assets, framesToRender, onArtifact, onDownload, downloadMap, binariesDirectory, cancelSignal, framesRenderedObj, onFrameUpdate, frame, page, }: {
10
+ reject: (err: Error) => void;
11
+ width: number;
12
+ height: number;
13
+ compId: string;
14
+ attempt: number;
15
+ stoppedSignal: {
16
+ stopped: boolean;
17
+ };
18
+ timeoutInMilliseconds: number;
19
+ indent: boolean;
20
+ logLevel: LogLevel;
21
+ outputDir: string | null;
22
+ onFrameBuffer: null | ((buffer: Buffer, frame: number) => void) | undefined;
23
+ imageFormat: VideoImageFormat;
24
+ onError: (err: Error) => void;
25
+ lastFrame: number;
26
+ jpegQuality: number;
27
+ frameDir: string;
28
+ scale: number;
29
+ countType: CountType;
30
+ assets: FrameAndAssets[];
31
+ framesToRender: number[];
32
+ onArtifact: OnArtifact | null;
33
+ onDownload: RenderMediaOnDownload | null;
34
+ downloadMap: DownloadMap;
35
+ binariesDirectory: string | null;
36
+ cancelSignal: CancelSignal | undefined;
37
+ framesRenderedObj: {
38
+ count: number;
39
+ };
40
+ onFrameUpdate: null | ((framesRendered: number, frameIndex: number, timeToRenderInMilliseconds: number) => void);
41
+ frame: number;
42
+ page: Page;
43
+ }) => Promise<undefined>;