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

1 line
72 KiB
Plaintext

{"version":3,"sources":["webpack:///./src/config/debug.ts","webpack:///./src/lib/rootScope.ts","webpack:///./src/config/databases/session.ts","webpack:///./src/lib/idb.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/helpers/object.ts","webpack:///./src/lib/logger.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/config/modes.ts","webpack:///./src/lib/storage.ts","webpack:///./src/lib/stateStorage.ts","webpack:///./src/config/databases/state.ts","webpack:///./src/helpers/blob.ts"],"names":["DEBUG","debug","MOUNT_CLASS_TO","window","self","RootScope","super","_overlayIsActive","myId","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","peerId","this","addEventListener","e","id","status","name","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","isNight","getTheme","colorScheme","document","head","querySelector","setAttribute","documentElement","classList","toggle","value","settings","theme","themes","find","t","rootScope","version","stores","IDBStorage","db","storeName","storageIsAvailable","test","log","openDatabase","STORAGES","push","forEach","storage","onclose","close","closeDatabases","storages","promises","Array","from","Set","map","dbName","reject","deleteRequest","indexedDB","deleteDatabase","onerror","onsuccess","all","createNew","openDbPromise","request","open","error","message","finished","setTimeout","type","event","result","calledNew","onabort","transaction","target","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","store","objectStoreNames","contains","os","createObjectStore","indexes","length","index","createIndex","indexName","keyPath","objectParameters","entryName","isArray","concat","getObjectStore","objectStore","delete","clear","idx","put","fileName","blob","Blob","save","get","mode","perf","performance","now","then","clearTimeout","timeout","oncomplete","results","r","requests","getAll","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","args","throttle","isPending","interval","_args","setInterval","clearInterval","pause","fastRafCallbacks","fastRaf","callback","requestAnimationFrame","currentCallbacks","undefined","cb","doubleRaf","copy","obj","Date","getTime","el","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","Object","keys","tx","every","key","defineNotNumerableProperties","names","props","writable","configurable","out","defineProperties","getObjectKeysAndSort","object","sort","ids","i","a","b","safeReplaceObject","wasObject","newObject","safeReplaceArrayInObject","v","isObject","getDeepProperty","splitted","split","o","setDeepProperty","slice","join","pop","validateInitObject","initObject","currentObject","onReplace","previousKey","safeAssign","fromObject","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","dT","toFixed","logger","prefix","console","info","trace","setPrefix","_prefix","setLevel","level","reduce","acc","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","addNotifyListener","deferred","finally","cancel","assign","EventListenerBase","reuseResults","_constructor","listenerResults","once","findAndSplice","l","arr","listener","findIndex","removeEventListener","sessionStorage","appStorage","Modes","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","noop","AppStorage","cache","useStorage","getPromises","Map","keysToSet","saveDeferred","keysToDelete","deleteDeferred","saveThrottled","set","size","values","postMessage","payload","deleteThrottled","getThrottled","includes","useCache","getFromCache","p","catch","onlyLocal","setToCache","add","saveLocal","deleteAll","enabled","localStorage","setItem","JSON","stringify","stateStorage","readBlobAsText","reader","FileReader","srcElement","readAsText","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","bb","BlobBuilder","blobPart","append","getBlob"],"mappings":"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","file":"0.40f388e8260659b62f36.chunk.js","sourcesContent":["/*\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\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 { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap } from \"../layer\";\r\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\r\nimport type { AppMessagesManager, Dialog, MessagesStorage } from \"./appManagers/appMessagesManager\";\r\nimport type { Poll, PollResults } from \"./appManagers/appPollsManager\";\r\nimport type { MyDialogFilter } from \"./storages/filters\";\r\nimport type { ConnectionStatusChange } from \"../types\";\r\nimport type { UserTyping } from \"./appManagers/appChatsManager\";\r\nimport type Chat from \"../components/chat/chat\";\r\nimport type { UserAuth } from \"./mtproto/mtproto_config\";\r\nimport type { State, Theme } from \"./appManagers/appStateManager\";\r\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport type BroadcastEvents = {\r\n 'user_update': number,\r\n 'user_auth': UserAuth,\r\n 'peer_changed': number,\r\n 'peer_changing': Chat,\r\n 'peer_pinned_messages': {peerId: number, mids?: number[], pinned?: boolean, unpinAll?: true},\r\n 'peer_pinned_hidden': {peerId: number, maxId: number},\r\n 'peer_typings': {peerId: number, typings: UserTyping[]},\r\n 'peer_block': {peerId: number, blocked: boolean},\r\n 'peer_title_edit': number,\r\n 'peer_bio_edit': number,\r\n\r\n 'filter_delete': MyDialogFilter,\r\n 'filter_update': MyDialogFilter,\r\n 'filter_order': number[],\r\n \r\n 'dialog_draft': {peerId: number, draft: MyDraftMessage | undefined, index: number},\r\n 'dialog_unread': {peerId: number},\r\n 'dialog_flush': {peerId: number},\r\n 'dialog_drop': {peerId: number, dialog?: Dialog},\r\n 'dialog_migrate': {migrateFrom: number, migrateTo: number},\r\n //'dialog_top': Dialog,\r\n 'dialog_notify_settings': Dialog,\r\n 'dialogs_multiupdate': {[peerId: string]: Dialog},\r\n 'dialogs_archived_unread': {count: number},\r\n \r\n 'history_append': {storage: MessagesStorage, peerId: number, mid: number},\r\n 'history_update': {storage: MessagesStorage, peerId: number, mid: number},\r\n 'history_reply_markup': {peerId: number},\r\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\r\n 'history_delete': {peerId: number, msgs: {[mid: number]: true}},\r\n 'history_forbidden': number,\r\n 'history_reload': number,\r\n 'history_focus': {peerId: number, mid?: number},\r\n //'history_request': void,\r\n \r\n 'message_edit': {storage: MessagesStorage, peerId: number, mid: number},\r\n 'message_views': {mid: number, views: number},\r\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number},\r\n 'messages_pending': void,\r\n 'messages_read': void,\r\n 'messages_downloaded': {peerId: number, mids: number[]},\r\n 'messages_media_read': {peerId: number, mids: number[]},\r\n\r\n 'replies_updated': Message.message,\r\n\r\n 'scheduled_new': {peerId: number, mid: number},\r\n 'scheduled_delete': {peerId: number, mids: number[]},\r\n\r\n 'album_edit': {peerId: number, groupId: string, deletedMids: number[]},\r\n\r\n 'stickers_installed': StickerSet.stickerSet,\r\n 'stickers_deleted': StickerSet.stickerSet,\r\n\r\n 'audio_play': {doc: MyDocument, mid: number, peerId: number},\r\n 'audio_pause': void,\r\n \r\n 'state_cleared': void,\r\n 'state_synchronized': number | void,\r\n 'state_synchronizing': number | void,\r\n \r\n 'contacts_update': number,\r\n 'avatar_update': number,\r\n 'chat_full_update': number,\r\n 'poll_update': {poll: Poll, results: PollResults},\r\n 'chat_update': number,\r\n //'channel_settings': {channelId: number},\r\n 'webpage_updated': {id: string, msgs: number[]},\r\n\r\n 'download_progress': any,\r\n 'connection_status_change': ConnectionStatusChange,\r\n 'settings_updated': {key: string, value: any},\r\n 'draft_updated': {peerId: number, threadId: number, draft: MyDraftMessage | undefined},\r\n\r\n 'event-heavy-animation-start': void,\r\n 'event-heavy-animation-end': void,\r\n\r\n 'im_mount': void,\r\n 'im_tab_change': number,\r\n\r\n 'idle': boolean,\r\n\r\n 'overlay_toggle': boolean,\r\n\r\n 'background_change': void,\r\n\r\n 'privacy_update': Update.updatePrivacy,\r\n\r\n 'notify_settings': Update.updateNotifySettings,\r\n 'notify_peer_type_settings': {key: Exclude<NotifyPeer['_'], 'notifyPeer'>, settings: PeerNotifySettings},\r\n\r\n 'language_change': void,\r\n \r\n 'theme_change': void,\r\n\r\n 'instance_deactivated': void\r\n};\r\n\r\nexport class RootScope extends EventListenerBase<{\r\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\r\n} & {\r\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\r\n}> {\r\n private _overlayIsActive: boolean = false;\r\n public myId = 0;\r\n public idle = {\r\n isIDLE: true,\r\n deactivated: false,\r\n focusPromise: Promise.resolve(),\r\n focusResolve: () => {}\r\n };\r\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\r\n public settings: State['settings'];\r\n public peerId = 0;\r\n public systemTheme: Theme['name'];\r\n\r\n constructor() {\r\n super();\r\n\r\n this.addEventListener('peer_changed', (peerId) => {\r\n this.peerId = peerId;\r\n });\r\n\r\n this.addEventListener('user_auth', (e) => {\r\n this.myId = e.id;\r\n });\r\n\r\n this.addEventListener('connection_status_change', (e) => {\r\n const status = e;\r\n this.connectionStatus[e.name] = status;\r\n });\r\n\r\n this.addEventListener('idle', (isIDLE) => {\r\n if(isIDLE) {\r\n this.idle.focusPromise = new Promise((resolve) => {\r\n this.idle.focusResolve = resolve;\r\n });\r\n } else {\r\n this.idle.focusResolve();\r\n }\r\n });\r\n }\r\n\r\n public setThemeListener() {\r\n try {\r\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n const checkDarkMode = () => {\r\n //const theme = this.getTheme();\r\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\r\n //const newTheme = this.getTheme();\r\n\r\n if(this.myId) {\r\n this.dispatchEvent('theme_change');\r\n } else {\r\n this.setTheme();\r\n }\r\n };\r\n\r\n if('addEventListener' in darkModeMediaQuery) {\r\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\r\n } else if('addListener' in darkModeMediaQuery) {\r\n (darkModeMediaQuery as any).addListener(checkDarkMode);\r\n }\r\n\r\n checkDarkMode();\r\n } catch(err) {\r\n\r\n }\r\n }\r\n\r\n public setTheme() {\r\n const isNight = this.getTheme().name === 'night';\r\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\r\n if(colorScheme) {\r\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\r\n }\r\n\r\n document.documentElement.classList.toggle('night', isNight);\r\n }\r\n\r\n get overlayIsActive() {\r\n return this._overlayIsActive;\r\n }\r\n\r\n set overlayIsActive(value: boolean) {\r\n this._overlayIsActive = value;\r\n this.dispatchEvent('overlay_toggle', value);\r\n }\r\n\r\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\r\n return this.settings.themes.find(t => t.name === name);\r\n }\r\n}\r\n\r\nconst rootScope = new RootScope();\r\nMOUNT_CLASS_TO.rootScope = rootScope;\r\nexport default rootScope;\r\n\r\n/* rootScope.addEventListener('album_edit', (e) => {\r\n \r\n});\r\n\r\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\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 { Database } from '.';\r\n\r\nconst DATABASE_SESSION: Database<'session'> = {\r\n name: 'telegram',\r\n version: 1,\r\n stores: [{\r\n name: 'session'\r\n }]\r\n};\r\n\r\nexport default DATABASE_SESSION;\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 { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport { safeAssign } from '../helpers/object';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage<T extends Database<any>> {\r\n private static STORAGES: IDBStorage<Database<any>>[] = [];\r\n private openDbPromise: Promise<IDBDatabase>;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType<typeof logger>;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: string;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases() {\r\n this.STORAGES.forEach(storage => {\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise<void>((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise<IDBDatabase> {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', error.message)\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise<IDBDatabase>((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise<void> {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public deleteAll() {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'deleteAll' : '');\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct([blob]) as Blob;\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise<Blob> {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise<Blob>((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get<T>(entryName: string[]): Promise<T[]>;\r\n public get<T>(entryName: string): Promise<T>;\r\n public get<T>(entryName: string | string[]): Promise<T> | Promise<T[]> {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore<T>('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore<T>(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise<T>((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(this.storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll<T>(): Promise<T[]> {\r\n return this.getObjectStore<T[]>('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise<Array<string>> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise<boolean> {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\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\n// * Jolly Cobra's schedulers\r\nimport { AnyToVoidFunction, NoneToVoidFunction } from \"../types\";\r\n\r\n//type Scheduler = typeof requestAnimationFrame | typeof onTickEnd | typeof runNow;\r\n\r\nexport function debounce<F extends AnyToVoidFunction>(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n) {\r\n let waitingTimeout: number | null = null;\r\n\r\n return (...args: Parameters<F>) => {\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n waitingTimeout = null;\r\n } else if(shouldRunFirst) {\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n waitingTimeout = setTimeout(() => {\r\n if(shouldRunLast) {\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n waitingTimeout = null;\r\n }, ms) as any;\r\n };\r\n}\r\n\r\nexport function throttle<F extends AnyToVoidFunction>(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n) {\r\n let interval: number | null = null;\r\n let isPending: boolean;\r\n let args: Parameters<F>;\r\n\r\n return (..._args: Parameters<F>) => {\r\n isPending = true;\r\n args = _args;\r\n\r\n if(!interval) {\r\n if(shouldRunFirst) {\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n interval = setInterval(() => {\r\n if (!isPending) {\r\n clearInterval(interval!);\r\n interval = null;\r\n return;\r\n }\r\n\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }, ms) as any;\r\n }\r\n };\r\n}\r\n\r\n/* export function throttleWithRaf<F extends AnyToVoidFunction>(fn: F) {\r\n return throttleWith(fastRaf, fn);\r\n}\r\n\r\nexport function throttleWithTickEnd<F extends AnyToVoidFunction>(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow<F extends AnyToVoidFunction>(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function throttleWith<F extends AnyToVoidFunction>(schedulerFn: Scheduler, fn: F) {\r\n let waiting = false;\r\n let args: Parameters<F>;\r\n\r\n return (..._args: Parameters<F>) => {\r\n args = _args;\r\n\r\n if (!waiting) {\r\n waiting = true;\r\n\r\n schedulerFn(() => {\r\n waiting = false;\r\n // @ts-ignore\r\n fn(...args);\r\n });\r\n }\r\n };\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nexport const pause = (ms: number) => new Promise<void>((resolve) => {\r\n setTimeout(resolve, ms);\r\n});\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise<void>((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\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 * 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 copy<T>(obj: T): T {\r\n //in case of premitives\r\n if(obj === null || typeof(obj) !== \"object\") {\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)) {\r\n // @ts-ignore\r\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n // @ts-ignore\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj){\r\n if(obj.hasOwnProperty(prop)) {\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function deepEqual(x: any, y: any): boolean {\r\n const ok = Object.keys, tx = typeof x, ty = typeof y;\r\n return x && y && tx === 'object' && tx === ty ? (\r\n ok(x).length === ok(y).length &&\r\n ok(x).every(key => deepEqual(x[key], y[key]))\r\n ) : (x === y);\r\n}\r\n\r\nexport function defineNotNumerableProperties(obj: {[key: string]: any}, names: string[]) {\r\n //const perf = performance.now();\r\n const props = {writable: true, configurable: true};\r\n const out: {[name: string]: typeof props} = {};\r\n names.forEach(name => {\r\n if(obj[name] === undefined) {\r\n out[name] = props;\r\n }\r\n });\r\n Object.defineProperties(obj, out);\r\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\r\n}\r\n\r\nexport function getObjectKeysAndSort(object: any, sort: 'asc' | 'desc' = 'asc') {\r\n if(!object) return [];\r\n const ids = Object.keys(object).map(i => +i);\r\n if(sort === 'asc') return ids.sort((a, b) => a - b);\r\n else return ids.sort((a, b) => b - a);\r\n}\r\n\r\nexport function safeReplaceObject(wasObject: any, newObject: any) {\r\n if(!wasObject) {\r\n return newObject;\r\n }\r\n\r\n for(var key in wasObject) {\r\n if(!newObject.hasOwnProperty(key)) {\r\n delete wasObject[key];\r\n }\r\n }\r\n\r\n for(var key in newObject) {\r\n //if (newObject.hasOwnProperty(key)) { // useless\r\n wasObject[key] = newObject[key];\r\n //}\r\n }\r\n \r\n return wasObject;\r\n}\r\n\r\n/**\r\n * Will be used for FILE_REFERENCE_EXPIRED\r\n * @param key \r\n * @param wasObject \r\n * @param newObject \r\n */\r\nexport function safeReplaceArrayInObject<K>(key: K, wasObject: any, newObject: any) {\r\n if('byteLength' in newObject[key]) { // Uint8Array\r\n newObject[key] = [...newObject[key]];\r\n }\r\n\r\n if(wasObject && wasObject[key] !== newObject[key]) {\r\n wasObject[key].length = newObject[key].length;\r\n (newObject[key] as any[]).forEach((v, i) => {\r\n wasObject[key][i] = v;\r\n });\r\n\r\n /* wasObject[key].set(newObject[key]); */\r\n newObject[key] = wasObject[key];\r\n }\r\n}\r\n\r\nexport function isObject(object: any) {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function getDeepProperty(object: any, key: string) {\r\n const splitted = key.split('.');\r\n let o: any = object;\r\n splitted.forEach(key => {\r\n if(!key) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n o = o[key];\r\n });\r\n \r\n return o;\r\n}\r\n\r\nexport function setDeepProperty(object: any, key: string, value: any) {\r\n const splitted = key.split('.');\r\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\r\n}\r\n\r\nexport function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\r\n for(const key in initObject) {\r\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\r\n currentObject[key] = copy(initObject[key]);\r\n onReplace && onReplace(previousKey || key);\r\n } else if(isObject(initObject[key])) {\r\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\r\n }\r\n }\r\n}\r\n\r\nexport function safeAssign(object: any, fromObject: any) {\r\n if(!fromObject) return;\r\n \r\n for(let i in fromObject) {\r\n if(fromObject[i] !== undefined) {\r\n object[i] = fromObject[i];\r\n }\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 DEBUG from \"../config/debug\";\r\n\r\nexport enum LogTypes {\r\n None = 0,\r\n Error = 1,\r\n Warn = 2,\r\n Log = 4,\r\n Debug = 8\r\n};\r\n\r\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\r\n\r\nconst _logTimer = Date.now();\r\nfunction dT() {\r\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\r\n}\r\n\r\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error) {\r\n if(!DEBUG/* || true */) {\r\n type = LogTypes.Error;\r\n }\r\n\r\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\r\n\r\n function Log(...args: any[]) {\r\n return type & LogTypes.Log && console.log(dT(), prefix, ...args);\r\n }\r\n \r\n Log.warn = function(...args: any[]) {\r\n return type & LogTypes.Warn && console.warn(dT(), prefix, ...args);\r\n };\r\n \r\n Log.info = function(...args: any[]) {\r\n return type & LogTypes.Log && console.info(dT(), prefix, ...args);\r\n };\r\n \r\n Log.error = function(...args: any[]) {\r\n return type & LogTypes.Error && console.error(dT(), prefix, ...args);\r\n };\r\n \r\n Log.trace = function(...args: any[]) {\r\n return type & LogTypes.Log && console.trace(dT(), prefix, ...args);\r\n };\r\n\r\n /* Log.debug = function(...args: any[]) {\r\n return level & LogLevels.debug && console.log(dT(), prefix, ...args);\r\n }; */\r\n\r\n Log.debug = function(...args: any[]) {\r\n return type & LogTypes.Debug && console.debug(dT(), prefix, ...args);\r\n };\r\n\r\n Log.setPrefix = function(_prefix: string) {\r\n prefix = '[' + _prefix + ']:';\r\n };\r\n\r\n Log.setPrefix(prefix);\r\n\r\n Log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\r\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\r\n };\r\n \r\n return Log;\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 interface CancellablePromise<T> extends Promise<T> {\r\n resolve?: (...args: any[]) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise<T>() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n lastNotify: undefined,\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise<T> = new Promise<T>((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise<ReturnType<typeof resolve>>();\r\n \r\n }; */\r\n\r\n deferred.finally(() => {\r\n deferred.notify = null;\r\n deferred.listeners.length = 0;\r\n deferred.lastNotify = null;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\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//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap<any, Record<any, Set<any>>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\nexport default class EventListenerBase<Listeners extends {[name: string]: Function}> {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], once?: boolean}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes<Listeners[k]>\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener<T extends keyof Listeners>(name: T, callback: Listeners[T], once?: boolean) {\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if(once) {\r\n return;\r\n }\r\n }\r\n \r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, once});\r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener<T extends keyof Listeners>(name: T, callback: Listeners[T]) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent<T extends keyof Listeners>(name: T, ...args: ArgumentTypes<Listeners[T]>) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array<SuperReturnType<Listeners[typeof name]>> = [];\r\n\r\n /* let a = e.wm.get(this)[name];\r\n if(!a) return arr;\r\n const listeners = [...a]; */\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener: any) => {\r\n const index = listeners.findIndex((l: any) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n arr.push(listener.callback(...args));\r\n\r\n if(listener.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n\r\n /* for(let i = 0, length = listeners.length; i < length; ++i) {\r\n const listener = listeners[i];\r\n arr.push(listener.callback(...args));\r\n\r\n if(listener.once) {\r\n listeners.splice(i, 1);\r\n --i;\r\n --length;\r\n }\r\n } */\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\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 { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport AppStorage from './storage';\r\nimport DATABASE_SESSION from '../config/databases/session';\r\n\r\nconst sessionStorage = new AppStorage<{\r\n dc: number,\r\n user_auth: UserAuth,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance\r\n}, typeof DATABASE_SESSION>(DATABASE_SESSION, 'session');\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\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\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false, //location.search.indexOf('http=1') > 0,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false\r\n};\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\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 { Database } from \"../config/databases\";\r\nimport DATABASE_SESSION from \"../config/databases/session\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { throttle } from \"../helpers/schedulers\";\r\nimport { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from \"./idb\";\r\n\r\nfunction noop() {}\r\n\r\nexport interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n};\r\n\r\nexport default class AppStorage<Storage extends Record<string, any>, T extends Database<any>/* Storage extends {[name: string]: any} *//* Storage extends Record<string, any> */> {\r\n private static STORAGES: AppStorage<any, Database<any>>[] = [];\r\n private storage: IDBStorage<T>;//new CacheStorageController('session');\r\n\r\n //private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial<Storage> = {};\r\n private useStorage = true;\r\n\r\n private getPromises: Map<keyof Storage, CancellablePromise<Storage[keyof Storage]>> = new Map();\r\n private getThrottled: () => void;\r\n\r\n private keysToSet: Set<keyof Storage> = new Set();\r\n private saveThrottled: () => void;\r\n private saveDeferred = deferredPromise<void>();\r\n\r\n private keysToDelete: Set<keyof Storage> = new Set();\r\n private deleteThrottled: () => void;\r\n private deleteDeferred = deferredPromise<void>();\r\n\r\n constructor(private db: T, storeName: typeof db['stores'][number]['name']) {\r\n this.storage = new IDBStorage<T>(db, storeName);\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise<void>();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n //console.log('setItem: will set', key/* , value */);\r\n //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n const values = keys.map(key => this.cache[key]);\r\n if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n }\r\n\r\n await this.storage.save(keys, values);\r\n //console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n //this.useCS = false;\r\n console.error('[AS]: set error:', e, keys/* , value */);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise<void>();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n }\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n this.storage.get(keys as string[]).then(values => {\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // @ts-ignore\r\n deferred.resolve(this.cache[key] = values[i]);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }, (error) => {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(error)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n //deferred.reject(error);\r\n deferred.resolve();\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, 16, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache<T extends keyof Storage>(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get<T extends keyof Storage>(key: T, useCache = true): Promise<Storage[T]> {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise<Storage[typeof key]>();\r\n this.getPromises.set(key, p);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial<Storage>, onlyLocal = false) {\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.setToCache(key, value);\r\n\r\n // let perf = /* DEBUG */false ? performance.now() : 0;\r\n // value = JSON.stringify(value);\r\n\r\n // if(perf) {\r\n // let elapsedTime = performance.now() - perf;\r\n // if(elapsedTime > 10) {\r\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\r\n // }\r\n // }\r\n \r\n /* perf = performance.now();\r\n value = stringify(value);\r\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n this.keysToSet.add(key);\r\n this.keysToDelete.delete(key);\r\n this.saveThrottled();\r\n }\r\n }\r\n }\r\n\r\n return this.useStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear() {\r\n return this.storage.deleteAll().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve());\r\n storage.getPromises.clear();\r\n\r\n if(storage.db === DATABASE_SESSION && 'localStorage' in self) { // * support legacy Webogram's localStorage\r\n localStorage.clear();\r\n }\r\n\r\n return storage.clear();\r\n } else {\r\n if(storage.db === DATABASE_SESSION && 'localStorage' in self) { // * support legacy Webogram's localStorage\r\n for(const i in storage.cache) {\r\n if(storage.cache[i] !== undefined) {\r\n localStorage.setItem(i, JSON.stringify(storage.cache[i]));\r\n }\r\n }\r\n }\r\n\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\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 { ChatSavedPosition } from './appManagers/appImManager';\r\nimport type { State } from './appManagers/appStateManager';\r\nimport type { AppDraftsManager } from './appManagers/appDraftsManager';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport { LangPackDifference } from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nconst stateStorage = new AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts']\r\n} & State, typeof DATABASE_STATE>(DATABASE_STATE, 'session');\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\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 { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\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 const readBlobAsText = (blob: Blob) => {\r\n return new Promise<string>(resolve => {\r\n const reader = new FileReader();\r\n reader.addEventListener('loadend', (e) => {\r\n // @ts-ignore\r\n resolve(e.srcElement.result);\r\n });\r\n reader.readAsText(blob);\r\n });\r\n};\r\n\r\nexport function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\r\n let blob;\r\n const safeMimeType = blobSafeMimeType(mimeType);\r\n try {\r\n blob = new Blob(blobParts, {type: safeMimeType});\r\n } catch(e) {\r\n // @ts-ignore\r\n let bb = new BlobBuilder;\r\n blobParts.forEach((blobPart: any) => {\r\n bb.append(blobPart);\r\n });\r\n blob = bb.getBlob(safeMimeType);\r\n }\r\n return blob;\r\n}\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport function blobSafeMimeType(mimeType: string) {\r\n if([\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/gif',\r\n 'image/webp',\r\n 'image/bmp',\r\n 'video/mp4',\r\n 'video/webm',\r\n 'video/quicktime',\r\n 'audio/ogg',\r\n 'audio/mpeg',\r\n 'audio/mp4',\r\n 'application/json',\r\n 'application/pdf'\r\n ].indexOf(mimeType) === -1) {\r\n return 'application/octet-stream';\r\n }\r\n\r\n return mimeType;\r\n}\r\n"],"sourceRoot":""}