Skip to content

Commit

Permalink
Measure user engagement
Browse files Browse the repository at this point in the history
  • Loading branch information
theninj4 committed Jul 25, 2016
1 parent 0d6fcee commit c1a37f7
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 42 deletions.
48 changes: 27 additions & 21 deletions dist/barometer-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,15 @@ var pageLoadStats = require('./pageLoadStats.js')
var transport = require('./transport.js')

var pageCounter = 0
var pageLoadedAt, pageLoadedId
pageChange._pageEnd = function () {
transport.gauge(pageLoadedId, (new Date()) - pageLoadedAt)
}
pageChange._logPage = function () {
transport.count(pageLoadStats._createGaugeName('visits'))
if (pageLoadedAt) {
pageChange._pageEnd()
}
pageCounter++
var navStart = new Date()
var thisPage = pageCounter
Expand All @@ -45,6 +52,8 @@ pageChange._logPage = function () {
var metric = pageLoadStats._createGaugeName('dynamic')
var done = function () {
clearTimeout(timeout)
pageLoadedAt = new Date()
pageLoadedId = pageLoadStats._createGaugeName('engagement')
var overhead = 25 * 5
transport.gauge(metric, ((new Date()) - navStart) - overhead)
}
Expand Down Expand Up @@ -147,7 +156,6 @@ if (typeof window.performance === 'object') {
'use strict'
var transport = module.exports = {}

var event = require('./event.js')
var xhrStats = require('./xhrStats')
var barometer = require('./barometer.js')

Expand Down Expand Up @@ -186,7 +194,7 @@ transport._triggerFlushBuffer = function () {
bufferFlush = setTimeout(transport._flushBuffer, 5000)
}

transport._flushBuffer = function () {
transport._flushBuffer = function (pageEnd) {
if (transport.bufferSize === 0) return
if (!barometer.url) return

Expand All @@ -199,27 +207,19 @@ transport._flushBuffer = function () {
transport._initialiseBuffer()

var url = barometer.url
var xhr = new xhrStats._XMLHttpRequest()
xhr.open('POST', url, true)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.send(JSON.stringify(bufferToSend))
xhr.timeout = 4 * 1000
// xhr.onload = function ()e) { }
// xhr.onerror = function ()e) { }
// xhr.ontimeout = function ()) { }
}
event(window, 'beforeunload', transport._flushBuffer)
event(window, 'unload', transport._flushBuffer)
event(window, 'pagehide', transport._flushBuffer)
event(document, 'mouseout', function (e) {
e = e || window.event
e = e.relatedTarget || e.toElement
if (!e || e.nodeName === 'HTML') {
transport._flushBuffer()

if (navigator.sendBeacon) {
navigator.sendBeacon(url, JSON.stringify(bufferToSend))
} else {
var xhr = new xhrStats._XMLHttpRequest()
xhr.open('POST', url, !pageEnd)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.send(JSON.stringify(bufferToSend))
xhr.timeout = 4 * 1000
}
})
}

},{"./barometer.js":1,"./event.js":2,"./xhrStats":7}],6:[function(require,module,exports){
},{"./barometer.js":1,"./xhrStats":7}],6:[function(require,module,exports){
'use strict'
module.exports = function (href, hash) {
var safeUrl = (href || '').split('?')[0].replace(/^https?:\/\//i, '').replace(/[^a-z0-9-\/]/gi, '_')
Expand Down Expand Up @@ -8000,6 +8000,12 @@ describe('Testing pageChange', function () {
sinon.assert.calledWith(transport.gauge, 'pageload.localhost_9876/context_html.dynamic', 750)
sinon.assert.calledWith(transport.count, 'pageload.localhost_9876/context_html.visits')
})

it('should measure engagement', function () {
window.clock.tick(100)
window.trigger('popstate')
sinon.assert.calledWith(transport.gauge, 'pageload.localhost_9876/context_html.engagement', 325)
})
})

},{"../lib/pageChange.js":3,"../lib/transport.js":5,"./_fakeDom.js":41,"sinon":14}],44:[function(require,module,exports){
Expand Down
2 changes: 1 addition & 1 deletion dist/barometer.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions lib/pageChange.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,15 @@ var pageLoadStats = require('./pageLoadStats.js')
var transport = require('./transport.js')

var pageCounter = 0
var pageLoadedAt, pageLoadedId
pageChange._pageEnd = function () {
transport.gauge(pageLoadedId, (new Date()) - pageLoadedAt)
}
pageChange._logPage = function () {
transport.count(pageLoadStats._createGaugeName('visits'))
if (pageLoadedAt) {
pageChange._pageEnd()
}
pageCounter++
var navStart = new Date()
var thisPage = pageCounter
Expand All @@ -19,6 +26,8 @@ pageChange._logPage = function () {
var metric = pageLoadStats._createGaugeName('dynamic')
var done = function () {
clearTimeout(timeout)
pageLoadedAt = new Date()
pageLoadedId = pageLoadStats._createGaugeName('engagement')
var overhead = 25 * 5
transport.gauge(metric, ((new Date()) - navStart) - overhead)
}
Expand Down
31 changes: 11 additions & 20 deletions lib/transport.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
'use strict'
var transport = module.exports = {}

var event = require('./event.js')
var xhrStats = require('./xhrStats')
var barometer = require('./barometer.js')

Expand Down Expand Up @@ -41,7 +40,7 @@ transport._triggerFlushBuffer = function () {
bufferFlush = setTimeout(transport._flushBuffer, 5000)
}

transport._flushBuffer = function () {
transport._flushBuffer = function (pageEnd) {
if (transport.bufferSize === 0) return
if (!barometer.url) return

Expand All @@ -54,22 +53,14 @@ transport._flushBuffer = function () {
transport._initialiseBuffer()

var url = barometer.url
var xhr = new xhrStats._XMLHttpRequest()
xhr.open('POST', url, true)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.send(JSON.stringify(bufferToSend))
xhr.timeout = 4 * 1000
// xhr.onload = function ()e) { }
// xhr.onerror = function ()e) { }
// xhr.ontimeout = function ()) { }
}
event(window, 'beforeunload', transport._flushBuffer)
event(window, 'unload', transport._flushBuffer)
event(window, 'pagehide', transport._flushBuffer)
event(document, 'mouseout', function (e) {
e = e || window.event
e = e.relatedTarget || e.toElement
if (!e || e.nodeName === 'HTML') {
transport._flushBuffer()

if (navigator.sendBeacon) {
navigator.sendBeacon(url, JSON.stringify(bufferToSend))
} else {
var xhr = new xhrStats._XMLHttpRequest()
xhr.open('POST', url, !pageEnd)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.send(JSON.stringify(bufferToSend))
xhr.timeout = 4 * 1000
}
})
}
31 changes: 31 additions & 0 deletions lib/unload.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/* global window */
'use strict'
var unload = module.exports = {}

var event = require('event')
var transport = require('transport')
var pageChange = require('./pageChange.js')

unload.forSure = function () {
pageChange._pageEnd()
transport._flushBuffer(true)
}

unload.maybe = function () {
transport._flushBuffer(false)
}

event(window, 'beforeunload', unload.forSure)
event(document, 'mouseout', function (e) {
e = e || window.event
e = e.relatedTarget || e.toElement
if (!e || e.nodeName === 'HTML') {
unload.maybe()
}
})
event(document, 'keydown', function (e) {
e = e || window.event || { }
if (e.ctrlKey || e.metaKey) {
unload.maybe()
}
})
6 changes: 6 additions & 0 deletions test/testPageChange.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,10 @@ describe('Testing pageChange', function () {
sinon.assert.calledWith(transport.gauge, 'pageload.localhost_9876/context_html.dynamic', 750)
sinon.assert.calledWith(transport.count, 'pageload.localhost_9876/context_html.visits')
})

it('should measure engagement', function () {
window.clock.tick(100)
window.trigger('popstate')
sinon.assert.calledWith(transport.gauge, 'pageload.localhost_9876/context_html.engagement', 325)
})
})

0 comments on commit c1a37f7

Please sign in to comment.