UNPKG

version-rocket

Version:

Tools to check version monitoring (updates) for web application. web 应用版本监测(更新)工具

154 lines (153 loc) 6.55 kB
// create package version worker export const createWorker = (func, deps) => { const depsFuncStr = `${(deps === null || deps === void 0 ? void 0 : deps.map((_) => _.toString()).join(';\n\n')) || ''}`; const blob = new Blob([ ` ${depsFuncStr}; (${func.toString()})(); `, ]); const url = window.URL.createObjectURL(blob); const worker = new Worker(url); return worker; }; export const createWorkerFunc = () => { let oldVersion = ''; const flagSet = new Set(); let intervalTime = 5000; let immediate = false; let originFileUrl = ''; let checkOriginSpecifiedFilesUrl = []; let checkOriginSpecifiedFilesUrlMode = 'one'; let timer = null; let clearIntervalOnDialog = false; const temp = self; temp.onmessage = (event) => { oldVersion = event.data['version-key']; intervalTime = event.data['polling-time']; immediate = event.data['immediate']; originFileUrl = event.data['origin-version-file-url']; checkOriginSpecifiedFilesUrl = event.data['check-origin-specified-files-url']; checkOriginSpecifiedFilesUrlMode = event.data['check-origin-specified-files-url-mode']; clearIntervalOnDialog = event.data['clear-interval-on-dialog']; const checkVersionType = checkVersionTypeFunc(oldVersion, originFileUrl, checkOriginSpecifiedFilesUrl); if (!checkVersionType) { temp.postMessage({ invalidParams: true, }); } const doFetch = () => { if (checkVersionType === 'check-version') { fetch(`${originFileUrl}?${+new Date()}`) .then((res) => { return res.json(); }) .then((versionJsonFile) => { if (oldVersion !== versionJsonFile.version) { temp.postMessage({ refreshPageVisible: true, refreshPageVersion: `${versionJsonFile.version}`, external: versionJsonFile.external, }); if (clearIntervalOnDialog) { clearInterval(timer); } } }); } if (checkVersionType === 'check-specified-files') { if (!(checkOriginSpecifiedFilesUrl === null || checkOriginSpecifiedFilesUrl === void 0 ? void 0 : checkOriginSpecifiedFilesUrl.length)) return; checkOriginSpecifiedFilesUrl.forEach((url) => { fetch(url, { method: 'HEAD', cache: 'no-cache', }) .then((res) => { return res.headers.get('ETag') || res.headers.get('Last-Modified'); }) .then((flag) => { if (flag) { flagSet.add(flag); } if (checkOriginSpecifiedFilesUrlMode === 'one' && flagSet.size > checkOriginSpecifiedFilesUrl.length) { temp.postMessage({ refreshPageVisible: true, refreshPageVersion: '', external: '', }); flagSet.clear(); if (clearIntervalOnDialog) { clearInterval(timer); } } if (checkOriginSpecifiedFilesUrlMode === 'all' && flagSet.size === checkOriginSpecifiedFilesUrl.length * 2) { temp.postMessage({ refreshPageVisible: true, refreshPageVersion: '', external: '', }); flagSet.clear(); if (clearIntervalOnDialog) { clearInterval(timer); } } }); }); } }; if (immediate) { doFetch(); } timer = setInterval(doFetch, intervalTime); }; return temp; }; // cancel update export const cancelUpdateFunc = (cancelMode, newVersion, cancelUpdateAndStopWorker, worker) => { const cancelModeType = cancelMode || (newVersion ? 'ignore-current-version' : 'ignore-current-window'); const cancelModeTypeValue = localStorage.getItem('version-rocket:cancelled') || ''; const todayDate = new Date().toLocaleDateString(); const cancelModeTypeValueInSession = sessionStorage.getItem('version-rocket:cancelled') || ''; const isStopWorker = cancelUpdateAndStopWorker || false; switch (cancelModeType) { case 'ignore-current-version': if (newVersion && cancelModeTypeValue === newVersion) { isStopWorker && (worker === null || worker === void 0 ? void 0 : worker.terminate()); return true; } break; case 'ignore-today': if (cancelModeTypeValue === todayDate) { isStopWorker && (worker === null || worker === void 0 ? void 0 : worker.terminate()); return true; } break; case 'ignore-current-window': if (cancelModeTypeValueInSession) { isStopWorker && (worker === null || worker === void 0 ? void 0 : worker.terminate()); return true; } break; default: break; } return false; }; // check version type export function checkVersionTypeFunc(oldVersion, originFileUrl, checkOriginSpecifiedFilesUrl) { const checkVersionType = oldVersion && originFileUrl ? 'check-version' : (checkOriginSpecifiedFilesUrl === null || checkOriginSpecifiedFilesUrl === void 0 ? void 0 : checkOriginSpecifiedFilesUrl.length) ? 'check-specified-files' : ''; if (!checkVersionType) return console.log('Not found localPackageVersion, originVersionFileUrl or originSpecifiedFilesUrl'); console.log('You are use check version type is', checkVersionType); return checkVersionType; }