xref: /plugin/botmon/client.js (revision 13c9d29d29e7408533ebf30ae4ac2293f0f4dcda)
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();