choo-shortcache
Version:
choo nanocomponent cache shortcut
88 lines (72 loc) • 2.64 kB
JavaScript
var scheduler = require('nanoscheduler')()
var nanologger = require('nanologger')
var Hooks = require('choo-hooks')
module.exports = logger
function logger (state, emitter, opts) {
var initialRender = true
var hooks = Hooks(emitter)
var log = nanologger('choo')
hooks.on('log:debug', logger('debug'))
hooks.on('log:info', logger('info'))
hooks.on('log:warn', logger('warn'))
hooks.on('log:error', logger('error'))
hooks.on('log:fatal', logger('fatal'))
hooks.on('event', function (eventName, data, timing) {
if (opts.filter && !opts.filter(eventName, data, timing)) return
if (timing) {
var duration = timing.duration.toFixed()
var level = duration < 50 ? 'info' : 'warn'
if (data !== undefined) logger(level)(eventName, data, duration + 'ms')
else logger(level)(eventName, duration + 'ms')
} else {
if (data !== undefined) logger('info')(eventName, data)
else logger('info')(eventName)
}
})
hooks.on('use', function (count, duration) {
logger('debug')('use', { count: count }, duration + 'ms')
})
hooks.on('unhandled', function (eventName, data) {
logger('error')('No listeners for ' + eventName)
})
hooks.on('DOMContentLoaded', function (timing) {
if (!timing) return logger('info')('DOMContentLoaded')
var level = timing.interactive < 1000 ? 'info' : 'warn'
logger(level)('DOMContentLoaded', timing.interactive + 'ms to interactive')
})
hooks.on('render', function (timings) {
if (!timings || !timings.render) return logger('info')('render')
var duration = timings.render.duration.toFixed()
var msg = 'render'
if (initialRender) {
initialRender = false
msg = 'initial ' + msg
}
// each frame has 10ms available for userland stuff
var fps = Math.min((600 / duration).toFixed(), 60)
if (fps === 60) {
logger('info')(msg, fps + 'fps', duration + 'ms')
} else {
var times = {
render: timings.render.duration.toFixed() + 'ms'
}
if (timings.morph) times.morph = timings.morph.duration.toFixed() + 'ms'
logger('warn')(msg, fps + 'fps', duration + 'ms', times)
}
})
hooks.on('resource-timing-buffer-full', function () {
logger('error')("The browser's Resource Resource timing buffer is full. Cannot store any more timing information")
})
hooks.start()
function logger (level) {
return function () {
var args = []
for (var i = 0, len = arguments.length; i < len; i++) {
args.push(arguments[i])
}
scheduler.push(function () {
log[level].apply(log, args)
})
}
}
}