tweb/public/16.049af2cb2d7656888f47.chu...

1 line
22 KiB
Plaintext

{"version":3,"sources":["webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/helpers/bytes/bytesCmp.ts","webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/bytes/bytesToBase64.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts"],"names":["fixBase64String","str","toUrl","replace","bytesCmp","bytes1","bytes2","len","length","i","cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","format","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","uint6ToBase64","nUint6","onFirstMount","imageDiv","pageEl","querySelector","preloader","inputWrapper","document","createElement","add","btnBack","container","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","rootScope","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","invokeApi","api_id","id","api_hash","hash","except_ids","_","dcId","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","url","style","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","resolve","reader","FileReader","onload","target","readAsDataURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","setTimeout","undefined","Array","from","slice","el","timestamp","Date","now","diff","expires","serverTimeManager","serverTimeOffset","err","console","warn","handled","error","func","appStateManager","pushToState","this","to","addTaskListener","task","payload"],"mappings":"0FAAe,SAASA,EAAgBC,EAAaC,GACnD,OAAGA,EACMD,EAAIE,QAAQ,MAAO,KAAKA,QAAQ,MAAO,KAAKA,QAAQ,OAAQ,IAE5DF,EAAIE,QAAQ,KAAM,KAAKA,QAAQ,KAAM,KAJhD,mC,iCCAe,SAASC,EAASC,EAA+BC,GAC9D,MAAMC,EAAMF,EAAOG,OACnB,GAAGD,IAAQD,EAAOE,OAChB,OAAO,EAGT,IAAI,IAAIC,EAAI,EAAGA,EAAIF,IAAOE,EACxB,GAAGJ,EAAOI,KAAOH,EAAOG,GACtB,OAAO,EAIX,OAAO,EAZT,mC,iCCAA,mGAgBA,IAmBIC,EAnBAC,GAAM,EAqBK,SAASC,EAAwBC,GAC3CF,IAnBAD,IACIA,EAAgB,IAAWI,YAAYC,KAAKC,GAC9CA,EAAOC,sBAAwB,IAAKC,sBAG9BC,QAAQC,IAAI,CACjBJ,EACA,IAAKK,WAAWL,EAAOC,oBAAqB,CAAC,6BAC7C,IAAKK,qBAGA,MASDP,KAAK,EAAEC,EAAQO,MACvB,IAAIP,EACF,OAGF,MAAMQ,EAA2B,GACjCD,EAAQE,QAAQC,IACd,MAAMC,EAAe,IAAKJ,QAAQK,IAAIF,EAAOG,KACzCF,IAIJH,EAAOM,KAAKH,GACZ,IAAKJ,QAAQZ,IAAIe,EAAOG,IAAoBH,MAG9C,MAAMG,EAAmB,2BACnBE,EAAoB,YAAO,4DAA6D,CAACC,KAAMH,IACrGE,EAAkBE,iBAAiBC,UAAUC,OAAO,QACpD,YAAU,CAACH,KAAM,CAAC,IAAKI,OAAOP,GAAK,MAASd,KAAK,KAC/CsB,OAAOC,sBAAsB,KAC3BzB,EAAS0B,OAAOR,OAIpB,IAAUS,iBAAiB,kBAAmB,KAC5CT,EAAkBI,UACjB,CAACM,MAAM,IAEVjB,EAAOC,QAAQC,IACb,IAAKH,QAAQZ,IAAIe,EAAOG,IAAoBH,KAG9C,YAAiBK,EAAoBW,IACnC,YAAYA,GAEZ/B,GAAM,EAENoB,EAAkBY,UAAW,EAC7B,YAAaZ,GAEb,IAAKa,YAAY5B,EAAOC,2B,mJC3DvB,SAAS4B,EAAcC,GAC5B,OAAOA,EAAS,GACZA,EAAS,GACTA,EAAS,GACPA,EAAS,GACTA,EAAS,GACPA,EAAS,EACE,KAAXA,EACE,GACW,KAAXA,EACE,GACA,G,0SCNd,IAyNIpC,EAzNAqC,EAAe,IAAW,OAAD,6BAC3B,MACMC,EADc,EAAKC,OACIC,cAAc,eAE3C,IAAIC,EAAY,YAAaH,GAAU,GAEvC,MAAMI,EAAeC,SAASC,cAAc,OAC5CF,EAAalB,UAAUqB,IAAI,iBAE3B,MAAMC,EAAU,YAAO,4DAA6D,CAACxB,KAAM,oBAC3FoB,EAAab,OAAOiB,GAEpB,YAAwBJ,GAExB,MAAMK,EAAYT,EAASU,cAErBC,EAAKN,SAASC,cAAc,MAClC,YAAMK,EAAI,kBAEV,MAAMC,EAAWP,SAASC,cAAc,MACxCM,EAAS1B,UAAUqB,IAAI,kBACtB,CAAC,iBAAkB,iBAAkB,kBAAoC9B,QAASI,IACjF,MAAMgC,EAAKR,SAASC,cAAc,MAClCO,EAAGtB,OAAO,YAAKV,IACf+B,EAASrB,OAAOsB,KAGlBJ,EAAUlB,OAAOoB,EAAIC,EAAUR,GAE/BI,EAAQhB,iBAAiB,QAAS,KAChC,oDAAuBzB,KAAK+C,GAAKA,EAAEC,QAAQC,SAC3CC,GAAO,IAGT,MAGMC,SAHgB/C,QAAQC,IAAI,CAChC,sCAE4B,GAAG2C,QAEjC,IAAIE,GAAO,EACXE,EAAA,EAAU3B,iBAAiB,YAAa,KACtCyB,GAAO,EACPvD,EAAgB,MACf,CAAC+B,MAAM,IAEV,IACI2B,EADAC,EAA6C,CAACC,cAAc,GAGhE,MAAMC,EAAgBC,GAAoB,OAAD,6BACvC,IACE,IAAIC,QAAmB,IAAWC,UAAU,wBAAyB,CACnEC,OAAQ,IAAIC,GACZC,SAAU,IAAIC,KACdC,WAAY,IACX,CAACT,cAAc,IAclB,GAZoB,6BAAjBG,EAAWO,IACRX,EAAQY,OACVZ,EAAQY,KAAOR,EAAWS,MAC1B,IAAWC,YAAYV,EAAWS,QAIpCT,QAAmB,IAAWC,UAAU,wBAAyB,CAC/DU,MAAOX,EAAWW,OACjBf,IAGe,2BAAjBI,EAAWO,EAAgC,CAC5C,MAAMK,EAAgBZ,EAAWY,cAGjC,OAFA,IAAWC,QAAQD,EAAcE,MACjC,8BAAmBxE,KAAK+C,GAAKA,EAAEC,QAAQC,UAChC,EAOT,IAAII,IAAc,OAAAhE,EAAA,GAASgE,EAAWK,EAAWW,OAAQ,CACvDhB,EAAYK,EAAWW,MAEvB,IAAII,ED5GG,SAAuBC,GACpC,IAAIC,EACAC,EAAS,GAEb,IAAI,IAAIC,EAAOH,EAAMjF,OAAQqF,EAAU,EAAGC,EAAO,EAAGA,EAAOF,IAAQE,EACjEJ,EAAOI,EAAO,EACdD,GAAWJ,EAAMK,KAAU,KAAOJ,EAAO,IAC7B,IAATA,GAAcE,EAAOE,GAAS,IAC/BH,GAAUI,OAAOC,aACfnD,EAAcgD,IAAY,GAAK,IAC/BhD,EAAcgD,IAAY,GAAK,IAC/BhD,EAAcgD,IAAY,EAAI,IAC9BhD,EAAwB,GAAVgD,IAEhBA,EAAU,GAId,OAAOF,EAAOxF,QAAQ,aAAc,KC0FhB8F,CAAcxB,EAAWW,OACnCc,EAAM,oBAAsB,OAAAlG,EAAA,GAAgBwF,GAAS,GAEzD,MAAMW,EAAQ9D,OAAO+D,iBAAiB/C,SAASgD,iBACzCC,EAAeH,EAAMI,iBAAiB,mBAAmBC,OACzDC,EAAYN,EAAMI,iBAAiB,wBAAwBC,OAC3DE,EAAeP,EAAMI,iBAAiB,mBAAmBC,OAEzDG,QAAgBC,MAAM,8BAC3B7F,KAAK8F,GAAOA,EAAI7E,QAChBjB,KAAKiB,IACJA,EAAOA,EAAK7B,QAAQ,gBAAiB,KAAKuG,OAC1C,MAAMI,EAAO,IAAIC,KAAK,CAAC/E,GAAO,CAACgF,KAAM,gCAGrC,OAAO,IAAI7F,QAAiB8F,IAC1B,MAAMC,EAAS,IAAIC,WACnBD,EAAOE,OAAU1E,IACfuE,EAAQvE,EAAE2E,OAAO1B,SAEnBuB,EAAOI,cAAcR,OAKnBS,EAAS,IAAIrD,EAAc,CAC/BsD,MAAO,IAAMnF,OAAOoF,iBACpBC,OAAQ,IAAMrF,OAAOoF,iBACrBE,KAAMzB,EACN0B,MAAOjB,EACPkB,YAAa,CACXC,MAAOrB,EACPO,KAAM,WAERe,qBAAsB,CACpBf,KAAM,iBAERgB,aAAc,CACZC,UAAW,EACXC,OAAQ,GAEVC,kBAAmB,CACjBL,MAAOxB,GAET8B,UAAW,CACTC,qBAAsB,OAO1B,IAAIC,EAHJf,EAAOhF,OAAOS,GACbA,EAASuF,UAAgCrG,UAAUqB,IAAI,aAItD+E,EADCf,EAAOiB,gBACEjB,EAAOiB,gBAEPrH,QAAQsH,KAAK,CACrB,OAAAC,EAAA,GAAM,KACN,IAAIvH,QAAe8F,IACjBM,EAAOoB,QAAQC,OAAOpG,iBAAiB,OAAQ,KAC7CH,OAAOC,sBAAsB,IAAM2E,MAClC,CAACxE,MAAM,cAMV6F,EAAQvH,KAAK,KACjB,GAAGoC,EAAW,CACZA,EAAUgD,MAAM0C,UAAY,yBAE5B,MAAMC,EAAI9F,EAAS+F,SAAS,GAC5BD,EAAE3C,MAAM6C,QAAU,OAClBF,EAAE3C,MAAM0C,UAAY,yBACpBI,WAAW,KACTH,EAAE3C,MAAM6C,QAAU,IACjB,KAEHC,WAAW,KACTH,EAAE3C,MAAM0C,UAAY,IACnB,KACH1F,OAAY+F,OAEZC,MAAMC,KAAKpG,EAAS+F,UAAUM,MAAM,GAAI,GAAG5H,QAAQ6H,IACjDA,EAAGnH,aAMX,GAAGqC,EAAQ,CACT,IAAI+E,EAAYC,KAAKC,MAAQ,IACzBC,EAAOjF,EAAWkF,QAAUJ,EAAYK,EAAA,EAAkBC,uBAExD,OAAAnB,EAAA,GAAMgB,EAlLG,EAkLqB,IAAuB,IAAMA,EAAO,IAE1E,MAAMI,GACN,OAAQA,EAAiB9C,MACvB,IAAK,0BACH+C,QAAQC,KAAK,uCACZF,EAAiBG,SAAU,EAC5B,+BAAyBlJ,KAAK+C,GAAKA,EAAEC,QAAQC,SAC7CC,GAAO,EACPvD,EAAgB,KAChB,MACF,QACEqJ,QAAQG,MAAM,6BAA8BJ,GAC5C7F,GAAO,EAIX,OAAO,EAGT,OAAO,KAKT,MAAO,IAAW,OAAD,6BAGf,IAFAA,GAAO,IAEJ,CACD,GAAGA,EACD,MAIF,SADwBM,GAAQ,GAE9B,aAOR,MAAM,EAAO,IAAI,IAAK,eAAe,EAAM,IAClC7D,EACN,KAEGA,IAAeA,EAAgBqC,KACnCrC,EAAcK,KAAKoJ,IACjBA,MAGFC,EAAA,EAAgBC,YAAY,YAAa,CAACrF,EAAG,sBAGhC,a,gCChQf,yBAwDA,MAAM4E,EAAoB,IAvCnB,MAYL,cAQEU,KAAKT,iBAAmB,EAMxB,IAAejI,IAAI,sBAAsBb,KAAMwJ,IAC1CA,IACDD,KAAKT,iBAAmBU,KAK5B,IAAWC,gBAAgB,wBAA0BC,IACnDH,KAAKT,iBAAmBY,EAAKC,YAMnC,MAAmB,IAAed,kBAAoBA,GACvC","file":"16.049af2cb2d7656888f47.chunk.js","sourcesContent":["export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\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/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType<typeof getLang>;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","export default function bytesToBase64(bytes: number[] | Uint8Array) {\n let mod3: number;\n let result = '';\n\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if(mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(\n uint6ToBase64(nUint24 >>> 18 & 63),\n uint6ToBase64(nUint24 >>> 12 & 63),\n uint6ToBase64(nUint24 >>> 6 & 63),\n uint6ToBase64(nUint24 & 63)\n );\n nUint24 = 0;\n }\n }\n\n return result.replace(/A(?=A$|$)/g, '=');\n}\n\nexport function uint6ToBase64(nUint6: number) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise<string>((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise<void>;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise<void>((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise<void>>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n"],"sourceRoot":""}