17bd08c30SSascha Leibbotmon_client = { 26980370bSSascha Leib init: function() { 36980370bSSascha Leib 46980370bSSascha Leib /* send the page view request: */ 5cf9f7fe8SSascha Leib this._onPageView(this._src.replace( this._scriptName, '/pview.php')); 66980370bSSascha Leib 76980370bSSascha Leib /* send the first heartbeat signal after x seconds: */ 8cf9f7fe8SSascha Leib setTimeout(this._onHeartbeat.bind(this, this._src.replace( this._scriptName, '/tick.php')),this._heartbeat * 1000); 96980370bSSascha Leib }, 106980370bSSascha Leib 116980370bSSascha Leib /* keep a reference to the script URL: */ 126980370bSSascha Leib _src: document.currentScript.src, 136980370bSSascha Leib 146980370bSSascha Leib /* heartbeat signal every x seconds: */ 156980370bSSascha Leib _heartbeat: 30, 166980370bSSascha Leib 176980370bSSascha Leib /* name of this script (with slash): */ 186980370bSSascha Leib _scriptName: '/client.js', 196980370bSSascha Leib 206980370bSSascha Leib /* function to init page data on server: */ 216980370bSSascha Leib _onPageView: async function(url) { 226980370bSSascha Leib try { 236980370bSSascha Leib /* collect the data to send: */ 246980370bSSascha Leib const visit = { 256980370bSSascha Leib 'pg': JSINFO.id, 267bd08c30SSascha Leib 'u': document._botmon.user || null, 276980370bSSascha Leib 'lg': navigator.language, 287bd08c30SSascha Leib 'lt': ( document._botmon ? Date.now() - document._botmon.t0 : null), 292f2bc93aSSascha Leib 'r': document.referrer /*, 302f2bc93aSSascha Leib 'tz': new Date().getTimezoneOffset(), 312f2bc93aSSascha Leib 'url': window.location.href, 326980370bSSascha Leib 'scr': screen.width+':'+screen.height, 336980370bSSascha Leib 'l': navigator.languages */ 346980370bSSascha Leib } 356980370bSSascha Leib 366980370bSSascha Leib /* compile to a FormData object: */ 376980370bSSascha Leib const data = new FormData(); 38cf9f7fe8SSascha Leib data.append( "pageview", JSON.stringify( visit ) ); 396980370bSSascha Leib 406980370bSSascha Leib /* send the request */ 416980370bSSascha Leib const response = await fetch(url + '?t=' + Date.now(), { 426980370bSSascha Leib method: 'POST', 436980370bSSascha Leib body: data 446980370bSSascha Leib }); 456980370bSSascha Leib if (!response.ok) { 466980370bSSascha Leib throw new Error(response.status + ' ' + response.statusText + ' - ' + url); 476980370bSSascha Leib } 486980370bSSascha Leib } catch (err) { 496980370bSSascha Leib console.error('Error: ', err); 506980370bSSascha Leib } 516980370bSSascha Leib }, 526980370bSSascha Leib 536980370bSSascha Leib /* function to call regularly to show the user is still on the page: */ 546980370bSSascha Leib _onHeartbeat: async function(url) { 557bd08c30SSascha Leib //console.info('botmon_client._onHeartbeat', url); 56cf9f7fe8SSascha Leib 57*13c9d29dSSascha Leib let uid = document._botmon.user || null; 58*13c9d29dSSascha Leib 596980370bSSascha Leib try { 60*13c9d29dSSascha Leib const response = await fetch(url + '?p=' + encodeURIComponent(JSINFO.id) + '&t=' + Date.now() + ( uid ? '&u=' + encodeURIComponent(uid) : ''), { 61*13c9d29dSSascha Leib method: 'HEAD' 626980370bSSascha Leib }); 636980370bSSascha Leib if (!response.ok) { 646980370bSSascha Leib throw new Error(response.status + ' ' + response.statusText + ' - ' + url); 656980370bSSascha Leib } 666980370bSSascha Leib } catch (err) { 676980370bSSascha Leib console.error(err); 686980370bSSascha Leib } finally { 696980370bSSascha Leib /* send the next heartbeat signal after x seconds: */ 7073c9c42dSSascha Leib setTimeout(this._onHeartbeat.bind(this, this._src.replace( this._scriptName, '/tick.php')),this._heartbeat * 1000); 716980370bSSascha Leib } 726980370bSSascha Leib } 736980370bSSascha Leib} 746980370bSSascha Leib 756980370bSSascha Leib// init the script: 767bd08c30SSascha Leibbotmon_client.init();