UNPKG

@remotion/preload

Version:

Preloads assets for use in Remotion

73 lines (72 loc) 2.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.preloadAsset = exports.isIosSafari = void 0; /* eslint-disable no-console */ const resolve_redirect_1 = require("./resolve-redirect"); const typesAllowed = ['video', 'audio', 'image', 'font']; const isIosSafari = () => { if (typeof window === 'undefined') { return false; } const isIpadIPodIPhone = /iP(ad|od|hone)/i.test(window.navigator.userAgent); const isSafari = Boolean(navigator.userAgent.match(/Version\/[\d.]+.*Safari/)); const isChrome = Boolean(navigator.userAgent.match(/CriOS\//)); return isIpadIPodIPhone && (isSafari || isChrome); }; exports.isIosSafari = isIosSafari; const preloadAsset = (src, elemType) => { const apiName = `preload${elemType.charAt(0).toUpperCase() + elemType.slice(1)}`; if (typeof document === 'undefined') { console.warn(apiName + '() was called outside the browser. Doing nothing.'); return () => undefined; } if (!typesAllowed.includes(elemType)) { console.warn(apiName + '() Error, elemType not supported. Doing nothing.', elemType); return () => undefined; } const resolved = (0, resolve_redirect_1.resolveRedirect)(src); let cancelled = false; if (navigator.userAgent.match(/Firefox\//) || elemType === 'image' || elemType === 'font') { const link = document.createElement('link'); link.rel = 'preload'; link.as = elemType; resolved .then((realUrl) => { if (!cancelled) { link.href = realUrl; document.head.appendChild(link); } }) .catch((err) => { console.log(`Failed to preload asset`, err); }); return () => { cancelled = true; link.remove(); }; } const elem = document.createElement(elemType); elem.preload = (elemType === 'video' || elemType === 'audio') && (0, exports.isIosSafari)() ? 'metadata' : 'auto'; elem.controls = true; elem.style.display = 'none'; resolved .then((realUrl) => { if (!cancelled) { elem.src = realUrl; document.body.appendChild(elem); } }) .catch((err) => { console.log('Failed to preload asset', err); }); return () => { cancelled = true; elem.remove(); }; }; exports.preloadAsset = preloadAsset;