@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.
- package/dist/browser/Browser.d.ts +23 -6
- package/dist/browser/Browser.js +22 -12
- package/dist/browser/BrowserConnector.d.ts +19 -0
- package/dist/browser/BrowserConnector.js +17 -0
- package/dist/browser/BrowserPage.d.ts +5 -2
- package/dist/browser/BrowserPage.js +4 -2
- package/dist/browser/Launcher.js +1 -1
- package/dist/browser/PuppeteerNode.d.ts +30 -0
- package/dist/browser/PuppeteerNode.js +52 -0
- package/dist/browser/Target.d.ts +7 -1
- package/dist/browser/Target.js +6 -1
- package/dist/browser/mitt/index.js +3 -3
- package/dist/browser/node.d.ts +2 -0
- package/dist/browser/node.js +5 -0
- package/dist/browser-instances.js +1 -1
- package/dist/can-use-parallel-encoding.d.ts +1 -0
- package/dist/can-use-parallel-encoding.js +9 -1
- package/dist/client.d.ts +2 -2
- package/dist/copy-to-clipboard.d.ts +2 -0
- package/dist/copy-to-clipboard.js +18 -0
- package/dist/cycle-browser-tabs.d.ts +6 -1
- package/dist/cycle-browser-tabs.js +2 -2
- package/dist/example-videos.d.ts +34 -0
- package/dist/example-videos.js +43 -0
- package/dist/get-browser-instance.d.ts +2 -1
- package/dist/get-browser-instance.js +14 -4
- package/dist/get-codec-name.d.ts +1 -1
- package/dist/get-compositions.js +1 -0
- package/dist/get-local-browser.d.ts +1 -0
- package/dist/get-local-browser.js +19 -0
- package/dist/index.d.ts +3 -3
- package/dist/make-page.d.ts +27 -0
- package/dist/make-page.js +71 -0
- package/dist/next-frame-to-render.d.ts +10 -0
- package/dist/next-frame-to-render.js +35 -0
- package/dist/open-browser.js +3 -3
- package/dist/options/gl.d.ts +1 -1
- package/dist/options/index.d.ts +2 -2
- package/dist/options/metadata.d.ts +1 -1
- package/dist/options/webhook-custom-data.d.ts +1 -1
- package/dist/pool.d.ts +7 -6
- package/dist/render-frame-and-retry-target-close.d.ts +50 -0
- package/dist/render-frame-and-retry-target-close.js +165 -0
- package/dist/render-frame-with-option-to-reject.d.ts +43 -0
- package/dist/render-frame-with-option-to-reject.js +136 -0
- package/dist/render-frame.d.ts +43 -0
- package/dist/render-frame.js +46 -0
- package/dist/render-frames.js +86 -312
- package/dist/render-partitions.d.ts +7 -0
- package/dist/render-partitions.js +50 -0
- package/dist/render-still.js +7 -2
- package/dist/replace-browser.js +1 -1
- package/dist/select-composition.js +1 -0
- package/dist/take-frame-and-compose.d.ts +22 -0
- package/dist/take-frame-and-compose.js +100 -0
- package/dist/test-gpu.js +1 -0
- package/ensure-browser.mjs +458 -514
- package/package.json +12 -12
package/dist/get-codec-name.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare const hasSpecifiedUnsupportedHardwareQualifySettings: ({ encoding
|
|
|
9
9
|
encodingMaxRate: string | null;
|
|
10
10
|
encodingBufferSize: string | null;
|
|
11
11
|
crf: unknown;
|
|
12
|
-
}) => "
|
|
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;
|
package/dist/get-compositions.js
CHANGED
|
@@ -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: "
|
|
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: "
|
|
357
|
-
DEFAULT_VIDEO_IMAGE_FORMAT: "
|
|
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;
|
package/dist/open-browser.js
CHANGED
|
@@ -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(
|
|
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
|
};
|
package/dist/options/gl.d.ts
CHANGED
|
@@ -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: () => "
|
|
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";
|
package/dist/options/index.d.ts
CHANGED
|
@@ -171,7 +171,7 @@ export declare const allOptions: {
|
|
|
171
171
|
webhookCustomDataOption: {
|
|
172
172
|
name: string;
|
|
173
173
|
cliFlag: "webhook-custom-data";
|
|
174
|
-
description: (type: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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>;
|