@s4e/jsentinel
Version:
Script integrity and clipboard tamper detection for browsers.
2 lines (1 loc) • 2.27 kB
JavaScript
import{emit as e}from"./events-ffa6G8za.js";import{R as t}from"./index-hwEiSUPx.js";function n(){if("undefined"==typeof window)return()=>{};const n=new Blob(['\n let lastPing = Date.now();\n let paused = false;\n self.onmessage = (e) => {\n const msg = e.data;\n if (msg === "ping") {\n lastPing = Date.now();\n self.postMessage("pong");\n return;\n }\n if (msg === "pause") {\n paused = true;\n return;\n }\n if (msg === "resume") {\n paused = false;\n lastPing = Date.now();\n return;\n }\n if (msg === "reset") {\n lastPing = Date.now();\n return;\n }\n };\n setInterval(() => {\n if (paused) return;\n if (Date.now() - lastPing > 3000) {\n self.postMessage({ tamper: "watchdog-timeout", ts: Date.now() });\n }\n }, 1000);\n '],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(n),{name:"JSentinelWD"});let s=Date.now(),i="hidden"===document.visibilityState,r=0;if(i)try{a.postMessage("pause")}catch(e){}a.onmessage=n=>{var a,o;if("pong"!==n.data){if((null===(a=n.data)||void 0===a?void 0:a.tamper)&&(null===(o=n.data)||void 0===o?void 0:o.ts)){if(i)return;if(Date.now()<r)return;e({type:"alert",data:{key:"watchdog-tamper",src:null,inline:!1,expected:void 0,got:"",severity:"error",reason:n.data.tamper,description:t[n.data.tamper]||n.data.tamper,meta:{ts:n.data.ts}}})}}else s=Date.now()};const o=setInterval(()=>{try{i||a.postMessage("ping")}catch(e){}i||Date.now()<r||Date.now()-s>3e3&&e({type:"alert",data:{key:"watchdog-timeout",src:null,inline:!1,expected:void 0,got:"",severity:"error",reason:"watchdog-timeout",description:t["watchdog-timeout"],meta:{ts:Date.now()}}})},1e3),d=()=>{i=!0;try{a.postMessage("pause")}catch(e){}},p=()=>{i=!1,s=Date.now(),r=Date.now()+4e3;try{a.postMessage("resume")}catch(e){}},l=()=>d(),c=()=>p(),g=()=>{"hidden"===document.visibilityState?d():p()};return document.addEventListener("visibilitychange",g),addEventListener("pagehide",l),addEventListener("pageshow",c),()=>{clearInterval(o),document.removeEventListener("visibilitychange",g),removeEventListener("pagehide",l),removeEventListener("pageshow",c);try{a.terminate()}catch(e){}}}export{n as startWatchdog};