UNPKG

2.62 kBJavaScriptView Raw
1var nanologger = require('nanologger')
2var assert = require('assert')
3
4var ChooInstrument = require('./lib/instrument')
5
6module.exports = logger
7
8function logger (opts) {
9 opts = opts || {}
10 var colors = opts.colors || {}
11 var initialRender = true
12
13 assert.equal(typeof opts, 'object', 'choo-log: opts should be type object')
14
15 return function (state, emitter) {
16 var hook = ChooInstrument(emitter)
17 var log = nanologger('choo', { colors: colors })
18
19 hook.on('log:trace', log.trace.bind(log))
20 hook.on('log:debug', log.debug.bind(log))
21 hook.on('log:info', log.info.bind(log))
22 hook.on('log:warn', log.warn.bind(log))
23 hook.on('log:error', log.error.bind(log))
24 hook.on('log:fatal', log.fatal.bind(log))
25
26 hook.on('service-worker', function (data) {
27 log.info('Service worker installed')
28 })
29
30 hook.on('event', function (eventName, data, timing) {
31 if (timing) {
32 var duration = timing.duration.toFixed()
33 var level = duration < 50 ? 'info' : 'warn'
34 if (data !== undefined) log[level](eventName, data, duration + 'ms')
35 else log[level](eventName, duration + 'ms')
36 } else {
37 if (data !== undefined) log.info(eventName, data)
38 else log.info(eventName)
39 }
40 })
41
42 hook.on('use', function (count, duration) {
43 log.debug('use', { count: count }, duration + 'ms')
44 })
45
46 hook.on('unhandled', function (eventName, data) {
47 log.error('No listeners for ' + eventName)
48 })
49
50 hook.on('DOMContentLoaded', function (timing) {
51 if (!timing) return log.info('DOMContentLoaded')
52 var level = timing.interactive < 1000 ? 'info' : 'warn'
53 log[level]('DOMContentLoaded', timing.interactive + 'ms to interactive')
54 })
55
56 hook.on('render', function (timings) {
57 if (!timings) return log.info('render')
58 var duration = timings.render.duration.toFixed()
59 var msg = 'render'
60
61 if (initialRender) {
62 initialRender = false
63 msg = 'Initial ' + msg
64 }
65
66 // each frame has 10ms available for userland stuff
67 var fps = Math.min((600 / duration).toFixed(), 60)
68
69 if (fps === 60) {
70 log.info(msg, fps + 'fps', duration + 'ms')
71 } else {
72 log.warn(msg, fps + 'fps', duration + 'ms', {
73 render: timings.render.duration.toFixed() + 'ms',
74 morph: timings.morph.duration.toFixed() + 'ms'
75 })
76 }
77 })
78
79 hook.on('resource-timing-buffer-full', function () {
80 log.error("The browser's Resource Resource timing buffer is full. Cannot store any more timing information")
81 })
82
83 hook.start()
84 }
85}