1 line
29 KiB
Plaintext
1 line
29 KiB
Plaintext
{"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":""} |