cozy/cozy-mobile

View on GitHub
src/app/lib/persistent_log.coffee

Summary

Maintainability
Test Coverage
module.exports = (options) -> new Logger options

LOG_SIZE = 1000

colors =
     blue: ['\x1B[34m', '\x1B[39m']
     cyan: ['\x1B[36m', '\x1B[39m']
     green: ['\x1B[32m', '\x1B[39m']
     magenta: ['\x1B[36m', '\x1B[39m']
     red: ['\x1B[31m', '\x1B[39m']
     yellow: ['\x1B[33m', '\x1B[39m']

levelColors =
    error: colors.red
    debug: colors.green
    warn: colors.yellow
    info: colors.blue

class Logger

    constructor: (@options) ->
        @options ?= {}
        if 'processusTag' of @options
            Logger.processusTag = @options.processusTag

        # If no localStorage, should be test environment : deactivate log.
        unless localStorage?
            @noLog = true


    stringify: (text) ->
        if text instanceof Error
            err = text
            text = err.message
            if err.stack?
                text += "\n" + err.stack
        else if text instanceof Object
            text = JSON.stringify text
        return text


    format: (level, texts) ->
        text = (@stringify text for text in texts).join(" ")
        text = "#{@options.prefix} | #{text}" if @options.prefix?
        text = "#{level} - #{text}" if level
        text = "#{Logger.processusTag}> #{text}" if Logger.processusTag
        if @options.date
            date = new Date().toISOString()
            text = "[#{date}] #{text}"
        return text

    info: (texts...) ->
        return if @noLog
        text = @format 'info', texts
        @persist text
        console.info text

    warn: (texts...) ->
        return if @noLog
        text = @format 'warn', texts
        @persist text
        console.warn text

    error: (texts...) ->
        return if @noLog
        text = @format 'error', texts
        @persist text
        console.error text

    debug: (texts...) ->
        return if @noLog
        text = @format 'debug', texts
        @persist text
        console.info text

    raw: (texts...) ->
        return if @noLog
        console.log.apply console, texts

    lineBreak: (text) ->
        return if @noLog
        text = Array(80).join("*")
        @raw text
        window.logTrace.push text

    persist: (text) ->
        logIndex = +localStorage.getItem "log_index"
        logIndex = (logIndex + 1) % LOG_SIZE
        localStorage.setItem "log_#{logIndex}", text
        localStorage.setItem "log_index", '' + logIndex

    getTraces: ->
        logIndex = +localStorage.getItem "log_index"
        i = (logIndex + 1) % LOG_SIZE

        traces = []
        while i != logIndex
            log = localStorage.getItem "log_#{i}"
            traces.push log if log
            i = (i + 1) % LOG_SIZE

        return traces