forked from Ajaxy/telegram-tt
-
Notifications
You must be signed in to change notification settings - Fork 0
/
1367.d54e200170ee4943b335.js.map
1 lines (1 loc) · 54.1 KB
/
1367.d54e200170ee4943b335.js.map
1
{"version":3,"file":"1367.d54e200170ee4943b335.js","mappings":"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","sources":["webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/util/schedulers.ts","webpack://telegram-t/./src/serviceWorker/progressive.ts","webpack://telegram-t/./src/util/generateIdFor.ts","webpack://telegram-t/./src/serviceWorker/download.ts","webpack://telegram-t/./src/serviceWorker/assetCache.ts","webpack://telegram-t/./src/serviceWorker/pushNotification.ts","webpack://telegram-t/./src/util/Deferred.ts","webpack://telegram-t/./src/serviceWorker/share.ts","webpack://telegram-t/./src/serviceWorker.ts"],"sourcesContent":["import type { ApiLimitType } from './global/types';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram Web A';\nexport const APP_VERSION = process.env.APP_VERSION!;\nexport const RELEASE_DATETIME = process.env.RELEASE_DATETIME;\n\nexport const PRODUCTION_HOSTNAME = 'web.telegram.org';\n\nexport const DEBUG = process.env.APP_ENV !== 'production';\nexport const DEBUG_MORE = false;\nexport const STRICTERDOM_ENABLED = DEBUG;\n\nexport const IS_MOCKED_CLIENT = process.env.APP_MOCKED_CLIENT === '1';\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\nexport const IS_BETA = process.env.APP_ENV === 'staging';\n\nexport const BETA_CHANGELOG_URL = 'https://telegra.ph/WebA-Beta-03-20';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const PAGE_TITLE = process.env.APP_TITLE!;\nexport const INACTIVE_MARKER = '[Inactive]';\n\nexport const DEBUG_PAYMENT_SMART_GLOCAL = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\nexport const PASSCODE_CACHE_NAME = 'tt-passcode';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 500;\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 200;\nexport const GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_CUSTOM_EMOJI_LIMIT = 150;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const CUSTOM_EMOJI_PREVIEW_CACHE_DISABLED = false;\nexport const CUSTOM_EMOJI_PREVIEW_CACHE_NAME = 'tt-custom-emoji-preview';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs-v19';\nexport const ASSET_CACHE_NAME = 'tt-assets';\nexport const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500];\nexport const DATA_BROADCAST_CHANNEL_NAME = 'tt-global';\nexport const ESTABLISH_BROADCAST_CHANNEL_NAME = 'tt-establish';\nexport const MULTITAB_LOCALSTORAGE_KEY = 'tt-multitab';\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const ARCHIVE_MINIMIZED_HEIGHT = 36;\nexport const CHAT_HEIGHT_PX = 72;\nexport const TOPIC_HEIGHT_PX = 65;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const GLOBAL_TOPIC_SEARCH_SLICE = 5;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\nexport const TOPIC_LIST_SENSITIVE_AREA = 600;\nexport const COMMON_CHATS_LIMIT = 100;\nexport const GROUP_CALL_PARTICIPANTS_LIMIT = 100;\n\n// As in Telegram for Android\n// https://github.com/DrKLO/Telegram/blob/51e9947527/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java#L7799\nexport const TOP_REACTIONS_LIMIT = 100;\n\n// As in Telegram for Android\n// https://github.com/DrKLO/Telegram/blob/51e9947527/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java#L7781\nexport const RECENT_REACTIONS_LIMIT = 50;\nexport const REACTION_LIST_LIMIT = 100;\nexport const REACTION_UNREAD_SLICE = 100;\nexport const MENTION_UNREAD_SLICE = 100;\nexport const TOPICS_SLICE = 20;\nexport const TOPICS_SLICE_SECOND_LOAD = 500;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\n\nexport const SPONSORED_MESSAGE_CACHE_MS = 300000; // 5 min\n\nexport const DEFAULT_VOLUME = 1;\nexport const DEFAULT_PLAYBACK_RATE = 1;\nexport const PLAYBACK_RATE_FOR_AUDIO_MIN_DURATION = 20 * 60; // 20 min\n\nexport const ANIMATION_LEVEL_CUSTOM = -1;\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\nexport const SEND_MESSAGE_ACTION_INTERVAL = 3000; // 3s\n// 10000s from https://corefork.telegram.org/api/url-authorization#automatic-authorization\nexport const APP_CONFIG_REFETCH_INTERVAL = 10000 * 1000;\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n// eslint-disable-next-line max-len\nexport const EDITABLE_INPUT_CSS_SELECTOR = `.messages-layout .Transition_slide-active #${EDITABLE_INPUT_ID}, .messages-layout .Transition > .Transition_slide-to #${EDITABLE_INPUT_ID}`;\nexport const EDITABLE_INPUT_MODAL_CSS_SELECTOR = `#${EDITABLE_INPUT_MODAL_ID}`;\n\nexport const CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix';\nexport const MESSAGE_CONTENT_CLASS_NAME = 'message-content';\nexport const MESSAGE_CONTENT_SELECTOR = '.message-content';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MAX_SCREEN_WIDTH_FOR_EXPAND_PINNED_MESSAGES = 1340; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_MIN_ID = 5e9;\nexport const MAX_INT_32 = 2 ** 31 - 1;\nexport const TMP_CHAT_ID = '0';\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MIN_DURATION = 300;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_MAX_DISTANCE = 750;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 300; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const LOCK_SCREEN_ANIMATION_DURATION_MS = 200;\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 72;\nexport const EMOJI_SIZE_PICKER = 36;\nexport const COMPOSER_EMOJI_SIZE_PICKER = 32;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_PICKER_MAX_SHARED_COVERS = 20;\nexport const STICKER_SIZE_SEARCH = 72;\nexport const STICKER_SIZE_MODAL = 72;\nexport const EMOJI_SIZE_MODAL = 36;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_PASSCODE = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 100;\nexport const STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const STICKER_SIZE_JOIN_REQUESTS = 140;\nexport const STICKER_SIZE_INVITES = 140;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const RECENT_STATUS_LIMIT = 20;\nexport const EMOJI_STATUS_LOOP_LIMIT = 2;\nexport const EMOJI_SIZES = 7;\nexport const TOP_SYMBOL_SET_ID = 'top';\nexport const POPULAR_SYMBOL_SET_ID = 'popular';\nexport const RECENT_SYMBOL_SET_ID = 'recent';\nexport const FAVORITE_SYMBOL_SET_ID = 'favorite';\nexport const CHAT_STICKER_SET_ID = 'chatStickers';\nexport const PREMIUM_STICKER_SET_ID = 'premium';\nexport const DEFAULT_TOPIC_ICON_STICKER_ID = 'topic-default-icon';\nexport const DEFAULT_STATUS_ICON_ID = 'status-default-icon';\nexport const EMOJI_IMG_REGEX = /<img[^>]+alt=\"([^\"]+)\"(?![^>]*data-document-id)[^>]*>/gm;\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const VIDEO_MOV_TYPE = 'video/quicktime';\nexport const VIDEO_WEBM_TYPE = 'video/webm';\n\nexport const GIF_MIME_TYPE = 'image/gif';\n\nexport const SUPPORTED_IMAGE_CONTENT_TYPES = new Set([\n 'image/png', 'image/jpeg', GIF_MIME_TYPE,\n]);\n\nexport const SUPPORTED_VIDEO_CONTENT_TYPES = new Set([\n 'video/mp4', // video/quicktime added dynamically in environment.ts\n]);\n\nexport const SUPPORTED_AUDIO_CONTENT_TYPES = new Set([\n 'audio/mp3',\n 'audio/ogg',\n 'audio/wav',\n 'audio/mpeg',\n 'audio/flac',\n 'audio/aac',\n 'audio/m4a',\n 'audio/mp4',\n 'audio/x-m4a',\n]);\n\nexport const CONTENT_TYPES_WITH_PREVIEW = new Set([\n ...SUPPORTED_IMAGE_CONTENT_TYPES,\n ...SUPPORTED_VIDEO_CONTENT_TYPES,\n]);\n\nexport const CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram.';\n\n// Taken from https://github.com/telegramdesktop/tdesktop/blob/41d9a9fcbd0c809c60ddbd9350791b1436aff7d9/Telegram/SourceFiles/ui/boxes/choose_language_box.cpp#L28\nexport const SUPPORTED_TRANSLATION_LANGUAGES = [\n // Official\n 'en', 'ar', 'be', 'ca', 'zh', 'nl', 'fr', 'de', 'id',\n 'it', 'ja', 'ko', 'pl', 'pt', 'ru', 'es', 'uk',\n // Unofficial\n 'af', 'sq', 'am', 'hy', 'az', 'eu', 'bn', 'bs', 'bg',\n 'ceb', 'zh-CN', 'zh-TW', 'co', 'hr', 'cs', 'da', 'eo',\n 'et', 'fi', 'fy', 'gl', 'ka', 'el', 'gu', 'ht', 'ha',\n 'haw', 'he', 'iw', 'hi', 'hmn', 'hu', 'is', 'ig', 'ga',\n 'jv', 'kn', 'kk', 'km', 'rw', 'ku', 'ky', 'lo', 'la',\n 'lv', 'lt', 'lb', 'mk', 'mg', 'ms', 'ml', 'mt', 'mi',\n 'mr', 'mn', 'my', 'ne', 'no', 'ny', 'or', 'ps', 'fa',\n 'pa', 'ro', 'sm', 'gd', 'sr', 'st', 'sn', 'sd', 'si',\n 'sk', 'sl', 'so', 'su', 'sw', 'sv', 'tl', 'tg', 'ta',\n 'tt', 'te', 'th', 'tr', 'tk', 'ur', 'ug', 'uz', 'vi',\n 'cy', 'xh', 'yi', 'yo', 'zu',\n];\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TG_LINK = /^tg:(\\/\\/)?/i;\nexport const RE_TME_LINK = /^(https?:\\/\\/)?([-a-zA-Z0-9@:%_+~#=]{1,32}\\.)?t\\.me/i;\nexport const RE_TELEGRAM_LINK = /^(https?:\\/\\/)?telegram\\.org\\//i;\nexport const TME_LINK_PREFIX = 'https://t.me/';\nexport const USERNAME_PURCHASE_ERROR = 'USERNAME_PURCHASE_AVAILABLE';\nexport const PURCHASE_USERNAME = 'auction';\nexport const TME_WEB_DOMAINS = new Set(['t.me', 'web.t.me', 'a.t.me', 'k.t.me', 'z.t.me']);\nexport const WEB_APP_PLATFORM = 'weba';\n\n// eslint-disable-next-line max-len\nexport const COUNTRIES_WITH_12H_TIME_FORMAT = new Set(['AU', 'BD', 'CA', 'CO', 'EG', 'HN', 'IE', 'IN', 'JO', 'MX', 'MY', 'NI', 'NZ', 'PH', 'PK', 'SA', 'SV', 'US']);\n\nexport const API_CHAT_TYPES = ['bots', 'channels', 'chats', 'users'] as const;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = '777000';\nexport const REPLIES_USER_ID = '1271266957'; // TODO For Test connection ID must be equal to 708513\nexport const RESTRICTED_EMOJI_SET_ID = '7173162320003080';\nexport const DEFAULT_GIF_SEARCH_BOT_USERNAME = 'gif';\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = '-777';\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const GENERAL_TOPIC_ID = 1;\n\nexport const LIGHT_THEME_BG_COLOR = '#99BA92';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DEFAULT_PATTERN_COLOR = '#4A8E3A8C';\nexport const DARK_THEME_PATTERN_COLOR = '#0A0A0A8C';\nexport const MAX_UPLOAD_FILEPART_SIZE = 524288;\n\n// Group calls\nexport const GROUP_CALL_VOLUME_MULTIPLIER = 100;\nexport const GROUP_CALL_DEFAULT_VOLUME = 100 * GROUP_CALL_VOLUME_MULTIPLIER;\nexport const GROUP_CALL_THUMB_VIDEO_DISABLED = true;\n\nexport const DEFAULT_LIMITS: Record<ApiLimitType, readonly [number, number]> = {\n uploadMaxFileparts: [4000, 8000],\n stickersFaved: [5, 10],\n savedGifs: [200, 400],\n dialogFiltersChats: [100, 200],\n dialogFilters: [10, 20],\n dialogFolderPinned: [5, 10],\n captionLength: [1024, 2048],\n channels: [500, 1000],\n channelsPublic: [10, 20],\n aboutLength: [70, 140],\n chatlistInvites: [3, 100],\n chatlistJoined: [2, 20],\n};\n","export type Scheduler = typeof requestAnimationFrame | typeof onTickEnd;\n\nexport function debounce<F extends AnyToVoidFunction>(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters<F>) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle<F extends AnyToVoidFunction>(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters<F>;\n\n return (..._args: Parameters<F>) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithTickEnd<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWith<F extends AnyToVoidFunction>(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters<F>;\n\n return (..._args: Parameters<F>) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n fn(...args);\n });\n }\n };\n}\n\nexport function onIdle(cb: NoneToVoidFunction, timeout?: number) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb, { timeout });\n } else {\n onTickEnd(cb);\n }\n}\n\nexport const pause = (ms: number) => new Promise<void>((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise<void>((resolve) => {\n fastRaf(resolve);\n });\n}\n\nconst FAST_RAF_TIMEOUT_FALLBACK_MS = 300;\n\nlet fastRafCallbacks: Set<NoneToVoidFunction> | undefined;\nlet fastRafFallbackCallbacks: Set<NoneToVoidFunction> | undefined;\nlet fastRafFallbackTimeout: number | undefined;\n\n// May result in an immediate execution if called from another RAF callback which was scheduled\n// (and therefore is executed) earlier than RAF callback scheduled by `fastRaf`\nexport function fastRaf(callback: NoneToVoidFunction, withTimeoutFallback = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = new Set([callback]);\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n\n fastRafCallbacks = undefined;\n fastRafFallbackCallbacks = undefined;\n\n if (fastRafFallbackTimeout) {\n clearTimeout(fastRafFallbackTimeout);\n fastRafFallbackTimeout = undefined;\n }\n\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n fastRafCallbacks.add(callback);\n }\n\n if (withTimeoutFallback) {\n if (!fastRafFallbackCallbacks) {\n fastRafFallbackCallbacks = new Set([callback]);\n } else {\n fastRafFallbackCallbacks.add(callback);\n }\n\n if (!fastRafFallbackTimeout) {\n fastRafFallbackTimeout = window.setTimeout(() => {\n const currentTimeoutCallbacks = fastRafFallbackCallbacks!;\n\n if (fastRafCallbacks) {\n currentTimeoutCallbacks.forEach(fastRafCallbacks.delete, fastRafCallbacks);\n }\n fastRafFallbackCallbacks = undefined;\n\n if (fastRafFallbackTimeout) {\n clearTimeout(fastRafFallbackTimeout);\n fastRafFallbackTimeout = undefined;\n }\n\n currentTimeoutCallbacks.forEach((cb) => cb());\n }, FAST_RAF_TIMEOUT_FALLBACK_MS);\n }\n }\n}\n\nlet onTickEndCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onTickEnd(callback: NoneToVoidFunction) {\n if (!onTickEndCallbacks) {\n onTickEndCallbacks = [callback];\n\n Promise.resolve().then(() => {\n const currentCallbacks = onTickEndCallbacks!;\n onTickEndCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n onTickEndCallbacks.push(callback);\n }\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\n","import { pause } from '../util/schedulers';\nimport generateIdFor from '../util/generateIdFor';\nimport {\n DEBUG,\n MEDIA_CACHE_MAX_BYTES,\n MEDIA_PROGRESSIVE_CACHE_DISABLED,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n} from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\ntype PartInfo = {\n type: 'PartInfo';\n arrayBuffer: ArrayBuffer;\n mimeType: 'string';\n fullSize: number;\n};\n\ntype RequestStates = {\n resolve: (response: PartInfo) => void;\n reject: () => void;\n};\n\nconst MB = 1024 * 1024;\nconst DEFAULT_PART_SIZE = 0.5 * MB;\nconst MAX_END_TO_CACHE = 2 * MB - 1; // We only cache the first 2 MB of each file\nconst PART_TIMEOUT = 60000;\n\nconst requestStates = new Map<string, RequestStates>();\n\nexport async function respondForProgressive(e: FetchEvent) {\n const { url } = e.request;\n const range = e.request.headers.get('range');\n const bytes = /^bytes=(\\d+)-(\\d+)?$/g.exec(range || '')!;\n const start = Number(bytes[1]);\n const originalEnd = Number(bytes[2]);\n\n let end = originalEnd;\n if (!end || (end - start + 1) > DEFAULT_PART_SIZE) {\n end = start + DEFAULT_PART_SIZE - 1;\n }\n\n // Optimization for Safari\n if (start === 0 && end === 1) {\n const match = e.request.url.match(/fileSize=(\\d+)&mimeType=([\\w/]+)/);\n const fileSize = match && Number(match[1]);\n const mimeType = match?.[2];\n\n if (fileSize && mimeType) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: [\n ['Content-Range', `bytes 0-1/${fileSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', '2'],\n ['Content-Type', mimeType],\n ],\n });\n }\n }\n\n const cacheKey = `${url}?start=${start}&end=${end}`;\n const [cachedArrayBuffer, cachedHeaders] = !MEDIA_PROGRESSIVE_CACHE_DISABLED ? await fetchFromCache(cacheKey) : [];\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log(\n `FETCH PROGRESSIVE ${cacheKey} (request: ${start}-${originalEnd}) CACHED: ${Boolean(cachedArrayBuffer)}`,\n );\n }\n\n if (cachedArrayBuffer) {\n return new Response(cachedArrayBuffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: cachedHeaders,\n });\n }\n\n let partInfo;\n try {\n partInfo = await requestPart(e, { url, start, end });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('FETCH PROGRESSIVE', err);\n }\n }\n\n if (!partInfo) {\n return new Response('', {\n status: 500,\n statusText: 'Failed to fetch progressive part',\n });\n }\n\n const { arrayBuffer, fullSize, mimeType } = partInfo;\n\n const partSize = Math.min(end - start + 1, arrayBuffer.byteLength);\n end = start + partSize - 1;\n const arrayBufferPart = arrayBuffer.slice(0, partSize);\n const headers: [string, string][] = [\n ['Content-Range', `bytes ${start}-${end}/${fullSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', String(partSize)],\n ['Content-Type', mimeType],\n ];\n\n if (!MEDIA_PROGRESSIVE_CACHE_DISABLED && partSize <= MEDIA_CACHE_MAX_BYTES && end < MAX_END_TO_CACHE) {\n saveToCache(cacheKey, arrayBufferPart, headers);\n }\n\n return new Response(arrayBufferPart, {\n status: 206,\n statusText: 'Partial Content',\n headers,\n });\n}\n\n// We can not cache 206 responses: https://github.com/GoogleChrome/workbox/issues/1644#issuecomment-638741359\nasync function fetchFromCache(cacheKey: string) {\n const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME);\n\n return Promise.all([\n cache.match(`${cacheKey}&type=arrayBuffer`).then((r) => (r ? r.arrayBuffer() : undefined)),\n cache.match(`${cacheKey}&type=headers`).then((r) => (r ? r.json() : undefined)),\n ]);\n}\n\nasync function saveToCache(cacheKey: string, arrayBuffer: ArrayBuffer, headers: HeadersInit) {\n const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME);\n\n return Promise.all([\n cache.put(new Request(`${cacheKey}&type=arrayBuffer`), new Response(arrayBuffer)),\n cache.put(new Request(`${cacheKey}&type=headers`), new Response(JSON.stringify(headers))),\n ]);\n}\n\nexport async function requestPart(\n e: FetchEvent,\n params: { url: string; start: number; end: number },\n): Promise<PartInfo | undefined> {\n const isDownload = params.url.includes('/download/');\n const client = isDownload ? (await self.clients.matchAll())\n .find((c) => c.type === 'window' && c.frameType === 'top-level')\n : await (self.clients.get(e.clientId));\n if (!client) {\n return undefined;\n }\n\n const messageId = generateIdFor(requestStates);\n const requestState = {} as RequestStates;\n\n let isResolved = false;\n const promise = Promise.race([\n pause(PART_TIMEOUT).then(() => (isResolved ? undefined : Promise.reject(new Error('ERROR_PART_TIMEOUT')))),\n new Promise<PartInfo>((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n }),\n ]);\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n isResolved = true;\n });\n\n client.postMessage({\n type: 'requestPart',\n messageId,\n params,\n });\n\n return promise;\n}\n\nself.addEventListener('message', (e) => {\n const { type, messageId, result } = e.data as {\n type: string;\n messageId: string;\n result: PartInfo;\n };\n\n if (type === 'partResponse') {\n const requestState = requestStates.get(messageId);\n if (requestState) {\n requestState.resolve(result);\n }\n }\n});\n","export default function generateIdFor(store: AnyLiteral, withAutoUpdate = false) {\n let id;\n\n do {\n id = String(Math.random()).replace('0.', 'id');\n } while (store[id]);\n\n if (withAutoUpdate) {\n store[id] = true;\n }\n\n return id;\n}\n","import { DEBUG } from '../config';\nimport { requestPart } from './progressive';\n\nconst DOWNLOAD_PART_SIZE = 1024 * 1024;\nconst TEST_PART_SIZE = 64 * 1024;\n\nconst QUEUE_SIZE = 8;\n\nclass FilePartQueue<T> {\n queue: Promise<T>[];\n\n constructor() {\n this.queue = [];\n }\n\n push(task: Promise<T>) {\n this.queue.push(task);\n }\n\n async pop(): Promise<T> {\n const result = await this.queue.shift()!;\n return result;\n }\n\n get size() {\n return this.queue.length;\n }\n}\n\nexport async function respondForDownload(e: FetchEvent) {\n const { url } = e.request;\n\n let partInfo;\n try {\n partInfo = await requestPart(e, { url, start: 0, end: TEST_PART_SIZE });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('FETCH DOWNLOAD', err);\n }\n }\n\n if (!partInfo) {\n return new Response('', {\n status: 500,\n statusText: 'Failed to fetch file to download',\n });\n }\n\n const matchedFilename = e.request.url.match(/filename=(.*)/);\n const filenameHeader = matchedFilename ? `filename=\"${decodeURIComponent(matchedFilename[1])}\"` : '';\n const { fullSize, mimeType } = partInfo;\n\n const headers: [string, string][] = [\n ['Content-Length', String(fullSize)],\n ['Content-Type', mimeType],\n ['Content-Disposition', `attachment; ${filenameHeader}`],\n ];\n\n const queue = new FilePartQueue<ArrayBuffer | undefined>();\n const enqueue = (offset: number) => {\n queue.push(requestPart(e, {\n url, start: offset, end: offset + DOWNLOAD_PART_SIZE - 1,\n })\n .then((part) => part?.arrayBuffer));\n return offset + DOWNLOAD_PART_SIZE;\n };\n let lastOffset = 0;\n const stream = new ReadableStream({\n start() {\n for (let i = 0; i < QUEUE_SIZE; i++) {\n if (lastOffset >= fullSize) break;\n lastOffset = enqueue(lastOffset);\n }\n },\n\n async pull(controller) {\n const buffer = await queue.pop();\n if (!buffer) {\n controller.close();\n return;\n }\n controller.enqueue(new Uint8Array(buffer));\n\n if (buffer.byteLength < DOWNLOAD_PART_SIZE) {\n controller.close();\n return;\n }\n\n if (lastOffset < fullSize) {\n lastOffset = enqueue(lastOffset);\n }\n },\n });\n\n return new Response(stream, {\n status: 200,\n statusText: 'OK',\n headers,\n });\n}\n","import { ASSET_CACHE_NAME } from '../config';\nimport { pause } from '../util/schedulers';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\n// An attempt to fix freezing UI on iOS\nconst TIMEOUT = 3000;\n\nexport async function respondWithCacheNetworkFirst(e: FetchEvent) {\n const remote = await withTimeout(() => fetch(e.request), TIMEOUT);\n if (!remote?.ok) {\n return respondWithCache(e);\n }\n\n const toCache = remote.clone();\n self.caches.open(ASSET_CACHE_NAME).then((cache) => {\n return cache?.put(e.request, toCache);\n });\n\n return remote;\n}\n\nexport async function respondWithCache(e: FetchEvent) {\n const cacheResult = await withTimeout(async () => {\n const cache = await self.caches.open(ASSET_CACHE_NAME);\n const cached = await cache.match(e.request);\n\n return { cache, cached };\n }, TIMEOUT);\n\n const { cache, cached } = cacheResult || {};\n\n if (cache && cached) {\n if (cached.ok) {\n return cached;\n } else {\n await cache.delete(e.request);\n }\n }\n\n const remote = await fetch(e.request);\n\n if (remote.ok && cache) {\n cache.put(e.request, remote.clone());\n }\n\n return remote;\n}\n\nasync function withTimeout<T>(cb: () => Promise<T>, timeout: number) {\n let isResolved = false;\n\n try {\n return await Promise.race([\n pause(timeout).then(() => (isResolved ? undefined : Promise.reject(new Error('TIMEOUT')))),\n cb(),\n ]);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n } finally {\n isResolved = true;\n }\n}\n\nexport function clearAssetCache() {\n return self.caches.delete(ASSET_CACHE_NAME);\n}\n","import { APP_NAME, DEBUG, DEBUG_MORE } from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nenum Boolean {\n True = '1',\n False = '0',\n}\n\ntype PushData = {\n custom: {\n msg_id?: string;\n silent?: string;\n channel_id?: string;\n chat_id?: string;\n from_id?: string;\n };\n mute: Boolean;\n badge: Boolean;\n loc_key: string;\n loc_args: string[];\n random_id: number;\n title: string;\n description: string;\n};\n\ntype NotificationData = {\n messageId?: number;\n chatId?: string;\n title: string;\n body: string;\n isSilent?: boolean;\n icon?: string;\n reaction?: string;\n shouldReplaceHistory?: boolean;\n};\n\ntype FocusMessageData = {\n chatId?: string;\n messageId?: number;\n reaction?: string;\n shouldReplaceHistory?: boolean;\n};\n\ntype CloseNotificationData = {\n lastReadInboxMessageId?: number;\n chatId: string;\n};\n\nlet lastSyncAt = new Date().valueOf();\nconst shownNotifications = new Set();\nconst clickBuffer: Record<string, NotificationData> = {};\n\nfunction getPushData(e: PushEvent | Notification): PushData | undefined {\n try {\n return e.data.json();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Unable to parse push notification data', e.data);\n }\n return undefined;\n }\n}\n\nfunction getChatId(data: PushData) {\n if (data.custom.from_id) {\n return data.custom.from_id;\n }\n\n // Chats and channels have “negative” IDs\n if (data.custom.chat_id || data.custom.channel_id) {\n return `-${data.custom.chat_id || data.custom.channel_id}`;\n }\n\n return undefined;\n}\n\nfunction getMessageId(data: PushData) {\n if (!data.custom.msg_id) return undefined;\n return parseInt(data.custom.msg_id, 10);\n}\n\nfunction getNotificationData(data: PushData): NotificationData {\n let title = data.title || APP_NAME;\n const isSilent = data.custom?.silent === Boolean.True;\n if (isSilent) {\n title += ' 🔕';\n }\n return {\n chatId: getChatId(data),\n messageId: getMessageId(data),\n body: data.description,\n isSilent,\n title,\n };\n}\n\nasync function getClients() {\n const appUrl = new URL(self.registration.scope).origin;\n const clients = await self.clients.matchAll({ type: 'window' }) as WindowClient[];\n return clients.filter((client) => {\n return new URL(client.url).origin === appUrl;\n });\n}\n\nasync function playNotificationSound(id: string) {\n const clients = await getClients();\n const client = clients[0];\n if (!client) return;\n client.postMessage({\n type: 'playNotificationSound',\n payload: { id },\n });\n}\n\nfunction showNotification({\n chatId,\n messageId,\n body,\n title,\n icon,\n reaction,\n isSilent,\n shouldReplaceHistory,\n}: NotificationData) {\n const isFirstBatch = new Date().valueOf() - lastSyncAt < 1000;\n const tag = String(isFirstBatch ? 0 : chatId || 0);\n const options: NotificationOptions = {\n body,\n data: {\n chatId,\n messageId,\n reaction,\n count: 1,\n shouldReplaceHistory,\n },\n icon: icon || 'icon-192x192.png',\n badge: 'icon-192x192.png',\n tag,\n vibrate: [200, 100, 200],\n };\n\n return Promise.all([\n // TODO Update condition when reaction badges are implemented\n (!reaction && !isSilent) ? playNotificationSound(String(messageId) || chatId || '') : undefined,\n self.registration.showNotification(title, options),\n ]);\n}\n\nasync function closeNotifications({\n chatId,\n lastReadInboxMessageId,\n}: CloseNotificationData) {\n const notifications = await self.registration.getNotifications();\n const lastMessageId = lastReadInboxMessageId || Number.MAX_VALUE;\n notifications.forEach((notification) => {\n if (\n notification.tag === '0'\n || (notification.data.chatId === chatId && notification.data.messageId <= lastMessageId)\n ) {\n notification.close();\n }\n });\n}\n\nexport function handlePush(e: PushEvent) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Push received event', e);\n if (e.data) {\n // eslint-disable-next-line no-console\n console.log('[SW] Push received with data', e.data.json());\n }\n }\n\n const data = getPushData(e);\n\n // Do not show muted notifications\n if (!data || data.mute === Boolean.True) return;\n\n const notification = getNotificationData(data);\n\n // Don't show already triggered notification\n if (shownNotifications.has(notification.messageId)) {\n shownNotifications.delete(notification.messageId);\n return;\n }\n\n e.waitUntil(showNotification(notification));\n}\n\nasync function focusChatMessage(client: WindowClient, data: FocusMessageData) {\n if (!data.chatId) return;\n client.postMessage({\n type: 'focusMessage',\n payload: data,\n });\n if (!client.focused) {\n // Catch \"focus not allowed\" DOM Exceptions\n try {\n await client.focus();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[SW] ', error);\n }\n }\n }\n}\n\nexport function handleNotificationClick(e: NotificationEvent) {\n const appUrl = self.registration.scope;\n e.notification.close(); // Android needs explicit close.\n const { data } = e.notification;\n const notifyClients = async () => {\n const clients = await getClients();\n await Promise.all(clients.map((client) => {\n clickBuffer[client.id] = data;\n return focusChatMessage(client, data);\n }));\n if (!self.clients.openWindow || clients.length > 0) return undefined;\n // Store notification data for default client (fix for android)\n clickBuffer[0] = data;\n // If there is no opened client we need to open one and wait until it is fully loaded\n try {\n const newClient = await self.clients.openWindow(appUrl);\n if (newClient) {\n // Store notification data until client is fully loaded\n clickBuffer[newClient.id] = data;\n }\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[SW] ', error);\n }\n }\n return undefined;\n };\n e.waitUntil(notifyClients());\n}\n\nexport function handleClientMessage(e: ExtendableMessageEvent) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log('[SW] New message from client', e);\n }\n if (!e.data) return;\n const source = e.source as WindowClient;\n if (e.data.type === 'clientReady') {\n // focus on chat message when client is fully ready\n const data = clickBuffer[source.id] || clickBuffer[0];\n if (data) {\n delete clickBuffer[source.id];\n delete clickBuffer[0];\n e.waitUntil(focusChatMessage(source, data));\n }\n }\n if (e.data.type === 'showMessageNotification') {\n // store messageId for already shown notification\n const notification: NotificationData = e.data.payload;\n e.waitUntil((async () => {\n // Close existing notification if it is already shown\n if (notification.chatId) {\n const notifications = await self.registration.getNotifications({ tag: notification.chatId });\n notifications.forEach((n) => n.close());\n }\n // Mark this notification as shown if it was handled locally\n shownNotifications.add(notification.messageId);\n return showNotification(notification);\n })());\n }\n\n if (e.data.type === 'closeMessageNotifications') {\n e.waitUntil(closeNotifications(e.data.payload));\n }\n}\n\nself.addEventListener('sync', () => {\n lastSyncAt = Date.now();\n});\n","export default class Deferred<T = void> {\n promise: Promise<T>;\n\n reject!: (reason?: any) => void;\n\n resolve!: (value: T | PromiseLike<T>) => void;\n\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject;\n this.resolve = resolve;\n });\n }\n}\n","import Deferred from '../util/Deferred';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\ntype ShareData = {\n title?: string;\n text?: string;\n url?: string;\n files?: File[];\n};\n\nconst RESOLVED_DEFERRED = new Deferred<void>();\nRESOLVED_DEFERRED.resolve();\nconst READY_CLIENT_DEFERREDS = new Map<string, Deferred<void>>();\n\nexport async function respondForShare(e: FetchEvent) {\n if (e.request.method === 'POST') {\n try {\n const formData = await e.request.formData();\n const data = parseFormData(formData);\n requestShare(data, e.resultingClientId);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[SHARE] Failed to parse input data', err);\n }\n }\n\n return Response.redirect('.');\n}\n\nexport function handleClientMessage(e: ExtendableMessageEvent) {\n const { source, data } = e;\n if (!source) return;\n\n if (data.type === 'clientReady') {\n const { id } = (source as Client);\n const deferred = READY_CLIENT_DEFERREDS.get(id);\n if (deferred) {\n deferred.resolve();\n } else {\n READY_CLIENT_DEFERREDS.set(id, RESOLVED_DEFERRED);\n }\n }\n}\n\nasync function requestShare(data: ShareData, clientId: string) {\n const client = await self.clients.get(clientId);\n if (!client) {\n return;\n }\n\n await getClientReadyDeferred(clientId);\n\n client.postMessage({\n type: 'share',\n payload: data,\n });\n}\n\nfunction getClientReadyDeferred(clientId: string) {\n const deferred = READY_CLIENT_DEFERREDS.get(clientId);\n if (deferred) {\n return deferred.promise;\n }\n\n const newDeferred = new Deferred<void>();\n READY_CLIENT_DEFERREDS.set(clientId, newDeferred);\n return newDeferred.promise;\n}\n\nfunction parseFormData(formData: FormData): ShareData {\n const files = formData.getAll('files') as File[];\n const title = formData.get('title') as string;\n const text = formData.get('text') as string;\n const url = formData.get('url') as string;\n\n return {\n title,\n text,\n url,\n files,\n };\n}\n","import { DEBUG } from './config';\nimport { respondForProgressive } from './serviceWorker/progressive';\nimport { respondForDownload } from './serviceWorker/download';\nimport { respondWithCache, clearAssetCache, respondWithCacheNetworkFirst } from './serviceWorker/assetCache';\nimport {\n handlePush,\n handleNotificationClick,\n handleClientMessage as handleNotificationMessage,\n} from './serviceWorker/pushNotification';\nimport { respondForShare, handleClientMessage as handleShareMessage } from './serviceWorker/share';\n\nimport { pause } from './util/schedulers';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nconst RE_NETWORK_FIRST_ASSETS = /\\.(wasm|html)$/;\nconst RE_CACHE_FIRST_ASSETS = /[\\da-f]{20}.*\\.(js|css|woff2?|svg|png|jpg|jpeg|tgs|json|wasm)$/;\nconst ACTIVATE_TIMEOUT = 3000;\n\nself.addEventListener('install', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker installed');\n }\n\n // Activate worker immediately\n e.waitUntil(self.skipWaiting());\n});\n\nself.addEventListener('activate', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker activated');\n }\n\n e.waitUntil(\n Promise.race([\n // An attempt to fix freezing UI on iOS\n pause(ACTIVATE_TIMEOUT),\n Promise.all([\n clearAssetCache(),\n // Become available to all pages\n self.clients.claim(),\n ]),\n ]),\n );\n});\n\nself.addEventListener('fetch', (e: FetchEvent) => {\n const { url } = e.request;\n\n if (url.includes('/progressive/')) {\n e.respondWith(respondForProgressive(e));\n return true;\n }\n\n if (url.includes('/download/')) {\n e.respondWith(respondForDownload(e));\n return true;\n }\n\n if (url.includes('/share/')) {\n e.respondWith(respondForShare(e));\n }\n\n if (url.startsWith('http')) {\n if (new URL(url).pathname === '/' || url.match(RE_NETWORK_FIRST_ASSETS)) {\n e.respondWith(respondWithCacheNetworkFirst(e));\n return true;\n }\n\n if (url.match(RE_CACHE_FIRST_ASSETS)) {\n e.respondWith(respondWithCache(e));\n return true;\n }\n }\n\n return false;\n});\n\nself.addEventListener('push', handlePush);\nself.addEventListener('notificationclick', handleNotificationClick);\nself.addEventListener('message', (event) => {\n handleNotificationMessage(event);\n handleShareMessage(event);\n});\n"],"names":["DEBUG","process","DEBUG_MORE","MEDIA_PROGRESSIVE_CACHE_DISABLED","MEDIA_PROGRESSIVE_CACHE_NAME","MEDIA_CACHE_MAX_BYTES","ASSET_CACHE_NAME","SUPPORTED_IMAGE_CONTENT_TYPES","window","innerHeight","Math","round","Set","SUPPORTED_VIDEO_CONTENT_TYPES","pause","ms","Promise","resolve","setTimeout","DEFAULT_PART_SIZE","MAX_END_TO_CACHE","PART_TIMEOUT","requestStates","Map","async","requestPart","e","params","client","url","includes","self","clients","matchAll","find","c","type","frameType","get","clientId","messageId","store","id","withAutoUpdate","arguments","length","undefined","String","random","replace","generateIdFor","requestState","isResolved","promise","race","then","reject","Error","Object","assign","set","catch","finally","delete","postMessage","addEventListener","result","data","DOWNLOAD_PART_SIZE","FilePartQueue","constructor","this","queue","push","task","shift","size","TIMEOUT","respondWithCache","cacheResult","withTimeout","cache","caches","open","cached","match","request","ok","remote","fetch","put","clone","cb","timeout","err","console","error","Boolean","lastSyncAt","Date","valueOf","shownNotifications","clickBuffer","getChatId","custom","from_id","chat_id","channel_id","getMessageId","msg_id","parseInt","getClients","appUrl","URL","registration","scope","origin","filter","playNotificationSound","payload","showNotification","_ref","chatId","body","title","icon","reaction","isSilent","shouldReplaceHistory","isFirstBatch","options","count","badge","tag","vibrate","all","focusChatMessage","focused","focus","warn","now","Deferred","_defineProperty","RESOLVED_DEFERRED","READY_CLIENT_DEFERREDS","RE_NETWORK_FIRST_ASSETS","RE_CACHE_FIRST_ASSETS","log","waitUntil","skipWaiting","claim","respondWith","range","headers","bytes","exec","start","Number","originalEnd","end","fileSize","mimeType","Response","Uint8Array","buffer","status","statusText","cacheKey","cachedArrayBuffer","cachedHeaders","r","arrayBuffer","json","fetchFromCache","partInfo","fullSize","partSize","min","byteLength","arrayBufferPart","slice","Request","JSON","stringify","saveToCache","respondForProgressive","matchedFilename","filenameHeader","decodeURIComponent","enqueue","offset","part","lastOffset","stream","ReadableStream","i","controller","pop","close","respondForDownload","method","deferred","newDeferred","getClientReadyDeferred","requestShare","formData","files","getAll","text","parseFormData","resultingClientId","redirect","respondForShare","startsWith","pathname","toCache","respondWithCacheNetworkFirst","getPushData","mute","True","notification","silent","description","getNotificationData","has","map","openWindow","newClient","notifyClients","event","source","getNotifications","forEach","n","add","_ref2","lastReadInboxMessageId","notifications","lastMessageId","MAX_VALUE","closeNotifications","handleNotificationMessage","handleShareMessage"],"sourceRoot":""}