tweb/public/1.d2c62cecae9fa718483f.chunk.js.map
morethanwords f4b32fce4a Build
2021-04-20 22:02:08 +04:00

1 line
51 KiB
Plaintext

{"version":3,"sources":["webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/helpers/object.ts","webpack:///./src/lib/logger.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/helpers/blob.ts","webpack:///./src/config/database.ts","webpack:///./src/lib/idb.ts","webpack:///./src/lib/storage.ts"],"names":["STATE_VERSION","version","STATE_INIT","dialogs","allDialogsLoaded","chats","users","messages","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","topPeers","recentSearch","authState","_","hiddenPinnedMessages","settings","messagesTextSize","sendShortcut","animationsEnabled","autoDownload","contacts","private","groups","channels","autoPlay","gifs","videos","stickers","suggest","loop","themes","name","background","type","blur","slug","highlightningColor","color","theme","notifications","sound","drafts","ALL_KEYS","Object","keys","REFRESH_KEYS","AppStateManager","super","log","tempId","this","loadSavedState","loaded","Promise","resolve","all","concat","map","key","get","then","arr","state","forEach","idx","value","undefined","time","length","peerId","hasOwnProperty","find","t","nightTheme","auth","broadcast","id","catch","finally","setInterval","saveState","savePromise","dispatchEvent","set","peer","container","i","location","reload","appStateManager","copy","obj","getTime","Array","isArray","el","clonedObj","constructor","prop","deepEqual","x","y","ok","tx","every","defineNotNumerableProperties","names","props","writable","configurable","out","defineProperties","getObjectKeysAndSort","object","sort","ids","a","b","safeReplaceObject","wasObject","newObject","charAt","safeReplaceArrayInObject","v","isObject","getDeepProperty","splitted","split","o","setDeepProperty","slice","join","pop","validateInitObject","initObject","currentObject","safeAssign","fromObject","LogLevels","_logTimer","dT","toFixed","logger","prefix","level","warn","error","Log","args","console","info","trace","debug","setPrefix","_prefix","isAnimating","heavyAnimationPromise","promisesInQueue","bind","dispatchHeavyAnimationEvent","promise","timeout","promises","filter","Boolean","perf","performance","race","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","listenerSetter","add","addEventListener","remove","removeManual","removeEventListener","sessionStorage","storeName","appStorage","readBlobAsText","blob","reader","FileReader","e","srcElement","result","readAsText","blobConstruct","blobParts","mimeType","safeMimeType","indexOf","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","test","stores","options","storageIsAvailable","openDatabase","createNew","openDbPromise","request","indexedDB","open","Error","message","reject","finished","setTimeout","onerror","onsuccess","event","db","calledNew","onclose","onabort","transaction","target","close","onversionchange","onupgradeneeded","oldVersion","newVersion","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","entryName","objectStore","delete","clearTimeout","clear","handleError","save","put","fileName","err","storageOptions","cache","useStorage","storage","getFromCache","onlyLocal","setToCache","saveLocal","deleteAll"],"mappings":"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","file":"1.d2c62cecae9fa718483f.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Dialog } from './appMessagesManager';\nimport type { UserAuth } from '../mtproto/mtproto_config';\nimport type { AppUsersManager } from './appUsersManager';\nimport type { AppChatsManager } from './appChatsManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport type { AppDraftsManager } from './appDraftsManager';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport { logger } from '../logger';\nimport { copy, setDeepProperty, validateInitObject } from '../../helpers/object';\nimport { getHeavyAnimationPromise } from '../../hooks/useHeavyAnimationCheck';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\nconst STATE_VERSION = App.version;\n\ntype Background = {\n type: 'color' | 'image' | 'default',\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string,\n};\n\ntype Theme = {\n name: 'day' | 'night',\n background: Background\n};\n\nexport type State = Partial<{\n dialogs: Dialog[],\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n chats: {[peerId: string]: ReturnType<AppChatsManager['getChat']>},\n users: {[peerId: string]: ReturnType<AppUsersManager['getUser']>},\n messages: any[],\n contactsList: number[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeers: number[],\n recentSearch: number[],\n version: typeof STATE_VERSION,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: string]: number},\n settings: {\n messagesTextSize: number,\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts: boolean\n private: boolean\n groups: boolean\n channels: boolean\n },\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n },\n drafts: AppDraftsManager['drafts']\n}>;\n\nexport const STATE_INIT: State = {\n dialogs: [],\n allDialogsLoaded: {},\n chats: {},\n users: {},\n messages: [],\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeers: [],\n recentSearch: [],\n version: STATE_VERSION,\n authState: {\n _: 'authStateSignIn'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n themes: [{\n name: 'day',\n background: {\n type: 'image',\n blur: false,\n slug: 'ByxGo2lrMFAIAAAAmkJxZabh8eM', // * new blurred camomile,\n highlightningColor: 'hsla(85.5319, 36.9171%, 40.402%, 0.4)'\n }\n }, {\n name: 'night',\n background: {\n type: 'color',\n blur: false,\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)'\n }\n }],\n theme: 'day',\n notifications: {\n sound: false\n }\n },\n drafts: {}\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array<keyof State>;\n\nconst REFRESH_KEYS = ['dialogs', 'allDialogsLoaded', 'messages', 'contactsList', 'stateCreatedTime',\n 'updates', 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array<keyof State>;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise<void>\n}> {\n public static STATE_INIT = STATE_INIT;\n public loaded: Promise<State>;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n private savePromise: Promise<void>;\n private tempId = 0;\n\n constructor() {\n super();\n this.loadSavedState();\n }\n\n public loadSavedState() {\n if(this.loaded) return this.loaded;\n //console.time('load state');\n return this.loaded = new Promise((resolve) => {\n Promise.all(ALL_KEYS.concat('user_auth' as any).map(key => sessionStorage.get(key))).then((arr) => {\n let state: State = {};\n\n // ! then can't store false values\n ALL_KEYS.forEach((key, idx) => {\n const value = arr[idx];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n // @ts-ignore\n state[key] = copy(STATE_INIT[key]);\n }\n });\n\n const time = Date.now();\n /* if(state.version !== STATE_VERSION) {\n state = copy(STATE_INIT);\n } else */if((state.stateCreatedTime + REFRESH_EVERY) < time/* || true *//* && false */) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n \n REFRESH_KEYS.forEach(key => {\n // @ts-ignore\n state[key] = copy(STATE_INIT[key]);\n });\n\n const users: typeof state['users'] = {}, chats: typeof state['chats'] = {};\n if(state.recentSearch?.length) {\n state.recentSearch.forEach(peerId => {\n if(peerId < 0) chats[peerId] = state.chats[peerId];\n else users[peerId] = state.users[peerId];\n });\n }\n\n state.users = users;\n state.chats = chats;\n }\n\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n const theme = STATE_INIT.settings.themes.find(t => t.name === STATE_INIT.settings.theme);\n if(theme) {\n theme.background = copy(state.settings.background);\n }\n }\n\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n }\n\n validateInitObject(STATE_INIT, state);\n\n this.state = state;\n this.state.version = STATE_VERSION;\n\n // ! probably there is better place for it\n rootScope.settings = this.state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n const auth: UserAuth = arr[arr.length - 1] as any;\n if(auth) {\n // ! Warning ! DON'T delete this\n this.state.authState = {_: 'authStateSignedIn'};\n rootScope.broadcast('user_auth', typeof(auth) !== 'number' ? (auth as any).id : auth); // * support old version\n }\n \n //console.timeEnd('load state');\n resolve(this.state);\n }).catch(resolve).finally(() => {\n setInterval(() => {\n this.tempId++;\n this.saveState();\n }, 10000);\n });\n });\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public saveState() {\n if(this.state === undefined || this.savePromise) return;\n\n //return;\n\n const tempId = this.tempId;\n this.savePromise = getHeavyAnimationPromise().then(() => {\n return Promise.all(this.dispatchEvent('save', this.state))\n .then(() => getHeavyAnimationPromise())\n .then(() => sessionStorage.set(this.state))\n .then(() => {\n this.savePromise = null;\n \n if(this.tempId !== tempId) {\n this.saveState();\n }\n });\n });\n //let perf = performance.now();\n \n //this.log('saveState: event time:', performance.now() - perf);\n\n //const pinnedOrders = appMessagesManager.dialogsStorage.pinnedOrders;\n\n //perf = performance.now();\n \n //this.log('saveState: storage set time:', performance.now() - perf);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.broadcast('settings_updated', {key, value});\n }\n\n public pushToState<T extends keyof State>(key: T, value: State[T]) {\n this.state[key] = value;\n }\n\n public setPeer(peerId: number, peer: any) {\n const container = peerId > 0 ? this.state.users : this.state.chats;\n if(container.hasOwnProperty(peerId)) return;\n container[peerId] = peer;\n }\n\n public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n }\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport function copy<T>(obj: T): T {\n //in case of premitives\n if(obj === null || typeof(obj) !== \"object\") {\n return obj;\n }\n \n //date objects should be \n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n \n //handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\n return clonedArr;\n }\n \n //lastly, handle objects\n // @ts-ignore\n let clonedObj = new obj.constructor();\n for(var prop in obj){\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n\nexport function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every(key => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n\nexport function defineNotNumerableProperties(obj: {[key: string]: any}, names: string[]) {\n //const perf = performance.now();\n const props = {writable: true, configurable: true};\n const out: {[name: string]: typeof props} = {};\n names.forEach(name => {\n if(obj[name] === undefined) {\n out[name] = props;\n }\n });\n Object.defineProperties(obj, out);\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\n}\n\nexport function getObjectKeysAndSort(object: any, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = Object.keys(object).map(i => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\n}\n\nexport function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key) && key.charAt(0) !== '$') {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n //if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n //}\n }\n \n return wasObject;\n}\n\n/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key \n * @param wasObject \n * @param newObject \n */\nexport function safeReplaceArrayInObject<K>(key: K, wasObject: any, newObject: any) {\n if('byteLength' in newObject[key]) { // Uint8Array\n newObject[key] = [...newObject[key]];\n }\n\n if(wasObject && wasObject[key] !== newObject[key]) {\n wasObject[key].length = newObject[key].length;\n (newObject[key] as any[]).forEach((v, i) => {\n wasObject[key][i] = v;\n });\n\n /* wasObject[key].set(newObject[key]); */\n newObject[key] = wasObject[key];\n }\n}\n\nexport function isObject(object: any) {\n return typeof(object) === 'object' && object !== null;\n}\n\nexport function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach(key => {\n // @ts-ignore\n o = o[key];\n });\n \n return o;\n}\n\nexport function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n\nexport function validateInitObject(initObject: any, currentObject: any) {\n for(const i in initObject) {\n if(typeof(currentObject[i]) !== typeof(initObject[i])) {\n currentObject[i] = copy(initObject[i]);\n } else if(isObject(initObject[i])) {\n validateInitObject(initObject[i], currentObject[i]);\n }\n }\n}\n\nexport function safeAssign(object: any, fromObject: any) {\n if(!fromObject) return;\n \n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n object[i] = fromObject[i];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\n\nexport enum LogLevels {\n log = 1,\n warn = 2,\n error = 4,\n debug = 8\n};\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nexport function logger(prefix: string, level = LogLevels.log | LogLevels.warn | LogLevels.error) {\n if(!DEBUG/* || true */) {\n level = LogLevels.error;\n }\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n function Log(...args: any[]) {\n return level & LogLevels.log && console.log(dT(), prefix, ...args);\n }\n \n Log.warn = function(...args: any[]) {\n return level & LogLevels.warn && console.warn(dT(), prefix, ...args);\n };\n \n Log.info = function(...args: any[]) {\n return level & LogLevels.log && console.info(dT(), prefix, ...args);\n };\n \n Log.error = function(...args: any[]) {\n return level & LogLevels.error && console.error(dT(), prefix, ...args);\n };\n \n Log.trace = function(...args: any[]) {\n return level & LogLevels.log && console.trace(dT(), prefix, ...args);\n };\n\n /* Log.debug = function(...args: any[]) {\n return level & LogLevels.debug && console.log(dT(), prefix, ...args);\n }; */\n\n Log.debug = function(...args: any[]) {\n return level & LogLevels.debug && console.debug(dT(), prefix, ...args);\n };\n\n Log.setPrefix = function(_prefix: string) {\n prefix = '[' + _prefix + ']:';\n };\n\n Log.setPrefix(prefix);\n \n return Log;\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\n\n//import { useEffect } from '../lib/teact/teact';\nimport { AnyToVoidFunction } from '../types';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport { CancellablePromise, deferredPromise } from '../helpers/cancellablePromise';\nimport { pause } from '../helpers/schedulers';\nimport rootScope from '../lib/rootScope';\nimport DEBUG from '../config/debug';\n\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\n\nlet isAnimating = false;\nlet heavyAnimationPromise: CancellablePromise<void> = Promise.resolve();\nlet promisesInQueue = 0;\n\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\n\nexport const dispatchHeavyAnimationEvent = (promise: Promise<any>, timeout?: number) => {\n if(!isAnimating) {\n heavyAnimationPromise = deferredPromise<void>();\n rootScope.broadcast(ANIMATION_START_EVENT);\n isAnimating = true;\n DEBUG && log('start');\n }\n \n ++promisesInQueue;\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\n\n const promises = [\n timeout !== undefined ? pause(timeout) : undefined,\n promise.finally(() => {})\n ].filter(Boolean);\n\n const perf = performance.now();\n Promise.race(promises).then(() => {\n --promisesInQueue;\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\n if(!promisesInQueue) {\n isAnimating = false;\n promisesInQueue = 0;\n rootScope.broadcast(ANIMATION_END_EVENT);\n heavyAnimationPromise.resolve();\n\n DEBUG && log('end');\n }\n });\n\n return heavyAnimationPromise;\n};\n\nexport const getHeavyAnimationPromise = () => heavyAnimationPromise;\n\nexport default (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n listenerSetter?: ListenerSetter\n) => {\n //useEffect(() => {\n if(isAnimating) {\n handleAnimationStart();\n }\n\n const add = listenerSetter ? listenerSetter.add.bind(listenerSetter, rootScope) : rootScope.addEventListener.bind(rootScope);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\n add(ANIMATION_START_EVENT, handleAnimationStart);\n add(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\n remove(ANIMATION_START_EVENT, handleAnimationStart);\n };\n //}, [handleAnimationEnd, handleAnimationStart]);\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { ChatSavedPosition } from './appManagers/appImManager';\nimport type { State } from './appManagers/appStateManager';\nimport { MOUNT_CLASS_TO } from '../config/debug';\nimport { LangPackDifference } from '../layer';\nimport AppStorage from './storage';\n\nconst sessionStorage = new AppStorage<{\n dc: number,\n user_auth: number,\n dc1_auth_key: any,\n dc2_auth_key: any,\n dc3_auth_key: any,\n dc4_auth_key: any,\n dc5_auth_key: any,\n max_seen_msg: number,\n server_time_offset: number,\n\n chatPositions: {\n [peerId_threadId: string]: ChatSavedPosition\n },\n langPack: LangPackDifference\n} & State>({\n storeName: 'session'\n});\nMOUNT_CLASS_TO.appStorage = sessionStorage;\nexport default sessionStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport const readBlobAsText = (blob: Blob) => {\n return new Promise<string>(resolve => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // @ts-ignore\n resolve(e.srcElement.result);\n });\n reader.readAsText(blob);\n });\n};\n\nexport function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\n\nexport function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'application/json'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IDBStore } from \"../lib/idb\";\nimport Modes from \"./modes\";\n\nexport type DatabaseStoreName = 'session' | 'stickerSets';\nexport type DatabaseStore = Omit<IDBStore, 'name'> & {name: DatabaseStoreName};\nconst Database = {\n name: 'tweb' + (Modes.test ? '_test' : ''),\n version: 5,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }] as DatabaseStore[],\n};\n\nexport default Database;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Database from '../config/database';\nimport { blobConstruct } from '../helpers/blob';\nimport { safeAssign } from '../helpers/object';\nimport { logger } from './logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string, \n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nexport default class IDBStorage {\n public openDbPromise: Promise<IDBDatabase>;\n public storageIsAvailable = true;\n\n private log: ReturnType<typeof logger> = logger('IDB');\n \n public name: string = Database.name;\n public version: number = Database.version;\n public stores: IDBStore[] = Database.stores;\n\n public storeName: string;\n\n constructor(options: IDBOptions) {\n safeAssign(this, options);\n\n this.openDatabase(true);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise<IDBDatabase> {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n\n if(store.indexes?.length) {\n for(const index of store.indexes) {\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n }\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n throw new Error();\n }\n } catch(error) {\n this.log.error('error opening db', error.message)\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise<IDBDatabase>((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n \n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n \n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(db);\n };\n \n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n \n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n // @ts-ignore\n var db = event.target.result as IDBDatabase;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n \n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n }\n });\n };\n });\n }\n\n public delete(entryName: string): Promise<void> {\n //return Promise.resolve();\n return this.openDatabase().then((db) => {\n try {\n //this.log('delete: `' + entryName + '`');\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n\n var request = objectStore.delete(entryName);\n } catch(error) {\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.log.error('delete: request not finished!', entryName, request);\n resolve();\n }, 3000);\n\n request.onsuccess = (event) => {\n //this.log('delete: deleted file', event);\n resolve();\n clearTimeout(timeout);\n };\n \n request.onerror = (error) => {\n reject(error);\n clearTimeout(timeout);\n };\n });\n });\n }\n\n public deleteAll() {\n return this.openDatabase().then((db) => {\n //this.log('deleteAll');\n\n try {\n const transaction = db.transaction([this.storeName], 'readwrite');\n\n const objectStore = transaction.objectStore(this.storeName);\n var request = objectStore.clear();\n } catch(error) {\n return Promise.reject(error);\n }\n\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.log.error('deleteAll: request not finished', request);\n }, 3000);\n\n request.onsuccess = (event) => {\n resolve();\n clearTimeout(timeout);\n };\n \n request.onerror = (error) => {\n reject(error);\n clearTimeout(timeout);\n };\n });\n });\n }\n\n public save(entryName: string, value: any) {\n return this.openDatabase().then((db) => {\n //this.log('save:', entryName, value);\n\n const handleError = (error: Error) => {\n this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n if((!error || error.name === 'InvalidStateError')/* && false */) {\n setTimeout(() => {\n this.save(entryName, value);\n }, 2e3);\n } else {\n //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n }\n };\n\n try {\n const transaction = db.transaction([this.storeName], 'readwrite');\n transaction.onerror = (e) => {\n handleError(transaction.error);\n };\n /* transaction.oncomplete = (e) => {\n this.log('save: transaction complete:', entryName);\n }; */\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: save transaction abort!', transaction.error);\n }); */\n\n const objectStore = transaction.objectStore(this.storeName);\n var request = objectStore.put(value, entryName);\n } catch(error) {\n handleError(error);\n return Promise.reject(error);\n \n /* this.storageIsAvailable = false;\n throw error; */\n }\n\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.log.error('save: request not finished', entryName, request);\n }, 10000);\n\n request.onsuccess = (event) => {\n resolve();\n clearTimeout(timeout);\n };\n \n request.onerror = (error) => {\n reject(error);\n clearTimeout(timeout);\n };\n });\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n //return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct([blob]) as Blob;\n }\n\n return this.save(fileName, blob);\n }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise<Blob> {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise<Blob>((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n \n reader.onerror = reject;\n });\n \n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n \n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get<T>(entryName: string): Promise<T> {\n //return Promise.reject();\n return this.openDatabase().then((db) => {\n //this.log('get pre:', fileName);\n\n try {\n const transaction = db.transaction([this.storeName], 'readonly');\n /* transaction.onabort = (e) => {\n this.log.error('get transaction onabort?', e);\n }; */\n const objectStore = transaction.objectStore(this.storeName);\n var request = objectStore.get(entryName);\n \n //this.log.log('IDB get:', fileName, request);\n } catch(err) {\n this.log.error('get error:', err, entryName, request, request.error);\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.log.error('get request not finished!', entryName, request);\n reject();\n }, 3000);\n\n request.onsuccess = function(event) {\n const result = request.result;\n if(result === undefined) {\n reject('NO_ENTRY_FOUND');\n } /* else if(typeof result === 'string' &&\n result.substr(0, 5) === 'data:') {\n resolve(dataUrlToBlob(result));\n } */else {\n resolve(result);\n }\n\n clearTimeout(timeout);\n }\n \n request.onerror = () => {\n clearTimeout(timeout);\n reject();\n };\n });\n });\n }\n\n /* public getAllKeys(): Promise<Array<string>> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n \n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise<boolean> {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n \n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { DatabaseStore, DatabaseStoreName } from \"../config/database\";\nimport IDBStorage, { IDBOptions } from \"./idb\";\n\nexport default class AppStorage<Storage extends Record<string, any>/* Storage extends {[name: string]: any} *//* Storage extends Record<string, any> */> {\n private storage: IDBStorage;//new CacheStorageController('session');\n\n //private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\n private cache: Partial<Storage> = {};\n private useStorage = true;\n\n constructor(storageOptions: Omit<IDBOptions, 'storeName' | 'stores'> & {stores?: DatabaseStore[], storeName: DatabaseStoreName}) {\n this.storage = new IDBStorage(storageOptions);\n }\n\n public getCache() {\n return this.cache;\n }\n\n public getFromCache(key: keyof Storage) {\n return this.cache[key];\n }\n\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\n return this.cache[key] = value;\n }\n\n public async get(key: keyof Storage): Promise<Storage[typeof key]> {\n if(this.cache.hasOwnProperty(key)) {\n return this.getFromCache(key);\n } else if(this.useStorage) {\n let value: any;\n try {\n value = await this.storage.get(key as string);\n //console.log('[AS]: get result:', key, value);\n //value = JSON.parse(value);\n } catch(e) {\n if(e !== 'NO_ENTRY_FOUND') {\n this.useStorage = false;\n console.error('[AS]: get error:', e, key, value);\n }\n }\n\n return this.cache[key] = value;\n } else {\n throw 'something went wrong';\n }\n }\n\n public async set(obj: Partial<Storage>, onlyLocal = false) {\n //console.log('storageSetValue', obj, callback, arguments);\n\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.setToCache(key, value);\n\n // let perf = /* DEBUG */false ? performance.now() : 0;\n // value = JSON.stringify(value);\n\n // if(perf) {\n // let elapsedTime = performance.now() - perf;\n // if(elapsedTime > 10) {\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\n // }\n // }\n \n /* perf = performance.now();\n value = stringify(value);\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\n\n if(this.useStorage && !onlyLocal) {\n try {\n //console.log('setItem: will set', key/* , value */);\n //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\n //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\n await this.storage.save(key, value);\n //console.log('setItem: have set', key/* , value */);\n } catch(e) {\n //this.useCS = false;\n console.error('[AS]: set error:', e, key/* , value */);\n }\n }\n }\n }\n }\n\n public async remove(key: keyof Storage, saveLocal = false) {\n /* if(!this.cache.hasOwnProperty(key)) {\n return;\n } */\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n \n if(this.useStorage) {\n try {\n await this.storage.delete(key as string);\n } catch(e) {\n this.useStorage = false;\n console.error('[AS]: remove error:', e);\n }\n }\n }\n\n public clear() {\n return this.storage.deleteAll();\n }\n}\n"],"sourceRoot":""}