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

1 line
20 KiB
Plaintext

{"version":3,"sources":["webpack:///./src/lib/appManagers/appStateManager.ts"],"names":["STATE_VERSION","version","STATE_INIT","allDialogsLoaded","pinnedOrders","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","emoji","big","themes","name","background","type","blur","slug","highlightningColor","color","theme","notifications","sound","keepSigned","ALL_KEYS","Object","keys","REFRESH_KEYS","AppStateManager","super","log","neededPeers","Map","singlePeerMap","storages","users","chats","dialogs","storagesResults","storage","this","loadSavedState","loaded","console","time","Promise","resolve","storagesKeys","storagesPromises","map","key","getAll","promises","get","concat","all","then","arr","state","i","length","value","undefined","pushToState","splice","auth","shift","shiftedWebKAuth","push","values","dcID","baseDcId","id","obj","forEach","idx","set","localStorage","getItem","JSON","parse","err","getFromCache","error","dispatchEvent","s","r","hasOwnProperty","nightTheme","find","t","missingKey","timeEnd","catch","first","split","direct","peerId","limit","has","Set","add","keepPeerSingle","existsPeerId","delete","size","appStateManager"],"mappings":"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","file":"24.eb5598daa8a66bc40f29.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 type { Dialog } from './appMessagesManager';\r\nimport type { UserAuth } from '../mtproto/mtproto_config';\r\nimport type { User } from './appUsersManager';\r\nimport type { AuthState } from '../../types';\r\nimport type FiltersStorage from '../storages/filters';\r\nimport type DialogsStorage from '../storages/dialogs';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\nimport rootScope from '../rootScope';\r\nimport stateStorage from '../stateStorage';\r\nimport { logger } from '../logger';\r\nimport { copy, setDeepProperty, validateInitObject } from '../../helpers/object';\r\nimport App from '../../config/app';\r\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport AppStorage from '../storage';\r\nimport { Chat } from '../../layer';\r\nimport { isMobile } from '../../helpers/userAgent';\r\nimport DATABASE_STATE from '../../config/databases/state';\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\r\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\r\nconst STATE_VERSION = App.version;\r\n\r\nexport type Background = {\r\n type: 'color' | 'image' | 'default',\r\n blur: boolean,\r\n highlightningColor?: string,\r\n color?: string,\r\n slug?: string,\r\n};\r\n\r\nexport type Theme = {\r\n name: 'day' | 'night' | 'system',\r\n background: Background\r\n};\r\n\r\nexport type State = {\r\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\r\n pinnedOrders: DialogsStorage['pinnedOrders'],\r\n contactsList: number[],\r\n updates: Partial<{\r\n seq: number,\r\n pts: number,\r\n date: number\r\n }>,\r\n filters: FiltersStorage['filters'],\r\n maxSeenMsgId: number,\r\n stateCreatedTime: number,\r\n recentEmoji: string[],\r\n topPeers: number[],\r\n recentSearch: number[],\r\n version: typeof STATE_VERSION,\r\n authState: AuthState,\r\n hiddenPinnedMessages: {[peerId: string]: number},\r\n settings: {\r\n messagesTextSize: number,\r\n sendShortcut: 'enter' | 'ctrlEnter',\r\n animationsEnabled: boolean,\r\n autoDownload: {\r\n contacts: boolean\r\n private: boolean\r\n groups: boolean\r\n channels: boolean\r\n },\r\n autoPlay: {\r\n gifs: boolean,\r\n videos: boolean\r\n },\r\n stickers: {\r\n suggest: boolean,\r\n loop: boolean\r\n },\r\n emoji: {\r\n suggest: boolean,\r\n big: boolean\r\n },\r\n background?: Background, // ! DEPRECATED\r\n themes: Theme[],\r\n theme: Theme['name'],\r\n notifications: {\r\n sound: boolean\r\n },\r\n nightTheme?: boolean, // ! DEPRECATED\r\n },\r\n keepSigned: boolean\r\n};\r\n\r\nexport const STATE_INIT: State = {\r\n allDialogsLoaded: {},\r\n pinnedOrders: {},\r\n contactsList: [],\r\n updates: {},\r\n filters: {},\r\n maxSeenMsgId: 0,\r\n stateCreatedTime: Date.now(),\r\n recentEmoji: [],\r\n topPeers: [],\r\n recentSearch: [],\r\n version: STATE_VERSION,\r\n authState: {\r\n _: isMobile ? 'authStateSignIn' : 'authStateSignQr'\r\n },\r\n hiddenPinnedMessages: {},\r\n settings: {\r\n messagesTextSize: 16,\r\n sendShortcut: 'enter',\r\n animationsEnabled: true,\r\n autoDownload: {\r\n contacts: true,\r\n private: true,\r\n groups: true,\r\n channels: true\r\n },\r\n autoPlay: {\r\n gifs: true,\r\n videos: true\r\n },\r\n stickers: {\r\n suggest: true,\r\n loop: true\r\n },\r\n emoji: {\r\n suggest: true,\r\n big: true\r\n },\r\n themes: [{\r\n name: 'day',\r\n background: {\r\n type: 'image',\r\n blur: false,\r\n slug: 'ByxGo2lrMFAIAAAAmkJxZabh8eM', // * new blurred camomile,\r\n highlightningColor: 'hsla(85.5319, 36.9171%, 40.402%, 0.4)'\r\n }\r\n }, {\r\n name: 'night',\r\n background: {\r\n type: 'color',\r\n blur: false,\r\n color: '#0f0f0f',\r\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)'\r\n }\r\n }],\r\n theme: 'system',\r\n notifications: {\r\n sound: false\r\n }\r\n },\r\n keepSigned: true\r\n};\r\n\r\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array<keyof State>;\r\n\r\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\r\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array<keyof State>;\r\n\r\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array<keyof State>;\r\n\r\nexport class AppStateManager extends EventListenerBase<{\r\n save: (state: State) => Promise<void>,\r\n peerNeeded: (peerId: number) => void,\r\n peerUnneeded: (peerId: number) => void,\r\n}> {\r\n public static STATE_INIT = STATE_INIT;\r\n private loaded: Promise<State>;\r\n private log = logger('STATE'/* , LogLevels.error */);\r\n\r\n private state: State;\r\n\r\n private neededPeers: Map<number, Set<string>> = new Map();\r\n private singlePeerMap: Map<string, number> = new Map();\r\n\r\n public storages = {\r\n users: new AppStorage<Record<number, User>, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\r\n chats: new AppStorage<Record<number, Chat>, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\r\n dialogs: new AppStorage<Record<number, Dialog>, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\r\n };\r\n\r\n public storagesResults: {[key in keyof AppStateManager['storages']]: any[]} = {} as any;\r\n\r\n public storage = stateStorage;\r\n\r\n constructor() {\r\n super();\r\n this.loadSavedState();\r\n }\r\n\r\n public loadSavedState(): Promise<State> {\r\n if(this.loaded) return this.loaded;\r\n console.time('load state');\r\n this.loaded = new Promise((resolve) => {\r\n const storagesKeys = Object.keys(this.storages) as Array<keyof AppStateManager['storages']>;\r\n const storagesPromises: Promise<any>[] = storagesKeys.map(key => this.storages[key].getAll());\r\n\r\n const promises: Promise<any>[] = ALL_KEYS.map(key => stateStorage.get(key))\r\n .concat(sessionStorage.get('user_auth'))\r\n .concat(stateStorage.get('user_auth' as any)) // support old webk format\r\n .concat(storagesPromises);\r\n\r\n Promise.all(promises).then(async(arr) => {\r\n /* const self = this;\r\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\r\n const getHandler = (path?: string) => {\r\n return {\r\n get(target: any, key: any) {\r\n if(key === 'isProxy') {\r\n return true;\r\n }\r\n\r\n const prop = target[key];\r\n\r\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\r\n target[key] = new Proxy(prop, getHandler(path || key));\r\n return target[key];\r\n }\r\n \r\n return prop;\r\n },\r\n set(target: any, key: any, value: any) {\r\n console.log('Setting', target, `.${key} to equal`, value, path);\r\n \r\n target[key] = value;\r\n\r\n // @ts-ignore\r\n self.pushToState(path || key, path ? self.state[path] : value, false);\r\n\r\n return true;\r\n }\r\n };\r\n }; */\r\n\r\n let state: State = this.state = {} as any;\r\n\r\n // ! then can't store false values\r\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\r\n const key = ALL_KEYS[i];\r\n const value = arr[i];\r\n if(value !== undefined) {\r\n // @ts-ignore\r\n state[key] = value;\r\n } else {\r\n this.pushToState(key, copy(STATE_INIT[key]));\r\n }\r\n }\r\n\r\n arr.splice(0, ALL_KEYS.length);\r\n\r\n // * Read auth\r\n let auth = arr.shift() as UserAuth | number;\r\n let shiftedWebKAuth = arr.shift() as UserAuth | number;\r\n if(!auth && shiftedWebKAuth) { // support old webk auth\r\n auth = shiftedWebKAuth;\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\r\n keys.push('user_auth');\r\n values.push(typeof(auth) === 'number' ? {dcID: values[0] || App.baseDcId, id: auth} : auth);\r\n\r\n let obj: any = {};\r\n keys.forEach((key, idx) => {\r\n obj[key] = values[idx];\r\n });\r\n\r\n await sessionStorage.set(obj);\r\n }\r\n \r\n if(!auth) { // try to read Webogram's session from localStorage\r\n try {\r\n const keys = Object.keys(localStorage);\r\n for(let i = 0; i < keys.length; ++i) {\r\n const key = keys[i];\r\n let value: any;\r\n try {\r\n value = localStorage.getItem(key);\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n\r\n sessionStorage.set({\r\n [key as any]: value\r\n });\r\n }\r\n\r\n auth = sessionStorage.getFromCache('user_auth');\r\n } catch(err) {\r\n this.log.error('localStorage import error', err);\r\n }\r\n }\r\n\r\n if(auth) {\r\n // ! Warning ! DON'T delete this\r\n state.authState = {_: 'authStateSignedIn'};\r\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' ? {dcID: 0, id: auth} : auth); // * support old version\r\n }\r\n\r\n // * Read storages\r\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\r\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\r\n }\r\n\r\n arr.splice(0, storagesKeys.length);\r\n\r\n const time = Date.now();\r\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\r\n if(DEBUG) {\r\n this.log('will refresh state', state.stateCreatedTime, time);\r\n }\r\n\r\n const r = (keys: typeof REFRESH_KEYS) => {\r\n keys.forEach(key => {\r\n this.pushToState(key, copy(STATE_INIT[key]));\r\n \r\n // @ts-ignore\r\n const s = this.storagesResults[key];\r\n if(s && s.length) {\r\n s.length = 0;\r\n }\r\n });\r\n };\r\n \r\n r(REFRESH_KEYS);\r\n\r\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\r\n if(DEBUG) {\r\n this.log('will refresh updates');\r\n }\r\n\r\n r(REFRESH_KEYS_WEEK);\r\n } */\r\n }\r\n \r\n //state = this.state = new Proxy(state, getHandler());\r\n\r\n // * support old version\r\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\r\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\r\n this.pushToState('settings', state.settings);\r\n }\r\n\r\n // * support old version\r\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\r\n state.settings.themes = copy(STATE_INIT.settings.themes);\r\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\r\n if(theme) {\r\n theme.background = state.settings.background;\r\n this.pushToState('settings', state.settings);\r\n }\r\n }\r\n\r\n validateInitObject(STATE_INIT, state, (missingKey) => {\r\n // @ts-ignore\r\n this.pushToState(missingKey, state[missingKey]);\r\n });\r\n\r\n if(state.version !== STATE_VERSION) {\r\n this.pushToState('version', STATE_VERSION);\r\n }\r\n\r\n // ! probably there is better place for it\r\n rootScope.settings = state.settings;\r\n\r\n if(DEBUG) {\r\n this.log('state res', state, copy(state));\r\n }\r\n \r\n //return resolve();\r\n\r\n console.timeEnd('load state');\r\n resolve(state);\r\n }).catch(resolve);\r\n });\r\n\r\n return this.loaded;\r\n }\r\n\r\n public getState() {\r\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\r\n }\r\n\r\n public setByKey(key: string, value: any) {\r\n setDeepProperty(this.state, key, value);\r\n rootScope.dispatchEvent('settings_updated', {key, value});\r\n\r\n const first = key.split('.')[0];\r\n // @ts-ignore\r\n this.pushToState(first, this.state[first]);\r\n }\r\n\r\n public pushToState<T extends keyof State>(key: T, value: State[T], direct = true) {\r\n if(direct) {\r\n this.state[key] = value;\r\n }\r\n\r\n this.storage.set({\r\n [key]: value\r\n });\r\n }\r\n\r\n public requestPeer(peerId: number, type: string, limit?: number) {\r\n let set = this.neededPeers.get(peerId);\r\n if(set && set.has(type)) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = new Set();\r\n this.neededPeers.set(peerId, set);\r\n }\r\n\r\n set.add(type);\r\n this.dispatchEvent('peerNeeded', peerId);\r\n\r\n if(limit !== undefined) {\r\n this.keepPeerSingle(peerId, type);\r\n }\r\n }\r\n\r\n public isPeerNeeded(peerId: number) {\r\n return this.neededPeers.has(peerId);\r\n }\r\n\r\n public keepPeerSingle(peerId: number, type: string) {\r\n const existsPeerId = this.singlePeerMap.get(type);\r\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\r\n const set = this.neededPeers.get(existsPeerId);\r\n set.delete(type);\r\n\r\n if(!set.size) {\r\n this.neededPeers.delete(existsPeerId);\r\n this.dispatchEvent('peerUnneeded', existsPeerId);\r\n }\r\n }\r\n\r\n if(peerId) {\r\n this.singlePeerMap.set(type, peerId);\r\n }\r\n }\r\n\r\n /* public resetState() {\r\n for(let i in this.state) {\r\n // @ts-ignore\r\n this.state[i] = false;\r\n }\r\n sessionStorage.set(this.state).then(() => {\r\n location.reload();\r\n });\r\n } */\r\n}\r\n\r\n//console.trace('appStateManager include');\r\n\r\nconst appStateManager = new AppStateManager();\r\nMOUNT_CLASS_TO.appStateManager = appStateManager;\r\nexport default appStateManager;\r\n"],"sourceRoot":""}