freedomjs/freedom

View on GitHub
demo/advancedlogging/logger.js

Summary

Maintainability
A
45 mins
Test Coverage
/*globals freedom*/
var log = [];

var record = function (level, source, message) {
  'use strict';
  var formatted = '<span style="';
  if (level === 'debug') {
    formatted += "color:#888;";
  } else if (level === 'info') {
    formatted += "color:blue;";
  } else if (level === 'log') {
    formatted += "color:black;";
  } else if (level === 'warn') {
    formatted += "color:orange;";
  } else if (level === 'error') {
    formatted += "color:red;";
  }
  formatted += '">';
  if (!source) {
    source = '<span style="opacity:0.7;">[Freedom Internal]</span>';
  }
  formatted += source + ' <b style="padding-right:50px;">' + level + '</b>' + message + '</span>';
  if (log.dispatchEvent) {
    log.dispatchEvent('msg', formatted);
  } else {
    log.push(formatted);
  }
};

var Logger = function (dispatchEvent) {
  'use strict';
};

Logger.prototype.debug = record.bind({}, 'debug');
Logger.prototype.info = record.bind({}, 'info');
Logger.prototype.log = record.bind({}, 'log');
Logger.prototype.warn = record.bind({}, 'warn');
Logger.prototype.error = record.bind({}, 'error');

/**
 * When a backchannel is open, drain pending log messages, and register the
 * channel as the destination for subsequent messages.
 */
var BackLogger = function (dispatchEvent) {
  'use strict';
  this.dispatchEvent = dispatchEvent;

  if (!log.dispatchEvent) {
    log.forEach(function (msg) {
      this.dispatchEvent('msg', msg);
    }.bind(this));
    log = this;
  }
  //TODO: handle closing gracefully.
  /*
  backchannel.onClose(this, function () {
    log = [];
  });
  */
};

freedom().provideSynchronous(Logger);
freedom.loggingbackchannel().provideSynchronous(BackLogger);