tweb/public/14.d18c6ba2a55f66b61537.chunk.js.map
morethanwords c477c825d8 Build
2021-04-19 19:32:05 +04:00

1 line
33 KiB
Plaintext

{"version":3,"sources":["webpack:///./src/pages/pageIm.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/pages/pageSignQR.ts"],"names":["page","pushToState","_","then","m","default","broadcast","requestedServerLanguage","getCacheLangPack","langPack","local","getLangPack","lang_code","Promise","resolve","window","requestAnimationFrame","finally","passwordManager","invokeApi","result","settings","this","getState","state","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","computeSRP","newAlgo","new_algo","salt1","Uint8Array","length","randomize","set","newPassword","all","hashes","new_password_hash","options","inputCheckPassword","auth","saveApiUser","user","setUserAuth","id","code","LoginPage","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","PasswordInputField","super","plainText","passwordVisible","onVisibilityClick","e","toggleVisible","classList","toggle","input","type","onVisibilityClickAdditional","setAttribute","autocomplete","stealthy","add","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","addEventListener","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationFromURL","loop","autoplay","width","height","noCache","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","btnNext","btnNextI18n","IntlElement","key","label","name","getStateInterval","setInterval","_state","wrapEmojiText","setLabel","onSubmit","value","update","preloader","check","response","clearInterval","mount","monkey","removeAttribute","catch","err","select","isMobile","load","focus","saveState","cachedPromise","pageEl","btnBack","text","h4","helpList","forEach","li","stop","QRCodeStyling","once","prevToken","ignoreErrors","iterate","isLoop","loginToken","api_id","api_hash","hash","except_ids","dcId","dc_id","setBaseDcId","token","authorization","url","replace","qrCode","devicePixelRatio","data","image","dotsOptions","color","imageOptions","imageSize","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","_canvas","_image","Array","from","children","slice","el","timestamp","Date","now","diff","expires","serverTimeOffset","console","warn","handled","error","func"],"mappings":"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","file":"14.d18c6ba2a55f66b61537.chunk.js","sourcesContent":["//import {stackBlurImage} from '../lib/StackBlur';\n//import appStateManager from \"../lib/appManagers/appStateManager\";\n/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { blurActiveElement } from \"../helpers/dom\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport I18n from \"../lib/langPack\";\nimport Page from \"./page\";\n\nlet onFirstMount = () => {\n //return;\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\n // ! TOO SLOW\n /* appStateManager.saveState(); */\n\n import('../lib/rootScope').then(m => {\n m.default.broadcast('im_mount');\n });\n\n if(!I18n.requestedServerLanguage) {\n I18n.getCacheLangPack().then(langPack => {\n if(langPack.local) {\n I18n.getLangPack(langPack.lang_code);\n }\n });\n }\n\n blurActiveElement();\n return new Promise<void>((resolve) => {\n window.requestAnimationFrame(() => {\n const promise = import('../lib/appManagers/appDialogsManager');\n promise.finally(async() => {\n //alert('pageIm!');\n resolve();\n \n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\n \n /* // @ts-ignore\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\n alert('AudioContext:' + typeof(AudioContext));\n // @ts-ignore\n alert('global.navigator:' + typeof(navigator));\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\n \n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\n });\n });\n });\n\n //let promise = /* Promise.resolve() */.then(() => {//import('../lib/services').then(services => {\n /* fetch('assets/img/camomile.jpg')\n .then(res => res.blob())\n .then(blob => {\n let img = new Image();\n let url = URL.createObjectURL(blob);\n img.src = url;\n img.onload = () => {\n let id = 'chat-background-canvas';\n var canvas = document.getElementById(id) as HTMLCanvasElement;\n //URL.revokeObjectURL(url);\n \n let elements = ['.chat-container'].map(selector => {\n return document.querySelector(selector) as HTMLDivElement;\n });\n \n stackBlurImage(img, id, 15, 0);\n \n canvas.toBlob(blob => {\n //let dataUrl = canvas.toDataURL('image/jpeg', 1);\n let dataUrl = URL.createObjectURL(blob);\n \n elements.forEach(el => {\n el.style.backgroundImage = 'url(' + dataUrl + ')';\n });\n }, 'image/jpeg', 1);\n };\n }); */\n //});\n};\n\nconst page = new Page('page-chats', false, onFirstMount);\nexport default page;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { AccountPassword, AccountPasswordInputSettings, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\nimport type CryptoWorkerMethods from '../crypto/crypto_methods';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appUsersManager from '../appManagers/appUsersManager';\nimport apiManager from './mtprotoworker';\n//import { computeCheck } from \"../crypto/srp\";\n\nexport class PasswordManager {\n public getState(): Promise<AccountPassword> {\n return apiManager.invokeApi('account.getPassword').then((result) => {\n return result;\n });\n }\n\n public updateSettings(settings: {\n hint?: string,\n email?: string,\n newPassword?: string,\n currentPassword?: string\n } = {}) {\n //state = Object.assign({}, state);\n //state.new_algo = Object.assign({}, state.new_algo);\n\n return this.getState().then(state => {\n let currentHashPromise: ReturnType<CryptoWorkerMethods['computeSRP']>;\n let newHashPromise: Promise<Uint8Array>;\n const params: AccountUpdatePasswordSettings = {\n password: null,\n new_settings: {\n _: 'account.passwordInputSettings',\n hint: settings.hint,\n email: settings.email\n }\n };\n \n if(settings.currentPassword) {\n currentHashPromise = apiManager.computeSRP(settings.currentPassword, state);\n } else {\n currentHashPromise = Promise.resolve({\n _: 'inputCheckPasswordEmpty'\n });\n }\n \n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\n salt1.randomize();\n salt1.set(newAlgo.salt1, 0);\n newAlgo.salt1 = salt1;\n \n if(settings.newPassword) {\n newHashPromise = apiManager.computeSRP(settings.newPassword, state, true) as any;\n } else {\n newHashPromise = Promise.resolve(new Uint8Array());\n }\n \n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.password = hashes[0];\n params.new_settings.new_algo = newAlgo;\n params.new_settings.new_password_hash = hashes[1];\n \n return apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n });\n }\n\n public check(password: string, state: AccountPassword, options: any = {}) {\n return apiManager.computeSRP(password, state).then((inputCheckPassword) => {\n //console.log('SRP', inputCheckPassword);\n return apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword\n }, options).then(auth => {\n if(auth._ === 'auth.authorization') {\n appUsersManager.saveApiUser(auth.user);\n apiManager.setUserAuth(auth.user.id);\n }\n\n return auth;\n });\n });\n }\n\n public confirmPasswordEmail(code: string) {\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\n }\n\n public resendPasswordEmail() {\n return apiManager.invokeApi('account.resendPasswordEmail');\n }\n\n public cancelPasswordEmail() {\n return apiManager.invokeApi('account.cancelPasswordEmail');\n }\n\n /* public requestRecovery(options: any = {}) {\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n }\n\n public recover(code: any, options: any = {}) {\n return apiManager.invokeApi('auth.recoverPassword', {\n code\n }, options);\n } */\n}\n\nconst passwordManager = new PasswordManager();\nMOUNT_CLASS_TO.passwordManager = passwordManager;\nexport default passwordManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { LangPackKey, i18n } from \"../lib/langPack\";\n\nexport default class LoginPage {\n public element: HTMLElement;\n public container: HTMLElement;\n public imageDiv: HTMLElement;\n public inputWrapper: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLParagraphElement;\n\n constructor(options: {\n className: string,\n withInputWrapper?: boolean,\n titleLangKey?: LangPackKey,\n subtitleLangKey?: LangPackKey,\n }) {\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\n //this.element = document.createElement('div');\n //this.element.className = 'page-' + options.className;\n\n this.container = document.createElement('div');\n this.container.className = 'container center-align';\n\n this.imageDiv = document.createElement('div');\n this.imageDiv.className = 'auth-image';\n\n this.title = document.createElement('h4');\n if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n this.subtitle = document.createElement('p');\n this.subtitle.className = 'subtitle';\n if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey));\n }\n \n this.container.append(this.imageDiv, this.title, this.subtitle);\n\n if(options.withInputWrapper) {\n this.inputWrapper = document.createElement('div');\n this.inputWrapper.className = 'input-wrapper';\n this.container.append(this.inputWrapper);\n }\n\n this.element.append(this.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class PasswordInputField extends InputField {\n public passwordVisible = false;\n public toggleVisible: HTMLElement;\n public onVisibilityClickAdditional: () => void;\n\n constructor(options: InputFieldOptions = {}) {\n super({\n plainText: true,\n ...options\n });\n\n const input = this.input as HTMLInputElement;\n input.type = 'password';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n /* input.readOnly = true;\n\n input.addEventListener('focus', () => {\n input.removeAttribute('readonly');\n }, {once: true}); */\n\n // * https://stackoverflow.com/a/35949954/6758968\n const stealthy = document.createElement('input');\n stealthy.classList.add('stealthy');\n stealthy.tabIndex = -1;\n stealthy.type = 'password';\n input.parentElement.prepend(stealthy);\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\n\n const toggleVisible = this.toggleVisible = document.createElement('span');\n toggleVisible.classList.add('toggle-visible', 'tgico');\n\n this.container.classList.add('input-field-password');\n this.container.append(toggleVisible);\n\n toggleVisible.addEventListener('click', this.onVisibilityClick);\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\n }\n\n public onVisibilityClick = (e: Event) => {\n cancelEvent(e);\n this.passwordVisible = !this.passwordVisible;\n\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\nimport PasswordInputField from \"../passwordInputField\";\n\nexport default class PasswordMonkey {\n public container: HTMLElement;\n public animation: RLottiePlayer;\n public needFrame = 0;\n protected loadPromise: Promise<void>;\n\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = lottieLoader.loadAnimationFromURL({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size,\n noCache: true\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\n }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\n //return;\n this.animation = _animation;\n this.animation.addEventListener('enterFrame', currentFrame => {\n //console.log('enterFrame', currentFrame, this.needFrame);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n } \n });\n\n this.passwordInputField.onVisibilityClickAdditional = () => {\n if(this.passwordInputField.passwordVisible) {\n this.animation.setDirection(1);\n this.animation.curFrame = 0;\n this.needFrame = 16;\n this.animation.play();\n } else {\n this.animation.setDirection(-1);\n this.animation.curFrame = 16;\n this.needFrame = 0;\n this.animation.play();\n }\n };\n\n return lottieLoader.waitForFirstFrame(_animation);\n });\n }\n\n public remove() {\n if(this.animation) {\n this.animation.remove();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { putPreloader } from '../components/misc';\nimport mediaSizes from '../helpers/mediaSizes';\nimport { AccountPassword } from '../layer';\nimport appStateManager from '../lib/appManagers/appStateManager';\nimport passwordManager from '../lib/mtproto/passwordManager';\nimport Page from './page';\nimport pageIm from './pageIm';\nimport Button from '../components/button';\nimport PasswordInputField from '../components/passwordInputField';\nimport PasswordMonkey from '../components/monkeys/password';\nimport RichTextProcessor from '../lib/richtextprocessor';\nimport I18n from '../lib/langPack';\nimport LoginPage from './loginPage';\nimport { attachClickEvent, cancelEvent, htmlToSpan, replaceContent, toggleDisability } from '../helpers/dom';\n\nconst TEST = false;\nlet passwordInput: HTMLInputElement;\n\nlet onFirstMount = (): Promise<any> => {\n const page = new LoginPage({\n className: 'page-password',\n withInputWrapper: true,\n titleLangKey: 'Login.Password.Title',\n subtitleLangKey: 'Login.Password.Subtitle'\n });\n\n const btnNext = Button('btn-primary btn-color-primary');\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\n\n btnNext.append(btnNextI18n.element);\n\n const passwordInputField = new PasswordInputField({\n label: 'LoginPassword',\n name: 'password'\n });\n\n passwordInput = passwordInputField.input as HTMLInputElement;\n\n page.inputWrapper.append(passwordInputField.container, btnNext);\n\n let getStateInterval: number;\n\n let getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return !TEST && passwordManager.getState().then(_state => {\n state = _state;\n\n if(state.hint) {\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\n } else {\n passwordInputField.setLabel();\n }\n });\n };\n\n let state: AccountPassword;\n \n const onSubmit = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!passwordInput.value.length) {\n passwordInput.classList.add('error');\n return;\n }\n\n const toggle = toggleDisability([passwordInput, btnNext], true);\n let value = passwordInput.value;\n\n btnNextI18n.update({key: 'PleaseWait'});\n const preloader = putPreloader(btnNext);\n\n passwordManager.check(value, state).then((response) => {\n //console.log('passwordManager response:', response);\n \n switch(response._) {\n case 'auth.authorization':\n clearInterval(getStateInterval);\n pageIm.mount();\n if(monkey) monkey.remove();\n break;\n default:\n btnNext.removeAttribute('disabled');\n btnNextI18n.update({key: response._ as any});\n preloader.remove();\n break;\n }\n }).catch((err: any) => {\n toggle();\n passwordInputField.input.classList.add('error');\n \n switch(err.type) {\n default:\n //btnNext.innerText = err.type;\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\n passwordInput.select();\n break;\n }\n\n preloader.remove();\n \n getState();\n });\n };\n \n attachClickEvent(btnNext, onSubmit);\n\n passwordInput.addEventListener('keypress', function(this, e) {\n this.classList.remove('error');\n btnNextI18n.update({key: 'Login.Next'});\n\n if(e.key === 'Enter') {\n return onSubmit();\n }\n });\n\n const size = mediaSizes.isMobile ? 100 : 166;\n const monkey = new PasswordMonkey(passwordInputField, size);\n page.imageDiv.append(monkey.container);\n return Promise.all([\n monkey.load(),\n getState()\n ]);\n};\n\nconst page = new Page('page-password', true, onFirstMount, null, () => {\n //if(!isAppleMobile) {\n passwordInput.focus();\n //}\n\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\n appStateManager.saveState();\n});\n\nexport default page;\n","//import apiManager from '../lib/mtproto/apiManager';\n/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport apiManager from '../lib/mtproto/mtprotoworker';\nimport Page from './page';\nimport pageIm from './pageIm';\nimport pagePassword from './pagePassword';\nimport pageSignIn from './pageSignIn';\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\nimport { pause } from '../helpers/schedulers';\nimport App from '../config/app';\nimport Button from '../components/button';\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\n\nlet onFirstMount = async() => {\n const pageElement = page.pageEl;\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\n inputWrapper.append(btnBack);\n\n const container = imageDiv.parentElement;\n\n const h4 = document.createElement('h4');\n _i18n(h4, 'Login.QR.Title');\n\n const helpList = document.createElement('ol');\n helpList.classList.add('qr-description');\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\n const li = document.createElement('li');\n li.append(i18n(key));\n helpList.append(li);\n });\n\n container.append(h4, helpList, inputWrapper);\n\n btnBack.addEventListener('click', () => {\n pageSignIn.mount();\n stop = true;\n });\n \n const results = await Promise.all([\n import('qr-code-styling' as any)\n ]);\n const QRCodeStyling = results[0].default;\n\n let stop = false;\n document.addEventListener('user_auth', () => {\n stop = true;\n cachedPromise = null;\n }, {once: true});\n \n let options: {dcId?: number, ignoreErrors: true} = {ignoreErrors: true};\n let prevToken: Uint8Array | number[];\n\n const iterate = async(isLoop: boolean) => {\n try {\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\n api_id: App.id,\n api_hash: App.hash,\n except_ids: []\n }, {ignoreErrors: true});\n \n if(loginToken._ === 'auth.loginTokenMigrateTo') {\n if(!options.dcId) {\n options.dcId = loginToken.dc_id;\n apiManager.setBaseDcId(loginToken.dc_id);\n //continue;\n }\n \n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\n token: loginToken.token\n }, options) as AuthLoginToken.authLoginToken;\n }\n\n if(loginToken._ === 'auth.loginTokenSuccess') {\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\n apiManager.setUserAuth(authorization.user.id);\n pageIm.mount();\n return true;\n }\n\n /* // to base64\n var decoder = new TextDecoder('utf8');\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\n\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\n prevToken = loginToken.token;\n\n let encoded = bytesToBase64(loginToken.token);\n let url = \"tg://login?token=\" + encoded.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/\\=+$/, \"\");\n\n const qrCode = new QRCodeStyling({\n width: 240 * window.devicePixelRatio,\n height: 240 * window.devicePixelRatio,\n data: url,\n image: \"assets/img/logo_padded.svg\",\n dotsOptions: {\n color: \"#000000\",\n type: \"rounded\"\n },\n imageOptions: {\n imageSize: .75\n },\n backgroundOptions: {\n color: \"#ffffff\"\n },\n qrOptions: {\n errorCorrectionLevel: \"L\"\n }\n });\n\n qrCode.append(imageDiv);\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\n\n let promise: Promise<void>;\n if(qrCode._drawingPromise) {\n promise = qrCode._drawingPromise;\n } else {\n promise = Promise.race([\n pause(1000),\n new Promise<void>((resolve) => {\n qrCode._canvas._image.addEventListener('load', () => {\n window.requestAnimationFrame(() => resolve());\n }, {once: true});\n })\n ]);\n }\n\n // * это костыль, но библиотека не предоставляет никаких событий\n await promise.then(() => {\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\n el.remove();\n });\n });\n }\n\n if(isLoop) {\n let timestamp = Date.now() / 1000;\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\n \n await pause(diff > 5 ? 5e3 : 1e3 * diff | 0);\n }\n } catch(err) {\n switch(err.type) {\n case 'SESSION_PASSWORD_NEEDED':\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\n err.handled = true;\n pagePassword.mount();\n stop = true;\n cachedPromise = null;\n break;\n default:\n console.error('pageSignQR: default error:', err);\n break;\n }\n }\n };\n\n await iterate(false);\n\n return async() => {\n stop = false;\n\n do {\n if(stop) {\n break;\n }\n \n const needBreak = await iterate(true);\n if(needBreak) {\n break;\n }\n } while(true);\n };\n};\n\nlet cachedPromise: Promise<() => Promise<void>>;\nconst page = new Page('page-signQR', true, () => {\n return cachedPromise;\n}, () => {\n //console.log('onMount');\n if(!cachedPromise) cachedPromise = onFirstMount();\n cachedPromise.then(func => {\n func();\n });\n});\n\nexport default page;\n"],"sourceRoot":""}