tweb/public/2.31e698f52bca96957b1b.chunk.js.map
Eduard Kuzmenko 14597933ba Build
2021-06-14 16:53:09 +03:00

1 line
75 KiB
Plaintext

{"version":3,"sources":["webpack:///./src/lib/webp/webp.worker.ts","webpack:///./src/lib/webp/webpWorkerController.ts","webpack:///./src/lib/mtproto/singleInstance.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/mtprotoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/helpers/random.ts","webpack:///./src/helpers/string.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/lib/langPack.ts"],"names":["Worker_fn","Worker","webpWorkerController","convertPromises","this","worker","addEventListener","e","payload","data","fileName","indexOf","promise","bytes","resolve","reject","postMessage","init","undefined","isWebpSupportedCache","document","createElement","toDataURL","startsWith","hasOwnProperty","convertPromise","type","singleInstance","log","clearInstance","masterInstance","deactivated","warn","delete","deactivateInstance","deactivateTimeout","idle","dispatchEvent","checkInstance","isIDLE","time","Date","now","newInstance","id","instanceID","get","then","curInstance","set","xt_instance","startAll","initial","clearTimeout","stopAll","window","setTimeout","started","reset","setInterval","documentElement","dcId","url","logSuffix","super","debug","handleOpen","handleError","error","close","handleClose","removeListeners","handleMessage","event","byteLength","send","body","length","ws","logTypes","Error","Log","Debug","logger","connect","removeEventListener","WebSocket","binaryType","err","apiManagerProxy","performTaskWorker","buffer","salt","iterations","keyBytes","ivBytes","encryptedBytes","publicKey","x","y","m","toString","password","state","isNew","afterMessageIdTemp","taskId","awaiting","pending","updatesProcessor","hashes","apiPromisesSingle","apiPromisesCacheable","isSWRegistered","sockets","Map","taskListeners","onWorkerMessage","task","callback","update","progress","rootScope","finalizeTask","result","start","registerServiceWorker","addTaskListener","deleteDatabase","localStorage","clear","finally","location","reload","socketTask","socket","onOpen","onClose","onMessage","storageTask","i","keys","values","setItem","JSON","stringify","removeItem","registerWorker","navigator","serviceWorker","register","scope","registration","installing","waiting","active","onServiceWorkerFail","releasePending","controller","bind","isWebpSupported","name","onWorkerFirstMessage","once","deferred","taskName","args","Promise","params","push","forEach","method","options","o","prepareTempMessageId","messageId","invokeApi","queryJSON","cached","hash","_","includes","q","cache","item","override","fulfilled","timeout","cacheSeconds","timestamp","verify","queueId","userAuth","dcID","dc_id","enabled","nextRandomInt","maxValue","Math","floor","random","randomLong","limitSymbols","str","limitFrom","trim","slice","escapeRegExp","replace","encodeEntities","value","charCodeAt","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","out","cut","end","part","_arrayIndex","lastIndex","index","partLength","convertInputKeyToKey","inputKey","toLowerCase","convertKeyToInputKey","key","toUpperCase","capitalizeFirstLetter","string","charAt","bytesToHex","arr","join","bytesFromHex","hexString","len","parseInt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","convertToArrayBuffer","ArrayBuffer","BYTES_PER_ELEMENT","Uint8Array","bufferConcats","b","tmp","lastLength","langPack","I18n","pluralRules","cacheLangPackPromise","loadLocalLangPack","defaultCode","langPackCode","lastRequestedLangCode","all","lang","langSign","strings","formatLocalStrings","default","saveLangPack","from_version","lang_code","version","local","loadLangPack","langCode","requestedServerLanguage","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","v","getLangPack","_langPack","__langPack","___langPack","l","concat","appVersion","langPackVersion","applyLangPack","Intl","PluralRules","console","split","Array","from","querySelectorAll","element","instance","weakMap","superFormatter","input","indexHolder","match","p1","p2","p3","offset","append","format","plain","select","regExp","getCacheLangPack","getStrings","_Intl","Object","assign","WeakMap","IntlElementBase","property","classList","add","IntlElement","textContent","formatted","dataset","IntlDateElement","dateTimeFormat","DateTimeFormat","date","i18n","i18n_","_i18n","elements","useLast","delimiterKey"],"mappings":"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","file":"2.31e698f52bca96957b1b.chunk.js","sourcesContent":["export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"webp.worker.eafb4e17dc09d5858dc8.bundle.worker.js\");\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 WebpWorker from 'worker-loader!./webp.worker';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\n\r\nexport type WebpConvertTask = {\r\n type: 'convertWebp', \r\n payload: {\r\n fileName: string, \r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise<Uint8Array>} = {};\r\n private isWebpSupportedCache: boolean;\r\n \r\n init() {\r\n this.worker = new WebpWorker();\r\n this.worker.addEventListener('message', (e) => {\r\n const payload = (e.data as WebpConvertTask).payload;\r\n\r\n if(payload.fileName.indexOf('main-') === 0) {\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n } else {\r\n apiManagerProxy.postMessage(e.data);\r\n }\r\n });\r\n }\r\n\r\n postMessage(data: WebpConvertTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n isWebpSupported() {\r\n if(this.isWebpSupportedCache === undefined) {\r\n this.isWebpSupportedCache = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\r\n }\r\n\r\n return this.isWebpSupportedCache;\r\n }\r\n\r\n convert(fileName: string, bytes: Uint8Array) {\r\n fileName = 'main-' + fileName;\r\n\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n \r\n const convertPromise = deferredPromise<Uint8Array>();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;","import { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { nextRandomInt } from \"../../helpers/random\";\r\nimport { logger } from \"../logger\";\r\nimport rootScope from \"../rootScope\";\r\nimport sessionStorage from \"../sessionStorage\";\r\nimport apiManager from \"./mtprotoworker\";\r\n\r\nexport type AppInstance = {\r\n id: number,\r\n idle: boolean,\r\n time: number\r\n};\r\n\r\nconst CHECK_INSTANCE_INTERVAL = 5000; \r\nconst DEACTIVATE_TIMEOUT = 30000;\r\nconst MULTIPLE_TABS_THRESHOLD = 20000;\r\n\r\nexport class SingleInstance {\r\n private instanceID: number;\r\n private started: boolean;\r\n private masterInstance: boolean;\r\n private deactivateTimeout: number;\r\n private deactivated: boolean;\r\n private initial: boolean;\r\n private log = logger('INSTANCE');\r\n\r\n public start() {\r\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\r\n this.started = true;\r\n\r\n this.reset();\r\n //IdleManager.start();\r\n\r\n rootScope.addEventListener('idle', this.checkInstance);\r\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\r\n this.checkInstance();\r\n\r\n try {\r\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\r\n } catch(e) {}\r\n }\r\n }\r\n\r\n public reset() {\r\n this.instanceID = nextRandomInt(0xFFFFFFFF);\r\n this.masterInstance = false;\r\n if(this.deactivateTimeout) clearTimeout(this.deactivateTimeout);\r\n this.deactivateTimeout = 0;\r\n this.deactivated = false;\r\n this.initial = false;\r\n }\r\n\r\n public clearInstance = () => {\r\n if(this.masterInstance && !this.deactivated) {\r\n this.log.warn('clear master instance');\r\n sessionStorage.delete('xt_instance');\r\n }\r\n };\r\n\r\n public deactivateInstance = () => {\r\n if(this.masterInstance || this.deactivated) {\r\n return false;\r\n }\r\n\r\n this.log('deactivate');\r\n this.deactivateTimeout = 0;\r\n this.deactivated = true;\r\n this.clearInstance();\r\n //$modalStack.dismissAll();\r\n\r\n //document.title = _('inactive_tab_title_raw')\r\n\r\n rootScope.idle.deactivated = true;\r\n rootScope.dispatchEvent('instance_deactivated');\r\n };\r\n\r\n public checkInstance = (idle = rootScope.idle && rootScope.idle.isIDLE) => {\r\n if(this.deactivated) {\r\n return false;\r\n }\r\n \r\n const time = Date.now();\r\n const newInstance: AppInstance = {\r\n id: this.instanceID, \r\n idle, \r\n time\r\n };\r\n\r\n sessionStorage.get('xt_instance', false).then((curInstance: AppInstance) => {\r\n // this.log('check instance', newInstance, curInstance)\r\n if(!idle ||\r\n !curInstance ||\r\n curInstance.id === this.instanceID ||\r\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\r\n sessionStorage.set({xt_instance: newInstance});\r\n\r\n if(!this.masterInstance) {\r\n apiManager.startAll();\r\n if(!this.initial) {\r\n this.initial = true;\r\n } else {\r\n this.log.warn('now master instance', newInstance);\r\n }\r\n\r\n this.masterInstance = true;\r\n }\r\n\r\n if(this.deactivateTimeout) {\r\n clearTimeout(this.deactivateTimeout);\r\n this.deactivateTimeout = 0;\r\n }\r\n } else {\r\n if(this.masterInstance) {\r\n apiManager.stopAll();\r\n this.log.warn('now idle instance', newInstance);\r\n if(!this.deactivateTimeout) {\r\n this.deactivateTimeout = window.setTimeout(this.deactivateInstance, DEACTIVATE_TIMEOUT);\r\n }\r\n\r\n this.masterInstance = false;\r\n }\r\n }\r\n });\r\n };\r\n}\r\n\r\nconst singleInstance = new SingleInstance();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\r\nexport default singleInstance;\r\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"mtproto.worker.adee7968d7e3fd74e9b4.bundle.worker.js\");\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 { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType<typeof logger>;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log.error('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\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\r\nimport type { LocalStorageProxyDeleteTask, LocalStorageProxySetTask } from '../storage';\r\nimport type { InvokeApiOptions } from '../../types';\r\nimport type { MethodDeclMap } from '../../layer';\r\nimport MTProtoWorker from 'worker-loader!./mtproto.worker';\r\n//import './mtproto.worker';\r\nimport { isObject } from '../../helpers/object';\r\nimport CryptoWorkerMethods from '../crypto/crypto_methods';\r\nimport { logger } from '../logger';\r\nimport rootScope from '../rootScope';\r\nimport webpWorkerController from '../webp/webpWorkerController';\r\nimport type { DownloadOptions } from './apiFileManager';\r\nimport type { ServiceWorkerTask } from './mtproto.service';\r\nimport { UserAuth } from './mtproto_config';\r\nimport type { MTMessage } from './networker';\r\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport Socket from './transports/websocket';\r\nimport IDBStorage from '../idb';\r\nimport singleInstance from './singleInstance';\r\n\r\ntype Task = {\r\n taskId: number,\r\n task: string,\r\n args: any[]\r\n};\r\n\r\ntype HashResult = {\r\n hash: number,\r\n result: any\r\n};\r\n\r\ntype HashOptions = {\r\n [queryJSON: string]: HashResult\r\n};\r\n\r\nexport class ApiManagerProxy extends CryptoWorkerMethods {\r\n public worker: /* Window */Worker;\r\n public postMessage: (...args: any[]) => void;\r\n private afterMessageIdTemp = 0;\r\n\r\n private taskId = 0;\r\n private awaiting: {\r\n [id: number]: {\r\n resolve: any,\r\n reject: any,\r\n taskName: string\r\n }\r\n } = {} as any;\r\n private pending: Array<Task> = [];\r\n\r\n public updatesProcessor: (obj: any) => void = null;\r\n\r\n private log = logger('API-PROXY');\r\n\r\n private hashes: {[method: string]: HashOptions} = {};\r\n\r\n private apiPromisesSingle: {\r\n [q: string]: Promise<any>\r\n } = {};\r\n private apiPromisesCacheable: {\r\n [method: string]: {\r\n [queryJSON: string]: {\r\n timestamp: number,\r\n promise: Promise<any>,\r\n fulfilled: boolean,\r\n timeout?: number,\r\n params: any\r\n }\r\n }\r\n } = {};\r\n\r\n private isSWRegistered = true;\r\n\r\n private debug = DEBUG /* && false */;\r\n\r\n private sockets: Map<number, Socket> = new Map();\r\n\r\n private taskListeners: {[taskType: string]: (task: any) => void} = {};\r\n\r\n public onServiceWorkerFail: () => void;\r\n\r\n constructor() {\r\n super();\r\n this.log('constructor');\r\n\r\n singleInstance.start();\r\n\r\n this.registerServiceWorker();\r\n\r\n this.addTaskListener('clear', () => {\r\n const promise = IDBStorage.deleteDatabase();\r\n localStorage.clear(); // * clear legacy Webogram's localStorage\r\n promise.finally(() => {\r\n location.reload();\r\n });\r\n });\r\n\r\n this.addTaskListener('connectionStatusChange', (task: any) => {\r\n rootScope.dispatchEvent('connection_status_change', task.payload);\r\n });\r\n\r\n this.addTaskListener('convertWebp', (task) => {\r\n webpWorkerController.postMessage(task);\r\n });\r\n\r\n this.addTaskListener('socketProxy', (task) => {\r\n const socketTask = task.payload;\r\n const id = socketTask.id;\r\n //console.log('socketProxy', socketTask, id);\r\n\r\n if(socketTask.type === 'send') {\r\n const socket = this.sockets.get(id);\r\n socket.send(socketTask.payload);\r\n } else if(socketTask.type === 'close') {\r\n const socket = this.sockets.get(id);\r\n socket.close();\r\n } else if(socketTask.type === 'setup') {\r\n const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\r\n \r\n const onOpen = () => {\r\n //console.log('socketProxy onOpen');\r\n this.postMessage({\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'open',\r\n id\r\n }\r\n });\r\n };\r\n const onClose = () => {\r\n this.postMessage({\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'close',\r\n id\r\n }\r\n });\r\n\r\n socket.removeEventListener('open', onOpen);\r\n socket.removeEventListener('close', onClose);\r\n socket.removeEventListener('message', onMessage);\r\n this.sockets.delete(id);\r\n };\r\n const onMessage = (buffer: ArrayBuffer) => {\r\n this.postMessage({\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'message',\r\n id,\r\n payload: buffer\r\n }\r\n });\r\n };\r\n\r\n socket.addEventListener('open', onOpen);\r\n socket.addEventListener('close', onClose);\r\n socket.addEventListener('message', onMessage);\r\n this.sockets.set(id, socket);\r\n }\r\n });\r\n\r\n this.addTaskListener('localStorageProxy', (task: LocalStorageProxySetTask | LocalStorageProxyDeleteTask) => {\r\n const storageTask = task.payload;\r\n if(storageTask.type === 'set') {\r\n for(let i = 0, length = storageTask.keys.length; i < length; ++i) {\r\n if(storageTask.values[i] !== undefined) {\r\n localStorage.setItem(storageTask.keys[i], JSON.stringify(storageTask.values[i]));\r\n }\r\n }\r\n } else if(storageTask.type === 'delete') {\r\n for(let i = 0, length = storageTask.keys.length; i < length; ++i) {\r\n localStorage.removeItem(storageTask.keys[i]);\r\n }\r\n }\r\n });\r\n\r\n \r\n this.registerWorker();\r\n \r\n }\r\n\r\n public isServiceWorkerOnline() {\r\n return this.isSWRegistered;\r\n }\r\n\r\n private registerServiceWorker() {\r\n if(!('serviceWorker' in navigator)) return;\r\n \r\n const worker = navigator.serviceWorker;\r\n worker.register('./sw.js', {scope: './'}).then(registration => {\r\n this.log('SW registered', registration);\r\n this.isSWRegistered = true;\r\n\r\n const sw = registration.installing || registration.waiting || registration.active;\r\n sw.addEventListener('statechange', (e) => {\r\n this.log('SW statechange', e);\r\n });\r\n\r\n \r\n \r\n \r\n \r\n }, (err) => {\r\n this.isSWRegistered = false;\r\n this.log.error('SW registration failed!', err);\r\n\r\n if(this.onServiceWorkerFail) {\r\n this.onServiceWorkerFail();\r\n }\r\n });\r\n\r\n worker.addEventListener('controllerchange', () => {\r\n this.log.warn('controllerchange');\r\n this.releasePending();\r\n\r\n worker.controller.addEventListener('error', (e) => {\r\n this.log.error('controller error:', e);\r\n });\r\n });\r\n\r\n \r\n \r\n \r\n worker.addEventListener('message', (e) => {\r\n const task: ServiceWorkerTask = e.data;\r\n if(!isObject(task)) {\r\n return;\r\n }\r\n \r\n this.postMessage(task);\r\n });\r\n \r\n\r\n worker.addEventListener('messageerror', (e) => {\r\n this.log.error('SW messageerror:', e);\r\n });\r\n }\r\n\r\n private onWorkerFirstMessage(worker: any) {\r\n if(!this.worker) {\r\n this.worker = worker;\r\n this.log('set webWorker');\r\n\r\n this.postMessage = this.worker.postMessage.bind(this.worker);\r\n\r\n const isWebpSupported = webpWorkerController.isWebpSupported();\r\n this.log('WebP supported:', isWebpSupported);\r\n this.postMessage({type: 'webpSupport', payload: isWebpSupported});\r\n\r\n this.releasePending();\r\n }\r\n }\r\n\r\n public addTaskListener(name: keyof ApiManagerProxy['taskListeners'], callback: ApiManagerProxy['taskListeners'][typeof name]) {\r\n this.taskListeners[name] = callback;\r\n }\r\n\r\n private onWorkerMessage = (e: MessageEvent) => {\r\n //this.log('got message from worker:', e.data);\r\n\r\n const task = e.data;\r\n\r\n if(!isObject(task)) {\r\n return;\r\n }\r\n\r\n const callback = this.taskListeners[task.type];\r\n if(callback) {\r\n callback(task);\r\n return;\r\n }\r\n\r\n if(task.update) {\r\n if(this.updatesProcessor) {\r\n this.updatesProcessor(task.update);\r\n }\r\n } else if(task.progress) {\r\n rootScope.dispatchEvent('download_progress', task.progress);\r\n } else if(task.hasOwnProperty('result') || task.hasOwnProperty('error')) {\r\n this.finalizeTask(task.taskId, task.result, task.error);\r\n }\r\n };\r\n\r\n \r\n private registerWorker() {\r\n //return;\r\n\r\n const worker = new MTProtoWorker();\r\n //const worker = window;\r\n worker.addEventListener('message', this.onWorkerFirstMessage.bind(this, worker), {once: true});\r\n worker.addEventListener('message', this.onWorkerMessage);\r\n\r\n worker.addEventListener('error', (err) => {\r\n this.log.error('WORKER ERROR', err);\r\n });\r\n }\r\n \r\n\r\n private finalizeTask(taskId: number, result: any, error: any) {\r\n const deferred = this.awaiting[taskId];\r\n if(deferred !== undefined) {\r\n this.debug && this.log.debug('done', deferred.taskName, result, error);\r\n error ? deferred.reject(error) : deferred.resolve(result);\r\n delete this.awaiting[taskId];\r\n }\r\n }\r\n\r\n public performTaskWorker<T>(task: string, ...args: any[]) {\r\n this.debug && this.log.debug('start', task, args);\r\n\r\n return new Promise<T>((resolve, reject) => {\r\n this.awaiting[this.taskId] = {resolve, reject, taskName: task};\r\n \r\n const params = {\r\n task,\r\n taskId: this.taskId,\r\n args\r\n };\r\n\r\n this.pending.push(params);\r\n this.releasePending();\r\n \r\n this.taskId++;\r\n });\r\n }\r\n\r\n private releasePending() {\r\n //return;\r\n\r\n if(this.postMessage) {\r\n this.debug && this.log.debug('releasing tasks, length:', this.pending.length);\r\n this.pending.forEach(pending => {\r\n this.postMessage(pending);\r\n });\r\n \r\n this.debug && this.log.debug('released tasks');\r\n this.pending.length = 0;\r\n }\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public invokeApi<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise<MethodDeclMap[T]['res']> {\r\n //console.log('will invokeApi:', method, params, options);\r\n return this.performTaskWorker('invokeApi', method, params, options);\r\n }\r\n\r\n public invokeApiAfter<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise<MethodDeclMap[T]['res']> {\r\n let o = options;\r\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\r\n \r\n o = {...options};\r\n (options as MTMessage).messageId = o.prepareTempMessageId;\r\n\r\n //console.log('will invokeApi:', method, params, options);\r\n return this.invokeApi(method, params, o);\r\n }\r\n\r\n public invokeApiHashable<T extends keyof MethodDeclMap>(method: T, params: Omit<MethodDeclMap[T]['req'], 'hash'> = {} as any, options: InvokeApiOptions = {}): Promise<MethodDeclMap[T]['res']> {\r\n //console.log('will invokeApi:', method, params, options);\r\n\r\n const queryJSON = JSON.stringify(params);\r\n let cached: HashResult;\r\n if(this.hashes[method]) {\r\n cached = this.hashes[method][queryJSON];\r\n if(cached) {\r\n (params as any).hash = cached.hash;\r\n }\r\n }\r\n\r\n return this.invokeApi(method, params, options).then((result: any) => {\r\n if(result._.includes('NotModified')) {\r\n this.debug && this.log.warn('NotModified saved!', method, queryJSON);\r\n return cached.result;\r\n }\r\n \r\n if(result.hash/* || result.messages */) {\r\n const hash = result.hash/* || this.computeHash(result.messages) */;\r\n \r\n if(!this.hashes[method]) this.hashes[method] = {};\r\n this.hashes[method][queryJSON] = {\r\n hash,\r\n result\r\n };\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n public invokeApiSingle<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise<MethodDeclMap[T]['res']> {\r\n const q = method + '-' + JSON.stringify(params);\r\n if(this.apiPromisesSingle[q]) {\r\n return this.apiPromisesSingle[q];\r\n }\r\n\r\n return this.apiPromisesSingle[q] = this.invokeApi(method, params, options).finally(() => {\r\n delete this.apiPromisesSingle[q];\r\n });\r\n }\r\n\r\n public invokeApiCacheable<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise<MethodDeclMap[T]['res']> {\r\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\r\n const queryJSON = JSON.stringify(params);\r\n const item = cache[queryJSON];\r\n if(item && (!options.override || !item.fulfilled)) {\r\n return item.promise;\r\n }\r\n\r\n if(options.override) {\r\n if(item && item.timeout) {\r\n clearTimeout(item.timeout);\r\n delete item.timeout;\r\n }\r\n\r\n delete options.override;\r\n }\r\n\r\n let timeout: number;\r\n if(options.cacheSeconds) {\r\n timeout = window.setTimeout(() => {\r\n delete cache[queryJSON];\r\n }, options.cacheSeconds * 1000);\r\n delete options.cacheSeconds;\r\n }\r\n\r\n const promise = this.invokeApi(method, params, options);\r\n\r\n cache[queryJSON] = {\r\n timestamp: Date.now(),\r\n fulfilled: false,\r\n timeout,\r\n promise,\r\n params\r\n };\r\n\r\n return promise;\r\n }\r\n\r\n public clearCache<T extends keyof MethodDeclMap>(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\r\n const cache = this.apiPromisesCacheable[method];\r\n if(cache) {\r\n for(const queryJSON in cache) {\r\n const item = cache[queryJSON];\r\n if(verify(item.params)) {\r\n if(item.timeout) {\r\n clearTimeout(item.timeout);\r\n }\r\n\r\n delete cache[queryJSON];\r\n }\r\n }\r\n }\r\n }\r\n\r\n /* private computeHash(smth: any[]) {\r\n smth = smth.slice().sort((a, b) => a.id - b.id);\r\n //return smth.reduce((hash, v) => (((hash * 0x4F25) & 0x7FFFFFFF) + v.id) & 0x7FFFFFFF, 0);\r\n return smth.reduce((hash, v) => ((hash * 20261) + 0x80000000 + v.id) % 0x80000000, 0);\r\n } */\r\n\r\n public setBaseDcId(dcId: number) {\r\n return this.performTaskWorker('setBaseDcId', dcId);\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n return this.performTaskWorker('setQueueId', queueId);\r\n }\r\n\r\n public setUserAuth(userAuth: UserAuth | number) {\r\n if(typeof(userAuth) === 'number') {\r\n userAuth = {dcID: 0, id: userAuth};\r\n }\r\n \r\n rootScope.dispatchEvent('user_auth', userAuth);\r\n return this.performTaskWorker('setUserAuth', userAuth);\r\n }\r\n\r\n public getNetworker(dc_id: number, options?: InvokeApiOptions) {\r\n return this.performTaskWorker('getNetworker', dc_id, options);\r\n }\r\n\r\n public logOut(): Promise<void> {\r\n return this.performTaskWorker('logOut');\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n return this.performTaskWorker('cancelDownload', fileName);\r\n }\r\n\r\n public downloadFile(options: DownloadOptions) {\r\n return this.performTaskWorker('downloadFile', options);\r\n }\r\n\r\n public uploadFile(options: {file: Blob | File, fileName: string}) {\r\n return this.performTaskWorker('uploadFile', options);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.performTaskWorker('toggleStorage', enabled);\r\n }\r\n\r\n public stopAll() {\r\n return this.performTaskWorker('stopAll');\r\n }\r\n\r\n public startAll() {\r\n return this.performTaskWorker('startAll');\r\n }\r\n}\r\n\r\nconst apiManagerProxy = new ApiManagerProxy();\r\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\r\nexport default apiManagerProxy;\r\n","import { convertToArrayBuffer } from \"../../helpers/bytes\";\r\nimport type { InputCheckPasswordSRP } from \"../../layer\";\r\nimport { aesEncryptSync, aesDecryptSync, sha256HashSync, sha1HashSync, bytesModPow } from \"./crypto_utils\";\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker<T>(task: string, ...args: any[]): Promise<T>;\r\n\r\n public sha1Hash(bytes: Parameters<typeof sha1HashSync>[0]): Promise<Uint8Array> {\r\n return this.performTaskWorker<Uint8Array>('sha1-hash', bytes);\r\n }\r\n\r\n public sha256Hash(bytes: Parameters<typeof sha256HashSync>[0]) {\r\n return this.performTaskWorker<number[]>('sha256-hash', bytes);\r\n }\r\n\r\n public pbkdf2(buffer: Uint8Array, salt: Uint8Array, iterations: number) {\r\n return this.performTaskWorker<ArrayBuffer>('pbkdf2', buffer, salt, iterations);\r\n }\r\n\r\n public aesEncrypt(bytes: Parameters<typeof aesEncryptSync>[0], \r\n keyBytes: Parameters<typeof aesEncryptSync>[1], \r\n ivBytes: Parameters<typeof aesEncryptSync>[2]) {\r\n return this.performTaskWorker<ReturnType<typeof aesEncryptSync>>('aes-encrypt', convertToArrayBuffer(bytes), \r\n convertToArrayBuffer(keyBytes), convertToArrayBuffer(ivBytes));\r\n }\r\n\r\n public aesDecrypt(encryptedBytes: Parameters<typeof aesDecryptSync>[0], \r\n keyBytes: Parameters<typeof aesDecryptSync>[1], \r\n ivBytes: Parameters<typeof aesDecryptSync>[2]): Promise<ArrayBuffer> {\r\n return this.performTaskWorker<ArrayBuffer>('aes-decrypt', \r\n encryptedBytes, keyBytes, ivBytes)\r\n .then(bytes => convertToArrayBuffer(bytes));\r\n }\r\n\r\n public rsaEncrypt(publicKey: {modulus: string, exponent: string}, bytes: any): Promise<number[]> {\r\n return this.performTaskWorker<number[]>('rsa-encrypt', publicKey, bytes);\r\n }\r\n\r\n public factorize(bytes: Uint8Array) {\r\n return this.performTaskWorker<[number[], number[], number]>('factorize', [...bytes]);\r\n }\r\n\r\n public modPow(x: Parameters<typeof bytesModPow>[0], y: Parameters<typeof bytesModPow>[1], m: Parameters<typeof bytesModPow>[2]) {\r\n return this.performTaskWorker<ReturnType<typeof bytesModPow>>('mod-pow', x, y, m);\r\n }\r\n\r\n public gzipUncompress<T>(bytes: ArrayBuffer, toString?: boolean) {\r\n return this.performTaskWorker<T>('gzipUncompress', bytes, toString);\r\n }\r\n\r\n public computeSRP(password: string, state: any, isNew = false): Promise<InputCheckPasswordSRP> {\r\n return this.performTaskWorker('computeSRP', password, state, isNew);\r\n }\r\n}\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\r\nexport function nextRandomInt(maxValue: number) {\r\n return Math.floor(Math.random() * maxValue);\r\n}\r\n\r\nexport function randomLong() {\r\n return '' + nextRandomInt(0xFFFFFFFF) + nextRandomInt(0xFFFFFF);\r\n //return '' + parseInt(nextRandomInt(0xFFFFFFFF).toString(16) + nextRandomInt(0xFFFFFFFF).toString(16), 16);\r\n}\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\r\n/* export function stringMiddleOverflow(str: string, maxLength: number) {\r\n return str.length > maxLength ? str.slice(0, maxLength / 2 | 0) + '...' + str.slice(-Math.round(maxLength / 2)) : str; \r\n} */\r\n\r\nexport function limitSymbols(str: string, length: number, limitFrom = length + 10) {\r\n str = str.trim();\r\n if(str.length > limitFrom) {\r\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\r\n }\r\n\r\n return str;\r\n}\r\n\r\n// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\r\nexport function escapeRegExp(str: string) {\r\n return str\r\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\r\n .replace(/-/g, '\\\\x2d');\r\n}\r\n\r\nexport function encodeEntities(value: string) {\r\n return value.replace(/&/g, '&amp;').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\r\n var hi = value.charCodeAt(0);\r\n var low = value.charCodeAt(1);\r\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\r\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\r\n return '&#' + value.charCodeAt(0) + ';';\r\n }).replace(/</g, '&lt;').replace(/>/g, '&gt;');\r\n}\r\n\r\nexport function splitStringByLength(str: string, maxLength: number) {\r\n if(str.length < maxLength) return [str];\r\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\r\n const delimiter = ' ';//'\\n';\r\n const out: string[] = [];\r\n\r\n const cut = (end?: number) => {\r\n let part = str.slice(lastSliceStartIndex, end);\r\n const _arrayIndex = arrayIndex++;\r\n if(part.length > maxLength) {\r\n let overflowPart = part.slice(maxLength);\r\n const splitted = splitStringByLength(overflowPart, maxLength);\r\n splitted.forEach(part => {\r\n out[arrayIndex++] = part;\r\n });\r\n\r\n part = part.slice(0, maxLength);\r\n }\r\n\r\n lastSliceStartIndex = end;\r\n length = 0;\r\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\r\n };\r\n\r\n let lastIndex = 0;\r\n do {\r\n let index = str.indexOf(delimiter, lastIndex);\r\n if(index === -1) {\r\n if(lastIndex !== (str.length - 1)) {\r\n cut();\r\n }\r\n\r\n break;\r\n }\r\n\r\n index += delimiter.length;\r\n\r\n const partLength = index - lastIndex;\r\n if((length + partLength) > maxLength) {\r\n cut(length);\r\n }\r\n \r\n lastIndex = index;\r\n length += partLength;\r\n } while(true);\r\n\r\n return out;\r\n}\r\n\r\n// https://stackoverflow.com/a/14824756\r\n/* export const checkRTL = (s: string) => { \r\n const ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\r\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\r\n rtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']');\r\n\r\n return rtlDirCheck.test(s);\r\n}; */\r\n\r\n//(window as any).checkRTL = checkRTL;\r\n\r\nexport function convertInputKeyToKey(inputKey: string) {\r\n const str = inputKey.replace('input', '');\r\n return (str[0].toLowerCase() + str.slice(1)) as string;\r\n}\r\n\r\nexport function convertKeyToInputKey(key: string) {\r\n key = key[0].toUpperCase() + key.slice(1);\r\n key = 'input' + key;\r\n return key;\r\n}\r\n\r\nexport function capitalizeFirstLetter(string: string) {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n}\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\nexport function bytesToHex(bytes: ArrayLike<number>) {\r\n bytes = bytes || [];\r\n let arr: string[] = [];\r\n for(let i = 0; i < bytes.length; ++i) {\r\n arr.push((bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16));\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n let start = 0;\r\n let bytes: number[] = [];\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes.push(parseInt(hexString.charAt(0), 16));\r\n ++start;\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes.push(parseInt(hexString.substr(i, 2), 16));\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n}\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if((bytes as Uint8Array).buffer !== undefined) {\r\n return bytes as Uint8Array;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\nexport function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n}\r\n\r\nexport function bufferConcats(...args: any[]) {\r\n let length = 0;\r\n args.forEach(b => length += b.byteLength || b.length);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += b.byteLength || b.length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o: number[] = [];\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o.push((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: ArrayBuffer | Uint8Array) {\r\n let bytes: Uint8Array;\r\n if(input instanceof ArrayBuffer) bytes = new Uint8Array(input);\r\n else bytes = input;\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\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\r\nimport DEBUG, { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { capitalizeFirstLetter } from \"../helpers/string\";\r\nimport type lang from \"../lang\";\r\nimport type langSign from \"../langSign\";\r\nimport { LangPackDifference, LangPackString } from \"../layer\";\r\nimport apiManager from \"./mtproto/mtprotoworker\";\r\nimport stateStorage from \"./stateStorage\";\r\nimport App from \"../config/app\";\r\nimport rootScope from \"./rootScope\";\r\n\r\nexport const langPack: {[actionType: string]: LangPackKey} = {\r\n \"messageActionChatCreate\": \"ActionCreateGroup\",\r\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\r\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\r\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\r\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\r\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\r\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\r\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\r\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\r\n \"messageActionChatAddUser\": \"ActionAddUser\",\r\n \"messageActionChatAddUsers\": \"ActionAddUser\",\r\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\r\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\r\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\r\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\r\n \"messageActionPinMessage\": \"ActionPinnedNoText\",\r\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\r\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\r\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\r\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\r\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\r\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\r\n \"messageActionHistoryClear\": \"HistoryCleared\",\r\n\r\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\r\n\r\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\r\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\r\n\t\"messageActionPhoneCall.in_missed\": \"ChatList.Service.Call.Missed\",\r\n\t\"messageActionPhoneCall.out_missed\": \"ChatList.Service.Call.Cancelled\",\r\n\r\n\t\"messageActionGroupCall.started\": \"ActionGroupCallJustStarted\",\r\n\t\"messageActionGroupCall.started_by\": \"ActionGroupCallStarted\",\r\n\t\"messageActionGroupCall.started_byYou\": \"ActionGroupCallStartedByYou\",\r\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\r\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\r\n\r\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\"\r\n};\r\n\r\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\r\n\r\nnamespace I18n {\r\n\texport const strings: Map<LangPackKey, LangPackString> = new Map();\r\n\tlet pluralRules: Intl.PluralRules;\r\n\r\n\tlet cacheLangPackPromise: Promise<LangPackDifference>;\r\n\texport let lastRequestedLangCode: string;\r\n\texport let requestedServerLanguage = false;\r\n\texport function getCacheLangPack(): Promise<LangPackDifference> {\r\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\r\n\t\treturn cacheLangPackPromise = Promise.all([\r\n\t\t\tstateStorage.get('langPack') as Promise<LangPackDifference>,\r\n\t\t\tpolyfillPromise\r\n\t\t]).then(([langPack]) => {\r\n\t\t\tif(!langPack/* || true */) {\r\n\t\t\t\treturn loadLocalLangPack();\r\n\t\t\t} else if(DEBUG && false) {\r\n\t\t\t\treturn getLangPack(langPack.lang_code);\r\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\r\n\t\t\t\treturn getLangPack(langPack.lang_code);\r\n\t\t\t} */\r\n\t\t\t\r\n\t\t\tif(!lastRequestedLangCode) {\r\n\t\t\t\tlastRequestedLangCode = langPack.lang_code;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tapplyLangPack(langPack);\r\n\t\t\treturn langPack;\r\n\t\t}).finally(() => {\r\n\t\t\tcacheLangPackPromise = undefined;\r\n\t\t});\r\n\t}\r\n\r\n\texport function loadLocalLangPack() {\r\n\t\tconst defaultCode = App.langPackCode;\r\n\t\tlastRequestedLangCode = defaultCode;\r\n\t\treturn Promise.all([\r\n\t\t\timport('../lang'),\r\n\t\t\timport('../langSign')\r\n\t\t]).then(([lang, langSign]) => {\r\n\t\t\tconst strings: LangPackString[] = [];\r\n\t\t\tformatLocalStrings(lang.default, strings);\r\n\t\t\tformatLocalStrings(langSign.default, strings);\r\n\r\n\t\t\tconst langPack: LangPackDifference = {\r\n\t\t\t\t_: 'langPackDifference',\r\n\t\t\t\tfrom_version: 0,\r\n\t\t\t\tlang_code: defaultCode,\r\n\t\t\t\tstrings,\r\n\t\t\t\tversion: 0,\r\n\t\t\t\tlocal: true\r\n\t\t\t};\r\n\t\t\treturn saveLangPack(langPack);\r\n\t\t});\r\n\t}\r\n\r\n\texport function loadLangPack(langCode: string) {\r\n\t\trequestedServerLanguage = true;\r\n\t\treturn Promise.all([\r\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\r\n\t\t\t\tlang_code: langCode,\r\n\t\t\t\tlang_pack: App.langPack\r\n\t\t\t}),\r\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\r\n\t\t\t\tlang_code: langCode,\r\n\t\t\t\tlang_pack: 'android'\r\n\t\t\t}),\r\n\t\t\timport('../lang'),\r\n\t\t\timport('../langSign'),\r\n\t\t\tpolyfillPromise\r\n\t\t]);\r\n\t}\r\n\r\n\texport function getStrings(langCode: string, strings: string[]) {\r\n\t\treturn apiManager.invokeApi('langpack.getStrings', {\r\n\t\t\tlang_pack: App.langPack,\r\n\t\t\tlang_code: langCode,\r\n\t\t\tkeys: strings\r\n\t\t});\r\n\t}\r\n\r\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\r\n\t\tfor(const i in strings) {\r\n\t\t\t// @ts-ignore\r\n\t\t\tconst v = strings[i];\r\n\t\t\tif(typeof(v) === 'string') {\r\n\t\t\t\tpushTo.push({\r\n\t\t\t\t\t_: 'langPackString',\r\n\t\t\t\t\tkey: i,\r\n\t\t\t\t\tvalue: v\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tpushTo.push({\r\n\t\t\t\t\t_: 'langPackStringPluralized',\r\n\t\t\t\t\tkey: i,\r\n\t\t\t\t\t...v\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn pushTo;\r\n\t}\r\n\r\n\texport function getLangPack(langCode: string) {\r\n\t\tlastRequestedLangCode = langCode;\r\n\t\treturn loadLangPack(langCode).then(([langPack, _langPack, __langPack, ___langPack, _]) => {\r\n\t\t\tlet strings: LangPackString[] = [];\r\n\r\n\t\t\t[__langPack, ___langPack].forEach(l => {\r\n\t\t\t\tformatLocalStrings(l.default as any, strings);\r\n\t\t\t});\r\n\r\n\t\t\tstrings = strings.concat(langPack.strings);\r\n\r\n\t\t\tfor(const string of _langPack.strings) {\r\n\t\t\t\tstrings.push(string);\r\n\t\t\t}\r\n\r\n\t\t\tlangPack.strings = strings;\r\n\t\t\treturn saveLangPack(langPack);\r\n\t\t});\r\n\t}\r\n\r\n\texport function saveLangPack(langPack: LangPackDifference) {\r\n\t\tlangPack.appVersion = App.langPackVersion;\r\n\r\n\t\treturn stateStorage.set({langPack}).then(() => {\r\n\t\t\tapplyLangPack(langPack);\r\n\t\t\treturn langPack;\r\n\t\t});\r\n\t}\r\n\r\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\r\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\r\n\t\t\treturn Promise.resolve();\r\n\t\t} else {\r\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\r\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\r\n\t\t\t});\r\n\t\t}\r\n\t})();\r\n\t\r\n\texport function applyLangPack(langPack: LangPackDifference) {\r\n\t\tif(langPack.lang_code !== lastRequestedLangCode) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code);\r\n\t\t} catch(err) {\r\n\t\t\tconsole.error('pluralRules error', err);\r\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\r\n\t\t}\r\n\r\n\t\tstrings.clear();\r\n\r\n\t\tfor(const string of langPack.strings) {\r\n\t\t\tstrings.set(string.key as LangPackKey, string);\r\n\t\t}\r\n\r\n\t\trootScope.dispatchEvent('language_change');\r\n\r\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\r\n\t\telements.forEach(element => {\r\n\t\t\tconst instance = weakMap.get(element);\r\n\r\n\t\t\tif(instance) {\r\n\t\t\t\tinstance.update();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\texport function superFormatter(input: string, args?: any[], indexHolder = {i: 0}) {\r\n\t\tlet out: (string | HTMLElement)[] = [];\r\n\t\tconst regExp = /(\\*\\*)(.+?)\\1|(\\n)|un\\d|%\\d\\$.|%./g;\r\n\r\n\t\tlet lastIndex = 0;\r\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, offset: number, string: string) => {\r\n\t\t\t//console.table({match, p1, p2, offset, string});\r\n\r\n\t\t\tout.push(string.slice(lastIndex, offset));\r\n\r\n\t\t\tif(p1) {\r\n\t\t\t\t//offset += p1.length;\r\n\t\t\t\tswitch(p1) {\r\n\t\t\t\t\tcase '**': {\r\n\t\t\t\t\t\tconst b = document.createElement('b');\r\n\t\t\t\t\t\tb.append(...superFormatter(p2, args, indexHolder));\r\n\t\t\t\t\t\tout.push(b);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if(p3) {\r\n\t\t\t\tout.push(document.createElement('br'));\r\n\t\t\t} else if(args) {\r\n\t\t\t\tout.push(args[indexHolder.i++]);\r\n\t\t\t}\r\n\r\n\t\t\tlastIndex = offset + match.length;\r\n\t\t\treturn '';\r\n\t\t});\r\n\t\r\n\t\tif(lastIndex !== input.length) {\r\n\t\t\tout.push(input.slice(lastIndex));\r\n\t\t}\r\n\r\n\t\treturn out;\r\n\t}\r\n\t\r\n\texport function format(key: LangPackKey, plain: true, args?: any[]): string;\r\n\texport function format(key: LangPackKey, plain?: false, args?: any[]): (string | HTMLElement)[];\r\n\texport function format(key: LangPackKey, plain = false, args?: any[]): (string | HTMLElement)[] | string {\r\n\t\tconst str = strings.get(key);\r\n\t\tlet input: string;\r\n\t\tif(str) {\r\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\r\n\t\t\t\tlet v = args[0] as number | string;\r\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\r\n\t\t\t\tconst s = pluralRules.select(v);\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\r\n\t\t\t} else if(str._ === 'langPackString') {\r\n\t\t\t\tinput = str.value;\r\n\t\t\t} else {\r\n\t\t\t\t//input = '[' + key + ']';\r\n\t\t\t\tinput = key;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t//input = '[' + key + ']';\r\n\t\t\tinput = key;\r\n\t\t}\r\n\t\t\r\n\t\tif(plain) {\r\n\t\t\tif(args?.length) {\r\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\r\n\t\t\t\tlet i = 0;\r\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\r\n\t\t\t\t\treturn '' + args[i++];\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\treturn input;\r\n\t\t} else {\r\n\t\t\treturn superFormatter(input, args);\r\n\t\t}\r\n\t}\r\n\r\n\texport const weakMap: WeakMap<HTMLElement, IntlElementBase<IntlElementBaseOptions>> = new WeakMap();\r\n\r\n\texport type IntlElementBaseOptions = {\r\n\t\telement?: HTMLElement,\r\n\t\tproperty?: /* 'innerText' | */'innerHTML' | 'placeholder',\r\n\t};\r\n\r\n\tabstract class IntlElementBase<Options extends IntlElementBaseOptions> {\r\n\t\tpublic element: IntlElementBaseOptions['element'];\r\n\t\tpublic property: IntlElementBaseOptions['property'] = 'innerHTML';\r\n\t\r\n\t\tconstructor(options: Options) {\r\n\t\t\tthis.element = options.element || document.createElement('span');\r\n\t\t\tthis.element.classList.add('i18n');\r\n\t\t\t\r\n\t\t\tthis.update(options);\r\n\t\t\tweakMap.set(this.element, this);\r\n\t\t}\r\n\r\n\t\tabstract update(options?: Options): void;\r\n\t}\r\n\r\n\texport type IntlElementOptions = IntlElementBaseOptions & {\r\n\t\tkey: LangPackKey,\r\n\t\targs?: any[]\r\n\t};\r\n\texport class IntlElement extends IntlElementBase<IntlElementOptions> {\r\n\t\tpublic key: IntlElementOptions['key'];\r\n\t\tpublic args: IntlElementOptions['args'];\r\n\r\n\t\tpublic update(options?: IntlElementOptions) {\r\n\t\t\tsafeAssign(this, options);\r\n\t\r\n\t\t\tif(this.property === 'innerHTML') {\r\n\t\t\t\tthis.element.textContent = '';\r\n\t\t\t\tthis.element.append(...format(this.key, false, this.args));\r\n\t\t\t} else {\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tconst v = this.element[this.property];\r\n\t\t\t\tconst formatted = format(this.key, true, this.args);\r\n\r\n\t\t\t\t// * hasOwnProperty won't work here\r\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\r\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\texport type IntlDateElementOptions = IntlElementBaseOptions & {\r\n\t\tdate: Date,\r\n\t\toptions: Intl.DateTimeFormatOptions\r\n\t};\r\n\texport class IntlDateElement extends IntlElementBase<IntlDateElementOptions> {\r\n\t\tpublic date: IntlDateElementOptions['date'];\r\n\t\tpublic options: IntlDateElementOptions['options'];\r\n\r\n\t\tpublic update(options?: IntlDateElementOptions) {\r\n\t\t\tsafeAssign(this, options);\r\n\t\r\n\t\t\t//var options = { month: 'long', day: 'numeric' };\r\n\t\t\t\r\n\t\t\t// * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\r\n\t\t\tconst dateTimeFormat = new Intl.DateTimeFormat(lastRequestedLangCode + '-u-hc-h23', this.options);\r\n\t\t\t\r\n\t\t\t(this.element as any)[this.property] = capitalizeFirstLetter(dateTimeFormat.format(this.date));\r\n\t\t}\r\n\t}\r\n\r\n\texport function i18n(key: LangPackKey, args?: any[]) {\r\n\t\treturn new IntlElement({key, args}).element;\r\n\t}\r\n\t\r\n\texport function i18n_(options: IntlElementOptions) {\r\n\t\treturn new IntlElement(options).element;\r\n\t}\r\n\r\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: any[], property?: IntlElementOptions['property']) {\r\n\t\treturn new IntlElement({element, key, args, property}).element;\r\n\t}\r\n}\r\n\r\nexport {I18n};\r\nexport default I18n;\r\n\r\nconst i18n = I18n.i18n;\r\nexport {i18n};\r\n\r\nconst i18n_ = I18n.i18n_;\r\nexport {i18n_};\r\n\r\nconst _i18n = I18n._i18n;\r\nexport {_i18n};\r\n\r\nexport function join(elements: HTMLElement[], useLast = true) {\r\n\tconst arr: HTMLElement[] = elements.slice(0, 1);\r\n for(let i = 1; i < elements.length; ++i) {\r\n const isLast = (elements.length - 1) === i;\r\n const delimiterKey: LangPackKey = isLast && useLast ? 'WordDelimiterLast' : 'WordDelimiter';\r\n arr.push(i18n(delimiterKey));\r\n arr.push(elements[i]);\r\n }\r\n\r\n\treturn arr;\r\n}\r\n\r\nMOUNT_CLASS_TO.I18n = I18n;\r\n"],"sourceRoot":""}