Files

226 lines
10 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.setPropsAndEnv = void 0;
const version_1 = require("remotion/version");
const TimeoutSettings_1 = require("./browser/TimeoutSettings");
const goto_page_or_throw_1 = require("./goto-page-or-throw");
const logger_1 = require("./logger");
const normalize_serve_url_1 = require("./normalize-serve-url");
const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
const redirect_status_codes_1 = require("./redirect-status-codes");
const truthy_1 = require("./truthy");
const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
const innerSetPropsAndEnv = async ({ serializedInputPropsWithCustomSchema, envVariables, page, serveUrl, initialFrame, timeoutInMilliseconds, proxyPort, retriesRemaining, audioEnabled, videoEnabled, indent, logLevel, onServeUrlVisited, isMainTab, mediaCacheSizeInBytes, initialMemoryAvailable, darkMode, }) => {
(0, validate_puppeteer_timeout_1.validatePuppeteerTimeout)(timeoutInMilliseconds);
const actualTimeout = timeoutInMilliseconds !== null && timeoutInMilliseconds !== void 0 ? timeoutInMilliseconds : TimeoutSettings_1.DEFAULT_TIMEOUT;
page.setDefaultTimeout(actualTimeout);
page.setDefaultNavigationTimeout(actualTimeout);
const urlToVisit = (0, normalize_serve_url_1.normalizeServeUrl)(serveUrl);
await page.evaluateOnNewDocument((timeout, mainTab, cacheSizeInBytes, initMemoryAvailable) => {
window.remotion_puppeteerTimeout = timeout;
window.remotion_isMainTab = mainTab;
window.remotion_mediaCacheSizeInBytes = cacheSizeInBytes;
window.remotion_initialMemoryAvailable = initMemoryAvailable;
// To make useRemotionEnvironment() work
if (window.process === undefined) {
// @ts-expect-error
window.process = {};
}
if (window.process.env === undefined) {
window.process.env = {};
}
window.process.env.NODE_ENV = 'production';
}, actualTimeout, isMainTab, mediaCacheSizeInBytes, initialMemoryAvailable);
await page.evaluateOnNewDocument('window.remotion_broadcastChannel = new BroadcastChannel("remotion-video-frame-extraction")');
if (envVariables) {
await page.evaluateOnNewDocument((input) => {
window.remotion_envVariables = input;
}, JSON.stringify(envVariables));
}
if (darkMode) {
await page.setAutoDarkModeOverride();
}
await page.evaluateOnNewDocument((input, key, port, audEnabled, vidEnabled, level
// eslint-disable-next-line max-params
) => {
window.remotion_inputProps = input;
window.remotion_initialFrame = key;
window.remotion_attempt = 1;
window.remotion_proxyPort = port;
window.remotion_audioEnabled = audEnabled;
window.remotion_videoEnabled = vidEnabled;
window.remotion_logLevel = level;
window.alert = (message) => {
if (message) {
window.window.remotion_cancelledError = new Error(`alert("${message}") was called. It cannot be called in a headless browser.`).stack;
}
else {
window.window.remotion_cancelledError = new Error('alert() was called. It cannot be called in a headless browser.').stack;
}
};
window.confirm = (message) => {
if (message) {
window.remotion_cancelledError = new Error(`confirm("${message}") was called. It cannot be called in a headless browser.`).stack;
}
else {
window.remotion_cancelledError = new Error('confirm() was called. It cannot be called in a headless browser.').stack;
}
return false;
};
}, serializedInputPropsWithCustomSchema, initialFrame, proxyPort, audioEnabled, videoEnabled, logLevel);
const retry = async () => {
await new Promise((resolve) => {
setTimeout(() => {
resolve();
}, 2000);
});
return innerSetPropsAndEnv({
envVariables,
initialFrame,
serializedInputPropsWithCustomSchema,
page,
proxyPort,
retriesRemaining: retriesRemaining - 1,
serveUrl,
timeoutInMilliseconds,
audioEnabled,
videoEnabled,
indent,
logLevel,
onServeUrlVisited,
isMainTab,
mediaCacheSizeInBytes,
initialMemoryAvailable,
darkMode,
});
};
const [pageRes, error] = await (0, goto_page_or_throw_1.gotoPageOrThrow)(page, urlToVisit, actualTimeout);
if (error !== null) {
if (error.message.includes('ECONNRESET') ||
error.message.includes('ERR_CONNECTION_TIMED_OUT')) {
return retry();
}
throw error;
}
const status = pageRes.status();
// S3 in rare occasions returns a 500 or 503 error code for GET operations.
// Usually it is fixed by retrying.
if (status >= 500 && status <= 504 && retriesRemaining > 0) {
return retry();
}
if (!redirect_status_codes_1.redirectStatusCodes.every((code) => code !== status)) {
throw new Error(`Error while getting compositions: Tried to go to ${urlToVisit} but the status code was ${status} instead of 200. Does the site you specified exist?`);
}
onServeUrlVisited();
const { value: isRemotionFn } = await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
pageFunction: () => {
return window.getStaticCompositions;
},
args: [],
frame: null,
page,
timeoutInMilliseconds: actualTimeout,
});
if (typeof isRemotionFn === 'undefined') {
const { value: body } = await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
pageFunction: () => {
return document.body.innerHTML;
},
args: [],
frame: null,
page,
timeoutInMilliseconds: actualTimeout,
});
// AWS shakyness
if (body.includes('We encountered an internal error.')) {
return retry();
}
const errorMessage = [
`Error while getting compositions: Tried to go to ${urlToVisit} and verify that it is a Remotion project by checking if window.getStaticCompositions is defined.`,
'However, the function was undefined, which indicates that this is not a valid Remotion project. Please check the URL you passed.',
'The page loaded contained the following markup:',
body.substring(0, 500) + (body.length > 500 ? '...' : ''),
'Does this look like a foreign page? If so, try to stop this server.',
].join('\n');
throw new Error(errorMessage);
}
const { value: siteVersion } = await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
pageFunction: () => {
return window.siteVersion;
},
args: [],
frame: null,
page,
timeoutInMilliseconds: actualTimeout,
});
const { value: remotionVersion } = await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
pageFunction: () => {
return window.remotion_version;
},
args: [],
frame: null,
page,
timeoutInMilliseconds: actualTimeout,
});
const requiredVersion = '11';
if (siteVersion !== requiredVersion) {
throw new Error([
`Incompatible site: When visiting ${urlToVisit}, a bundle was found, but one that is not compatible with this version of Remotion. Found version: ${siteVersion} - Required version: ${requiredVersion}. To resolve this error:`,
'When using server-side rendering:',
` ▸ Use 'bundle()' with '@remotion/bundler' of version ${version_1.VERSION} to create a compatible bundle.`,
'When using the Remotion Lambda:',
' ▸ Use `npx remotion lambda sites create` to redeploy the site with the latest version.',
' Use --site-name with the same name as before to overwrite your site.',
' ▸ Use `deploySite()` if you are using the Node.JS APIs.',
].join('\n'));
}
if (remotionVersion !== version_1.VERSION && process.env.NODE_ENV !== 'test') {
if (remotionVersion) {
logger_1.Log.warn({
indent,
logLevel,
}, [
`The site was bundled with version ${remotionVersion} of @remotion/bundler, while @remotion/renderer is on version ${version_1.VERSION}. You may not have the newest bugfixes and features.`,
`To resolve this warning:`,
'▸ Use `npx remotion lambda sites create` to redeploy the site with the latest version.',
' Use --site-name with the same name as before to overwrite your site.',
'▸ Use `deploySite()` if you are using the Node.JS APIs.',
].join('\n'));
}
else {
logger_1.Log.warn({
indent,
logLevel,
}, `The site was bundled with an old version of Remotion, while @remotion/renderer is on version ${version_1.VERSION}. You may not have the newest bugfixes and features. Re-bundle the site to fix this issue.`);
}
}
};
const setPropsAndEnv = async (params) => {
let timeout = null;
try {
const result = await Promise.race([
innerSetPropsAndEnv(params),
new Promise((_, reject) => {
timeout = setTimeout(() => {
reject(new Error([
`Timed out after ${params.timeoutInMilliseconds}ms while setting up the headless browser.`,
'This could be because the you specified takes a long time to load (or network resources that it includes like fonts) or because the browser is not responding.',
process.platform === 'linux'
? 'Make sure you have installed the Linux depdendencies: https://www.remotion.dev/docs/miscellaneous/linux-dependencies'
: null,
]
.filter(truthy_1.truthy)
.join('\n')));
}, params.timeoutInMilliseconds);
}),
]);
return result;
}
finally {
if (timeout !== null) {
clearTimeout(timeout);
}
}
};
exports.setPropsAndEnv = setPropsAndEnv;