: start it once the body exists (in it threw "appendChild of null" and never resolved) window.cgInit = new Promise((resolve) => { const go = async () => { let ok = false; try { await window.CrazyGames.SDK.init(); window.CrazyGames.SDK.game.loadingStart(); ok = true; } catch (e) { console.log('cg init', e); } window.cgOk = ok; window.cgDone = true; resolve(ok); }; if (document.body) go(); else document.addEventListener('DOMContentLoaded', go); }); window.cgCall = (n) => window.cgInit.then((ok) => { try { if (ok) window.CrazyGames.SDK.game[n](); } catch (e) {} }); window.cgAd = () => { window.cgAdBusy = true; const done = () => { window.cgAdBusy = false; }; const t = setTimeout(done, 3000); // SDK не ответил — не держим игрока window.cgInit.then((ok) => { clearTimeout(t); if (!ok) return done(); try { window.CrazyGames.SDK.ad.requestAd('midgame', { adStarted: () => {}, adFinished: done, adError: done }); } catch (e) { done(); } }); }; window.cgRewardState = 0; // 0 idle, 1 showing, 2 rewarded, 3 failed / skipped window.cgReward = () => { window.cgRewardState = 1; const t = setTimeout(() => { if (window.cgRewardState === 1) window.cgRewardState = 3; }, 45000); const fin = (s) => { clearTimeout(t); if (window.cgRewardState === 1) window.cgRewardState = s; }; Promise.race([window.cgInit, new Promise((r) => setTimeout(() => r(false), 6000))]).then((ok) => { if (!ok) return fin(3); try { window.CrazyGames.SDK.ad.requestAd('rewarded', { adStarted: () => {}, adFinished: () => fin(2), adError: () => fin(3) }); } catch (e) { fin(3); } }); }; Your browser does not support the canvas tag.