remotion
Version:
Make videos programmatically
104 lines (103 loc) • 5.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.continueRender = exports.delayRender = exports.DELAY_RENDER_CLEAR_TOKEN = exports.DELAY_RENDER_RETRY_TOKEN = exports.DELAY_RENDER_RETRIES_LEFT = exports.DELAY_RENDER_CALLSTACK_TOKEN = void 0;
const cancel_render_js_1 = require("./cancel-render.js");
const get_remotion_environment_js_1 = require("./get-remotion-environment.js");
const log_js_1 = require("./log.js");
const truthy_js_1 = require("./truthy.js");
if (typeof window !== 'undefined') {
window.remotion_renderReady = false;
}
let handles = [];
if (typeof window !== 'undefined') {
window.remotion_delayRenderTimeouts = {};
}
exports.DELAY_RENDER_CALLSTACK_TOKEN = 'The delayRender was called:';
exports.DELAY_RENDER_RETRIES_LEFT = 'Retries left: ';
exports.DELAY_RENDER_RETRY_TOKEN = '- Rendering the frame will be retried.';
exports.DELAY_RENDER_CLEAR_TOKEN = 'handle was cleared after';
const defaultTimeout = 30000;
/*
* @description Call this function to signal that a frame should not be rendered until an asynchronous task (such as data fetching) is complete. Use continueRender(handle) to proceed with rendering once the task is complete.
* @see [Documentation](https://remotion.dev/docs/delay-render)
*/
const delayRender = (label, options) => {
var _a, _b, _c, _d, _e;
if (typeof label !== 'string' && typeof label !== 'undefined') {
throw new Error('The label parameter of delayRender() must be a string or undefined, got: ' +
JSON.stringify(label));
}
const handle = Math.random();
handles.push(handle);
const called = (_b = (_a = Error().stack) === null || _a === void 0 ? void 0 : _a.replace(/^Error/g, '')) !== null && _b !== void 0 ? _b : '';
if ((0, get_remotion_environment_js_1.getRemotionEnvironment)().isRendering) {
const timeoutToUse = ((_c = options === null || options === void 0 ? void 0 : options.timeoutInMilliseconds) !== null && _c !== void 0 ? _c : (typeof window === 'undefined'
? defaultTimeout
: ((_d = window.remotion_puppeteerTimeout) !== null && _d !== void 0 ? _d : defaultTimeout))) - 2000;
if (typeof window !== 'undefined') {
const retriesLeft = ((_e = options === null || options === void 0 ? void 0 : options.retries) !== null && _e !== void 0 ? _e : 0) - (window.remotion_attempt - 1);
window.remotion_delayRenderTimeouts[handle] = {
label: label !== null && label !== void 0 ? label : null,
startTime: Date.now(),
timeout: setTimeout(() => {
const message = [
`A delayRender()`,
label ? `"${label}"` : null,
`was called but not cleared after ${timeoutToUse}ms. See https://remotion.dev/docs/timeout for help.`,
retriesLeft > 0 ? exports.DELAY_RENDER_RETRIES_LEFT + retriesLeft : null,
retriesLeft > 0 ? exports.DELAY_RENDER_RETRY_TOKEN : null,
exports.DELAY_RENDER_CALLSTACK_TOKEN,
called,
]
.filter(truthy_js_1.truthy)
.join(' ');
(0, cancel_render_js_1.cancelRender)(Error(message));
}, timeoutToUse),
};
}
}
if (typeof window !== 'undefined') {
window.remotion_renderReady = false;
}
return handle;
};
exports.delayRender = delayRender;
/*
* @description Unblock a render that has been blocked by delayRender().
* @see [Documentation](https://remotion.dev/docs/continue-render)
*/
const continueRender = (handle) => {
if (typeof handle === 'undefined') {
throw new TypeError('The continueRender() method must be called with a parameter that is the return value of delayRender(). No value was passed.');
}
if (typeof handle !== 'number') {
throw new TypeError('The parameter passed into continueRender() must be the return value of delayRender() which is a number. Got: ' +
JSON.stringify(handle));
}
handles = handles.filter((h) => {
if (h === handle) {
if ((0, get_remotion_environment_js_1.getRemotionEnvironment)().isRendering) {
if (!window.remotion_delayRenderTimeouts[handle]) {
return false;
}
const { label, startTime, timeout } = window.remotion_delayRenderTimeouts[handle];
clearTimeout(timeout);
const message = [
label ? `delayRender() "${label}"` : 'A delayRender()',
exports.DELAY_RENDER_CLEAR_TOKEN,
`${Date.now() - startTime}ms`,
]
.filter(truthy_js_1.truthy)
.join(' ');
log_js_1.Log.verbose(window.remotion_logLevel, message);
delete window.remotion_delayRenderTimeouts[handle];
}
return false;
}
return true;
});
if (handles.length === 0 && typeof window !== 'undefined') {
window.remotion_renderReady = true;
}
};
exports.continueRender = continueRender;