version-rocket
Version:
Tools to check version monitoring (updates) for web application. web 应用版本监测(更新)工具
154 lines (153 loc) • 6.55 kB
JavaScript
// 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;
}