tweb/public/sw.js.map
Eduard Kuzmenko 60a603b5de Build
2021-04-26 18:34:31 +04:00

1 line
29 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/helpers/userAgent.ts","webpack:///./src/config/debug.ts","webpack:///./src/config/modes.ts","webpack:///./src/lib/logger.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/mtproto/mtproto.service.ts","webpack:///./src/helpers/cancellablePromise.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","userAgent","navigator","ctx","search","toLowerCase","indexOf","test","vendor","window","self","isSafari","platform","maxTouchPoints","MSStream","match","DEBUG","location","debug","http","ssl","multipleConnections","asServiceWorker","LogLevels","_logTimer","Date","now","dT","toFixed","isWebWorker","WorkerGlobalScope","isServiceWorker","ServiceWorkerGlobalScope","notifyServiceWorker","all","args","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","listener","postMessage","notifyWorker","noop","notifySomeone","log","prefix","level","warn","error","Log","console","info","trace","setPrefix","_prefix","logger","deferredPromises","addEventListener","e","task","data","promise","id","reject","resolve","payload","taskId","onFetch","event","url","scope","params","exec","request","range","header","chunks","split","ranges","offset","end","parseRange","headers","JSON","parse","decodeURIComponent","limitPart","size","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","respondWith","Promise","race","delay","setTimeout","Response","status","statusText","possibleResponse","mimeType","Uint8Array","buffer","responseForSafariFirstRange","limit","Math","ceil","alignLimit","alignedOffset","base","alignOffset","dcId","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","callback","undefined","addNotifyListener","push","deferred","finally","cancel","assign","deferredPromise","result","ab","bytes","byteLength","catch","err","onChangeState","onfetch","waitUntil","skipWaiting","claim","onerror","onunhandledrejection","onoffline","ononline"],"mappings":"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","file":"sw.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport const userAgent = navigator ? navigator.userAgent : null;\r\nexport const isApple = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const isAndroid = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const isChromium = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n/**\r\n * Returns true when run in WebKit derived browsers.\r\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\r\n * transfer data between WebWorkers and the main thread.\r\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\r\n *\r\n * This should be removed once the underlying Safari issue is fixed.\r\n */\r\nexport const ctx = typeof(window) !== 'undefined' ? window : self;\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const isAppleMobile = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !ctx.MSStream;\r\n\r\nexport const isSafari = !!('safari' in ctx) || !!(userAgent && (/\\b(iPad|iPhone|iPod)\\b/.test(userAgent) || (!!userAgent.match('Safari') && !userAgent.match('Chrome'))))/* || true */;\r\nexport const isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const isMobileSafari = isSafari && isAppleMobile;\r\n\r\nexport const isMobile = /* screen.width && screen.width < 480 || */navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false, //location.search.indexOf('http=1') > 0,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false\r\n};\r\n\r\n//////////////////\r\n/////////////////////////////\r\n//////////\r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport DEBUG from \"../config/debug\";\r\n\r\nexport enum LogLevels {\r\n log = 1,\r\n warn = 2,\r\n error = 4,\r\n debug = 8\r\n};\r\n\r\nconst _logTimer = Date.now();\r\nfunction dT() {\r\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\r\n}\r\n\r\nexport function logger(prefix: string, level = LogLevels.log | LogLevels.warn | LogLevels.error) {\r\n if(!DEBUG/* || true */) {\r\n level = LogLevels.error;\r\n }\r\n\r\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\r\n\r\n function Log(...args: any[]) {\r\n return level & LogLevels.log && console.log(dT(), prefix, ...args);\r\n }\r\n \r\n Log.warn = function(...args: any[]) {\r\n return level & LogLevels.warn && console.warn(dT(), prefix, ...args);\r\n };\r\n \r\n Log.info = function(...args: any[]) {\r\n return level & LogLevels.log && console.info(dT(), prefix, ...args);\r\n };\r\n \r\n Log.error = function(...args: any[]) {\r\n return level & LogLevels.error && console.error(dT(), prefix, ...args);\r\n };\r\n \r\n Log.trace = function(...args: any[]) {\r\n return level & LogLevels.log && console.trace(dT(), prefix, ...args);\r\n };\r\n\r\n /* Log.debug = function(...args: any[]) {\r\n return level & LogLevels.debug && console.log(dT(), prefix, ...args);\r\n }; */\r\n\r\n Log.debug = function(...args: any[]) {\r\n return level & LogLevels.debug && console.debug(dT(), prefix, ...args);\r\n };\r\n\r\n Log.setPrefix = function(_prefix: string) {\r\n prefix = '[' + _prefix + ']:';\r\n };\r\n\r\n Log.setPrefix(prefix);\r\n \r\n return Log;\r\n};","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport const isWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;\r\nexport const isServiceWorker = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const isWorker = isWebWorker || isServiceWorker;\r\n\r\n// в SW может быть сразу две переменных TRUE, поэтому проверяю по последней\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = isServiceWorker ? notifyServiceWorker.bind(null, false) : (isWebWorker ? notifyWorker : noop);\r\nexport const notifyAll = isServiceWorker ? notifyServiceWorker.bind(null, true) : (isWebWorker ? notifyWorker : noop);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//////////////////\r\n//////////////////////////\r\n//////////\r\nimport { isSafari } from '../../helpers/userAgent';\r\nimport { logger, LogLevels } from '../logger';\r\nimport type { DownloadOptions } from './apiFileManager';\r\nimport type { WorkerTaskTemplate } from '../../types';\r\nimport { notifySomeone } from '../../helpers/context';\r\nimport type { InputFileLocation, FileLocation, UploadFile } from '../../layer';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\n\r\nconst log = logger('SW', LogLevels.error | LogLevels.debug | LogLevels.log | LogLevels.warn);\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\n\r\nconst deferredPromises: {[taskId: number]: CancellablePromise<any>} = {};\r\n\r\n///////////////////\r\nctx.addEventListener('message', (e) => {\r\n const task = e.data as ServiceWorkerTaskResponse;\r\n const promise = deferredPromises[task.id];\r\n\r\n if(task.error) {\r\n promise.reject(task.error);\r\n } else {\r\n promise.resolve(task.payload);\r\n }\r\n\r\n delete deferredPromises[task.id];\r\n});\r\n//////////\r\n\r\nlet taskId = 0;\r\n\r\nexport interface ServiceWorkerTask extends WorkerTaskTemplate {\r\n type: 'requestFilePart',\r\n payload: [number, InputFileLocation | FileLocation, number, number]\r\n};\r\n\r\nexport interface ServiceWorkerTaskResponse extends WorkerTaskTemplate {\r\n type: 'requestFilePart',\r\n payload?: UploadFile.uploadFile,\r\n originalPayload?: ServiceWorkerTask['payload']\r\n};\r\n\r\nconst onFetch = (event: FetchEvent): void => {\r\n try {\r\n const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\r\n\r\n log.debug('[fetch]:', event);\r\n \r\n switch(scope) {\r\n case 'stream': {\r\n const range = parseRange(event.request.headers.get('Range'));\r\n let [offset, end] = range;\r\n \r\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\r\n //const fileName = getFileNameByLocation(info.location);\r\n\r\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\r\n const limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\r\n\r\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\r\n //end = info.size - 1;\r\n //offset = info.size - 1 - limitPart;\r\n offset = info.size - (info.size % limitPart);\r\n } */\r\n \r\n log.debug('[stream]', url, offset, end);\r\n \r\n event.respondWith(Promise.race([\r\n timeout(45 * 1000),\r\n\r\n new Promise<Response>((resolve, reject) => {\r\n // safari workaround\r\n const possibleResponse = responseForSafariFirstRange(range, info.mimeType, info.size);\r\n if(possibleResponse) {\r\n return resolve(possibleResponse);\r\n }\r\n \r\n const limit = end && end < limitPart ? alignLimit(end - offset + 1) : limitPart;\r\n const alignedOffset = alignOffset(offset, limit);\r\n \r\n log.debug('[stream] requestFilePart:', /* info.dcId, info.location, */ alignedOffset, limit);\r\n\r\n const task: ServiceWorkerTask = {\r\n type: 'requestFilePart',\r\n id: taskId++,\r\n payload: [info.dcId, info.location, alignedOffset, limit]\r\n };\r\n\r\n \r\n const deferred = deferredPromises[task.id] = deferredPromise<UploadFile.uploadFile>();\r\n deferred.then(result => {\r\n let ab = result.bytes as Uint8Array;\r\n \r\n log.debug('[stream] requestFilePart result:', result);\r\n \r\n const headers: Record<string, string> = {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes ${alignedOffset}-${alignedOffset + ab.byteLength - 1}/${info.size || '*'}`,\r\n 'Content-Length': `${ab.byteLength}`,\r\n };\r\n \r\n if(info.mimeType) headers['Content-Type'] = info.mimeType;\r\n \r\n if(isSafari) {\r\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\r\n headers['Content-Range'] = `bytes ${offset}-${offset + ab.byteLength - 1}/${info.size || '*'}`;\r\n headers['Content-Length'] = `${ab.byteLength}`;\r\n }\r\n\r\n // simulate slow connection\r\n //setTimeout(() => {\r\n resolve(new Response(ab, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers,\r\n }));\r\n //}, 2.5e3);\r\n }).catch(err => {});\r\n\r\n notifySomeone(task);\r\n })\r\n ]));\r\n break;\r\n }\r\n }\r\n } catch(err) {\r\n event.respondWith(new Response('', {\r\n status: 500,\r\n statusText: 'Internal Server Error',\r\n }));\r\n }\r\n};\r\n\r\nconst onChangeState = () => {\r\n ctx.onfetch = onFetch;\r\n};\r\n\r\nctx.addEventListener('install', (event) => {\r\n log('installing');\r\n\r\n /* initCache();\r\n\r\n event.waitUntil(\r\n initNetwork(),\r\n ); */\r\n event.waitUntil(ctx.skipWaiting()); // Activate worker immediately\r\n});\r\n\r\nctx.addEventListener('activate', (event) => {\r\n log('activating', ctx);\r\n\r\n /* if (!ctx.cache) initCache();\r\n if (!ctx.network) initNetwork(); */\r\n\r\n event.waitUntil(ctx.clients.claim());\r\n});\r\n\r\nfunction timeout(delay: number): Promise<Response> {\r\n return new Promise(((resolve) => {\r\n setTimeout(() => {\r\n resolve(new Response('', {\r\n status: 408,\r\n statusText: 'Request timed out.',\r\n }));\r\n }, delay);\r\n }));\r\n}\r\n\r\nfunction responseForSafariFirstRange(range: [number, number], mimeType: string, size: number): Response {\r\n if(range[0] === 0 && range[1] === 1) {\r\n return new Response(new Uint8Array(2).buffer, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers: {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes 0-1/${size || '*'}`,\r\n 'Content-Length': '2',\r\n 'Content-Type': mimeType || 'video/mp4',\r\n },\r\n });\r\n }\r\n\r\n return null;\r\n}\r\n\r\nctx.onerror = (error) => {\r\n log.error('error:', error);\r\n};\r\n\r\nctx.onunhandledrejection = (error) => {\r\n log.error('onunhandledrejection:', error);\r\n};\r\n\r\nctx.onoffline = ctx.ononline = onChangeState;\r\n\r\nonChangeState();\r\n\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\r\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\r\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\r\n\r\nfunction parseRange(header: string): [number, number] {\r\n if(!header) return [0, 0];\r\n const [, chunks] = header.split('=');\r\n const ranges = chunks.split(', ');\r\n const [offset, end] = ranges[0].split('-');\r\n\r\n return [+offset, +end || 0];\r\n}\r\n\r\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\r\n return offset - (offset % base);\r\n}\r\n\r\nfunction alignLimit(limit: number) {\r\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\r\n}\r\n\r\n/* ctx.addEventListener('push', (event) => {\r\n console.log('[Service Worker] Push Received.');\r\n console.log(`[Service Worker] Push had this data: \"${event.data.text()}\"`, event, event.data);\r\n\r\n const title = 'Push Push Push';\r\n const options = {};\r\n // const options = {\r\n // body: 'Yay it works.',\r\n // icon: 'images/icon.png',\r\n // badge: 'images/badge.png'\r\n // };\r\n\r\n event.waitUntil(ctx.registration.showNotification(title, options));\r\n}); */\r\n\r\n//export default () => {};\r\n\r\n//MOUNT_CLASS_TO.onFetch = onFetch;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport interface CancellablePromise<T> extends Promise<T> {\r\n resolve?: (...args: any[]) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise<T>() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n lastNotify: undefined,\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise<T> = new Promise<T>((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise<ReturnType<typeof resolve>>();\r\n \r\n }; */\r\n\r\n deferred.finally(() => {\r\n deferred.notify = null;\r\n deferred.listeners.length = 0;\r\n deferred.lastNotify = null;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}"],"sourceRoot":""}