version-polling
Version:
A JavaScript library for web application updates
6 lines • 5.45 kB
JavaScript
/*!
* version-polling v1.3.3
* (c) 2023-present Joe Shu
* @license MIT
*/
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.VersionPolling=t():e.VersionPolling=t()}(globalThis,()=>(()=>{"use strict";var e={};e.d=function(t,i){for(var n in i)e.o(i,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:i[n]})},e.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},e.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var t={};function i(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}e.r(t),e.d(t,{VersionPolling:()=>o,createVersionPolling:()=>r});let n={vcType:"etag",htmlFileUrl:`${location.origin}${location.pathname}`,chunkName:"index",versionFileUrl:`${location.origin}${location.pathname}version.json`,eventTriggerList:[],pollingInterval:3e5,silent:!1,silentPollingInterval:!1,silentPageVisibility:!1,onUpdate:()=>{}};class o{start(){let{eventTriggerList:e,silent:t,silentPageVisibility:i}=this.options;if(!t&&(this.worker=function(e){let t=new Blob([`(${e.toString()})()`],{type:"text/javascript"}),i=window.URL.createObjectURL(t),n=new Worker(i);return window.URL.revokeObjectURL(i),n}(()=>{let e,t,i=null,n=new Map;n.set("etag",{start:()=>{t.fetchEtag().then(e=>{t.versionFlag=e.versionFlag})},check:()=>{t.fetchEtag().then(e=>{e.versionFlag!==t.versionFlag&&self.postMessage({code:"update",data:{versionFlag:e.versionFlag,localVersionFlag:t.versionFlag}})})},fetchEtag:()=>{if(!e.htmlFileUrl)throw Error("[version-polling]: htmlFileUrl is required");return fetch(e.htmlFileUrl,{method:"HEAD",cache:"no-cache"}).then(e=>{let t=e.headers.get("etag");if(!t)throw Error("[version-polling]: etag is null");return{versionFlag:t}})}}),n.set("chunkHash",{start:()=>{t.fetchChunkHash().then(e=>{t.versionFlag=e.versionFlag})},check:()=>{t.fetchChunkHash().then(e=>{e.versionFlag!==t.versionFlag&&self.postMessage({code:"update",data:{versionFlag:e.versionFlag,localVersionFlag:t.versionFlag}})})},fetchChunkHash:()=>{if(!e.htmlFileUrl)throw Error("[version-polling]: htmlFileUrl is required");return fetch(`${e.htmlFileUrl}?t=${+new Date}`).then(e=>e.text()).then(t=>{let i=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"index",i=RegExp(`<script(?:.*)src=(?:["']?)(.*?${t}.*?)(?:["']?)>`,"s"),[,n]=e.match(i)||[];return n}(t,e.chunkName);if(!i)throw Error("[version-polling]: chunkHash is null");return{versionFlag:i}})}}),n.set("versionJson",{start:()=>{t.fetchVersionFile().then(e=>{t.versionFlag=e.versionFlag})},check:()=>{t.fetchVersionFile().then(e=>{e.versionFlag!==t.versionFlag&&self.postMessage({code:"update",data:{versionFlag:e.versionFlag,versionInfo:e.versionInfo,localVersionFlag:t.versionFlag}})})},fetchVersionFile:()=>{if(!e.versionFileUrl)throw Error("[version-polling]: versionFileUrl is required");return fetch(`${e.versionFileUrl}?t=${+new Date}`).then(e=>e.json()).then(e=>{let{version:t}=e;if(!t)throw Error("[version-polling]: version is null");return{versionFlag:t,versionInfo:e}})}}),self.onmessage=o=>{let{code:r,data:l}=o.data;if("start"===r){e=l;let o=n.get(e.vcType);if(!o)throw Error(`[version-polling]: invalid vcType: ${e.vcType}`);(t=Object.assign(o,{startPolling:()=>{i=setInterval(t.check,e.pollingInterval)},pausePolling:()=>{i&&(clearInterval(i),i=null)}})).start(),e.silentPollingInterval||t.startPolling()}else"pause"===r?t.pausePolling():"resume"===r?(t.check(),e.silentPollingInterval||t.startPolling()):t.check()}}),this.worker.onmessage=e=>{let{code:t,data:i}=e.data;if("update"===t){let e=!0,{vcType:t}=this.options;if("versionJson"===t&&(e=1===function(e,t){let i=e.split(".").map(Number),n=t.split(".").map(Number),o=Math.max(i.length,n.length);for(let e=0;e<o;e++){let t=i[e]||0,o=n[e]||0;if(t>o)return 1;if(t<o)return -1}return 0}(i.versionFlag,i.localVersionFlag)),e){var n,o;this.stop(),null===(n=(o=this.options).onUpdate)||void 0===n||n.call(o,this,i.versionInfo)}}},this.worker.postMessage({code:"start",data:{vcType:this.options.vcType,htmlFileUrl:this.options.htmlFileUrl,chunkName:this.options.chunkName,versionFileUrl:this.options.versionFileUrl,pollingInterval:this.options.pollingInterval,silentPollingInterval:this.options.silentPollingInterval}}),i||document.addEventListener("visibilitychange",this.visibilityHandler),null==e?void 0:e.length))for(let t of e)window.addEventListener(t,this.eventHandler)}stop(){let{eventTriggerList:e,silentPageVisibility:t}=this.options;if(this.worker&&(!function(e){e.terminate()}(this.worker),t||document.removeEventListener("visibilitychange",this.visibilityHandler),null==e?void 0:e.length))for(let t of e)window.removeEventListener(t,this.eventHandler)}onRefresh(){window.location.reload()}onCancel(){setTimeout(()=>{this.start()},30)}constructor(e){i(this,"options",void 0),i(this,"worker",void 0),i(this,"visibilityHandler",()=>{var e,t;"visible"===document.visibilityState?null===(e=this.worker)||void 0===e||e.postMessage({code:"resume"}):null===(t=this.worker)||void 0===t||t.postMessage({code:"pause"})}),i(this,"eventHandler",()=>{var e;null===(e=this.worker)||void 0===e||e.postMessage({code:"check"})}),this.options={...n,...e},this.start()}}function r(e){return new o(e)}return t})());